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; } } 

就这样。