刚开始用spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用和测试,总结出以下几种情况,希望对刚接触spring mvc 的朋友有所帮助.

示例程序下载

查看spring源码可以看出spring支持转换的数据类型已经很多了.

org.springframework.beans.PropertyEditorRegistrySupport.java

  1. /**
  2. * Actually register the default editors for this registry instance.
  3. */
  4. private void doRegisterDefaultEditors() {
  5. this.defaultEditors = new HashMap<Class, PropertyEditor>(64);
  6. // Simple editors, without parameterization capabilities.
  7. // The JDK does not contain a default editor for any of these target types.
  8. this.defaultEditors.put(Charset.class, new CharsetEditor());
  9. this.defaultEditors.put(Class.class, new ClassEditor());
  10. this.defaultEditors.put(Class[].class, new ClassArrayEditor());
  11. this.defaultEditors.put(Currency.class, new CurrencyEditor());
  12. this.defaultEditors.put(File.class, new FileEditor());
  13. this.defaultEditors.put(InputStream.class, new InputStreamEditor());
  14. this.defaultEditors.put(Locale.class, new LocaleEditor());
  15. this.defaultEditors.put(Pattern.class, new PatternEditor());
  16. this.defaultEditors.put(Properties.class, new PropertiesEditor());
  17. this.defaultEditors.put(Resource[].class, new ResourceArrayPropertyEditor());
  18. this.defaultEditors.put(TimeZone.class, new TimeZoneEditor());
  19. this.defaultEditors.put(URI.class, new URIEditor());
  20. this.defaultEditors.put(URL.class, new URLEditor());
  21. // Default instances of collection editors.
  22. // Can be overridden by registering custom instances of those as custom editors.
  23. this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class));
  24. this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class));
  25. this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class));
  26. this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class));
  27. this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class));
  28. // Default editors for primitive arrays.
  29. this.defaultEditors.put(byte[].class, new ByteArrayPropertyEditor());
  30. this.defaultEditors.put(char[].class, new CharArrayPropertyEditor());
  31. // The JDK does not contain a default editor for char!
  32. this.defaultEditors.put(char.class, new CharacterEditor(false));
  33. this.defaultEditors.put(Character.class, new CharacterEditor(true));
  34. // Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor.
  35. this.defaultEditors.put(boolean.class, new CustomBooleanEditor(false));
  36. this.defaultEditors.put(Boolean.class, new CustomBooleanEditor(true));
  37. // The JDK does not contain default editors for number wrapper types!
  38. // Override JDK primitive number editors with our own CustomNumberEditor.
  39. this.defaultEditors.put(byte.class, new CustomNumberEditor(Byte.class, false));
  40. this.defaultEditors.put(Byte.class, new CustomNumberEditor(Byte.class, true));
  41. this.defaultEditors.put(short.class, new CustomNumberEditor(Short.class, false));
  42. this.defaultEditors.put(Short.class, new CustomNumberEditor(Short.class, true));
  43. this.defaultEditors.put(int.class, new CustomNumberEditor(Integer.class, false));
  44. this.defaultEditors.put(Integer.class, new CustomNumberEditor(Integer.class, true));
  45. this.defaultEditors.put(long.class, new CustomNumberEditor(Long.class, false));
  46. this.defaultEditors.put(Long.class, new CustomNumberEditor(Long.class, true));
  47. this.defaultEditors.put(float.class, new CustomNumberEditor(Float.class, false));
  48. this.defaultEditors.put(Float.class, new CustomNumberEditor(Float.class, true));
  49. this.defaultEditors.put(double.class, new CustomNumberEditor(Double.class, false));
  50. this.defaultEditors.put(Double.class, new CustomNumberEditor(Double.class, true));
  51. this.defaultEditors.put(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true));
  52. this.defaultEditors.put(BigInteger.class, new CustomNumberEditor(BigInteger.class, true));
  53. // Only register config value editors if explicitly requested.
  54. if (this.configValueEditorsActive) {
  55. StringArrayPropertyEditor sae = new StringArrayPropertyEditor();
  56. this.defaultEditors.put(String[].class, sae);
  57. this.defaultEditors.put(short[].class, sae);
  58. this.defaultEditors.put(int[].class, sae);
  59. this.defaultEditors.put(long[].class, sae);
  60. }
  61. }

/**
* Actually register the default editors for this registry instance.
*/
private void doRegisterDefaultEditors() {
this.defaultEditors = new HashMap<Class, PropertyEditor>(64);
// Simple editors, without parameterization capabilities.
// The JDK does not contain a default editor for any of these target types.
this.defaultEditors.put(Charset.class, new CharsetEditor());
this.defaultEditors.put(Class.class, new ClassEditor());
this.defaultEditors.put(Class[].class, new ClassArrayEditor());
this.defaultEditors.put(Currency.class, new CurrencyEditor());
this.defaultEditors.put(File.class, new FileEditor());
this.defaultEditors.put(InputStream.class, new InputStreamEditor());
this.defaultEditors.put(Locale.class, new LocaleEditor());
this.defaultEditors.put(Pattern.class, new PatternEditor());
this.defaultEditors.put(Properties.class, new PropertiesEditor());
this.defaultEditors.put(Resource[].class, new ResourceArrayPropertyEditor());
this.defaultEditors.put(TimeZone.class, new TimeZoneEditor());
this.defaultEditors.put(URI.class, new URIEditor());
this.defaultEditors.put(URL.class, new URLEditor());
// Default instances of collection editors.
// Can be overridden by registering custom instances of those as custom editors.
this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class));
this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class));
this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class));
this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class));
this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class));
// Default editors for primitive arrays.
this.defaultEditors.put(byte[].class, new ByteArrayPropertyEditor());
this.defaultEditors.put(char[].class, new CharArrayPropertyEditor());
// The JDK does not contain a default editor for char!
this.defaultEditors.put(char.class, new CharacterEditor(false));
this.defaultEditors.put(Character.class, new CharacterEditor(true));
// Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor.
this.defaultEditors.put(boolean.class, new CustomBooleanEditor(false));
this.defaultEditors.put(Boolean.class, new CustomBooleanEditor(true));
// The JDK does not contain default editors for number wrapper types!
// Override JDK primitive number editors with our own CustomNumberEditor.
this.defaultEditors.put(byte.class, new CustomNumberEditor(Byte.class, false));
this.defaultEditors.put(Byte.class, new CustomNumberEditor(Byte.class, true));
this.defaultEditors.put(short.class, new CustomNumberEditor(Short.class, false));
this.defaultEditors.put(Short.class, new CustomNumberEditor(Short.class, true));
this.defaultEditors.put(int.class, new CustomNumberEditor(Integer.class, false));
this.defaultEditors.put(Integer.class, new CustomNumberEditor(Integer.class, true));
this.defaultEditors.put(long.class, new CustomNumberEditor(Long.class, false));
this.defaultEditors.put(Long.class, new CustomNumberEditor(Long.class, true));
this.defaultEditors.put(float.class, new CustomNumberEditor(Float.class, false));
this.defaultEditors.put(Float.class, new CustomNumberEditor(Float.class, true));
this.defaultEditors.put(double.class, new CustomNumberEditor(Double.class, false));
this.defaultEditors.put(Double.class, new CustomNumberEditor(Double.class, true));
this.defaultEditors.put(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true));
this.defaultEditors.put(BigInteger.class, new CustomNumberEditor(BigInteger.class, true));
// Only register config value editors if explicitly requested.
if (this.configValueEditorsActive) {
StringArrayPropertyEditor sae = new StringArrayPropertyEditor();
this.defaultEditors.put(String[].class, sae);
this.defaultEditors.put(short[].class, sae);
this.defaultEditors.put(int[].class, sae);
this.defaultEditors.put(long[].class, sae);
}
}

1.基本数据类型

很简单,该怎么写就怎么写.

controller代码

  1. @RequestMapping
  2. public void test1(String name, Integer age, Double income, Boolean isMarried, String[] interests)
  3. {
  4. System.out.println("简单数据类型绑定=========");
  5. System.out.println("名字:" + name);
  6. System.out.println("年龄:" + age);
  7. System.out.println("收入:" + income);
  8. System.out.println("已结婚:" + isMarried);
  9. System.out.println("兴趣:");
  10. for (String interest : interests)
  11. {
  12. System.out.println(interest);
  13. }
  14. System.out.println("====================");
  15. }

@RequestMapping
public void test1(String name, Integer age, Double income, Boolean isMarried, String[] interests)
{
System.out.println("简单数据类型绑定=========");
System.out.println("名字:" + name);
System.out.println("年龄:" + age);
System.out.println("收入:" + income);
System.out.println("已结婚:" + isMarried);
System.out.println("兴趣:");
for (String interest : interests)
{
System.out.println(interest);
}
System.out.println("====================");
}

jsp代码

  1. <form action="test1.do" method="post">
  2. <div class="f_left">姓名:</div>
  3. <div class="f_left"><input name="name" value="张三"/></div>
  4. <div class="clear"></div>
  5. <div class="f_left">年龄:</div>
  6. <div class="f_left"><input name="age" value="20"/></div>
  7. <div class="clear"></div>
  8. <div class="f_left">收入:</div>
  9. <div class="f_left"><input name="income" value="100000"/></div>
  10. <div class="clear"></div>
  11. <div class="f_left">结婚:</div>
  12. <div class="f_left">
  13. <input type="radio" name="isMarried" value="true" checked="checked"/>是
  14. <input type="radio" name="isMarried" value="false"/>否</div>
  15. <div class="clear"></div>
  16. <div class="f_left">兴趣:</div>
  17. <div class="f_left">
  18. <input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
  19. <input type="checkbox" name="interests" value="书法" checked="checked"/>书法
  20. <input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
  21. </div>
  22. <div class="clear"></div>
  23. <div><input type="submit" value="提交表单"/></div>
  24. </form>

<form action="test1.do" method="post">
<div class="f_left">姓名:</div>
<div class="f_left"><input name="name" value="张三"/></div>
<div class="clear"></div>
<div class="f_left">年龄:</div>
<div class="f_left"><input name="age" value="20"/></div>
<div class="clear"></div>
<div class="f_left">收入:</div>
<div class="f_left"><input name="income" value="100000"/></div>
<div class="clear"></div>
<div class="f_left">结婚:</div>
<div class="f_left">
<input type="radio" name="isMarried" value="true" checked="checked"/>是
<input type="radio" name="isMarried" value="false"/>否</div>
<div class="clear"></div>
<div class="f_left">兴趣:</div>
<div class="f_left">
<input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
<input type="checkbox" name="interests" value="书法" checked="checked"/>书法
<input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>

2.简单对象类型

与基本类型相拟,只不过绑定到对象上更加简洁.(类拟struts的ActionForm)

controller代码

  1. @RequestMapping
  2. public void test2(User user)
  3. {
  4. System.out.println("简单对象类型绑定=========");
  5. System.out.println("名字:" + user.getName());
  6. System.out.println("年龄:" + user.getAge());
  7. System.out.println("收入:" + user.getIncome());
  8. System.out.println("已结婚:" + user.getIsMarried());
  9. System.out.println("========================");
  10. }

