<c:if test>似乎总是在JSF2 Facelets中评估为true

Dej*_*ell 10 jsf jstl facelets jsf-2

我在Facelets上使用JSF2.

<ui:param>在页面中定义了一个:

<ui:composition template="/WEB-INF/templates/ui.xhtml"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
>
  <ui:param name="title" value="OnAir WebDemo" />
  ...
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

ui.xhtml模板中我有:

<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:c="http://java.sun.com/jstl/core"
>
  <c:if test="#{not empty title}">
    <h1>#{title}</h1>
  </c:if>
</html>
Run Code Online (Sandbox Code Playgroud)

但是,<c:if test>似乎总是评估true,如果<ui:param>没有指定.如何更改代码,以便在未指定时<c:if test>实际评估?false<ui:param>

Bal*_*usC 43

XML命名空间无效.它应该是

xmlns:c="http://java.sun.com/jsp/jstl/core"
Run Code Online (Sandbox Code Playgroud)

是的,令人惊讶的/jsp是URI中的部分!/jsp不适用于JSF 1.x的Facelets 1.x中的那个.如果您已经在Web浏览器中检查了生成的HTML输出,那么您应该注意到HTML输出中的<c:if>未解析.


也就是说,你应该更喜欢JSF组件而不是JSTL标签,除非技术上不可能(即当你真的想要控制视图的构建,而不是渲染视图时).在h:panelGroup你发现自己是一个不错的人选,但是ui:fragment是一个更好的选择,因为它具有更少的开销.

<ui:fragment rendered="#{not empty title}">
    <h1>#{title}</h1>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)

请注意,由于JSF <ui:fragment>人员在初始JSF 2.0版本的标签定义文件中出现错误,Netbeans会认为标签不支持该rendered属性,但这是不正确的.它当然支持它.它已在JSF 2.1标记定义中修复.

也可以看看: