从自定义 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) 中为空。
所以这是我对标签定义的内容,减去无关的细节(假设包含 c
和 fmt
标签库,以及 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}" />
在JSTL fmt
标签库中是标签formatDate
,它有一个可选属性var
。使用 formatDate
标签时,您可以通过 var
属性传入一个字符串,指定将要创建的变量的名称,其值将是格式化的日期字符串。
不幸的是,Java(自 Java 8 起)不支持我需要的汤加和萨摩亚语言环境。因此,一位同事创建了一个自定义日期格式化标签,基本上只是使用 fmt:formatDate
格式化日期,然后(在汤加和萨摩亚语中)用适当的翻译替换日期名称和月份名称值。但是,此自定义标记仅输出(使用 c:out
)结果,我想增强自定义标记以能够创建变量,就像 fmt:formatDate
一样。不幸的是,我不知道如何。
c:set
不允许在其 var
属性中使用表达式,并且出于某种原因 pageContext
在自定义标记文件 (date-formatter.tag) 中为空。
所以这是我对标签定义的内容,减去无关的细节(假设包含 c
和 fmt
标签库,以及 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}" />