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 |
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之——table中巢狀input、select等
使用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支援string、vector、map等STL型別資料的檢視(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.x中ScrollView巢狀ListView,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
Android中scrollview巢狀webview後導致網頁載入成功但無法顯示
今天同事提出了一個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路由建立的是單頁面路由。 子路由其實和單路由意思是一樣的,單路由應該很好理解,因為我們都知道路由是可以一層一層巢狀的,你可以