Spring MVC异常处理的三种方式

124 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  • 使用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
在这里插入图片描述
在这里插入图片描述

哈哈