Richfaces 3.3的a4j小结

本文内容针对 3.3版本


关于ajax原理:

最近用firefox看了一下RichFaces的ajax报文

发现它的post的header中没有X-Http-With XmlHttpRequest

 

觉得很奇怪,后来看到jboss RichFaces社区有人回答这个问题。说是用开发人员认为XmlHttpRequest在有的浏览器下面有问题,因而采用了在post中增加 AJAXREQUEST _viewRoot 的方式。

 

我猜还有部分原因是因为为了配合jsf的生命周期,ajax4jsf的JavaScript引擎采用模拟的方式发送post,jsf的server并不知道发过来的post是同步的还是异步的,因而请求都按照lifecycle的6个周期进行处理。

只是发现有AJAXREQUEST 后,某些部分做特殊处理(也就是说这个标志位表明是ajax请求)。

请求的结果(也就是需要reRender的部分的xml)返回给ajax4jsf的JavaScript引擎,由JavaScript引擎更新到页面上。

 

关于a4j的使用

这里说明几个容易混乱的概念。

 

ajaxSingle

input控件的子component中包含该属性(通常是<a:support>上)

如果ajaxSingle=false,该input提交ajax请求之后,在post中被提交的所有的字段,都会触发验证。

如果ajaxSingle=true,该input提交ajax请求之后,只有该字段本身的验证会被触发。

 

reRender

表示ajax出发之后,需要重绘那些区域。

这个属性和ajaxSingle毫无关系,举个例子,a区域的reRender写的是b区域,

则即使是a区域有错,ajax请求完成后,错误信息也不会显示出来(因为指定的是b区域刷新)

 

a:region

当页面上没有a:region的时候,默认提交的所有字段都进行处理(即 AJAXREQUEST _viewRoot )。

如果页面上有a:region,则只有a:region中的内容被处理,例如AJAXREQUEST testa4jform:j_id8

其中 testa4jform:j_id8是a:region的component Client Id。

这里所说的提交,不论是用a:support或者a:commandbutton,都是ajax提交。

例如,将某个input控件表为ajaxSingle=false,则应该整个form的input都被处理,如果将其中的一部分框在a:region中并提交,则只有这部分被处理。

 

 

 

你可能感兴趣的:(Richfaces)