根据文档,它应该是世界上最容易使用的产品:
只需将icefaces.jar添加到应用程序中,我们就会将Direct-to-Dom(D2D)渲染应用于页面。
但即使他们最基本的教程Getting Started with ICEfaces 2似乎也不起作用。我在页面底部下载了代码,将其构建到WAR中并将其部署到Tomcat 6.0.32和Tomcat 7.0.14。我注意到的第一件事是由于某种原因,复合组件不起作用:
/job-applicant.xhtml @ 39,78以下属性是必需的,但没有为它们提供任何值:id。
但这感觉更像是一个JSF问题(JSF 2 Composite component required attribute throws exception),所以我通过删除ID属性上的必需来解决了这个问题(尽管仍然有一个必需的=“true”值似乎没有有一个问题)。无论如何,现在应用程序部署。如上所述,当您单击“清除”按钮时,它会使用AJAX调用,该按钮最终会在响应XML中获取表单的完整DOM。下一步是添加icefaces.jar,它应该添加Direct-to-DOM功能,以确保只在响应中发送差异:
ICEfaces 2将组件标记呈现给反映当前客户端视图的服务器端DOM(文档对象模型)。每次JSF生命周期运行时,DOM比较都会完成,如果有任何更改,则会将一组简明的页面更新发送回客户端以应用于页面。我们称之为Direct-to-DOM或D2D渲染。
然而,我得到完整的表格作为回应,加上一些额外的ICEfaces这样的东西:
<input name="ice.window" type="hidden" value="epgo74zmvc" />
<input name="ice.view" type="hidden" value="vs4ik661" />
很明显,ICEfaces正在做一些事情,但不是它所承诺的。它实际上比普通的AJAX响应更长。所以忽略了它实际上是一个更大的反应这一事实,我转向了下一个承诺:
使用Direct-to-DOM渲染,我们不再需要嵌套在“Clear”按钮中的f:ajax标记
听起来很直接吗?在页面上的示例中,它们只是将侦听器的EL表达式从f:ajax标记移动到h:commandButton标记。问题在于方法签名是不同的。这应该是入门教程,但它并不关心实际引导您完成这些步骤。无论如何,我可以修改它,通过修改backing bean中clearForm方法的方法签名,使其参数现在和ActionEvent而不是AjaxBehaviorEvent。这样做,ICEfaces实际上确实用AJAX动作取代了整页动作,这是非常不可思议的,但我仍然有一种酸味。有没有人知道为什么D2D似乎不起作用?难道我做错了什么?我还应该尝试使用ICEfaces吗?
答案 0 :(得分:0)
为什么你认为这个功能不正确?
正在发生的是您将整个表单作为响应,以便在JSF生命周期中刷新服务器端视图和控件状态。当您使用ajax标记调用表单的部分更新时,实际发生的情况是它只会将DOM更新呈现给指定的组件。
AJAX确实在这里发挥作用,但它需要发送整个DOM,否则服务器端的逻辑可能会查看陈旧的数据。
这不仅仅是ICEFaces,这是JSF。实际上,这与ASP.NET的工作方式基本相似。请参阅此链接以了解JSF生命周期。
http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html
如果这不是您对该技术的期望,我很抱歉。
答案 1 :(得分:0)
ICEfaces完成DOM比较后,需要发送更新。为了告诉桥的客户端部分放置更新内容的位置,ICEfaces需要指定祖先DOM节点的一些已知ID。服务器端渲染器只知道JSF组件的ID,包括自动生成的ID和手动指定的ID。它无法处理原始HTML标记。因此,我对您观察胖更新的最佳猜测是您使用了大量HTML标记。
关于D2D和ICEfaces桥的另一个问题是它无法添加或删除子元素。它只能完全替换ID可寻址标签。因此,如果您,即向表中添加新行,则将更新整个表。
我的知识基于ICEfaces 1.8.2。