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 访问后,得到如下结果
方法二:实现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方法向错误页面传值。