zoukankan      html  css  js  c++  java
  • SpringMVC学习笔记四:数据绑定

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6831344.html 

    参考:http://www.cnblogs.com/HD/p/4107674.html

    一:数据绑定

    1:基本类型的绑定

        根据URL映射到某个处理函数时,函数的参数值自动在request中寻找同名的传过来的页面参数值。如果没有则报错,可以使用@RequestParam注解来修饰该函数参数,设置defaultValue,防止传过来空值时报错。

    Controller代码:

    @RequestMapping("saysth.do")
    public void test(int count) {//参数名为count
    }

    表单代码:

    <form action="saysth.do" method="post">
    <input name="count" value="10" type="text"/>//标签参数名为count
    ......
    </form>

    2:基本类型的包装类型的绑定

        根据URL映射到某个处理函数时,函数的参数值自动在request中寻找同名的传过来的页面参数值。允许参数值为空。

    Controller代码:

    @RequestMapping("saysth.do")
    public void test(Integer count) {//参数名为count
    }

    表单代码:

    <form action="saysth.do" method="post">
    <input name="count" value="10" type="text"/>//标签参数名为count
    ......
    </form>

    3:数组类型绑定

        根据URL映射到某个处理函数时,函数参数为一个数组,则自动在request寻找名字同数组名的参数的值们并存入数组。

    如:url?name=111&name=222&name=333;则函数参数中的数组int[] arr的值为{111,222,333}

    4:简单对象的绑定

        根据URL映射到某个处理函数时,函数参数为一个简单的bean(即:类的属性全为简单数据类型的,并且定义了属性的setter和getter方法)。

        则自动从request的参数中寻找与bean类属性同名的参数值赋给bean实例的同名属性,构造出一个bean实例作为函数参数传进函数中使用。

    Model代码:

    复制代码
    public class User {
        private String firstName;
        private String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
    }
    复制代码

    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"/>
    ......
    </form>

    非常简单,只需将对象的属性名和input的name值一一匹配即可。

    5:多层级对象的绑定

        根据URL映射到某个处理函数时,函数参数为一个复杂的bean(bean中包含其他类实例作为成员属性)。

        则URL的格式为: url?一级bean中普通属性=值&一级bean中的二级bean成员属性.二级bean普通属性=值...

        比如:User类中有Info类成员属性,Info类中有qq、phone属性。则请求为:url?name=aaa&info.qq=88888&info.phone=99999

    6:有相同属性的对象参数绑定

        根据URL映射到某个处理函数时,如果函数的有两个或以上的对象参数,并且有两个或以上的参数的实例对象有相同类型、相同名字的属性,则此时URL传过来的参数值会同时赋给拥有该同名属性的对象中去。解决办法就是使用 自定义编辑器转换数据,来规定什么格式的参数转换为哪个对象的属性值。

        比如:url?user.name=111&person.name=000,自定义编辑器把 user.  定义为user实例的前缀, person. 定义为person实例的前缀。则自动把参数值传给user、person实例了。

    7:List对象绑定

    List需要绑定在对象上,而不能直接写在Controller方法的参数中。
    Model代码:

    复制代码
    public class User {
        private String firstName;
        private String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
    }
    
    public class UserListForm {//List需要绑定在一个对象中
        private List<User> users;
    
        public List<User> getUsers() {
            return users;
        }
    
        public void setUsers(List<User> users) {
            this.users = users;
        }
    
    }
    复制代码

    Controller代码:

    复制代码
    @RequestMapping("saysth.do")
    public void test(UserListForm userForm) {//用对象来接收List内容,赋给对象中的list类型成员
        for (User user : userForm.getUsers()) {
            System.out.println(user.getFirstName() + " - " + user.getLastName());
        }
    }
    复制代码

    表单代码:

    复制代码
    <form action="saysth.do" method="post">
    <table>
    <thead>
    <tr>
    <th>First Name</th>
    <th>Last Name</th>
    </tr>
    </thead>
    <tfoot>
    <tr>
    <td colspan="2"><input type="submit" value="Save" /></td>
    </tr>
    </tfoot>
    <tbody>
    <tr>
    <td><input name="users[0].firstName" value="aaa" /></td>//页面端通过 [] 为list元素属性赋值
    <td><input name="users[0].lastName" value="bbb" /></td>
    </tr>
    <tr>
    <td><input name="users[1].firstName" value="ccc" /></td>
    <td><input name="users[1].lastName" value="ddd" /></td>
    </tr>
    <tr>
    <td><input name="users[2].firstName" value="eee" /></td>
    <td><input name="users[2].lastName" value="fff" /></td>
    </tr>
    </tbody>
    </table>
    </form>

    注意:这里有个坑,就是页面端如果不是顺序地为list元素赋值,如:user[0]一下子跳到了user[10],则中间user[1~9]元素属性值会是null,并且list大小为11而不是2。

    8:Set对象绑定

    Set和List类似,也需要绑定在对象上,而不能直接写在Controller方法的参数中。并且,必须先在Set绑定的对象的中add相应的数量的模型对象,从而创建出相应大小的set。


    Model代码:

    复制代码
    public class User {
        private String firstName;
        private String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
    }
    
    public class UserSetForm {
        private Set<User> users = new HashSet<User>();
    
        public UserSetForm() {//要先add相应数量的元素,创建出相应大小的set空间
            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;
        }
    
    }
    复制代码

    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">
    <table>
    <thead>
    <tr>
    <th>First Name</th>
    <th>Last Name</th>
    </tr>
    </thead>
    <tfoot>
    <tr>
    <td colspan="2"><input type="submit" value="Save" /></td>
    </tr>
    </tfoot>
    <tbody>
    <tr>
    <td><input name="users[0].firstName" value="aaa" /></td>
    <td><input name="users[0].lastName" value="bbb" /></td>
    </tr>
    <tr>
    <td><input name="users[1].firstName" value="ccc" /></td>
    <td><input name="users[1].lastName" value="ddd" /></td>
    </tr>
    <tr>
    <td><input name="users[2].firstName" value="eee" /></td>
    <td><input name="users[2].lastName" value="fff" /></td>
    </tr>
    </tbody>
    </table>
    </form>
    复制代码

    基本和List绑定类似,下标不能跳跃,不然前端传过去的set就会大于绑定对象中的set,会报错。一般不用set,很麻烦。

    9:Map对象绑定

    Map最为灵活,它也需要绑定在对象上,而不能直接写在Controller方法的参数中。


    Model代码:

    复制代码
    public class User {
        private String firstName;
        private String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
    }
    
    public class UserMapForm {//把map绑定到对象中,作为一个对象属性
        private Map<String, User> users;//domain类作为value
    
        public Map<String, User> getUsers() {
            return users;
        }
    
        public void setUsers(Map<String, User> users) {
            this.users = 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">
    <table>
    <thead>
    <tr>
    <th>First Name</th>
    <th>Last Name</th>
    </tr>
    </thead>
    <tfoot>
    <tr>
    <td colspan="2"><input type="submit" value="Save" /></td>
    </tr>
    </tfoot>
    <tbody>
    <tr>
    <td><input name="users['x'].firstName" value="aaa" /></td>//以字符串作key,user对象作为value
    <td><input name="users['x'].lastName" value="bbb" /></td>
    </tr>
    <tr>
    <td><input name="users['y'].firstName" value="ccc" /></td>
    <td><input name="users['y'].lastName" value="ddd" /></td>
    </tr>
    <tr>
    <td><input name="users['z'].firstName" value="eee" /></td>
    <td><input name="users['z'].lastName" value="fff" /></td>
    </tr>
    </tbody>
    </table>
    </form>

    10:JSON数据绑定

    当客户端传过来JSON格式的内容给请求处理参数时,我们需要把JSON格式的数据转换为bean实例,可以通过 @RequestBody注解修饰函数参数,把request中body部分数据转换为对象,然后把对象作为函数参数使用。

       

    11:XML数据绑定

    XML数据绑定比JSON多一步,作为请求处理函数的参数对象在定义时,需要添加一些XML解析的注解,来表明此对象对应于xml文件中的哪个element。

    然后,通过 @RequestBody注解修饰函数参数,把request中body部分的xml格式数据转换为对象,然后把对象作为函数参数使用。

  • 相关阅读:
    List接口的实现类
    Java 容器概述
    PayPal支付接口方式(checkout)集成
    Java Bio、Nio、Aio区别
    Java Aio
    Java Nio
    Java Bio
    Java Io流
    Java 23种设计模式
    SQL检测超时工具类
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6831344.html
Copyright © 2011-2022 走看看