2012-03-10 17 views
2

我有一個p:dataTable和一些控件來改變它的內容,如頁碼,排序和過濾器參數。控件調用AJAX交互,以便每次更改都會向後端調用SQL查詢,但只更新客戶端瀏覽器中的表。這就是它應該的方式,對吧?如何將JSF Ajax與可書寫視圖結合使用?

我無法弄清楚是製作視圖書籤的最佳做法。這是很容易獲得的書籤參數爲支持bean如:

 <f:metadata> 
      <f:viewParam name="orderNo" value="#{bean.orderNo}" /> 
      <f:viewParam name="sortOrder" value="#{bean.sortOrder}" /> 
      <f:viewParam name="showOpenItems" value="#{bean.showOpenItems}" />   
      <f:viewParam name="page" value="#{bean.page}" /> 
      <f:viewParam name="pageSize" vlaue="#{bean.pageSize}" /> 
     </f:metadata> 

所以說,我想補充一個單選按鈕控制來改變中將sortOrder。這可能是這樣的:

<p:selectOneRadio value="#{bean.sortOrder}"> 
    <p:ajax update="@form" /> 
    <f:selectItem itemLabel="xxx" itemValue="1" /> 
     (etc) 
</p:selectOneRadio> 

第一個問題:當這個支持AJAX控制發射有沒有什麼辦法來保護其它參數如orderNo不用藉助ViewScoped豆?

第二個問題:如何獲取瀏覽器的URL欄進行更新,以便用戶在頁面上書籤時,所有當前表查詢參數都保留下來?

非常感謝您的幫助。

回答

2

您可以使用<f:param>將參數添加到任何組件,並從請求範圍的支持bean中讀取它。您可以使用OmniFaces Components.getParams(UIComponent)功能。

<p:selectOneRadio value="#{bean.sortOrder}"> 
    <p:ajax listener="#{bean.reload()}" update="@form" /> 
    <f:selectItem itemLabel="xxx" itemValue="1" /> 

    <f:param name="orderNo" value="#{bean.orderNo}"/> 
</p:selectOneRadio> 

檢索組件PARAMS在請求Bean:

public void reload() 
{ 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    final UIComponent component = UIComponent.getCurrentComponent(context); 

    List<ParamHolder> params = Components.getParams(component); 

    // extract orderNo param and reload your datasource 
} 

更新瀏覽器的網址,你可以執行GET-請求,而不是AJAX或者您可以使用JavaScript API的歷史操縱它。

對於第一部分,您可以在ajax或命令組件中使用此實用程序請求bean函數。

/** 
* Redirects to the given outcome by building a bookmarkable URL using all 
* child UIParameter's of the current component. 
* 
* @param outcome 
* @param includeViewParam 
* 
* @return 
*/ 
public void performActionParams(final String outcome, boolean includeViewParam) 
{ 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    final UIComponent component = UIComponent.getCurrentComponent(context); 

    List<ParamHolder> params = Components.getParams(component); 

    String url = FacesLocal.getBookmarkableURL(context, outcome, params, includeViewParam); 
    FacesContextUtils.redirect(context, url); 
}