原理:如果发现异常的话,服务器会一层一层网上抛。
所以需要我们来处理,给出一个友好页面。
问题:Resources目录下的springmvvc.xml总是加载不到target目录下。如果自己手动去粘贴的话,记得修改后再重新粘贴,因为它自己还是加载不了。配置了build没有生效,原因未知。
方法一:实现HandlerExceptionResolver接口;
1.编写异常处理类;
@RequestMapping("/hello")
public String hello() throws SysException {
System.out.println("执行");
try {
//模拟异常
int t=9/0;
} catch (Exception e) {
throw new SysException("出错了");
}
return "success";
}
}
package com.controller;
public class SysException extends Exception {
private String message;
public SysException(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.编写异常处理器类;
public class SysExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//获取异常对象
SysException ex=null;
if(e instanceof SysException){
ex=(SysException)e;
}else{
ex=new SysException("错误");
}
//创建ModelView对象
ModelAndView mv=new ModelAndView();
mv.addObject("errorMsg",ex.getMessage());
mv.setViewName("error");
return mv;
}
}
3.配置异常处理器。
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.controller.SysExceptionResolver"/>
方法二:使用拦截器
注意**:拦截器只有在springmvc框架中才能使用**。作用相当于过滤器。
实现步骤:
1.编写拦截器类。实现HandlerIntercepter接口。这个接口不会出现红线!
注意:拦截器只能拦截Controller里的方法。
public class ControllerDemo implements HandlerInterceptor {
@Override
//预处理
// return true表放行,执行下一个
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("我执行了");
return true;
}
2.配置拦截器。
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--要拦截的具体方法-->
<mvc:mapping path="/user/*"/>
<!--不要拦截的具体方法
<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="com.controller.ControllerDemo"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.拦截器的执行流程: