SpringMVC - 拦截器和异常处理机制

SpringMVC拦截器

类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。(责任链模式,AOP思想)

1.创建拦截器实现HandlerInterceptor接口

public class MyInterceptor1 implements HandlerInterceptor {
    //在目标方法执行之前 执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        return true; /*返回值 false:后面方法都不执行 true:后面方法都执行*/
    }

    //在目标方法执行之后 视图对象返回之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    //整个流程都执行完毕后 执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...");
    }
}

2.在spring-mvc.xml中配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <!--对哪些资源执行拦截操作-->
        <mvc:mapping path="/**"/>
        <bean class="com.heiko.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
</mvc:interceptors>

3.测试拦截器的拦截效果
执行http://localhost:8080/my_spring_interceptor_war_exploded//target

@RequestMapping("/target")
public ModelAndView show() {
    System.out.println("目标资源执行....");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("name", "heiko");
    modelAndView.setViewName("index");
    return modelAndView;
}

可以看到打印了日志

preHandle...
目标资源执行....
postHandle...
afterCompletion...

有了拦截器,我们就可以在preHandler中进行拦截跳转操作

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandle...");
    String params = request.getParameter("params");
    if (params.equals("yes")) {
        return true;
    } else {
        request.getRequestDispatcher("/error.jsp").forward(request, response);
        return false;
    }

在postHandle中,可以进行参数的增加修改

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle...");
    modelAndView.addObject("name", "zhangsan");
}
多个拦截器

多个拦截器,会先顺序执行preHandle,再反顺序调用postHandle和afterCompletion。

preHandle1...
preHandle2...
目标资源执行...
postHandle2...
postHandle1...
afterCompletion2...
afterCompletion1...

SpringMVC异常处理机制

可以用来进行统一的异常处理。
新建处理类继承自HandlerExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver {
    /*
    参数Exception:异常对象
    返回值ModelAndView:跳转到错误视图信息
 */
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();

        if(e instanceof MyException){
            modelAndView.addObject("info","自定义异常");
        }else if(e instanceof ClassCastException){
            modelAndView.addObject("info","类转换异常");
        }

        modelAndView.setViewName("error");

        return modelAndView;
    }
}

spring-mvc.xml中配置自定义异常处理器

<bean class="com.heiko.resolver.MyExceptionResolver"/>

如果出现Crash,就可以进行统一处理了。

其他

文中代码:详见https://github.com/EthanCo/SpringTest

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值