我创建了自己的拦截器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
的新手,但无法弄清楚这里有什么问题。
答案 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>