绑定的机制
什么是请求参数的绑定?
通过客户端发送的请求中都会携带一些参数 比如 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 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
-
如果是基本类型或者 String 类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写) -
如果是 POJO 类型 ,或者它的关联对象 :
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。 -
如果是集合类型, 有两种方式
第一种:
要求集合类型的请求参数必须在 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>
自定义类型转换器
问题:
- 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
- 前台日期的输入格式为 “2020/3/3” 时同样可以实现 从String 类型到 Data类型的转换。但是如果前台文本框输入的是“2020-3-3” 时的格式就会和Data类型不匹配,造成出错。(Bad Request)
- 如果想自定义数据类型转换,可以实现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("类型转换时出错");
}
}
}
- 注册自定义类型转换器,在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"/>