1

プロジェクト名、タスク、および毎日の請求時間を表示する時間追跡ページを作成しようとしています。

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

1 に答える 1

3

実際に必要なOGNL評価を短絡しています。

あなたが探している完全な OGNL 式は、実際には次のhours["100_t1:Mon"]とおりです。

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

(IMO)より具体的に時間をタスクに添付する必要があります。そのままでは、マップとアドホックな関係を使用して、OOP パラダイムを覆すようなものです。

また、1 週間に何日あるかを正確に把握し、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>

繰り返しますが、この種の仕事をするのにここは間違った場所だと強く感じています。

于 2012-02-03T18:38:34.123 に答える