2011年8月7日星期日

ADF_102:AutoSubmit与PartialSubmit区别

Web2.0应用的两大特点就是异步请求响应和局部页面刷新。
比如:一个天气预报页面内容包括:国家下拉列表、省下拉列表、城市下拉列表,以及选择城市的最近三天天气情况。
当我们选择国家后,只刷新省的下拉列表;选择省后,只刷新城市的下拉列表;选择城市时,刷新最近三天天气情况。

总之,我们希望页面能够局部、动态地刷新,请求发送后不必等待响应就能马上做其它事情,而响应回来后,页面相关组件会得到通知,然后自动更新。
AutoSubmit、PartialSubmit、PartialTriggers这三个参数的主要作用就是完成异步请求响应和局部页面刷新。
一般人对PartialTriggers的作用比较清楚,但AutoSubmit和PartialSubmit的区别就不太清楚了。

1. autoSubmit 只在输入组件上才有的一个属性。
例如:< af:inputText id="productpriceIT" label="Price" autoSubmit="true" value="#{advertisement.price}" >

当设置为true后,改变该组件的值后(焦点离开后),该组件的值(注意,不是整个form)将被提交到服务器,即进入【转换、验证、更新模型、重新呈现】的各个生命周期阶段(注意先后次序)。
表单中的其它组件不受任何影响,表单也并未提交,只是该组件被异步地提交了。这意味着,即使表单中还有其它必填项,也不会提示“该项不能为空”,因为没有触发到这些必填项。
如果在Manage Bean中更新了该组件的值,必须要刷新该组件才能显示新值,即进入【重新呈现】阶段。刷新该组件有两种方法:
(1)在页面中设置autoSubmit + partialTriggers 刷新(这里指向自己)
< af:inputText id="productpriceIT" label="Price" autoSubmit="true" value="#{advertisement.price}" partialTriggers="productpriceIT">
(2)在Manage Bean 中用代码刷新
AdfFacesContext.getCurrentInstance().addPartialTarget(this.productpriceIT);

2. partialSubmit 只在命令组件上才有的一个属性。
例如:< af:commandLink id="showImageCL" text="#{areaAndCategoryProvider.showAreaImage?'Hide image':'Show image'}"
actionListener="#{areaAndCategoryProvider.toggleImage}" partialSubmit="true" partialTriggers="showImageCL" />

默认情况下,单击命令链接或按钮将导致表单提交或页面导航,整个页面将被刷新和重载,其页面效果是页面好像抖动了一下,用户感受稍差一些。
这时,我们可以使用partialSubmit + partialTriggers,来刷新某个组件,其页面效果是只会刷新组件,而不会刷新整个页面。
当然,表单还是会被提交,如果表单中有必填项,将会验证出错,这一点和没有设置partialSubmit=true的按钮或链接一样,二者区别是:设置了partialSubmit=true的按钮或链接界面效果不会抖动,同时点击后会启动 ppr 请求,如果设置了partialTriggers 的话。

与autoSubmit的区别是,后者仅处理更改的组件本身以及在其 partialTriggers 属性中包含引用的所有组件,不会触发表单中的必填项的验证,除非这些必填项的partialTriggers 指向设置了autoSubmit=true的组件。

值得注意的是,CommandToolBarButton 默认partialSubmit =true,所以如果你需要刷新某个组件,必须设置partialTriggers,否则页面不会被刷新。
而CommandButton 默认partialSubmit =false,默认会刷新整个页面。
我曾经在编写一个页面时,点击CommandToolBarButton,怎么也不刷新某个table(我又不想使用partialTriggers来实现),整整花了我2个小时才找到原因,呵呵。

参考文献:
1. http://technology.amis.nl/blog/4931/how-to-declaratively-instruct-adf-faces-rc-to-partially-refresh-other-components-upon-an-event
2. http://vtkrishn.wordpress.com/2010/05/06/difference-between-commandtoolbarbutton-and-commandbutton/
3. http://forums.oracle.com/forums/thread.jspa?threadID=984095

没有评论: