2009-10-07 43 views
0

在許多情況下,您想要將HTML控件或Facelets添加到您的網站,但是當您調用某個操作時只需訪問它們有多容易?使用commandButton或commandLink來回傳和管理HTML控制值

我有以下commandLink執行操作

<h:commandLink action="#{MyBean.save}" value=""> 
    <f:verbatim><input type="button" value="Save"/></f:verbatim> 
    <f:param name="id" value="#{MyBean.id}"/> 
</h:commandLink> 

的參數是有保存查詢字符串狀態,所以我的應用程序不會崩潰。

現在,想象一下你有一個<input type="text" /><h:inputText value="hello" />現在,這些組件對於讓您的網站啓動並運行非常重要,特別是在創建一些動態特性時。但是,如果控件沒有綁定到任何東西,或者如果您有一個可以使用JavaScript添加元素的Listbox,那麼當您執行commandLink或commandButton時,如何訪問這些元素?你是否必須將控件綁定到Bean,或者是否有可能以另一種方式訪問​​此FaceContext來檢索列表框,輸入文本或其他任何你想要的值?

回答

2

將JSF呈現的頁面視爲HTML和JavaScript的大集合(我認爲這是問題的核心)可能很困難。您不能向客戶端上的應用程序添加任意表單控件,並期望JSF框架解釋它們。 JSF使用預定義的組件,因此組件必須知道如何解釋來自請求的額外數據。因爲它最終都是作爲一個由servlet解釋的HTML表單來完成的,所以從客戶端發送的數據仍然會在參數映射中結束 - 但是這些值不會通過JSF生命週期,所以不會從驗證/數據綁定/等。

一個JSF控件樹看起來像任何其他控件樹(如Swing或SWT):

UIViewRoot 
     |_HtmlForm 
        |_HtmlInputText 
        |_HtmlCommandButton 

一個JSF控制基本上是這樣的:

  • 一個UIComponent實例封裝的值(最初從JSP/Facelet填充);例如:HtmlInputTextarea
  • 頁面呈現時,生命週期將查找該組件的實現Renderer; Renderer將標記寫入輸出
  • 當發佈表單時,相同的呈示器會查看傳入參數映射,以瞭解它所識別的鍵值,並最終(轉換和驗證後)將新值推入UIComponent(可能會把它推到一個模型的值綁定)

以您的具體示例的列表框 - 這是一個棘手的。 JSF提供了一個HtmlSelectManyListbox,它以HTML中的SELECT元素結尾。可以使用客戶端上的JavaScript將OPTION子項添加到DOM,但是在提交表單時這並沒有什麼好處。如果您閱讀HTML spec,它會顯示:

只有選定的選項纔會成功。如果未選擇任何選項,則控件不成功,並且在提交表單時,名稱和任何值都不會提交給服務器。

因此,當提交表單時,只有用戶選擇的列表元素纔會被髮送到服務器。您需要一些隱藏字段才能將所有新數據傳送到服務器。核心組中沒有控制權可以幫助你解決這個問題。

您有幾種選擇:

+0

令人驚歎!當我按下我的「保存」按鈕時,我實際上正在使用一個。然後我用FacesContext檢索發佈的值。你的回答給了我一個關於生命週期的全新見解,以及未來如何克服這些問題。非常感謝你。 – 2009-10-08 11:08:43

1

你可從「非JSF」值使用,可與

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() 

你叫什麼動作例如,在被訪問的標準請求參數地圖網頁上的控制。 MyBean.save()

+0

怎麼做的每一次您在JSF控件上的表現同樣如此嗎? – 2009-10-07 20:46:10

+0

你不需要,因爲它們都綁定在你豆類的字段 – Damo 2009-10-08 08:30:56

相關問題