SpringMVC 最新 WebMvcConfigurer 视图解析器 异常处理器 拦截器

简介: SpringMVC 最新 WebMvcConfigurer 视图解析器 异常处理器 拦截器

WebMvcConfigurer


1.概述



WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口;


在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,方式一实现WebMvcConfigurer接口(推荐),方式二继承WebMvcConfigurationSupport类


视图解析器


 实现:


       1.实现WebMvcConfigurer接口


       2.重写configureViewResolvers 该方法是用来配置视图解析器的 该方法有一个参                            数ViewResolverRegistry是一个注册器 用来注册你想定义的视图解析器    

/**
  * Configure view resolvers to translate String-based view names returned from
  * controllers into concrete {@link org.springframework.web.servlet.View}
  * implementations to perform rendering with.
  * @since 4.1
  */
  default void configureViewResolvers(ViewResolverRegistry registry) {
  }

       3.添加@EnableWebMvc 开启个性化定制


       4.覆盖configurerViewResolvers

@Configuration
@ComponentScan(basePackages="com.czxy.mvc.controller")
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/pages/",".jsp");
    }
}

异常处理器


       异常处理器的实现方式有两种


       第一种:实现类 编写实现类实现HandlerExceptionResolver接口


       第二种:增强类


               使用@ControllerAdvice对Controller进行增强


               使用ExceptionHandler用于捕获控制器里面的异常 并进行处理?


方式一:实现HandlerExceptionResolver接口

@Component
public class CustomExceptionResolver  implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        // 1 统一异常
        CustomExcption customExcption = null;
        if(e instanceof CustomExcption) {
            customExcption = (CustomExcption) e;
        } else {
            customExcption = new CustomExcption("系统繁忙,请稍后重试!");
        }
        // 2 错误信息返回
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message" ,customExcption.getMessage());
        modelAndView.setViewName("forward:/error.jsp");
        return modelAndView;
    }
}

方式二:通知类

     @CotrollerAdvice 全局异常处理

       @ExceptionHandler 用来统一处理方法异常

@ControllerAdvice
public class GlobalExceptionResolver {
    /**
     * 自定义异常处理器
     * @param ec
     * @param model
     * @return
     */
    @ExceptionHandler(CustomExcption.class)
    public String custom(CustomExcption ec, Model model) {
        model.addAttribute("message", ec.getMessage() + "Global");
        return "forward:/error.jsp";
    }
    /**
     * 其他异常处理器
     * @param e
     * @param model
     * @return
     */
    @ExceptionHandler(Exception.class)
    public String other(Exception e, Model model) {
        model.addAttribute("message", "系统繁忙,请稍后重试!" + "Global");
        return "forward:/error.jsp";
    }
}

拦截器


       preHandler:拦截器之前执行 返回true继续执行 返回false结束

       postHandler:执行完Controller之后执行

       afterCompletion:视图渲染完成之后完成

拦截器:

@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1 拦截前");
        //放行
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("3 执行中");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("5 最后完成");
    }
}

实现WebMvcConfigurer接口 重写addInterceptor方法 设置拦截路径

@Configuration      //配置类
@ComponentScan(basePackages = {"com.czxy.inter.controller","com.czxy.inter.interceptor"})
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {
    @Resource
    private MyInterceptor myInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration1 = registry.addInterceptor(myInterceptor);
        interceptorRegistration1.addPathPatterns("/**");
    }
}


相关文章
|
4天前
|
XML Java API
Spring AOP切点和通知机制的深度解析
Spring AOP切点和通知机制的深度解析
14 4
|
4天前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
14 2
|
4天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
14 3
|
4天前
|
Java 应用服务中间件 Spring
解析Spring Boot自动装配的原理与机制
解析Spring Boot自动装配的原理与机制
15 4
|
2天前
|
监控 Java API
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
11 1
|
8天前
|
Java 开发者 UED
Java中的异常处理机制深度解析
在Java编程中,异常处理是确保软件健壮性的关键因素。本文将深入探讨Java的异常处理机制,包括异常的类型、如何捕获和处理异常,以及最佳实践。我们将通过实例学习如何优雅地处理异常,避免常见的陷阱,并提升代码的可维护性和用户体验。
|
4天前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
11 1
|
9天前
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
25 1
|
9天前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
18 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
2天前
|
XML Java 数据格式
Spring容器启动源码解析
Spring容器启动源码解析

热门文章

最新文章

推荐镜像

更多