簡體   English   中英

Spring MVC將嵌套的Custom類型列表綁定到多個JSP表單

[英]Spring MVC binding a List of nested Custom types to multiple JSP forms

案例:我有一個組織對象。 它有一個Department Objects列表,每個Department都有一個Employee Objects列表。

在JSP中,我有一個復選框列表,它將一個復選框綁定到一個雇員對象(深層次的2個層次結構。即Organization-> Department-> Employee)。

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

如你看到的:

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

綁定很好。 提交表單后,在控制器中,我可以遍歷admin departmentList並查找創建的所有部門,並查找由於復選框選擇而創建的員工。

問題:(部門是使用空名稱和非null employeeList創建的。我找不到employeeList所屬部門的名稱:(那么如何傳遞一些部門名稱,以便將名稱注入部門(如正在創建)就像“.employeeList”被注入部門一樣。

細節:為您提供我的工作細節:

Organization類有兩個Departments列表。 Department類有一個Employees列表。 員工有姓名和小時工作。

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
}

部門列表來自API。 該部門的所有員工都來自另一個API。

我正在編寫一個客戶端,通過首先選擇他們感興趣的部門來創建“自定義組織”,然后對於所選的每個部門,用戶從與該部門相關的所有員工中選擇一部分員工。

所以我有3個JSP表單:

組織表單(organization.jsp):組織名稱的輸入字段和所有部門的復選框列表。 用戶可以為正在創建的新組織選擇一組部門。

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

部門表單(department.jsp):對於所選的每個部門,這將顯示要為部門選擇的員工的復選框列表。

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

員工表單(employee.jsp):對於在“部門表單”中選擇的每個員工,這將顯示員工姓名和輸入將分配給該員工的小時數的字段。

員工控制器(獲得null部門名稱的那個)

@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";
  }

已知:我理解為什么沒有注入department.name,但我不確定如何解決它。 如何將外部循環中的部門名稱注入到下面c:foreach中員工列表上運行的內部循環? 或者如何以某種方式將其綁定到每個員工。 我懷疑它在這里:

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>

我嘗試了隱藏的輸入來幫助創建命名部門,但它沒有幫助。

積分:

非常感謝您的合作:)

為簡單起見,假設員工的FirstName是唯一的。 而department.name也是獨一無二的。 謝謝。

新聞:哦,哇,聖潔的莫莉牛,我解決了它。

缺失部分:隱藏的輸入,告訴要創建的部門以及要注入的名稱。

<form:hidden path="adminDepartmentList[${statusDepartment.index}].name"  value="${department.name}" />

將部門名稱注入spring創建的每個部門。

整體解決方案: department.jsp

<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="statusDepartment" items="${organization.adminDepartmentList}">
                      ______Dept: <c:out value="${department.name}" /><br>
                      <div class="checkbox-list">
                            <form:hidden path="adminDepartmentList[${statusDepartment.index}].name"  value="${department.name}" />
                            <c:forEach var="employee" varStatus="statusEmployee" items="${department.employeeList}">
                                <form:checkbox path="adminDepartmentList[${statusDepartment.index}].employeeList" value="${employee.firstName}"/> <c:out value="${employee.firstName}" /><br>
                            </c:forEach>
                      </div>
                  </c:forEach>

                Employee Departments:<br>
                  <c:forEach var="department" varStatus="statusDepartment" items="${organization.employeeDepartmentList}">
                      ______Dept: <c:out value="${department.name}" /><br>
                      <div class="checkbox-list">
                            <form:hidden path="employeeDepartmentList[${statusDepartment.index}].name" value="${department.name}" />
                            <c:forEach var="employee" varStatus="statusEmployee" items="${department.employeeList}">
                                <form:checkbox path="employeeDepartmentList[${statusDepartment.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM