我有一个selectonlistbox,我想每次选择/更改选择框时重新加载panelgrid。我试着只使用jsf 1.2。
我知道可以使用a4j或者face 2轻松完成,但如果有人知道在jsf 1.2中实现这一目标的任何好方法,我会非常感激。
一个简单的例子也会有很大帮助。
由于
答案 0 :(得分:5)
您基本上需要创建一个自定义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
隐藏它,然后在某些JS函数中使用JavaScript element.style.display
切换显示。在onchange
属性中引用。
答案 1 :(得分:0)
我认为更好的选择是迁移到JSF 2.如果你想用JSF 1.2做,使用一些JS库,如JQuery或原型,并在事件上调用你的JS函数,并使用模板页面的URL调用AJAX更新程序使用面板网格和逻辑(例如:/mypanaelGrid.jsf)。