Spring MVC
SpringMVC是spring的子框架,应用于web端的架构模式
M指的是Model模型层,Java中的实体类,作用是处理数据
V指的是View视图层,像html,jsp这些页面,作用是展示数据
C指的是Controller控制层,比如servlet,作用是接收请求和响应请求,收集数据
springmvc的执行流程
用户发送请求到前端控制器,前端控制器调用处理器映射器执行处理器生成处理器执行链,返回给前端控制器,前端控制器通过处理器执行链找到处理器适配器,处理器适配器执行处理器获取ModelAndView,返回给前端控制器,前端控制器将ModelAndView传给视图解析器,视图解析器解析视图返回给前端控制器,前端控制器将数据填充到视图,最终返回给用户
实际开发步骤:
1.创建web项目,添加依赖(在项目结构中找到Artifacts,导入相关jar包)
2.编写web.xml配置文件,注册DispatcherServlet前端控制器
3.编写spring config配置文件
4.创建控制层类,完成映射
5.启动服务器,测试结果
创建web项目,添加相关依赖

添加的依赖:
将坐标打包方式写为war
spring-webmvc
javax.servlet-api
编写web.xml配置文件,注册servlet和配置接收路径的扩展名
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--启动tomcat会创建DispatcherServlet对象,同时创建springmvc容器,读取springmvc配置文件-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义springmvc读取配置文件的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--tomcat启动后,创建DispatcherServlet的顺序,0-N,数字越小顺序越靠前-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置映射名和映射路径-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--/表示顶替了default的servlet功能,default的/可以处理静态资源,被顶替后,无法处理静态资源了,需要另外配置-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置spring config文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包下注解,创建对象-->
<context:component-scan base-package="com.alibaba.springmvc.controller" />
<!--配置视图解析器Internal....对象-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
修改web目录的路径

