Spring MVC, la liaison d'une Liste d'imbrication des types Personnalisés à de multiples formes de JSP

Le Cas:
J'ai un Objet de l'Organisation. Il y a une liste de Département des Objets, et chaque Département a une liste d'Objets Employee.

En JSP, j'ai une liste de case à cocher qui se lie d'une case à cocher pour un objet employé (deep down 2 hiérarchies. C'est l'Organisation->Service->Employé).

<input type="checkbox" name="adminDepartmentList[${status.index}].employeeList" value="${employee.firstName}"> <c:out value="${employee.firstName}" /><br>

Comme vous pouvez le voir:

adminDepartmentList[0].employeeList --> John
adminDepartmentList[2].employeeList --> Rose

La liaison est bonne. Après que le formulaire est soumis, dans le contrôleur, je peux en boucle sur admin departmentList et trouver tous les ministères créé et trouver les employés qui ont été créés en raison de la case de sélection.

La Question 🙁 Les départements sont créés avec null noms et les non-null employeeList. Je ne trouve pas le nom de ministère de qui la employeeList appartient 🙁 Alors, comment puis-je passer un certain service de nom si le nom est injecté par le ministère (comme il est en cours de création), exactement comme la ".employeeList" est de se injectée dans le département.

Les Détails:
Pour vous donner les détails de mon travail:

Une Organisation de classe dispose de deux listes de Départements.
Un Service de classe a d'une liste d'Employés.
L'employé a les nom, prénom et hourToWork.

public class Organization{
  private long id;
  private String name;
  private List<Department> adminDepartmentList;   //n admin departments
  private List<Department> employeeDepartmentList //m employee departments
//default constructor and all getters and setters
}

public class Department{
  private long id;
  private String name;
  private List<Employee> employeeList; //k employees
  //default constructor and all getters and setters
}

public class Employee{
  private long id;
  private String firstName;
  private String lastName;
  private int hoursToWork;  //to be filled from Spring MVC form
  //default contructor and all getters and setters
}

La liste des Départements vient à partir d'une API. Et tous les Employés de ce département vient d'une autre API.

Je suis en train d'écrire un client qui permet aux utilisateurs de créer des "sur-mesure organisations", en sélectionnant d'abord les ministères qu'ils sont intéressés et ensuite, pour chaque service, qui a été sélectionnée, l'utilisateur sélectionne un sous-ensemble des salariés de tous les employés de ce département.

J'ai donc 3 formes de JSP:

L'organisation (une organisation.jsp): champ de saisie pour le nom de l'organisation et une case à cocher liste de tous les départements. L'utilisateur peut sélectionner un ensemble de Service pour la nouvelle organisation qui est en cours de création.

<form:form name='fs' action="department.htm"  method='POST' commandName="organization">
            Organization Name:
            <input type="text" name="name" >
            <!-- ============================================================== -->
            Departments:<br> Select admin-departments you want.
            <div class="checkbox-list">
            <%-- Size :<c:out value="${organization.adminDepartmentList.size}"/> --%>
                <c:forEach var="i" varStatus="status" items="${organization.adminDepartmentList}">
              <input type="checkbox" name="adminDepartmentList" value="${i.name}"> <c:out value="${i.name}" /><br>
                  </c:forEach>
            </div>
            <!-- ============================================================== -->
            Departments:<br> Select employee-departments you want.
            <div class="checkbox-list">
                <c:forEach var="i" varStatus="status" items="${organization.employeeDepartmentList}">            
                      <input type="checkbox" name="employeeDepartmentList" value="${i.name}"> <c:out value="${i.name}" /><br>
                  </c:forEach>
            </div>
            <button type="submit" class="btn btn-lg btn-primary btn-block">Next Step</button>
  </form:form>

Département de la forme (ministère.jsp): Pour chacun des départements qui ont été sélectionnés, ce spectacle d'une case à cocher liste des employés à être sélectionné pour le ministère.

<form:form name='f' action="employee.htm"  method='POST' commandName="organization">
            Organization Name: <c:out value="${organization.name}" /><br>
            Select Employees you want for your new Departments.
            Admin Departments:<br>
                <c:forEach var="department" varStatus="status" items="${organization.adminDepartmentList}">
                ______Dept: <c:out value="${department.name}" /><br>
                <div class="checkbox-list">
                    <c:forEach var="employee" varStatus="status" items="${department.employeeList}">
                          <input type="checkbox" name="adminDepartmentList[${status.index}].employeeList" value="${employee.firstName}"> <c:out value="${employee.firstName}" /><br>
                    </c:forEach>
                </div>
                </c:forEach>

              Employee Departments:<br>
                <c:forEach var="department" varStatus="status" items="${organization.employeeDepartmentList}">
                ______Dept: <c:out value="${department.name}" /><br>
                <div class="checkbox-list">
                    <c:forEach var="employee" varStatus="status" items="${department.employeeList}">
                          <input type="checkbox" name="employeeDepartmentList[${status.index}].employeeList" value="${employee.firstName}"> <c:out value="${employee.firstName}" /><br>
                    </c:forEach>
                </div>
                </c:forEach>  

                  <button type="submit" class="btn btn-lg btn-primary btn-block">Next Step</button>
  </form:form>

Formulaire des employés (employee.jsp): Pour chaque employé qui a été sélectionné dans le Département de la Forme, ce qui montre le nom de l'employé et un champ pour entrer les heures qui seront affectés à cet employé.

L'Employé Contrôleur (celui qui se null service de nom)

@RequestMapping(value = "/employee", method = RequestMethod.POST)
  public String product_post(@ModelAttribute("organization") Organization organization, HttpServletRequest request,
            HttpServletResponse response, BindingResult result, ModelMap model) {
      System.out.println("=========== POST Employee CONTROLLER===============");
      //STEP 1. show me which employees are selected for each admin department.
      List<Department> adminDepartments = organization.getAdminDepartmentList();

      for(Department dept: adminDepartments){
        System.out.println("Admin Dept name::: " + dept.getName());  //<-----------Name Comes as null :(
        List<Employee> employeeList = dept.getEmployeeList();
        for(Employee emp: employeeList){
          System.out.println("Employee::"+ emp.getFirstName());
        }
      }

      //STEP 2. show me which employees are selected for each employee department.
      List<Department> employeeDepartments = organization.getEmployeeDepartmentList();
      for(Department dept: employeeDepartments){
        System.out.println("Employee Dept name::: " + dept.getName()); //<----------Name Comes as null :(
        List<Employee> employeeList = dept.getEmployeeList();
        for(Employee emp: employeeList){
          System.out.println("Employee::"+ emp.getFirstName());
        }
      }
      model.addAttribute("organization", organization);
    return "employee";
  }

Connus:
Je comprends pourquoi département.le nom n'est pas injecté, mais je ne suis pas sûr de la façon de le résoudre. Comment puis-je injecter le nom du département à partir de l'extérieur de la boucle à l'intérieur de la boucle qui s'exécute sur la liste des employés dans le dessous de c:foreach? Ou comment en quelque sorte lier à chaque employé. Je suis soupçonner c'est par ici:

Admin Departments:<br>
                    <c:forEach var="department" varStatus="status" items="${organization.adminDepartmentList}">
                    ______Dept: <c:out value="${department.name}" /><br>
                    <div class="checkbox-list">
                        <c:forEach var="employee" varStatus="status" items="${department.employeeList}">
                              <input type="checkbox" name="adminDepartmentList[${status.index}].employeeList" value="${employee.firstName}"> <c:out value="${employee.firstName}" /><br>
                        </c:forEach>
                    </div>
                    </c:forEach>

J'ai essayé de caché d'entrée pour aider à créer nommé départements, mais il n'a pas aidé.

Les Crédits:

Merci beaucoup pour ur de la coopération 🙂

Pour des raisons de simplicité, supposons Prénom de l'employé est unique. Et de département.le nom est également unique.
Merci.

pouvez-vous nous montrer les jsp de la partie du code où vous avez votre departmentList case définie?
merci pour le contrôle de la question. J'ai editted la question de donner u contexte; ce que j'attends et ce que j'obtiens. J'ai aussi inclus l'organisation.jsp et du département.jsp.
Ce qui me frappe, c'est que vous utilisez le form:form tag, mais aucun des autres balises Printemps étiquette de bibliothèque. Voir docs.printemps.io/printemps/docs/3.2.x/printemps-cadre de la référence/... pour plus d'info.
Merci Bart grande part. J'ai changé les cases à cocher pour cela: .... <form:case path="employeeDepartmentList[${status.index}].employeeList" value="${employé.firstName}"/> <c:out value="${employé.firstName}" /><br> .... mais il a le même problème. Ma compréhension est le printemps formes finalement changer de formulaires html. Toute autre suggestion?

OriginalL'auteur Rose | 2013-11-08