如何在我自己的自定义拦截器之后调用Preparable Interface的prepare方法

时间:2013-10-10 22:13:15

标签: struts2

我创建了自己的拦截器MyInterceptor,如下所示:

public class MyInterceptor extends MethodFilterInterceptor
{
String inv=null;    
@Override
    protected String doIntercept(ActionInvocation invocation)
    {
        System.out.println("MyInterceptor fired");
        try
        {
            inv=invocation.invoke();
        }
        catch (Exception e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    return inv;      
    }
}

我的动作类是:

public class MyStruts2Class extends ActionSupport implements Preparable
{
    @Override
    public void prepare()
    {
        System.out.println("HI Prepare");
    }
    public String execute()
    {
        System.out.println("Hi Execute");       
        return "success";
    }
}

...我的struts.xml就是这样:

<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myIntercept" class="org.sagar.intercetors.MyInterceptor"/> </interceptors>
<action name="defaultStrutsAction" class="org.sagar.struts.MyStruts2Class" method="execute">
<interceptor-ref name="myIntercept"/> <result name="success">success.jsp</result>
</action>
</struts>

我的问题是当我触发defaultStrutsAction类时,MyInterceptor运行正常,但是Action类中的prepare方法没有被调用,因为我已经实现了{{ 1}} interface。

如果我省略这一行:

Preparable

...在<interceptor-ref name="myIntercept"/> 中,Action类中的struts.xml方法运行正常。

我是prepare的新手,但无法弄清楚这里有什么问题。

1 个答案:

答案 0 :(得分:1)

您必须将准备拦截器添加到拦截器堆栈,以便在操作中调用prepare方法。你可以通过几种方式做到这一点,一种是定义动作本身以拥有准备拦截器。像这样。订单很重要。

<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myIntercept" class="org.sagar.intercetors.MyInterceptor"/>               </interceptors>
<action name="defaultStrutsAction" class="org.sagar.struts.MyStruts2Class" method="execute">
<interceptor-ref name="myIntercept"/> 
<interceptor-ref name="prepare"/>  
<result name="success">success.jsp</result>
</action>
</struts>

您还可以在拦截器标记中定义拦截器堆栈并使用default-interceptor-ref标记

<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myIntercept" class="org.sagar.intercetors.MyInterceptor"/>              
    <interceptor-stack name="myStack">
       <interceptor-ref name="myIntercept"/>
       <interceptor-ref name="prepare"/>
    </interceptor-stack>    
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="defaultStrutsAction" class="org.sagar.struts.MyStruts2Class" method="execute">
<result name="success">success.jsp</result>
</action>
</struts>

最后,我认为您的拦截器堆栈应该是什么样的,

<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myIntercept" class="org.sagar.intercetors.MyInterceptor"/>              
    <interceptor-stack name="myStack">
       <interceptor-ref name="myIntercept"/>
       <interceptor-ref name="defaultStack"/>
    </interceptor-stack>    
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="defaultStrutsAction" class="org.sagar.struts.MyStruts2Class" method="execute">
<result name="success">success.jsp</result>
</action>
</struts>

在这个例子中,我引用了defaultStack而不仅仅是prepare,因为defaultStack已经准备好了你可能想要使用的其他常见拦截器。 在你的例子中省略这一行

 <interceptor-ref name="myIntercept"/>

准备拦截器被调用,因为它位于struts2已经定义的defaultStack中。

看看Steven Benitez提供的链接中定义的堆栈。 在默认配置下。

http://struts.apache.org/release/2.3.x/docs/interceptors.html

希望有所帮助。

以下是我对您的评论的回复示例。

<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myIntercept" class="org.sagar.intercetors.MyInterceptor"/>               </interceptors>
<action name="defaultStrutsAction" class="org.sagar.struts.MyStruts2Class" method="execute">
<interceptor-ref name="myIntercept"/> 
<interceptor-ref name="defaultStack"/>  
<result name="success">success.jsp</result>
</action>
</struts>