mvc,处理request ~ ExceptionResolver

综述

        mvc的异常解析器有以下四种

  1. SimpleMappingExceptionResolver:建立异常与页面之间的映射关系,即出现异常之后,跳转到指定页面
  2. DefaultHanlderExceptionResolver:mvc的默认实现方式。
  3. ResponseStatusExceptionResolver:配置异常的返回码以及日志信息。
  4. ExceptionHandlerExceptionResolver:建议异常与方法之间的映射关系,即出现异常之后,运行指定的方法。

SimpleMapping

        它的概念是建立异常类型与错误页面之间的映射关系,即出错之后,跳转到指定的页面。

        它有以下几个属性:

  1. exceptionsMapping:异常类型与页面之间的映射关系,key值为异常类型,value值为页面,它会经过ViewResolver处理。
  2. excludedExceptions:排除这些异常。
  3. defaultErrorView:若抛出的异常类型在exceptionsMapping找不到映射关系,使用默认的页面。抛出的异常类型不包含excluedExceptions中的值。
  4. defaultStatusCode:默认的状态码

        第一步,创建SimpleMappingExceptionResolver对象,配置上述的属性

        第二步,注册。注解方式是通过重写configureHandlerExceptionResolvers方法。Xml方式是通过配置SimpleMappingExceptionResolver的bean。

        示例:

        第一步,创建exception.properties,建立异常与页面的映射关系。它的内容如下:

#  算术异常
java.lang.ArithmeticException = error/arithmeticException

        第二步,创建SimpleMappingExceptionResolver对象,加载exception.properties文件,并配置上述属性

// 创建SimpleMappingExceptionResolver
SimpleMappingExceptionResolver simple = new SimpleMappingExceptionResolver();
// 加载exception.properties
Properties exceptions = new Properties();
// 添加异常与页面的映射关系
simple.setExceptionMappings(exceptions);
// 排除异常,排除空指针异常
simple.setExcludedExceptions(NullPointerException.class);
// 设置默认的异常跳转页面
simple.setDefaultErrorView("error/error.jsp");
// 设置默认的异常码
simple.setDefaultStatusCode(999);

        第三步,注册,重写configureHandlerExceptionResolvers方法。方法的参数为HandlerExceptionResolver集合,把新创建的对象添加到集合中。

        第四步,测试,在Controller方法中运行1/0,抛出算术异常,验证结果。

ExceptionHandler

         建立异常类型与方法之间的映射关系。即出错之后,运行指定的方法。

        当抛出异常之后,会在当前Controller下查找有@ExceptionHandler注解的方法。若要设置全局的, 可以配置Controller的切面。具体做法把异常处理的方法提取到公共类中,在类上添加@ControllerAdvice注解,在方法上添加@ExceptionHandler注解。@ExceptionHandler只有一个属性value,值为异常类型对应的Class类集合。

        当value属性为空时,相当于默认值,会处理所有的异常。

        若value值重复时,即一个exception 类型有多个方法与之对应时,抛出IllegalStateException。

        当异常抛出,对应的方法执行之后,请求会被视为正常结束,返回的状态码为200。若想返回特定的响应码,可以配合@ResponseStatus注解。

        示例:

        第一步,注入对象,查看dispatcher.properties, 它是默认注入的。

        第二步,编写方法,标注@ExceptionHandler,value属性指定异常类型。

@ControllerAdvice(assignableTypes = {TestController.class,HelloController.class})
public class ExceptionController {
    /**
     * @Title: resolve
     * @Description:解决异常的方法
     * @return
     */
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolve() {
        return new ModelAndView("error/arithmeticException");
    }
}

        示例中,只处理TestController和HelloController中抛出的异常

        注:@ControllerAdvice相当于AOP中的advice。

ResponseStatus

        配置异常类型的响应码以及异常信息,若没有,Web容器会使用默认的响应码和异常信息

        通过@ResponseStatus注解的code属性值配置响应码。它的值为HttpStatus枚举类型。

        通过@ResponseStatus注解的reason属性值配置响应码。

        它出现的方式有以下三种

        添加在自定义异常的类上。添加在任何处理请求的方法上,添加在请求流程相关的方法上,例如@ExceptionHandler标注的方法上。

        它是默认注入的。

DefaultHandler

         它是mvc处理异常的默认方式。会调用response.sendError方法返回特定的响应码,异常信息。

        它兼容Servlet处理异常的方式,例如在web.xml中配置/error时,会跳转到其对应的处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛旅行1899

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值