四处拦截参数中的Struts 2(Getting Interceptor Parameters in

2019-09-02 05:37发布

我有以下动作映射

<action name="theAction" ...>
...
    <param name="param1">one</param>
    <param name="param2">two</param>
    ...
    <param name="paramN">nth-number</param>
...
</action>

我可以用下面一行在拦截器得到的参数图

Map<String, Object> params = ActionContext.getContext().getParameters();

如上只是, 有没有什么办法让在下面的映射定义拦截器的参数

<action name="theAction" ...>
...
    <interceptor-ref name="theInterceptor">
        <param name="param1">one</param>
        <param name="param2">two</param>
        ...
        <param name="paramN">nth-number</param>
    </interceptor-ref>
...
</action>

和行动参数在这样定义的,动作参数和拦截器参数应分别访问。

<action name="theAction" ...>
...
    <param name="param1">one</param>
    <param name="param2">two</param>
    ...
    <param name="paramN">nth-number</param>
    ....
    <interceptor-ref name="theInterceptor">
        <param name="param1">one</param>
        <param name="param2">two</param>
        ...
        <param name="paramN">nth-number</param>
    </interceptor-ref>
...
</action>

请注意,我不希望在我的拦截,以申报参数字段

//all fields with their getters and setters
private String param1;
private String param2;
...
private String paramN;

开发中空白的asnwer后,我实现了自己的技术。 它没有工作,所以我在这里分享我的代码。 我使用Struts 2.3.1.2。

图书馆

  • ASM-3.3.jar
  • ASM-的commons-3.3.jar
  • ASM-树3.3.jar
  • 公地文件上传-1.2.2.jar
  • 公地IO-2.0.1.jar
  • 公地郎2.5.jar
  • freemarker的-2.3.18.jar
  • Javassist进行-3.11.0.GA.jar
  • OGNL-3.0.4.jar
  • Struts2的核心 - 2.3.1.2.jar
  • XWork的核心,2.3.1.2.jar

在struts.xml

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

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

<struts>
    <constant name="struts.devMode" value="true" />

    <package name="the-base" namespace="/" extends="struts-default" abstract="true">

        <interceptors>
            <interceptor name="header" class="demo.interceptors.HttpHeaderInterceptor"></interceptor>

        <interceptor-stack name="theStack">
            <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="header"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="theStack"></default-interceptor-ref>

    </package>

    <package name="the-module" extends="the-base">
        <action name="theAction">
            <result>/the-action.jsp</result>
            <interceptor-ref name="theStack">
                <param name="header.Cache-control">no-store,no-cache</param>
                <param name="header.Pragma">no-cache</param>
                <param name="header.Expires">-1</param>
                <param name="header.arbitrary">true</param>
            </interceptor-ref>
        </action>
    </package>
</struts>

拦截器

package demo.interceptors;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.StrutsStatics;

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

public class HttpHeaderInterceptor extends AbstractInterceptor {

    private final Map<String, String> interceptorConfigs = new HashMap<String, String>();

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Calling 'intercept' method.");
        HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);

        for(Entry<String, String> entry: interceptorConfigs.entrySet()) {
            String header = entry.getKey();
            String value = entry.getValue();
            System.out.printf("Adding header: %s=%s\n",header,value);
            response.setHeader(header, value);
        }

        return invocation.invoke();
    }

    public Map<String, String> getInterceptorConfigs() {
        System.out.println("calling method 'getInterceptorConfigs'");
        return interceptorConfigs;
    }

    public void addInterceptorConfig(final String configName, final String configValue) {
        System.out.printf("Calling method 'addInterceptorConfig' with params configName = %s, configValue=%.\n",configName, configValue);
        interceptorConfigs.put(configName, configValue);
    }

}

控制台输出 theAction被击中。

Calling 'intercept' method. 

Answer 1:

在您的自定义拦截器,你可以定义地图像下面

private final Map<String, String> interceptorConfigs = new HashMap<String, String>();

public Map<String, String> getInterceptorConfigs() {
    return interceptorConfigs;
}


public void addInterceptorConfig(final String configName, final String configValue) {
    interceptorConfigs.put(configName, configValue);
}

然后在动作映射你可以传递参数如下图所示。这些将被存储在拦截器的地图

    <action name="yourAction" class="your.actionClass">
        <result name="success">some.jsp</result>
        <interceptor-ref name="defaultStack">
            <param name="yourInterceptor.interceptorConfigs.key">value</param>
            <param name="yourInterceptor.interceptorConfigs.aParamName">paramValue</param>            </interceptor-ref>
    </action>

“yourInterceptor”指的是你已经加入你的拦截到的struts.xml时给出的拦截器的名称。 当如上配置“interceptorConfigs”地图内的拦截器将有,键/值对。

如果你想使这些提供给你的行动,你可以将地图作为一个上下文变量ActionContext 。 然后可以行动中检索。



Answer 2:

要短,我会说没有 ,你不能拦截参数,如果你在定义他们interceptor-ref元素。 该参数的设置,并在构建时应用到拦截。 但是,如果你把参数的interceptor元素像

<interceptor name="theInterceptor" class="com.struts.interceptor.TheInterceptor">
  <param name="param1">one</param>
  <param name="param2">two</param>
</interceptor>

你可以检索它们在飞行

PackageConfig packageConfig = Dispatcher.getInstance().getConfigurationManager().getConfiguration().getPackageConfig("default");
Map<String, Object> interceptorConfigs = packageConfig.getInterceptorConfigs();
InterceptorConfig interceptorConfig =  (InterceptorConfig)interceptorConfigs.get("theInterceptor");
Map<String, String> params = interceptorConfig.getParams();  

如果你不想在拦截器来保存值,则OGNL将不设置值,但将尝试定义属性,所以我不看的理由不来定义这些属性,XML配置,如果你的拦截器标记为无效豆不包含这些属性和建设者可能是在这种情况下抛出异常。 所以,不定义PARAMS我不建议性质。



文章来源: Getting Interceptor Parameters in Struts 2