能够掌握SSM整合的流程
能够编写SSM整合功能模块类
能够使用Result统一表现层响应结果
能够编写异常处理器进行项目异常
能够完成SSM整合前端页面发送请求实现增删改查操作
能够编写拦截器并配置拦截器
问题1:拦截器拦截的对象是谁?
问题2:拦截器和过滤器有什么区别?

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
作用:
核心原理:AOP思想

定义拦截器需要实现什么接口?
做法:定义一个类,实现HandlerInterceptor接口即可
xxxxxxxxxx
//注意当前类必须受Spring容器控制//定义拦截器类,实现HandlerInterceptor接口public class ProjectInterceptor implements HandlerInterceptor { //原始方法调用前执行的内容 //返回值类型可以拦截控制的执行,true放行,false终止 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."+contentType); return true; } //原始方法调用后执行的内容 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } //原始方法调用完成后执行的内容 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); }}
xxxxxxxxxx
public class SpringMvcSupport extends WebMvcConfigurationSupport { private ProjectInterceptor projectInterceptor; protected void addInterceptors(InterceptorRegistry registry) { //配置拦截器 registry.addInterceptor(projectInterceptor) .addPathPatterns("/books","/books/*"); }}
使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)
xxxxxxxxxx
({"com.itheima.controller"})//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性public class SpringMvcConfig implements WebMvcConfigurer { private ProjectInterceptor projectInterceptor; public void addInterceptors(InterceptorRegistry registry) { //配置多拦截器 registry.addInterceptor(projectInterceptor) .addPathPatterns("/books","/books/*"); }}

postHandle()和afterCompletion()方法都是处理器方法执行之后执行,有什么区别?
xxxxxxxxxx
//原始方法调用前执行的内容//返回值类型可以拦截控制的执行,true放行,false终止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."+contentType); return true;}
参数
返回值 返回值为false,被拦截的处理器将不执行。
xxxxxxxxxx
//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle...");}
注意:如果处理器方法出现异常了,该方法不会执行
xxxxxxxxxx
//原始方法调用完成后执行的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion...");}
注意:无论处理器方法内部是否出现异常,该方法都会执行。
什么是拦截器链?
xxxxxxxxxx
public class ProjectInterceptor2 implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle...222"); return false; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle...222"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion...222"); }}
xxxxxxxxxx
({"com.itheima.controller"})//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性public class SpringMvcConfig implements WebMvcConfigurer { private ProjectInterceptor projectInterceptor; private ProjectInterceptor2 projectInterceptor2; public void addInterceptors(InterceptorRegistry registry) { //配置多拦截器 registry.addInterceptor(projectInterceptor) .addPathPatterns("/books","/books/*"); registry.addInterceptor(projectInterceptor2) .addPathPatterns("/books","/books/*"); }}
