使用<c:if> </c:if> </h:commandbutton>有条件地渲染<h:commandbutton>

时间:2012-03-19 23:20:03

标签: java jsf jstl

我正在使用jstl进行小型测试。并且它的工作方式不起作用

这是小代码:

<c:set var="id" value="#{mBlog.blog.id}"/>
                    ${id}    //printing  4  
                    <c:if test="${id > 0}">
                        <h:commandButton value="Update" action="#{mBlog.update}"/>  //is not rendered
                    </c:if>

                    <c:if test="${id == 0}">
                        <h:commandButton value="Save" action="#{mBlog.save}"/>  //is not rendered
                    </c:if>

我不知道出了什么问题。在显示器中我只看到4,没有别的。

1 个答案:

答案 0 :(得分:4)

JSTL标记和JSF UI组件不会像编码所期望的那样同步运行。长话短说:JSTL in JSF2 Facelets... makes sense?请仔细阅读。

在您的特定情况下,JSTL <c:if>标记条件似乎取决于JSF <f:event>标记的结果。在<c:if>运行时,在视图构建期间,<f:event>尚未运行,因为它在预渲染视图事件期间运行。因此,#{mBlog.blog.id}始终为null或任何其他默认值。

您需要使用JSF组件的rendered属性。它还可以使您的代码更清晰。

<h:commandButton value="Update" action="#{mBlog.update}" rendered="#{mBlog.blog.id gt 0}" />
<h:commandButton value="Save" action="#{mBlog.save}" rendered="#{mBlog.blog.id eq 0}" />

然而,在调用操作时,您将面临另一个潜在的未来问题。确保将bean放在视图范围内,而不是放在请求范围内。