- 浏览: 29034 次
- 性别:
- 来自: 河北省
最新评论
-
haitunwan:
我在做Struts2和Velocity整合的时候遇到了这个错误 ...
Connection reset by peer: socket write error -
java_hq:
xiaoma1234520 写道楼主,我最近也遇到这个问题了。 ...
Connection reset by peer: socket write error -
xiaoma1234520:
楼主,我最近也遇到这个问题了。你是09年发表的帖子。现在找到解 ...
Connection reset by peer: socket write error -
lywzj2008:
metadmin 写道
如果2个hql语句写到配置文件,或者做 ...
struts2 +hibernate3.2+ spring2.0 分页 -
metadmin:
如果2个hql语句写到配置文件,或者做为参数传入。那么这就是通 ...
struts2 +hibernate3.2+ spring2.0 分页
5.5 优化Ajax请求
5.5.1 重新绘制 (Re-Rendering)
Ajax组件的共同Aja属性,如<a4j:support> , <a4j:commandButton> , <a4j:jsFunction> , <a4j:poll> , <a4j:push>等等。 并且,大多数内置Ajax的RichFaces组件支持这些相似作用的属性。Ajax组件属性帮助RichFaces显露其功能。大多数属性有默认值。 因此,您就可以开始使用RichFaces而不知道这些属性的用法。然而,它们的使用可以根据所需要的Ajax很容易地调整。
“ reRender ”是一个关键属性。 该属性可以指向页面上被AJAX交互的要更新的区域,“ reRender ”属性的值是一个JSF组件的ID或ID列表。
一个简单的例子如下:
Java代码
...
<a4j:commandButton value="update" reRender="infoBlock"/>
...
<h:panelGrid id="infoBlock">
...
</h:panelGrid>.
...
...
<a4j:commandButton value="update" reRender="infoBlock"/>
...
<h:panelGrid id="infoBlock">
...
</h:panelGrid>.
...
<a4j:commandButton>标记的“ reRender ”属性的值定义了页面上哪一部分要进行更新。 这种情况,页面要更新的部分只有<h:panelGrid>标记,因为它的ID值匹配“reRender”属性的值。 正如所看到的,它并不难更新页面上的多个内容,只要“reRender” 的值列出他们的ID。
“reRender”使用UIComponent.findComponent ( )算法[http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/component/UIComponent.html#findComponent(java.lang.String)](有一些例外)在组件树找到该组件。 你可以看到,该算法假定几个步骤。 如果使用前面的步骤没有成功,其他步骤会逐个被使用。 因此,您可以定义该组件如何多快地更准确地被找到。 下面的例子显示了不同的办法(两个按钮将成功工作) :
Java代码
...
<h:form id="form1">
...
<a4j: commandButton value="Usual Way" reRender="infoBlock, infoBlock2" />
<a4j:commandButton value="Shortcut" reRender=":infoBlockl,:sv:infoBlock2" />
...
</h:form>
<h:panelGrid id="infoBlock">
...
</h:panelGrid>
...
<f:subview id="sv">
<h:panelGrid id="infoBlock2">
...
</h:panelGrid>
...
</f:subview>
...
...
<h:form id="form1">
...
<a4j: commandButton value="Usual Way" reRender="infoBlock, infoBlock2" />
<a4j:commandButton value="Shortcut" reRender=":infoBlockl,:sv:infoBlock2" />
...
</h:form>
<h:panelGrid id="infoBlock">
...
</h:panelGrid>
...
<f:subview id="sv">
<h:panelGrid id="infoBlock2">
...
</h:panelGrid>
...
</f:subview>
...
也可以使用JSF的EL表达作为reRender属性价。 这可以是一个类型集属性,Collection,数组或简单的字符串。 reRender的EL要在呈现响应阶段前正确解释。 因此,可以在Ajax的请求处理期间的任何一阶段计算应如何重新绘制。
最常见的问题是使用reRender是指向的组件有一个“rendered"”属性。 请注意,那样JSF不会在浏览器的DOM标记这个部件,除非在“rendered”的条件返回false情况下组件才会放入浏览器的DOM。 因此,在Ajax请求期间成为重绘的组件之后, RichFaces递交重绘代码给客户端,但不更新页面内容,因为更新的地方是不知道的。 您需要指向一个没有“rendered”属性的父组件的其中一个。 有一种替代办法,可以令该组件带有<a4j:outputPanel layout="none" >。
<a4j:outputPanel> 的“ ajaxRendered ”属性设置为“true”可以即使是没有明确给出在reRender属性该页面区域的也会重绘。如果有在任何Ajax请求的响应都要更新的页面区域,它是很有用的。 例如,下面的代码可以将会输出的错误信息,不管是否因为Ajax请求在验证阶段失败。
Java代码
...
<a4j:outputPanel ajaxRendered="true">
<h:messages />
</a4j:outputPanel>
...
...
<a4j:outputPanel ajaxRendered="true">
<h:messages />
</a4j:outputPanel>
...
“ limitToList ”属性允许解除<a4j:outputPanel> “ajaxRendered”属性的行为。 limitToList = "false"表示只更新有明确标在“ reRender ”属性的区域。所有带的 ajaxRendered="true"输出面板都被忽略。 一个例子如下:
Java代码
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" limitToList="true"/>
</h:inputText>
<h:outputText value="#{person.name}" id="test"/>
</form>
...
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" limitToList="true"/>
</h:inputText>
<h:outputText value="#{person.name}" id="test"/>
</form>
...
5.5.2 队列和交通溢出保护 (Queue and Traffic Flood Protection)
“ eventsQueue ”属性定义了队列的名称,这个队列用来整理即将到来的AJAX请求。 默认情况下,RichFaces不排列AJAX请求。 如果多个事件是同时产生,他们将同时到达服务器。JSF不保证执行(特别是第一次的)最先到来的请求,最先到来的请求将送达或成为在JSF 生命周期的最前面。如果请求同时发生,在服务器端修改数据的顺序是不可预测的。用eventsQueue属性可以避免可能的混乱。如果知道在应用程序中有密集的Ajax交互就明确指定队列名称。
如果定义了“ eventsQueue ”属性,接下来的请求放入同一队列等待,直到前一个请求不处理和已返回Ajax响应。 此外, RichFaces开始从队列中删除“类似”的请求。“类似”的请求是指相同的事件所产生的请求。 例如,根据下面的代码,如果返回上一个Ajax响应前,你输入速度非常快并已输入了多个字符,只有最新的请求会被发送到服务器。
Java代码
...
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" eventsQueue="foo" reRender="bar" />
</h:inputText>
...
...
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" eventsQueue="foo" reRender="bar" />
</h:inputText>
...
“ requestDelay ”属性定义了请求在即将发送前,在队列中将等待的时间(毫秒)。 当延迟时间结束时,如果最新的“类似”的请求是在队列里,该请求将被发送到服务器或删除。
“ ignoreDupResponses ”属性如果最新的“类似”的请求是在队列里忽视请求所产生的Ajax响应的。ignoreDupResponses"="true",不会取消在服务器上处理中的请求,但如果响应失去了事实,仅允许在客户端跳过不必要的更新。
同时设定“ eventsQueue ”与“ requestDelay ”可以避免不必要的交通溢出和AJAX请求顺序同步(Defining the "eventsQueue" along with "requestDelay" allows to protect against unnecessary traffic flood and synchronizes Ajax requests order.)。 如果有多个AJAX请求源,可以在那定义相同的队列名称。如果有来自用户事件引起调用异步请求的Ajax组件,这是非常有益的。 例如, <a4j:poll>或<a4j:push> 。 说不定来自这些组件的请求是修改同样的数据,同步是非常有益的。
可在RichFaces用户论坛找到更多信息 。
(http://203.208.39.99/translate_c?hl=zh-CN&langpair=en%7Czh-CN&u=http://jboss.com/index.html%3Fmodule%3Dbb%26op%3Dviewtopic%26t%3D105766&usg=ALkJrhgoEg0DtTpUBa-nW4muL0KJTcnt_A)
“timeout”属性是用来设置一个特定的请求所产生响应轮候时间。 如果在这段时间内响应是没有被收到,该请求被中止。
5.5.3 队列原则(Queue Principles)
从 3.3.0版开始RichFaces就有改良了的队列。
改良队列有一些严重的原因。 改良后的队列可以:
消除当几个JSF请求同时传到JSF生命周期(lifecycle)冲突的可能性。 队列阻止发送这些请求。只有一个请求被处理,其余的在等待。
减小浏览器和服务器之间的通信。“类似”的请求在requestDelay范围内是被合并。其实只有最后一个请求是发送的。 减少了请求的数量降低了服务器负载。
明显增加“无关”异步请求处理的数量。
有4种类型的队列:
全局默认队列,默认在web.xml文件中定义的
视图作用域默认队列
视图作用域命名队列
基于表单的默认队列
在本节中,我们将仔细研究在上面列出的类型的队列,更详细看看它们有何不同。 使用细节在<a4j:queue>篇章涵盖。
5.5.3.1 全局默认队列,默认在web.xml文件中定义
设计细则
视图只有一个全局队列永远存在
如果企图设置其属性时,用这个名称定义了超过一个队列,在呈现期间服务器控制台将出现一个警告。在第一个实例之后所有的相同命的名队列都被忽略。
队列类的名称是“ org.richfaces.queue.global ”
全局默认队列是应用级作用域和定义在web.xml中
实现如下:
Java代码
...
<context-param>
<param-name>org.richfaces.queue.global.enabled</param-name>
<param-value>true</param-value>
</context-param>
...
...
<context-param>
<param-name>org.richfaces.queue.global.enabled</param-name>
<param-value>true</param-value>
</context-param>
...
全局默认队列预设是禁用的,人为序列化页面上的所有Ajax请求会严重影响预期行为。
5.5.3.2 视图作用域默认队列
设计细则
在一个特定的视图或表单的时间内只有一个默认的队列是一直活跃。
如果发现在呈现期间有越来越多的警告出现在服务器控制台。在第一个实例后所有的相同命的名队列都被忽略。
具有以下Ajax属性的组件,视图作用域默认队列也会被创建: (在这种情况下,队列中有一个组件的作用域)
“ requestDelay ”
“ ignoreDupResponce ”
如果在一个组件的“ eventsQueue ”属性的定义是一些名称,视图作用域默认队列被自动创建,但在视图中找不到。 它与定义的对应上下文参数具有相同的作用域。
视图作用域默认情况,使用<a4j:queue>标记命名的和基于表单的队列类型,覆盖了在web.xml文件中定义的全局队列的设置。
使用如下代码也可以在单个视图里以编程方式启用/禁用全局队列:
Java代码
... ...
<a4j:queue name="org.richfaces.global_queue" disabled="true"... />
... ...
... ...
<a4j:queue name="org.richfaces.global_queue" disabled="true"... />
... ...
在这里要启用一个单独的视图页面的队列,必须定义“disable”属性为“flase” 。
现在,可以使用<a4j:queue>组件的属性覆盖默认设置。 完整属性列表是在本手册“ 6.20. <a4j:queue> ” 的一章里。
例如:
Java代码
...
<a4j:queue name="org.richfaces.global_queue" requestDelay="1000" />
...
...
<a4j:queue name="org.richfaces.global_queue" requestDelay="1000" />
...
只有队列的定义不指定名称,可以增加视图作用域队列。 在这种情况下,应该放在表单以外的任何地方,以便不被确认为一个基于表单的队列。
Java代码
...
lt;a4j:queue ... />
...
...
<a4j:queue ... />
...
5.5.3.3 视图作用域命名队列
设计细则
命名队列必须有独一无二的名称,如果第二个队列具有相同名称的定义,在第一个实例后所有的相同命的名队列都被忽略。
表单元素被用作队列的命名容器(Form elements are used as naming container for the queue),即在表单内定义的自定义队列不能被该表单外的组件使用。
可以从任何支持“ eventsQueue ”属性的Ajax4JSF或RichFaces组件引用命名队列。 下面有一个组件如何引用命名队列的例子。
例如:
Java代码
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
在这个例子中,两个组件(<a4j:queue>,<rich:comboBox>)通过“eventsQueue”属性引用命名队列。
5.5.3.4 基于表单的默认队列
设计细则
每次,只有一个可用的基于表单的默认队列是起作用。
如果超过一个可用的基于表单队列存在,在呈现期间在服务器控制台将出现一个警告。在第一个实例后所有的相同命的名队列都被忽略。
用户可以定义超过一个表队列,但是除了一个之外的必须禁用。
队列常常与表单一起使用,但表单的每个组件去设置“ eventsQueue ”属性是乏味的工作。为了避免这种情况,您可以为表单创建一个默认的队列(覆盖全局默认队列)。
你可以使用JSF的<h:form>或Ajax4JSF <a4j:form> 。
例如:
...
Java代码
<h:form ... >
<a4j:queue ... /><!-- note no name specified -->
...
</h:form>
<h:form ... >
<a4j:queue ... /><!-- note no name specified -->
...
</h:form>
然而,也可以使用Ajax4JSF <a4j:form>通过“ eventsQueue ”引用一个命名队列。
例如:
Java代码
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
不管怎样,队列的实现使你可以在带有基于表单队列的表单引用命名队列。
例如:
Java代码
...
<a4j:queue name="sampleQueue" ... /> <!-- named queue -->
...
<h:form ... >
<a4j:queue ... /><!-- form-based queue-->
<a4j:commandButton ... > <!-- uses the form-based queue -->
<a4j:commandButton eventsQueue="sampleQueue" > <!-- uses named queue -->
</h:form>
...
...
<a4j:queue name="sampleQueue" ... /> <!-- named queue -->
...
<h:form ... >
<a4j:queue ... /><!-- form-based queue-->
<a4j:commandButton ... > <!-- uses the form-based queue -->
<a4j:commandButton eventsQueue="sampleQueue" > <!-- uses named queue -->
</h:form>
...
5.5.3.5 队列功能
本节将覆盖到一些队列的功能方面。
5.5.3.5.1 事件相似性(Events Similarity)
默认情况下,与队列相似,所有事件触发于相同的组件(根据客户端事件源ID)。这意味着,如果新的请求来自同一个组件,他们是被与上一个请求合并一起。例如:如果我们在一个输入域上使用a4j:support和频繁地输入,在requestDelay期间所有触发于KeyUp的请求将合并成为一个请求。
您也可以手动指定多个组件将产生同样的请求。 在3.3.0版,“ similarityGroupingId ”属性添加到所有的Ajax行动组件。例如 ,您可以添加两个<a4j:support/>成分(一个用于key up和第二用于blur)用来输入和请求事件同样地指定相同的“ similarityGroupingId ”。
5.5.3.5.2 在请求延迟期间的相同请求
如上面所述请求是在requestDelay期间相同的被合并收集到队列中。但是,只有他是连续触发的相同请求才会被合并。这样做是为了不堵塞队列和不改变请求的顺序。
例如:
一个带有一些延迟的请求来到队列,让它是A1,这请求的延迟计数器启动。如果相同的请求(例如来自同一组件-A2)出现——这两个请求合并起来(A1A2到A合并)和该计数器复位。
但是,如果一些不相同的请求来来队列B1 –它是放在第一个后面(A合并,B1) 。 如果A合并请求不退出队列和另一个与A相同的请求(A3)再次出现——这些请求都不会合并到第一个。该请求放在B1后面。(A联合,B1,A3) 。
这样的做可以:
以最多的相同请求通过
为相同请求只发送的最新的输入域的状态(to send only the latest fields state for similar requests)
如果不同类型的请求来到排队,不阻塞队列,将等待另一个请求
从3.3.0版本开始,<a4j:poll>组件延迟时间默认为0,以便不用队列延迟(此参数本身的值用于重新定义队列的参数) ,以避免阻碍队列定期更新。如果需要,可以在组件级别重新定义这个。
5.5.3.5.3 JavaScript API
表5.1 JavaScript API
功能
描述
getSize() 返回当前的队列大小
getMaximumSize() 返回当前的队列最大的大小,在队列的“SIZE”属性指定
5.5.4 数据处理选项
RichFaces使用基于表单的方式发送Ajax请求。 这意味着每一次,当你按一下AJAX按钮或<a4j:poll>就产生一个异步请求,数据被最接近的JSF表单用XMLHttpRequest对象提交。表单数据包含表单输入元素的值的和辅助信息,如状态保存数据。
当“ ajaxSingle ”属性值为“true” ,它要求只包含当前组件的值(除带有<f:param>或<a4j:action>参数值外)到请求映射(map)。 假如<a4j:support> ,它是一个父组件的值。 例子如下:
Java代码
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
</h:inputText>
<h:inputText value="#{person.middleName}"/>
</form>
...
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
</h:inputText>
<h:inputText value="#{person.middleName}"/>
</form>
...
在这个例子中请求只包含的促使请求产生的输入组件,没有包含在表单上的所有的组件,因为ajaxSingle="true"的作用。
请注意,这ajaxSingle="true"降低了即将进行的流量,但并不妨碍服务器端解码其他输入组件。有些JSF的组件,如<h:selectOneMenu>在请求映射的值为一个空值不承认丢失数据,并尝试通过验证程序,尽管一个失败的结果。 因此,如有需要,使用<a4j:region>限制在服务器端处理组件树的一部分。
“immediate”属性与其他任何非JSF的组件具有相同用途。 默认“ ActionListener ”应立即执行(即在请求处理生命周期的应用请求值阶段期间),而不是等到调用应用阶段。使用immediate="true"是当其他值因有问题无法更新,能成功通过验证阶段的一些数据模型值更新方法之一。 这可能是在<h:dataTable>里重要的,正如由于<h:dataTable>组件架构,组件使用<a4j:region>是不可能。
“ bypassUpdates ”属性允许绕过更新模型阶段。 如果您需要检查您的输入为有效的验证器做准备,但不更新带这些数据的模型时是有用的。请注意,如果验证阶段是成功通过,就会在验证阶段的最后调用该动作。 应用阶段的监听器在任何情况下不会被调用。
5.5.5 动作和导航
Ajax的组件与任何其他非Ajax的JSF的组件类似,如<h:commandButton> 。 它允许提交表单。 您可以使用“动作”和“ actionListener ”属性调查动作的方法和定义动作事件。
如果您想要有一个具有局部页面更新的AJAX响应,“动作”的方法必须返回null。 这种正常模式叫做“Ajax请求产生非Ajax响应(Ajax request generates Non-Ajax Response)”。 如果动作不返回null,动作结果就要匹配其中一个导航规则。RichFaces起动就工作“Ajax请求产生非Ajax响应”模式。 这种模式可能会对两种主要情况有所帮助:
RichFaces可以在<a4j:include>组件内组织一个页面流。这是一个典型向导行为的情景。新的内容在<a4j:include>区域内呈现。 上下文是从Faces配置文件(通常是faces-config.xml文件)的导航规则提取。 请注意,该上下文的“向导”不是孤立于其他的页面。 所包含的网页不应该有自己的<f:view> (如果使用了facelets没关系-Facelets是用来建立JSF应用程序时的一个可供选择的表现层技术 )。 你需要有一个在<a4j:include>里的AJAX组件在向导之间导航,其他情况,整个页面将进行更新。
如果你想要调用服务器端的验证器,和当验证阶段是成功通过只导航到下一页,你可以把<a4j:commandButton>替换<h:commandButton>,并且指向导航到下一页的动作方法。如果验证过程失败,将会发生网页的局部更新和看到一条错误消息。其他情况,应用会进入下一页。请确保对导航规则设定了<redirect/>选项,以避免内存溢出。
5.5.6 。 JavaScript的相互作用
RichFaces允许编写启用AJAX 的JSF应用而无需编写任何JavaScript代码。 但是,如果您需要仍然可以调用JavaScript代码。有几个Ajax属性有助于做到这一点。
“ onsubmit ”属性让你在AJAX请求发送前调用JavaScript代码。 如果“ onsubmit ”返回“false” ,Ajax要求被取消。 “onsubmit” 的代码是插在RichFaces AJAX请求调用之前。 因此,如果想Ajax请求被发送“onsubmit”不应该有“return”的语句。 如果将要调用一个JavaScript函数,那就返回“true或“false” ,如果需要取消要求就使用条件语句返回的一些东西。 例如:
Java代码
...
onsubmit="if (mynosendfunct()==false){return false}"
...
...
onsubmit="if (mynosendfunct()==false){return false}"
...
“onclick”属性与“onsubmit” 类似,但只是可点击的部件才有,如<a4j:commandLink>和<a4j:commandButton>。如果返回“false”,Ajax请求也被取消。
“ oncomplete ”属性用于传递在AJAX响应返回并且DOM更新后执行的JavaScript。 它在EL表达式里使用关键字this是推荐使用的,因为它不一定总是指向一个已初始化的AJAX请求。
“ onbeforedomupdate ”属性定义在Ajax响应接收之后和在客户端更新的DOM之前执行的JavaScript代码。
“data”属性,用来在一个AJAX调用期间从服务器获得到额外的数据。 您可以使用JSF EL表达式指向托管bean的属性,它的值用JSON格式序列化和在客户端可用。 您可以使用的“data”变量引用。 例如:
Java代码
...
<a4j:commandButton value="Update" data="#{userBean.name}" oncomplete="showTheName(data.name)" />
...
...
<a4j:commandButton value="Update" data="#{userBean.name}" oncomplete="showTheName(data.name)" />
...
RichFaces不仅可以序列化原始类型到JSON格式,也可以复杂类型,包括数组和集合。 Beans也可以序列化被“data”引用 。
有许多有用的函数,可以在JavaScript使用 :
rich:clientId('id') -返回短ID形式的客户ID或如果指定的ID的组件没有找到就返回NULL
rich:element('id') – 是document.getElementById(#{rich:clientId('id')})的引用。
rich:component('id') –是#{rich:clientId('id')}.component的引用
rich:findComponent('id') -返回的一个以参数为组件的短ID的UIComponent实例。
Java代码
...
<h:inputText id="myInput">
<a4j:support event="onkeyup" reRender="outtext"/>
</h:inputText>
<h:outputText id="outtext" value="#{rich:findComponent('myInput').value}" />
...
...
<h:inputText id="myInput">
<a4j:support event="onkeyup" reRender="outtext"/>
</h:inputText>
<h:outputText id="outtext" value="#{rich:findComponent('myInput').value}" />
...
5.5.7 。迭代AJAX组件属性
“ ajaxKeys ”属性定义字符串,表示Ajax请求后被更新的内容。 它提供了分离地更新几个子组件而不更新整个网页的可能性。
Java代码
...
<a4j:poll intervall="1000" action="#{repeater.action}" reRender="text">
<table>
<tbody>
<a4j:repeat value="#{bean.props}" var="detail" ajaxKeys="#{repeater.ajaxedRowsSet}">
<tr>
<td>
<h:outputText value="detail.someProperty" id="text"/>
</td>
</tr>
</a4j:repeat>
</tbody>
</table>
</a4j:poll>
...
...
<a4j:poll intervall="1000" action="#{repeater.action}" reRender="text">
<table>
<tbody>
<a4j:repeat value="#{bean.props}" var="detail" ajaxKeys="#{repeater.ajaxedRowsSet}">
<tr>
<td>
<h:outputText value="detail.someProperty" id="text"/>
</td>
</tr>
</a4j:repeat>
</tbody>
</table>
</a4j:poll>
...
5.5.8其他有用的属性
"status"属性给Ajax组件(例如<a4j:commandButton>,<a4j:poll> 等等)指向一个<a4j:status>组件的ID。如想在不同区域的不同Ajax组件之间共享<a4j:status>组件就使用这属性。下面是它的例子。
Java代码
...
<a4j:region id="extr">
<h:form>
<h:outputText value="Status:" />
<a4j:status id="commonstatus" startText="In Progress...." stopText=""/>
<h:panelGrid columns="2">
<h:outputText value="Name"/>
<h:inputText id="name" value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="out" />
</h:inputText>
<h:outputText value="Job"/>
<a4j:region id="intr">
<h:inputText id="job" value="#{userBean.job}">
<a4j:support event="onkeyup" reRender="out" status="commonstatus"/>
</h:inputText>
</a4j:region>
</h:panelGrid>
<a4j:region>
<h:outputText id="out" value="Name: #{userBean.name}, Job: #{userBean.job}" />
<br />
<a4j:commandButton ajaxSingle="true" value="Clean Up Form" reRender="name, job, out" status="commonstatus">
<a4j:actionparam name="n" value="" assignTo="#{userBean.name}" />
<a4j:actionparam name="j" value="" assignTo="#{userBean.job}" />
</a4j:commandButton>
</a4j:region>
</h:form>
</a4j:region>
...
...
<a4j:region id="extr">
<h:form>
<h:outputText value="Status:" />
<a4j:status id="commonstatus" startText="In Progress...." stopText=""/>
<h:panelGrid columns="2">
<h:outputText value="Name"/>
<h:inputText id="name" value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="out" />
</h:inputText>
<h:outputText value="Job"/>
<a4j:region id="intr">
<h:inputText id="job" value="#{userBean.job}">
<a4j:support event="onkeyup" reRender="out" status="commonstatus"/>
</h:inputText>
</a4j:region>
</h:panelGrid>
<a4j:region>
<h:outputText id="out" value="Name: #{userBean.name}, Job: #{userBean.job}" />
<br />
<a4j:commandButton ajaxSingle="true" value="Clean Up Form" reRender="name, job, out" status="commonstatus">
<a4j:actionparam name="n" value="" assignTo="#{userBean.name}" />
<a4j:actionparam name="j" value="" assignTo="#{userBean.job}" />
</a4j:commandButton>
</a4j:region>
</h:form>
</a4j:region>
...
在这个实例中<a4j:support>和<a4j:commandButton> 在不同的区域中定义。这些组件"status"属性的值指向<a4j:support>ID。因此,这个<a4j:support> 组件是在不同区域的两个不同组件之间共享。
在这里能找到更多信息:
http://livedemo.exadel.com/richfaces-demo/richfaces/status.jsf?c=status
另一个有用的属性是"focus" 。它是指向一个在Ajax请求后会获得焦点的组件的ID。[/size][/size][/size]
5.5.1 重新绘制 (Re-Rendering)
Ajax组件的共同Aja属性,如<a4j:support> , <a4j:commandButton> , <a4j:jsFunction> , <a4j:poll> , <a4j:push>等等。 并且,大多数内置Ajax的RichFaces组件支持这些相似作用的属性。Ajax组件属性帮助RichFaces显露其功能。大多数属性有默认值。 因此,您就可以开始使用RichFaces而不知道这些属性的用法。然而,它们的使用可以根据所需要的Ajax很容易地调整。
“ reRender ”是一个关键属性。 该属性可以指向页面上被AJAX交互的要更新的区域,“ reRender ”属性的值是一个JSF组件的ID或ID列表。
一个简单的例子如下:
Java代码
...
<a4j:commandButton value="update" reRender="infoBlock"/>
...
<h:panelGrid id="infoBlock">
...
</h:panelGrid>.
...
...
<a4j:commandButton value="update" reRender="infoBlock"/>
...
<h:panelGrid id="infoBlock">
...
</h:panelGrid>.
...
<a4j:commandButton>标记的“ reRender ”属性的值定义了页面上哪一部分要进行更新。 这种情况,页面要更新的部分只有<h:panelGrid>标记,因为它的ID值匹配“reRender”属性的值。 正如所看到的,它并不难更新页面上的多个内容,只要“reRender” 的值列出他们的ID。
“reRender”使用UIComponent.findComponent ( )算法[http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/component/UIComponent.html#findComponent(java.lang.String)](有一些例外)在组件树找到该组件。 你可以看到,该算法假定几个步骤。 如果使用前面的步骤没有成功,其他步骤会逐个被使用。 因此,您可以定义该组件如何多快地更准确地被找到。 下面的例子显示了不同的办法(两个按钮将成功工作) :
Java代码
...
<h:form id="form1">
...
<a4j: commandButton value="Usual Way" reRender="infoBlock, infoBlock2" />
<a4j:commandButton value="Shortcut" reRender=":infoBlockl,:sv:infoBlock2" />
...
</h:form>
<h:panelGrid id="infoBlock">
...
</h:panelGrid>
...
<f:subview id="sv">
<h:panelGrid id="infoBlock2">
...
</h:panelGrid>
...
</f:subview>
...
...
<h:form id="form1">
...
<a4j: commandButton value="Usual Way" reRender="infoBlock, infoBlock2" />
<a4j:commandButton value="Shortcut" reRender=":infoBlockl,:sv:infoBlock2" />
...
</h:form>
<h:panelGrid id="infoBlock">
...
</h:panelGrid>
...
<f:subview id="sv">
<h:panelGrid id="infoBlock2">
...
</h:panelGrid>
...
</f:subview>
...
也可以使用JSF的EL表达作为reRender属性价。 这可以是一个类型集属性,Collection,数组或简单的字符串。 reRender的EL要在呈现响应阶段前正确解释。 因此,可以在Ajax的请求处理期间的任何一阶段计算应如何重新绘制。
最常见的问题是使用reRender是指向的组件有一个“rendered"”属性。 请注意,那样JSF不会在浏览器的DOM标记这个部件,除非在“rendered”的条件返回false情况下组件才会放入浏览器的DOM。 因此,在Ajax请求期间成为重绘的组件之后, RichFaces递交重绘代码给客户端,但不更新页面内容,因为更新的地方是不知道的。 您需要指向一个没有“rendered”属性的父组件的其中一个。 有一种替代办法,可以令该组件带有<a4j:outputPanel layout="none" >。
<a4j:outputPanel> 的“ ajaxRendered ”属性设置为“true”可以即使是没有明确给出在reRender属性该页面区域的也会重绘。如果有在任何Ajax请求的响应都要更新的页面区域,它是很有用的。 例如,下面的代码可以将会输出的错误信息,不管是否因为Ajax请求在验证阶段失败。
Java代码
...
<a4j:outputPanel ajaxRendered="true">
<h:messages />
</a4j:outputPanel>
...
...
<a4j:outputPanel ajaxRendered="true">
<h:messages />
</a4j:outputPanel>
...
“ limitToList ”属性允许解除<a4j:outputPanel> “ajaxRendered”属性的行为。 limitToList = "false"表示只更新有明确标在“ reRender ”属性的区域。所有带的 ajaxRendered="true"输出面板都被忽略。 一个例子如下:
Java代码
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" limitToList="true"/>
</h:inputText>
<h:outputText value="#{person.name}" id="test"/>
</form>
...
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" limitToList="true"/>
</h:inputText>
<h:outputText value="#{person.name}" id="test"/>
</form>
...
5.5.2 队列和交通溢出保护 (Queue and Traffic Flood Protection)
“ eventsQueue ”属性定义了队列的名称,这个队列用来整理即将到来的AJAX请求。 默认情况下,RichFaces不排列AJAX请求。 如果多个事件是同时产生,他们将同时到达服务器。JSF不保证执行(特别是第一次的)最先到来的请求,最先到来的请求将送达或成为在JSF 生命周期的最前面。如果请求同时发生,在服务器端修改数据的顺序是不可预测的。用eventsQueue属性可以避免可能的混乱。如果知道在应用程序中有密集的Ajax交互就明确指定队列名称。
如果定义了“ eventsQueue ”属性,接下来的请求放入同一队列等待,直到前一个请求不处理和已返回Ajax响应。 此外, RichFaces开始从队列中删除“类似”的请求。“类似”的请求是指相同的事件所产生的请求。 例如,根据下面的代码,如果返回上一个Ajax响应前,你输入速度非常快并已输入了多个字符,只有最新的请求会被发送到服务器。
Java代码
...
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" eventsQueue="foo" reRender="bar" />
</h:inputText>
...
...
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" eventsQueue="foo" reRender="bar" />
</h:inputText>
...
“ requestDelay ”属性定义了请求在即将发送前,在队列中将等待的时间(毫秒)。 当延迟时间结束时,如果最新的“类似”的请求是在队列里,该请求将被发送到服务器或删除。
“ ignoreDupResponses ”属性如果最新的“类似”的请求是在队列里忽视请求所产生的Ajax响应的。ignoreDupResponses"="true",不会取消在服务器上处理中的请求,但如果响应失去了事实,仅允许在客户端跳过不必要的更新。
同时设定“ eventsQueue ”与“ requestDelay ”可以避免不必要的交通溢出和AJAX请求顺序同步(Defining the "eventsQueue" along with "requestDelay" allows to protect against unnecessary traffic flood and synchronizes Ajax requests order.)。 如果有多个AJAX请求源,可以在那定义相同的队列名称。如果有来自用户事件引起调用异步请求的Ajax组件,这是非常有益的。 例如, <a4j:poll>或<a4j:push> 。 说不定来自这些组件的请求是修改同样的数据,同步是非常有益的。
可在RichFaces用户论坛找到更多信息 。
(http://203.208.39.99/translate_c?hl=zh-CN&langpair=en%7Czh-CN&u=http://jboss.com/index.html%3Fmodule%3Dbb%26op%3Dviewtopic%26t%3D105766&usg=ALkJrhgoEg0DtTpUBa-nW4muL0KJTcnt_A)
“timeout”属性是用来设置一个特定的请求所产生响应轮候时间。 如果在这段时间内响应是没有被收到,该请求被中止。
5.5.3 队列原则(Queue Principles)
从 3.3.0版开始RichFaces就有改良了的队列。
改良队列有一些严重的原因。 改良后的队列可以:
消除当几个JSF请求同时传到JSF生命周期(lifecycle)冲突的可能性。 队列阻止发送这些请求。只有一个请求被处理,其余的在等待。
减小浏览器和服务器之间的通信。“类似”的请求在requestDelay范围内是被合并。其实只有最后一个请求是发送的。 减少了请求的数量降低了服务器负载。
明显增加“无关”异步请求处理的数量。
有4种类型的队列:
全局默认队列,默认在web.xml文件中定义的
视图作用域默认队列
视图作用域命名队列
基于表单的默认队列
在本节中,我们将仔细研究在上面列出的类型的队列,更详细看看它们有何不同。 使用细节在<a4j:queue>篇章涵盖。
5.5.3.1 全局默认队列,默认在web.xml文件中定义
设计细则
视图只有一个全局队列永远存在
如果企图设置其属性时,用这个名称定义了超过一个队列,在呈现期间服务器控制台将出现一个警告。在第一个实例之后所有的相同命的名队列都被忽略。
队列类的名称是“ org.richfaces.queue.global ”
全局默认队列是应用级作用域和定义在web.xml中
实现如下:
Java代码
...
<context-param>
<param-name>org.richfaces.queue.global.enabled</param-name>
<param-value>true</param-value>
</context-param>
...
...
<context-param>
<param-name>org.richfaces.queue.global.enabled</param-name>
<param-value>true</param-value>
</context-param>
...
全局默认队列预设是禁用的,人为序列化页面上的所有Ajax请求会严重影响预期行为。
5.5.3.2 视图作用域默认队列
设计细则
在一个特定的视图或表单的时间内只有一个默认的队列是一直活跃。
如果发现在呈现期间有越来越多的警告出现在服务器控制台。在第一个实例后所有的相同命的名队列都被忽略。
具有以下Ajax属性的组件,视图作用域默认队列也会被创建: (在这种情况下,队列中有一个组件的作用域)
“ requestDelay ”
“ ignoreDupResponce ”
如果在一个组件的“ eventsQueue ”属性的定义是一些名称,视图作用域默认队列被自动创建,但在视图中找不到。 它与定义的对应上下文参数具有相同的作用域。
视图作用域默认情况,使用<a4j:queue>标记命名的和基于表单的队列类型,覆盖了在web.xml文件中定义的全局队列的设置。
使用如下代码也可以在单个视图里以编程方式启用/禁用全局队列:
Java代码
... ...
<a4j:queue name="org.richfaces.global_queue" disabled="true"... />
... ...
... ...
<a4j:queue name="org.richfaces.global_queue" disabled="true"... />
... ...
在这里要启用一个单独的视图页面的队列,必须定义“disable”属性为“flase” 。
现在,可以使用<a4j:queue>组件的属性覆盖默认设置。 完整属性列表是在本手册“ 6.20. <a4j:queue> ” 的一章里。
例如:
Java代码
...
<a4j:queue name="org.richfaces.global_queue" requestDelay="1000" />
...
...
<a4j:queue name="org.richfaces.global_queue" requestDelay="1000" />
...
只有队列的定义不指定名称,可以增加视图作用域队列。 在这种情况下,应该放在表单以外的任何地方,以便不被确认为一个基于表单的队列。
Java代码
...
lt;a4j:queue ... />
...
...
<a4j:queue ... />
...
5.5.3.3 视图作用域命名队列
设计细则
命名队列必须有独一无二的名称,如果第二个队列具有相同名称的定义,在第一个实例后所有的相同命的名队列都被忽略。
表单元素被用作队列的命名容器(Form elements are used as naming container for the queue),即在表单内定义的自定义队列不能被该表单外的组件使用。
可以从任何支持“ eventsQueue ”属性的Ajax4JSF或RichFaces组件引用命名队列。 下面有一个组件如何引用命名队列的例子。
例如:
Java代码
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
在这个例子中,两个组件(<a4j:queue>,<rich:comboBox>)通过“eventsQueue”属性引用命名队列。
5.5.3.4 基于表单的默认队列
设计细则
每次,只有一个可用的基于表单的默认队列是起作用。
如果超过一个可用的基于表单队列存在,在呈现期间在服务器控制台将出现一个警告。在第一个实例后所有的相同命的名队列都被忽略。
用户可以定义超过一个表队列,但是除了一个之外的必须禁用。
队列常常与表单一起使用,但表单的每个组件去设置“ eventsQueue ”属性是乏味的工作。为了避免这种情况,您可以为表单创建一个默认的队列(覆盖全局默认队列)。
你可以使用JSF的<h:form>或Ajax4JSF <a4j:form> 。
例如:
...
Java代码
<h:form ... >
<a4j:queue ... /><!-- note no name specified -->
...
</h:form>
<h:form ... >
<a4j:queue ... /><!-- note no name specified -->
...
</h:form>
然而,也可以使用Ajax4JSF <a4j:form>通过“ eventsQueue ”引用一个命名队列。
例如:
Java代码
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
...
<a4j:queue name="sampleQueue"/>
<h:inputText value="#{bean.inputValue}" >
<a4j:support id="inputSupport" event="onkeyup" eventsQueue="sample"/>
</h:inputText>
<rich:comboBox value="#{bean.state}" suggestionValues="#{bean.suggestions}" eventsQueue="sample" />
不管怎样,队列的实现使你可以在带有基于表单队列的表单引用命名队列。
例如:
Java代码
...
<a4j:queue name="sampleQueue" ... /> <!-- named queue -->
...
<h:form ... >
<a4j:queue ... /><!-- form-based queue-->
<a4j:commandButton ... > <!-- uses the form-based queue -->
<a4j:commandButton eventsQueue="sampleQueue" > <!-- uses named queue -->
</h:form>
...
...
<a4j:queue name="sampleQueue" ... /> <!-- named queue -->
...
<h:form ... >
<a4j:queue ... /><!-- form-based queue-->
<a4j:commandButton ... > <!-- uses the form-based queue -->
<a4j:commandButton eventsQueue="sampleQueue" > <!-- uses named queue -->
</h:form>
...
5.5.3.5 队列功能
本节将覆盖到一些队列的功能方面。
5.5.3.5.1 事件相似性(Events Similarity)
默认情况下,与队列相似,所有事件触发于相同的组件(根据客户端事件源ID)。这意味着,如果新的请求来自同一个组件,他们是被与上一个请求合并一起。例如:如果我们在一个输入域上使用a4j:support和频繁地输入,在requestDelay期间所有触发于KeyUp的请求将合并成为一个请求。
您也可以手动指定多个组件将产生同样的请求。 在3.3.0版,“ similarityGroupingId ”属性添加到所有的Ajax行动组件。例如 ,您可以添加两个<a4j:support/>成分(一个用于key up和第二用于blur)用来输入和请求事件同样地指定相同的“ similarityGroupingId ”。
5.5.3.5.2 在请求延迟期间的相同请求
如上面所述请求是在requestDelay期间相同的被合并收集到队列中。但是,只有他是连续触发的相同请求才会被合并。这样做是为了不堵塞队列和不改变请求的顺序。
例如:
一个带有一些延迟的请求来到队列,让它是A1,这请求的延迟计数器启动。如果相同的请求(例如来自同一组件-A2)出现——这两个请求合并起来(A1A2到A合并)和该计数器复位。
但是,如果一些不相同的请求来来队列B1 –它是放在第一个后面(A合并,B1) 。 如果A合并请求不退出队列和另一个与A相同的请求(A3)再次出现——这些请求都不会合并到第一个。该请求放在B1后面。(A联合,B1,A3) 。
这样的做可以:
以最多的相同请求通过
为相同请求只发送的最新的输入域的状态(to send only the latest fields state for similar requests)
如果不同类型的请求来到排队,不阻塞队列,将等待另一个请求
从3.3.0版本开始,<a4j:poll>组件延迟时间默认为0,以便不用队列延迟(此参数本身的值用于重新定义队列的参数) ,以避免阻碍队列定期更新。如果需要,可以在组件级别重新定义这个。
5.5.3.5.3 JavaScript API
表5.1 JavaScript API
功能
描述
getSize() 返回当前的队列大小
getMaximumSize() 返回当前的队列最大的大小,在队列的“SIZE”属性指定
5.5.4 数据处理选项
RichFaces使用基于表单的方式发送Ajax请求。 这意味着每一次,当你按一下AJAX按钮或<a4j:poll>就产生一个异步请求,数据被最接近的JSF表单用XMLHttpRequest对象提交。表单数据包含表单输入元素的值的和辅助信息,如状态保存数据。
当“ ajaxSingle ”属性值为“true” ,它要求只包含当前组件的值(除带有<f:param>或<a4j:action>参数值外)到请求映射(map)。 假如<a4j:support> ,它是一个父组件的值。 例子如下:
Java代码
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
</h:inputText>
<h:inputText value="#{person.middleName}"/>
</form>
...
...
<h:form>
<h:inputText value="#{person.name}">
<a4j:support event="onkeyup" reRender="test" ajaxSingle="true"/>
</h:inputText>
<h:inputText value="#{person.middleName}"/>
</form>
...
在这个例子中请求只包含的促使请求产生的输入组件,没有包含在表单上的所有的组件,因为ajaxSingle="true"的作用。
请注意,这ajaxSingle="true"降低了即将进行的流量,但并不妨碍服务器端解码其他输入组件。有些JSF的组件,如<h:selectOneMenu>在请求映射的值为一个空值不承认丢失数据,并尝试通过验证程序,尽管一个失败的结果。 因此,如有需要,使用<a4j:region>限制在服务器端处理组件树的一部分。
“immediate”属性与其他任何非JSF的组件具有相同用途。 默认“ ActionListener ”应立即执行(即在请求处理生命周期的应用请求值阶段期间),而不是等到调用应用阶段。使用immediate="true"是当其他值因有问题无法更新,能成功通过验证阶段的一些数据模型值更新方法之一。 这可能是在<h:dataTable>里重要的,正如由于<h:dataTable>组件架构,组件使用<a4j:region>是不可能。
“ bypassUpdates ”属性允许绕过更新模型阶段。 如果您需要检查您的输入为有效的验证器做准备,但不更新带这些数据的模型时是有用的。请注意,如果验证阶段是成功通过,就会在验证阶段的最后调用该动作。 应用阶段的监听器在任何情况下不会被调用。
5.5.5 动作和导航
Ajax的组件与任何其他非Ajax的JSF的组件类似,如<h:commandButton> 。 它允许提交表单。 您可以使用“动作”和“ actionListener ”属性调查动作的方法和定义动作事件。
如果您想要有一个具有局部页面更新的AJAX响应,“动作”的方法必须返回null。 这种正常模式叫做“Ajax请求产生非Ajax响应(Ajax request generates Non-Ajax Response)”。 如果动作不返回null,动作结果就要匹配其中一个导航规则。RichFaces起动就工作“Ajax请求产生非Ajax响应”模式。 这种模式可能会对两种主要情况有所帮助:
RichFaces可以在<a4j:include>组件内组织一个页面流。这是一个典型向导行为的情景。新的内容在<a4j:include>区域内呈现。 上下文是从Faces配置文件(通常是faces-config.xml文件)的导航规则提取。 请注意,该上下文的“向导”不是孤立于其他的页面。 所包含的网页不应该有自己的<f:view> (如果使用了facelets没关系-Facelets是用来建立JSF应用程序时的一个可供选择的表现层技术 )。 你需要有一个在<a4j:include>里的AJAX组件在向导之间导航,其他情况,整个页面将进行更新。
如果你想要调用服务器端的验证器,和当验证阶段是成功通过只导航到下一页,你可以把<a4j:commandButton>替换<h:commandButton>,并且指向导航到下一页的动作方法。如果验证过程失败,将会发生网页的局部更新和看到一条错误消息。其他情况,应用会进入下一页。请确保对导航规则设定了<redirect/>选项,以避免内存溢出。
5.5.6 。 JavaScript的相互作用
RichFaces允许编写启用AJAX 的JSF应用而无需编写任何JavaScript代码。 但是,如果您需要仍然可以调用JavaScript代码。有几个Ajax属性有助于做到这一点。
“ onsubmit ”属性让你在AJAX请求发送前调用JavaScript代码。 如果“ onsubmit ”返回“false” ,Ajax要求被取消。 “onsubmit” 的代码是插在RichFaces AJAX请求调用之前。 因此,如果想Ajax请求被发送“onsubmit”不应该有“return”的语句。 如果将要调用一个JavaScript函数,那就返回“true或“false” ,如果需要取消要求就使用条件语句返回的一些东西。 例如:
Java代码
...
onsubmit="if (mynosendfunct()==false){return false}"
...
...
onsubmit="if (mynosendfunct()==false){return false}"
...
“onclick”属性与“onsubmit” 类似,但只是可点击的部件才有,如<a4j:commandLink>和<a4j:commandButton>。如果返回“false”,Ajax请求也被取消。
“ oncomplete ”属性用于传递在AJAX响应返回并且DOM更新后执行的JavaScript。 它在EL表达式里使用关键字this是推荐使用的,因为它不一定总是指向一个已初始化的AJAX请求。
“ onbeforedomupdate ”属性定义在Ajax响应接收之后和在客户端更新的DOM之前执行的JavaScript代码。
“data”属性,用来在一个AJAX调用期间从服务器获得到额外的数据。 您可以使用JSF EL表达式指向托管bean的属性,它的值用JSON格式序列化和在客户端可用。 您可以使用的“data”变量引用。 例如:
Java代码
...
<a4j:commandButton value="Update" data="#{userBean.name}" oncomplete="showTheName(data.name)" />
...
...
<a4j:commandButton value="Update" data="#{userBean.name}" oncomplete="showTheName(data.name)" />
...
RichFaces不仅可以序列化原始类型到JSON格式,也可以复杂类型,包括数组和集合。 Beans也可以序列化被“data”引用 。
有许多有用的函数,可以在JavaScript使用 :
rich:clientId('id') -返回短ID形式的客户ID或如果指定的ID的组件没有找到就返回NULL
rich:element('id') – 是document.getElementById(#{rich:clientId('id')})的引用。
rich:component('id') –是#{rich:clientId('id')}.component的引用
rich:findComponent('id') -返回的一个以参数为组件的短ID的UIComponent实例。
Java代码
...
<h:inputText id="myInput">
<a4j:support event="onkeyup" reRender="outtext"/>
</h:inputText>
<h:outputText id="outtext" value="#{rich:findComponent('myInput').value}" />
...
...
<h:inputText id="myInput">
<a4j:support event="onkeyup" reRender="outtext"/>
</h:inputText>
<h:outputText id="outtext" value="#{rich:findComponent('myInput').value}" />
...
5.5.7 。迭代AJAX组件属性
“ ajaxKeys ”属性定义字符串,表示Ajax请求后被更新的内容。 它提供了分离地更新几个子组件而不更新整个网页的可能性。
Java代码
...
<a4j:poll intervall="1000" action="#{repeater.action}" reRender="text">
<table>
<tbody>
<a4j:repeat value="#{bean.props}" var="detail" ajaxKeys="#{repeater.ajaxedRowsSet}">
<tr>
<td>
<h:outputText value="detail.someProperty" id="text"/>
</td>
</tr>
</a4j:repeat>
</tbody>
</table>
</a4j:poll>
...
...
<a4j:poll intervall="1000" action="#{repeater.action}" reRender="text">
<table>
<tbody>
<a4j:repeat value="#{bean.props}" var="detail" ajaxKeys="#{repeater.ajaxedRowsSet}">
<tr>
<td>
<h:outputText value="detail.someProperty" id="text"/>
</td>
</tr>
</a4j:repeat>
</tbody>
</table>
</a4j:poll>
...
5.5.8其他有用的属性
"status"属性给Ajax组件(例如<a4j:commandButton>,<a4j:poll> 等等)指向一个<a4j:status>组件的ID。如想在不同区域的不同Ajax组件之间共享<a4j:status>组件就使用这属性。下面是它的例子。
Java代码
...
<a4j:region id="extr">
<h:form>
<h:outputText value="Status:" />
<a4j:status id="commonstatus" startText="In Progress...." stopText=""/>
<h:panelGrid columns="2">
<h:outputText value="Name"/>
<h:inputText id="name" value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="out" />
</h:inputText>
<h:outputText value="Job"/>
<a4j:region id="intr">
<h:inputText id="job" value="#{userBean.job}">
<a4j:support event="onkeyup" reRender="out" status="commonstatus"/>
</h:inputText>
</a4j:region>
</h:panelGrid>
<a4j:region>
<h:outputText id="out" value="Name: #{userBean.name}, Job: #{userBean.job}" />
<br />
<a4j:commandButton ajaxSingle="true" value="Clean Up Form" reRender="name, job, out" status="commonstatus">
<a4j:actionparam name="n" value="" assignTo="#{userBean.name}" />
<a4j:actionparam name="j" value="" assignTo="#{userBean.job}" />
</a4j:commandButton>
</a4j:region>
</h:form>
</a4j:region>
...
...
<a4j:region id="extr">
<h:form>
<h:outputText value="Status:" />
<a4j:status id="commonstatus" startText="In Progress...." stopText=""/>
<h:panelGrid columns="2">
<h:outputText value="Name"/>
<h:inputText id="name" value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="out" />
</h:inputText>
<h:outputText value="Job"/>
<a4j:region id="intr">
<h:inputText id="job" value="#{userBean.job}">
<a4j:support event="onkeyup" reRender="out" status="commonstatus"/>
</h:inputText>
</a4j:region>
</h:panelGrid>
<a4j:region>
<h:outputText id="out" value="Name: #{userBean.name}, Job: #{userBean.job}" />
<br />
<a4j:commandButton ajaxSingle="true" value="Clean Up Form" reRender="name, job, out" status="commonstatus">
<a4j:actionparam name="n" value="" assignTo="#{userBean.name}" />
<a4j:actionparam name="j" value="" assignTo="#{userBean.job}" />
</a4j:commandButton>
</a4j:region>
</h:form>
</a4j:region>
...
在这个实例中<a4j:support>和<a4j:commandButton> 在不同的区域中定义。这些组件"status"属性的值指向<a4j:support>ID。因此,这个<a4j:support> 组件是在不同区域的两个不同组件之间共享。
在这里能找到更多信息:
http://livedemo.exadel.com/richfaces-demo/richfaces/status.jsf?c=status
另一个有用的属性是"focus" 。它是指向一个在Ajax请求后会获得焦点的组件的ID。[/size][/size][/size]
相关推荐
RichFaces框架的基本概念架 该框架是一个能在现有的页面增加Ajax的功能的组件库,所以你不需要写任何JavaScript代码或用新的Ajax工具集(widget)取代现有的组件。RichFaces具有页面范围(page-wide)的Ajax支持,而...
#### 五、RichFaces框架基本概念 - **架构概览:** 详细阐述了RichFaces的核心架构,包括各个组成部分的功能和作用。 - **框架关键部分:** 分析了构成RichFaces的重要模块,如组件、事件处理机制等。 - **限制与...
seam+richfaces环境框架的配置文件,经过我多次尝试才配置好的环境配置文件,很有用,适合刚接触这些技术的初学者,希望大家支持!
**RichFaces组件**:除了基本的JSF组件外,RichFaces框架提供了许多增强型组件,比如数据网格、滑块、日历、对话框等,这些组件具有内置的AJAX支持,可以在不重新加载整个页面的情况下更新部分视图。在`jsf.jsp`和`...
从下载安装到创建首个AJAX Echo项目,RichFaces提供了详尽的指导文档,覆盖了JSP页面编写、数据Bean定义、`faces-config.xml`和`web.xml`配置,直至应用部署,确保开发者能够快速掌握框架的基本用法。 四、不同环境...
这意味着你可以深入理解并实践RichFaces框架的各种功能和特性。” **知识点详解:** **1. RichFaces框架:** RichFaces是一个基于JavaServer Faces (JSF) 的开源组件库,提供了丰富的AJAX功能和用户界面组件。它...
### RichFaces框架基本概念 #### 架构概览 手册对RichFaces的架构进行了全面剖析,解释了其内部机制和工作原理,包括组件模型、事件处理、数据绑定等方面,帮助开发者深刻理解框架的设计理念和技术优势。 #### ...
RichFaces 4.0 是一个强大的JavaServer Faces (JSF) 框架的扩展库,主要用于构建富互联网应用程序(RIA)。它提供了丰富的组件库,增强了用户体验,允许开发者创建交互性和动态性极强的Web应用。这个压缩包包含了...
标题《RichFaces 4.3 Component Reference》以及描述表明,本文档是关于RichFaces 4.3框架的组件参考指南。RichFaces是一个基于JavaServer Faces (JSF) 的开源库,允许开发者在Java Web应用程序中创建丰富的用户界面...
"richfaces-ui-3.3.GA jar" 是一个特定版本的 RichFaces UI 库的标识,其中 "richfaces" 指的是 RichFaces 框架,"ui" 可能代表用户界面组件,"3.3.GA" 表示版本号,GA 通常代表“General Availability”,即正式...
五、核心概念与实践:掌握RichFaces框架 ### 1. Ajax请求优化 RichFaces的Ajax功能是其一大亮点。通过对重渲染、队列管理和数据处理策略的精细控制,开发者可以有效避免网络拥塞,提升用户体验。 ### 2. ...
**标题解析:** "richfaces_helloWorld" 这个标题暗示了我们正在处理一个与RichFaces框架相关的示例项目,具体来说是一个“Hello World”应用。RichFaces是基于JavaServer Faces (JSF) 技术的开源用户界面组件库,...
#### RichFaces框架基本概念 - **架构概览**:深入了解RichFaces的架构设计,包括组件模型、事件处理机制、AJAX请求优化等,有助于开发者更高效地利用框架功能。 - **限制与规则**:掌握框架的限制和规定,避免常见...
首先,我们要了解RichFaces的核心概念。它是基于JavaServer Faces(JSF)标准的扩展,通过集成AJAX4JSF库,实现了在JSF应用中的无缝AJAX支持。AJAX4JSF提供了一系列可重用的UI组件和事件处理机制,使得开发者能够在...
《深入理解RichFaces UI框架与jar包》 在Java Web开发领域,RichFaces是一个非常流行的开源框架,它为开发者提供了构建交互式用户界面的强大工具。本文将深入探讨"richfaces-ui-3.2.1.GA-bin.zip"压缩包中的核心...
在Java Web开发领域,RichFaces是一个广泛使用的开源框架,它为构建富互联网应用程序(Rich Internet Applications, RIA)提供了强大的支持。本文将围绕"richfaces-ui-3.2.2.GA jar"这一核心组件,详细阐述其功能、...
**Richfaces ShowCase离线包** 是一个专为开发者设计的资源包,它包含了Richfaces框架的演示示例,能够帮助用户在没有网络连接的情况下也能深入理解和学习Richfaces的功能和用法。这个离线包特别适合那些需要在本地...
#### 五、基本概念 - **RichFaces 架构概述**:理解RichFaces 的整体架构是掌握其核心功能的关键。 - **RichFaces 的核心组成部分**:了解构成框架的主要模块及其作用。 - **限制和规则**:明确在使用RichFaces 时...