我已在在的index.xhtml頁以下。ManagedBean保持相同的返回查詢結果(會話/查看範圍?)
<h:form id="findForm">
<h:panelGrid columns="2" cellpadding="5">
<p:outputLabel value="Name" for="name"/>
<p:inputText id="name" value="#{finder.name}"/>
<f:facet name="footer">
<p:commandButton value="Find"
action="#{finder.gotoFoundPage}"/>
</f:facet>
</h:panelGrid>
</h:form>
這裏是下一頁的精簡版,found.xhtml。
<p:dataTable id="myTable" var="item"
value="#{finder.byName}" rowKey="#{item.name}"
paginator="true" rows="20"
selection="#{finder.selectedItem}" selectionMode="single">
<p:column headerText="Name" sortBy="#{item.name}"
filterBy="#{item.name}" id="name">
#{item.name}
</p:column>
</p:dataTable>
這兩個xhtml頁面使用相同的mananged bean。當我從index.xhtml點擊CommandButton時,它將導航到也使用Finder bean(當前爲ViewScoped)的found.xhtml頁面。問題是,在Finder豆將不會得到#{} finder.name(其中用戶輸入索引頁面,需要傳遞到發現頁面),除非我做搜索豆SessionScoped。
所以,如果我讓SessionScoped,那麼問題是,found.xhtml頁面時保持在手冊頁新的搜索顯示在頁面中發現相同的值。即使數據庫中的值已更改也是相同的值。我的理解是,如果我使用ViewScoped,它會在每次加載頁面時執行一個新的查詢,以便更新顯示的值。但不知道如何做到這一點。
@EJBs({@EJB(name="ejb/MyBean1", beanInterface=IMyBean1.class),
@EJB(name="ejb/MyBean2", beanInterface=IMyBean2.class)})
@ManagedBean(name="finder")
@ViewScoped
public class Finder implements Serializable {
// ...
public String gotoFoundPage() {
return "found?faces-redirect=true";
}
有沒有想法?
東西聽起來我們不是在同一頁上,但幾乎。它目前是ViewScoped,並在重定向後,我沒有得到一個全新的實例,所以沒有乾淨的狀態。相反,每次我從索引頁輸入文本進行搜索時,它會將我重定向到找到的頁面,但在已使用新數據更新數據庫字段後,數據仍然很舊。我會在早上看看參數。謝謝。 – Ender
您也可以回發到相同的視圖並有條件地呈現結果。 – BalusC
@恩格,當你使用會話範圍時,你會得到舊數據,但這是顯而易見的。所以,會話範圍可能不是你想要的。上面的評論說的另一個好的選擇是將搜索表單和結果放在同一個頁面,並有條件地渲染它們。如果您不需要在每個頁面中放置搜索表單,那可能是一個很好的嘗試。 – elias