在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。
在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。
接下来,将通过一张数据流程图来介绍数据绑定的过程。
1.Spring MVC将ServletRequest对象传递给DataBinder;
2.将处理方法的入参对象传递给DataBinder;
3.DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中;
4.调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验;
5.校验完成后会生成数据绑定结果BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数。
根据客户端请求参数类型和个数的不同,我们将Spring MVC中的数据绑定主要分为简单数据绑定和复杂数据绑定。
(1)简单数据绑定:
1>绑定默认数据类型
当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。
常用默认参数类型如下:
HttpServletRequest:通过request对象获取请求信息;
HttpServletResponse:通过response处理响应信息;
HttpSession:通过session对象得到session中存放的对象;
Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域。
1.导入相应的jar包
2.web.xml文件:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springmvc-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.itheima.controller" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class=
"org. springfrar work.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.convert.DateConverter" />
</set>
</property>
</bean>
<bean id="conversionService " class="org.springframework.format.support.
FormattingConvers ionServiceFactoryBean " >
<property name=" formatters" >
<set>
<bean class=" com.itheima.convert.DateFormatter" />
</set>
</property>
</bean>
</beans>
UserController
@Controller
public class UserController {
@RequestMapping("/selectUser")
public String selectUser(HttpServletRequest request) {
String id = request.getParameter("id");
System.out.println("id=="+id);
return "success";
}
}
.success.jsp,创建出文件
运行
简单数据类型的绑定
就是指Java中几种基本数据类型的绑定,例如int、String、Double等类型。
这里仍然以上一小节中的参数id为1的请求为例,来讲解简单数据类型的绑定。
将控制器类UserController中的selectUser()方法进行修改:
@RequestMapping("/selectUser")
public String selectUser(Integer id) {//直接使用基本类型进行绑定
System.out.println("id="+id);
return "success";
}
这里需要注意的是,有时候前端请求中参数名和后台控制器类方法中的形参名不一样,这就会导致后台无法正确绑定并接收到前端请求的参数。
针对上述提到的前端请求中参数名和后台控制器类方法中的形参名不一样的情况,可以考虑使用Spring MVC提供的@RequestParam注解类型来进行间接数据绑定。
@RequestParam注解的属性声明如下:
假设请求地址为http://localhost:8080/chapter13/selectUser?user_id=3,那么在后台selectUser()方法中的使用方式如下:
@RequestMapping("/selectUser")
public String selectUser(@RequestParam(value = "user_id")Integer id) {
System.out.println("id=="+id);
return "success";
}
绑定POJO类型
在使用简单数据类型绑定时,可以很容易的根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较繁琐。
针对多类型、多参数的请求,可以使用POJO类型进行数据绑定.POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
1.新建一个po包,然后创建一个User的POJO类:
public class User {
private Integer id;
private String username;
private Integer password;
}
在UserController中添加接收用户信息和页面跳转的方法:
@RequestMapping("/toRegister")
public String toRegister() {
return "register";
}
@RequestMapping("/registerUser")
public String registerUser(User user) {
String username = user.getUsername();
Integer password = user.getPassword();
System.out.println("username=" + username +" password=" + password);
return "success";
}
创建一个注册页面register.jsp
<form action="${pageContext.request.contextPath}/registerUser" method="post">
用户名:<input type="text" name="username"/><br>
密 码: <input type="text" name="password">
<input type="submit" value="注册">
</form>