表單在 web 頁面上無處不在,有些表單可能很復雜,大部分表單里的輸入項都會對應后端對象屬性。
SpringMVC 可以自動將表單值綁定到對象上!而且能綁定很復雜的對象!!
這里就不寫那些基本的表單綁定了。
我想寫工作中遇到的一個情況,就是想轉換成一個 List 對象,並且這個對象里面有屬性也是 List 的。
public class ProjectDO{ //其他屬性就省略了 //團隊成員 private List<ProjectTeamInfoDO> teaminfoList; } public class ProjectTeamInfoDO { //學歷信息 private List<ProjectCollegeDO> college; } public class ProjectCollegeDO{ // 專業 private String major; // 學校 private String school; // 學位 private String diploma; }
解釋下意思,項目類里有個屬性存放團隊成員信息的,肯定有多個成員對吧,所以是 List 類型。每個團隊成員又有學歷信息,那學歷也有很多,本科、碩士、博士啊之類的,所以也是 List 類型的。
這個對像已經算是復雜了,那應該怎樣讓它自動綁定起來呢?
說難不難,說簡單也不簡單。
先說說為什么簡單,我們來看看怎么寫這個表單才能自動綁定上去。
<form action="/createdProject.htm" > //第一個團隊成員 ,第一個學歷 <input type="text" name="teaminfoList[0].college[0].major"> <input type="text" name="teaminfoList[0].college[0].school"> <input type="text" name="teaminfoList[0].college[0].diploma"> //第一個團隊成員 ,第二個學歷 <input type="text" name="teaminfoList[0].college[1].major"> <input type="text" name="teaminfoList[0].college[1].school"> <input type="text" name="teaminfoList[0].college[1].diploma"> //第二個團隊成員 ,第一個學歷 <input type="text" name="teaminfoList[1].college[0].major"> <input type="text" name="teaminfoList[1].college[0].school"> <input type="text" name="teaminfoList[1].college[0].diploma"> </form>
@RequestMapping("/createdProject.htm") public String createdProjects(ProjectDO Project){ //project 就是綁定后的對象 }
看,form 結構是不是很簡單,其實就是一個二維數組。name 值帶上對應的下標就行。
那又難在哪呢?
難在下標的生成,團隊成員人數是未知的,不知道這個數組應該有多長,所以下標都是后面用 js 動態生成的。
添加、刪除的時候下標都需要變動,還有編輯草稿加載之前緩存的信息下標也要變動。
有個問題需要注意的是綁定 List 類型的時候,會根據 input name 值下標來確定 List 長度。
比如
<input type="text" name="teaminfoList[2].college[0].major">
那 teaminfoList 的長度就是 3 了。前面兩個 0 和 1 都為 null。
中間或者前面空掉的數字都會是 null ,所以后端接收到綁定后的對象要注意移除那些空對象。如果前端能保證下標連續的話就最好了。