- 拦截器
- 拦截器的配置
- 异常处理器
- 基于配置的异常处理
- 基于注解的异常处理
- 注解配置SpringMVC
- 创建初始化类,代替web.xml
- 创建SpringConfig配置类,代替spring的配置文件
- 创建WebConfig配置类,代替SpringMVC的配置文件
- 测试功能
- SpringMVC执行流程
- SpringMVC常用组件
- DispatcherServlet初始化过程
一、过滤器作用域浏览器到dispatch之间,在springMVC中,dispatchservlet接收到请求后,会对请求进行处理,根据当前请求信息跟请求映射requestMapping进行匹配,找到相对应的请求映射,请求映射对应的控制器方法就是处理请求的方法,所以dispatchservlet会去调用controller,拦截器作用于控制器执行前后。
二、SpringMVC中的拦截器用于拦截控制器方法的执行,需要实现HandlerInterceptor
一、新建springMVC-demo5项目,在html页面测试拦截器:测试拦截器
二、SpringMVC的拦截器必须在SpringMVC的配置文件中的mvc:interceptors标签中进行配置,该标签中可以写ref、bean、interceptor标签,前两个是一样的:
- 一个Bean代表IOC中一个组件、一个对象,在mvc:interceptors标签中配置bean标签,表示某一个类型的对象就是一个拦截器:
,但是像这样写会拦截所有的请求 - ref可以引用当前IOC容器中某个bean的ID,所以我们可以在ref标签中引用某个拦截器bean的id:,但是像这样写也会拦截所有的请求
@Component// 把拦截器交给IOC管理,通过标识组件的方式,将拦截器标识为一个bean
public class FirstInterceptor implements HandlerInterceptor {
// 控制器方法执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor-->preHandle");
return true;// 返回true表示放行,返回false表示拦截
}
// 控制器方法执行之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor-->postHandle");
}
// 在视图渲染之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor-->afterCompletion");
}
}
- mvc:mapping的path可以设置需要拦截的路径,
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};// 将spring的配置类放在数组中
}
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};// 将springMVC的配置类放在数组中
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};// 把要配置的url-pattern放在String[]数组中返回
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();// 创建一个过滤器对象
// 设置初始化参数
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceResponseEncoding(true);
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
// 可以创建多个过滤器,然后将它们放在Filter[]数组中返回即可
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
创建SpringConfig配置类,代替spring的配置文件
新建spring的配置类src/main/java/com/atguigu/mvc/config/SpringConfig.java,代码如下
@Configuration// 标识这个类是配置类 public class SpringConfig {//ssm整合之后,spring的配置信息写在此类中}创建WebConfig配置类,代替SpringMVC的配置文件一、新建springMVC的配置类src/main/java/com/atguigu/mvc/config/WebConfig.java来代替SpringMVC的配置文件,WebConfig需要完成以下功能:扫描组件、视图解析器、view-controller、default-servlet-handler、mvc注解驱动、文件上传解析器、异常处理、拦截器
二、创建拦截器:新建src/main/java/com/atguigu/mvc/interceptor/TestInterceptor.java文件,代码如下:public class TestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("TestInterceptor-->preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {} @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }三、WebConfig.java代码如下:
@Configuration//将当前类标识为一个配置类 @ComponentScan("com.atguigu.mvc.controller")//1、扫描组件 @EnableWebMvc//5、mvc注解驱动 public class WebConfig implements WebMvcConfigurer { //4、default-servlet-handler @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();// 默认的servlet可用 } //8、拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { TestInterceptor testInterceptor = new TestInterceptor(); // addPathPatterns添加拦截路径,用来配置拦截路径 registry.addInterceptor(testInterceptor).addPathPatterns("/**"); } //3、view-controller @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/hello").setViewName("hello"); } //6、文件上传解析器 @Bean// 加上这个注解,方法的返回值就是IOC容器的一个bean public MultipartResolver multipartResolver(){ CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); return commonsMultipartResolver; } //7、异常处理 @Override public void configureHandlerExceptionResolvers(List测试功能resolvers) { SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver(); Properties prop = new Properties(); prop.setProperty("java.lang.ArithmeticException", "error");// 设置键值对 exceptionResolver.setExceptionMappings(prop);// 设置异常映射 exceptionResolver.setExceptionAttribute("exception");// 设置在请求域中共享的错误信息的键 resolvers.add(exceptionResolver); } //配置生成模板解析器 @Bean public ITemplateResolver templateResolver() { WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得 ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver( webApplicationContext.getServletContext()); templateResolver.setPrefix("/WEB-INF/templates/");// 调用属性的set方法来为属性赋值 templateResolver.setSuffix(".html"); templateResolver.setCharacterEncoding("UTF-8"); templateResolver.setTemplateMode(TemplateMode.HTML); return templateResolver; } //生成模板引擎并为模板引擎注入模板解析器 @Bean public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { // 当前参数类型是什么,spring会在IOC容器中找到一个bean,来为我们当前的参数赋值,所以参数就相当于我们之前讲过的自动装配 // 所以形参必须是能进行自动装配的,必须是当前spring的IOC容器中所拥有的bean,这个bean能为这个参数赋值的情况下,我们才能加这个参数 SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } //生成视图解析器并未解析器注入模板引擎 // SpringTemplateEngine是上一个方法的返回值,所以有bean来为templateEngine参数赋值 @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setCharacterEncoding("UTF-8"); viewResolver.setTemplateEngine(templateEngine); return viewResolver; } } @RequestMapping("/") public String index(){ return "index"; }可正常访问页面
SpringMVC执行流程 SpringMVC常用组件一、DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
DispatcherServlet初始化过程
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求
二、HandlerMapping:处理器映射器,不需要工程师开发,由框架提供
作用:根据请求的url、method等信息查找Handler,即控制器方法,就是将请求与控制器方法进行映射
三、Handler:处理器,需要工程师开发,即控制器
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理
四、HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行,用来调用相对应的控制器方法
五、ViewResolver:视图解析器,不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView
六、View:视图
作用:将模型数据通过页面展示给用户DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是Servlet生命周期来进行调度。



