spring mvc 前台 list怎么封装多条前台数据实体

9151人阅读
一、前台传递不同类不同对象
1、属性名不同,可直接封装进controller方法的对象参数(经验证)
2、属性名有重复,可在重复的类中设置一个值类型,后台再去将值类型值赋值给实例变量(经验证)
二、同一类多个对象集合
方法1、Json方式
方法2、新建一个类,该类中属性为重复对象类的集合
方法3、多个对象在前台jsp的input控件中name值该是什么就是什么,直接采用form表单提交或ajax方式提交。后台controller方法参数中不要带这些name对应的参数,直接使用request.getParameterValues(&&);进行获取,获取到String数组后,遍历并封装进对象。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1156389次
积分:11257
积分:11257
排名:第967名
原创:124篇
转载:577篇
评论:97条
(1)(7)(71)(38)(24)(25)(19)(19)(11)(7)(1)(2)(10)(18)(21)(22)(80)(26)(28)(13)(16)(14)(42)(21)(7)(4)(18)(9)(12)(5)(12)(38)(4)(30)(28)61882人阅读
菜鸟学习SSH(26)
一、概述。
& & & &在很多企业的开法中常常用到SpringMVC+Spring+Hibernate(mybatis)这样的架构,SpringMVC相当于Struts是页面到Contorller直接的交互的框架也是界面把信息传输到Contorller层的一种架构,通过这个架构可以让我们把页面和Contorller层解耦,使得开发人员的分工更加明确。
二、代码演示。
1、首先配置SpringMVC环境。
1.1导入jar。
值得注意的是红色标记的commons-logging这个jar包一定得引入进去不然会报错。
1.2、xml配置文件。
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns=&http://xmlns.jcp.org/xml/ns/javaee& xsi:schemaLocation=&http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd& id=&WebApp_ID& version=&3.1&&
&servlet-name&springMVC&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&springMVC&/servlet-name&
&url-pattern&*.spring&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
springMVC-servlet.xml
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:p=&http://www.springframework.org/schema/p&
xmlns:context=&http://www.springframework.org/schema/context&
xsi:schemaLocation=&
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd&&
&context:component-scan base-package=&com.gaowei.controller& /&
2、前台界面代码。
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&Insert title here&/title&
&form action=&login.spring& method=&post&&
username:&input type=&text& name=&username&&
password:&input type=&text& name=&password&&
&input type=&submit& value=&登录&&
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&Insert title here&/title&
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&UTF-8&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&&
&title&Insert title here&/title&
OK! welcome:${username}
3、Contorller层接收前台的两种方式。
利用@RequestParam这个注解
package com.gaowei.
import org.springframework.stereotype.C
import org.springframework.ui.M
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestP
@Controller
public class Login {
@RequestMapping(&/login&)
public String login(@RequestParam(&username&) String username,
@RequestParam(&password&) String password,Model model){
if (username.equals(password))
model.addAttribute(&username&, username);
return &ok.jsp&;
return &no.jsp&;
package com.gaowei.
import org.springframework.stereotype.C
import org.springframework.ui.M
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestP
@Controller
public class Login {
@RequestMapping(&/login&)
public String login(String username,String password,Model model){
if (username.equals(password))
model.addAttribute(&username&, username);
return &ok.jsp&;
return &no.jsp&;
4、界面结果。
第一种传值方式:
第二种传值方式:
三、总结。
& & & &这里体现出了SpringMVC传值方式的多样性满足了开发人员的不同需求。第一种用来表单的提交。第二种用来界面间相互传值,也为了方便开发人员利用AJAX。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:434919次
积分:7837
积分:7837
排名:第1899名
原创:142篇
评论:1095条
阅读:18960
文章:26篇
阅读:168915
(1)(1)(1)(4)(4)(4)(4)(4)(5)(4)(4)(4)(4)(3)(4)(5)(4)(4)(4)(3)(3)(4)(6)(1)(4)(3)(3)(4)(2)(1)(1)(8)(12)(8)(1)(1)(6)(3)(4)[Spring MVC] - SpringMVC的各种参数绑定方式 - 横渡 - 博客园
一直以来,我都这样轻轻的走着......
posts - 253, comments - 288, trackbacks - 4, articles - 53
SpringMVC的各种参数绑定方式
1. 基本数据类型(以int为例,其他类似):Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
表单代码:
&form action="saysth.do" method="post"&
&input name="count" value="10" type="text"/&
表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者&"的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或&",所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。
2. 包装类型(以Integer为例,其他类似):Controller代码:
@RequestMapping("saysth.do")
public void test(Integer count) {
表单代码:
&form action="saysth.do" method="post"&
&input name="count" value="10" type="text"/&
和基本数据类型基本一样,不同之处在于,表单传递过来的数据可以为null或&",以上面代码为例,如果表单中num为&"或者表单中无num这个input,那么,Controller方法参数中的num值则为null。
3. 自定义对象类型:Model代码:
public class User {
private String firstN
private String lastN
public String getFirstName() {
return firstN
public void setFirstName(String firstName) {
this.firstName = firstN
public String getLastName() {
return lastN
public void setLastName(String lastName) {
this.lastName = lastN
Controller代码:
@RequestMapping("saysth.do")
public void test(User user) {
表单代码:
&form action="saysth.do" method="post"&
&input name="firstName" value="张" type="text"/&
&input name="lastName" value="三" type="text"/&
非常简单,只需将对象的属性名和input的name值一一匹配即可。
4. 自定义复合对象类型:Model代码:
public class ContactInfo {
public String getTel() {
public void setTel(String tel) {
this.tel =
public String getAddress() {
public void setAddress(String address) {
this.address =
public class User {
private String firstN
private String lastN
private ContactInfo contactI
public String getFirstName() {
return firstN
public void setFirstName(String firstName) {
this.firstName = firstN
public String getLastName() {
return lastN
public void setLastName(String lastName) {
this.lastName = lastN
public ContactInfo getContactInfo() {
return contactI
public void setContactInfo(ContactInfo contactInfo) {
this.contactInfo = contactI
Controller代码:
@RequestMapping("saysth.do")
public void test(User user) {
System.out.println(user.getFirstName());
System.out.println(user.getLastName());
System.out.println(user.getContactInfo().getTel());
System.out.println(user.getContactInfo().getAddress());
表单代码:
&form action="saysth.do" method="post"&
&input name="firstName" value="张" /&&br&
&input name="lastName" value="三" /&&br&
&input name="contactInfo.tel" value="" /&&br&
&input name="contactInfo.address" value="北京海淀" /&&br&
&input type="submit" value="Save" /&
User对象中有ContactInfo属性,Controller中的代码和第3点说的一致,但是,在表单代码中,需要使用&属性名(对象类型的属性).属性名&来命名input的name。
5. List绑定:List需要绑定在对象上,而不能直接写在Controller方法的参数中。Model代码:
public class User {
private String firstN
private String lastN
public String getFirstName() {
return firstN
public void setFirstName(String firstName) {
this.firstName = firstN
public String getLastName() {
return lastN
public void setLastName(String lastName) {
this.lastName = lastN
public class UserListForm {
private List&User&
public List&User& getUsers() {
public void setUsers(List&User& users) {
this.users =
Controller代码:
@RequestMapping("saysth.do")
public void test(UserListForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
表单代码:
&form action="saysth.do" method="post"&
&th&First Name&/th&
&th&Last Name&/th&
&td colspan="2"&&input type="submit" value="Save" /&&/td&
&td&&input name="users[0].firstName" value="aaa" /&&/td&
&td&&input name="users[0].lastName" value="bbb" /&&/td&
&td&&input name="users[1].firstName" value="ccc" /&&/td&
&td&&input name="users[1].lastName" value="ddd" /&&/td&
&td&&input name="users[2].firstName" value="eee" /&&/td&
&td&&input name="users[2].lastName" value="fff" /&&/td&
其实,这和第4点User对象中的contantInfo数据的绑定有点类似,但是这里的UserListForm对象里面的属性被定义成List,而不是普通自定义对象。所以,在表单中需要指定List的下标。值得一提的是,Spring会创建一个以最大下标值为size的List对象,所以,如果表单中有动态添加行、删除行的情况,就需要特别注意,譬如一个表格,用户在使用过程中经过多次删除行、增加行的操作之后,下标值就会与实际大小不一致,这时候,List中的对象,只有在表单中对应有下标的那些才会有值,否则会为null,看个例子:
表单代码:
&form action="saysth.do" method="post"&
&th&First Name&/th&
&th&Last Name&/th&
&td colspan="2"&&input type="submit" value="Save" /&&/td&
&td&&input name="users[0].firstName" value="aaa" /&&/td&
&td&&input name="users[0].lastName" value="bbb" /&&/td&
&td&&input name="users[1].firstName" value="ccc" /&&/td&
&td&&input name="users[1].lastName" value="ddd" /&&/td&
&td&&input name="users[20].firstName" value="eee" /&&/td&
&td&&input name="users[20].lastName" value="fff" /&&/td&
这个时候,Controller中的userForm.getUsers()获取到List的size为21,而且这21个User对象都不会为null,但是,第2到第19的User对象中的firstName和lastName都为null。打印结果:
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
6. Set绑定:Set和List类似,也需要绑定在对象上,而不能直接写在Controller方法的参数中。但是,绑定Set数据时,必须先在Set对象中add相应的数量的模型对象。Model代码:
public class User {
private String firstN
private String lastN
public String getFirstName() {
return firstN
public void setFirstName(String firstName) {
this.firstName = firstN
public String getLastName() {
return lastN
public void setLastName(String lastName) {
this.lastName = lastN
public class UserSetForm {
private Set&User& users = new HashSet&User&();
public UserSetForm() {
users.add(new User());
users.add(new User());
users.add(new User());
public Set&User& getUsers() {
public void setUsers(Set&User& users) {
this.users =
Controller代码:
@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
表单代码:
&form action="saysth.do" method="post"&
&th&First Name&/th&
&th&Last Name&/th&
&td colspan="2"&&input type="submit" value="Save" /&&/td&
&td&&input name="users[0].firstName" value="aaa" /&&/td&
&td&&input name="users[0].lastName" value="bbb" /&&/td&
&td&&input name="users[1].firstName" value="ccc" /&&/td&
&td&&input name="users[1].lastName" value="ddd" /&&/td&
&td&&input name="users[2].firstName" value="eee" /&&/td&
&td&&input name="users[2].lastName" value="fff" /&&/td&
基本和List绑定类似。需要特别提醒的是,如果最大下标值大于Set的size,则会抛出org.springframework.beans.InvalidPropertyException异常。所以,在使用时有些不便。
7. Map绑定:Map最为灵活,它也需要绑定在对象上,而不能直接写在Controller方法的参数中。Model代码:
public class User {
private String firstN
private String lastN
public String getFirstName() {
return firstN
public void setFirstName(String firstName) {
this.firstName = firstN
public String getLastName() {
return lastN
public void setLastName(String lastName) {
this.lastName = lastN
public class UserMapForm {
private Map&String, User&
public Map&String, User& getUsers() {
public void setUsers(Map&String, User& users) {
this.users =
Controller代码:
@RequestMapping("saysth.do")
public void test(UserMapForm userForm) {
for (Map.Entry&String, User& entry : userForm.getUsers().entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " +
entry.getValue().getLastName());
表单代码:
&form action="saysth.do" method="post"&
&th&First Name&/th&
&th&Last Name&/th&
&td colspan="2"&&input type="submit" value="Save" /&&/td&
&td&&input name="users['x'].firstName" value="aaa" /&&/td&
&td&&input name="users['x'].lastName" value="bbb" /&&/td&
&td&&input name="users['y'].firstName" value="ccc" /&&/td&
&td&&input name="users['y'].lastName" value="ddd" /&&/td&
&td&&input name="users['z'].firstName" value="eee" /&&/td&
&td&&input name="users['z'].lastName" value="fff" /&&/td&
打印结果:
x: aaa - bbb
y: ccc - ddd
z: eee - fff

我要回帖

更多关于 springmvc 前台传对象 的文章

 

随机推荐