初见SpringMVC之数据绑定
数据绑定的内容非常通俗易懂,后台受理网络请求的方法获取http请求参数的过程就是数据绑定。Spring提供了多种数据绑定的方法:
-
绑定默认数据类型:
SpringMVC中常用的默认数据类型包括,HttpServletRequest,HttpServletResponse,HttpSession。下面通过一个例子介绍,如何通过默认数据类型绑定,获取请求参数。
导入SpringMVC相关包,在web.xml中配置DsipatcherServlet
编写Handler,处理具体的网络请求,在此处是通过Controll注解标识一个Handller,通过RequestMapping完成Handler和url之间的映射。
@Controller
public class DataBinding {
@RequestMapping(value="/defaultDataBinding")
public String defaultDataBinding(HttpServletRequest request){
Stringid = request.getParameter("id");
System.out.println("id="+id);
return "success";
}
}
defaultDataBinding是受理以”/DefaultDataBinging”结尾的网络请求的方法,通过默认参数HttpServletRequest完成数据绑定,而http请求提交的参数均通过 request.getParameter()方法获取。
- Spring-cofig.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 定义组件扫描器,指定需要扫描的包 -->
<context:component-scan base-package="com.bupt.controller"/>
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀 -->
<propertyname="prefix" value="/WEB-INF/" />
<!--设置后缀 -->
<propertyname="suffix" value=".jsp" />
</bean>
</beans>
- 测试结果:
在浏览器输入如下网址 http://localhost:8080/HelloSpringMV/defaultDataBinding?id=1
可以看见上述通过Get方式提交一个名为id的参数,参数值为1。在控制台可以看见如下输出:
-
绑定简单数据类型
简单数据类型是指java中的基本数据类型以及String类型,假如提交的参数仅仅只是一个id,可以采用绑定简答数据类型的方法,而不用通过绑定request后再获取id数据。在DataBinding类中添加如方法:
- 在Handler中添加方法
@RequestMapping(value="/SimpleDataBinding")
publicString simpleDataBinding(HttpServletRequestrequest,int id){
System.out.println("request中获取id="+request.getParameter("id"));
System.out.println("id="+id);
return"success";
}
在上述代码中,新增了一个参数int id。id直接可以获取http请求中对应的id字段。
- 测试,在浏览器中输入如下url:http://localhost:8080/HelloSpringMV/SimpleDataBinding?id=1
从测试结果中可以发现,方法中id参数可以字节获取http请求中携带的id字段,同时还可以绑定HttpServletRequest的方法获取请求参数。这里需要特别注意的是,http请求中的字段名称必须和方法中参数名称保持一致。假如不一致是不能绑定参数的。
-
绑定POJO数据类型
当http请求携带的参数很多的时候,采用绑定简单数据类型的方法就需要设置过多的方法形参,此时可以利用一个POJO对象充当方法形参,获取http请求中的参数。下面通过一个验证用户登录的例子来介绍绑定POJO数据类型的方式。
用户登录时候需要提交用户名(userName)和密码(password)给服务器去验证,此时如果采用绑定简单数据类型的方法时,需要两个形参来完成数据绑定。此时就可以采用绑定POJO类型的方法获取请求参数
- 在服务器一端创建一个POJO类
public class User {
//POJO类的属性名要和http请求的字段名保持一致
publicString userName;
publicString password;
publicStringgetUserName() {
return userName;
}
publicvoid setUserName(String userName){
this.userName= userName;
}
publicString getPassword() {
returnpassword;
}
publicvoid setPassword(String password){
this.password= password;
}
}
- 在Handler中添加接收请求的方法:
@RequestMapping("/POJODataBinding")
publicString POJODataBinding(User user){
System.out.println("username="+user.getUserName());
System.out.println("password="+user.getPassword());
return"success";
}
- 在WebConten目录下,创建一个user.html文件,显示一个简单的登录页面
<!DOCTYPEhtml>
<html>
<head>
<metacharset="UTF-8">
<title>helloSpringMVC</title>
</head>
<body>
<form action="http://localhost:8080/HelloSpringMV/POJODataBinding"
method="post">
用户名<input type="text" name="userName"></input><br>
密码<input type="password" name="password"></input><br>
<input type="submit"name="submit" value="登录"></input><br>
</form>
</body>
</html>
- 在Springmvc-config.xml文件中添加一行配置:
<!--dispatcherServelet不拦截静态资源-->
<mvc:default-servlet-handler/>
- 测试,在浏览器中访问url:http://localhost:8080/HelloSpringMV/user.html
点击提交后,观察服务器控制台输出:
-
自定义数据绑定
自定义数据绑定,是一种比较冷门的数据绑定方法,假设存在这样一种情景:请求携带的参数类型为A,后台接收方法的形参类型为B,比如http请求携带的参数是日期字符串”2017-11-20 4:15:30”,而后台接收方法的形参类型是Date,在这样一种参数不匹配的情况下,就需要用到自定义数据绑定。
完成自定义数据绑定,最主要的工作就是设计一个类型转化器,通过日期转换的例子介绍自定义数据绑定。
- 构建一个数据类型转换器,创建一个名为DateConverter的类,继承Converter接口。
第一个泛型参数代表待转换类型,第二个泛型参数代表目标转换类型,所有的转换工作均只在convert方法中完成。
public class DateConverter implements Converter<String,Date>{
privateString datePattern="yyyy-mm-dd HH:mm:ss";
@Override
publicDate convert(String source) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
try{
return sdf.parse(source);
} catch(ParseException e) {
// TODO Auto-generated catch block
throw newIllegalArgumentException("无效日期格式,请使用如下格式:"+datePattern);
}
}
}
- 在Spring-config.xml文件中配置类型转换器
<pre name="code" class="html" style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px 16px; overflow-x: auto; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 12px; line-height: 20px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 定义组件扫描器,指定需要扫描的包 -->
<context:component-scan base-package="com.bupt.controller" />
<!-- 配置注解驱动 -->
<!-- <mvc:annotation-driven />-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--dispatcherServelet不拦截静态资源-->
<mvc:default-servlet-handler/>
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀 -->
<propertyname="prefix" value="/WEB-INF/" />
<!--设置后缀 -->
<propertyname="suffix" value=".jsp" />
</bean>
<!-- 自定义类型转换器配置 -->
<bean id="conversionService"class=
"org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.bupt.converter.DateConverter"/>
</set>
</property>
</bean></pre>
- 在Handler中添加处理网络请求的方法
@RequestMapping(value="/ConverterDateBinding")
publicString ConverterDateBinding(Date date){
System.out.println(date.toString());
return"success";
}
- 测试,在浏览器中输入如下url http://localhost:8080/HelloSpringMV/ConverterDateBinding?date=2017-11-20%2017:13:02 服务端控制台输出结果:
-
绑定数组类型
假如前端发送的Http请求携带了同名的多个参数时,就会用到绑定数组类型的情况,比如前端使用复选框来完成选定操作的情景。
- 在Handler中添加处理网络请求的方法
@RequestMapping(value="/arrayDateBinding")
publicString arrayDateBinding(String[] users){
for(int i=0;i<users.length;i++){
System.out.println("删除user="+users[i]);
}
return"success";
}
- 在WebConten下创建array.html文件
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<title>Inserttitle here</title>
</head>
<body>
<form action="http://localhost:8080/HelloSpringMV/arrayDateBinding"
method="POST">
<table width="20%"border=1>
<tr>
<td>选择</td>
<td>用户名称</td>
</tr>
<tr>
<td> <input type="checkbox"name="users" value="SmartTu"></input></td>
<td>SmartTu</td>
</tr>
<td> <input type="checkbox"name="users" value="SmartTu1"></input></td>
<td>SmartTu1</td>
</tr>
<td> <input type="checkbox"name="users" value="SmartTu2"></input></td>
<td>SmartTu2</td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>
- 测试
点击提交按钮看,观察服务器控制台输出
Reference:
[1] Java企业级应用开发教程 2017.黑马程序员编著
[2] csdn博客原文