一、SpringMVC框架介绍
springmvc是一个基于mvc的web框架。
springmvc拥有控制器,作用跟Struts类似,用于接收外部请求,解析参数传给服务层。
MVC是指 Model(模型)、View(视图)、Controller(控制器)的简写。
MVC主要的作用是降低了视图与业务逻辑的双向耦合。
二、Springmvc架构原理解析
发起请求到中央调度器 DispatcherServlet。
中央调度器接收到请求后,调用 HandlerMapping 映射器查找 Handler。
HandlerMapping 映射器根据xml配置、注解进行查找具体的处理器 Handler,生成处理器对象及连接器一并向中央调度器返回 Handler。
中央调度器调用 HandlerAdapter 设配器执行Handler。
HandlerAdapter 适配器经过适配调用具体的处理器(Controller 也称:控制器)进行业务逻辑操作。
Handler执行完成给适配器返回ModelAndView。
HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给中央调度器(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)。
中央调度器将 ModelAndView 传给 ViewResolver 视图解析器进行视图解析,根据逻辑视图名解析成真正的视图(jsp)。
ViewResolver 视图解析器向中央调度器返回View。
中央调度器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域。
前端控制器向用户响应结果。
前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
处理器映射器 HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler。
处理器适配器 HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
处理器 Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
视图View(需要程序员开发jsp) View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
三、SpringMVC配置DispatcherServlet
在pom.xml中加入servlet-api和springmvc依赖。
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- springmvc 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
在Web.xml配置文件中注册SpringMVC框架的核心对象 DispatcherServlet,用<init-param>设置spring配置文件。(注意此处的web-app版本是4.0)
<?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">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自定义springmvc读取的配置文件位置 -->
<init-param>
<!-- springmvc的配置文件位置属性 -->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定义文件的路径 -->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 配置在Tomcat启动后,创建Servlet对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在resources文件中创建spring配置文件applicationContext.xml。设置视图解析器用于处理不公开的jsp文件。
<context:component-scan base-package="com.springmvc.controller" />
<!-- 视图解析器,设置视图文件的路径 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 文件路径前缀 -->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 文件后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
四、拦截器
1、什么是拦截器
1)拦截器是 springmvc 中的一种,需要实现 HandlerInterceptor 接口。
2)拦截器与过滤器类似,处理的应用场景不同。过滤器是用来过滤请求参数,设置字符集编码等,而拦截器则是对用户的请求做拦截,对请求做判断处理。
3)拦截器是全局的,可以对多个 Controller 做拦截。一个项目可以有多个拦截器。常用在:用户登录处理、权限检查、记录日志等。
2、拦截器的执行
定义一个拦截器类实现 HandlerInterceptor 接口,重写以下三个方法:preHandle()、postHandle()、afterCompletion()。
1)preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler):在请求处理之前,也就是 Controller 类中的方法之前先被拦截,如果返回值为 true 就继续执行下一步,如果为 false 就终止,在这个方法中可以获取用户请求信息,验证请求是否符合要求。
2)preHandle()返回 true 执行 Controller 类中的方法。
3)postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView mv):在控制器方法执行之后执行拦截器,能够获取控制器方法的返回值 ModelAndView,可以修改 ModelAndView中的数据和视图,可以影响最后的执行结果,主要对原来的执行结果做二次修改。
4)afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex):在请求处理完后执行拦截器,在框架中规定是当你的视图处理完成后,对视图执行了 forward,就认为请求处理完成,一般做资源回收工作的,程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。
3、拦截器与过滤器的区别
拦截器与过滤去的区别
过滤器是 servlet 中的对象。
拦截器是框架中的对象。
过滤器是实现 Filte 接口的对象。
拦截器是实现 Handlerinterceptor 接口。
过滤器是用来设置 request、response 的参数,是对数据的过滤。
拦截器是用来验证请求的,能截断请求。
过滤器是在拦截器之前先执行的。
拦截器是 springmvc 容器中的对象。
过滤器是一个执行时间点。
拦截器有三个执行时间点。
过滤器可以处理 jsp、js、html 等。
拦截器是对 Controller 的对象拦截,如果你的请求不能被 DispatcherServlet 接受,这个请求不会执行拦截器。
过滤器过滤 servlet 请求响应。
拦截器拦截普通方法的执行。