网站建站论坛,建设目标网站,怎么设置自己做的网站,雄安移动网上营业厅文章目录 Servlet请求转发和请求包含RequestDispatcher HandlerInterceptor组件实际运用场景 HandlerMappingRequestMappingInfo(HandlerMapping)HandlerExecutionChainHandlerAdapter源码学习知识点博客记录 Servlet请求转发和请求包含
RequestDispatcher
Request#getR… 文章目录 Servlet请求转发和请求包含RequestDispatcher HandlerInterceptor组件实际运用场景 HandlerMappingRequestMappingInfo(HandlerMapping)HandlerExecutionChainHandlerAdapter源码学习知识点博客记录 Servlet请求转发和请求包含
RequestDispatcher
Request#getRequestDispatcher()包含两个重要方法请求转发和请求包含。 一个请求跨多个Servlet时需要使用请求转发和请求包含。
示例伪代码
public void requestDispatcher() throws Exception {Request request new Request(null);Response response new Response();// 首先需要获得一个RequestDispatcher 对象RequestDispatcher requestDispatcher request.getRequestDispatcher(/forward);requestDispatcher.forward(request,response);// 调用forward()方法进行请求转发requestDispatcher.include(request,response);// 调用include()方法进行请求包含response.sendRedirect(/redirect);// 调用sendRedirect()方法进行重定向
}请求包含 rd.include( request , response);
HandlerInterceptor组件
HandlerInterceptor包含三个方法 preHandle是在找到处理handler对象的HandlerMapping之后HandlerAdapter调度handler之前执行。 postHandle是在HandlerAdapter调度handler之后DispatcherServlet渲染视图之前执行可以通过ModelAndView来向视图中添加一些信息等preHandle返回false不执行postHandle。 afterCompletion是在渲染视图结束后执行主要可以用来进行事后的资源清理。无论 是否发生异常/preHandle返回false 都会执行
其中postHandle和afterCompletion方法是反顺序执行的。也就是说第一个拦截器会最后一个执行。关于HandlerInterceptor的执行顺序我们可以在HandlerExecutionChain类中找到。
完整示例
配置自己的Interceptor进容器,需要按照下示例方式 实现WebMvcConfigurer接口添加Configuration注解(可免除)在配置类中重写addIntercepters方法添加要拦截的url以及url白名单需要排除拦截的url Component
public class WebMvcConfig implements WebMvcConfigurer {Autowiredprivate CustomInterceptor customInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor) // 添加拦截器.addPathPatterns(/**) // 配置拦截请求url ** 表示拦截所有请求url.excludePathPatterns(/hello); // 排除某些不需要拦截的请求url即带有/hello请求不会被拦截}
}WebMvcConfigurer重要的方法
addInterceptors从该方法名就可以了解到该方法是添加拦截器即将拦截器交给IOC去执行拦截器需要拦截的路径以及需要排除拦截的路径在该方法中配置。addResourceHandlers该方法的作用是配置静态资源路径。即某些请求需要读取某个路径下的静态资源内容需要配置该静态资源的路径通过该方法可以统一给这些请求配置指定静态资源路径 。
addResourceHandlers 示例
Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/**) // 配置需要添加静态资源的请求url.addResourceLocations(classpath:/mydata/); //配置静态资源路径}将自己的 HandlerInterceptor 添加进Spring容器
Component
public class CustomInterceptor implements HandlerInterceptor {//在Controller执行之前调用如果返回falsecontroller不执行Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(---------CustomInterceptor.preHandle--------);return true;}//controller执行之后且页面渲染之前调用Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(---------CustomInterceptor.postHandle--------);}//页面渲染之后调用一般用于资源清理操作Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(---------CustomInterceptor.afterCompletion--------);}
}到此就完成定义自己的一个HandlerInterceptor。
实际运用场景
HandlerInterceptor在实际开发中运用的场景
HandlerMappingRequestMappingInfo(HandlerMapping)
HandlerExecutionChain
HandlerAdapter
源码学习知识点博客记录
HandlerAdapter实现类及RequestMappingHandlerAdapter调用过程
RequestMapping的注册及请求匹配过程
Controller的扫描注册及匹配过程
DispatcherServlet请求执行的过程
MVC重要组件及DispatcherServlet执行过程
Handler、HandlerMapping和HandlerAdapter作用及区别