struts2 18拦截器详解(十四)

作者:金牛区福生殡葬服务部 来源:www.cdfsbz.com 发布时间:2017-09-05 11:55:11
struts2 18拦截器详解(十四) StaticParametersInterceptor

该拦截器处于defaultStack第十三的位置,是用来把通过<param>标签配置在struts2配置文件中为Action配置的静态参数填装到Action中如果Action实现了Parameterizable接口,采集软件,还会把静态参数封装成一个Map直接传递给Action,这些静态参数还会添加到request参数Map中除非该拦截器的merge属性为false,该属性值默认是为true的。如下就是一段静态参数配置:

[html]

<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方法源码:

[java]

<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方法源码:

[java]

<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();调用下一个拦截器......

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:宜昌SEO http://yichang.4567w.com

  • 上一篇:肥猫科技手把手教你如何选择网站域名!
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 金牛区福生殡葬服务部 ALL RIGHTS RESERVED.
    购买cdfsbz.com友情链接、项目合作请联系客服QQ:2500-38-100 邮箱:2500-38-100#QQ.com(#换@)
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100