2012-09-28 36 views
1

考慮下面的代碼:獲得viewParam在POST

<!DOCTYPE html> 
<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:o="http://omnifaces.org/ui"> 

    <f:metadata> 
     <o:viewParam name="selected" value="#{testBacking.selected}" > 
     </o:viewParam> 
    </f:metadata> 

    <h:head> 
     <title> 
      title 
     </title> 

    </h:head> 

    <h:body> 
     <o:form includeViewParams="true"> 
      <h:commandButton action="#{testBacking.go()}" value="go"> 
       <f:ajax execute="@all" render="@all"/> 
      </h:commandButton> 
     </o:form> 
    </h:body> 

</html> 

的操作方法:

public void go() { 
    System.out.println("go() is called"); 

    Collection<UIViewParameter> viewParams = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot()); 

    for (UIViewParameter viewParam : viewParams) { 
     System.out.println(viewParam.getName() +" = "+ viewParam.getValue()); 
    } 
} 

的操作方法返回正確viewParam的名字,但價值總是空。如果這是預期的行爲,<o:form includeViewParams="true">如何幫助實際使用?

我正在使用Mojarra 2.1.12和Omnifaces 1.1。

回答

2

你的bean顯然是請求作用域。所述<o:viewParam>被intented在組合使用與視圖作用域豆不僅是因爲它防止了模型被轉換/驗證/更新一次又一次在每次回發到相同視圖,即使它是已經在初始完成請求並且仍然是作爲視圖範圍的bean的屬性。當模型綁定到基於DB調用執行作業的昂貴轉換器時,這可以提高整體性能。 showcase example也清楚地表明瞭這一點。

要實現這一點,<o:viewParam>基本上會在任何回發期間跳過此模型轉換/驗證/更新作業。然而,在每個請求中新創建一個請求作用域bean,並且初始模型值因此在每次回發時丟失,並且由於根本沒有設置<o:viewParam>的設計。

您可以通過將bean放置在視圖範圍內,或者僅使用標準的<f:viewParam>來解決此問題。

至於<o:form includeViewParams="true">,這隻對同步回發有用。如果你刪除了<f:ajax>,那麼你會看到它是如何有用的。在沒有includeViewParams="true"的情況下,URL變爲沒有查看參數的URL,即沒有?selected=somevalue,並且因此變得不可書籤。這與<o:viewParam>沒有嚴格的關係,與<f:viewParam>結合使用效果不錯。

+0

非常感謝您爲JSF社區提供精彩的Omnifaces。 – siva636

+1

不客氣:)有一種'Faces.getViewParameters()'獲取所有視圖參數的快捷方式。 – BalusC

+0

哦,很好。我會嘗試。再次感謝。 – siva636