在我的应用程序中,我试图从消息包中获取标签。 然而,然后使用常量键值我使用变量
<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
这两个问题实在令人费解。标签大部分时间都有效, 但并非始终如一。标签在包含的库中定义,但无法找到。
提前感谢任何指示。
答案 0 :(得分:1)
JSF UI组件和JSTL之类的标记处理程序不能同步运行。 JSTL在构建JSF视图时运行。结果是JSF组件树没有任何标记处理程序,如<c:xxx>
和<f:xxx>
。当JSF视图需要为HTTP响应生成HTML时,JSF UI组件会运行。只要您通过在POST操作上返回null
或void
来与同一视图进行交互,就可以在后续HTTP请求中多次重复使用相同的JSF视图(就像您应该使用{{ 1}} bean)。 JSTL标记在每个HTTP请求上运行都是不正确的。在你的情况下,这很可能是出错了。
如果在重用相同视图时需要一致的渲染时行为,请使用JSF UI组件。您的构造可以替换如下:
@ViewScoped