如何在 Struts 2 选项组中显示地图值(对象列表)的元素?

How do I show elements of a Map's value (List of Objects) in a Struts 2 optgroup?

已编辑:我尝试在另一个问题中提出这个问题,因为我觉得最初提出的问题已得到充分回答。我因为那样做而受到责备。所以我相应地编辑了这个问题。基本上,我不知道访问每个 Map 条目的 "value" 中的员工列表属性的正确语法。


我在会话变量中存储了一个 TreeMap。 TreeMap 的 "key" 包含一个字符串。 "value" 的包含一个对象列表。 TreeMap 填充在 Action class 中。示例 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 中,我想显示一个 select 框,其中每个 "key" 作为 optgroup 标签,每个 employeeId 和 employeeName 在 "value" 中Employee 对象列表分别作为选项值和显示。我尝试了下面的代码,但无济于事:

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

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

当我尝试上面的 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. 您混淆了 %{}##{} (three different things);
  2. 当你迭代一个集合时,当前对象被压入值栈,所以你不需要再提及集合。但是,您可以使用 var 关键字获取对当前对象的引用;
  3. 您误用了 IteratorStatus。

正确的代码比你想象的要简单:

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