我有一個selectonlistbox,並且我想在每次選擇框選擇被改變時重新加載一個panelgrid。我嘗試只使用jsf 1.2。我知道這可以使用a4j或faces2輕鬆完成,但如果有人知道在jsf 1.2中實現這一點的任何好方法,我都會很感激。ajax在jsf 1.2中的行爲
一個簡單的例子也會有很大的幫助。
感謝
我有一個selectonlistbox,並且我想在每次選擇框選擇被改變時重新加載一個panelgrid。我嘗試只使用jsf 1.2。我知道這可以使用a4j或faces2輕鬆完成,但如果有人知道在jsf 1.2中實現這一點的任何好方法,我都會很感激。ajax在jsf 1.2中的行爲
一個簡單的例子也會有很大的幫助。
感謝
你基本上需要創建一個自定義的Ajax知道ViewHandler
和一個自定義XML ResponseWriter
和custom 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
的顯示。
我認爲更好的選擇是遷移到JSF 2.如果你想用JSF 1.2來實現它,可以使用一些JS庫,比如JQuery或者prototype,並且在事件上調用你的JS函數並且用模板的URL調用AJAX更新器面板網格和邏輯頁面(例如:/mypanaelGrid.jsf)。
很好的答案......你一定是JSF專業版 – RegisteredUser