SpringMVC 核心技术-异常处理

springmvc框架采用的是统一,全局的异常处理,把controller中的所有异常处理都集中到一个地方,采用的是aop的思想。把业务逻辑和异常处理代码分开。

异常处理的步骤:

    1、创建一个自定义异常类,再定义它的子类异常

    2、创建一个普通类,作为全局异常处理类

            1)在类的上面加入@ControllerAdvice

            2)在类中定义方法,方法的上面加入@ExpectationHandler

         处理抛出的异常:

             @ControllerAdvice:控制器增强,就是给控制器类增加功能(处理异常的功能)

             位置:在类的上面

             特点:必须让框架知道这个注解的包名,需要在springMVC配置文件中声明组件扫描器

                         指定@ControllerAdvice所在的包名位置

            定义类方法处理发生的异常

                      处理异常的方法和控制器方法的定义一样,可以由多个参数,可以有ModelAndView String.. 

            形参:Exception,表示Controller中抛出的异常对象

                       通过形参可以获取发生异常的信息

           在方法上面加注解@ExceptionHandle(异常的class):表示异常的类型,当发生此类异常时当由此方法处理

    3、在controller抛出异常

    4、创建处理异常的视图页面

    5、创建springmvc的配置文件

           1)组件扫描器,扫描@controller注解

           2)组件扫描器,扫描@ControllerAdvice所在包名

           3)声明注解驱动

代码演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="textml; charset=UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="user/some.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交请求">
    </form>
</body>
</html>

Controler类中

@RequestMapping(value = "/user")
@Controller
public class myController {
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(String name,String age) throws myException {
        ModelAndView mv = new ModelAndView();
        //根据请求的参数抛出异常
        if("".equals(name)){
            //抛出的异常交给框架处理
            throw new nameException("姓名不为空");
        }
        if (!isNum(age)) {
            throw  new ageException("年龄输入非数字");
        }
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }
    public boolean isNum(String str){
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

异常类:

public class myException extends Exception {
    public myException() {
        super();
    }
    public myException(String message) {
        super(message);
    }
}
/**
 * 年龄出现异常,抛出异常
 */
public class ageException extends myException {
    public ageException() {
        super();
    }
    public ageException(String message) {
        super(message);
    }
}
/**
 * name出现异常,抛出异常
 */
public class nameException extends myException {
    public nameException() {
        super();
    }
    public nameException(String message) {
        super(message);
    }
}

处理抛出的异常

@ControllerAdvice
public class ExceptionHandle {
    @ExceptionHandler(value = nameException.class)
    public ModelAndView doNameException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","姓名不为空!!");
        mv.addObject("ex",exception);
        mv.setViewName("nameError");
        return mv;
    }
    @ExceptionHandler(value = ageException.class)
    public ModelAndView doAgeException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","年龄输入错误!!");
        mv.addObject("ex",exception);
        mv.setViewName("ageError");
        return mv;
    }
    //其他的错误信息处理
    @ExceptionHandler
    public ModelAndView doOtherException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","其他异常错误!!");
        mv.addObject("ex",exception);
        mv.setViewName("otherError");
        return mv;
    }
 
}

异常显示jsp页面:其他大同小异


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ageError.jsp的错误信息<br/>
    ${tips}<br/>
    ${ex.message}<br/>
</body>
</html>

定义 SpringMVC 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <context:component-scan base-package="cn.com.Ycy.Contrller"/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀名:视图文件的路径-->
            <property name="prefix" value="/WEB-INF/"/>
            <!-- 后缀名:视图文件的扩展名 -->
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 处理异常的两步  -->
        <context:component-scan base-package="cn.com.Ycy.handle"/>
        <mvc:annotation-driven/>
</beans>

原文:https://blog.csdn.net/weixin_43725517/article/details/108253018
作者: 放肆的青春゛つ