如何在struts2中为自定义拦截器添加excludeMethods参数列表

时间:2014-11-09 13:47:13

标签: java struts2

如何在excludeMethods文件中为我的自定义拦截器添加struts.xml参数列表。 workflowvalidation拦截器具有此参数,即excludeMethodsworkflow拦截器不会针对排除的方法触发,如下所述:

<action name="action" class="abc.ActionClass">
<interceptor-ref name="defaultStack">
<param name="workflow.excludeMethods">doSomething</param>
</interceptor-ref>
<result>Success.jsp</result>
</action> 

我知道。我想知道的是我如何为我的自定义拦截器做同样的事情。我试过但失败了。这是我的代码:

的index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:url action="go2"  method="forGo2" var="v_go2"/>
<a href="<s:property value='#v_go2'/>">HIT to check if excludeMethods parameter working or NOT.</a>
</body>
</html>

struts.xml中

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

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

<interceptors>

<interceptor name="cust_intrcptr" class="pack.MyInterceptor2">
<param name="excludeMethods">forGo2</param> <!-- parameter for excluded method -->
</interceptor>

<interceptor-stack name="mystack2">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="cust_intrcptr"/>
</interceptor-stack>

</interceptors>

<action name="go2" class="pack.GoAction" method="forGo2">
<interceptor-ref name="mystack2"/>
<result name="success">/welcome2.jsp</result>
</action>
</package>
</struts>   

自定义拦截

package pack;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor2 implements Interceptor{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void init() {
        // TODO Auto-generated method stub

    }

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        // TODO Auto-generated method stub
      System.out.println("#####Inside Interceptor#####");
      ai.invoke();
    }

}

行动类

package pack;

import com.opensymphony.xwork2.ActionSupport;

public class GoAction extends ActionSupport{
    public String forGo2(){
        return "success";
    }
}

生成的输出没有任何错误。但在控制台输出中,我正在查看&#34; #####Inside Interceptor#####&#34;我没想到的,因为我排除了forGo2方法的拦截器。在这种情况下,如何针对任何给定方法排除此拦截器,如forGo2

1 个答案:

答案 0 :(得分:2)

有一个特定的基类:MethodFilterInterceptor。来自文档:

  

一个抽象的拦截器,有选择地应用于   指定的包含/排除方法列表。

要使用,首先在你的拦截器中扩展它:

public class MyInterceptor2 extends MethodFilterInterceptor {

现在,不要覆盖intercept方法,而是覆盖doIntercept

@Override
public String doIntercept(ActionInvocation ai) throws Exception {
    // TODO Auto-generated method stub
  System.out.println("#####Inside Interceptor#####");
  ai.invoke();
}

基类将自动处理excludeMethods并根据需要调用doIntercept