Spring MVC数据绑定 ----从入门到精通篇(三) POJO数据类型的绑定和自定义数据绑定

前言

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

1.简单的POJO类型数据的绑定的使用

针对多类型、多参数的请求,可以使用POJO类型进行数据绑定。
POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
POIO ( Plain Ordinary Java Object意思是简单的Java对象,实际就是普通JavaBeans.
接下来通过一个用户注册案例,来演示POJO类型数据的绑定的使用。

1、在com.zsj.po包中创建用户类POJO,来封装用户注册信息

package com.zsj.po;

public class User {
	private Integer id;
	private String username;
	private Integer password;
	
	public Integer getId(){
		return id;
	}
	public void setId(Integer id){
		this.id=id;
	}
	public String getUsername(){
		return username;
	}
	public void setUsername(String username){
		this.username=username;
	}
	public Integer getPassword(){
		return password;
	}
	public void setPassword(Integer password){
		this.password=password;
	}
}

2、在控制器Controller中编写接收用户注册信息的方法和向注册页面跳转的方法

/**
	 * 接收用户注册信息
	 */
	@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";
	}
	/**
	 * 向用户注册页面跳转
	 */
	@RequestMapping("/toRegister")
	public String toRegister( ) {
	    return "register";
	}

3、在WEB-INF/jsp目录下编写用户注册页面register.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8"
	pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>注册</title>
</head>
<body>
	<form action="${pageContext.request.contextPath}/registerUser" method="post">
		用户名:<input type="text"   name="username" /><br>&nbsp;&nbsp;码:<input type="text"   name="password" /><br />
		<input type="submit" value="注册"/>
	</form>
</body>
</html>

注意: ${pageContext.request.contextPath}是 el表达式取得绝对路径的方法,等价于<%=requestgetContextPath()%>,也就是取出部署的应用程序名或者是当前的项目名称。比如项目名称是SpringMVCDataBind,在浏览器中输入为http:/localhost:8080/SpringMVCDataBind/indx.jsp,那么${pageContext.request.contextPath}或<%=requestgetContextPath/)%> 取出来的就是/SpringMVCDataBind , 而"/"代表的含义就是http://localhost:8080
4、发布Web项目、运行项目
访问http://localhost:8080/SpringMVCDataBind/toRegister返回注册页面:

到这里就完成了吗?各位猜猜看!!输出的结果是否如愿呢?
在前端请求中,难免会有中文信息传递,此时后台方法绑定接收的中文信息却就会出现了中文乱码,如下图所示:

在这里插入图片描述

如何解决请求参数中的乱码问题呢?

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

修改的web.xml如下:

<?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>
 		<load-on-startup>1</load-on-startup>
 		</servlet>
 		<servlet-mapping>
 			<servlet-name>springmvc</servlet-name>
 			<url-pattern>/</url-pattern>
 		</servlet-mapping>
	<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>
</web-app>

输出结果如下:
在这里插入图片描述在这里插入图片描述

2.绑定包装POJO数据类型

也许有小伙伴会有些疑问?上面的博客不是才将POJO吗?这两者都有什么区别呢?
其实包装POJO相当于给这些多类型,多参数的请求分类。

例如:在用户查询订单时,页面传递的参数可能包括:订单编号、用户名称等信息,这就包含了订单和用户两个对象的信息,此时后台方法如何绑定请求信息呢?采用POJO吗?方法可用,但订单和用户信息混合封装,显得比较混乱,
除此之外,还可以考虑使用包装POJO类型绑定所谓的包装POJO,就是在一个POJO中包含另一个简单POJO。例如,在订单对象中包含用户对象。这样在使用时,就可以通过订单查询到用户信息。

1、在com.zsj .po包中创建订单类Orders,用于封装订单和用户信息

package com.zsj.po;
/**
 * 订单POJO
 */
public class Orders {
	private Integer ordersId; // 订单编号
	private User user;          // 用户POJO,所属用户
	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;
	}
}

2、在com.zsj controller包中创建一个订单控制器类OrdersController

package com.zsj.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zsj.po.Orders;
import com.zsj.po.User;
@Controller
public class OrdersController {
	/**
	 * 向订单查询页面跳转
	 */
	@RequestMapping("/tofindOrdersWithUser")
	public String tofindOrdersWithUser( ) {
	    return "orders";
	}
	/**
	 * 查询订单和用户信息
	 */
	@RequestMapping("/findOrdersWithUser")
	public String findOrdersWithUser(Orders orders) {
	    Integer orderId = orders.getOrdersId();
	    User user = orders.getUser();
	    String username = user.getUsername();
	    System.out.println("orderId="+orderId);
	    System.out.println("username="+username);
	    return "success";
	}
}

3、在WEB-INF/jsp目录下编写订单查询页面orders jisp

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

4、发布Web项目、运行项目
访问http:/localhost:8080/SpringMVCDataBind/tofindOrdersWithUser进入订单查询页面:

输出结果:
在这里插入图片描述
在这里插入图片描述

3.自定义数据绑定-日期数据的转换

为什么我还要在讲解一种数据绑定形式呢?
一般情况下,使用基本数据类型和POJO类型的参数数据已经能够满足需求,然而有些特殊类型的参数是无法在后台进行直接转换的,但也有特殊数据类型无法直接进行数据绑定,必须先经过数据转换例如日期数据前台提供的**字符串“2020-04-19”或“2020/04/19 "需要转换为后台的java.utti.lDate类型,就需要开发者自定义转换器( Converter )威格式化( Formatter )**来进行数据绑定。
在这里插入图片描述
在这里插入图片描述
由上所知,converter比Formatter更加全面一些,所以我们这里以Converter为例,

1、在com.zsj.convert包中创建日期转换类DateConverter

package com.zsj.convert;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
/**
 * 自定义日期转换器
 */
public class DateConverter 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、在Spring配置文件中配置自定义转换器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  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/mvc
  http://www.springframework.org/schema/mvc/spring-mvc-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.zsj.controller" />
	<bean id="viewResolver"
			class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/WEB-INF/jsp/" />	
			<property name="suffix" value=".jsp" />	
	</bean>
	<!-- 显示的装配自定义类型转换器 --> 
	<mvc:annotation-driven conversion-service="conversionService" />
	<!-- 自定义类型转换器配置 -->
	<bean id="conversionService" class=
     "org.springframework.context.support.ConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="com.zsj.convert.DateConverter" />
			</set>
		</property>
	</bean> 
</beans>

3、在com.zsj.controller包中创建一个日期控制器类DateController

package com.zsj.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 日期控制器类
 */
@Controller
public class DateController {
	/**
	 * 使用自定义类型数据绑定日期数据
	 */
	@RequestMapping("/customDate")
	public String CustomDate(Date date) {
	    System.out.println("date="+date);
	    return "success";
	}
}

4、发布Web项目、运行项目
访问http://localhost:8080/SpringMVCDataBind/customDate?date=2020-04-19 17:38:38控制台打印信息如下, 可以看
出,使用自定义类型转换器已从请求中正确获取到了曰期信息,这就是自定义数据绑定
在这里插入图片描述
以上就是关于POJO类型和自定义类型的相关叙述。
希望我的博客对你有所帮助!!!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值