消息包间歇性地无法呈现正确

时间:2012-03-09 19:23:47

标签: java jsp jsf jstl

在我的应用程序中,我试图从消息包中获取标签。 然而,然后使用常量键值我使用变量

<c:forEach var="emailAddress" items="${emailAddresses}">
...
<c:set var="labelKey" value="Contact_Label_${emailAddress.type}"/>
...
<h:outputText value="#{faces_translations[labelKey]}"/>
...
</c:forEach>

大部分时间这都可以正常工作,但每隔一段时间就会如此 加载了一些标签未正确处理和以下内容 消息显示:

???Contact_Label_???

看起来email.type没有返回值,但我添加了一些 调试代码以通过包含

打印出email.type的值
${emailAddress.type}

并看到返回了一个值。

我尝试的另一件事是在设置之前每次都删除该值 再次在循环内使用。这导致以下结果 例外。我确认我在WAR文件中包含了标记库 (jstl-api-1.2.jar和jstl-impl-1.2.jar以及javax.faces-2.1.7)。

<c:remove> Tag Library supports namespace: http://java.sun.com/jsp/jstl/core,
but no tag was defined for name: remove

这两个问题实在令人费解。标签大部分时间都有效, 但并非始终如一。标签在包含的库中定义,但无法找到。

提前感谢任何指示。

1 个答案:

答案 0 :(得分:1)

JSF UI组件和JSTL之类的标记处理程序不能同步运行。 JSTL在构建JSF视图时运行。结果是JSF组件树没有任何标记处理程序,如<c:xxx><f:xxx>。当JSF视图需要为HTTP响应生成HTML时,JSF UI组件会运行。只要您通过在POST操作上返回nullvoid来与同一视图进行交互,就可以在后续HTTP请求中多次重复使用相同的JSF视图(就像您应该使用{{ 1}} bean)。 JSTL标记在每个HTTP请求上运行都是不正确的。在你的情况下,这很可能是出错了。

如果在重用相同视图时需要一致的渲染时行为,请使用JSF UI组件。您的构造可以替换如下:

@ViewScoped

另见: