数据绑定介绍

  1. 在执行程序时,SpringMVC会根据客户端请求参数的不同,
    将请求信息中的信息以一定的方式转换并绑定到控制器类的方法参数中。

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

绑定默认数据类型

常用的默认参数类型:

  • HttpServletRequest:通过request对象获取请求信息。
  • HttpServletResponse:通过response处理相应信息。
  • HttpSession:通过session对象得到session中存储的对象。
  • Model/ModelMap:Model是一个接口,ModelMap是一个接口实现,作用是将model数据填充到request域。
  1. 创建springmvc-config.xml或者创建SpringMVCConfig.java
    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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.pp.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>

SpringMVCConfig.java

package com.pp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration
@EnableWebMvc
@ComponentScan("com.pp")//扫描包 public class SpringMVCConfig implements WebMvcConfigurer { //配置jsp视图解析器
@Bean
public InternalResourceViewResolver getViewResolver(){
InternalResourceViewResolver viewResolver = new
InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
//配置静态资源的处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
} }
  1. 在com.pp.controller包下创建控制器类UserController。
package com.pp.controller;

import com.pp.pojo.User;
import com.pp.pojo.UserVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import java.util.List; /**
* @author Administrator
*/
@Controller
public class UserController {
/**
* 绑定默认数据类型
* @param request
* @return
*/
@RequestMapping("/selectUser1")
public String selectUser1(HttpServletRequest request){
String id = request.getParameter("id");
System.out.println("id=>" + id);
return "success";
} }
  1. 在WEB-INF目录下,创建一个jsp文件夹,success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>结果页面</title>
</head>
<body>
OK!
</body>
</html>

绑定简单数据类型

简单数据类型的绑定,就是指Java中几种基本数据类型的绑定,如int、String、Double等类型。

/**
* 绑定简单数据类型
* @param id
* @return
*/
@RequestMapping("/selectUser2")
public String selectUser2(Integer id){
System.out.println("id=>" + id);
return "success";
} @RequestMapping("/selectUser2")
public String selectUser2(@RequestParam(value="user_id")Integer id){
System.out.println("id=>" + id);
return "success";
}

绑定POJO类型

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

  1. 创建包com.pp.pojo包,创建User类来封装用户注册的信息参数。
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor; /**
* @author Administrator
*/ @Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private Integer id;
private String username;
private Integer password; }
  1. 在控制器UserController类中,编写接收用户注册信息和向注册页面跳转的方法。
/**
* 绑定POJO类型
*/
/**
* 向用户注册页面跳转
*/
@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);
System.out.println("password=>" + password);
return "success";
}
  1. 在WEB-INF/jsp目录下,创建一个用户注册页面register.jsp,表单需要以POST方式提交,并且在提交时会发送一条以"/registerUser"结尾的请求消息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册界面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">
用户名:<input type="text" name="username"/><br/>
密&nbsp;&nbsp;&nbsp;码:<input type="text" name="password"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>

注意:在绑定POJO类型数据时,前端请求的参数名必须要与绑定的POJO类中的属性名一致,这样才会自动将请求数据绑定到POJO对象中,否则后台接收的参数值为null

遇到问题与解决方法:
在前端请求中,难免会有中文信息传递,这时就需要配置字符编码来解决这个问题。
在web.xml中添加

 <!--配置编码过滤器-->
<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>

这样就可以解决乱码的问题啦!

绑定包装POJO

包装POJO,就是指一个POJO中包含另一个简单POJO。
例如:在订单对象中包含用户对象,这样的话可以通过订单来查询到用户信息了。
  1. 在com.pp.pojo包中创建一个订单类Orders
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Orders {
private Integer ordersId;//订单编号
private User user;//绑定用户
}
  1. 在com.pp.controller包中,创建一个OrdersController,在该类中编写一个跳转到订单查询页面的方法和一个查询订单及用户信息的方法。
