通过学习官方给定JSTL函数来自定义JSTL函数格式化JDK8日期时间

需求描述及提出问题

最近几天在写项目后端定义的实体类中的日期时间类型由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" %>

那么就可以使用日期时间格式化标签<fmt:formatDate>,例如:

<fmt:formatDate value="${user.beginDate}" pattern="yyyy-MM-dd"/>

或者

<fmt:formatDate value="${obj.eventTime}" pattern="yyyy-MM-dd HH:mm:ss"/>

因此后端方法变化,前端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文件

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
    
  <description>JSTL 1.1 functions library</description>
  <display-name>JSTL functions</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>fn</short-name>
  <uri>http://java.sun.com/jsp/jstl/functions</uri>

  <function>
    <description>
      Tests if an input string contains the specified substring.
    </description>
    <name>contains</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:contains(name, searchString)}">
    </example>
  </function>

  <function>
    <description>
      Tests if an input string contains the specified substring in a case insensitive way.
    </description>
    <name>containsIgnoreCase</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean containsIgnoreCase(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:containsIgnoreCase(name, searchString)}">
    </example>
  </function>

  <function>
    <description>
      Tests if an input string ends with the specified suffix.
    </description>
    <name>endsWith</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean endsWith(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:endsWith(filename, ".txt")}">
    </example>
  </function>

  <function>
    <description>
      Escapes characters that could be interpreted as XML markup.
    </description>
    <name>escapeXml</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String escapeXml(java.lang.String)</function-signature>
    <example>
      ${fn:escapeXml(param:info)}
    </example>
  </function>

  <function>
    <description>
      Returns the index withing a string of the first occurrence of a specified substring.
    </description>
    <name>indexOf</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>int indexOf(java.lang.String, java.lang.String)</function-signature>
    <example>
      ${fn:indexOf(name, "-")}
    </example>
  </function>

  <function>
    <description>
      Joins all elements of an array into a string.
    </description>
    <name>join</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String join(java.lang.String[], java.lang.String)</function-signature>
    <example>
      ${fn:join(array, ";")}
    </example>
  </function>

  <function>
    <description>
      Returns the number of items in a collection, or the number of characters in a string.
    </description>
    <name>length</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>int length(java.lang.Object)</function-signature>
    <example>
      You have ${fn:length(shoppingCart.products)} in your shopping cart.
    </example>
  </function>

  <function>
    <description>
      Returns a string resulting from replacing in an input string all occurrences
      of a "before" string into an "after" substring.
    </description>
    <name>replace</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)</function-signature>
    <example>
      ${fn:replace(text, "-", "&#149;")}
    </example>
  </function>

  <function>
    <description>
      Splits a string into an array of substrings.
    </description>
    <name>split</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String[] split(java.lang.String, java.lang.String)</function-signature>
    <example>
      ${fn:split(customerNames, ";")}
    </example>
  </function>

  <function>
    <description>
      Tests if an input string starts with the specified prefix.
    </description>
    <name>startsWith</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>boolean startsWith(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:startsWith(product.id, "100-")}">
    </example>
  </function>

  <function>
    <description>
      Returns a subset of a string.
    </description>
    <name>substring</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String substring(java.lang.String, int, int)</function-signature>
    <example>
      P.O. Box: ${fn:substring(zip, 6, -1)}
    </example>
  </function>

  <function>
    <description>
      Returns a subset of a string following a specific substring.
    </description>
    <name>substringAfter</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String substringAfter(java.lang.String, java.lang.String)</function-signature>
    <example>
      P.O. Box: ${fn:substringAfter(zip, "-")}
    </example>
  </function>

  <function>
    <description>
      Returns a subset of a string before a specific substring.
    </description>
    <name>substringBefore</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String substringBefore(java.lang.String, java.lang.String)</function-signature>
    <example>
      Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
    </example>
  </function>

  <function>
    <description>
      Converts all of the characters of a string to lower case.
    </description>
    <name>toLowerCase</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String toLowerCase(java.lang.String)</function-signature>
    <example>
      Product name: ${fn.toLowerCase(product.name)}
    </example>
  </function>

  <function>
    <description>
      Converts all of the characters of a string to upper case.
    </description>
    <name>toUpperCase</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
    <example>
      Product name: ${fn.UpperCase(product.name)}
    </example>
  </function>

  <function>
    <description>
      Removes white spaces from both ends of a string.
    </description>
    <name>trim</name>
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
    <function-signature>java.lang.String trim(java.lang.String)</function-signature>
    <example>
      Name: ${fn.trim(name)}
    </example>  
  </function>

</taglib>

JSP页面使用JSTL函数:

可以查看Java Web学习(27): JSTL学习(五)

通过上述JSTL函数的使用方式可以总结出我们自己也是可以自定义JSTL函数的,

第一步:定义日期时间工具类com.huajin.common.util.DateTimeUtil

需要注意的是在测试的过程中由于DateTimeUtil最初定义的便是使用可变参数列表作为参数的方法,但在程序运行时却找不到格式化日期时间方法,最终在工具类中增加了三个蛋参数的格式化日期时间方法

第二步:在项目/webapps/WEB-INF/目录下建立tlds目录,然后新建fns.tld文件

编写如下内容:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">

  <description>JSTL 1.1 functions library</description>
  <display-name>JSTL functions sys</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>fns</short-name>
  <uri>http://java.sun.com/jsp/jstl/functionss</uri>

  <function>
    <description>格式化日期时间</description>
    <name>localDateTimeToDateString</name>
    <function-class>com.huajin.common.util.DateTimeUtil</function-class>
    <function-signature>java.lang.String localDateTimeToDateString(java.time.LocalDateTime, java.lang.String)</function-signature>
  </function>
  
  <function>
    <description>格式化日期</description>
    <name>localDateToDateString</name>
    <function-class>com.huajin.common.util.DateTimeUtil</function-class>
    <function-signature>java.lang.String localDateToDateString(java.time.LocalDate, java.lang.String)</function-signature>
  </function>
  
  <function>
    <description>格式化时间</description>
    <name>localTimeToDateString</name>
    <function-class>com.huajin.common.util.DateTimeUtil</function-class>
    <function-signature>java.lang.String localTimeToDateString(java.time.LocalTime, java.lang.String)</function-signature>
  </function>
  
</taglib>

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在项目中的应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值