[英]ajax behaviour in jsf 1.2
我有一個selectonlistbox,並且每次選擇/更改選擇框時都想重新加載panelgrid。 我嘗試僅使用jsf 1.2。
我知道可以使用a4j或face 2輕松完成此操作,但是如果有人知道在jsf 1.2中實現此功能的任何好方法,我將非常感激。
一個簡單的例子也會有很大幫助。
謝謝
基本上,您需要創建一個自定義的Ajax感知ViewHandler
,一個自定義的XML ResponseWriter
和自定義標簽 ,它們會生成所需的JavaScript代碼以執行XMLHttpRequest
工作和HTML DOM操作。 這也是大多數第三方JSF 1.x組件庫所做的。 它們都是開源的,因此您只需看一看其源代碼,以示例方式了解它們是如何實現的。 畢竟,這對於初學者來說並不是一件容易的事,因為它需要對HTTP,HTML DOM,JavaScript和XMLHttpRequest的工作原理有扎實的了解。 很快就會犯一個小錯誤,對於初學者來說,要花很多時間才能找到並真正理解它。
最好的選擇實際上是為JSF 1.2采用支持Ajax的組件庫(例如,包括Ajax4jsf的RichFaces 3.x ),或僅遷移至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
技巧,以防止對所有其他表單元素進行驗證。 有關一些詳細示例,另請參閱填充子菜單 。
完全不同的替代方法是將所有內容呈現為HTML響應,然后使用CSS display:none
將其隱藏,然后使用onchange
屬性中引用的某些JS函數中的JavaScript element.style.display
切換顯示。
我認為更好的選擇是遷移到JSF2。如果要使用JSF 1.2,請使用一些JS庫(例如JQuery或prototype),並在事件上調用JS函數,然后使用帶有面板網格的模板頁面的URL調用AJAX更新器和邏輯(例如:/mypanaelGrid.jsf)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.