文档章节

JFinal框架学习--- 拦截器的使用

Carol998
 Carol998
发布于 09/16 10:33
字数 1027
阅读 32
收藏 0

  在JFinal中,JFinal提供了Interceptor接口来实现拦截器的作用,从而快速实现Aop。拦截器用于在某个方法或字段被访问之前,进行拦截然后再在该方法之前或者之后加入一些操作。

1.拦截器的分类以及配置:

在JFinal中,拦截器分为全局拦截器,Class级别的拦截器,Method级别的拦截器。(其中全局拦截器分为控制层的全局拦截器与业务层的全局拦截器)。使用@Before注解可以对Class级别的拦截器以及Method级别的拦截器进行配置。

(1) 全局拦截器:

使用全局拦截器时需要在JFinalConfig的实现类中的configInterceptor(Interceptors me)方法中添加拦截器。该拦截器对于所有的Controller都有效。

  在Interceptor包下新建TextInterceptor类并实现Interceptor接口:

package com.Interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

public class globalInterceptor implements Interceptor{
    @Override
    public void intercept(Invocation inv) {
        inv.invoke();
        System.out.println("调用了globalInterceptor拦截器");
    }
}

 然后在JFnalConfig的实现类中配置全局拦截器:

然后我们运行一下项目,调用一个控制器的方法后,控制台输出:

(2)Class级别的拦截器:

新建一个classInterceptor拦截器:

并在Controller中使用@Before注解对这个拦截器进行配置:

执行结果:

我们可以看出,全局拦截器以及class级别的拦截器全都有调用。

(3)Method级别的拦截器:

package com.Interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

public class methodInterceptor implements Interceptor{
    @Override
    public void intercept(Invocation inv) {
        inv.invoke();
        System.out.println("调用了methodInterceptor拦截器");
    }
}

在Controller中:

运行结果:

 

二、@Clear注解

   在某些场景下使用拦截器的时候,可能我们在Controller中除了一个方法不需要使用拦截器以外,其他方法都需要使用。这时,如果我们使用Method级别的拦截器,在每一个action上添加@Before,这就显得很麻烦。而JFinal为我们提供了@Clear注解,这为我们很好的解决了这个问题。

  在JFinal中,拦截器从上到下依次分为Global,inject,Class,Method。

 Clear用法技巧:

  • 只清除Clear本身所处层的向上所有层,本层与下层不清除。
  • 当Clear不带参数时清除所有的拦截器,当带参数时清除指定拦截器。

(1)当Clear在Method层时清除了 Method以上的所有拦截器:

 

(2)当Clear在Class级别时:

 

(3)当Clear带参数的时候:

输出结果:

清除了classInterceptor拦截器。

 

三,Interceptor的触发

   JFinal中的Aop分为控制层Aop以及业务层Aop。控制层的Aop在action运行时将会被触发,而业务层Aop则需要先使用enhance()方法对目标对象进行增强,然后再调用目标方法即可。

下面是业务层拦截器的实例:

(1)在service层中:

(2)在controller层中:

控制台输出:

 

四.Enhancer、Duang------对目标进行增强

在上面的例子中我们使用了Enhancer对目标对象进行增强使其具有Aop能力,下面我们来看看如何使用Duang:

 

五. Routes级别的拦截器:

 Routes级别拦截器是指在Routes中添加的拦截器。该拦截器对所有controller中的action都具有烂机器作用。并且将在class级别拦截器之前被调用。

 

六.Inject拦截器

Inject拦截器是指在使用enhance或duang方法增强时使用参数传入的拦截器。Inject可以对目标完全无侵入地应用AOP。

与Class级拦截器一样,Inject拦截器将拦截被增强目标中的所有方法。Inject拦截器可以被认为就是Class级拦截器,只不过执行次序在Class级拦截器之前而已。

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
Carol998
粉丝 2
博文 7
码字总数 5560
作品 0
绵阳
私信 提问
JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal
2012/03/18
0
496
OSC上关于Jfinal的提问整理(一)

看见Jfinal很火,就手痒痒了,想学一下,无奈入门较慢,没有找到比较全的文档。于是就经常看讨论区大家的提问与解答。后来就忽然萌生了整理下来的想法。其中的问题如果是@Jfinal 回答的,那我...

木川瓦兹
2013/04/23
0
21
JFinal框架学习-------EhCachePlugin

一.关于EhCachePlugin 在之前的文章中,我们已经介绍过了JFinal中Cache的一些简单使用,这篇文章将讲述EhCachePlugin的使用, EhCachePlugin是JFinal集成的缓存插件,通过使用EhCachePlugin...

Carol998
10/11
0
0
给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇

2015年8月3日更新: 支持JFinal 2.0 版本,同时给出了一些实际代码,想见git @JFinal给出了一些好的建议,已重构部分代码。 代码放在oschina的git上,访问地址: http://git.oschina.net/mya...

玛雅牛
2013/06/12
0
8
JFinal 3.5 发布,将能上的菜先上了

jfinal 新功能经过 6 个月的酝酿、开发,在大幅度的创新来临之前,jfinal 3.5 这一版先稳一稳,趁着国庆长假,将能上的菜先上了。 jfinal 3.5 这一版针对这 6 个月以来用户反馈最强烈、最频繁...

JFinal
10/08
0
80

没有更多内容

加载失败,请刷新页面

加载更多

从源码入手,一文带你读懂Spring AOP面向切面编程

之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下JDK的动态代理。 基于这两者的实现上...

公众号_Zack说码
18分钟前
4
0
maven 常用命令

mvn deploy -Dmaven.test.skip=true mvn source:jar deploy -Dmaven.test.skip=true mvn dependency:tree -Doutput=1.txt...

yzzzzzzzz
19分钟前
1
0
JavaScript之Promise对象

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。 Pr...

前端攻城老湿
20分钟前
4
0
mysql事务,select for update,及数据的一致性处理

在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读) 在select 的读取锁主要分为两种方式 select .... lock in share mode select ..... for update   这两...

细节探索者
22分钟前
2
0
python 将txt文件转换成excel

emmm,作为一个小白,不会的东西真的太多了,这两天好头大啊!加油坚持吧! #file_affilication = open('Affiliations.txt','r')import xlwtimport os import sysdef txt_xls(...

BellaYu
27分钟前
5
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部