Springmvc核心技术之异常处理(八)

一、异常处理

1.1、配置SimpleMappingExceptionResolver

1、springMVC.xml配置
<!--配置SimpleMappingExceptionResolver:Spring提供的一个简单但方便的HandlerExceptionResolver实现-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="/WEB-INF/errors/error.jsp"/>
        <property name="exceptionAttribute" value="ex"/>
    </bean>

SimpleMappingExceptionResolver是Spring提供的一个简单但方便的HandlerExceptionResolver实现;
defaultErrorView设置springmvc默认的报错页面视图;
exceptionAttribute设置springmvc工程报错的属性名。

2、使用java代码配置
@Configuration
@EnableWebMvc  // Optionally setup Spring MVC defaults (if you aren't using
               // Spring Boot & haven't specified @EnableWebMvc elsewhere)
public class MvcConfiguration extends WebMvcConfigurerAdapter {
  @Bean(name="simpleMappingExceptionResolver")
  public SimpleMappingExceptionResolver
                  createSimpleMappingExceptionResolver() {
    SimpleMappingExceptionResolver r =
                new SimpleMappingExceptionResolver();

    Properties mappings = new Properties();
    mappings.setProperty("DatabaseException", "databaseError");
    mappings.setProperty("InvalidCreditCardException", "creditCardError");

    r.setExceptionMappings(mappings);  // None by default
    r.setDefaultErrorView("error");    // No default
    r.setExceptionAttribute("ex");     // Default is "exception"
    r.setWarnLogCategory("example.MvcLogger");     // No default
    return r;
  }
  ...
}
3、MyController处理器类
@RequestMapping("/my")
public class MyController {

    @RequestMapping("/login")
    public String doLogin(String name, int age,Model model){

        int a = 3 / 0;

        model.addAttribute("username",name);
        model.addAttribute("age",age);
        return "redirect:other";
    }

int a = 3 / 0会抛出一个错误,这是会默认跳转至/WEB-INF/errors/error.jsp页面

4、error.jsp
%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>主错误页面</title>
</head>
<body>

<h1>error:后台程序报错</h1>
<hr>
${ex.message}
5、测试结果

在这里插入图片描述

1.2、SimpleMappingExceptionResolver拓展配置

1、自定义异常类
  • MyException类
public class MyException extends Exception {
    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message);
    }
}
  • NameException类
public class NameException extends MyException {
    public NameException() {
        super();
    }

    public NameException(String message) {
        super(message);
    }
}
  • AgeException类
public class AgeException extends MyException {

    public AgeException() {
        super();
    }

    public AgeException(String message) {
        super(message);
    }
}

注意:NameException和AgeException是MyException 的子类

2、springMVC.xml配置
<!--配置SimpleMappingExceptionResolver:Spring提供的一个简单但方便的HandlerExceptionResolver实现-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="/WEB-INF/errors/error.jsp"/>
        <property name="exceptionAttribute" value="ex"/>
        <property name="exceptionMappings">
            <props>
                <prop key="com.chuan.core.exception.NameException">/WEB-INF/errors/NameError.jsp</prop>
                <prop key="com.chuan.core.exception.AgeException">/WEB-INF/errors/AgeError.jsp</prop>
            </props>
        </property>
    </bean>

exceptionMappings:建立自定义异常的映射关系

3、/WEB-INF/errors/NameError.jsp
<body>
<h1>error:name姓名报错</h1>
<hr>
${ex.message}
</body>
4、/WEB-INF/errors/AgeError.jsp
<body>
<h1>error:age年龄报错</h1>
<hr>
${ex.message}
</body>
5、MyController处理器类
   @RequestMapping("/login")
    public String doLogin(String name, int age,Model model) throws MyException {

//        int a = 3 / 0;

        if (!name.equals("zhangsan")){
            throw new NameException("用户名有误");
        }

        if (age>65){
            throw new AgeException("用户该退休了");
        }

        model.addAttribute("username",name);
        model.addAttribute("age",age);
        return "redirect:other";
    }

注意:一定要将a = 3 / 0;注释掉,否则后面两个异常无法测试。

6、测试

在这里插入图片描述

7、结果:

在这里插入图片描述

1.3、自定义异常处理器

1、自定义MyExceptionResolver类
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler, Exception ex) {
        ModelAndView view = new ModelAndView();
        //将异常对象加入视图
        view.addObject("ex",ex);
        //设置默认错误响应页面
        view.setViewName("/WEB-INF/errors/error.jsp");
        //设置NameException响应页面
        if(ex instanceof NameException){
            view.setViewName("/WEB-INF/errors/NameError.jsp");
        }
        //设置AgeException响应页面
        if (ex instanceof AgeException){
            view.setViewName("/WEB-INF/errors/AgeError.jsp");
        }
        return view;
    }
}

注意:必须要实现HandlerExceptionResolver 接口

2、springMVC.xml配置
<!--注册自定义的异常处理器:MyExceptionResolver-->
    <bean class="com.chuan.core.resolver.MyExceptionResolver"/>
3、测试

在这里插入图片描述

4、结果

在这里插入图片描述

1.4、注解式异常处理器

1、MyController处理器中直接注解异常处理方法
@Controller
@RequestMapping("/my")
public class MyController {

    @RequestMapping("/login")
    public String doLogin(String name, int age,Model model) throws MyException {

//        int a = 3 / 0;

        if (!name.equals("zhangsan")){
            throw new NameException("用户名有误");
        }

        if (age>65){
            throw new AgeException("用户该退休了");
        }

        model.addAttribute("username",name);
        model.addAttribute("age",age);
        return "redirect:other";
    }

    @RequestMapping("/other")
    public String doOther(){
        return "/welcome.jsp";
    }

    @ExceptionHandler
    public ModelAndView myException(Exception ex){
        ModelAndView view = new ModelAndView();
        view.addObject("ex",ex);
        //设置默认错误跳转页面

        view.setViewName("/WEB-INF/errors/error.jsp");
        //设置NameException响应页面
        if(ex instanceof NameException){
            view.setViewName("/WEB-INF/errors/NameError.jsp");
        }
        //设置AgeException响应页面
        if (ex instanceof AgeException){
            view.setViewName("/WEB-INF/errors/AgeError.jsp");
        }
        return view;
    }
2、测试结果

在这里插入图片描述

3、修改:将异常独立于一个单独的controller类中使用
  • 自定义一个异常处理controller:MyExceptionController
@Controller
public class MyExceptionController {

    @ExceptionHandler(NameException.class)
    public ModelAndView nameException(Exception ex){
        ModelAndView view = new ModelAndView();
        view.addObject("ex",ex);
        view.setViewName("/WEB-INF/errors/NameError.jsp");
        return view;
    }


    @ExceptionHandler(AgeException.class)
    public ModelAndView ageException(Exception ex){
        ModelAndView view = new ModelAndView();
        view.addObject("ex",ex);
        view.setViewName("/WEB-INF/errors/AgeError.jsp");
        return view;
    }

    //其它异常处理
    @ExceptionHandler
    public ModelAndView myException(Exception ex){
        ModelAndView view = new ModelAndView();
        view.addObject("ex",ex);
        //设置默认错误跳转页面
        view.setViewName("/WEB-INF/errors/error.jsp");
        return view;
    }

}

@ExceptionHandler:使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,为一个 Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。

  • MyController继承MyExceptionController
@Controller
@RequestMapping("/my")
public class MyController extends MyExceptionResolver {

    @RequestMapping("/login")
    public String doLogin(String name, int age,Model model) throws MyException {

//        int a = 3 / 0;

        if (!name.equals("zhangsan")){
            throw new NameException("用户名有误");
        }

        if (age>65){
            throw new AgeException("用户该退休了");
        }

  • 测试结果
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值