1. 程式人生 > >springMVC中複雜巢狀物件、List等集合型別資料繫結

springMVC中複雜巢狀物件、List等集合型別資料繫結

[一]、概述

繼前面一篇 springMVC 頁面中多個物件的資料繫結 ,本文主要介紹如果實現複雜型別物件的資料繫結,比如前文中的父級物件CourseInfo 中增加:String[] times , List<Student> studentList 這兩個複雜型別屬性,頁面中資料如何才能準確繫結到物件上呢?

[二]、實現方法及測試

CourseInfo.java 修改成如下:

檢視原始碼 列印幫助
1 package com.micmiu.demo.web.v2.demo.vo;
2
3 import java.util.List;
4
5
import org.apache.commons.lang3.builder.ToStringBuilder;
6
7 import com.micmiu.demo.web.v2.demo.entity.Course;
8 import com.micmiu.demo.web.v2.demo.entity.Student;
9 import com.micmiu.demo.web.v2.demo.entity.Teacher;
10
11 /**
12 * 課程資訊(view層)
13 *
14 * @author <a href="http://www.micmiu.com
">Michael Sun</a>
15 */
16 public class CourseInfo {
17
18 // 課程介紹
19 private Course course;
20
21 // 老師資訊
22 private Teacher teacher;
23
24 // 上課時間
25 private String[] times;
26
27 // 學生列表
28 private List<Student> studentList;
29
30 public Course getCourse() {
31 return course;
32 }
33
34 public Teacher getTeacher() {
35 return teacher;
36 }
37
38 public void setCourse(Course course) {
39 this.course = course;
40 }
41
42 public void setTeacher(Teacher teacher) {
43 this.teacher = teacher;
44 }
45
46 public String[] getTimes() {
47 return times;
48 }
49
50 public List<Student> getStudentList() {
51 return studentList;
52 }
53
54 public void setTimes(String[] times) {
55 this.times = times;
56 }
57
58 public void setStudentList(List<Student> studentList) {
59 this.studentList = studentList;
60 }
61
62 @Override
63 public String toString() {
64 return ToStringBuilder.reflectionToString(this);
65 }
66 }

Student.java :

檢視原始碼 列印幫助
1 package com.micmiu.demo.web.v2.demo.entity;
2
3 import javax.persistence.Column;
4 import javax.persistence.Entity;
5 import javax.persistence.Table;
6
7 import org.apache.commons.lang3.builder.ToStringBuilder;
8
9 import com.micmiu.demo.web.v2.base.entity.IdEntity;
10
11 /**
12 * 學生資訊
13 *
14 * @author <a href="http://www.micmiu.com">Michael Sun</a>
15 */
16 @Entity
17 @Table(name = "T_DEMO_STUDENT")
18 public class Student extends IdEntity {
19
20 @Column(name = "NAME")
21 private String name;
22
23 @Column(name = "EMAIL")
24 private String email;
25
26 @Column(name = "CLASS_NAME")
27 private String className;
28
29 public String getName() {
30 return name;
31 }
32
33 public String getEmail() {
34 return email;
35 }
36
37 public String getClassName() {
38 return className;
39 }
40
41 public void setName(String name) {
42 this.name = name;
43 }
44
45 public void setEmail(String email) {
46 this.email = email;
47 }
48
49 public void setClassName(String className) {
50 this.className = className;
51 }
52
53 @Override
54 public String toString() {
55 return ToStringBuilder.reflectionToString(this);
56 }
57 }

view 層頁面修改成如下:

檢視原始碼 列印幫助
1 <form:form id="input-form" modelAttribute="courseInfo"
2 action="${ctx}/demo/course.do?method=save" method="post">
3 <input type="hidden" name="id" value="${course.id}" />
4 <fieldset class="prepend-top">
5 <legend>課程資訊</legend>
6 <div id="messageBox" class="error-msg" style="display: none">輸入有誤,請先更正。</div>
7 <div>
8 <label for="course.name" class="field">課程名稱:</label> <input
9 type="text" id="course.name" name="course.name" size="20"
10 value="${courseInfo.course.name}" class="required" />
11 </div>
12 <div>
13 <label for="course.description" class="field">課程介紹:</label> <input
14 type="text" id="course.description" name="course.description"
15 size="20" value="${courseInfo.course.description}" class="required" />
16 </div>
17
18 <div>
19 <label for="teacher.name" class="field">老師姓名:</label> <input
20 type="text" id="teacher.name" name="teacher.name" size="20"
21 value="${courseInfo.teacher.name}" class="required" />
22 </div>
23 <div>
24 <label for="teacher.email" class="field">老師Email:</label> <input
25 type="text" id="teacher.email" name="teacher.email" size="20"
26 value="${courseInfo.teacher.email}" class="required" />
27 </div>
28 <div>
29 <label for="times" class="field">上課時間:</label> <input type="text"
30 id="times[0]" name="times" size="20" value="週一" class="required" />
31 <input type="text" id="times[1]" name="times" size="20" value="週三"
32 class="required" /> <input type="text" id="times[2]" name="times"
33 size="20" value="週五" class="required" />
34 </div>
35
36 <div>
37 <label for="studentList[0].name" class="field">學生1姓名:</label> <input
38 type="text" id="studentList[0].name" name="studentList[0].name" size="20"
39 value="學生1姓名" class="required" />
40 </div>
41 <div>
42 <label for="studentList[0].email" class="field">學生1Email:</label> <input
43 type="text" id="studentList[0].email" name="studentList[0].email" size="20"
44 value="學生1Email" class="required" />
45 </div>
46 <div>
47 <label for="studentList[1].name" class="field">學生2姓名:</label> <input
48 type="text" id="studentList[1].name" name="studentList[1].name" size="20"
49 value="學生2姓名" class="required" />
50 </div>
51 <div>
52 <label for="studentList[1].email" class="field">學生2Email:</label> <input
53 type="text" id="studentList[0].email" name="studentList[1].email" size="20"
54 value="學生2Email" class="required" />
55 </div>
56 </fieldset>

注意:複雜物件在頁面元素中各屬性的定義規則

controller 對應的 CourseAction.java  實現修改成如下:

檢視原始碼 列印幫助
1 @RequestMapping(params = { "method=save" })
2 @ResponseBody
3 public String save(Model model, ModelAndView mv, CourseInfo courseInfo,
4 RedirectAttributes redirectAttributes) {
5 System.out.println("course >> " + courseInfo.getCourse());
6 System.out.println("teacher >> " + courseInfo.getTeacher());
7
8 for (String time : courseInfo.getTimes()) {
9 System.out.println("time >> " + time);
10 }
11 for (Student student : courseInfo.getStudentList()) {
12 System.out.println("student >> " + student);
13 }
14
15 System.out.println("courseInfo >> " + courseInfo);
16 String message = "save";
17 redirectAttributes.addFlashAttribute("message", message);
18 return message;
19 }

controller中的部分方法省略,這裡主要測試下頁面資料繫結的結果,測試過程如下:

表單輸入內容如下圖:

提交後,控制檯輸出日誌如下:

course >> [email protected][name=課程名稱,description=課程介紹,id=<null>]
teacher >> [email protected][name=老師姓名,email=老師Email,grade=<null>,id=<null>]
time >> 週一
time >> 週三
time >> 週五
student >> [email protected][name=學生1姓名,email=學生1Email,className=<null>,id=<null>]
student >> [email protected][name=學生2姓名,email=學生2Email,className=<null>,id=<null>]
courseInfo >> [email protected][[email protected][name=課程名稱,description=課程介紹,id=<null>],[email protected][name=老師姓名,email=老師Email,grade=<null>,id=<null>],times={週一,週三,週五},studentList=[[email protected][name=學生1姓名,email=學生1Email,className=<null>,id=<null>], [email protected][name=學生2姓名,email=學生2Email,className=<null>,id=<null>]]]

從日誌中可以看出:不管是string陣列物件times 還是複雜列表物件 studentList,資料綁定準確無誤。

相關推薦

springMVC複雜物件List集合型別資料

[一]、概述 繼前面一篇 springMVC 頁面中多個物件的資料繫結 ,本文主要介紹如果實現複雜型別物件的資料繫結,比如前文中的父級物件CourseInfo 中增加:String[] times , List<Student> studentList 這兩個複雜型別屬性,頁面中資料如何才能準

iview之——tableinputselect

使用iview在table中嵌入button是比較常見的需求,但是在table中嵌入input或者select你是否考慮過呢?本文用例項介紹input和select在table中的巢狀。 理解table如何巢狀input、select首先要理解vue的render函式可以參考:vue render函式介紹。當

Java內部類靜態內部類

