2012-02-03 2 views
1

Я пытаюсь создать страницу отслеживания времени, где я показываю название проекта, задачи и часы, выставленные на каждый день.Как использовать <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]).

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

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

Thanks Dave. Ты прав. Я ищу hours["100_t1:Mon"].

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

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

<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> 

Final Edit:

Следующая инструкция помогает мне избежать необходимости использовать S: набор тегов. Я должен был окружить hours[key + ':Mon'] в пределах %{}.

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

также это работает слишком

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

ответ

1

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

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

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

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

Кроме того, вы точно знаете, сколько дней в неделю, представите 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> 

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

+0

спасибо за предложение. Я редактировал свой вопрос, чтобы показать, что сейчас работает для меня. Я не очень хорошо разбираюсь в том, как я его реализовал.я думаю, что есть лучший способ конкретно приложить часы к задачам. Любопытно: что вы подразумеваете под «подрывными парадигмами ООП с помощью карт и ad-hoc отношений» – user1187958

+0

oh wait ... ваше предложение работает !! Я не использовал% {} в моем коде, когда я разместил этот вопрос. Благодаря!!! – user1187958

+0

@ user1187958 Задача - это класс, а не карта. Часы работы относятся непосредственно к задаче. Специальные строковые отношения не являются ООП. Java предоставляет механизмы (если подробно) для непосредственного связывания данных и операций; почему бы не использовать их? –

 Смежные вопросы

  • Нет связанных вопросов^_^