jsf2 ajax根据请求参数更新部件
这个例子有点极端,我试图做的不完全是这个,但更简单地用这个来certificate我的问题
我有一个页面,有一个简单的index.xhtml:
... ...
当我按下“GO”按钮时,我想渲染component1如果renderu1被选中,component2如果renderu2被cheked,则component3如果renderu3被选中
我目前的解决方案是使用jQuery表单插件的js函数:
$(document).ready(function(){ registerForms($(document)); }); function registerForms(rootElement) { rootElement.find("form").submit(function() { // submit the form $(this).ajaxSubmit(function(data, textStatus) { if(textStatus == "notmodified") return; var tempDiv = $(''); tempDiv.css("display", "none"); tempDiv.html(data); var newUniqueContainer; while((newUniqueContainer = tempDiv.find(".unique_container:first")).html() != null) { var oldUniqueContainer = $("#" + newUniqueContainer.attr("id") + ":first"); oldUniqueContainer.empty(); oldUniqueContainer.html(newUniqueContainer.html()); registerForms(oldUniqueContainer); newUniqueContainer.remove(); } tempDiv.remove(); }); // return false to prevent normal browser submit and page navigation return false; }); }
它做的是每当我提交一个表单时,它会向给定的URL发出ajax请求,等待响应,如果theres内容(状态代码不是304,所以它不是“未修改”),它会获取数据,并且将原始“unique_containers”中的内容替换为新数据
async.xhtml:
AsyncBean.java:
@ManagedBean(name="asyncBean") @RequestScoped public class AsyncBean { @ManagedProperty(value="#{param.renderu1}") private boolean render1; @ManagedProperty(value="#{param.renderu2}") private boolean render2; @ManagedProperty(value="#{param.renderu3}") private boolean render3; private boolean isRender1() { return render1; } private void setRender1(boolean render1) { this.render1 = render1; } private boolean isRender2() { return render2; } private void setRender2(boolean render2) { this.render2 = render2; } private boolean isRender3() { return render3; } private void setRender3(boolean render3) { this.render3 = render3; } }
所以,如果只选中第3个复选框,则为exapmle,响应将是这样的:
content of component3
它工作正常,简单而且全部,但后来我开始使用RichFaces作为我的一个组件 – 问题是,它使用jQuery的$(document).ready(fn)函数,当我用RichFaces重新加载部件时,它打破了(它是一个树组件,我无法打开节点)
我一直在寻找可以做我的工作的工作解决方案,但更好地准备兼容性问题(从技术上讲,我想根据参数决定更新哪个部分,所以当原始页面呈现时,我还不知道写什么“执行”和“渲染”属性)
这实际上是一个非常可怕的解决方案。 您可以使用纯JSF 2.0解决此问题,而无需jQuery,JSTL和自定义标记。 您可以使用
来触发ajax请求并呈现部分组件。 您可以通过其rendered
属性有条件地呈现JSF组件。
这是一个基本的启动示例,假设您正在运行一个支持Servlet 3.0 / EL 2.2的容器,并且根据Servlet 3.0规范声明了/WEB-INF/web.xml
(否则.contains()
将无法在EL中运行你必须写一个自定义ELfunction)。
... panel one panel two panel three ...
同
@ManagedBean @RequestScoped public class Bean { private List panels; public List getPanels() { return panels; } public void setPanels(List panels) { this.panels = panels; } }
就这样。