一、异常处理
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("用户该退休了");
}
- 测试结果