首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

struts2 18拦截器详解(3)

2013-10-30 
struts2 18拦截器详解(三)AliasInterceptor该拦截器位于defaultStack第二的位置,其功能比较简单,主要就是

struts2 18拦截器详解(三)

AliasInterceptor

   该拦截器位于defaultStack第二的位置,其功能比较简单,主要就是为我们传递的请求参数取别名映射到多个命名的参数上,这样可以让多个Action以不同的参数名共享同一个请求参数,特别是在Result类型为chain的时候。下面举个例子讲一下如何配置这个拦截器:

@Override public String intercept(ActionInvocation invocation) throws Exception {        ActionConfig config = invocation.getProxy().getConfig();//获取Action配置        ActionContext ac = invocation.getInvocationContext();//获取ActionContext        Object action = invocation.getAction();//获取当前执行的Action        // get the action's parameters 获取Action的参数,注意这里的参数不是request请求参数而是        //在struts2配置文件中通过<param>节点配置的参数        final Map<String, String> parameters = config.getParams();//aliasesKey就是<param name="aliases">节点的name属性值        if (parameters.containsKey(aliasesKey)) {//如果配置了aliases            String aliasExpression = parameters.get(aliasesKey);//获取我们传递的表达式            ValueStack stack = ac.getValueStack();            Object obj = stack.findValue(aliasExpression);//去值栈中查找表达式代表的值            if (obj != null && obj instanceof Map) {                //get secure stack                ValueStack newStack = valueStackFactory.createValueStack(stack);                boolean clearableStack = newStack instanceof ClearableValueStack;                if (clearableStack) {                    //省略...                }                // override                Map aliases = (Map) obj;//强转为Map,因为返回的就是LinkedHashMap对象,用LinkedHashMap才能保证配置参数有序                for (Object o : aliases.entrySet()) {//迭代                    Map.Entry entry = (Map.Entry) o;                    String name = entry.getKey().toString();//原名,上面的例子中就是'un'                    String alias = (String) entry.getValue();//别名,上面的例子中就是'username'                    Object value = stack.findValue(name);//去值栈中查找,一般来说是找不到的                    if (null == value) {                        // workaround 获取request请求参数Map                        Map<String, Object> contextParameters = ActionContext.getContext().getParameters();                        if (null != contextParameters) {                            value = contextParameters.get(name);//把请求参数中相应的值获取出来,上面的例子中值就是'zhangsan'                        }                    }                    if (null != value) {                        try {                            newStack.setValue(alias, value);//把请求参数中相应的值获取来以别名为key再赋给值栈                        } catch (RuntimeException e) {                            if (devMode) {                                String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{                                        "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage()                                });                                LOG.error(developerNotification);                                if (action instanceof ValidationAware) {                                    ((ValidationAware) action).addActionMessage(developerNotification);                                }                            }                        }                    }                }//省略...            } else {                LOG.debug("invalid alias expression:" + aliasesKey);            }        }                return invocation.invoke();    }

   上面省略了一些无关紧要的代码。
   上面的代码注释应该解释得比较清楚了,大家可以看到从请求参数中获取值后,再以别名为key再赋给值栈,在上面的例子中key(别名)就是username,通过setValue(key,value)给值贱赋值的时候是从栈顶开始往下寻找一个有username属性的一个对象,然后把值赋给该对象再返回,而在值栈中栈顶对象就是当前执行的Action,所以就把该值就赋给了当前执行的Action。同样的道理,如果返回的Result类型为chain,这时这个链中的Action是共享同一个request对象的,如果在chain链中的Action也配置了相应的别名参数,也可以通过其别名接收请求参数了。

  当赋值完成后执行下一个拦截器,该拦截器执行完毕......

热点排行