目录
- Spring MVC数据绑定
- 1.数据绑定概述
- 2.简单数据绑定
- 2.1 绑定默认数据类型
- 2.2 绑定简单数据类型
Spring MVC数据绑定
1.数据绑定概述
在执行程序时,Spring MVC根据客户端请求参数的不同将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。
在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数。具体的信息处理过程的步骤如下。
步骤01 Spring MVC将ServletRequest对象传递给DataBinder。
步骤02 将处理方法的入参对象传递给DataBinder。
步骤03 DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中。
步骤04 调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验。
步骤05 校验完成后会生成数据绑定结果BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数。
根据客户端请求参数类型和个数的不同,将Spring MVC中的数据绑定主要分为简单数据绑定和复杂数据绑定,接下来将讲解这两种类型的数据绑定。
2.简单数据绑定
简单数据绑定包括绑定默认数据类型、绑定简单数据类型、绑定POJO类型、绑定包装POJO等。
2.1 绑定默认数据类型
当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。
常用的默认参数类型如下。
- HttpServletRequest:通过request对象获取请求信息。
- HttpServletResponse:通过response对象处理响应信息。
- HttpSession:通过session对象得到session中存储的对象。
- Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将Model数据填充到request域。
【示例】下面以HttpServletRequest类型的使用为例进行演示说明,具体步骤如下。
步骤01 创建一个名为chapter12的Web项目,然后将Spring MVC相关JAR包添加到项目的lib目录下,并发布到类路径中。
步骤02 在web.xml中配置Spring MVC的前端控制器等信息。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<!--配置前端过滤器-->
<servlet-name>springmvc</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>
<!--表示容器在启动时立即加载Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
步骤03 在src目录下创建Spring MVC的核心配置文件springmvc-config.xml,在该文件中配置组件扫描器和视图解析器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--指定需要扫描的包-->
<context:component-scan base-package="com.ssm.controller" />
<!--定义视图解析器-->
<bean id="viewResoler"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--设置后缀-->
<property name="suffix" value=".jsp/"/>
</bean>
</beans>
步骤04 在src目录下创建一个com.ssm.controller包,在该包下创建一个用于用户操作的控制器类UserController。
package com.ssm.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//@Controller 注解
@Controller
public class UserController {
//@RequestMapping注解在方法上
@RequestMapping(value="/selectUser")
public String selectUser(HttpServletRequest request){//获取请求地址中的参数id的值
String id=request.getParameter ("id");System. out.println ("id="+id);
return "success";
}
}
在UserController.java文件中,使用注解方式定义了一个控制器类,同时定义了方法的访问路径。在方法参数中使用了HttpServletRequest类型,并通过该对象的getParameter()方法获取了指定的参数。为了方便查看结果,将获取的参数进行输出打印,最后返回一个名为“success”的视图,Spring MVC会通过视图解析器在“WEB-INF/jsp”路径下寻找“success.jsp”文件。
注意
后台在编写控制器类时,通常会根据需要操作的业务对控制器类进行规范命名。例如要编写一个对用户操作的控制器类,可以将控制器类命名为UserController,然后在该控制器类中就可以编写任何有关用户操作的方法。
步骤05 在WEB-INF目录下创建一个名为jsp的文件夹,然后在该文件夹中创建页面文件success.jsp,该页面只作为正确执行操作后的响应页面,没有其他业务逻辑。
<%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//w3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>入门程序</title>
</head>
<body>
ok!,执行成功。
</body>
</html>
步骤06 将chapter12项目发布到Tomcat服务器并启动,在浏览器中访问地址http://localhost:8080/chapter12?selectUser?id=1。后台方法已从请求地址中正确地获取到了id的参数信息,这说明使用默认的 HttpServletRequest参数类型已经完成了数据绑定。
2.2 绑定简单数据类型
简单数据类型的绑定就是指Java中几种基本数据类型的绑定,如int、String、Double等类型。
【示例】首先修改控制器类,将控制器类 UserController中的selectUser()方法的参数修改为使用简单数据类型的形式,修改后的代码如下。
@RequestMapping(value="/selectUser")
public String selectUser(Integer id) {
System.out.println ("id="+id);
return "success";
}
与默认数据类型案例中的selectUser()方法相比,此方法中只是将HttpServletRequest参数类型替换为了Integer类型。启动项目重新运行,会得到相同的运行结果,这说明使用简单的数据类型同样完成了数据绑定。
注意
有时前端请求中参数名和后台控制器类方法中的形参名不一样,就会导致后台无法正确绑定并接收到前端请求的参数。为此,Spring MVC提供了@RequestParam注解来进行间接数据绑定。
@RequestParam注解主要用于定义请求中的参数,在使用时可以指定它的4个属性。
@RequestParam注解的使用非常简单,假设浏览器中的请求地址为http://localhost:8080/chapter12/selectUser? User_id=1,那么在后台selectUser()方法中的使用方式如下。
@RequestMapping(value=" /selectUser")
public String selectUser(@RequestParam (value="user_id")Integer id) {
System.out.println("id="+id);
return "success" ;
}
上述代码会将请求中user_id参数的值1赋给方法中的id形参。这样通过输出语句就可以输出id形参中的值。