您的位置:首页 > 编程语言 > Java开发

重温struts2拦截器

2011-09-10 00:00 477 查看
1. 什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

2.
Struts2默认拦截器栈:

拦截器
名字
说明
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
3.
自定义拦截器的实现:

虽然,Struts 2为我们提供如此丰富的拦截器实现,但是在某种情况下并不能满足我们的需求,比如:访问控制的时候,在用户每次访问某个action时,我们要去校验用户是否已经登入,如果没有登入我们将在action执行之前就被拦截;此时我们就需要自定义拦截器;

3.1.实现拦截器类

所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。该接口提供了三

个方法:

1) void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。

2) void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。

3) String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,

因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。

3.2.注册自定义拦截器

自定义拦截器类实现了,现在就要在struts里注册这个拦截器;

3.2.1. 注册拦截器,在struts.xml中的package中注册拦截器

<interceptors>

<!-- name: 拦截器的名称,class:自定义拦截器的类 -->

<interceptor name="拦截器名称" class="自定义拦截器的class路径" />

</
interceptors
>

3.2.1. 使用拦截器,在需要使用自定义拦截器的action中定义如下代码

<
action
>
<interceptor-ref name="拦截器名称"/>

</action>

注意:

因为struts2的很多功能都是根据拦截器实现的;如果此处只使用自定义的拦截器时,将失去struts2的很多核心功能;所以需要定义一个拦截器栈(由一个或多个拦截器组成)

3.2.2. 拦截器栈

<interceptor-stack name="拦截器栈的名称">

<!-- 需要注意的是:系统默认的拦截器栈应要放在前面,在加入自定义拦截器; -->

<interceptor-ref name="defaultState" />

<interceptor-ref name="自定义拦截器的名称" />

</
interceptor-stack
>

3.2.3. 在action中使用栈

<
action
>
<interceptor-ref name="栈名称或拦截器名称"/>

。。。。。。

</action>

3.2.3. 如果此时需要所有的action都使用自定义拦截器时,此时就定义一个默认的拦截器

<default-interceptor-ref name="permissionStack"/>

注意:如果在某个action中又使用了另一个拦截器,此时默认的拦截器将失效,为了确保能够使用默认的拦截器,又需要添加其他拦截器时,可以在action中加上其他拦截器

3.2.3. 配置文件

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="my" extends="struts-default">

<interceptors>

<!-- 定义权限控制拦截器 -->

<interceptor name="permissions"

class="com.perm.interceptor.PermissionsInterceptor" />

<!-- 定义一个包含权限控制的拦截器栈 -->

<interceptor-stack name="c">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="permissions" />

</interceptor-stack>

</interceptors>

<!-- 定义默认拦截器 -->

<default-interceptor-ref name="permissionsStack" />

<!-- 定义全局处理结果 -->

<global-results>

<!-- 逻辑名为error的结果,映射到/message.jsp页面 -->

<result name="error">/message.jsp</result>

</global-results>

<action name="listall"

class="com.perm.action.UserAction"

method="listAllUser">

<result name="success">/listall.jsp</result>

</action>

</package>

</struts>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息