Как я могу использовать ‹s:property› для доступа к карте с помощью 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 - hours[#mon]).

Есть ли лучшее решение?

Редактировать:

Спасибо, Дэйв. Ты прав. Я ищу hours["100_t1:Mon"].

Когда я перебираю объект в слое представления, «100_t1» нужно будет динамически вставлять на основе ключа строки задачи, которую я перебираю. «Пн», «Вт» могут быть жестко запрограммированы.

Я собираюсь посмотреть, смогу ли я сделать это лучше вне слоя просмотра, как вы рекомендовали. На данный момент это то, что у меня работает на меня.

<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']"

person user1187958    schedule 03.02.2012    source источник


Ответы (1)


Вы укорачиваете оценку OGNL, которую на самом деле хотите.

Полное выражение OGNL, которое вы ищете, на самом деле hours["100_t1:Mon"]:

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

(IMO) вы должны более конкретно привязывать часы к задаче; так как вы как бы подрываете парадигмы ООП, используя карты и специальные отношения.

Кроме того, если вы точно знаете, сколько дней в неделе, представьте JSP список часов в день. Это позволяет избежать работы на уровне представления, где тестирование более сложно.

Если вы решите не следовать нормам ООП/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>

Опять же, я довольно сильно чувствую, что это неподходящее место для такой работы.

person Dave Newton    schedule 03.02.2012
comment
спасибо за предложение. Я отредактировал свой вопрос, чтобы показать, что сейчас работает для меня. Я не совсем доволен тем, как я это реализовал. Я думаю, что есть лучший способ конкретно привязать часы к задачам. Любопытно - что вы подразумеваете под «подрывом парадигмы ООП с помощью карт и специальных отношений» - person user1187958; 03.02.2012
comment
о, подождите... ваше предложение ‹s:property value=%{hours[key + ':Mon']}/› работает!! Я не использовал %{} в своем коде, когда задавал этот вопрос. Спасибо!!! - person user1187958; 03.02.2012
comment
@user1187958 user1187958 Задача — это класс, а не карта. Часы задачи относятся непосредственно к задаче. Специальные отношения на основе строк не являются объектно-ориентированными. Java предоставляет механизмы (если подробно) для прямой связи данных и операций; почему бы не использовать их? - person Dave Newton; 03.02.2012