如何在Struts 2 optgroup中显示Map的值(对象列表)元素?

时间:2016-09-21 00:29:20

标签: java jsp struts2 optgroup

编辑:我试着在另一个问题中提出这个问题,因为我觉得最初提出的问题得到了充分的回答。我因此而受到严厉批评。所以我已经相应地编辑了这个问题。基本上,我不知道正确的语法来访问每个Map条目的“值”中的Employees列表的属性。

我有一个存储在会话变量中的TreeMap。 TreeMap的“键”包含一个String。保存对象列表的“值”。 TreeMap填充在Action类中。示例TreeMap可能如下所示:

ArrayList<Employee> employeeList1 = new ArrayList<Employee>();
Employee myEmployee = new Employee();
myEmployee.setEmployeeId("123");
myEmployee.setEmployeeName("John Doe");
employeeList1.add(myEmployee);

myEmployee = new Employee();
myEmployee.setEmployeeId("456");
myEmployee.setEmployeeName("Jane Doe");
employeeList1.add(myEmployee);
...

TreeMap<String,Employee> availableSupervisorsMap = new TreeMap<String,Employee>();
availableSupervisorsMap.put("A", employeeList1);
availableSupervisorsMap.put("B", employeeList2);
availableSupervisorsMap.put("C", employeeList3);
session.setAttribute("availableSupervisorsMap", availableSupervisorsMap);

在JSP中,我想显示一个选择框,每个“key”作为optgroup标签,并且“value”的Employee对象列表中的每个employeeId和employeeName分别作为选项值和显示。我尝试了下面的代码,但无济于事:

<s:select name="availableIds" list="%{#session.availableSupervisorsMap}" multiple="true">
  <s:optgroup label="%{key}">
    <s:iterator value="%{value}">
        <option value="<s:property value="employeeId"/>">
            <s:property value="employeeName"/>
        </option>
     </s:iterator>
   </s:optgroup>
</s:select>

所以选择框应该看起来像这样,当然减去要点:

  • A
    • John Doe
    • Jane Doe

    • employeeList2的第一个employeeName
    • employeeList2的第2名员名
    • employeeList2的xth employeeName
  • C
    • employeeList3的第一个employeeName
    • employeeList3的第2名员名
    • employeeList3的xth employeeName

当我尝试上面的JSP代码时,会生成以下HTML:

<select name="availableIds" id="AssignmentSupervisors_availableIds" multiple="multiple">

<option value="A">[Employee:
=========================================================
 employeeName =            John Doe
 employeeId =              123
=========================================================
, Employee:
=========================================================
 employeeName =            Jane Doe
 employeeId =              456
]</option>

<optgroup 
>

我已经确认地图的填充方式完全符合我的预期。所以它正在使用正确的数据进入JSP。

1 个答案:

答案 0 :(得分:1)

  1. 您将%{}##{}three different things)混淆;
  2. 当您迭代集合时,当前对象将被推送到值堆栈,因此您不再需要提及该集合。但是,您可以使用var关键字
  3. 获取对当前对象的引用
  4. 你误用了IteratorStatus。
  5. 正确的代码比你想象的容易:

    <s:select name="availableIds" list="%{#session.availableSupervisorsMap}" multiple="true">
      <s:optgroup label="key">
        <s:iterator value="value" var="currentRow">
            <option value="%{#currentRow.employeeId}">
                <s:property value="%{#currentRow.employeeName}"/>
            </option>
         </s:iterator>
       </s:optgroup>
    </s:select>