簡體   English   中英

jsf 1.2中的ajax行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM