jsf 1.2中的ajax行为

时间:2012-10-03 19:46:49

标签: ajax jsf jsf-1.2

我有一个selectonlistbox,我想每次选择/更改选择框时重新加载panelgrid。我试着只使用jsf 1.2。

我知道可以使用a4j或者face 2轻松完成,但如果有人知道在jsf 1.2中实现这一目标的任何好方法,我会非常感激。

一个简单的例子也会有很大帮助。

由于

2 个答案:

答案 0 :(得分: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隐藏它,然后在某些JS函数中使用JavaScript element.style.display切换显示。在onchange属性中引用。

答案 1 :(得分:0)

我认为更好的选择是迁移到JSF 2.如果你想用JSF 1.2做,使用一些JS库,如JQuery或原型,并在事件上调用你的JS函数,并使用模板页面的URL调用AJAX更新程序使用面板网格和逻辑(例如:/mypanaelGrid.jsf)。