一、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 请求响应。
拦截器拦截普通方法的执行。