SpringMVC 復雜對象數據綁定


表單在 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 ,所以后端接收到綁定后的對象要注意移除那些空對象。如果前端能保證下標連續的話就最好了。

via:http://deadlion.cn/2016/05/14/SpringMVC-復雜對象數據綁定.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM