在表单提交的时候,我们会遇到这样的一个问题就是,如果一个表单的数据有很多的时候,我们在后端使用控制器接收数据的时候就需要定义很多参数来接收传递过的数据,非常的麻烦,所以本篇文章将带领大家实现使用“对象接收数据”以及如何自定义一个日期转换器
目录
一、控制器使用对象接受数据:
1.1 案例准备工作
1.2 控制器不使用对象接收数据
1.3控制器使用对象接受数据
1.4控制器使用对象接收数据时注意事项
二、自定义日期转换器:
2.1 不使用自定义日期转换器所面临的问题
2.2 设计自定义日期转换器“yyyy年mm月dd日”
2.3 配置转换器工厂
一、控制器使用对象接收数据:
1.1 案例准备工作
准备一个实体类book,并设置构造器以及getter、Setter方法
package com.xgsm.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.Date;
public class Book {
private String bookName;
private String bookAuthor;
private double bookPrice;
private Date bookData;
public Book() {
}
public Book(String bookName, String bookAuthor, double bookPrice, Date bookData) {
this.bookName = bookName;
this.bookAuthor = bookAuthor;
this.bookPrice = bookPrice;
this.bookData = bookData;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public Date getBookData() {
return bookData;
}
public void setBookData(Date bookData) {
this.bookData = bookData;
}
}
准备一个jsp页面,jsp页面中定义了一个表单。
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<body>
<h2>Hello World!</h2>
<form method="get" action="test/add002">
图书名称:<input type="text" name="bookName"><br>
图书作者:<input type="text" name="bookAuthor"><br>
图书价格:<input type="text" name="bookPrice"><br>
发布时间:<input type="text" name="bookData"><br>
<input type="submit">
</form>
</body>
</html>
1.2 控制器不使用对象接收数据
控制器不使用对象接受数据时需要根据表单提交的数据个数定义控制器参数的个数,控制器的书写如下列代码所示:
package com.xgsm.Controllers;
import com.xgsm.pojo.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
/**
* Description: SpringMvc_Demo01
* Created by WuHuaSen .
* Created Date: 2022/4/30 14:10
* Version: V1.0
*/
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/add002")
public String add002(@RequestParam String bookname, @RequestParam String authorname, @RequestParam int bookPrice, @RequestParam Date bookDate) {
System.out.println(bookname);
System.out.println(authorname);
System.out.println(bookPrice);
System.out.println(bookDate);
return "tips";
}
}
1.3 控制器使用对象接受数据
使用对象接受数据的时候,只需要在控制器中定义一个表单提交数据类型的类即可,不再需要再一一定义参数,具体代码如下:
package com.xgsm.Controllers;
import com.xgsm.pojo.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
/**
* Description: SpringMvc_Demo01
* Created by WuHuaSen .
* Created Date: 2022/4/30 14:10
* Version: V1.0
*/
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/add002")
public String add002(Book book) {
System.out.println(book);
System.out.println(book.getBookData());
return "tips";
}
}
前端提交数据后,控制台打印输出结果如下:
1.4 控制器使用对象接受数据时注意事项:
由于使用对象来接收表单数据的时候,实现原理是基于反射,所以实体类的属性名必须和表单的name一致,否则获取不到数据。
实体类属性名: | 表单name: |
|
|
二、自定义日期转换器:
2.1 不使用日期转换器所面临的问题
通过上面的示例,我们可以看出,当我们提交的日期为“yyyy/mm/dd”格式的时候,控制器是可以接收到数据的,但是如果在我们做项目的时候“甲方”要求使用“yyyy年mm月dd日”格式的时候,上面的表单数据控制器还可以接收到吗?我们不妨试小试一下~~
通过测试我们可以发现项目报错了,这是因为表单提交的默认日期格式是“yyyy/mm/dd”,当我们使用“yyyy年mm月dd日”格式的时候,控制器并不能识别,所以这时候就要使用自定义的日期格式。具体配置如下:
2.2 设计自定义日期转换器“yyyy年mm月dd日”
建一个util包,在包里新建一个类,这个类实现Converter接口,并实现里面的convert的方法
package com.xgsm.Util;
import org.springframework.core.convert.converter.Converter;
import java.security.PublicKey;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Description: SpringMvc_Demo01
* Created by WuHuaSen .
* Created Date: 2022/4/30 14:26
* Version: V1.0
*/
public class MyDateConverter implements Converter<String, Date> {
//定义日期转换器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日");
@Override
public Date convert(String source) {
Date date = null;
try {
//通过自定义转换器转换字符为日期类型
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
@Override
public <U> Converter<String, U> andThen(Converter<? super Date, ? extends U> after) {
return null;
}
}
设计好自定义日期类型转换器后,此时我们的控制器并不会识别,所以我们需要在spring-mvc配置文件中对转换器工厂进行配置,将我们写好的日期转换器配置进去
<?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:aop="http://www.springframework.org/schema/aop"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--声明使用注解配置-->
<Context:annotation-config/>
<!--声明Spring工厂注解的扫描范围-->
<Context:component-scan base-package="com.xgsm"/>
<!--声明mvc使用注解驱动-->
<mvc:annotation-driven conversion-service="ConversionService"/>
<!--配置转换器工厂-->
<bean id="ConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.xgsm.Util.MyDateConverter"></bean>
</set>
</property>
</bean>
<!--释放静态资源-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
</beans>
这个时候再重新加载我们的项目就会发现,日期转换成功~~~