该拦截器处于defaultStack第十三的位置,是用来把通过<param>标签配置在struts2配置文件中为Action配置的静态参数填装到Action中如果Action实现了Parameterizable接口,还会把静态参数封装成一个Map直接传递给Action,这些静态参数还会添加到request参数Map中除非该拦截器的merge属性为false,该属性值默认是为true的。如下就是一段静态参数配置:
<action name="staticparams" class="com.xtayfjpk.action.StaticParametersAction"> <result>/WEB-INF/page/message.jsp</result> <param name="username">zhangjin</param> <param name="password">xtayfjpk</param> </action>
<span style="font-family:Courier New;font-size:14px;">@Override public String intercept(ActionInvocation invocation) throws Exception { ActionConfig config = invocation.getProxy().getConfig();//获取Action配置 Object action = invocation.getAction();//获取当前执行的Action final Map<String, String> parameters = config.getParams();//获取当前Action的静态参数Map,注意不是request请求参数Map //省略... // 如果Action实现了Parameterizable接口 if (action instanceof Parameterizable) { ((Parameterizable) action).setParams(parameters);//调用Action的setParams方法,直接设置到Action中 } //如果Action配置有静态参数 if (parameters != null) { ActionContext ac = ActionContext.getContext();//获取ActionContext对象 Map<String, Object> contextMap = ac.getContextMap();//获取ActionContext对象内部的context Map对象,即OgnlContext对象 try { //省略... final ValueStack stack = ac.getValueStack();//获取ValueStack //省略... for (Map.Entry<String, String> entry : parameters.entrySet()) {//迭代静态参数Map Object val = entry.getValue();//获取当前参数值 if (parse && val instanceof String) {//如果parse为true则要将参数值要作为一个表达式进行计算,parse默认为false val = TextParseUtil.translateVariables(val.toString(), stack);//将返回的值进行替换 } try {//将当前参数设置到值栈中 newStack.setValue(entry.getKey(), val); } catch (RuntimeException e) { //省略... } } //省略... if (merge)//是否需要合并,默认为true addParametersToContext(ac, parameters);//将静态参数添加到ActionContext中 } finally { //省略... } } return invocation.invoke();//调用下一个拦截器 }</span>
<span style="font-family:Courier New;font-size:14px;">protected void addParametersToContext(ActionContext ac, Map<String, ?> newParams) { Map<String, Object> previousParams = ac.getParameters();//获取请求参数 Map<String, Object> combinedParams; if ( overwrite ) {//是否需要对请求参数进行覆盖 if (previousParams != null) { combinedParams = new TreeMap<String, Object>(previousParams);//这里放的是previousParams请求参数 } else { combinedParams = new TreeMap<String, Object>(); } if ( newParams != null) { combinedParams.putAll(newParams);//再放静态参数,如果有key相同,则请求参数覆盖了静态参数,就相当于没有覆盖请求参数 } } else { if (newParams != null) { combinedParams = new TreeMap<String, Object>(newParams);//先存放静态参数 } else { combinedParams = new TreeMap<String, Object>(); } if ( previousParams != null) { combinedParams.putAll(previousParams);//再放请求参数,如果有key相同,则静态参数覆盖了请求参数 } } //将处理过后的参数设置到ActionContext中 ac.setParameters(combinedParams); }</span>