struts2拦截器
拦截器概述
拦截器(Interceptor)就是当一个Action被执行之前与执行之后的一段代码。
许多框架的核心功能就是通过拦截器实现的。
比如Struts 2 中的数据校验,类型转换,文件上传,国际化,防止重复提交等。
拦截器是可插拔的,需要时插入,不需要时拔出。 可以为每个Action配置拦截器,也可以根据业务需求编写自己的拦截器。
拦截器与过滤器的区别
拦截器是基于JAVA反射机制的,而过滤器不是 过滤器依赖于servlet容器,
而拦截器不依赖 拦截器只能对Action起作用,而过滤器则可以对几乎所有请求
拦截器可以访问Action上下文,值栈中的对象,而过滤器不能。
拦截器思想
面向切面的编程(AOP) 把通用的功能从系统中提出来,单独处理,实现了软件的重用。
拦截器使用方法:
1,实现Interceptor接口 映射拦截器
//XML配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="res"></constant>
<package name="user" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="inter1" class="com.st.SimpleInterceptor1"></interceptor>
</interceptors>
<action name="test" class="com.st.TestAction">
<interceptor-ref name="inter1"></interceptor-ref>
<result>success.jsp</result>
</action>
</package>
</struts>
-------------------------------------
//JAVA拦截器代码
package com.st;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class SimpleInterceptor1 implements Interceptor {
public void destroy() {
System.out.println("SimpleInterceptor1.destroy()");
}
public void init() {
System.out.println("SimpleInterceptor1.init()");
}
public String intercept(ActionInvocation invocation) throws Exception {
TestAction ta = (TestAction)invocation.getAction();
//ta.setName("denny");
System.out.println("SimpleInterceptor1");
return invocation.invoke();
}
}
2,继承com.opensymphony.xwork2.interceptor.AbstractInterceptor抽象类实现拦截器
package com.st;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class SimpleInterceptor2 extends AbstractInterceptor {
public void destroy() {
System.out.println("SimpleInterceptor2.destroy()");
}
public void init() {
System.out.println("SimpleInterceptor2.init()");
}
public String intercept(ActionInvocation invocation) throws Exception {
TestAction ta = (TestAction)invocation.getAction();
//ta.setName("denny");
System.out.println("SimpleInterceptor2");
return invocation.invoke();
}
}
使用拦截器栈管理拦截器
在很多时候,有些指定的拦截器需要被多个Action所使用,这个时候,如果我们为每一个Action都分别配置拦截器的话,不仅麻烦,而且不利后期的维护,此时就需要用到拦截器栈。 所谓拦截器栈就是将一些拦截器组合起来进行统一管理。
------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="res"></constant>
<package name="user" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="inter1" class="com.st.SimpleInterceptor1"></interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="inter1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="test" class="com.st.TestAction">
<interceptor-ref name="mystack"></interceptor-ref>
<result>success.jsp</result>
</action>
</package>
</struts>
struts2中使用拦截器来检察表单是否重复提交,
他采用同步令牌的方式来实现对表单重复提交的判断,需要使用到<s:token />标签