import com.pp.pojo.Orders;
import com.pp.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; /**
* @author Administrator
*/ @Controller
public class OrdersController {
/**
* 向订单查询页面跳转
* @return
*/
@RequestMapping("/tofindOrdersWithUser")
public String toFindOrdersWithUser(){
return "orders";
}
/**
* 查询订单和用户信息
*/
@RequestMapping("/findOrdersWithUser")
public String findOrdersWithUser(Orders orders) {
Integer ordersId = orders.getOrdersId();
User user = orders.getUser();
String username = user.getUsername();
System.out.println("ordersId=>"+ordersId);
System.out.println("username=>"+username);
return "success";
}
}
  1. 在WEB-INF/jsp目录下,创建一个用户订单查询页面order.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>订单查询</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/findOrdersWithUser" method="post">
订单编号:<input type="text" name="ordersId"/><br/>
所属用户:<input type="text" name="user.username"/><br/>
<input type="submit" value="查询"/>
</form>
</body>
</html>

复杂数据绑定

常见的有:

  • 数组绑定
  • 集合绑定

绑定数组

在实际开发时,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况(例如批量删除),这种情况就需要使用绑定数组的方式,来完成。

  1. 在WEB-INF/jsp下新建一个展示用户信息的列表页面user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/deleteUsers" method="post">
<table width="20%" border=1>
<tr>
<td>选择</td>
<td>用户名</td>
</tr>
<tr>
<td><input name="ids" value="1" type="checkbox" checked/></td>
<td>tom</td>
</tr>
<tr>
<td><input name="ids" value="2" type="checkbox" /></td>
<td>jack</td>
</tr>
<tr>
<td><input name="ids" value="3" type="checkbox" /></td>
<td>lucy</td>
</tr>
</table>
<input type="submit" value="删除"/>
</form>
</body>
</html>
  1. 在控制器类UserController中,编写接受批量删除用户的方法
 /**
* 向用户列表页面跳转
*/
@RequestMapping("/toUser")
public String selectUsers(){
return "user";
}
/**
* 接收批量删除用户的方法
*/
@RequestMapping("/deleteUsers")
public String deleteUsers(Integer[] ids) {
if(ids != null){
for (Integer id : ids) {
System.out.println("删除了id为"+id + "的用户!");
}
}else {
System.out.println("ids=NULL");
}
return "success";
}

绑定集合

在批量删除用户的操作中,前端请求传递的都是同名参数的用户id,只需要在后台使用同一种数组类型的参数绑定接收,就可以在方法中通过循环数组参数的方式来完成删除操作。
但如果进行批量修改的时候,前端请求传递过来的数据可能就会批量包含各种类型的数据,如Integer、String等。这种情况就可以使用集合数据绑定。
即在包装类中定义一个包含用户信息类的集合,然后再接收方法中将参数类型定义为该包装类的集合。
  1. 创建com.pp.vo包,并且创建UserVO来封装用户集合属性。
/**
* 用户包装类
* @author Administrator
* 该集合属性就是用于绑定批量修改用户的数据信息
*/ @Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserVO {
private List<User> users; }
  1. 在控制器类UserController中,编写接收批量修改用户的方法,以及向用户修改页面跳转的方法
	 /**
* 向用户批量修改页面跳转
*/
@RequestMapping("/toUserEdit")
public String toUserEdit(){
return "user_edit";
}
/**
* 接受批量修改用户的方法
*UserVO类型参数用于绑定并获取页面传递过来的用户数据
*/
@RequestMapping("/editUsers")
public String editUsers(UserVO userList){
//将所有用户数据封装到集合中
List<User> users = userList.getUsers();
//循环输出所有用户信息
for (User user : users) {
//如果接受的用户id不为空,则表示对该用户进行了修改
if(!(user.getId().equals(""))){
System.out.println("修改了id为:" + user.getId()+"的用户名为:"+ user.getUsername());
}
}
return "success";
}
  1. 在WEB-INF/jsp目录下,创建页面文件user_edit.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改用户</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/editUsers" method="post" id="formid">
