我正在使用 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 个,没有别的。
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 放在视图范围内,而不是放在请求范围内。