2016-09-21 1 views
1

EDITED: J'ai essayé de poser cette question dans une autre question, car je sentais que la question initialement posée était suffisamment répondue. J'ai été réprimandé pour cela. J'ai donc modifié cette question en conséquence. Fondamentalement, je ne connais pas la bonne syntaxe pour accéder aux propriétés de la liste des employés qui sont dans la "valeur" de chaque entrée de la carte.Comment afficher les éléments de la valeur d'une carte (liste d'objets) dans un optgroup Struts 2?


J'ai une TreeMap stockée dans une variable de session. La "clé" de TreeMap contient une chaîne. La "valeur" de la détient une liste d'objets. TreeMap est rempli dans la classe Action. Un échantillon TreeMap pourrait ressembler à ceci:

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

Dans la JSP, je veux montrer une boîte de sélection avec chaque « clé » comme une étiquette optgroup, et chaque employeeId et employeeName dans la liste de « valeur » de Les objets employés sont la valeur et l'affichage de l'option, respectivement. J'ai essayé le code ci-dessous, en vain:

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

Ainsi, la boîte de sélection devrait ressembler à quelque chose comme ça, moins les points de balle bien sûr:

  • A
    • John Doe
    • Jane Doe
  • B
    • 1er employeeName de employeeList2
    • 2 employeeName de employeeList2
    • employeeName Xème employeeList2
  • C
    • 1er employeeName de employeeList3
    • 2 employeeName de employeeList3
    • de employeeName Xème employeeList3

lorsque je tente le code JSP ci-dessus, le code HTML suivant est généré:

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

J'ai vérifié que la carte est remplie exactement comme je le souhaite. Donc, il se rend à la JSP avec les bonnes données.

+0

Je ne sais pas ce que les autres ne, je ne l'ai pas downvoted votre autre question, vient de commenter, et le sens était : si vous avez utilisé une mauvaise syntaxe ici et que vous avez la bonne syntaxe, lorsque vous posez une deuxième question, utilisez la bonne syntaxe de cette réponse, et non la mauvaise syntaxe de cette question. –

+1

@AndreaLigios Je voulais terminer mes tests en premier ... et je l'ai fait. Merci beaucoup! :) – CoachJon

Répondre

1
  1. Vous confondez %{} avec # et #{} (three different things);
  2. Lorsque vous effectuez une itération d'une collection, l'objet actuel est placé dans la pile de valeurs, vous n'avez donc plus besoin de mentionner la collection. Vous pouvez cependant obtenir une référence à l'objet actuel en utilisant le mot-clé var;
  3. Vous utilisez abusivement l'état Iterator.

Le code est plus facile que vous pensez:

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