<table width="30%" border=1>
<tr>
<td>选择</td>
<td>用户名</td>
</tr>
<tr>
<td><input name="users[0].id" value="1" type="checkbox"/></td>
<td><input name="users[0].username" value="tome" type="text"/></td>
</tr>
<tr>
<td><input name="users[1].id" value="2" type="checkbox"/></td>
<td><input name="users[1].username" value="jack" type="text"/></td>
</tr>
</table>
<input type="submit" value="修改"/>
</form>
</body>
</html>

最后end

一定要记住配置tom运行测试!!

这次一定!

SpringMVC06——数据绑定——2021-05-09的更多相关文章

  1. 2021.05.09【NOIP提高组】模拟赛总结

    2021.05.09[NOIP提高组]模拟赛总结 T1 T2

  2. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  3. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  4. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  5. 2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP)

    2021.11.09 P3426 [POI2005]SZA-Template(KMP+DP) https://www.luogu.com.cn/problem/P3426 题意: 你打算在纸上印一串字 ...

  6. 2021.11.09 P3435 [POI2006]OKR-Periods of Words(KMP)

    2021.11.09 P3435 [POI2006]OKR-Periods of Words(KMP) https://www.luogu.com.cn/problem/P3435 题意: 对于一个仅 ...

  7. 2021.07.09 K-D树

    2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...

  8. 2021.05.03 T3 数字

    2021.05.03 T3 数字 问题描述 一个数字被称为好数字当他满足下列条件: 1. 它有**2*n**个数位,n是正整数(允许有前导0) 2. 构成它的每个数字都在给定的数字集合S中. 3. 它 ...

  9. 2021.05.14 tarjan

    2021.05.14 tarjan 标准版tarjan 这里使用数组来模拟栈 void tarjan(int x){ ++ind; dfn[x]=low[x]=ind; stacki[++top]=x ...

  10. 2021.08.09 P5658 括号树(树形结构)

    2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...

随机推荐

  1. cache操作:clean、invalidate与flush的含义

    前言 本文试图搞清楚cache几个操作:clean.invalidate与flush的含义.由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明. cache line cache ...

  2. Asp .Net Core 系列: 集成 CORS跨域配置

    目录 什么是CORS? Asp .Net Core 种如何配置CORS? CorsPolicyBuilder类详解 注册以及使用策略三种方式 EnableCors 和 DisableCors 特性 关 ...

  3. 常用的 SQL

    只知道字段名字查找表 SELECT table_name FROM information_schema.columns WHERE column_name = '字段名'; 查看不等于NULL的数据 ...

  4. 最基本的SpringCloud的搭建

    对于springcloud而言,模块是按业务进行区分的: 父工程 依赖 <parent> <groupId>org.springframework.boot</group ...

  5. openGemini v0.2.0版本正式发布:5大特性全面增强

    摘要:openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容InfluxDB API,具有高性能.高并发.高扩展等特点. openGemini是华为云面向物联网和运 ...

  6. 华为云媒体査勇:华为云在视频AI转码领域的技术实践

    摘要:为大家介绍华为云媒体处理服务在视频AI转码领域的一些技术实践. 随着5G的落地和消费终端的不断升级,消费环节对视频画质的要求也越来越高,为了给消费者带来更清晰.更逼真和更具沉浸感的观感体验,对云 ...

  7. SrpingBoot 集成 xxl-job 部署在 Docker 上碰到的坑

    如果不指定 xxl.job.executor.ip,默认会用 Docker 的IP,注册到 xxl-job 里面,这时候无法回调 如果xxl.job.executor.ip.xxl.job.execu ...

  8. MySQL 创建存储过程注意项

    MySQL server version for the  right syntax to use near 'IF' MySQL server version for the right synta ...

  9. ADB移动端及Monkey常用命令

    ADB ADB全程Android Debug Bridge,是android sdk里的一个工具,用这个工具可以直接操作管理android模拟器或者真实的android设备 它的主要功能: 运行设备的 ...

  10. Go--变量的声明

    Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性. 变量是一段或多段用来存储数据的内存,在go中,变量一旦被定义,一定要使用,不然会报错 内建变量类型 ...