一、拦截器是用于对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------------");
}
}

jfinal中Interceptor的使用的更多相关文章

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

    1.添加maven依赖 <dependency> <groupId>com.github.icecooly</groupId> <artifactId> ...

  2. JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。

    JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了.因为tomc ...

  3. JFinal中json的使用

    之前Java开发一直使用的是经典的ssh,去年接触了jfinal,觉得jfinal的魅力非常之大,让我无法自拔,现在还深深地陷在其中. 简单的介绍一下jfinal,jfinal短小精悍,让java有了 ...

  4. jfinal中如何使用过滤器监控Druid监听SQL执行?

    摘要:最开始我想做的是通过拦截器拦截SQL执行,但是经过测试发现,过滤器至少可以监听每一个SQL的执行与返回结果.因此,将这一次探索过程记录下来. 本文分享自华为云社区<jfinal中使用过滤器 ...

  5. Jfinal中手动提交/回滚 事物

    在Jfinal中有个Tx类为事物声明类 在方法或controller上面加@Before({Tx.class})即可,可是这样并不能满足有的业务场景 下面是今天写的手动提交的事物处理方法,希望对大家有 ...

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

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

  7. Jfinal中定时器的初步探索(一)

    1.添加包引用:/jfinal_demo/WebContent/WEB-INF/lib/quartz-all-1.6.1.jar 注意版本号,这个版本是现在项目中使用的,已经有更高版本了,但这版比较稳 ...

  8. Jfinal中log4j的配置

    基本不用配置: 1.web.xml不用配置: 2.添加文件log4j.properties到src下面: 3.lib中复制log4j的jar包进去: 4.可以使用了; package demo; im ...

  9. SpringMvc中Interceptor拦截器用法

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...

随机推荐

  1. go语言基础之普通参数列表

    1.普通参数列表 (备注:只有一个参数) 示例1: package main //必须有一个main包 import "fmt" //有参无返回值函数的定义,普通参数列表 //定义 ...

  2. 几款很厉害的jQuery数字化签名插件(转)

    在浏览器中,我们有很多方式来绘制生成签名效果,并且有很多很棒很智能的jQuery插件.数字化签名是未来的发展方向,正是这个原因我们这里收集并且推荐了四款超棒的jQuery数字化签名插件,希望大家喜欢! ...

  3. php stdClass 的使用

    原文:http://www.php.cn/php-weizijiaocheng-371767.html ------------------------------------------------ ...

  4. 北京SAP-AGS CoE support consultant intern 面试总结

    7月4号去大连SAP面试.通过的话直接去北京SAP參加实习(有幸已通过). SAP一直是我理想的公司,大二的时候曾试图參加SAP大连vt项目,当时下了非常大决心,假设通过了就先留在大连,可惜英语群面就 ...

  5. 微信小程序 - 选取搜索地点并且显示(map)

    演示如下,使用时,你也许会配合它:腾讯地图路线规划 wxml: <view class='address' bindtap='onChangeAddress'> <input cla ...

  6. 算法笔记_046:跳台阶问题(Java)

    目录 1 问题描述 2 解决方案 2.1 递归法 2.2 迭代法   1 问题描述 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法. 2 解决方案 2.1 递归法 如果整个台 ...

  7. ACE-Streams架构简介及应用

    一概述 Streams框架是管道和过滤构架模式的一种实现,主要应用于处理数据流的系统.其实现以Task框架为基础.Task框架有两个特性非常适用于Streams框架:一是Task框架可用于创建独立线程 ...

  8. 36、TreeSet详解

    TreeSet是SortedSet接口的实现类,TreeSet可以保证元素处于排序状态.与HashSet相比,TreeSet还提供了如下几个而外的方法: 1).Comparator comparato ...

  9. linux 挂载 ISO 文件

    sudo sudo mount -o loop SUSE-Linux-10.1-GM-DVD-x86_64.iso /media/cdrom/ sudo umount /media/cdrom

  10. Adminer - 类似于phpMyAdmin的MySQL管理客户端

    Adminer是一个类似于phpMyAdmin的MySQL管理客户端.整个程序只有一个PHP文件,易于使用和安装.Adminer支持多语言(已自带11种翻译语言文件,可以按自己的需求翻译相应的语言). ...