这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」。
👨🎓作者:Java学术趴
💌公众号:Java学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。
☠️每日毒鸡汤:微笑拥抱每一天,做像向日葵般温暖的女子。
👋大家好!我是你们的老朋友Java学术趴。最近小编又在整了Spring全家桶笔记,笔记会每天定时的进行发放,喜欢的大佬们欢迎收藏点赞关注呦。小编会每天分享的呦。今天给大家带来新的框架技术SpringMVC。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。
第四章 SpringMVC 核心技术
4.1 请求重定向和转发
- 当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重 定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
- 注意,对于请求转发的页面,可以是WEB-INF中页面;而重定向的页面,是不能为WEB-INF 中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资 源的
SpringMVC 框架把原来 Servlet 中的请求转发和重定向操作进行了封装。现在可以使用简 单的方式实现转发和重定向。
- forward:表示转发,实现 request.getRequestDispatcher(“xx.jsp”).forward()
- redirect:表示重定向,实现 response.sendRedirect(“xxx.jsp”
4.4.1 请求转发
- 处理器方法返回 ModelAndView 时,需在 setViewName()指定的视图前添加 forward:,且 此时的视图不再与视图解析器一同工作,这样可以在配置了解析器时指定不同位置的视图。 视图页面必须写出相对于项目根的路径。forward 操作不需要视图解析器。
- 处理器方法返回 String,在视图路径前面加入 forward: 视图完整路径。
1 | java复制代码 @RequestMapping(value = "/some.do") |
4.1.2 请求重定向
- 在处理器方法返回的视图字符串的前面添加 redirect:,则可实现重定向跳转。
1 | java复制代码 @RequestMapping(value = "/some2.do") |
4.2 异常处理
- SpringMVC 框架处理异常的常用方式:使用@ExceptionHandler 注解处理异常。
4.2.1 @ExceptionHandler 注解
- 使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可 选属性 value,为一个 Class数组,用于指定该注解的方法所要处理的异常类,即所要匹 配的异常。
- 而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法 参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会 自动为这些方法参数赋值。
- 对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。
(1) 自定义异常类
定义三个异常类:NameException、AgeException、MyUserException。其中 MyUserException 是另外两个异常的父类。
1 | scala复制代码public class MyUserException extends Exception{ |
1 | scala复制代码/* |
1 | scala复制代码/* |
(2) 修改 Controller 抛出异常
1 | java复制代码/* |
(3) 定义异常响应页面
定义三个异常响应页面。
- 不过,一般不这样使用。而是将异常处理方法专门定义在一个类中,作为全局的异常处 理类。
- 需要使用注解@ControllerAdvice,字面理解就是“控制器增强”,是给控制器对象增强 功能的。使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler
- 当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的 类中的异常处理方法。
- @ControllerAdvice 是使用@Component 注解修饰的,可以 扫描到@ControllerAdvice 所在的类路径(包名),创建对象。
(4) 定义全局异常处理类
1 | java复制代码/* |
(5) 定义 Spring 配置文件
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
4.3 拦截器
- SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提 交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器, 在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时, 已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。
4.3.1 拦截器的执行
自定义拦截器
1 | java复制代码/* |
自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:
➢ preHandle(request,response, Object handler): 该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方 法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。
➢ postHandle(request,response, Object handler,modelAndView): 该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。 由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修 改处理器方法的处理结果数据,且可以修改跳转方向。
➢ afterCompletion(request,response, Object handler, Exception ex): 当 preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有 工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此 时对 ModelAndView 再操作也对响应无济于事。
afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据
拦截器中方法与处理器方法的执行顺序如下图:
换一种表现方式,也可以这样理解:
(1) 注册拦截器
- 用于指定当前所注册的拦截器可以拦截的请求路径,而/**表示拦截所 有请求。
(2) 修改 index 页面
(3) 修改处理器
(4) 修改 show 页面
(5) 控制台输出结果
以上项目的源代码,点击星球进行免费获取 星球 (Github地址)如果没有Github的小伙伴儿。可以关注本人微信公众号:Java学术趴,发送SpringMVC,免费给发给大家项目源码,代码是经过小编亲自测试的,绝对可靠。免费拿去使用。
本文转载自: 掘金