目录:
- 概述
- 实现方法及测试
[一]、概述
继前面一篇 springMVC 页面中多个对象的数据绑定 ,本文主要介绍如果实现复杂类型对象的数据绑定,比如前文中的父级对象CourseInfo 中增加:String[] times , List<Student> studentList 这两个复杂类型属性,页面中数据如何才能准确绑定到对象上呢?
[二]、实现方法及测试
CourseInfo.java 修改成如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package com.micmiu.demo.web.v2.demo.vo;
import java.util.List;
import org.apache.commons.lang3.builder.ToStringBuilder;
import com.micmiu.demo.web.v2.demo.entity.Course;
import com.micmiu.demo.web.v2.demo.entity.Student;
import com.micmiu.demo.web.v2.demo.entity.Teacher;
/**
* 课程信息(view层)
*
* @author <a href="http://www.micmiu.com">Michael Sun</a>
*/
public class CourseInfo {
// 课程介绍
private Course course;
// 老师信息
private Teacher teacher;
// 上课时间
private String[] times;
// 学生列表
private List<Student> studentList;
public Course getCourse() {
return course;
}
public Teacher getTeacher() {
return teacher;
}
public void setCourse(Course course) {
this.course = course;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String[] getTimes() {
return times;
}
public List<Student> getStudentList() {
return studentList;
}
public void setTimes(String[] times) {
this.times = times;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
|
Student.java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package com.micmiu.demo.web.v2.demo.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.apache.commons.lang3.builder.ToStringBuilder;
import com.micmiu.demo.web.v2.base.entity.IdEntity;
/**
* 学生信息
*
* @author <a href="http://www.micmiu.com">Michael Sun</a>
*/
@Entity
@Table(name = "T_DEMO_STUDENT")
public class Student extends IdEntity {
@Column(name = "NAME")
private String name;
@Column(name = "EMAIL")
private String email;
@Column(name = "CLASS_NAME")
private String className;
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public String getClassName() {
return className;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public void setClassName(String className) {
this.className = className;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
|
view 层页面修改成如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<form:form id="input-form" modelAttribute="courseInfo"
action="${ctx}/demo/course.do?method=save" method="post">
<input type="hidden" name="id" value="${course.id}" />
<fieldset class="prepend-top">
<legend>课程信息</legend>
<div id="messageBox" class="error-msg" style="display: none">输入有误,请先更正。</div>
<div>
<label for="course.name" class="field">课程名称:</label> <input
type="text" id="course.name" name="course.name" size="20"
value="${courseInfo.course.name}" class="required" />
</div>
<div>
<label for="course.description" class="field">课程介绍:</label> <input
type="text" id="course.description" name="course.description"
size="20" value="${courseInfo.course.description}" class="required" />
</div>
<div>
<label for="teacher.name" class="field">老师姓名:</label> <input
type="text" id="teacher.name" name="teacher.name" size="20"
value="${courseInfo.teacher.name}" class="required" />
</div>
<div>
<label for="teacher.email" class="field">老师Email:</label> <input
type="text" id="teacher.email" name="teacher.email" size="20"
value="${courseInfo.teacher.email}" class="required" />
</div>
<div>
<label for="times" class="field">上课时间:</label> <input type="text"
id="times[0]" name="times" size="20" value="周一" class="required" />
<input type="text" id="times[1]" name="times" size="20" value="周三"
class="required" /> <input type="text" id="times[2]" name="times"
size="20" value="周五" class="required" />
</div>
<div>
<label for="studentList[0].name" class="field">学生1姓名:</label> <input
type="text" id="studentList[0].name" name="studentList[0].name" size="20"
value="学生1姓名" class="required" />
</div>
<div>
<label for="studentList[0].email" class="field">学生1Email:</label> <input
type="text" id="studentList[0].email" name="studentList[0].email" size="20"
value="学生1Email" class="required" />
</div>
<div>
<label for="studentList[1].name" class="field">学生2姓名:</label> <input
type="text" id="studentList[1].name" name="studentList[1].name" size="20"
value="学生2姓名" class="required" />
</div>
<div>
<label for="studentList[1].email" class="field">学生2Email:</label> <input
type="text" id="studentList[0].email" name="studentList[1].email" size="20"
value="学生2Email" class="required" />
</div>
</fieldset>
|
注意:复杂对象在页面元素中各属性的定义规则。
controller 对应的 CourseAction.java 实现修改成如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@RequestMapping(params = { "method=save" })
@ResponseBody
public String save(Model model, ModelAndView mv, CourseInfo courseInfo,
RedirectAttributes redirectAttributes) {
System.out.println("course >> " + courseInfo.getCourse());
System.out.println("teacher >> " + courseInfo.getTeacher());
for (String time : courseInfo.getTimes()) {
System.out.println("time >> " + time);
}
for (Student student : courseInfo.getStudentList()) {
System.out.println("student >> " + student);
}
System.out.println("courseInfo >> " + courseInfo);
String message = "save";
redirectAttributes.addFlashAttribute("message", message);
return message;
}
|
controller中的部分方法省略,这里主要测试下页面数据绑定的结果,测试过程如下:
表单输入内容如下图:
提交后,控制台输出日志如下:
1
2
3
4
5
6
7
8
|
course >> com.micmiu.demo.web.v2.demo.entity.Course@e11326[name=课程名称,description=课程介绍,id=<null>]
teacher >> com.micmiu.demo.web.v2.demo.entity.Teacher@b03bd5[name=老师姓名,email=老师Email,grade=<null>,id=<null>]
time >> 周一
time >> 周三
time >> 周五
student >> com.micmiu.demo.web.v2.demo.entity.Student@13cd6aa[name=学生1姓名,email=学生1Email,className=<null>,id=<null>]
student >> com.micmiu.demo.web.v2.demo.entity.Student@13137a2[name=学生2姓名,email=学生2Email,className=<null>,id=<null>]
courseInfo >> com.micmiu.demo.web.v2.demo.vo.CourseInfo@ce4be6[course=com.micmiu.demo.web.v2.demo.entity.Course@e11326[name=课程名称,description=课程介绍,id=<null>],teacher=com.micmiu.demo.web.v2.demo.entity.Teacher@b03bd5[name=老师姓名,email=老师Email,grade=<null>,id=<null>],times={周一,周三,周五},studentList=[com.micmiu.demo.web.v2.demo.entity.Student@13cd6aa[name=学生1姓名,email=学生1Email,className=<null>,id=<null>], com.micmiu.demo.web.v2.demo.entity.Student@13137a2[name=学生2姓名,email=学生2Email,className=<null>,id=<null>]]]
|
从日志中可以看出:不管是string数组对象times 还是复杂列表对象 studentList,数据绑定准确无误。
本文介绍到此结束@Michael Sun.
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
本文链接地址: http://www.micmiu.com/j2ee/spring/springmvc-view-complex/
pring mvc 接收对象数组
开发中遇到这种需求,需要在后台接收一个对象数组进行添加。 比如添加明细信息。 请问在后台spring mvc 如何接收对象数组,前台通过ajax请求或者 easyUI的 form表单 提交数据都可以。
------解决方案--------------------------------------------------------
input中的name都相同,在后台,用
String[] names = request.getParameterValues("name");// 名称
String[] moneys = request.getParameterValues("money");// 密码
.....N行,N=对象中的属性的个数
然后写个for循环,按照其中一个数组来循环,
for (int i = 0; i < names.length; i++) {
先new对象,然后根据属性一次赋值,这些数组中的属性和前台的顺序是一致的
}
------解决方案--------------------------------------------------------
将数组包装一下
比如你要接收一个Bank类型的数组,那么先建一个类
class BankArray{
private Bank banks[] ;
public void setBanks(Bank[] banks) {
this.banks = banks;
}
public Bank[] getBanks() {
return banks;
}
}
//用 BankArray 作参数
@RequestMapping(value ="xxx" , method = RequestMethod.POST)
public ModelAndView doLogOut(BankArray param){ }
/* 页面用下面的方式 */
<input name="banks[0].name" value="name1" />
<input name="banks[0].address" value="address1" />
<input name="banks[1].name" value="name2" />
<input name="banks[1].address" value="address2" />
<input name="banks[2].name" value="name3" />
<input name="banks[2].address" value="address3" />
P2P项目中测试确实可以,备忘