本文内容针对 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中并提交,则只有这部分被处理。