从自定义JSP标记导出范围的var

时间:2015-01-23 19:06:35

标签: jsp jstl jsp-tags var

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

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

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

这就是我对标签定义的看法,减去无关的细节(假设包含cfmt taglib,以及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>

1 个答案:

答案 0 :(得分:0)

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

E.g。如果你需要它作为请求范围:

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

或页面范围:

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