使用 <c:if> 有条件地呈现 <h:commandButton>

Elb*_*bek 1 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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 5

JSTL 标记和 JSF UI 组件不会像您期望的编码那样同步运行。长话短说:JSF2 Facelets 中的 JSTL ......有意义吗?请仔细阅读。

在您的特定情况下,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}" />
Run Code Online (Sandbox Code Playgroud)

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