0

我创建了自己的拦截器,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运行良好,但prepareAction 类中的方法没有被调用,因为我已经实现了Preparable接口。

如果我省略这一行:

<interceptor-ref name="myIntercept"/>

... 在 中, Action 类中struts.xml的方法运行良好。prepare

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

4

1 回答 1

1

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

<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 已经定义了 prepare 以及您可能想要使用的其他常见拦截器。在您的示例中,当您省略此行时

 <interceptor-ref name="myIntercept"/>

因为它在struts2 已经定义的defaultStack 中,所以调用了prepare 拦截器。

查看 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>
于 2013-10-14T01:15:38.937 回答