【发布时间】:2015-06-12 11:54:32
【问题描述】:
我在每次提交表单时使用 JSF 和 AJAX 来呈现表格而无需重新加载整个页面时遇到了一些问题。
当我第一次运行服务器时,我的数据库是空的,所以页面应该只显示一个添加书籍的表单。当用户提交表单时,应该呈现所有书籍的fieldset。我不希望在数据库为空时显示此 fieldset。
这是我的代码的一个简单版本(它只是一个小表单和一个要使用 AJAX 刷新的表格):
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
<h:graphicImage library="img" name="caelum-logo.png"/>
<h:form>
<p>Book Title:</p>
<h:inputText id="title" value="#{livroBean.livro.titulo}" />
<h:commandButton value="Add book" action="#{livroBean.addFirstBook}">
<f:ajax execute="@form" render="title :addedBooksTable" />
</h:commandButton>
</h:form>
<div id="addedBooksTable">
<p:fieldset rendered="#{livroBean.numberOfBooks > 0}">
<h:dataTable value="#{livroBean.allBooks}" var="book">
<h:column>
<h:outputText value="#{book.titulo}" />
</h:column>
</h:dataTable>
</p:fieldset>
</div>
</h:body>
</html>
我想专注于这部分:
<h:commandButton value="Add book" action="#{livroBean.addFirstBook}">
<f:ajax execute="@form" render="title :addedBooksTable" />
</h:commandButton>
当没有书籍添加到数据库时,字段集和其中的表应该是隐藏的,这就是我使用<p:fieldset rendered="#{livroBean.numberOfBooks > 0}"> 的原因。但我希望它在我点击commandButton 后呈现,即使inputText 没有任何内容。
这是我测试代码时发生的情况:
- 如果我像使用空数据库一样测试代码,当我单击
commandButton时,inputText会被刷新(它会“擦除”提交前输入的内容),但字段集不会。我知道该字段集有一个rendered="#{livroBean.numberOfBooks > 0}"而inputText 没有,但是每次我点击commandButton 时都会调用getNumberOfBooks方法,这就是为什么我没有得到它... - 如果我把
f:ajax标签改成这样<f:ajax execute="@form" onevent="click" render="title :addedBooksTable" />,问题就解决了,但是当我点击commandButton时,我可以实现屏幕闪烁一会儿。据我所知,AJAX 的用途之一是我们不希望在发出请求时屏幕闪烁。
为什么fieldset 只在我使用onevent="click" 时才呈现?我应该认为闪烁是正常的吗?有没有更优雅的解决方案?
谢谢!
【问题讨论】: