web请求过程
springMVC组件介绍
- DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合 性,提高每个组件的扩展性。
- HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式
- HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器,调用处理器传递参数等工作! ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
MVC执行过程
Dispatcher介绍
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
-
文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
-
通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个 HandlerInterceptor拦截器);
-
通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
-
通过ViewResolver解析逻辑视图名到具体视图实现;
-
本地化解析;
-
渲染具体的视图等;
-
如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
springMVC搭建
(1)添加jar包
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
(2)修改web.xml
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/和/*的区别 *
< url-pattern > / < url-pattern > 不会匹配到.jsp,即:.jsp不会进入spring的 DispatcherServlet类 。 < url-pattern > / < url-pattern > 会匹配.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类, 导致找不到对应的controller所以报404错。 可以配置/ ,此工程 所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,需要特殊处理对静态文件 的解析不能由springmvc解析 可以配置.do或.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用 不可以/,如果配置/,返回jsp也由springmvc解析,这是不对的。
url-pattern有5种配置模式
(1)/xxx:完全匹配/xxx的路径
(2)/xxx/:匹配以/xxx开头的路径,请求中必须包含xxx。 (3)/:匹配/下的所有路径,请求可以进入到action或controller,但是转发jsp时再次被拦截,不能访问jsp界面。 (4).xx:匹配以xx结尾的路径,所有请求必须以.xx结尾,但不会影响访问静态文件。
(5)/:默认模式,未被匹配的路径都将映射到刺servlet,对jpg,js,css等静态文件也将被拦截,不能访问。
(3)修改spring配置文件
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
>
<!-- 扫描controller-->
<context:component-scan base-package="com.cyb.controller"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- jsp所在的位置-->
<property name="prefix" value="/" />
<!-- jsp文件的后缀名-->
<property name="suffix" value=".jsp" />
</bean>
</beans>
接参
接收方式:
(1)HttpServletRequest
(2)页面传值时的key=处理请求的方法的参数名
(3)使用控件名和对象的属性名一致的方式进行接收
日期处理:
返参
(1)HttpServletRequest
(2)ModelMap map ,默认作用域request
(3)ModelAndView 对象需要new,同时作为返回值类型
(4)Model类保存数据 8.session存值
session存值
(1)使用HttpSession :request.getSession();
(2)使用@sessionAttributes(“key值”)//写的是ModelMap中定义的key值 注:该注解和ModelMap结合使用,当使用ModelMap存值时,会在session中同时存储一份数据 @SessionAttributes()的小括号中如果是一个值,不要加{}
示例: @SessionAttributes(“key”) @SessionAttributes({“key1”,“key2”}) 清除注解session:SessionStatus类 status.setComplete();
乱码问题
如何设置get请求乱码?tomcat8已经默认配置
post处理乱码
注意:这里只能处理接受后数据的编码,如果是其他位置的编码问题还需要再考虑处理方案
转发和重定向
默认转发跳转
@RequestMapping("/forwardView")
public String forwardView(){
return "forward:/WEB_INF/pages/success.jsp";
}
重定向:
return "redirect:a.jsp" 或者:redirect:findall
注意:重定向时地址栏会发生拼接modelmap中值的问题
异常处理
//配置异常结果界面 @ExceptionHandler(NullPointerException.class) public String execeptionResult(){ return “exception”; }
全局异常:@ControllerAdvice 使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生 的异常
SpringMVC拦截器
(1)创建拦截器类:实现HandlerInterceptor接口
preHandle() 拦截器开始
postHandle() 拦截器结束
afterCompletion 最后执行
(2)配置拦截器
拦截所有请求(测试:拦截内容包含jsp吗?)
<mvc:interceptors>
<bean id="my" class="util.MyInterceptor"/>
</mvc:interceptors
拦截指定请求
<mvc:interceptors>
<mvc:interceptor >
<mvc:mapping path="/请求名" />
<mvc:mapping path="/请求名" />
<bean id="my" class="util.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
springMVC拦截器使用场景
1、日志记录 :记录请求信息的日志
2、权限检查,如登录检查
3、性能检测:检测方法的执行时间
SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
(1)过滤器: 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容 器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修 改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
2、权限检查,如登录检查
3、性能检测:检测方法的执行时间
SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
(1)过滤器: 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容 器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修 改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
(2)拦截器: 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程 (AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操 作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦 截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理