springmvc学习(五)

 这次主要是记录一下 springmvc 关于异常处理 和 拦截的回顾

  1. 关于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;
        }
    }

    这样 就会根据自定义提示的异常 返回相应的 错误页面提示

  2. 拦截器: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 的执行流程 理解记忆总比 死记硬背的好

posted on 2018-12-27 13:58  年少不知愁  阅读(134)  评论(0编辑  收藏  举报