@RequestMapping
public void test2(User user)
{
System.out.println("简单对象类型绑定=========");
System.out.println("名字:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("收入:" + user.getIncome());
System.out.println("已结婚:" + user.getIsMarried());
System.out.println("========================");

user代码

  1. public class User {
  2. private String name;
  3. private Integer age;
  4. private Boolean isMarried;
  5. private Double income;
  6. private String[] interests;
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public Integer getAge() {
  14. return age;
  15. }
  16. public void setAge(Integer age) {
  17. this.age = age;
  18. }
  19. public Boolean getIsMarried() {
  20. return isMarried;
  21. }
  22. public void setIsMarried(Boolean isMarried) {
  23. this.isMarried = isMarried;
  24. }
  25. public Double getIncome() {
  26. return income;
  27. }
  28. public void setIncome(Double income) {
  29. this.income = income;
  30. }
  31. public String[] getInterests() {
  32. return interests;
  33. }
  34. public void setInterests(String[] interests) {
  35. this.interests = interests;
  36. }
  37. }

public class User {
private String name;
private Integer age;
private Boolean isMarried;
private Double income;
private String[] interests;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getIsMarried() {
return isMarried;
}
public void setIsMarried(Boolean isMarried) {
this.isMarried = isMarried;
}
public Double getIncome() {
return income;
}
public void setIncome(Double income) {
this.income = income;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
}

jsp代码

  1. <form action="test2.do" method="post">
  2. <div class="f_left">姓名:</div>
  3. <div class="f_left"><input name="name" value="lxf"/></div>
  4. <div class="clear"></div>
  5. <div class="f_left">年龄:</div>
  6. <div class="f_left"><input name="age" value="20"/></div>
  7. <div class="clear"></div>
  8. <div class="f_left">收入:</div>
  9. <div class="f_left"><input name="income" value="100000"/></div>
  10. <div class="clear"></div>
  11. <div class="f_left">结婚:</div>
  12. <div class="f_left">
  13. <input type="radio" name="isMarried" value="true" checked="checked"/>是
  14. <input type="radio" name="isMarried" value="false"/>否</div>
  15. <div class="clear"></div>
  16. <div class="f_left">兴趣:</div>
  17. <div class="f_left">
  18. <input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
  19. <input type="checkbox" name="interests" value="书法" checked="checked"/>书法
  20. <input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
  21. </div>
  22. <div class="clear"></div>
  23. <div><input type="submit" value="提交表单"/></div>
  24. </form>

<form action="test2.do" method="post">
<div class="f_left">姓名:</div>
<div class="f_left"><input name="name" value="lxf"/></div>
<div class="clear"></div>
<div class="f_left">年龄:</div>
<div class="f_left"><input name="age" value="20"/></div>
<div class="clear"></div>
<div class="f_left">收入:</div>
<div class="f_left"><input name="income" value="100000"/></div>
<div class="clear"></div>
<div class="f_left">结婚:</div>
<div class="f_left">
<input type="radio" name="isMarried" value="true" checked="checked"/>是
<input type="radio" name="isMarried" value="false"/>否</div>
<div class="clear"></div>
<div class="f_left">兴趣:</div>
<div class="f_left">
<input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
<input type="checkbox" name="interests" value="书法" checked="checked"/>书法
<input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form> 

3.List类型绑定

网上很多人都给不出答案,关键在于,List需要绑定在对象(ActionForm),直接写在request-mapping函数的参数是不行的,更重要的一点是要创建对象(ArrayList).

controller代码

  1. @RequestMapping
  2. public void test3(Club club)
  3. {
  4. System.out.println("list类型绑定=========");
  5. System.out.println("会员:");
  6. for (User user : club.getUsers())
  7. {
  8. System.out.println(user.getName());
  9. }
  10. System.out.println("========================");
  11. }

@RequestMapping
public void test3(Club club)
{
System.out.println("list类型绑定=========");
System.out.println("会员:");
for (User user : club.getUsers())
{
System.out.println(user.getName());
}
System.out.println("========================");
}

Club代码

  1. public class Club {
  2. private List<User> users = new ArrayList<User>();
  3. public List<User> getUsers() {
  4. return users;
  5. }
  6. public void setUsers(List<User> users) {
  7. this.users = users;
  8. }
  9. }

public class Club {
private List<User> users = new ArrayList<User>();

public List<User> getUsers() {
return users;
}

public void setUsers(List<User> users) {
this.users = users;
}
}

jsp代码

  1. <form action="test3.do" method="post">
  2. <div class="f_left">会员1号:</div>
  3. <div class="f_left">
  4. <input name="users[0].name" value="张三"/>
  5. </div>
  6. <div class="clear"></div>
  7. <div class="f_left">会员2号:</div>
  8. <div class="f_left">
  9. <input name="users[1].name" value="李四"/>
  10. </div>
  11. <div class="clear"></div>
  12. <div class="f_left">会员3号:</div>
  13. <div class="f_left">
  14. <input name="users[2].name" value="王五"/>
  15. </div>
  16. <div class="clear"></div>
  17. <div><input type="submit" value="提交表单"/></div>
  18. </form>

<form action="test3.do" method="post">
<div class="f_left">会员1号:</div>
<div class="f_left">
<input name="users[0].name" value="张三"/>
</div>
<div class="clear"></div>
<div class="f_left">会员2号:</div>
<div class="f_left">
<input name="users[1].name" value="李四"/>
</div>
<div class="clear"></div>
<div class="f_left">会员3号:</div>
<div class="f_left">
<input name="users[2].name" value="王五"/>
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>

4.Set类型绑定

与List类型相似,经测试表明,绑定Set数据时,必须先在Set对象中Add相应的数量的模型对象.

controller代码

  1. @RequestMapping
  2. public void test4(Club2 club)
  3. {
  4. System.out.println("set类型绑定=========");
  5. System.out.println("会员:");
  6. for (User user : club.getUsers())
  7. {
  8. System.out.println(user.getName());
  9. }
  10. System.out.println("========================");
  11. }

@RequestMapping
public void test4(Club2 club)
{
System.out.println("set类型绑定=========");
System.out.println("会员:");
for (User user : club.getUsers())
{
System.out.println(user.getName());
}
System.out.println("========================");
}
Club2代码

  1. public class Club2 {
  2. private Set<User> users = new LinkedHashSet<User>();
  3. public Club2() {
  4. users.add(new User());
  5. users.add(new User());
  6. users.add(new User());
  7. }
  8. public Set<User> getUsers() {
  9. return users;
  10. }
  11. public void setUsers(Set<User> users) {
  12. this.users = users;
  13. }
  14. }

public class Club2 {
private Set<User> users = new LinkedHashSet<User>();

public Club2() {
users.add(new User());
users.add(new User());
users.add(new User());
}

public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}

jsp代码

  1. <form action="test4.do" method="post">
  2. <div class="f_left">会员1号:</div>
  3. <div class="f_left">
  4. <input name="users[0].name" value="张三"/>
  5. </div>
  6. <div class="clear"></div>
  7. <div class="f_left">会员2号:</div>
  8. <div class="f_left">
  9. <input name="users[1].name" value="李四"/>
  10. </div>
  11. <div class="clear"></div>
  12. <div class="f_left">会员3号:</div>
  13. <div class="f_left">
  14. <input name="users[2].name" value="王五"/>
  15. </div>
  16. <div class="clear"></div>
  17. <div><input type="submit" value="提交表单"/></div>
  18. </form>

<form action="test4.do" method="post">
<div class="f_left">会员1号:</div>
<div class="f_left">
<input name="users[0].name" value="张三"/>
</div>
<div class="clear"></div>
<div class="f_left">会员2号:</div>
<div class="f_left">
<input name="users[1].name" value="李四"/>
</div>
<div class="clear"></div>
<div class="f_left">会员3号:</div>
<div class="f_left">
<input name="users[2].name" value="王五"/>
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form> 

5.Map类型绑定

最灵活的一种方式,可无限绑定未定义的参数,注意必须绑定在对象下(ActionForm).

controller代码

  1. @RequestMapping
  2. public void test5(UserForm userForm)
  3. {
  4. System.out.println("Map类型绑定=========");
  5. System.out.println("名字:" + userForm.getUser().get("name"));
  6. System.out.println("年龄:" + userForm.getUser().get("age"));
  7. System.out.println("收入:" + userForm.getUser().get("income"));
  8. System.out.println("已结婚:" + userForm.getUser().get("isMarried"));
  9. System.out.println("========================");
  10. }

@RequestMapping
public void test5(UserForm userForm)
{
System.out.println("Map类型绑定=========");
System.out.println("名字:" + userForm.getUser().get("name"));
System.out.println("年龄:" + userForm.getUser().get("age"));
System.out.println("收入:" + userForm.getUser().get("income"));
System.out.println("已结婚:" + userForm.getUser().get("isMarried"));
System.out.println("========================");

UserForm.java代码

  1. public class UserForm {
  2. private Map<String, String> userMap = new LinkedHashMap<String, String>();
  3. private User user = new User();
  4. public Map<String, String> getUserMap() {
  5. return userMap;
  6. }
  7. public void setUserMap(Map<String, String> userMap) {
  8. this.userMap = userMap;
  9. }
  10. public User getUser() {
  11. return user;
  12. }
  13. public void setUser(User user) {
  14. this.user = user;
  15. }
  16. }

public class UserForm {
private Map<String, String> userMap = new LinkedHashMap<String, String>();
private User user = new User();

public Map<String, String> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, String> userMap) {
this.userMap = userMap;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

jsp代码

  1. <form action="test5.do" method="post">
  2. <div class="f_left">姓名:</div>
  3. <div class="f_left"><input name="user['name']" value="张三"/></div>
  4. <div class="clear"></div>
  5. <div class="f_left">年龄:</div>
  6. <div class="f_left"><input name="user['age']" value="20"/></div>
  7. <div class="clear"></div>
  8. <div class="f_left">收入:</div>
  9. <div class="f_left"><input name="user['income']" value="100000"/></div>
  10. <div class="clear"></div>
  11. <div class="f_left">结婚:</div>
  12. <div class="f_left">
  13. <input type="radio" name="user['isMarried']" value="true" checked="checked"/>是
  14. <input type="radio" name="user['isMarried']" value="false"/>否</div>
  15. <div class="clear"></div>
  16. <div><input type="submit" value="提交表单"/></div>
  17. </form>

<form action="test5.do" method="post">
<div class="f_left">姓名:</div>
<div class="f_left"><input name="user['name']" value="张三"/></div>
<div class="clear"></div>
<div class="f_left">年龄:</div>
<div class="f_left"><input name="user['age']" value="20"/></div>
<div class="clear"></div>
<div class="f_left">收入:</div>
<div class="f_left"><input name="user['income']" value="100000"/></div>
<div class="clear"></div>
<div class="f_left">结婚:</div>
<div class="f_left">
<input type="radio" name="user['isMarried']" value="true" checked="checked"/>是
<input type="radio" name="user['isMarried']" value="false"/>否</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>

6.复合类型绑定

controller代码

  1. @RequestMapping
  2. public void test6(UserForm userForm)
  3. {
  4. System.out.println("复合类型绑定=========");
  5. System.out.println("名字:" + userForm.getUser().getName());
  6. System.out.println("年龄:" + userForm.getUser().getAge());
  7. System.out.println("收入:" + userForm.getUser().getIncome());
  8. System.out.println("已结婚:" + userForm.getUser().getIsMarried());
  9. System.out.println("========================");
  10. }

@RequestMapping
public void test6(UserForm userForm)
{
System.out.println("复合类型绑定=========");
System.out.println("名字:" + userForm.getUser().getName());
System.out.println("年龄:" + userForm.getUser().getAge());
System.out.println("收入:" + userForm.getUser().getIncome());
System.out.println("已结婚:" + userForm.getUser().getIsMarried());
System.out.println("========================");

UserForm代码

  1. public class UserForm {
  2. private Map<String, String> userMap = new LinkedHashMap<String, String>();
  3. private User user = new User();
  4. public Map<String, String> getUserMap() {
  5. return userMap;
  6. }
  7. public void setUserMap(Map<String, String> userMap) {
  8. this.userMap = userMap;
  9. }
  10. public User getUser() {
  11. return user;
  12. }
  13. public void setUser(User user) {
  14. this.user = user;
  15. }
  16. }

public class UserForm {
private Map<String, String> userMap = new LinkedHashMap<String, String>();
private User user = new User();

public Map<String, String> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, String> userMap) {
this.userMap = userMap;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

}

jsp代码

  1. <form action="test6.do" method="post">
  2. <div class="f_left">姓名:</div>
  3. <div class="f_left"><input name="user.name" value="张三"/></div>
  4. <div class="clear"></div>
  5. <div class="f_left">年龄:</div>
  6. <div class="f_left"><input name="user.age" value="20"/></div>
  7. <div class="clear"></div>
  8. <div class="f_left">收入:</div>
  9. <div class="f_left"><input name="user.income" value="100000"/></div>
  10. <div class="clear"></div>
  11. <div class="f_left">结婚:</div>
  12. <div class="f_left">
  13. <input type="radio" name="user.isMarried" value="true" checked="checked"/>是
  14. <input type="radio" name="user.isMarried" value="false"/>否</div>
  15. <div class="clear"></div>
  16. <div><input type="submit" value="提交表单"/></div>
  17. </form>

<form action="test6.do" method="post">
<div class="f_left">姓名:</div>
<div class="f_left"><input name="user.name" value="张三"/></div>
<div class="clear"></div>
<div class="f_left">年龄:</div>
<div class="f_left"><input name="user.age" value="20"/></div>
<div class="clear"></div>
<div class="f_left">收入:</div>
<div class="f_left"><input name="user.income" value="100000"/></div>
<div class="clear"></div>
<div class="f_left">结婚:</div>
<div class="f_left">
<input type="radio" name="user.isMarried" value="true" checked="checked"/>是
<input type="radio" name="user.isMarried" value="false"/>否</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>

转自 http://blog.csdn.net/lxf9601/article/details/5925810

Spring MVC数据绑定大全 .的更多相关文章

  1. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  2. spring mvc 数据绑定

    1.spring mvc 默认提供的数据绑定类 private List<HandlerMethodArgumentResolver> getDefaultArgumentResolver ...

  3. Spring MVC 数据绑定流程分析

    1.    数据绑定流程原理★ ①   Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...

  4. Spring MVC数据绑定(一)

    1.数据绑定介绍 在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中.这种将请求消息数据与后台方法参数建立连接的过程就是Spr ...

  5. spring mvc 数据绑定总结

    spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用 ...

  6. Spring MVC 数据绑定 (四)

    完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...

  7. Spring MVC数据绑定(二)

    之前学习了SpringMVC数据绑定的基本知识和简单数据绑定以及POJO类型数据的绑定.接下来总结剩下的一些数据类型的绑定 1. 绑定包装POJO 所谓的包装POJO,就是在一个POJO中包含另一个简 ...

  8. Spring MVC 数据绑定(四)

        Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型     接下 ...

  9. Spring MVC数据绑定入门总结

    1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...

随机推荐

  1. MySQL中事务的概述ACID了解

    事务可由一条非常简单的SQL语句组成,也可以有一组复杂的SQL语句组成.事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别 ...

  2. 解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra

    直接运行命令:python -m pip install --upgrade pip

  3. Oracle学习笔记—归档模式

    什么是归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做 ...

  4. JQuery 操作 checkbox 二次赋值无效 attr ----> prop

    CheckBox .attr('checked',false);  Chrome和火狐第二次点击无效. 然后解决了把attr 改成了 prop 以后操作属性的时候各位记下,用prop 因为大家用的都是 ...

  5. 备注字段长度控制JS

    //变更原因备注字符长度控制 function checkChangeLength() { var field = $("#changeReasonDesc").val(); ma ...

  6. 解释一下python中的继承

    当一个类继承另一个类,它就被称为一个子类/派生类,继承父类/基类/超类.它会继承/获取所有类成员(属性和方法) 继承能让我们重新使用代码,也能更容易的创建和维护应用 单继承:一个类继承单个基类 多继承 ...

  7. UI控件之UICollectionView

    UICollectionView:集合视图,是iOS6.0后出现的,与UITableView类似,优势在于可以灵活的布局cell UICollectionViewLayout:布局类,抽象类,一般定义 ...

  8. HBase基本知识介绍及典型案例分析

    本次分享的内容主要分为以下五点: HBase基本知识: HBase读写流程: RowKey设计要点: HBase生态介绍: HBase典型案例分析. 首先我们简单介绍一下 HBase 是什么. HBa ...

  9. Linux基本命令 vim命令(一)

    vim的三种工作模式 命令模式.输入模式和编辑模式的相互转换,如图 命令模式:使用 Vim 编辑文件时,默认处于命令模式.在此模式下,可以使用上.下.左.右键或者 k.j.h.l 命令进行光标移动,还 ...

  10. pppoe白皮书

    转:https://blog.csdn.net/achejq/article/details/19478811 PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘    要:PPP ...