美文网首页
jfinal中的拦截器的使用

jfinal中的拦截器的使用

作者: ccq_inori | 来源:发表于2017-10-22 18:20 被阅读0次
    拦截器是动态拦截Action调用的对象,在进入action请求之前进行一系列的拦截操作。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
    jfinal中配置有三种级别的拦截器,接下来是简单的说明一下是哪三种级别,然后加上一些简单的例子进行说明,最后写一个拦截前端发送回来的数据并进行修改(已经导入了jfinal相应的包)
    1.全局拦截器:在JFinalConfig实现类的public void configInterceptor(Interceptors me)方法里添加拦截器,对所有的Controller有效;
    2.Controller拦截器:通过@Before(StudentInterceptor.class)注释在类的最顶部,只对这个Controller有效;
    3.Action拦截器:通过@Before(StudentValidator.class)注释在对应的action方法体上,请求该action时会先经过拦截器处理。

    接下来是全局拦截器的运用:

    1.1首先是创建一个class并实现Interceptor接口

    public class TestInterceptor implements Interceptor 
    {
        public void intercept(Invocation inv)
        {
            System.out.println("前拦截");
            inv.invoke();
            System.out.println("后拦截");
        }
    
    }
    

    1.2.在Main中添加全局拦截器

        public void configInterceptor(Interceptors me) 
        {
            me.add(new TestInterceptor());
        }
    

    这样子是在你执行所有的action请求,在控制台都会出现
    前拦截和后拦截这两句话

    搜狗截图17年10月20日1955_1.png

    2.Controller拦截器的运用(这时候你可以把Main中的全局拦截器的配置给注释掉)

    在你的controller上面通过@Before(TestInterceptor.class)的方式来注入拦截器

    @Before(TestInterceptor.class)
    public class Test2Controller extends Controller 
    {
        public void index()
        {
            System.out.println("这里执行Test2Controller的index()方法");
            render("Welcome.jsp");
        }
    }
    

    执行结果同上面的一样

    3.Action拦截器(个人觉得比较好用)

    其实就是把注释的位置给修改一下而已

    public class Test2Controller extends Controller 
    {
        @Before(TestInterceptor.class)
        public void index()
        {
            System.out.println("这里执行Test2Controller的index()方法");
            render("Welcome.jsp");
        }
    }
    

    接下来是一个小栗子:
    把前端传回来的用户名在拦截器中进行修改,之后再另一个页面进行显示
    先是controller

    public class TestController extends Controller
    {
        public void index()
        {
            System.out.println("执行TestController的index方法");
            render("login.jsp");
        }
        @Before(TestInterceptor.class)
        public void form()
        {
            System.out.println("执行TestController的form方法");
            String username=getPara("username");    
            setAttr("username", username);
            render("Welcome.jsp");
        }
    }
    

    然后是拦截器

    public class TestInterceptor implements Interceptor 
    {
        public void intercept(Invocation inv)
        {
            Controller con=inv.getController();
            String username=con.getPara("username");
            username="miku";
            System.out.println("前拦截");
            inv.invoke();
            System.out.println("后拦截");
            //把修改的值发送给前端
            con.setAttr("username", username);
        }
    }
    
    搜狗截图17年10月20日2010_3.png 搜狗截图17年10月20日2011_4.png

    学习到拦截器这一课,就先把懂得先进行一次总结。本来是想着拦截器能不能把拦截到的值返回到拦截的方法当中,然后没成功。等我再去多摸索一下拦截器先。拦截器的功能应该还有许多,我估计就摸到一点皮毛而已(如果有啥有趣的功能,请一定要告诉我啊)

    相关文章

      网友评论

          本文标题:jfinal中的拦截器的使用

          本文链接:https://www.haomeiwen.com/subject/otzvuxtx.html