2012-10-03 47 views
1

我有一個selectonlistbox,並且我想在每次選擇框選擇被改變時重新加載一個panelgrid。我嘗試只使用jsf 1.2。我知道這可以使用a4j或faces2輕鬆完成,但如果有人知道在jsf 1.2中實現這一點的任何好方法,我都會很感激。ajax在jsf 1.2中的行爲

一個簡單的例子也會有很大的幫助。

感謝

回答

5

你基本上需要創建一個自定義的Ajax知道ViewHandler和一個自定義XML ResponseWritercustom tags生成所需的JavaScript代碼來執行XMLHttpRequest作品和HTML DOM操作。這也是大多數第三方JSF 1.x組件庫所做的。它們都是開源的,所以你可以在源代碼中查看它們是如何做到的。畢竟它不是一個簡單的工作,因爲它需要深入瞭解HTTP,HTML DOM,JavaScript和XMLHttpRequest的工作原理。一個小錯誤很快就會產生,並且它會讓初學者花費很長時間來發現並真正理解它。你最好的選擇是採用JSF 1.2的ajax組件庫(例如RichFaces 3.x,其中包含Ajax4jsf),或者只是migrating to JSF 2.0(JSF 1.2已經超過6年了,JSF 2.0已經在3年前推出了; JSF 1.x基本上是歷史)。

然而,這個特殊的功能需求也可以在沒有ajax的情況下完成,儘管有些笨拙,但如果表單驗證起作用的話。這裏有一個基本的開球例子,它只是指示的JavaScript提交的下拉列表的變化父窗體的問題:

<h:form> 
    <h:selectOneMenu value="#{bean.selected}" onchange="this.form.submit()"> 
     <f:selectItem itemValue="one" /> 
     <f:selectItem itemValue="two" /> 
     <f:selectItem itemValue="three" /> 
    </h:selectOneMenu> 
    <h:panelGroup rendered="#{bean.selected == 'one'}"> 
     One was selected. 
    </h:panelGroup> 
    <h:panelGroup rendered="#{bean.selected == 'two'}"> 
     Two was selected. 
    </h:panelGroup> 
    <h:panelGroup rendered="#{bean.selected == 'three'}"> 
     Trree was selected. 
    </h:panelGroup> 
</h:form> 

這將提交整個表單同步的下拉列表的變化,因爲如果你按下一個提交按鈕。但是,正如所說的,如果您在其他地方以相同的形式執行驗證,則必須引入相當多的使用immediate="true"valueChangeListener的黑客來防止驗證所有其他表單元素。有關詳細示例,另請參見Populate child menus

一個完全不同的替代方法是隻呈現一切到HTML響應,並使用CSS display:none隱藏它然後切換在其中在onchange屬性引用的一些JS功能使用JavaScript element.style.display的顯示。

+1

很好的答案......你一定是JSF專業版 – RegisteredUser

0

我認爲更好的選擇是遷移到JSF 2.如果你想用JSF 1.2來實現它,可以使用一些JS庫,比如JQuery或者prototype,並且在事件上調用你的JS函數並且用模板的URL調用AJAX更新器面板網格和邏輯頁面(例如:/mypanaelGrid.jsf)。