这次主要是记录一下 springmvc 关于异常处理 和 拦截的回顾
- 关于springmvc 异常处理:springmvc 提供了 HandlerExceptionResolver 异常处理解析接口 实现该接口
@RequestMapping(value = "exceptionMethod") public void exceptionMethod() throws MyExcption { try { System.out.println(1 / 0); } catch (Exception e) { throw new MyExcption("除数不能为零"); } }
public class MyHandlerException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse res, Object parm, Exception ext) { String msg = "访问异常"; ModelAndView mv = new ModelAndView(); mv.addObject("result", msg); mv.setViewName("hello"); return mv; }
所有的异常 都会经过该异常处理解析,不过不管是何种异常 返回的都是 同一样的页面 提示 ,为了有更好的 错误信息反馈 我们可以修改一下 创建一个自定义的异常:
public class MyHandlerException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse res, Object parm, Exception ext) { String msg = "访问异常"; if (ext instanceof MyExcption) { msg = ((MyExcption) ext).getMsg(); } ModelAndView mv = new ModelAndView(); mv.addObject("result", msg); mv.setViewName("exception"); return mv; }
public class MyExcption extends Exception { public String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public MyExcption() { } public MyExcption(String msg) { this.msg = msg; } }
这样 就会根据自定义提示的异常 返回相应的 错误页面提示
- 拦截器:springmvc 同样也提供了一个 处理请求拦截的处理器接口HandlerInterceptor 实现该接口:
public class MyInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { return true; }
先经过 preHandle 方法 过滤 请求,比如权限验证 是否登录,返回true的时候 表示 放行,在返回modeAndView的时候 执行 postHadnle 最后在执行afterComoletion方法 在springmvc.xml中配置拦截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <mvc:exclude-mapping path="/login/**" /> <bean class="com.springmvc.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
exclude-mapping 表示 不需要拦截的路径(有兴趣的可以去看一下 多个拦截器的时候 请求是如何执行的 以及springmVC Restful )
springmvc 面试的时候 遇到过:谈一下 springmvc 如何执行一个请求的,记住springmvc 的 三大组件(处理器映射器,处理器适配器,视图解析器) 自然而然的就清楚了 springmvc 的执行流程 理解记忆总比 死记硬背的好