一、拦截器是用于对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中搭建wopi协议支撑办法
1.添加maven依赖 <dependency> <groupId>com.github.icecooly</groupId> <artifactId> ...
- JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。
JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了.因为tomc ...
- JFinal中json的使用
之前Java开发一直使用的是经典的ssh,去年接触了jfinal,觉得jfinal的魅力非常之大,让我无法自拔,现在还深深地陷在其中. 简单的介绍一下jfinal,jfinal短小精悍,让java有了 ...
- jfinal中如何使用过滤器监控Druid监听SQL执行?
摘要:最开始我想做的是通过拦截器拦截SQL执行,但是经过测试发现,过滤器至少可以监听每一个SQL的执行与返回结果.因此,将这一次探索过程记录下来. 本文分享自华为云社区<jfinal中使用过滤器 ...
- Jfinal中手动提交/回滚 事物
在Jfinal中有个Tx类为事物声明类 在方法或controller上面加@Before({Tx.class})即可,可是这样并不能满足有的业务场景 下面是今天写的手动提交的事物处理方法,希望对大家有 ...
- Jfinal中定时器的初步探索(二)
第一篇中增加的是程序代码的实现,本篇我们将通过配置文件进行定时器的配置,减少代码量,提高灵活性. 1.需要用到的文件:quartz.properties,据说这个文件如果没有的话,按默认的走,结果布署 ...
- Jfinal中定时器的初步探索(一)
1.添加包引用:/jfinal_demo/WebContent/WEB-INF/lib/quartz-all-1.6.1.jar 注意版本号,这个版本是现在项目中使用的,已经有更高版本了,但这版比较稳 ...
- Jfinal中log4j的配置
基本不用配置: 1.web.xml不用配置: 2.添加文件log4j.properties到src下面: 3.lib中复制log4j的jar包进去: 4.可以使用了; package demo; im ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
随机推荐
- go语言基础之递归函数的调用流程
一.递归函数的调用流程 package main //必须 import "fmt" func test(a int) { if a == 1 { //函数终止调用的条件,非常重要 ...
- vb.net中将DataGridView与数据源绑定
在< .net中将DataGridView内的数据导出为Excel表格>中说了如何导出数据到Excel,今天这篇文章将讲述如何绑定数据源,在控件中显示我们需要的信息. 在敲机房收费系统的时 ...
- CentOS7 rpm方式安装mysql5.7
内容源自:CentOS7安装mysql 在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. ...
- Windows Server 2012怎样部署Domain Controller
用过Windows Server2008 系统的运维师们,可能习惯于用dcpromo的方式部署Domain Controller,可是在WindowsServer2012操作系统已经把这样的部署方式取 ...
- JS中括号的用法
转自:http://blog.csdn.net/hongmin118/article/details/4584023 我们在一些JS代码中经常可以看到这样的用法 :(function(){})();那 ...
- IIS7.5 取消301重定向
今天想把一个域名解析到对应的www的域名,添加了301重定向. 结果域名解析那里是把www解析到了对应的域名,结果就是重定向循环.立即删除了IIS中重定向,结果还是无法解决. 以为是有缓存,重 ...
- Maven项目结合POI导出Excl表格Demo-亲测可用
Maven项目结合POI导出Excl表格 一.POM文件添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> ...
- 【转】linux下的单线程
传统的每个进程中只有一个线程在执行,称作单线程方法.MS-DOS是一种支持单用户进程和单线程的操作系统,UNIX支持多用户进程,但只支持每个进程一个线程,WINDOWS 2000(W2K).SOLAR ...
- Event sender
Sometimes it is convenient to know which widget is the sender of a signal. For this, PyQt4 has these ...
- Unity3D游戏开发之SQLite让数据库开发更简单
各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...