问题描述
我有以下动作映射
<action name="theAction" ...> ... <param name="param1">one</param> <param name="param2">two</param> ... <param name="paramN">nth-number</param> ... </action>
我可以使用 Interceptor 中的以下行获取参数映射
I can get parameter map using following line in Interceptor
Map<String, Object> params = ActionContext.getContext().getParameters();
如上,有没有办法获取拦截器参数,如下映射中定义的那样.
Just as above, is there any way to get interceptor parameters as defined in following mapping.
<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>
动作参数的定义方式如下,动作参数和拦截器参数应该分开访问.
And action parameters are defined in following way, action parameters and interceptor parameters should be accessible separately.
<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>
请注意,我不想将拦截器中的参数字段声明为
Please note that I don't want to declare parameter fields in my interceptor as
//all fields with their getters and setters private String param1; private String param2; ... private String paramN;
<小时>
在 Dev Blanked 的回答之后,我实施了他的技术.它没有用,所以我在这里分享我的代码.我正在使用 Struts 2.3.1.2.
After Dev Blanked's asnwer, I implemented his technique. It did not work so I am sharing my code here. I am using 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://www.51sjk.com/Upload/Articles/1/0/333/333811_20221024092558717.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 ",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=%. ",configName, configValue); interceptorConfigs.put(configName, configValue); } }
控制台输出,当 theAction 被点击时.
Calling 'intercept' method.
推荐答案
在您的自定义拦截器中,您可以定义如下图
In your custom interceptor you can define a map like below
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); }
然后在您的动作映射中,您可以传入如下参数 .. 这些将存储在拦截器的映射中
Then in your action mappings you can pass in parameters like below .. these will be stored in the map of the interceptor
<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'时,拦截器内的映射将有,键/值对.
"yourInterceptor" refers to the name of the interceptor you have given when adding your interceptor to the struts.xml. When configured like above 'interceptorConfigs' map inside the interceptor will have , key/value pairs.
如果您想让这些对您的操作可用,您只需将地图设置为 ActionContext 中的上下文变量.然后可以在操作中检索它.
If you want to make these available to your action, you can just set the map as a context variable in the ActionContext. This can then be retrieved inside the action.