我在网上阅读了各种例子,其中通过ReachFaces 3的a4j标签发送的ajax调用重新呈现了jstl标签。在这个例子中:
http://relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults
ajax调用在rich:tabPanel中重新呈现c:foreach(查看“在面板代码后添加下一个代码:”之后的代码。)
我的问题是:由于在创建视图期间评估c:forEach标记(与任何其他jstl标记一样),reRender属性指向的视图部分将在每个ajax请求中从头开始重建?
非常感谢。
尼科
答案 0 :(得分:0)
查看JSF lifecycle docs,更具体地说,还原视图阶段和渲染响应阶段部分,您可以找到您在寻找的内容:
恢复视图阶段
如果页面请求是初始请求,则JavaServer Faces实现会在此阶段创建一个空视图,生命周期将前进到呈现响应阶段。在回发期间处理页面时,将填充空视图。
如果页面请求是回发,则已存在与此页面对应的视图。在此阶段,JavaServer Faces实现通过使用客户端或服务器上保存的状态信息来恢复视图。
渲染响应阶段
在此阶段,如果应用程序使用JSP页面,则JavaServer Faces实现会委托将页面呈现给JSP容器的权限。如果这是初始请求,则当JSP容器执行页面时,页面上表示的组件将添加到组件树中。如果这不是初始请求,则组件已添加到树中,因此无需再次添加它们。在任何一种情况下,组件都将自己呈现为JSP容器遍历页面中的标记。
简而言之,当您执行Ajax请求时,您已经拥有了该视图。 JSF将在模型更新后立即搜索您要通过它重新渲染的组件,并使用新值更新视图。在c:forEach
的情况下,它不是组件,而是标记处理程序,因此在之前评估。
与您发布的链接相关,请查看此页面有关the difference between components and tag handlers的信息。他们只有不同的生命周期,所以混合时要小心。