前言:
在使用简单数据类型绑定时,可以很容易的根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求可能会传递多个不同类型的参数数据,如果还使用简单数据类型进行绑定,那么就需要手动编写多个不同类型的参数,这种操作显然比较繁琐。
那么我们将采取何种方式处理呢?如果是某种特殊类型的请求,我们又该如何?
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>
密 码:<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类型和自定义类型的相关叙述。
希望我的博客对你有所帮助!!!