编写控制层代码
@Controller
public class UserController {
@RequestMapping("/doSome")
public ModelAndView method() {
ModelAndView mav = new ModelAndView();
mav.addObject("msg", "huanying........");
mav.addObject("fun", "huanying111111111111........");
mav.setViewName("/show.jsp");
return mav;
}
}
编写默认的JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>第一个springmvc项目</h1>
<p><a href="/springmvc02_war_exploded/doSome">点击跳转页面</a></p>
</body>
</html>
编写跳转的JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>title</title>
</head>
<body>
<h3>show jsp</h3><br>
<h3>show jsp:${msg}</h3><br>
<h3>show jsp:${fun}</h3><br>
</body>
</html>
启动tomcat服务器,测试结果
总结:
在WEB-INF目录下的资源是受保护的,用户不能直接访问,只能通过其他未受保护的页面间接访问
-------------------------------------------------------------
SpringMVC注解
@RequstMapping:在类上表示提取请求映射的公共部分,在方法上只是普通请求映射
属性method表示请求方式,值是RequestMethod枚举类型,有GET,POST,PUT,DELETE等
如果没有加method属性,那么GET,POST请求都是可以的
方法接收参数需要注意的问题
1.方法的参数名字必须和请求参数的name相同,跟参数的位置无关,springmvc框架会自动根据名字赋值
2.前端发送请求的参数都是字符串类型,如果方法的形参不是字符串类型,框架会帮我们将字符串转换成形参的类型,形参最好不要用基本类型,因为参数为null的话,基本类型不能接收,而包装类可以
3.如果发送请求方式是get,中文不会乱码,如果是post,会发生乱码,配置过滤器可以解决乱码问题
在web.xml配置文件中解决post请求中文乱码
<!--配置过滤器,解决post请求中文乱码问题-->
<filter>
<!--配置需要创建的过滤器对象-->
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置字符编码-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!--强制让请求对象使用过滤器-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--强制让响应对象使用过滤器-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--表示强制所有的请求使用characterEncodingFilter过滤器-->
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequstParam注解的使用
当发送请求的参数名和方法的形参名不同时,使用@RequstParam
属性value,写的是发送请求的参数名
属性required,默认为true,表示发送的请求必须传参,改为false,可以不传参
当发送请求参数的个数过多,可以使用Java对象作为方法的形参
要求Java对象的属性名和发送请求的参数名相同
关于方法的返回值类型
1.ModelAndView:表示需要数据模型和视图,对视图进行转发
2.String:表示如果返回的是简写视图名称,需要配置视图解析器,框架对视图进行转发forward,如果返回的是完整的视图,不需要配置视图解析器
3.void:不表示数据,也不返回视图,处理ajax可以使用,ajax只需要数据
4.Object:返回数据,和视图无关,响应ajax请求,可以是自定义类,比如Student,User等,也可以是对象数组List<User>
将数据转换成json对象的实现步骤:
4.1将数据转换成json对象,springmvc框架需要依赖jackson-core和jackson-databind
4.2在springmvc配置文件,添加标签<mvc:annotation-driven>,注解驱动
4.3在方法上加注解@ResponseBody
以上可以将数据转换成json对象,响应给ajax
@ResponeseBody注解的作用
如果返回的是String类型,方法上加了ResponeseBody注解,那么返回的数据类型是文本text,而不是视图,也不是json对象
tomcat 的web.xml配置文件下有一个servlet,叫default,服务器启动时自动创建
它的作用是:
1.处理静态资源,比如图片
2.处理未被映射到其它servlet的请求
当我们写的servlet映射路径为斜杠/时,顶替了default的功能,而我们写的servlet无法处理静态资源,为了处理静态资源,有两种方式:
方式1.spring config配置文件里配置,这种方式的缺点是需要依赖服务器
<!--将静态资源转发给default的servlet处理-->
<mvc:default-servlet-handler />
而<mvc:default-servlet-handler />和注解@RequestMapping有冲突,需要在spring config配置annotation-driven注解驱动解决问题
<mvc:annotation-driven/>
方式二:在springmvc配置文件中使用mvc:resources标签,属性mapping表示,访问静态资源的url,location表示静态资源在项目中的目录位置,推荐这种方式,不用依赖服务器!
<mvc:resources mapping="/images/**" location="/images"></mvc:resources>
mapping属性以web为根,/**表示images目录下可以是文件,也可以是隔着一层目录在有文件,也可以是隔着多层目录才有文件
location属性以web为根,静态资源所在的目录
mvc:resources标签同样和注解RequestMapping有冲突,需要加注解驱动
<mvn:annotation-driven/>
开发中只需要配置一个即可
-------------------------------------------------------
关于在前端主页面,点击链接跳转页面的url是否以斜杠开始问题
没有以斜杠开始,点击跳转时,公式是页面当前路径 - 资源名(文件名) + 后端url
以斜杠开始,点击跳转时,公式是页面当前路径 - 项目名 - 资源名(文件名) + 后端url,需要手动在路径前加项目名,而且在开发中项目名不能写死了
如果url不以斜杠开始的解决办法:
方式一:适合有大量请求时,一劳永逸!
1.在前端页面代码,添加如下,注意位置在html开头标签上方page头标签下方
<%
String basePath = request.getScheme() + "://" +
request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/";
%>
2.在head标签内,添加如下
<base href="<%=basePath%>" />
方式二(不管以不以斜杠开始都可以):适合少量请求,更方便
在前端页面,请求跳转的路径前添加如下el表达式
${pageContext.request.contextPath}
比如,全路径为:“${pageContext.request.contextPath}/springmvc/doSome”
--------------------------------------------------------------------------
转发和重定向解释说明:

转发:
转发使用场景:当配置了视图解析器,我们向跳转的页面路径不需要前缀,而们又不想修改配置文件的前缀,这个时候可以直接使用转发,就不走视图解析器的路线了
重定向:

----------------------------------------------------------------
全局统一异常处理
在写业务代码时,经常会抛出异常,最终处理的方式是try…catch…default,当有多个controller类,代码众多时,可以使用springmvc框架的异常机制













-----------------------------------------------------------------------
拦截器




有三个拦截器方法,只需要掌握preHandle
多个拦截器执行顺序


4821

被折叠的 条评论
为什么被折叠?



