第九章
 
的工作原理如上图,每一个Action请求都包装在一系列的的内部。可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。
 
每一个Action既可以将操作转交给下面的,Action也可以直接退出操作返回客户既定的画面。
 
如何自定义一个?
自定义一个需要三步:
1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
2 l中注册上一步中定义的。
3 在需要使用的Action中引用上述定义的,为了方便也可将定义为默认的,这样在不加特殊声明的情况下所有的Action都被这个拦截。
 
Interceptor接口声明了三个方法:
 
public interface Interceptor extends Serializable {
 
    void destroy();
 
    void init();
 
    String intercept(ActionInvocation invocation) throws Exception;
}
 
Init方法在类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给类做必要的初始话操作。
 
Destroy方法在被垃圾回收之前调用,用来回收init方法初始化的资源。
 
Intercept是的主要拦截方法,如果需要调用后续的Action或者,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS
另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
public abstract class AbstractInterceptor implements Interceptor {
 
    public void init() {
    }
   
    public void destroy() {
    }
 
 
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}
在不需要编写initdestroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
 
我们尝试编写一个Session过滤用的,该查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:
public class CheckLoginInterceptor extends AbstractInterceptor {
    public static final String LOGIN_KEY = "LOGIN";
    public static final String LOGIN_PAGE = "global.login";
 
    public String intercept(ActionInvocation actionInvocation) throws Exception {
 
        System.out.println("begin check login interceptor!");
        // LoginAction不做该项拦截
        Object action = Action();
        if (action instanceof LoginAction) {
            System.out.println("exit check login, because this is login action.");
            return actionInvocation.invoke();
        }
 
        // 确认Session中是否存在LOGIN
        Map session = InvocationContext().getSession();
        String login = (String) (LOGIN_KEY);
        if (login != null && login.length() > 0) {
            // 存在的情况下进行后续操作。
            System.out.println("already login!");
            return actionInvocation.invoke();
        } else {
            // 否则终止后续操作,返回LOGIN
            System.out.println("no login, forward login page!");
            return LOGIN_PAGE;
        }
    }
}
 
注册
<interceptors>
            <interceptor
name="login" 
class="amware.util.CheckLoginInterceptor"/>
            <interceptor-stack name="teamwareStack">
                <interceptor-ref name="login"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
</interceptors>
 
将上述设定为默认:
<default-interceptor-ref name="teamwareStack"/>
这样在后续同一个package内部的所有Action执行之前都会被login拦截。
 
 
Struts2XWork)提供的的功能说明:
 
param name
名字
说明
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调用ActionsetModel方法将其放入Action内部。
Parameters Interceptor
params
将请求中的参数设置到Action中去。
Prepare Interceptor
prepare
如果Acton实现了Preparable,则该调用Action类的prepare方法。
Scope Interceptor
scope
Action状态存入sessionapplication的简单方法。
Servlet Config Interceptor
servletConfig
提供访问HttpServletRequestHttpServletResponse的方法,以Map的方式访问。
Static Parameters Interceptor
staticParams
l文件中将<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
使用l文件中定义的内容校验提交的数据。
Workflow Interceptor
workflow
调用Actionvalidate方法,一旦有错误返回,重新定位到INPUT画面
Parameter Filter Interceptor
N/A
从参数列表中删除不必要的参数
Profiling Interceptor
profiling
通过参数激活profile
 
注册并引用Interceptor
<package name="default" extends="struts-default">
  <interceptors>
      <interceptor name="timer" class=".."/>
      <interceptor name="logger" class=".."/>
  </interceptors>
 
  <action name="login" class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
        <result name="input">login.jsp</result>
        <result name="success"
            type="redirect-action">/secure/home</result>
  </action>
</package>
 
可以将多个合并在一起作为一个堆栈调用,当一个堆栈被附加到一个Action的时候,要想Action执行,必须执行堆栈中的每一个。
<package name="default" extends="struts-default">
  <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-stack name="myStack">
          <interceptor-ref name="timer"/>
          <interceptor-ref name="logger"/>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。