struts2 18拦截器详解(十四) --- StaticParametersInterceptor

StaticParametersInterceptor

   该拦截器处于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>

下面是该拦截器的intercept方法源码:
<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>

   上面的源代码中省略了一些非重要代码,如果要查看完整源码请参看struts2自带源码。
   实际上该方法的逻辑还是比较简单的,就是把Action配置中的静态参数填装到Action中而已,这个是通过newStack.setValue(entry.getKey(), val);这句代码实现的,因为Action一般是处理ValueStack栈顶,如果Action中有参数接收的话就把参数值赋给了Action。
   如果该拦截器的merge(默认为true)属性为true,则还会把静态参数添加到ActionContext中,下面是addParametersToContext方法源码:
<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>

   通过上面的方法完成了将静态参数添加到ActionContext中,到这里该拦截器逻辑就讲解完毕了,最后调用invocation.invoke();调用下一个拦截器......

   该拦截器中还有一个名为retrieveParameters的方法,是功能是获取静态参数的,但是该方法却并没有在该类中使用,这应该是该拦截器作者遗忘了。


你可能感兴趣的:(struts2,Interceptor)