当前位置:编程学习 > JS >>

struts2 18易做图详解(三)

AliasInterceptor
   该易做图位于defaultStack第二的位置,其功能比较简单,主要就是为我们传递的请求参数取别名映射到多个命名的参数上,这样可以让多个Action以不同的参数名共享同一个请求参数,特别是在Result类型为chain的时候。下面举个例子讲一下如何配置这个易做图:
[html]  
<action name="alias" class="cn.itcast.action.AliasAction">  
    <param name="aliases">#{ 'un' : 'username' }</param>  
    <result name="success">/WEB-INF/page/message.jsp</result>  
</action>  
   在这个Action中传递了一个参数,名称为aliases,该名称是AliasInterceptor易做图中的默认值,如果不手动指定,名称必须为aliases。参数的值的形式必须是这样:
#{ 'key' : 'value' },其实这是一个OGNL表达式,不知大家是否还记得,OGNL可以使用表达式动态构造一个Map,其语法就是这样的,如果有多个键值对以逗号进行分隔,经过OGNL解析后这些参数就会在一个Map中。
对于上面的例子,我们给请求参数un取了一个别名为username,这样当我们在访问该Action的时候传递这样的个参数/alias.action?un=zhangsan,在AliasAction中用username也能对其进行接收,如果AliasAction返回的Result类型为chain的话,那么如果chain指向的Action别名配置为:<param name="aliases">#{ 'un' : 'name' }</param>的话,在chain指向的Action中就可以用name来对un进行接收。
   下面看一下AliasInterceptor的源码,这里列出其intercept方法,看其是如何实现该功能的:
[java] 
@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);  
                           
补充:Web开发 , Jsp ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,