SpringMVC(6)

SpringMVC(6)

SpringMVC的拦截器

流程:

结合流程图和后台打印结果看
含有两个自定义拦截器的流程
后台打印结果:

	preHandle执行了。。。1111
	preHandle执行了。。。2222
	testInterceptor执行了...
	postHandle执行了。。。2222
	postHandle执行了。。。1111
	success.jsp执行了...
	afterCompletion执行了。。。2222
	afterCompletion执行了。。。1111
步骤:

(1)编写拦截器类,实现HandlerInterceptor接口
(2)配置拦截器

HandlerInterceptor接口的重写方法:
(1)preHandle:预处理,在controller方法执行前

return true:放行,执行下一个拦截器,如果没有,执行controller中的方法
return false:不放行,直接跳转页面

(2)postHandle:后处理,在controller方法执行后,success.jsp执行之前

(3)afterCompletion:在success.jsp页面执行后

流程
在这里插入图片描述

具体代码:

index.jsp首页:

	<a href="user/testInterceptor" >拦截器</a>

success.jsp成功页面:

	<h3>执行成功</h3>

    <% System.out.println("success.jsp执行了..."); %>

error.jsp错误页面:

	<h3>错误页面</h3>

MyInterceptor1.java:拦截器类,实现HandlerInterceptor接口

public class MyInterceptor1 implements HandlerInterceptor {

    /**
     * 预处理,在controller方法执行前
     *  return true:放行,执行下一个拦截器,如果没有,执行controller中的方法
     *  return false:不放行,直接跳转页面
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle执行了。。。1111");
        // 放行
        return true;

        // 跳转到页面
//        request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
//        // 不放行
//        return false;
    }

    /**
     * 后处理,在controller方法执行后,success.jsp执行之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle执行了。。。1111");
        // 指定页面跳转,就不会跳到success.jsp了
        request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
    }

    /**
     * 在success.jsp页面执行后
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion执行了。。。1111");
    }
}

springmvc.xml:配置拦截器,将自定义拦截器类MyInterceptor1注入到容器中

	<mvc:interceptors>
        <mvc:interceptor>
            <!-- 要拦截的具体的方法
                一般只需要写一个(拦截或者不拦截)
                /user/*:请求路径中user下的所有controller方法
            -->
            <mvc:mapping path="/user/*"/>
            <!-- 不要拦截的具体的方法 -->
<!--            <mvc:exclude-mapping path=""/>-->
            <!-- 配置拦截器对象 -->
            <bean class="com.Lemon.interceptor.MyInterceptor1"/>
        </mvc:interceptor>

    </mvc:interceptors>

UserController控制器类:

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * SpringMVC的拦截器
     */
    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor执行了...");

        return "success";
    }

}

注意
(1)在配置拦截器时,<mvc:mapping path="/user/*"/>表示请求路径中user下的所有controller方法
(2)在preHandle预处理方法中,可以reutrn false不放行,并跳转至指定的error.jsp错误页面
(3)在postHandle后处理方法中,也可以跳转至指定的error.jsp错误页面
(4)如果都不指定,那么就跳转至success.jsp成功页面

效果
(1)不指定跳转,都return true放行:
- 页面会跳转至success.jsp成功页面
- 后台会打印

	preHandle执行了。。。1111
	testInterceptor执行了...
	postHandle执行了。。。1111
	success.jsp执行了...
	afterCompletion执行了。。。1111

(2)return false不放行,并指定跳转到error.jsp错误页面:
- 页面会跳转至error.jsp成功页面
- 如果是preHandle先指定了跳转并return false,那么后台只打印preHandle执行了。。。1111,后续的控制器方法等都不会执行
- 如果是postHandle指定了跳转,而preHandlereturn true,那么控制器方法也会执行,后台打印

	preHandle执行了。。。1111
	testInterceptor执行了...
	postHandle执行了。。。1111
	success.jsp执行了...
	afterCompletion执行了。。。1111
配置多个拦截器:

MyInterceptor2自定义拦截器类:和MyInterceptor1相同

public class MyInterceptor2 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle执行了。。。2222");
        // 放行
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle执行了。。。2222");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion执行了。。。2222");
    }
}

springmvc.xml:配置拦截器,将自定义拦截器类MyInterceptor1MyInterceptor2注入到容器中

    <mvc:interceptors>
     	<!-- 配置第一个拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/user/*"/>
            <bean class="com.Lemon.interceptor.MyInterceptor1"/>
        </mvc:interceptor>

        <!-- 配置第二个拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/user/*"/>
            <bean class="com.Lemon.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>

最终后台打印:

	preHandle执行了。。。1111
	preHandle执行了。。。2222
	testInterceptor执行了...
	postHandle执行了。。。2222
	postHandle执行了。。。1111
	success.jsp执行了...
	afterCompletion执行了。。。2222
	afterCompletion执行了。。。1111
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值