Controller代码:
@Controller
@RequestMapping("/")
public class LoginController {
private LoginDao loginDao;
@Autowired
public LoginController(LoginDao loginDao){
this.loginDao = loginDao;
}
@RequestMapping(value = "login", method = RequestMethod.POST)
public String login(User user, Model model){
// loginDao.print(user);
// model.addAttribute("msg","hahaha");
System.out.println(1/0);
return "login";
}
}
ExceptionHandler代码:
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(value = Exception.class)
public String loginHandler(Exception e){
System.out.println("异常处理!!");
return "redirect:login.jsp";
}
}
@ControllerAdvice+@ExceptionHandler实现全局异常处理。
@ExecptionHandler注解表示该方法为异常处理方法,@ControllerAdvice注解表示该类中所有的标注@ExecptionHandler、@InitBinder,@ModelAttribute的方法都可以被应用到所有标注了@RequestMapping注解的方法中。
在这种全局异常处理方式中,我们一定要在springmvc-serlet.xml中配置<mvc:annotation-driven />标签。
<mvc:annotation-driven/>标签对应的解析类是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser,这个标签的作用是向工厂中注册以下几个类:
RequestMappingHandlerMapping-----------------(1)
BeanNameUrlHandlerMapping--------------------(2)
RequestMappingHandlerAdapter-----------------(3)
HttpRequestHandlerAdapter--------------------(4)
SimpleControllerHandlerAdapter---------------(5)
ExceptionHandlerExceptionResolver------------(6)
ResponseStatusExceptionResolver--------------(7)
DefaultHandlerExceptionResolver--------------(8)
(1)和(2)是HandlerMapping接口的实现类,用来处理请求映射。(1)是为了处理@RequestMapping注解,(2)会将controller类的名字映射为请求url。
(3)(4)(5)用来处理请求条件,用来确定调用哪个controller的哪个方法来处理当前请求。(3)用来处理@Controller注解,支持自定义方法参数和返回值。(4)用来处理继承HttpRequestHandler的处理器。(5)用来处理继承自Controller接口的处理器。
(6)(7)(8)是用来处理异常的解析器。其中的ExceptionHandlerExceptionResolver就是来处理@ExceptionHandler注解的, 因此若是不使用<mvc:annotation-driven/>标签,这种全局异常处理方式是不可用的。
网友评论