加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在Struts 2中获取拦截器参数

发布时间:2020-12-14 19:36:03 所属栏目:Java 来源:网络整理
导读:我有以下动作映射 action name="theAction" ...... param name="param1"one/param param name="param2"two/param ... param name="paramN"nth-number/param.../action 我可以在Interceptor中使用以下行获取参数映射 MapString,Object params = ActionContext
我有以下动作映射
<action name="theAction" ...>
...
    <param name="param1">one</param>
    <param name="param2">two</param>
    ...
    <param name="paramN">nth-number</param>
...
</action>

我可以在Interceptor中使用以下行获取参数映射

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;

在Dev Blanked’s asnwer之后,我实施了他的技术.它没有用,所以我在这里分享我的代码.我正在使用Struts 2.3.1.2.

图书馆

> asm-3.3.jar
> asm-commons-3.3.jar
> asm-tree-3.3.jar
> commons-fileupload-1.2.2.jar
> commons-io-2.0.1.jar
> commons-lang-2.5.jar
> freemarker-2.3.18.jar
> javassist-3.11.0.GA.jar
> ognl-3.0.4.jar
> struts2-core-2.3.1.2.jar
> xwork-core-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=%sn",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);
    }

}

触发动作时的控制台输出.

Calling 'intercept' method.

解决方法

在您的自定义拦截器中,您可以定义如下所示的地图
private final Map<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中的上下文变量即可.然后可以在操作中检索它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读