1.Struts Intercept 介绍:
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
Struts2拦截类实现com.opensymphony.xwork2.interceptor.Interceptor接口或extends AbstractInterceptor 类,在Intercepter接口中有如下三个方法需要实现: void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception;
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用这个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。
2.Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方法的拦截. MethodFilterInterceptor中有两个方法 setExcludeMethods:排除需要过滤的方法 setIncludeMethods:设置需要过滤的方法 如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class TestMethodIntercept extends MethodFilterInterceptor {
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("拦截器名称:");
System.out.println("action:" + actionInvocation.getAction());
return actionInvocation.invoke();
}
}
配置:
<package name="Struts2_CRUD_DEMO" extends="struts-default"
namespace="/Book">
<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="testInterceptor"
class="tutorial.intercept.TestIntercept" />
<interceptor name="testMethodInterceptor"
class="tutorial.intercept.TestMethodIntercept" >
<!-- 设置需要拦截的方法,指定多个方法以逗号隔开 -->
<param name="includeMethods">list,load</param>
<!-- 设置不需要拦截的方法,execute在includeMethods中同时存在,execute会被拦截 -->
<param name="excludeMethods">store</param>
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="appStack">
<interceptor-ref name="testInterceptor" />
<!-- struts2自身拦截器 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name ="timer" />
<interceptor-ref name ="testMethodInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="appStack"></default-interceptor-ref>
<global-results>
<result name="root">/exception.jsp</result><!-- /指向book包外的页面 -->
</global-results>
<global-exception-mappings>
<exception-mapping exception="common.MyException"
result="root" />
</global-exception-mappings>
<action name="List" class="bookAction" method="list">
<result>List.jsp</result>
</action>
<action name="Edit" class="bookAction" method="load">
<result>Edit.jsp</result>
</action>
<action name="Store" class="bookAction" method="store">
<!-- 配置拦截器栈 -->
<interceptor-ref name="appStack"/>
<result type="redirect">List.action</result>
<result name="input">Edit.jsp</result>
</action>
<action name="Remove" class="bookAction" method="remove">
<result type="redirect">List.action</result>
</action>
</package>
注意:当我们自定义拦截器后,发现,struts2自身的拦截器却不起作用了。这里因为我们的拦截器覆盖了struts2自身的拦截器(defaultStack)的原因造成的。解决方法是,配置一个拦截器栈,将struts2自身的拦截器配置进去即可。
3. Struts2(XWork)提供的拦截器的功能说明:
拦截器 |
名字 |
说明 |
Alias Interceptor |
alias |
在不同请求之间将请求参数在不同名字件转换,请求内容不变 |
Chaining Interceptor |
chain |
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。 |
Checkbox Interceptor |
checkbox |
添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。 |
Cookies Interceptor |
cookies |
使用配置的name,value来是指cookies |
Conversion Error Interceptor |
conversionError |
将错误从ActionContext中添加到Action的属性字段中。 |
Create Session Interceptor |
createSession |
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。 |
Debugging Interceptor |
debugging |
提供不同的调试用的页面来展现内部的数据状况。 |
Execute and Wait Interceptor |
execAndWait |
在后台执行Action,同时将用户带到一个中间的等待页面。 |
Exception Interceptor |
exception |
将异常定位到一个画面 |
File Upload Interceptor |
fileUpload |
提供文件上传功能 |
I18n Interceptor |
i18n |
记录用户选择的locale |
Logger Interceptor |
logger |
输出Action的名字 |
Message Store Interceptor |
store |
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。 |
Model Driven Interceptor |
model-driven |
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。 |
Scoped Model Driven |
scoped-model-driven |
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。 |
Parameters Interceptor |
params |
将请求中的参数设置到Action中去。 |
Prepare Interceptor |
prepare |
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。 |
Scope Interceptor |
scope |
将Action状态存入session和application的简单方法。 |
Servlet Config Interceptor |
servletConfig |
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。 |
Static Parameters Interceptor |
staticParams |
从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。 |
Roles Interceptor |
roles |
确定用户是否具有JAAS指定的Role,否则不予执行。 |
Timer Interceptor |
timer |
输出Action执行的时间 |
Token Interceptor |
token |
通过Token来避免双击 |
Token Session Interceptor |
tokenSession |
和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中 |
Validation Interceptor |
validation |
使用action-validation.xml文件中定义的内容校验提交的数据。 |
Workflow Interceptor |
workflow |
调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面 |
Parameter Filter Interceptor |
N/A |
从参数列表中删除不必要的参数 |
Profiling Interceptor |
profiling |
通过参数激活profile |