SpringMVC请求参数的绑定

Posted benjieqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC请求参数的绑定相关的知识,希望对你有一定的参考价值。

请求参数的绑定

绑定机制

  • 表单提交的数据都是k=v格式的,如username=haha&password=123
  • SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  • 要求:提交表单的name和参数的名称是相同的

支持的数据类型

基本数据类型和字符串类型

要求:提交表单的name和参数的名称是相同的

举例:

param.jsp

<a href="param/testParam?username=hehe&password=123">RequestMapping注解</a>

ParamController

@Controller
@RequestMapping("/param")
public class ParamController 
    // 基本数据类型
    @RequestMapping("/testParam")
    public String testParam(String username,String password)
        System.out.println("基本数据类型");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    

实体类型(JavaBean)

name 必须和bean中的属性名称一样;

构建一个实体类

public class Account implements Serializable 

    private String username;
    private String password;
    private Double money;

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public Double getMoney() 
        return money;
    

    public void setMoney(Double money) 
        this.money = money;
    

    @Override
    public String toString() 
        return "Account" +
                "username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                ", money=" + money +
                '';
    

Controller

//请求参数绑定把数据封装到JavaBean的类中
@RequestMapping("/saveAccount")
public String saveAccount(Account account)
    System.out.println("执行了...");
    System.out.println(account);
    return "success";

输出结果

技术图片

解决中文乱码问题,在web.xml中配置

<!--配置解决中文乱码的过滤器-->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

如果Account中有User类型,在此之前我们需要先配置一个User类

public class User implements Serializable 

    private String uname;
    private Integer age;

    public String getUname() 
        return uname;
    

    public void setUname(String uname) 
        this.uname = uname;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "User" +
                "uname='" + uname + '\\'' +
                ", age=" + age +
                '';
    

Account类

public class Account implements Serializable 

    private String username;
    private String password;
    private Double money;

    private User user;

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public Double getMoney() 
        return money;
    

    public void setMoney(Double money) 
        this.money = money;
    

    public User getUser() 
        return user;
    

    public void setUser(User user) 
        this.user = user;
    

    @Override
    public String toString() 
        return "Account" +
                "username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                ", money=" + money +
                ", user=" + user +
                '';
    

params.jsp文件

<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    用户姓名:<input type="text" name="user.uname" /><br/>
    用户年龄:<input type="text" name="user.age" /><br/>
    <input type="submit" value="提交" />
</form>

请求参数绑定到方法上,方法不变

输出结果:

技术图片

集合数据类型(List、map)

public class Account implements Serializable 

    private String username;
    private String password;
    private Double money;

    private List<User> list;
    private Map<String,User> map;

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    public Double getMoney() 
        return money;
    

    public void setMoney(Double money) 
        this.money = money;
    

    public List<User> getList() 
        return list;
    

    public void setList(List<User> list) 
        this.list = list;
    

    public Map<String, User> getMap() 
        return map;
    

    public void setMap(Map<String, User> map) 
        this.map = map;
    

    @Override
    public String toString() 
        return "Account" +
                "username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '';
    

params.jsp文件

<!--把数据封装到Account类中,类中存在list和map集合-->
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>

    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>
    <input type="submit" value="提交" />
</form>

输出结果

技术图片

自定义类型转换器

表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。

如果想自定义数据类型转换,可以实现Converter的接口。

  1. 在user类中加入新的date属性

    public class User implements Serializable 
    
        private String uname;
        private Integer age;
        private Date date;
    
        public String getUname() 
            return uname;
        
    
        public void setUname(String uname) 
            this.uname = uname;
        
    
        public Integer getAge() 
            return age;
        
    
        public void setAge(Integer age) 
            this.age = age;
        
    
        public Date getDate() 
            return date;
        
    
        public void setDate(Date date) 
            this.date = date;
        
    
        @Override
        public String toString() 
            return "User" +
                    "uname='" + uname + '\\'' +
                    ", age=" + age +
                    ", date=" + date +
                    '';
        
    
  2. 表单

    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="uname" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        出生日期:<input type="text" name="date"/><br/>
        <input type="submit" value="提交" />
    </form>
  3. 请求参数绑定到方法

    @RequestMapping("/saveUser")
    public String saveUser(User user)
        System.out.println("user保存了");
        System.out.println(user);
        return "success";
    

    页面输入

    技术图片

    输出结果:

技术图片

页面输入格式有问题,就会出现400错误。
技术图片

解决方法:

自定义类型转换器StringToDateConverter

public class StringToDateConverter implements Converter<String,Date> 

    /**
     * String source    传入进来字符串
     * @param source
     * @return
     */
    public Date convert(String source) 
        // 判断
        if(source == null)
            throw new RuntimeException("请您传入数据");
        
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        try 
            // 把字符串转换日期
            return df.parse(source);
         catch (Exception e) 
            throw new RuntimeException("数据类型转换出现错误");
        
    

在springmvc.xml配置文件中配置自定义类型转换器

<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.ben.utils.StringToDateConverter"/>
        </set>
    </property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>

输出结果
技术图片

以上是关于SpringMVC请求参数的绑定的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC详解------参数绑定

SpringMVC 从入门到精通系列 02——请求参数的绑定

springmvc:请求参数绑定集合类型

阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门

SpringMVC 获得请求数据 -- 请求数据乱码问题(POST请求)参数绑定注解@requestParam获得Restful风格的参数(@PathVariable)

SpringMVC 数据绑定