如何使用<s:property>使用OGNL </s:property>访问地图

时间:2012-02-03 16:50:19

标签: struts2 ognl

我正在尝试构建一个时间跟踪页面,其中显示项目名称,任务以及每天计费的小时数。

这是我在Java方面的对象:

ProjectTO project1 = new ProjectTO();
project1.setProjectName("Project ABC");

TreeMap tasks = new TreeMap();
tasks.put("100_t1", "Requirement");
tasks.put("100_t2", "Development");         
project1.setTasks(tasks);       

TreeMap hours = new TreeMap();
hours.put("100_t1:Mon", "8");
hours.put("100_t1:Wed", "7");
project1.setHours(hours);

我需要查看此对象以在屏幕上显示值。以下是我在JSP页面上的内容:

<s:iterator value="activeProjects">
<tbody>                     
    <tr>
        <td><p><s:property value="projectName"/></p></td>                           
    </tr>           

<s:iterator value="tasks">
    <tr>
        <td><s:property value="value"/></td>
        <td><s:property value="hours[%{key+':Mon'}]"/></td>
        <td><s:property value="hours[%{key+':Tue'}]"/></td>         
        ..........
    </tr>                           
</s:iterator>
</tbody>
</s:iterator>   

问题在于弄清楚如何显示小时数。上面显示的代码段不起作用。我可以使用<s:set var="mon" value="%{key+':Mon'}">并在我的td标签中引用它来工作 - 小时[#mon])。

有更好的解决方案吗?

编辑:

谢谢戴夫。你是对的。我正在寻找hours["100_t1:Mon"]

当我在视图层中迭代对象时,需要根据我迭代的任务行的键动态插入'100_t1'。 '星期一','星期二'可以硬编码。

我将看看你是否可以按照建议在View层之外做得更好。截至目前,这是我为我工作的。

<s:iterator value="activeProjects">
<tbody>                     
    <tr>
        <td><p><s:property value="projectName"/></p></td>                           
    </tr>           

<s:iterator value="tasks">
             <s:set var="mon" value="%{key+':Mon'}"/> 
             <s:set var="tue" value="%{key+':Tue'}"/>
             <s:set var="wed" value="%{key+':Wed'}"/>
             <s:set var="thu" value="%{key+':Thu'}"/>
             <s:set var="fri" value="%{key+':Fri'}"/>
             <s:set var="sat" value="%{key+':Sat'}"/>
             <s:set var="sun" value="%{key+':Sun'}"/>
                    <tr>
                        <td><s:property value="value"/></td>
                        <td><s:property value="hours[#mon]"/></td>
                        <td><s:property value="hours[#tue]"/></td>
                        <td><s:property value="hours[#wed]"/></td>
                        <td><s:property value="hours[#thu]"/></td>
                        <td><s:property value="hours[#fri]"/></td>  
                        <td><s:property value="hours[#sat]"/></td>
                        <td><s:property value="hours[#sun]"/></td>                                          
                    </tr>                           
 </s:iterator>

</s:iterator>

最终编辑:

以下语句可帮助我避免使用s:set标记。我应该在hours[key + ':Mon']内包围%{}

value="%{hours[key + ':Mon']}"/>

这也是有效的

value="hours[key + ':Wed']"

1 个答案:

答案 0 :(得分:2)

您正在缩短您真正想要的OGNL评估。

您正在寻找的完整OGNL表达式实际上是hours["100_t1:Mon"]

<s:property value="%{hours[key + ':Mon']}"/>

(IMO)你应该更加具体地将时间安排在任务上;因为它是通过使用地图和临时关系颠覆OOP范式。

此外,您确切地知道一周内有多少天,向JSP提供每日小时列表。这避免了在视图层中进行测试更困难的工作。

如果您选择不遵循OOP / MVC规范,您可以消除这样的冗余:

<s:iterator value="{'Mon', 'Tue', ...etc...}" var="d">
  <s:set var="hrs" value="%{hours[key + ':' + #d]}"/>
  <td><s:property value="%{#hrs ? #hrs : 'N/A'}"/></td>
</s:iterator>

同样,我非常强烈地认为这是做这种工作的错误地方。