2012-11-12 63 views
0

我已在在的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"; 
    } 

有沒有想法?

回答

1

請記住,無論何時使用?faces-redirect=true技巧,用戶的瀏覽器都將重定向HTTP GET請求,並使JSF清除存儲在視圖中的任何狀態。 所以,即使您使用@ViewScoped豆,重定向後,你會得到一個全新的實例。

在你的情況,因爲這是一個簡單的搜索,你可能想用視圖PARAMS做到這一點,如果數據沒有出現在URL敏感。查看this blog post from BalusC: Communication in JSF 2瞭解更多關於這個以及其他相關的信息,這些信息都是圍繞JSF bean和頁面傳遞數據。

+0

東西聽起來我們不是在同一頁上,但幾乎。它目前是ViewScoped,並在重定向後,我沒有得到一個全新的實例,所以沒有乾淨的狀態。相反,每次我從索引頁輸入文本進行搜索時,它會將我重定向到找到的頁面,但在已使用新數據更新數據庫字段後,數據仍然很舊。我會在早上看看參數。謝謝。 – Ender

+0

您也可以回發到相同的視圖並有條件地呈現結果。 – BalusC

+0

@恩格,當你使用會話範圍時,你會得到舊數據,但這是顯而易見的。所以,會話範圍可能不是你想要的。上面的評論說的另一個好的選擇是將搜索表單和結果放在同一個頁面,並有條件地渲染它們。如果您不需要在每個頁面中放置搜索表單,那可能是一個很好的嘗試。 – elias

相關問題