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