SpringMVC 的基本组件与使用

2.2 SpringMVC 对控制器的支持

2.2.4 拦截器

如上图所示,在查找处理器时, HandlerMapping 并不直接返回 Handler, 而是返回 Handler 的执行链HandlerExecutionChain。该执行链中封装的有需要应用到该 Handler 上的所有拦截器。拦截器的类型是 HandlerInterceptor 接口的实现。
在执行处理器前,会先执行 HandlerInterceptor的preHandle前置处理方法, 如果该方法返回 false, 则中断处理流程; 如果返回 true, 则继续后续的拦截器处理, 直到所有拦截器都返回 true, 才会开始执行 Handler。
在执行处理器后,会有两种结果, 一种正常执行完成, 此时控制器会先执行拦截器里的postHandle 方法,触发处理器执行后的操作,之后会执行拦截器里的 afterCompletion,代表整个处理动作完成; 另一种是在执行时发生了错误,此时不执行 postHandle方法,而是直接执行 afterCompletion, 并把发生的错误作为参数传递给该方法。下面看一个拦截器的示例,代码如下:

// 实现HandlerInterceptor 接口
public class MyHandlerInterceptor implements HandlerInterceptor (
/**
* Handler 执行前触发
* @param request 原始的HTTP 请求
* @param response 原始的 HTTP 响应
* @param handler 执行的目标处理器
* @return 返回 true 则继续执行, 否则中断执行
* @throws Exception
*/
@ Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   System. out. println(" Handler 执行前触发, 执行的 Handler 是" + handler);
 return true;
}
/**
*
* Handler执行成功后触发
* @param request 原始的 HTTP 请求
* @param response 原始的 HTTP 响应
* @param handler 执行的目标处理器
* @param modelAndView 处理器的执行结果
* @throws Exception
*/
@ Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @ Nullable ModelAndView modelAndView) throws Exception {
   System. out. println(" Handler 执行成功后触发, 执行的 Handler是: " + handler +",处理结果 ModelAndView是: " + modelAndView);
}
/**
* @param request 原始的HTTP 请求
* @param response 原始的 HTTP 响应
* @param handler 查找到的目标处理器
* @param ex 执行过程中发生的异常, 没有发生异常则为 null
* @throws Exception
*/
@ Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @ Nullable Exception ex) throws Exception { 
   System. out, println(" Handler 执行完成后触发, 执行的 Handler是: " + handler +",是否发生了异常:" + ( ex != null ? "是" : "否"));
 }
}

要想令该拦截器生效,需要为处理器配置此拦截器,可以创建 WebMvcConfigurer 类型的配置 Bean, 该配置 Bean会在 Spring MVC的配置过程中执行, 示例代码如下: 

//声明配置类
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器,创建自己的拦截器实例,同时匹配/**所有路径, 为所有路径的处理器添加此拦截器
 registry. addInterceptor( new MyHandlerInterceptor()). addPathPatterns("/**");
 }
}

在控制器的上面两个步骤即处理器查找和处理器执行调用完成时,控制器会拿到处理器执行的结果。处理器的执行是通过HandlerAdapter 的 handle方法执行的,而其返回结果就是ModelAndView类型。这个类型就是视图与模型的绑定关系。
在控制器最终对视图进行渲染时,会通过这个返回值获取到视图,同时还增加了根据视图名查找视图的逻辑, 如 2.2.4 小节示例。渲染时,首先根据ModelAndView 视图或者拿到视图名查找视图,之后再从 ModelAndView中获取 Model 模型数据, 通过调用视图的渲染方法传入模型数据执行视图的渲染操作,渲染后把渲染的结果通过 HTTP 的 Response返回给用户。 

2.2.5视图查找与模型绑定

在控制器的上面两个步骤即处理器查找和处理器执行调用完成时,控制器会拿到处理器执行的结果。处理器的执行是通过HandlerAdapter 的 handle方法执行的,而其返回结果就是ModelAndView类型。这个类型就是视图与模型的绑定关系。
在控制器最终对视图进行渲染时,会通过这个返回值获取到视图,同时还增加了根据视图名查找视图的逻辑, 如 2.2.4 小节示例。渲染时,首先根据ModelAndView 视图或者拿到视图名查找视图,之后再从 ModelAndView中获取 Model 模型数据, 通过调用视图的渲染方法传入模型数据执行视图的渲染操作,渲染后把渲染的结果通过 HTTP 的 Response返回给用户。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康康峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值