我正在编写一个JSP,有时需要格式化来自请求的Java Date。我是这样做的:
<fmt:formatDate value="${attribute.value}" pattern="yyyy-MM-dd HH:mm:ss"/>
它在Java日期上运行得非常好。
但是,有时候具有完全相同名称(attribute.value
)的请求属性字段实际上并不是日期,因此不应将其格式化。我想做的只是简单地将该字符串传递给fmt:format
标记,而不是在不可解析的日期抛出异常。
我可以使用c:choose
来完成类似的事情,但我宁愿尽可能地将JSP视图与基础数据分开,所以这对我来说不是理想的选择。那么,有没有办法制作像
<fmt:formatDate value="I AM NOT A DATE" pattern="yyyy-MM-dd HH:mm:ss"/>
简单地评估
I AM NOT A DATE
在生成的HTML中?
答案 0 :(得分:3)
制作一个标签:-)这样你就可以在你的标签文件中定义c:choose,并在你的JSP中只有一条与你所拥有的几乎相同的简洁线,例如:
<your:formatDate value="I AM NOT A DATE" pattern="yyyy-MM-dd HH:mm:ss"/>
(或者如果你总是使用相同的模式,你甚至可以将它硬编码到你的标签中,使上面更清洁。)
如果您对自定义标记有疑问,请回复。
编辑:如果您想尝试,可以使用以下方法为此制作标记:
1)使用以下代码制作“WEB-INF / tags / someNamespace / yourTag.tag”:
<%@ tag isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="date" type="java.util.Date" required="true" %>
<c:choose>
<c:when test="${date instanceOf java.util.Date}">
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
</c:when>
<c:otherwise>${date}</c:otherwise>
</c:choose>
2)将标签添加到您的页面:
<%@ taglib tagdir="/WEB-INF/tags/someNamespace" prefix="s" %>
3)使用它:
<s:yourTag date="${attribute.date}"/>
正如你所看到的,它真的不需要那么多代码,如果你最终在其他地方重复这个逻辑,你会发现自定义标签非常方便。
答案 1 :(得分:3)
这很简单:
<c:catch var="ex">
<fmt:formatDate value="${attribute.value}" pattern="yyyy-MM-dd HH:mm:ss"/>
</c:catch>
<c:if test="${not empty ex}">
${attribute.value}
</c:if>
不像我希望的那样优雅,但它有效。