jsf 1.2中的ajax行为

Reg*_*ser 1 ajax jsf jsf-1.2

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

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

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

谢谢

Bal*_*usC 5

您基本上需要创建自定义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>
Run Code Online (Sandbox Code Playgroud)

这将在更改下拉列表时同步提交整个表单,就像您按下了提交按钮一样.但是,如上所述,如果您在其他地方以相同的形式执行验证,则必须引入相当多的黑客攻击immediate="true"valueChangeListener阻止验证所有其他表单元素.有关详细示例,另请参阅填充子菜单.

一个完全不同的替代方法是将所有内容呈现给HTML响应并使用CSS隐藏它display:none,然后使用JavaScript element.style.displayonchange属性中引用的某个JS函数中切换显示.