我有一个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>
Run Code Online (Sandbox Code Playgroud)
这将在更改下拉列表时同步提交整个表单,就像您按下了提交按钮一样.但是,如上所述,如果您在其他地方以相同的形式执行验证,则必须引入相当多的黑客攻击immediate="true"
并valueChangeListener
阻止验证所有其他表单元素.有关详细示例,另请参阅填充子菜单.
一个完全不同的替代方法是将所有内容呈现给HTML响应并使用CSS隐藏它display:none
,然后使用JavaScript element.style.display
在onchange
属性中引用的某个JS函数中切换显示.
归档时间: |
|
查看次数: |
5979 次 |
最近记录: |