Spring数据绑定

数据绑定


学习目标

在这里插入图片描述

一、数据绑定介绍

1.什么是数据绑定

在这里插入图片描述

2.如何完成数据绑定

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、简单数据绑定

1.默认绑定的数据类型

在这里插入图片描述
代码演示

/**
	 * 默认支持的数据类型
	 * HttpServletRequest request
	 * HttpServletResponse repResponse
	 * HttpSession session
	 * Model model
	 * ModelMap modelMap 
	 */
	@RequestMapping(value = "selectUser")
	public String selectUser(HttpServletRequest request) {
		String id = request.getParameter("id");
		System.out.println("id=" + id);
		return "success";
	}

只需自己在创建一个sucess.jsp的视图即可(由于已经创建视图解析器,只续写sucess即可)

2.简单数据绑定类型

代码演示

@RequestMapping(value = "selectUser")
	public String selectUser(Integer id) {
		System.out.println("id=" + id);
		return "success";
	}

缺点:
在这里插入图片描述

就是在访问的时候需要格式想同(请求参数名称相同)比如此代码访问

http://localhost:8080/chapter12/selectUser?id=2

固定格式为?id=**
解决方法:
在这里插入图片描述
代码演示

@RequestMapping(value = "selectUser")
	public String selectUser(@RequestParam(value="user_id",required = true,defaultValue = "1")Integer id) {
		System.out.println("id=" + id);
		return "success";
	}

3.绑定POJO类型

在这里插入图片描述
代码演示(以注册为例):
1.创建User类



2.测试代码

/**
		 * 想用户注册页面跳转
		 */
		@RequestMapping("/toRegister")
		public String toRegister(){
			return "register";
		}
		/**
		 * 接受用户注册信息
		 */
		@RequestMapping("/registerUser")
		public String registerUser(User user) {
			String username = user.getUsername();
			String password = user.getPassword();
			System.out.println(username);
			System.out.println(password);
			return "register";
			
		}

3.定义视图模板 register

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

注:①:若传入参数为中文则会出现乱码问题,故应配置过滤器

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

注:②
在这里插入图片描述

4.绑定包装POJO

在这里插入图片描述
实例演示:
1.创建Orders实体类:

public class Orders {
	private Integer ordersId;
	//关键
	private User user;
	public Integer getOrdersId() {
		return ordersId;
	}
	public void setOrdersId(Integer ordersId) {
		this.ordersId = ordersId;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	@Override
	public String toString() {
		return "Orders [ordersId=" + ordersId + ", user=" + user + "]";
	}
	

}

2.测试(创建Controller类):

@Controller
public class OrdersController {
	
	@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";
	}

}

3.orders视图

<form action="${pageContext.request.contextPath }/findOrdersWithUser" method="post">
订单编号:<input type="text" name="ordersId"/><br>
<!-- 由于创建的只有user实体类,想要获取名字可以用XX.XX的方法(我我们已经在Orders里创建了User的属性) -->
所属用户:<input type="text" name="user.username"/><br>
<input type="submit" value="提交">

</form>

4.测试结果
在这里插入图片描述

5.自定义数据绑定

在这里插入图片描述
两种方法:
在这里插入图片描述
代码演示
方法一:
实现Converter接口
1.自定义类型转化器

public class DataConverter implements Converter<String, Date>{

	//定义日期格式
	private String datePattern = "yyyy-MM-dd HH:mm:ss";

	@Override
	public Date convert(String source) {
		//格式化日期
		SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
		
		try {
			return sdf.parse(source);
		} catch (ParseException e) {
			throw new IllegalArgumentException("无限的日期格式,请使用这种格式:"+datePattern);
		}
	}

}

2.在核心配置文件中声明

<!-- 显示的装配自定义类型转换器 -->
	<mvc:annotation-driven
		conversion-service="conversionService" />
	<!-- 自定义类型转化器 -->
	<bean id="conversionService"
		class="org.springframework.context.support.ConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="pdsu.edu.convert.DataConverter" />
			</set>
		</property>
	</bean>

