【SpringMVC】三、请求参数的绑定及自定义类型转换

绑定的机制

什么是请求参数的绑定?

通过客户端发送的请求中都会携带一些参数 比如 username=zhangsan ,服务器端把这些参数拿到就是参数的绑定,类似于曾经的web工程里的 Request.getParameter 方法。但是我们使用了 springMVC框架以后就不需要那么麻烦了~不用我们手动一个个 g e t (lll¬ω¬)

那么SpringMVC是如何进行参数绑定的呢?

答:我们都知道,表单中请求参数都是基于key=value的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:

<a href="account/findAccount?username=hehe&&password=123">查询用户</a>
超链接中请求参数是:
username=hehe&&password=123

/**
* 查询账户
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(String username,String password) {
System.out.println("查询了用户。。。。"+username);
return "success";
}

支持的数据类型

基本类型参数 :

  • 包括基本类型和 String 类型

基本POJO 类型参数 :

  • 包括实体类,以及关联的实体类

数组和集合类型参数 :

  • 包括 List 结构和 Map 结构的集合(包括数组)

参数绑定的使用要求

SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

  1. 如果是基本类型或者 String 类型:
    要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)

  2. 如果是 POJO 类型 ,或者它的关联对象 :
    要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

  3. 如果是集合类型, 有两种方式
    第一种:
    要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
    给 List 集合中的元素赋值,使用下标。
    给 Map 集合中的元素赋值,使用键值对。
    第二种:
    接收的请求参数是 json 格式数据。需要借助一个注解实现。

在这里插入图片描述

Request中文乱码解决

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>

自定义类型转换器

问题:

  1. 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
  2. 前台日期的输入格式为 “2020/3/3” 时同样可以实现 从String 类型到 Data类型的转换。但是如果前台文本框输入的是“2020-3-3” 时的格式就会和Data类型不匹配,造成出错。(Bad Request)

  1. 如果想自定义数据类型转换,可以实现Converter的接口
public class StringToDataConverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        if(source == null){
            throw new RuntimeException("参数不能为空");
        }
        SimpleDateFormat df=new SimpleDateFormat("yyyy-mm-dd");
        try {
           return df.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException("类型转换时出错");
        }
    }
}

  1. 注册自定义类型转换器,在springmvc.xml配置文件中编写配置

<!--    自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="code.utils.StringToDataConverter"></bean>
            </set>
        </property>
    </bean>


<!--    开启注解SpringMVC框架注解的支持-->
    <mvc:annotation-driven conversion-service="conversionService"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_popo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值