• SpringMVC(下)


    1、拦截器

    1、拦截器的配置:

    SpringMVC中的拦截器用于拦截控制器方法的执行

    SpringMVC中的拦截器需要实现HandlerInterceptor

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/"/>
    5. <ref bean="firstInterceptor"/>
    6. mvc:interceptor>
    7. mvc:interceptors>

    2、拦截器中的三个抽象方法:

    • preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
    • postHandle:控制器方法执行之后执行postHandle()
    • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
    1. @Component
    2. public class FirstInterceptor implements HandlerInterceptor {
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. //在控制器之前执行
    6. System.out.println("前");
    7. /*返回值是true的话是拦截后放行 为false的话是不放行*/
    8. return HandlerInterceptor.super.preHandle(request, response, handler);
    9. }
    10. @Override
    11. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    12. System.out.println("后");
    13. //在控制器之后执行
    14. HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    15. }
    16. @Override
    17. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    18. System.out.println("视图");
    19. //视图渲染后
    20. HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    21. }
    22. }

    3、拦截器的执行顺序:

    1. <ref bean="firstInterceptor"/>
    2. <ref bean="secondInterceptor"/>

    若每个拦截器的preHandle()都返回true

            此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:

    preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

    若某个拦截器的preHandle()返回了false

            preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行

    2、异常处理器:

    1、基于配置的异常处理器:

            SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver

            HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

            SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:

    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    2. <property name="exceptionMappings">
    3. <props>
    4. <prop key="java.lang.ArithmeticException">errorprop>
    5. props>
    6. property>
    7. <property name="exceptionAttribute" value="ex">property>
    8. bean>

    测试:

    1. @RequestMapping(value = "/testException")
    2. public String testException(){
    3. System.out.println(1/0);
    4. return "success";
    5. }

     自定义的异常会自动捕捉异常

    2、基于注解的异常处理器:

    1. @ControllerAdvice //将类标记成组件,进行扫描 其次就是异常捕获
    2. public class ExceptionController {
    3. @ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class})
    4. public String testEx(Exception exception, Model model){
    5. model.addAttribute("ex" ,exception);
    6. return "error";
    7. }
    8. }

    3、注解配置SpringMVC:

    1、创建初始化类,代替web.xml:

            在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了        AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。

    1. public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    2. /**
    3. * 指定spring的配置类
    4. * @return
    5. */
    6. @Override
    7. protected Class[] getRootConfigClasses() {
    8. return new Class[]{SpringConfig.class};
    9. }
    10. /**
    11. * 指定SpringMVC的配置类
    12. * @return
    13. */
    14. @Override
    15. protected Class[] getServletConfigClasses() {
    16. return new Class[]{WebConfig.class};
    17. }
    18. /**
    19. * 指定DispatcherServlet的映射规则,即url-pattern
    20. * @return
    21. */
    22. @Override
    23. protected String[] getServletMappings() {
    24. return new String[]{"/"};
    25. }
    26. /**
    27. * 添加过滤器
    28. * @return
    29. */
    30. @Override
    31. protected Filter[] getServletFilters() {
    32. CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    33. encodingFilter.setEncoding("UTF-8");
    34. encodingFilter.setForceRequestEncoding(true);
    35. HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
    36. return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
    37. }
    38. }

    2、创建SpringConfig配置类,代替spring的配置文件

    1. @Configuration
    2. public class SpringConfig {
    3. //ssm整合之后,spring的配置信息写在此类中
    4. }

    3、创建WebConfig配置类,代替SpringMVC的配置文件

    1. @Configuration
    2. //扫描组件
    3. @ComponentScan("com.atguigu.mvc.controller")
    4. //开启MVC注解驱动
    5. @EnableWebMvc
    6. public class WebConfig implements WebMvcConfigurer {
    7. //使用默认的servlet处理静态资源
    8. @Override
    9. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    10. configurer.enable();
    11. }
    12. //配置文件上传解析器
    13. @Bean
    14. public CommonsMultipartResolver multipartResolver(){
    15. return new CommonsMultipartResolver();
    16. }
    17. //配置拦截器
    18. @Override
    19. public void addInterceptors(InterceptorRegistry registry) {
    20. FirstInterceptor firstInterceptor = new FirstInterceptor();
    21. registry.addInterceptor(firstInterceptor).addPathPatterns("/**");
    22. }
    23. //配置视图控制
    24. /*@Override
    25. public void addViewControllers(ViewControllerRegistry registry) {
    26. registry.addViewController("/").setViewName("index");
    27. }*/
    28. //配置异常映射
    29. /*@Override
    30. public void configureHandlerExceptionResolvers(List resolvers) {
    31. SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
    32. Properties prop = new Properties();
    33. prop.setProperty("java.lang.ArithmeticException", "error");
    34. //设置异常映射
    35. exceptionResolver.setExceptionMappings(prop);
    36. //设置共享异常信息的键
    37. exceptionResolver.setExceptionAttribute("ex");
    38. resolvers.add(exceptionResolver);
    39. }*/
    40. //配置生成模板解析器
    41. @Bean
    42. public ITemplateResolver templateResolver() {
    43. WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
    44. // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
    45. ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
    46. webApplicationContext.getServletContext());
    47. templateResolver.setPrefix("/WEB-INF/templates/");
    48. templateResolver.setSuffix(".html");
    49. templateResolver.setCharacterEncoding("UTF-8");
    50. templateResolver.setTemplateMode(TemplateMode.HTML);
    51. return templateResolver;
    52. }
    53. //生成模板引擎并为模板引擎注入模板解析器
    54. @Bean
    55. public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
    56. SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    57. templateEngine.setTemplateResolver(templateResolver);
    58. return templateEngine;
    59. }
    60. //生成视图解析器并未解析器注入模板引擎
    61. @Bean
    62. public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
    63. ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    64. viewResolver.setCharacterEncoding("UTF-8");
    65. viewResolver.setTemplateEngine(templateEngine);
    66. return viewResolver;
    67. }
    68. }

    3、SpringMVC执行流程

    1、SpringMVC常用组件

    • DispatcherServlet:前端控制器,不需要工程师开发,由框架提供

    作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求

    • HandlerMapping:处理器映射器,不需要工程师开发,由框架提供

    作用:根据请求的url、method等信息查找Handler,即控制器方法

    • Handler:处理器,需要工程师开发

    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理

    • HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供

    作用:通过HandlerAdapter对处理器(控制器方法)进行执行

    • ViewResolver:视图解析器,不需要工程师开发,由框架提供

    作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView

    • View:视图

    作用:将模型数据通过页面展示给用户

  • 相关阅读:
    ChatGLM系列六:基于知识库的问答
    面试准备-中文面试问答(非技术)
    中秋不加班,猿人永不屈服!!! So,How to celebrate the Mid Autumn Festival?
    python学习笔记之word文档提取
    Ruby线程安全秘籍:深入探索并发编程的隐秘角落
    【3dmax】怎么样让二维变三维
    “放弃 GitHub ,时机已到”,软件自由保护协会怒批!
    99%的时间里使用的14个git命令
    「九章云极DataCanvas」完成C+轮融资, 用云中云战略引领数据智能基础软件升级
    Hadoop的伪分布式安装
  • 原文地址:https://blog.csdn.net/keleID/article/details/134051630