iteye_2252 2009-01-03 23:42
浏览 224
已采纳

Struts2源码阅读疑问

有两个问题一直没有让我看明白,请帮忙解答一下:

1,ParametersInterceptor用来将request中的parameter设置到action中的属性中,应该有一个reflaction,但阅读源码setParameters怎么也没有看到将params设置到action中去的代码,请答惑

2,struts2中的标签没有找到有关跟template ftl对应的机制,比方:textTag没看到它是如何对应textTag.ftl的,因为以往开发标签直接在代码中输出html,我想struts2的标签应该是构造数据模型然后用模板输出html,但就找不到这一块的代码
问题补充
谢谢,确实是这样,哈哈,我看的不够深入呀

  • 写回答

3条回答 默认 最新

  • myoldmanb 2009-01-03 23:42
    关注

    [quote="zhongxuchen"]有两个问题一直没有让我看明白,请帮忙解答一下:
    1,ParametersInterceptor用来将request中的parameter设置到action中的属性中,应该有一个reflaction,但阅读源码setParameters怎么也没有看到将params设置到action中去的代码,请答惑
    2,struts2中的标签没有找到有关跟template ftl对应的机制,比方:textTag没看到它是如何对应textTag.ftl的,因为以往开发标签直接在代码中输出html,我想struts2的标签应该是构造数据模型然后用模板输出html,但就找不到这一块的代码[/quote]
    1.请参考如下代码和注释
    [code="java"]
    protected void setParameters(Object action, ValueStack stack, final Map parameters) {
    ParameterNameAware parameterNameAware = (action instanceof ParameterNameAware)
    ? (ParameterNameAware) action : null;

        Map params = null;
        if( ordered ) {
            params = new TreeMap(getOrderedComparator());
            params.putAll(parameters);
        } else {
            params = new TreeMap(parameters); 
        }
    
        for (Iterator iterator = params.entrySet().iterator(); iterator.hasNext();) {
            Map.Entry entry = (Map.Entry) iterator.next();
            String name = entry.getKey().toString();
    
            boolean acceptableName = acceptableName(name)
                    && (parameterNameAware == null
                    || parameterNameAware.acceptableParameterName(name));
    
            if (acceptableName) {
                Object value = entry.getValue();
                try {
                    stack.setValue(name, value);//这里通过ognl把parameter相应的值设置到action中(由于action对象是ognl value stack的compondroot所以对valuestack的默认操作都是针对action对象的属性.详细请阅读struts开发文档中和ognl相关的部分.
                } catch (RuntimeException e) {
                    if (devMode) {
                        String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{
                                e.getMessage()
                        });
                        LOG.error(developerNotification);
                        if (action instanceof ValidationAware) {
                            ((ValidationAware) action).addActionMessage(developerNotification);
                        }
                    } else {
                        LOG.error("ParametersInterceptor - [setParameters]: Unexpected Exception caught setting '"+name+"' on '"+action.getClass()+": " + e.getMessage());
                    }
                }
            }
        }
    }
    

    [/code]
    2.struts的tag分为ui tag和非ui tag两种类型
    ui tag默认都是通过freemarker的模板渲染的,
    但是非ui tag,例如楼主说的TextTag本身就是用于i18n做输出之的localization的所以直接输出值即可,更本不需要用template渲染.
    需要用到tag渲染的例如TextField这个tag.
    该tag对应于jsp标签库的类为TextFieldTag,对应于struts2内部实现Componet类为TextField
    TextField类中久定义了template的名称如下
    [code="java"]
    final public static String TEMPLATE = "text";
    [/code]
    然后再根据不同的theme定义去struts2中template包对应的theme目录底下寻找template文件
    例如如果theme是simple那么textfile tag对应的template为template/simple/text.ftl

    如有问题,继续讨论,谢谢..

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算