我在使用JSF和AJAX渲染表格时遇到了一些问题,每次提交表单时不想重新加载整个页面。当我第一次运行服务器时,我的数据库是空的,所以页面应该只显示一个添加书籍的表单。当用户提交表单时,应该呈现带有所有书籍的字段集。但是我不希望在数据库为空时显示这个字段集。这是我的代码简化版(它只是一个小表单和一个要使用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}">
会隐藏 fieldset 和其中的表格。但是我想要在点击 commandButton
后呈现它,即使 inputText
中没有内容。
以下是测试代码时发生的情况:
- 如果我在空数据库中测试代码,当我点击
commandButton
时,inputText
会被刷新(它会“擦除”之前输入的内容),但是fieldset
不会。我知道fieldset
有一个rendered="#{livroBean.numberOfBooks > 0}"
而inputText
没有,但是每次我点击commandButton
时都会调用getNumberOfBooks
方法,这就是我不明白的原因... - 如果我改变
f:ajax
标签,使其变成这样<f:ajax execute="@form" onevent="click" render="title :addedBooksTable" />
,它可以解决问题,但是当我点击commandButton
时,屏幕会闪烁一段时间。据我所知,AJAX的一个用途是在发出请求时不希望屏幕闪烁。
为什么只有使用onevent="click"
时才渲染fieldset
?我应该认为闪烁是正常的吗?有更优雅的解决方案吗?
谢谢!