在Java中我們在一個類的內部再定義一個類,如下所示:class OuterClass { ... class NestedClass { ... } }那麼在上面的例子中我們稱OuterClass為外圍類(enclosing clas

使gdb支援stringvectormapSTL型別資料的檢視(linux)

前提條件 (1)需要安裝python [danni@vm-xxx-18 develop]$ python --version Python 2.6.6 (2)需要有gcc [[email protected]18 develop]$ gcc --version

Vue元件利用.sync修飾符實現對prop進行雙向資料

在有些情況下,我們可能需要對一個 prop 進行“雙向繫結”。不幸的是,真正的雙向繫結會帶來維護上的問題,因為子元件可以修改父元件,且在父元件和子元件都沒有明顯的改動來源。 所以官方推薦以update:my-prop-name 的模式觸發事件取而代之 為了好理解,我寫了一

Sass---結合線上編譯詳解選擇器屬性偽類

推薦部落格:https://blog.hypers.io/2017/08/06/sass%20&%20compass%20%E6%95%99%E7%A8%8B%20--%20%E8%AF%AD%E6%B3%95%E7%AF%87(%E4%B8%80)/?utm_source=tuicool&

陣列物件,根據物件的某個字對物件進行去重

// 陣列中巢狀物件,根據物件的某個欄位進行物件去重 function uniqObj(data, name) { var dataArr = []; var dataObj = {}; for (var i = 0; i < data.length; i+

fastjson-1.2.21 使用例項,複雜Java物件轉json物件複雜json物件轉對應Java物件的程式碼實現

理論我就不多廢話了,直接看程式碼吧。使用的是fastjson-1.2.21版本的來實現下面程式碼的。 主要是實現複雜的巢狀的Java物件,也就是物件巢狀物件的複雜物件,轉換成json字串。然後就是反過來,把複雜的json字串轉換成對應的巢狀的Java物件。 先上工具類。如下

Ruby物件(Nested Object)的to_json方法,不使用Rails(Without Rails)

JSON由於其資料結構簡單便利,已逐漸成為了網際網路上的主流資料交換的資料格式。 JSON也支援ruby語言,參考其專案主頁 JSON implementation for Ruby 在討論巢狀物件(Nested Object)的JSON轉換方法之前,我們先看簡單的ruby JSON轉換。 首先,

ElasticSearch學習筆記之九 複雜資料型別物件

複雜資料型別 除了前面說到的簡單資料型別,Elasticsearch還支援JSON 的null ,陣列,和物件. 空域 欄位取值可以為空,當然,陣列也可以為空。 然而,在 Lucene 中是不能儲存 null 值的,所以我們認為存在 null 值的域為空域。

Android4.xScrollViewListView,ListView不能完全顯示總結解決辦法

當ScrollView巢狀ListView時,使用listview設定setAdpter後,需要重新設定listview控制元件的寬高。在網上嘗試了一些方法,重新設定高度之後,仍然不能完全顯示,經過除錯,使用下面的方法,可以使ListView完全顯示。在setAdapter

Android Fragment Fragment使用存在的bug附完美解決方案

原文地址:https://blog.csdn.net/u014365133/article/details/73176068 自從Android3.0引入了Fragment之後,使用Activity去巢狀一些Fragment的做法也變得更加流行,這確實是Fra

ASP NET MVC佈局頁

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

css 網頁如何style樣式?

Css 叫層疊樣式表,給html新增樣式 Html的type=”text/html”   網頁中如何巢狀style樣式? 1.        行間樣式將style當做屬性寫在標籤內。權重1000 2.行內樣式把s

Python函式以及函式的繼承

# a = 10 # b = 0 # c = 5 # try: # print("a的值是:%d,b的值是:%d"%(a,b)) # # f = c.open("a.txt") # print(f) # d = a / b # print("%d除以%d的值為

在Windows Server 2016 Hyper-V開啟虛擬化(NestedVM)

2016年   早期如果我們想做Hyper-V功能測試,例如Hyper-V Cluster或者Hyper-V Replica時至少使用兩臺物理機器實現,作為大眾屌絲沒那麼多錢購買機器怎麼辦?——巢狀虛擬化。巢狀虛擬化,顧名思義,即在虛擬機器中執行虛擬機器。該技術最早出現在VMwar

Androidscrollviewwebview後導致網頁載入成功但無法顯示

                   今天同事提出了一個bug,關於h5頁面無法顯示為空白頁,因為這塊的程式碼不是我寫的,之前同事寫的,所以我就看了一下程式碼,初看沒什麼問題,因為感覺這沒什麼難度,就

Python物件轉json【包括物件轉json,django的model轉json】

背景: 給app寫介面時經常會遇到將一個model轉為json返回。 問題: 網上也有類似方法,只是搜尋結果多少有些問題,總是搜了好一會兒才找到合適的方法,另外,網上更多集中的只是簡單些的物件,對於複雜的物件,還是不容易找到好的方式。 方案(python3.6): 1

python函式呼叫順序高階函式函式閉包詳解

  一:函式呼叫順序:其他高階語言類似,Python 不允許在函式未宣告之前,對其進行引用或者呼叫錯誤示範: def foo(): print 'in the foo' bar() foo() 報錯: in the foo Traceback (most re

VUE學習筆記(三)-子路由多路由路由動態路由都是什麼鬼?

最近學習到VUE路由這塊,發現這塊知識點有點多,好容易混亂,我的學習習慣就是先要建立框架,然後再去挨個學習搞懂,所以先來把概念搞搞清楚再說。 首先,我們要知道VUE路由建立的是單頁面路由。 子路由其實和單路由意思是一樣的,單路由應該很好理解,因為我們都知道路由是可以一層一層巢狀的,你可以