1.数据绑定介绍

在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中。这种将请求消息数据与后台方法参数建立连接的过程就是Spring MVC中的数据绑定。

1.1Spring MVC完成的数据绑定的方法:

在数据绑定过程中,Spring MVC框架会通过数据绑定组件(DataBinder)将请求参数串的内容进行类型转换,然后将转换后的值赋给控制器类中方法的形参,这样后台方法就可以正确绑定并获取客户端请求携带的参数了。

接下来,将通过一张数据流程图来介绍数据绑定的过程。

1.Spring MVC将ServletRequest对象传递给DataBinder;

2.将处理方法的入参对象传递给DataBinder;

3.DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,并将ServletRequest对象中的消息填充到参数对象中;

4.调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验;

5.校验完成后会生成数据绑定结果BindingResult对象,Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数。

2.数据绑定的分类:

根据客户端请求参数类型和个数的不同,我们将Spring MVC中的数据绑定主要分为简单数据绑定和复杂数据绑定。

2.1 简单数据绑定

2.1.1 绑定默认数据类型

当前端请求的参数比较简单时,可以在后台方法的形参中直接使用Spring MVC提供的默认参数类型进行数据绑定。

常用默认参数类型如下:

  • HttpServletRequest:通过request对象获取请求信息;

  • HttpServletResponse:通过response处理响应信息;

  • HttpSession:通过session对象得到session中存放的对象;

  • Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域。

新建一个项目,导入jar包,配置前端控制器和Spring MVC的核心文件 springmvc-config.xml,项目目录和文件如下图所示:



web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<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>
</web-app>

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-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.ma.controller"/>
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

编写UserController类

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
/**
* @author mz
* @version V1.0
* @Description: 用户控制器
* @create 2017-11-04 14:46
*/
@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页面

  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>结果页面</title>
</head>
<body>
ok
</body>
</html>

运行结果如下:



2.1.2 绑定简单数据类型

简单数据类型的绑定,就是指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";
}

2.1.3 绑定POJO类型

在使用简单数据类型绑定时,可以很容易的根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较繁琐。

针对多类型、多参数的请求,可以使用POJO类型进行数据绑定。

POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。

新建一个po包,然后创建一个User的POJO类:

public class User {
private Integer id;
private String username;
private Integer password;
//省略setter和getter方法
}

在UserController中添加接收用户信息和页面跳转的方法:

/**
* 跳转到注册页面
* @return
*/
@RequestMapping("/toRegister")
public String toRegister() {
return "register";
} /**
* 接收用户注册的信息
* @param user
* @return
*/
@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>
密&nbsp;&nbsp;&nbsp;码: <input type="text" name="password">
<input type="submit" value="注册">
</form>

在使用POJO类型数据绑定时,前端请求的参数名(本例中指form表单内各元素的name属性值)必须与要绑定的POJO类中的属性名一样

运行结果:



在前端请求中,难免会有中文信息传递,此时后台方法绑定接收的中文信息却就会出现了中文乱码,如下图所示:



为了防止前端传入的中文数据出现乱码问题,我们可以在web.xml中配置Spring提供的编码过滤器来统一编码。

<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>

再次运行,结果如下:

小结

主要是简单了解一下SpringMVC的数据绑定,学习如何绑定简单数据和POJO类型的数据以及如何处理中文乱码的问题。还有一些绑定包装POJO,自定义数据绑定,复杂数据绑定,等到下次学习时,再做总结。

Spring MVC数据绑定(一)的更多相关文章

  1. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  2. spring mvc 数据绑定

    1.spring mvc 默认提供的数据绑定类 private List<HandlerMethodArgumentResolver> getDefaultArgumentResolver ...

  3. Spring MVC 数据绑定流程分析

    1.    数据绑定流程原理★ ①   Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...

  4. spring mvc 数据绑定总结

    spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用 ...

  5. Spring MVC数据绑定大全 .

    刚开始用spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时 ...

  6. Spring MVC 数据绑定 (四)

    完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...

  7. Spring MVC数据绑定(二)

    之前学习了SpringMVC数据绑定的基本知识和简单数据绑定以及POJO类型数据的绑定.接下来总结剩下的一些数据类型的绑定 1. 绑定包装POJO 所谓的包装POJO,就是在一个POJO中包含另一个简 ...

  8. Spring MVC 数据绑定(四)

        Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型     接下 ...

  9. Spring MVC数据绑定入门总结

    1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...

随机推荐

  1. 解题:SCOI 2008 天平

    题面 我们很容易想到差分约束,但是我们建出来图之后好像并不好下手,因为我们只能得到砝码间的大小关系,并不能容易地得到每个砝码的具体重量. 于是我们有了一种神奇的思路:既然得不到具体重量我们就不求具体重 ...

  2. 嘘,如何激活更新的win10

    win10更新了,所以很坑的是以前的密钥又不管用了,系统和office都要重新激活,然而微软的更新就是很有恶意的,总之成功率堪忧. 还好看到了万能的网友的办法. slmgr.vbs /upk slmg ...

  3. bzoj3205 [Apio2013]机器人

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 953  Solved: 227[Submit][Status] ...

  4. 洛谷P1991 无线通讯网

    P1991 无线通讯网 170通过 539提交 题目提供者洛谷OnlineJudge 标签图论 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 怎么又炸了 为啥一直40!求解! UKE:inv ...

  5. 「Python」python-nmap安装与入门

    1.安装namp https://nmap.org/download.html 下载链接 PS:windows安装似乎麻烦一些,需要多下载npcap,官网有链接 2.python安装 注意,注意,注意 ...

  6. git操作图

  7. OpenCV---其他形态学操作

    一:顶帽实现(原图像与开操作图像的差值) import cv2 as cv import numpy as np def top_hat_demo(image): gray = cv.cvtColor ...

  8. ASP.NET MVC4+EasyUI+EntityFrameWork5权限管理系统——数据库的设计(一)

    快一年没写博客了,这段时间感觉好迷茫,写点博客,记录一下自己的成长过程,希望对大家也有帮助 先上图 一个用户可以有多个角色,一个用户可以属于多个部门,这些都可以控制到权限,有时特殊要求,同样的部门和角 ...

  9. MakeDown的使用

    Makedown的使用 之前有用博客园来写博客,但是因为它的界面不好看,所以中途就放弃了.后来也使用过"有道云笔记",发现其写的笔记的界面很简洁工整.有道云笔记的书写原理和Make ...

  10. codevs 1492 探案第二部

    1492 探案第二部  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description 我们伟大的 Sherlock·Holmes 先生最近遇上了一件相当棘手的案子,随 ...