数据绑定
文章目录
学习目标
一、数据绑定介绍
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>
密 码:<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";
}