2015-04-29 44 views
2

我試圖顯示全名,以及主管和經理的複選框。這兩個複選框會被檢查,如果這個人的值是真的。無法綁定彈簧窗體複選框

我想要做的是顯示具有複選框的完整名稱和主管和經理列的用戶,這些選中或未選中,並且當表單提交時,更改也被綁定。我試過模型屬性,但沒有任何運氣。

這是我到目前爲止。

控制器

@Controller 
@RequestMapping("/person.html") 
public class PersonsController { 

    @Autowired 
    private PersonService personService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String initForm(@ModelAttribute("personView")PersonView personView, BindingResult result, Model model) { 


     List<Person> persons= personService.getPersonList(); 

     PersonView personData = new PersonView(); 
     personView.setPersonList(persons); 


     model.addAttribute("personView", personData); 

     return "member"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String submitForm(Model model, PersonView personView, BindingResult result) { 
     System.out.println("Controller runs"); 
     model.addAttribute("persons", personView); 
     return "successMember"; 
    } 

} 

查看

public class PersonView { 

    private boolean isSupervisor; 
    private boolean isManager; 
    private List<Person> personList; 


    public boolean isSupervisor() { 
     return isSupervisor; 
    } 

    public void setSupervisor(boolean isSupervisor) { 
     this.isSupervisor = isSupervisor; 
    } 

    public boolean isManager() { 
     return isManager; 
    } 

    public void setManager(boolean isManager) { 
     this.isManager = isManager; 
    } 

    public List<Person> getPersonList() { 
     return personList; 
    } 

    public void setPersonList(List<Person> personList) { 
     this.personList = personList; 
    } 

} 

public class Person { 

    private String fullName; 
    private Boolean isSupervisor; 
    private Boolean isManager; 

public String getFullName() { 
    return fullName; 
} 

public void setFullName(String fullName) { 
    this.fullName = fullName; 
} 

public Boolean getIsSupervisor() { 
    return isSupervisor; 
} 

public void setIsSupervisor(Boolean isSupervisor) { 
    this.isSupervisor = isSupervisor; 
} 

public Boolean getIsManager() { 
    return isManager; 
} 

public void setIsManager(Boolean isManager) { 
    this.isManager = isManager; 
} 

} 

JSP

 <html> 
     <title>Persons Information</title> 
     </head> 

     <body> 

      <form:form method="POST" modelAttribute="personView"> 
       <table> 
        <tr> 
         <th>Full Name</th> 
         <th>Supervisor</th> 
         <th>Manager</th> 
        </tr> 

        <c:forEach var="person" items="${personView.personList}" 
         varStatus="row"> 
         <tr> 
          <td>{person.fullName}</td> 
          <td><form:checkbox path="isSupervisor" 
            value="${person.isSupervisor}" /></td> 
          <td><form:checkbox path="isManager" 
            value="${person.isManager}" /></td> 
         </tr> 
        </c:forEach> 


        <tr> 
         <td><input type="submit" name="submit" value="Submit"> 
         </td> 
        </tr> 
        <tr> 
       </table> 
      </form:form> 

     </body> 
     </html> 

任何建議

回答

1

這裏的問題是,你需要的參數綁定到相應的人在列表中。如果您按照原樣查看生成的HTML,則會看到複選框的名稱屬性與所有表單提交相同,即無法確定哪個參數適用於哪個Person。

至於如此,你需要保持包裝你不能綁定到一個原始清單:但它只是需要如下:

public class PersonView { 

    private List<Person> personList; 

    public List<Person> getPersonList() { 
     return personList; 
    } 

    public void setPersonList(List<Person> personList) { 
     this.personList = personList; 
    } 
} 

人用一些小的調整:

public class Person { 

    private String fullName; 
    private Boolean isSupervisor; 
    private Boolean isManager; 

    public String getFullName() { 
     return fullName; 
    } 

    public void setFullName(String fullName) { 
     this.fullName = fullName; 
    } 

    public Boolean isSupervisor() { 
     return isSupervisor; 
    } 

    public void setSupervisor(Boolean isSupervisor) { 
     this.isSupervisor = isSupervisor; 
    } 

    public Boolean isManager() { 
     return isManager; 
    } 

    public void setManager(Boolean isManager) { 
     this.isManager = isManager; 
    } 
} 

你JSP循環需要如下:

<c:forEach var="person" items="${personView.personList}" varStatus="row"> 
    <tr> 
     <td>{person.fullName}</td> 
     <td><form:checkbox path="personList[row.index].supervisor" 
       value="true" /></td> 
     <td><form:checkbox path="personList[row.index].manager" 
       value="true" /></td> 
    </tr> 
</c:forEach> 

您的控制器:

@Controller 
@RequestMapping("/person.html") 
public class PersonsController { 

    @Autowired 
    private PersonService personService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String initForm() { 
     return "member"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String submitForm(@ModelAttribute PersonView personView) { 
     model.addAttribute("persons", personView); 
     return "successMember"; 
    } 

    @ModelAttribute 
    public PersonView getPersonView(){ 
     List<Person> persons= personService.getPersonList(); 
     PersonView pv = new PersonView(); 
     pv.setPersonList(persons); 

     return pv; 
    } 
} 

**所有這些都取決於表單處理程序中列表的順序,與用於呈現表單並且沒有同時添加任何人的表單的順序相同。

+0

感謝您的回答。如何從控制器中的頁面獲取複選框的修改值? – jamesT

+0

查看更新。在您的POST處理程序中將PersonView指定爲ModelAttribute,Spring將自動綁定提交的值。我顯然沒有把所有這些端到端運行起來,所以任何問題都讓我知道。 –

+0

非常感謝。它正在工作。最後一個問題,如何才能更新修改後的值並檢查是否有修改,所以如果只是更新按鈕沒有任何修改就可以顯示錯誤信息。 – jamesT