`

Spring MVC数据绑定大全

 
阅读更多
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 做web开发时 经常会不知道如何合适绑定页面数据 用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便 本人最开始也是这么认为 经过一段...

    Spring MVC数据绑定大全.rar

    Spring MVC数据绑定大全.rar

    Spring+MVC数据绑定大全+

    Spring+MVC数据绑定大全+

    spring mvc 参数绑定漏洞

    NULL 博文链接:https://yfm049.iteye.com/blog/860494

    Spring MVC数据绑定概述及原理详解

    主要介绍了Spring MVC数据绑定概述及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 ...11.Spring MVC 数据绑定案例 12.Spring MVC 实现 JSON 数据返回案例 13.Spring MVC 文件的上传与下载案例 14.Spring MVC 拦截器案例 15.Spring MVC 异常处理案例

    第12章Spring MVC参数绑定的验证

    第12章Spring MVC参数绑定的验证 简单数据类型绑定 默认数据类型绑定 POJO类型 复杂数据类型绑定(数组、集合)

    27 Spring MVC数据绑定InitBinder揭秘慕课专栏1

    背景在使用 SpingMVC 框架的项目中,经常会遇到页面某些数据要转换成类型是 Date、Integer、Double 等的数据绑定到控制器的实体。Sprin

    [免费]Spring MVC学习指南(高清)

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    大优惠 Spring MVC学习指南(第2版)2017.pdf

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    Spring MVC学习指南

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    SpringMVC绑定数据库例子

    springMVC通过mybatis绑定数据库 可以正常运行。

    Spring.MVC-A.Tutorial-Spring.MVC学习指南

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...

    Spring MVC的教程项目代码

    奉上学习Spring MVC 3.0的技术资料PPT资料,我花了两天写成,该资料根据最新拙作的《Spring 3.x 企业应用开发实战 》写成,仅需要1个小时左右的时间,就可以让你学习到Spring MVC 3.0的所有知识点和新功能,强烈推荐...

    springmvc数据绑定示例程序

    spring mvc数据绑定示例,maven工程

    Spring.MVC-A.Tutorial-Spring.MVC学习指南.rar

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

Global site tag (gtag.js) - Google Analytics