spring mvc 数据绑定总结
spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用和测试,总结出以下几种情况,希望对刚接触spring mvc 的朋友有所帮助.
查看spring源码可以看出spring支持转换的数据类型已经很多了.
org.springframework.beans.PropertyEditorRegistrySupport.java
- /**
- * 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代码
- @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代码
- <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代码
- @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代码
- 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代码
- <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代码
- @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代码
- 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代码
- <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代码
- @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代码
- 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代码
- <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代码
- @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代码
- 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代码
- <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代码
- @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代码
- 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代码
- <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>
spring mvc 数据绑定总结的更多相关文章
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...
- spring mvc 数据绑定
1.spring mvc 默认提供的数据绑定类 private List<HandlerMethodArgumentResolver> getDefaultArgumentResolver ...
- Spring MVC 数据绑定流程分析
1. 数据绑定流程原理★ ① Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...
- Spring MVC数据绑定(一)
1.数据绑定介绍 在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中.这种将请求消息数据与后台方法参数建立连接的过程就是Spr ...
- Spring MVC数据绑定大全 .
刚开始用spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时 ...
- Spring MVC 数据绑定 (四)
完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...
- Spring MVC数据绑定(二)
之前学习了SpringMVC数据绑定的基本知识和简单数据绑定以及POJO类型数据的绑定.接下来总结剩下的一些数据类型的绑定 1. 绑定包装POJO 所谓的包装POJO,就是在一个POJO中包含另一个简 ...
- Spring MVC 数据绑定(四)
Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型 接下 ...
- Spring MVC数据绑定入门总结
1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...
随机推荐
- OpenGL 回顾——简化版的窗体(包含鼠标控制,普通键位控制,以及镜面反射)
// OpenGLBook.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //变量声明 static GLfloat spin =0.0; ...
- C# 带进度条的文件下载
private long fileLength; private long downLength;//已经下载文件大小,外面想用就改成公共属性 private static bool stopDown ...
- js阻止冒泡事件及默认操作
1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览器实现 .jQuery对 ...
- php Smarty date_format [格式化时间日期]
Example 5-8. date_format[日期格式] index.php: 复制代码代码如下: $smarty = new Smarty; $smarty->assign('yester ...
- IIS6下, web.config配置为targetFramework="4.0"时出404错误
打开IIS管理器,在"Web 服务扩展" 中 将ASP.NET v4.0设置为允许就好了.这个选项默认是禁止的.
- access_ok()
access_ok() 函数是用来代替老版本的 verify_area() 函数的.它的作用也是检查用户空间指针是否可用. 函数原型: access_ok (type, addr, size); 变量 ...
- php中调用用户自定义函数的方法:call_user_func,call_user_func_array
看UCenter的时候有一个函数call_user_func,百思不得其解,因为我以为是自己定义的函数,结果到处都找不到,后来百度了一下才知道call_user_func是内置函数,该函数允许用户调用 ...
- java常用集合类:Deque,ArrayList,HashMap,HashSet
图一:java collection 类图 Queue家族 无论是queue还是stack,现在常用的是Deque的实现类:如单线程的ArrayQueue,多线程的ArrayBlockingQueue ...
- 将eclipse的应用程序打包成.exe
转自:http://blog.163.com/loveshijie_1991/blog/static/1760553112012102573437156/ 参考:http://blog.csdn.ne ...
- Java反射在JVM的实现
1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段.这使反射成为构建灵活应用 ...