概述
如果在请求服务的过程中发生异常,而开发者又不进行处理的话,异常信息就会被抛到用户界面上,如下:
但是在Spring MVC中可以通过配置异常处理器的方式进行把异常拦截下来,提升用户体验。如下图:
而且有这个图我们可以知道,在SSM开发中,dao层和service层的异常可以直接向上抛,所有的异常都在前端控制器中交由异常处理器处理。所以下面就是如何配置异常处理器。
配置异常处理器
Spring MVC提供了一个接口HandlerExceptionResolver
。实现了这个接口的类被配置进Spring之后当发生异常时会被调用来拦截异常,我们可以在这个类中记录日后和配置异常处理界面等。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(
HttpServletRequest req, HttpServletResponse arg1, Object obj, Exception e) {
if(e instanceof ArithmeticException){
ModelAndView mav = new ModelAndView();
mav.setViewName("error");
return mav;
}
return null;
}
}
<bean id="myException" class="com.ssm.exception.MyException"/>
package com.ssm.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.ssm.mapper.UserMapper;
import com.ssm.pojo.User;
@Controller
public class Test {
@Autowired
private UserMapper userMapper;
@RequestMapping(value="/test.action")
public ModelAndView test() {
//异常
int i = 1 / 0;
User selectByPrimaryKey = userMapper.selectByPrimaryKey(1);
System.out.println(selectByPrimaryKey);
return new ModelAndView();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
发生了异常
</body>
</html>