注:此过程需要配置mvc的命名空间

xmlns:mvc="http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd

还要配置mvc的约束
步骤Window——>Preferences
在这里插入图片描述
在这里插入图片描述
将后面的复制到Key的最后面,点ok即可
3.测试类

@Controller
public class DateControlle {
	
	/**
	 * 使用自定义数据绑定日期数据
	 * 
	 */
	@RequestMapping("/customerDate")
	public String customerDate(Date date) {
		System.out.println("date="+date);
		return "success";
	}
}

方法二:
实现Formatter接口
1.自定义类型转化器

public class DateFormatter implements Formatter<Date> {
	// 定义日期格式
	private String datePattern = "yyyy-MM-dd HH:mm:ss";
	// 声明SimpleDateFormat对象
	private SimpleDateFormat simpleDateFormat;

	@Override
	//在此输出
	public String print(Date date, Locale locale) {

		return new SimpleDateFormat().format(date);
	}

	@Override
	public Date parse(String source, Locale locale) throws ParseException {
		simpleDateFormat = new SimpleDateFormat(datePattern);
		return simpleDateFormat.parse(source);
	}

}

2.核心文件配置

<!-- 自定义类型格式化转化器 配置 -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="formatters">
			<set>
				<bean class="pdsu.edu.convert.DateFormatter"></bean>
			</set>
		</property>

	</bean>

三、复杂数据绑定

1.绑定数组

在这里插入图片描述
在这里插入图片描述
测试代码:
1.创建User视图

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户列表</title>
</head>
<body>

	<form action="${pageContext.request.contextPath }/delectUsers"
		method="post">
		<table width="20%" border="1">
			<tr>
				<td>选择</td>
				<td>用户名</td>
			</tr>
			<tr>
				<td><input name="ids" value="1" type="checkbox" /></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>

2.测试

/**
		 * 向用户删除页面
		 */
		@RequestMapping("/toUser")
		public String toUser(){
			return "user";
		}
		/**
		 * 接收批量删除的方法
		 */
		@RequestMapping("/delectUsers")
		//接收的为整形数组 后面的要跟前端传来的name值相同,这里都是ids
		public String delectUsers(Integer[] ids) {
			if(ids != null) {
				for (Integer id : ids) {
					System.out.println("删除了id为"+id+"的用户!");
				}
			}else {
				System.out.println("ids=null");
			}
			return "success";
			
		}

3.结果
在这里插入图片描述

2.绑定集合

在这里插入图片描述
1.创建包装类

package pdsu.edu.pojos;

import java.util.List;

/**
 * 用户包装类
 */
public class UserVo {

	private List<User> users;

	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> users) {
		this.users = users;
	}

	public String toString() {
		return "UserVo [users=" + users + "]";
	}

}

2.编写视图

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户列表</title>
</head>
<body>

	<form action="${pageContext.request.contextPath }/editUsers"
		method="post">
		<table width="30%" border="1">
			<tr>
				<td>选择</td>
				<td>用户名</td>
			</tr>
			<tr>
			<!-- name值为包装类List集合的属性+[]+User里面属性 -->
				<td><input name="users[0].id" value="1" type="checkbox" /></td>
				<td><input name="users[0].username" value="tom" 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>

3.测试:

	/**
		 * 向用户批量修改页面跳转
		 */
		@RequestMapping("/toUser_edit")
		public String toUser_edit(){
			return "user_edit";
		}
		/**
		 * 接收批量修改用户的方法
		 */
		@RequestMapping("/editUsers")
		//接收的为整形数组 后面的要跟前端传来的name值相同,这里都是ids
		public String editUsers(UserVo userList) {
			//将所有用户数据封装在集合中
			List<User> users = userList.getUsers();
			//循环输出
			for (User user : users) {
				//如果接受的用户id不为空,则说明进行了修改
				if(user.getId()!=null) {
					System.out.println("修改了id为"+user.getId()+"的用户,用户名为:"+user.getUsername());
				}
				
			}
			
			return "success";
		}

四、小结

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值