2011-12-23 57 views
0

我想知道是否有以下方案的通用模式。@PostConstruct和commandButton/commandLink參數案例

比方說,我有一個JSF頁面支持一個請求範圍的bean。 我想在用戶進入此頁面時從數據庫表中提取所有數據行。 相同的JSF頁面包含提供查詢條件的表單。當用戶提供查詢條件並提交表單時,我想在同一頁面上顯示結果。

在頁面條目處獲取所有行的合適位置是@PostConstruct方法。這是一個不錯的地方,因爲額外的(注入的)請求參數在這裏已經可用並且可以在查詢中使用。但是,從表單中提取的參數尚不可用。他們可以在操作方法中訪問。

如果用戶使用表單標準查詢數據庫表,在這種情況下數據庫將被查詢兩次。請求作用域bean將被重新創建,並且在表單操作方法獲取用戶需要之前調用獲取所有行的@PostConstruct方法。

當然,我只能在action方法中將表單結果重定向到另一個由不同的bean支持的JSF頁面。但是,有沒有一種方法可以完成只抓取一個JSF頁面和一個託管bean所需的內容?

回答

2

你應該使用的是ViewScoped託管bean和ajax引擎的組合。您正確地使用@PostConstruct方法來獲取數據表的所有初始行。來自查詢表單的任何進一步請求都不會再次觸發此方法。相反,您只需要進行ajax調用即可整理數據表中的條目,並在調用結束時對其進行更新。這將是這樣的:

<h:dataTable id="myTable"> 
    ... 
</h:dataTable> 

<h:form> 
    ... 
    <h:commandButton actionListener="#{viewScopedBean.sortEntries}"> 
     <f:ajax render="myTable" execute="myForm" /> 
    </h:commandButton> 
</h:form> 
+0

謝謝!這應該能夠完成這項工作。就我所知,ViewScoped bean唯一的問題是你不能使用GET請求參數。但可以使用commandLink/Button setPropertyActionListener傳遞所有附加參數。 – Dzik 2011-12-23 11:29:21

+1

你可以肯定地使用GET參數'',這比'@ ManagedProperty'好得多來處理GET參數。另見http://stackoverflow.com/questions/4888942/viewparam-vs-managedpropertyvalue-param-id – BalusC 2011-12-23 11:56:48