1.springmvc中异常处理有三种方式
1)使用spring自带的异常处理器SimpleMappingExceptionResolver
2 ) 自定义全局异常处理器
3)使用@ExceptionHandler注解实现异常处理
本文以登录校验为例来讲解三种异常处理方法的应用
2.使用SimpleMappingExceptionResolver,它实现了HandlerExceptionHandler接口
首先定义自己的异常
public class LibraryException extends Exception {
public String message;
public LibraryException(){}
public LibraryException(String message){
this.message=message;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
在logincontroller中会抛出自定义的异常
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response,
String username, String password,String captcha,
@RequestParam(value="rememberme",defaultValue="0") int rememberme) throws Exception {
if(!validateUtils.validate(request,response,captcha)){
throw new LibraryException("验证码输入不正确!");
}
return "redirect:list-books";
}
在springmvc的配置文件中需要配置该异常处理器
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 定义默认的异常处理页面 --> <property name="defaultErrorView" value="/WEB-INF/views/error.jsp"/> <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="exception"/> <!-- 定义需要特殊处理的异常,可以是自定义的异常(记得配置为bean)--> <property name="exceptionMappings"> <props> <prop key="com.lpq.personallibrary.util.exceptionutils.LibraryException"> library_error</prop> </props> </property> </bean>
3.自定义全局异常处理器
1)跟上面一样定义LibraryException异常,在controller中抛出异常; 2)自定义全局异常处理器MyHandlerExceptionResolver来实现HandlerExceptionResolver接口 首先,判断异常的类型是否是自定义的异常,如果是则转换成自定义异常,如果不是实例化一个自定义的异常(信息为“系统未定义异常!”); 3)定义ModelAndView,添加异常信息和错误页面的名称
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
LibraryException le=null;
if(ex instanceof LibraryException){
le=(LibraryException)ex;
}else{
le=new LibraryException("系统未知异常!");
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("exception",le.getMessage());
modelAndView.getModel().put("exception",le.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
jsp页面中error.jsp可以获取其中的异常信息
%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>Title</title>
</head>
<body>
错误页面!2
${requestScope.exception}
${exception}
</body>
</html>
4.基于@ExceptionController 和 @ControllerAdvice的注解
这种方法比较简单,不需要进行配置,如果没有@ControllerAdvice注解,则@ExceptionHanler注解需要和contoller在同一个类中
- @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度,需要指明需要处理的异常类型
- @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离
package com.lpq.personallibrary.util.exceptionutils;
import org.springframework.stereotype.Component;
@Component
public class LibraryException extends Exception {
public String message;
public LibraryException(){}
public LibraryException(String message){
this.message=message;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
然后,定义异常处理类
在controller中抛出的异常都能得到相应的处理
package com.lpq.personallibrary.util.exceptionutils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class ExceptionHandler { //该注释指明LibraryException在此方法中进行处理 @org.springframework.web.bind.annotation.ExceptionHandler(LibraryException.class) public ModelAndView libraryExceptionHandler(LibraryException ex){ ModelAndView modelAndView=new ModelAndView(); modelAndView.getModel().put("exception",ex); modelAndView.setViewName("library_error"); return modelAndView; } //注解中指明Exception.class,所以前面未能匹配的异常进入此方法进行处理 @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class) public ModelAndView allExceptionHanlder(Exception ex){ ModelAndView modelAndView=new ModelAndView(); modelAndView.getModel().put("exception",ex); modelAndView.setViewName("error"); return modelAndView; } }
@RequestMapping(value="/login",method=RequestMethod.POST) public String login(HttpServletRequest request,HttpServletResponse response, String username, String password,String captcha, @RequestParam(value="rememberme",defaultValue="0") int rememberme) throws Exception { if(!validateUtils.validate(request,response,captcha)){ throw new LibraryException("验证码输入不正确!"); //throw new RuntimeException("运行时异常"); } return "redirect:list-books"; }