Spring MVC异常处理的三种方式

本文详细介绍了SpringMVC中的三种异常处理方式:使用SimpleMappingExceptionResolver进行配置映射,实现HandlerExceptionResolver接口自定义处理器,以及使用@ExceptionHandler注解进行局部异常处理。通过具体代码示例,展示了如何针对不同类型的异常返回定制化的错误页面或模型视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值