我正在使用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个,别无其他。
最佳答案
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放在视图范围内,而不是在请求范围内。