2013-03-03 66 views

回答

0

不完全確定你在問什麼,但是,如果你的bean不是請求範圍,他們會用你以前的值填充你的html表單控件。

如果你的豆視圖範圍或session範圍,您仍可以通過在bean的行動貪利操縱模型值(commandLink/commanButton動作)

,如果您想要的值被清除的控制渲染值稍後訪問同一頁面時,應該讓你的頁面bean請求範圍。

如果您願意,可以通過使用綁定而不是值來直接對UIComponents進行微操作以完全控制,從而允許您直接在bean中創建和管理UIComponents。

<h:inputText binding="#{bean.inputComponent" />並在代碼

public class myBean { 
    private UIInput inputComponent; 

    public UIComponent getInputComponent() { 
     // create your UIComponent here, and manage values in your command methods 
    } 

    public void setInputComponent(UIComponent component) { 
     inputComponent = component; 
    } 

}

+0

這並不完全正確。請求範圍的bean將被重新創建,並在下一次請求時被重新填充(通過客戶端值),儘管視圖範圍的bean不會被重新創建,但從視圖中恢復(不包括雞蛋)。但數據將保持不變。 – skuntsel 2013-03-03 08:30:00

+0

ahh是的,我明白了你的觀點,我編輯了我的答案,使其更清晰 - 但是如果你希望通過在操作方法中返回相同的viewid來完全重置視圖,請參閱http://stackoverflow.com/questions/9458911/reset-jsf-backing-beanview-or-session-scope例如 – 2013-03-03 08:34:05

+0

當然,因爲它不會是回發。但我理解OP的問題,他希望他在(聽衆)方法中產生的變化*在他看來反映出來。順便說一句,你知道UI組件的綁定屬性在查看作用域bean方面做了什麼嗎? – skuntsel 2013-03-03 08:40:18

0

JSF做你告訴它做什麼。

爲了刷新視圖(在對bean進行了一些更改之後),您需要執行回發到原始視圖,通過返回操作方法的null/void或指定客戶端ID(或其他可接受的值,例如@form)將被執行(更新)和稍後呈現(刷新)的屬性<f:ajax>標記附加到您的組件,該組件應該對您的bean進行更改。

0

是的,數據綁定是雙向的。但是,這意味着小,沒有回答兩個關鍵問題:

  • 讀寫時發生,
  • 什麼條件它發生。

而答案是:

  • 數據從控件被推入豆回傳後,如果每一個組件是有效的。
  • 數據是在渲染之前從bean讀取的,也就是在每個操作發生之後,每個標準事件觸發(命令按鈕,valuechange事件等)。

這意味着,與第一個直覺相反: - 輸入等組件會保持它們的狀態,並且它與後備bean分離。它可以保留很長時間,甚至很多回發,而無需與後臺bean同步(例如,當表單上的任何其他組件無法驗證時)。

想象生命週期的最簡單的方法是:

  1. 部件使用請求數據和可能的其他一些,配置相關的裝置恢復它們的狀態[回發僅]
  2. 如果轉換和驗證都很好,然後來自組件的數據被複制到使用綁定的後臺bean,如果沒有,則跳過下一步,但組件仍然記住它們的狀態[僅回發]
  3. 動作被執行(查看動作,命令)。在這個階段,你總是可以從bean中讀取數據並確保它是有效的(不是「一致的」,更像是「每個組件都有一個可接受的值」)。您也可以更改bean中的值,確保它們將在下一步中使用。
  4. 組件使用綁定從後臺bean中提取數據並將其提取。

的外賣店:

  • ,如果你試圖把任何邏輯的getter和setter,你有問題。如果任何一個setter設置了一些額外的屬性,那麼最終的代碼會設置一些其他的值,結果可能取決於綁定的調用順序(步驟2)。
  • 改變任何數據的唯一好時機是第3步:執行動作的時刻;
  • 如果您沒有任何操作,您還可以使用PreRenderView事件,它會在步驟3和步驟4之間調用(如果您有純粹的GET頁面,並且沒有回傳,可用於將一些數據移動到bean中)。
  • 更改bean或依賴來自bean,轉換器,驗證器和valuechangelisteners的值 - 至少是棘手的。

如果您嘗試使用JSF和穀物一起使用,那真是令人愉快。如果試圖反對谷歌並將JSF屈服於您關於Web框架應該如何工作的想法(比如在驗證器中使用業務驗證,在轉換器中更改模型,從構造函數中讀取數據庫等),您需要很多BalusC的幫助:-)

+0

請注意,如果屬性處於提交表單中,綁定將僅爲雙向**,否則JSF將僅使用getter。 – 2013-03-04 04:22:33

+0

@LuiggiMendoza:不要忘記,服務器*需要插入!電力對於JavaServer Faces工作至關重要。 – fdreger 2013-03-09 21:27:05

+0

即使您爲您的電子設備充電,登錄到SO並添加此類評論,電力也至關重要! – 2013-03-09 21:57:44

相關問題