- 了解Spring MVC中数据绑定的概念
- 熟悉简单数据类型的绑定
- 熟悉复杂数据类型的绑定
- 掌握Spring MVC数据绑定的使用
- 掌握Spring MVC的数据响应
- 掌握不同类型返回值的页面跳转
通过上一章的学习,已经知道客户端请求和服务器端处理器之间的映射方式。
客户端和服务器端通过映射可以完成两者的交互,其中客户端发起请求,服务器端将请求参数的值赋给处理器的形参完成数据的绑定,最终将想要返回给客户端的数据发给客户端进行响应。
Spring MVC支持多种数据类型的数据绑定,响应方式也比较灵活,
本章将对Spring MVC框架中的数据绑定和响应
进行详细讲解。
01
02
03
7.1 数据绑定
数据绑定的概念
在程序运行时,Spring MVC接收到客户端的请求后,
会根据客户端请求的参数和请求头等数据信息,将参数以特定的方式转换并绑定到处理器的形参中。
Spring MVC中将请求消息数据与处理器的形参建立连接的过程就是Spring MVC的数据绑定。
7.2 简单数据绑定
7.2.1 默认类型数据绑定
当使用Spring MVC默认支持的数据类型作为处理器的形参类型时,Spring MVC的
参数处理适配器会默认识别这些类型并进行赋值。
Spring MVC常见的默认类型如下所示。
- HttpServletRequest:通过request对象获取请求信息。
- HttpServletResponse:通过response处理响应信息。
- HttpSession:通过session对象得到session中存放的对象。
- Model/ModelMap:Model是一个接口,ModelMap是一个类,Model的实现类对象和ModelMap对象都可以设置model数据,model数据会填充到request域。
控制器类的包 >
控制器类 @Controller >
方法 getUserId( ):用于获取客户端请求中userid参数的值。
![](https://i-blog.csdnimg.cn/blog_migrate/c9111b08d99a409a463b2cc7ad9bd982.png)
例1
7.2.2 简单数据类型绑定
简单数据类型,就是指Java中
基本类型(如int、double、String等)的数据绑定
。
在Spring MVC中进行简单类型的数据绑定,只需客户端请求参数的名称和处理器 的形参名称一致即可,请求参数会自动映射并匹配到处理器的形参完成数据绑定。
例2:实现 Integer 类型 和 String 类型 的数据绑定
![](https://i-blog.csdnimg.cn/blog_migrate/527f9190d0752f168623ab9aba4febb4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/74ce33458cfe557131a4bf1f009407f4.png)
参数别名的设置
有时候客户端请求中参数名称和处理器的形参名称不一致,会导致处理器无法正确绑定并接收到客户端请求中的参数。
为此,Spring MVC提供了
@RequestParam注解
来
定义参数的别名
,完成请求参数名称和处理器的形参名称不一致
时的数据绑定。
![](https://i-blog.csdnimg.cn/blog_migrate/9669233f13b10cf997f143452eb23238.png)
@RequestParam注解
- value属性,给getUserName()方法中的username形参定义了别名name。
此时,客户端请求中名称为name的参数,就会绑定到getUserName()方法中的 username形参上。
- required属性,设定了请求的name参数不是必须的。
如果访问时没有携带name参数,会将
- defaultValue属性,设定的值赋给形参username。
——当请求的映射方式是REST风格时,上述对简单类型数据绑定的方式就不适用了。
——使用别名—————————————————————————————————————
@PathVariable注解
可以将URL中占位符参数绑定到处理器的形参中。
- value:用于指定URL中占位符名称。
- required:是否必须提供占位符,默认值为true。
7.2.3 POJO绑定
使用场景
在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较
繁琐
。
为解决这个问题,可以使用POJO类型进行数据绑定。
POJO数据绑定的概念
将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
04
05
例3:实现 POJO 绑定
![](https://i-blog.csdnimg.cn/blog_migrate/8219eca4eaf12d808f8374de07469796.png)
客户端请求的参数名称(本例中指form表单内各元素 name的属性值)必须与要绑定的POJO类中的属性名称保持一致。
![](https://i-blog.csdnimg.cn/blog_migrate/e9989812e3a0b0b05ffc3b0582e8256f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4930e00a9b3dea690a7c1f7ed6db603c.png)
多学一招:解决请求参数中的中文乱码问题![](https://i-blog.csdnimg.cn/blog_migrate/cf8a6e607d432f436d3964f2369c5b83.png)
7.2.4 自定义类型转换器
默认类型转换器并不能将提交的 参数转换为所有的类型。
此时,就需要开发者自定义类型转换器,来
将参数转换为程序所需要的类型
。
Converter接口的使用
Spring框架提供了org.springframework.core.convert.converter.Converter接口作为类型转换器,开发者可以通过实现Converter接口来自定义类型转换器。
public interface Converter<S, T> {
T convert(S source);
}
上述代码中,泛型参数中的S表示源类型,T表示目标类型,而convert( )方法将源类型转
换为目标类型返回,方法内的具体转换规则可由开发者自行定义。
例4:实现Date类型的数据绑定
1、通过实现Converter接口来自定义类型转换器。
2、为了让Spring MVC知道并使用DateConverter转换器类,还需要在配置文件spring- mvc.xml置类型转换器。
![](https://i-blog.csdnimg.cn/blog_migrate/9dc40d2bfa7365736ecc243e57da1246.png)
<!-- 配置类型转换器工厂 -->
<bean id="converterService" class=
"org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器,配置自定义类型转换器 -->
<property name="converters">
<array>
<bean class="com.wuz.convert.DateConverter"/>
</array>
</property>
</bean>
<mvc:annotation-driven conversion-service="converterService"/>
3、方法:用于绑定客户端请求中的日期数据。
——成功,以下———————————————————————————————————
![](https://i-blog.csdnimg.cn/blog_migrate/b7cb72d8756f32f041c6da266e7fcd63.png)
——成功——————————————————————————————————————
![](https://i-blog.csdnimg.cn/blog_migrate/6e1442e5ae3d6f34df7a284d395c2ace.png)
总之,使用自定义类转换器,如下。。。。。
![](https://i-blog.csdnimg.cn/blog_migrate/dd71a90549c0b0856848584c12a98560.png)
输入形式:yyyy-mm-dd
转化成Data
日期类型的格式转换:@DateTimeFormat注解
/**
* 使用@DateTimeFormat注解绑定日期数据
*/
@RequestMapping("/getBirthday")
public void getBirthday(@DateTimeFormat(
pattern = "yyyy-MM-dd")Date birthday) {
System.out.println("birthday="+birthday);
}
<!-- 配置创建 spring 容器要扫描的包 -->
<context:component-scan base package="com.wzu.controller"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view
.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:annotation-driven />
<body>
<form action="${pageContext.request.contextPath}/getBirthday02" method="post">
生 日:<input type="text" name="birthday" /><br />
<input type="submit" value="注册"/>
</form>
</body>
还有
....
页面跳转
数据回写