Spring MVC框架概述
一. 介绍
Spring Web MVC 框架提供了模型-视图-控制器架构和现成的组件,可用于开发灵活且松散耦合的 Web 应用程序。MVC 模式导致分离应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑),同时在这些元素之间提供松散耦合。
SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时还支持Restful编程风格的请求。
二. 层次
Model :封装了应用程序数据,一般来说,它们将由 POJO 组成。
View :负责渲染模型数据,一般来说,它生成客户端浏览器可以解释的 HTML 输出。
Controller:负责处理用户请求和构建合适的模型,并将其传递给视图进行渲染。
Controller接收用户请求,调用Model生成业务数据,传递给View。
三. 核心组件
前端控制器 (DispatcherServlet)
- 接收请求,处理结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
不需要程序员开发
Spring Web 模型-视图-控制器 (MVC) 框架是围绕处理所有 HTTP 请求和响应的 DispatcherServlet 设计的 。
以下是对应于对 DispatcherServlet 的传入 HTTP 请求的事件序列 −
- 收到 HTTP 请求后,DispatcherServlet 会咨询 HandlerMapping 以调用适当的 Controller。
- 控制器接受请求并根据使用的 GET 或 POST 方法 调用适当的服务方法。服务方法将根据定义的业务逻辑设置模型数据,并将视图名称返回给 DispatcherServlet。
- DispatcherServlet 将获得 ViewResolver 的帮助来获取请求的定义视图。
- 一旦视图完成,DispatcherServlet 将模型数据传递给视图,最终在浏览器上呈现。
上述所有组件,即 HandlerMapping、Controller 和 ViewResolver 都是 WebApplicationContext 的一部分,它是普通 ApplicationContext 的扩展,具有 Web 应用程序所需的一些额外功能。
处理器 (Handler)
- 处理请求的具体过程。完成具体的业务逻辑,相当于servlet或action。
需要程序员开发
处理器映射器 ( HandleMapping )
- 根据url找到 handler
不需要程序员开发
处理器适配器 ( HandlerAdapter )
- Handler执行业务方法之前,需要进行一系列的操作,如表单数据的验证,数据类型的转换,将表单数据封装成JavaBean等,因此开发者只需将注意力集中到业务逻辑的处理上,DispatcherServlet通过HandlerAdapter执行不同的Handler。
适配器模式
- 注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以 正确的去执行Handler。
视图解析器 ( ViewResolver )
- DispatcherServlet通过它将逻辑视图转换为物理视图,最终将渲染结果响应给客户端。
不需要程序员开发
处理器拦截器( HandlerInterceptor )
- 是一个接口,如果需要完成拦截处理,实现该接口。
不需要程序员开发
处理器执行链( HandlerExecutionChain )
- 处理器执行链,包含两部分,HandlerInterceptor和Handler
四. 工作流程
- 客户端请求被DispatcherServlet接收。
- 根据HandlerMapping映射到Handler。
- 生成Handler和HandlerInterceptor。
- Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理。
- Handler返回一个ModerAndView对象给DispatcherServlet。
- DispatcherServlet将获取的ModerAndView对象传给ViewResolver视图解析,将逻辑视图解析为物理视图View。
- ViewResolver返回一个View给DispatcherServlet。
- DispatcherServlet根据View进行视图渲染(将模型数据Model填充到视图View中)
- DispatcherServlet将渲染后的结果响应给客户端。
五. SpringMVC的优点
- 可以支持各种视图技术,而不仅仅局限于JSP。
- 与Spring框架集成(如IoC容器、AOP等)。
- 清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
- 支持各种请求资源的映射策略。
六. 常用注解
Controller : 用于定义控制类
RequestMapping : 用来处理请求地址映射的注解,可以作用于类和方法上。
相关参数:
value: 指定请求的实际地址, 是@RequestMapping的默认值。 指定的地址可以是URI Template 模式
method: 指定请求的method类型, GET、POST、PUT、DELETE等
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理
*headers*: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
ResponseBody : 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某 种格式的数据时(如json、xml等)使用。
在类定义处添加,也可以单独在方法中添加,表示直接将业务方法的返回值响应给客户端,不加的话返回的话,会将返回值传递给DispatcherServlet,再由DispatcherServlet调用ViewResolver对值进行解析,映射到一个jsp资源或html资源。
RequestParam : 用于在SpringMVC后台控制层获取参数
它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”
defaultValue 表示设置默认值 required 通过boolean设置是否是必须要传入的参数 value 值表示接受的传入的参数类型
PathVariable: 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
ModelAttribute : 定义一个方法,该方法专门用来返回要填充到模型数据中的对象
所有的Controller继承BaseController,即可实现在调用Controller时,先执行 此方法
SessionAttributes : 将值放到session作用域中,写在class上面
七. 乱码处理
解决post请求乱码问题:
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8
<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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
解决get请求乱码问题(2取其1):
(1)修改tomcat配置文件添加编码与工程编码一致
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
(2)对参数进行重新编码
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
注: ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
八. SpringMVC的全局处理异常
处理异常的方式
编程式异常处理
指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 finally 块中执行一些清理操作。在编程式异常处理中,开发人员需要显式地进行异常处理,异常处理代码混杂在业务代码中,导致代码可读性较差。
声明式异常处理
将异常处理的逻辑从具体的业务逻辑中分离出来,通过配置等方式进行统一的管理和处理。在声明式异常处理中,开发人员只需要为方法或类标注相应的注解(如 @Throws 或 @ExceptionHandler),就可以处理特定类型的异常。相较于编程式异常处理,声明式异常处理可以使代码更加简洁、易于维护和扩展。 (通常使用声明式异常处理)
九. 拦截器
拦截器(Interceptor)是一种常见的编程模式,它用于在执行某个操作前后插入额外的逻辑。在软件开发中,拦截器通常用于对请求、响应或方法调用进行预处理或后处理。
概念
使用拦截器在请求到达具体 handler 方法前,统一执行检测,检测成功就通过,进行后面的操作,检测不成功的就不通过 。
拦截器可以在以下情况下发挥作用:
- 网络请求拦截器:在发送网络请求之前,可以使用拦截器对请求进行拦截和修改,例如添加请求头、验证用户身份等操作。
- 响应拦截器:在接收到网络响应之后,可以使用拦截器对响应进行拦截和处理,例如解析响应数据、统一处理错误等操作。
方法拦截器:在调用某个方法之前或之后,可以使用拦截器对方法进行拦截和处理,例如日志记录、性能监测等操作。
拦截器通常由一个链式结构组成,每个拦截器都可以决定是否将请求或响应传递给下一个拦截器。这种链式结构可以实现多个拦截器的有序执行,并且每个拦截器都可以对请求或响应进行修改或处理。
拦截器的好处
- 代码复用:通过拦截器可以将一些通用的逻辑抽离出来,实现代码的复用和统一管理。
- 解耦合:拦截器可以将业务逻辑与具体的操作解耦,使代码更加清晰和可维护。
- 增强功能:通过拦截器可以方便地添加额外的功能,如权限验证、日志记录等。