从自定义 JSP 标签导出作用域变量

Export scoped var from custom JSP tag

在JSTL fmt标签库中是标签formatDate,它有一个可选属性var。使用 formatDate 标签时,您可以通过 var 属性传入一个字符串,指定将要创建的变量的名称,其值将是格式化的日期字符串。

不幸的是,Java(自 Java 8 起)不支持我需要的汤加和萨摩亚语言环境。因此,一位同事创建了一个自定义日期格式化标签,基本上只是使用 fmt:formatDate 格式化日期,然后(在汤加和萨摩亚语中)用适当的翻译替换日期名称和月份名称值。但是,此自定义标记仅输出(使用 c:out)结果,我想增强自定义标记以能够创建变量,就像 fmt:formatDate 一样。不幸的是,我不知道如何。

c:set 不允许在其 var 属性中使用表达式,并且出于某种原因 pageContext 在自定义标记文件 (date-formatter.tag) 中为空。

所以这是我对标签定义的内容,减去无关的细节(假设包含 cfmt 标签库,以及 dateFormatterLocale 变量):

<%@attribute name="value" type="java.util.Date" required="true" rtexprvalue="true" description="..." @>
<%@attribute name="type" required="true" rtexprvalue="true" description="..." %>
<%@attribute name="pattern" required="true" rtexprvalue="true" description="..." %>
<%@attribute name="var" required="false" rtexprvalue="false" description="..." %>

<fmt:formatDate type="${type}" pattern="${pattern}" value="${value}" var="dfFormattedDate" />
<c:if test="${((dateFormatterLocale == 'to') || (dateFormatterLocale == 'sm'))}">
    ...
    [stuff to translate day names and month names]
    ...
</c:if>
<c:choose>
    <c:when test="${not empty var}">
        <%-- SOMEHOW SET VARIABLE WHOSE NAME IS THE VALUE OF "var" AND WHOSE VALUE IS THE VALUE OF dfFormattedDate --%>
    </c:when>
    <c:otherwise>
        <c:out value="${dfFormattedDate}" />
    </c:otherwise>
</c:choose>

在所需范围图上使用 <c:set>target,在 ${var} 上使用 property

例如如果你需要它在请求范围内:

<c:set target="${requestScope}" property="${var}" value="${dfFormattedDate}" />

或页面范围:

<c:set target="${pageScope}" property="${var}" value="${dfFormattedDate}" />