jfinal中Interceptor的使用

一、拦截器是用于对action请求的拦截处理,发生在进入action方法体之前的拦截操作,这样方便了对请求实例做一些文章。

二、自定义、系统已有拦截器都需要实现Interceptor接口,这样才能被系统认为是拦截器实现类。拦截器只有一个方法(并且只有一个传入参数ActionInvocation):

@Override

public void intercept(ActionInvocation ai) {

System.out.println("action注入之前");

System.out.println("actionKey:" + ai.getActionKey() +

"--controllerKey" + ai.getControllerKey() +

"--methodname:" + ai.getMethodName() +

"--viewPath:" + ai.getViewPath());

ai.invoke();

System.out.println("action注入之后");

}

三、如果需要使用到拦截器,首先可以实现Interceptor接口创建一个类,拦截器有三种配置级别:

1)全局拦截器:在JFinalConfig实现类的public void configInterceptor(Interceptors me)方法里添加拦截器,对所有的Controller有效;

2)Controller拦截器:通过@Before(StudentInterceptor.class)注释在类的最顶部,只对这个Controller有效;

3)Action拦截器:通过@Before(StudentValidator.class)注释在对应的action方法体上,请求该action时会先经过拦截器处理。

注意:如果需要通过注解的方式配置多个拦截器可以如下方式:@Before({StudentValidator.class, StudentValidator.class})

四、如果已经配置了拦截器但是又想在某个action中清除掉拦截器,可以通过注解:@ClearInterceptor(ClearLayer.ALL)清除所有的拦截器,如果没写括号参数,默认清除上一级的。

1)action清除上一级为controller级;

2)controller级别为全局级。

问题:如果将多个拦截器合并为一个拦截器

提示:可以查看InterceptorStack类。

我的代码:

1、JFinalCongig中的方法:

@Override

public void configInterceptor(Interceptors me) {

// 给所有请求加上校验,校验器也是实现了拦截器接口

me.add(new StudentValidator());

// 给所有请求加上拦截器处理

me.add(new StudentInterceptor());

}

2、StudentController类:

// controller级别粒度拦截器配置

@Before(StudentInterceptor.class)

public class StudentController extends Controller {

private static int num = 0;

// 设置在访问此方法时先被拦截器拦截处理,此处配置的拦截器粒度为Action

@Before(StudentInterceptor.class)

public void index() {

System.out.println("------------start index------------");

List list = Student.dao.find("select * from student");

setAttr("studentList", list);

render("/index.html");

System.out.println("------------end index------------");

}

// 可以不根据方法名作为访问该方法的url,用actionkey可以自定义url

@ActionKey("/test")

public void add() {

System.out.println("------------start add------------");

List classesList = Classes.dao.find("select * from classes");

setAttr("classesList", classesList);

render("/add.html");

System.out.println("------------end add------------");

}

public void delete() {

System.out.println("------------start delete------------");

// 获取表单域名为studentID的值

// Student.dao.deleteById(getPara("studentID"));

// 获取url请求中第一个值

Student.dao.deleteById(getParaToInt());

forwardAction("/student");

System.out.println("------------end delete------------");

}

public void update() {

System.out.println("------------start update------------");

Student student = getModel(Student.class);

student.update();

forwardAction("/student"); // 后台直接action跳转,无需前台再发一次请求

//redirect("/student"); // 重定向url前台再发一次请求

System.out.println("------------end update------------");

}

// 清除所有的拦截器配置,默认为删除其上一级别的拦截器

@ClearInterceptor(ClearLayer.ALL)

public void get() {

System.out.println("------------start get------------");

Student student = Student.dao.findById(getParaToInt());

setAttr("student", student);

render("/change.html");

System.out.println("------------end get------------");

}

// 设置在进行保存时先对保存的内容进行校验,校验不成功直接返回(在validator中实现)

@Before({StudentValidator.class, StudentValidator.class})

public void save() {

System.out.println("------------start save------------");

Student student = getModel(Student.class);

student.set("studentid", num++).save();

forwardAction("/student");

System.out.println("------------end save------------");

}

}

时间: 2024-11-10 10:34:03

jfinal中Interceptor的使用的相关文章

基于JFinal中搭建wopi协议支撑办法

1.添加maven依赖 <dependency> <groupId>com.github.icecooly</groupId> <artifactId>FastHttpClient</artifactId> <version>1.7</version> </dependency> 2.FastHttpClient示例https://gitee.com/icecooly/FastHttpClient 3.在 Jf

JFinal中使用JSP的自定义Tag解决I18N

1. 设计原由 由于JFinal的国际化(I18N)支持在JSP中支持不好,因此,萌生了解决这一短板的念头. 实现时也考虑了几种方式,最终决定采用JSP中最原始的标签.因为自定义标签在JSP中容易实现,内容灵活且功能比较强大,可扩展性好. 2. I18N标签 自定义的I18N标签需要针对I18N的各个接口做最好的支持,使用<jf:i18n />作为标签名,下面是JFinal中I18N类的几个接口: public static String getText(String key) public 

Jfinal中的validator理解/详解

为了验证账号密码不为空,需要在控制器下的login()方法前添加验证器: 1 @Before(LoginValidator.class) 2 public void login() { 而validator是实现了Interceptor(拦截器)接口.validator的用法如下: 1 public class LoginValidator extends Validator { 2 @Override 3 protected void validate(Controller controlle

Jfinal中使用日志框架输出完整sql语句信息(mysql+oracle)

1.引入Jar包. //必须引入的jar包 log4j-1.2.17.jar log4jdbc4-1.2.jar slf4j-api-1.7.5.jar //二选一的jar包,如果你的项目中已经引入了其中任何一个,就不需要再引入另一个了.同时引入以上两个包会产生堆栈溢出问题,详情可参考这篇文档: http://blog.csdn.net/kxcfzyk/article/details/38613861 slf4j-log4j12-1.7.5.jar 或者 log4j-over-slf4j-1.7

Jfinal中定时器的初步探索(二)

第一篇中增加的是程序代码的实现,本篇我们将通过配置文件进行定时器的配置,减少代码量,提高灵活性. 1.需要用到的文件:quartz.properties,据说这个文件如果没有的话,按默认的走,结果布署到tomcat中,提示找不到该文件: #============================================================================ # Configure Main Scheduler Properties #==============

JFinal 中使用 Dubbo —— 3 集群

1. 集群 1.1. 部署结构 下面是一个简单的Cunsumer端服务器和Provider端服务器分别集群的部署图: 在个人开发机上,实现Cunsumer端服务器集群难以实现,所以此Demo中只实现Provider端服务器集群,Cunsumer端服务器集群请读者在有条件的情况下自行实践. 1.2. 部署Dubbo管理控制台 Dubbo管理控制台的部署相当简单,由于开发机是Windows 7系统,所以此处也只介绍Windows环境下的部署过程. 具体步骤如下: 独立出一个Tomcat环境,将"du

Jfinal中log4j的配置

基本不用配置: 1.web.xml不用配置: 2.添加文件log4j.properties到src下面: 3.lib中复制log4j的jar包进去: 4.可以使用了; package demo; import org.apache.log4j.Logger; import com.jfinal.core.Controller; public class HelloController extends Controller { private static final Logger log = L

JFinal 中的cron4j定时插件

1.下载cron4j的jar包,并放入classpath http://www.sauronsoftware.it/projects/cron4j/download.php 2.编写Cron4jPlugin.java package com.welicai.app.common.plugin; import it.sauronsoftware.cron4j.InvalidPatternException; import it.sauronsoftware.cron4j.Scheduler; im

SpringMVC中Interceptor和Filter区别

Interceptor 主要作用:拦截用户请求,进行处理,比如判断用户登录情况,权限验证,主要针对Action请求进行处理.是通过HandlerInterceptor 实现的. 配置如下: <mvc:interceptors> <bean class="cn.appsys.testInterceptor"></bean>//拦截所有请求 <mvc:interceptor> <mvc:mapping path="/manag