- 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
- 实现HandlerExceptionResolver接口自定义处理器
- 使用@ExceptionHandler注解实现异常处理
1.使用SimpleMappingExceptionResolver处理异常
spring-mvc.xml
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.spring" />
<!-- 开启MVC注解扫描 -->
<mvc:annotation-driven />
<!-- 定义视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 异常处理器 SimpleMappingExceptionResolver -->
<bean id="bs" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--定义异常和界面,可以写多个异常配多个页面-->
<prop key="java.lang.Exception">jsp/error</prop>
</props>
</property>
</bean>
ExceptionController
@Controller
@RequestMapping("/user")
public class ExceptionController {
@RequestMapping("/login.do")
public String toLogin() {
return "jsp/login";
}
@RequestMapping("/test1.do")
public String test1() {
System.out.println("test1");
Integer.valueOf("dafa");
return "jsp/success";
}
@RequestMapping("/test2.do")
public String test2() {
String a = null;
a.charAt(0);
System.out.println("test2");
return "jsp/success";
}
}
login.jsp
<body>
<h1>测试表单</h1>
<form action="${pageContext.request.contextPath}/user/test(1,2).do" method="post">
<table>
<tr>
<td>账户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td><input type="submit" value="提交" /></td>
<td><input type="reset" value="重置" /></td>
</tr>
</table>
</form>
</body>
user/test1.do
user/test2.do
2.实现HandlerExceptionResolver接口处理异常
将上面的SimpleMappingExceptionResolver的配置注释掉,加上下面的配置
spring-mvc.cml
<!-- HandlerExceptionResolver自定义异常处理器 -->
<bean id=" handlerExceptionResolver" class="com.spring.exception.TestHandlerExcetpionResolver" />
TestHandlerExcetpionResolver
public class TestHandlerExcetpionResolver implements HandlerExceptionResolver{
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler,Exception e) {
Map<String, Object> model = new HashMap<String, Object>();
if (e instanceof NumberFormatException) {
//随便假设两个异常返回某些信息
model.put("message","请填写数字");
return new ModelAndView("jsp/message", model);
}else if (e instanceof NullPointerException) {
model.put("message", "输入框中未输入值");
return new ModelAndView("jsp/message", model);
}else {
return new ModelAndView("jsp/error");
}
}
}
还是用ExceptionController来进行测试,在message中用EL表达式来获取信息
user/test1.do
user/test2.do
3.使用@ExceptionHandler处理异常
DemoController
@Controller
@RequestMapping("/demo")
public class DemoController {
@ExceptionHandler
public String HandlerException(Exception e,
HttpServletRequest request,HttpServletResponse response)throws Exception{
if (e instanceof NumberFormatException) {
request.setAttribute("message", "666");
return "jsp/message";
}else if (e instanceof NullPointerException) {
request.setAttribute("message", "77777");
return "jsp/message";
}else {
// 处理不了的异常扔给spring容器,容器中最好配置simpleMappingExceptionResolver
throw e;
}
}
@RequestMapping("/test1.do")
public String test1() {
System.out.println("test1");
Integer.valueOf("dafa");
return "jsp/success";
}
@RequestMapping("/test2.do")
public String test2() {
String a = null;
a.charAt(0);
System.out.println("test2");
return "jsp/success";
}
}
demo/test1.do
demo/test2.do
哈哈