尽管ui:fragment rendered =“false”,仍会评估值表达式

时间:2015-02-17 14:11:44

标签: jsf conditional-rendering

我有豆:

class Property{
 private String type;
 private Date value;
 //getters and setters
}

页面上也有代码块:

<ui:fragment rendered="#{property.type eq 'checkbox'}">
    <ui:include src="checkbox.xhtml">
        <ui:param name="property" value="#{property}"/>
    </ui:include>
</ui:fragment>

checkbox.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <body>
        <ui:composition>
            <h:selectBooleanCheckbox value="#{property.value}"/>
        </ui:composition>
    </body>
</html>

条件#{property.type eq&#39; checkbox&#39;} = false

但是我得到了下一个例外:

javax.servlet.ServletException: checkBox.xhtml value="#{property.value}": Cannot convert 01.11.02 0:00 of type class java.util.Date to class java.lang.Boolean

我希望如果ui:include中的属性render = false,则不会处理此块。

1 个答案:

答案 0 :(得分:1)

<ui:fragment rendered>阻止它呈现HTML输出,但它不会阻止它在JSF组件树中结束并且有资格进行状态保存。

请改用<c:if test>。它在视图构建时运行,而不是查看渲染时间,因此整个群集根本不会在JSF组件树中结束。

或者,如果你在<ui:repeat var="property">内有这个,并且你正在使用Mojarra,那么升级到至少2.1.29或2.2.7,其中修复了这个状态保存错误。

另见: