需求描述及提出问题
最近几天在写项目后端定义的实体类中的日期时间类型由java.util.Date改变为
JDK8提供的java.time.LocalDateTime或者java.time.LocalDate,那么随着变化的还有前端JSP页面怎么格式化日期时间?使用java.util.Date时,前端JSP页面格式化时间是由官方JSTL提供的L格式化标签,只要在JSP页面引入以下链接:
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
那么就可以使用日期时间格式化标签
或者
因此后端方法变化,前端JSP怎么调整?
准备工作:
DateTimeUtil工具类源码:
package com.huajin.common.util;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* 时间日期工具流
*
* @author hongwei.lian
* @date 2019年8月8日 下午12:43:38
*/
public class DateTimeUtil {
private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
private DateTimeUtil() {}
/**
* 静态内部类对象=实例
*
* @author hongwei.lian
* @date 2019年8月8日 下午12:59:52
*/
private static class StaticSingletonHolder {
private static final DateTimeUtil INSTANCE = new DateTimeUtil();
}
/**
* 获取实例
*
* @return
* @author hongwei.lian
* @date 2019年8月8日 下午1:00:17
*/
public static DateTimeUtil getInstance() {
return StaticSingletonHolder.INSTANCE;
}
public static String localDateTimeToDateString(LocalDateTime localDateTime, String pattern) {
return localDateTimeToDateString(localDateTime, new String[] {pattern});
}
/**
* 将LocalDateTime转换为指定的时间字符串
*
* @param localDateTime
* @param pattern
* @return
* @author hongwei.lian
* @date 2019年8月8日 下午1:00:25
*/
public static String localDateTimeToDateString(LocalDateTime localDateTime, String... pattern) {
if (Objects.isNull(localDateTime)) {
return "";
}
if (Objects.isNull(pattern) || Objects.equals(pattern.length, 0)) {
pattern = new String[] {DEFAULT_DATE_TIME_FORMAT};
}
return DateTimeFormatter.ofPattern(pattern[0]).format(localDateTime);
}
public static String localDateToDateString(LocalDate localDate, String pattern) {
return localDateToDateString(localDate, new String[] {pattern});
}
/**
* 将LocalDate转换为指定的时间字符串
*
* @param localDate
* @param pattern
* @return
* @author hongwei.lian
* @date 2019年8月8日 下午1:00:57
*/
public static String localDateToDateString(LocalDate localDate, String... pattern) {
if (Objects.isNull(localDate)) {
return "";
}
if (Objects.isNull(pattern) || Objects.equals(pattern.length, 0)) {
pattern = new String[] {DEFAULT_DATE_FORMAT};
}
return DateTimeFormatter.ofPattern(pattern[0]).format(localDate);
}
public static String localTimeToDateString(LocalTime localTime, String pattern) {
return localTimeToDateString(localTime, new String[] {pattern});
}
/**
* 将LocalTime转换为指定的时间字符串
*
* @param localTime
* @param pattern
* @return
* @author hongwei.lian
* @date 2019年8月8日 下午1:01:00
*/
public static String localTimeToDateString(LocalTime localTime, String... pattern) {
if (Objects.isNull(localTime)) {
return "";
}
if (Objects.isNull(pattern) || Objects.equals(pattern.length, 0)) {
pattern = new String[] {DEFAULT_TIME_FORMAT};
}
return DateTimeFormatter.ofPattern(pattern[0]).format(localTime);
}
}
第一种方法:通用方式
前端只要有格式化日期时间的页面,那么对应的这个请求方法返回的request作用域中就要返回DateTimeUtil这个工具类,如下所示:
super.request().setAttribute("DateTimeUtil", DateTimeUtil.getInstance());
前端JSP页面使用:
${DateTimeUtil.localDateToDateString(obj.expireDate, 'yyyy-MM-dd')}
或者
${DateTimeUtil.localDateTimeToDateString(obj.buyTimeStart, 'yyyy-MM-dd HH:mm:ss')}
第二种方法:自定义JSTL函数
首先看JSTL函数是怎么使用的:
JSP页面引入:
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
点击uri进入JSTL定义的fn.tld文件
JSTL 1.1 functions library
JSTL functions
1.1
fn
http://java.sun.com/jsp/jstl/functions
Tests if an input string contains the specified substring.
contains
org.apache.taglibs.standard.functions.Functions
boolean contains(java.lang.String, java.lang.String)
<c:if test="${fn:contains(name, searchString)}">
Tests if an input string contains the specified substring in a case insensitive way.
containsIgnoreCase
org.apache.taglibs.standard.functions.Functions
boolean containsIgnoreCase(java.lang.String, java.lang.String)
<c:if test="${fn:containsIgnoreCase(name, searchString)}">
Tests if an input string ends with the specified suffix.
endsWith
org.apache.taglibs.standard.functions.Functions
boolean endsWith(java.lang.String, java.lang.String)
<c:if test="${fn:endsWith(filename, ".txt")}">
Escapes characters that could be interpreted as XML markup.
escapeXml
org.apache.taglibs.standard.functions.Functions
java.lang.String escapeXml(java.lang.String)
${fn:escapeXml(param:info)}
Returns the index withing a string of the first occurrence of a specified substring.
indexOf
org.apache.taglibs.standard.functions.Functions
int indexOf(java.lang.String, java.lang.String)
${fn:indexOf(name, "-")}
Joins all elements of an array into a string.
join
org.apache.taglibs.standard.functions.Functions
java.lang.String join(java.lang.String[], java.lang.String)
${fn:join(array, ";")}
Returns the number of items in a collection, or the number of characters in a string.
length
org.apache.taglibs.standard.functions.Functions
int length(java.lang.Object)
You have ${fn:length(shoppingCart.products)} in your shopping cart.
Returns a string resulting from replacing in an input string all occurrences
of a "before" string into an "after" substring.
replace
org.apache.taglibs.standard.functions.Functions
java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)
${fn:replace(text, "-", "")}
Splits a string into an array of substrings.
split
org.apache.taglibs.standard.functions.Functions
java.lang.String[] split(java.lang.String, java.lang.String)
${fn:split(customerNames, ";")}
Tests if an input string starts with the specified prefix.
startsWith
org.apache.taglibs.standard.functions.Functions
boolean startsWith(java.lang.String, java.lang.String)
<c:if test="${fn:startsWith(product.id, "100-")}">
Returns a subset of a string.
substring
org.apache.taglibs.standard.functions.Functions
java.lang.String substring(java.lang.String, int, int)
P.O. Box: ${fn:substring(zip, 6, -1)}
Returns a subset of a string following a specific substring.
substringAfter
org.apache.taglibs.standard.functions.Functions
java.lang.String substringAfter(java.lang.String, java.lang.String)
P.O. Box: ${fn:substringAfter(zip, "-")}
Returns a subset of a string before a specific substring.
substringBefore
org.apache.taglibs.standard.functions.Functions
java.lang.String substringBefore(java.lang.String, java.lang.String)
Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
Converts all of the characters of a string to lower case.
toLowerCase
org.apache.taglibs.standard.functions.Functions
java.lang.String toLowerCase(java.lang.String)
Product name: ${fn.toLowerCase(product.name)}
Converts all of the characters of a string to upper case.
toUpperCase
org.apache.taglibs.standard.functions.Functions
java.lang.String toUpperCase(java.lang.String)
Product name: ${fn.UpperCase(product.name)}
Removes white spaces from both ends of a string.
trim
org.apache.taglibs.standard.functions.Functions
java.lang.String trim(java.lang.String)
Name: ${fn.trim(name)}
JSP页面使用JSTL函数:
可以查看Java Web学习(27): JSTL学习(五)
通过上述JSTL函数的使用方式可以总结出我们自己也是可以自定义JSTL函数的,
第一步:定义日期时间工具类com.huajin.common.util.DateTimeUtil
需要注意的是在测试的过程中由于DateTimeUtil最初定义的便是使用可变参数列表作为参数的方法,但在程序运行时却找不到格式化日期时间方法,最终在工具类中增加了三个蛋参数的格式化日期时间方法
第二步:在项目/webapps/WEB-INF/目录下建立tlds目录,然后新建fns.tld文件
编写如下内容:
JSTL 1.1 functions library
JSTL functions sys
1.1
fns
http://java.sun.com/jsp/jstl/functionss
格式化日期时间
localDateTimeToDateString
com.huajin.common.util.DateTimeUtil
java.lang.String localDateTimeToDateString(java.time.LocalDateTime, java.lang.String)
格式化日期
localDateToDateString
com.huajin.common.util.DateTimeUtil
java.lang.String localDateToDateString(java.time.LocalDate, java.lang.String)
格式化时间
localTimeToDateString
com.huajin.common.util.DateTimeUtil
java.lang.String localTimeToDateString(java.time.LocalTime, java.lang.String)
JSP页面引入:
<%@ taglib prefix="fns" uri="http://java.sun.com/jsp/jstl/functionss" %>
或者
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>
使用:
${fns:localDateTimeToDateString(obj.buyTimeEnd, "yyyy-MM-dd HH:mm:ss")}
${fns:localDateToDateString(obj.expireDate, "yyyy-MM-dd")}
${fns:localTimeToDateString(obj.buyTime, "HH:mm:ss")}
通过这段时间的开发又一次感受到基础重要性,这两天翻到上大学期间写的JSTL学习博客感受颇多,那么时候仅仅是学习,现在再次看又
有了不一样的感受,常常翻翻之前写的东西还是发现不少错的地方和模糊的地方,常读常新。
贴出上大学时期的几篇JSTL作为参考:
Java Web学习(23): JSTL学习(一)
Java Web学习(24): JSTL学习(二)
Java Web学习(25): JSTL学习(三)
Java Web学习(26): JSTL学习(四)
Java Web学习(27): JSTL学习(五)
参考文章:
jsp的三种自定义标签 写法示例
[JSP]tld在项目中的应用