springMVC请求参数的绑定及自定类型转换器

1. 请求参数的绑定说明
  1. 绑定机制
    表单提交的数据都是k=v格式的 username=haha&password=123
    SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  2. 支持的数据类型
    基本数据类型和字符串类型

      1.提交表单的name和参数的名称是相同的

      2.区分大小写
    实体类型

      1. 提交表单的name和JavaBean中的属性名称需要一致
      2. 如果一个实体类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性

        例如:address.name

    集合数据类型(List、map集合等)

      第一种方式:

        要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
        给 List 集合中的元素赋值,使用下标  list[0].属性
        给 Map 集合中的元素赋值,使用键值对。  map['one'].属性

      第二种方式:

        接收的请求参数是 json 格式数据,需要借助一个注解实现。@RequestBody:用在控制器方法的参数中


<a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户a>
@RequestMapping("/findAccount")
public String findAccount(Integer accountId,String accountName) {
  System.out.println("查询了账户。。。。"+accountId+","+accountName);
return "success";
}

<form action="account/saveAccount" method="post">
  账户名称:<input type="text" name="name" ><br/>
  账户金额:<input type="text" name="money" ><br/>
  账户省份:<input type="text" name="address.provinceName" ><br/>
  账户城市:<input type="text" name="address.cityName" ><br/>
<input type="submit" value=" 保存 ">
form>
public class Account implements Serializable {
  private Integer id;
  private String name;
  private Float money;
  private Address address;
  //getters and setters
}
public class Address implements Serializable {
  private String provinceName;
  private String cityName;
  //getters and setters
}
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
  System.out.println("保存了账户。。。。"+account);
  return "success";
}

<form action="account/updateAccount" method="post">
  用户名称:<input type="text" name="username" ><br/>
  用户密码:<input type="password" name="password" ><br/>
  用户年龄:<input type="text" name="age" ><br/>
  账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
  账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
  账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
  账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
  账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
  账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
  账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
  账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
  <input type="submit" value=" 保存 ">
form>
public class User implements Serializable {
  private String username;
  private String password;
  private Integer age;
  private List accounts;
  private Map accountMap;
  //getters and setters
}
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
  System.out.println("更新了账户。。。。"+user);
  return "success";
}

2.请求参数中文乱码的解决

  在web.xml中配置Spring提供的过滤器类


<filter>
  <filter-name>characterEncodingFilterfilter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
  
  <init-param>
    <param-name>encodingparam-name>
    <param-value>UTF-8param-value>
  init-param>
  
  <init-param>
    <param-name>forceEncodingparam-name>
    <param-value>falseparam-value>
  init-param>
filter>
<filter-mapping>
  <filter-name>characterEncodingFilterfilter-name>
  <url-pattern>/*url-pattern>
filter-mapping>

3.自定义类型转换器

  1. 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,
   说明Spring框架内部会默认进行数据类型转换。
  2. 如果想自定义数据类型转换,可以实现Converter的接口

  第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。

public class StringToDateConverter implements Converter { //参数1:表示接收的类型,参数2:表示目标类型
  /**
  * 用于把 String 类型转成日期类型
  */
  @Override
  public Date convert(String source) {
    DateFormat format = null;
    try {
      if(StringUtils.isEmpty(source)) {
        throw new NullPointerException("请输入要转换的日期");
      }
      format = new SimpleDateFormat("yyyy-MM-dd");
      Date date = format.parse(source);
      return date;
    } catch (Exception e) {
      throw new RuntimeException("输入日期有误");
    }
  }
}

  第二步:在 spring 配置文件中配置类型转换器。

    spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。


<bean id="converterService"
  class="org.springframework.context.support.ConversionServiceFactoryBean">
  
  <property name="converters">
    <set>
      
      <bean class="com.fgy.web.converter.StringToDateConverter">bean>
    set>
  property>
bean>

  第三步:在 annotation-driven 标签中引用配置的类型转换服务


<mvc:annotation-driven conversion-service="converterService">mvc:annotation-driven>

 

你可能感兴趣的:(springMVC请求参数的绑定及自定类型转换器)