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";
}
<!-- pojo 类型演示 -->
<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";
}
<!-- POJO 类包含集合类型演示 -->
<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<Account> accounts;
  private Map<String,Account> accountMap;
  //getters and setters
}
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
  System.out.println("更新了账户。。。。"+user);
  return "success";
}

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

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

<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
  <!-- forceEncoding=true意思是指无论客户端请求是否包含了编码,都用过滤器里的编码来解析请求 -->
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>false</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

3.自定义类型转换器

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

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

public class StringToDateConverter implements Converter<String, Date> { //参数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>

 解决时间类型转换问题也可以直接在实体类上加上注解,注明转换的格式即可

  

 

posted @ 2020-02-15 00:44  糖不甜,盐不咸  阅读(646)  评论(0编辑  收藏  举报