SpringMVC——异常处理

Spring MVC处理异常方式有以下三种:

1.使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

2.实现HandlerExceptionResolver

3.使用@ExceptionHandler注解实现异常处理

方法一:使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

<!--方法一: 全局异常配置 start -->
	<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">error</prop> <!-- 对应异常发生时要跳转的页面 -->
				<prop key="java.lang.Throwable">error</prop>
				<prop key="java.lang.RuntimeException">error</prop>
				<prop key="java.lang.NullPointerException">error</prop><!-- 当发生空指针异常时跳转到此页面 -->
			</props>
		</property>
	</bean>
	<!-- 全局异常配置 end -->

 注意:异常页面获取异常对象的名称默认是exception,也可以自己指定别名。

    指定异常的别名叫 "ex",这样jsp页面就可以通过${ex}来获取异常信息。

<property name="exceptionAttribute" value="ex"></property>

JSP页面如下:

<h2>
		页面出错误了!
			如果指定异常别名:${ex} <br/>
			如果不知道异常别名:.${exception }
			<br />
		</h2>

 

Controller类中有异常代码:

@Controller
@RequestMapping("/demo")
public class ExceptionController {
	@RequestMapping("/ex.action")
	public String login(ModelMap model) {
		System.out.println("---方法1---");
		String s = null;
		s.length();
		return "success";
	}
}

 

通过地址:http://localhost:8008/spring_exception/demo/ex.action 访问后,得到如下结果


SpringMVC——异常处理
 

方法二:实现HandlerExceptionResolver接口

1)自定义MyExceptionHandler 实现 HandlerExceptionResolver接口

   

MyExceptionHandler.java如下 

public class MyExceptionHandler implements HandlerExceptionResolver {

	public ModelAndView resolveException(HttpServletRequest req,
			HttpServletResponse resp, Object handler, Exception ex) {
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("ex", ex); // jsp页面通过${ex}来获取
		return new ModelAndView("error", model);
	}
}

 在applicationContext.xml中进行配置

   

<bean id="myExceptionHandler" class="com.lydia.web.MyExceptionHandler" />

 

通过以上操作也可以设置。

 方法三:使用@ExceptionHandler注解实现异常处理

编写一个BaseController类,定义如下:

public class BaseController {
	@ExceptionHandler
	public String execute(HttpServletRequest request, Exception ex) {
		request.setAttribute("ex", ex);
		return "error";
	}
}

 

然后其他的Controller继承BaseController类即可。

@Controller
@RequestMapping("/demo")
public class ExceptionController3 extends BaseController {
	@RequestMapping("/ex3.action")
	public String login(ModelMap model){
		System.out.println("---方法3---");
		try {
			String s = "123";
			s.length();
			s.charAt(5);
		} catch (Exception e) {
			e.printStackTrace();
//			throw new MyException(e.getMessage()+"catch异常");
			model.put("msg", e.getMessage()+"---++++");
			model.addAttribute("message", e.getMessage()+"+++++++");
			return "error";
		}
		return "success";
	}
}

 

 注意:上面的代码中自定义了一个异常类MyException,并使用try..catch..来处理异常。

          使用ModelMap的addAttibute()或者put方法向错误页面传值。

相关推荐