`
wangzl2222
  • 浏览: 151496 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

JSF Chapter04(频繁调用控件)

阅读更多

1.      

<!-- [endif]-->

用队列控制 Event Traffic

 

<!-- [if !supportLists]-->1)  <!-- [endif]-->以下两个属性用来避免由频繁的 DHTML 事件所引发大量的 request 请求。

· eventsQueue

· requestDelay

 

<!-- [if !supportLists]-->2)  <!-- [endif]-->对于能够引发 Ajax Request 4 种控件来说,以上两种属性都是可用的。

 

<!-- [if !supportLists]-->3)  <!-- [endif]-->eventQueue 属性

· eventQueue 属性指定一个对列名,则在当前一个 Request Server 处理而 Response 还未被发回之前,下一个 Request 都将停留在队列里,以等待 Response 被发回。

 

· 队列里总保持只有一个待发的 Request ,所有后续的 Request 都会将前面未发的 Request 清除掉。

比如,当你在 <a4j:support event=”onkeyup”> 的文本框中输入第一个字符‘ a ’,则第一个 Request 会被立即发到 Server ,但在 Response 被发回之前,你又输入了‘ b ’,则文本框里的值变为‘ ab ’,但这个 Request 只能等待第一个 Response 被发回来以后才能被送出。而此时,你又输入了第三个字符‘ c ’,则‘ abc ’的 Request 就回把队列里还没来得及发出去的‘ ab ’的 Request 清除掉。此时,第一个 Response “终于”回来了,则‘ abc ’的 Request 才被顺利的发出去。

 

· 大致测试了一下,当多个控件将队列名都设为同一个的时候,比如 eventsQueue = fooQueue ,控件之间的 Request 不会相互干扰,也就是说控件 B 的新的 Request ,并不会把同一队列中控件 A 的未发的旧 Request 清除掉。

 

<!-- [if !supportLists]-->4)  <!-- [endif]-->requestDelay 属性

· 单位毫秒 ms ,用来定义 Request 被发送出去之前,需要在队列里强制等待的时间。即使前面一个 Request 都没有,也必须老老实实等着到点。

 

· 可以将 eventsQueue requestDelay 一起使用。

 

<!-- [if !supportLists]-->5)  <!-- [endif]-->ignoreDupResponse 属性

· 将此属性设为 true ,则当同一控件发出新的 Request 的时候,当前的 Response 将被 Ajax 忽略掉。

     注意,之前的 Request Server 上已经被处理,只是 Response Client 上被忽略掉了。

 

· eventsQueue ignoreDupResponse 的区别在于:

     前者的 Response 总是会被 Client 处理,然后队列中的 Request 才被发出,属于“先来后到”;而对于后者来说,一旦发现同一控件又有了新的 Request ,则立即抛弃现有的 Response ,属于“喜新厌旧”。

 

· 如果设置了 ignoreDupResponse 而没有设置 eventsQueue ,则系统会根据控件的 ID 创建一个默认的事件队列。

 

 

<!-- [if !supportLists]-->2.       <!-- [endif]-->JavaScript 交互

 

<!-- [if !supportLists]-->1)  <!-- [endif]-->调用自定义的 JavaScript 函数

尽管使用 RichFaces 时不用写 JavaScript ,但 RichFaces 仍然允许你调用自定义的 JavaScript 函数。

· onsubmit :仅当 Ajax Request 被发送之前;

· onbeforedomupdate :仅当 DOM 更新被处理之前;

· oncomplete DOM 更新被处理完毕之后。

 

<!-- [if !supportLists]-->2)  <!-- [endif]-->data 属性

· 可以从 Server 上得到任何额外的数据,可以通过 EL 表达式简单地将 data 属性指向 bean property ,然后数据将会按照 JSON 的格式串行化到客户端。比如:

<a4j:commandButton value="Submit" reRender="out"

data="#{bean.text}" oncomplete="alert(data)"/>

 

· 除了基础类型,其他可以被串行化的复杂类型(数组、集合),也可以加入 JSON 格式。

 

 

<!-- [if !supportLists]-->3.       <!-- [endif]-->性能方面的考虑

 

<!-- [if !supportLists]-->1)  <!-- [endif]-->使用 eventsQueue requestDelay

 

<!-- [if !supportLists]-->2)  <!-- [endif]-->使用 bypassUpdate 属性

当此属性设为 true 的时候, Update Model Invoke Application 阶段将会被跳过,从而缩短响应时间。通常用在表单验证上。

 

<!-- [if !supportLists]-->3)  <!-- [endif]-->使用 <a4j:region>

· renderRegionOnly 属性被设为 true 时, Browser 将只刷新当前 Region ,也就是发出 Ajax Request Region 。对于 Region 以外的, Partial-Page 刷新将不会被处理。

· renderRegionOnly 属性被设为 true 时,只有同时 满足以下两点的部分会被刷新:

     控件必须在引发 Ajax Request Region 里;

     被设置为需要刷新(在当前 Region 的其他控件的 reRender 里或者在 <a4j:outputPanel ajaxRendered=”true”> 里)。

其他的部分一概不会被刷新。

· selfRendered 属性

 

 

<!-- [if !supportLists]-->4.       <!-- [endif]-->验证用户输入(实例)

 

<!-- [if !supportLists]-->1)  <!-- [endif]-->使用 <a4j:region> 或者 ajaxSingle 属性来限制 process Region ,以避免控件间相互干扰。

<!-- [if !supportLists]-->2)  <!-- [endif]-->使用 <rich:message> 来显示错误信息。

<!-- [if !supportLists]-->3)  <!-- [endif]-->使用 <a4j:region> 以及 renderRegionOnly 属性,而不是 ajaxSingle ,来避免错误信息被其他控件的单独 process 而被清除掉。

<!-- [if !supportLists]-->4)  <!-- [endif]-->使用 bypassUpdate 属性来跳过 Update Model Invoke Application 阶段。

 

 

<!-- [if !supportLists]-->5.       <!-- [endif]-->使用 <a4j:actionparam>

 

<!-- [if !supportLists]-->1)  <!-- [endif]--><a4j:actionparam> 可以被认为是 <f:param> <f:actionListener> 的组合:

· <f:param> - request 中传递参数;

· <f:actionListener> - 设置 Bean property 的值。

 

<!-- [if !supportLists]-->2)  <!-- [endif]--> <f:setPropertyActionListener> 非常相似:

· value 对应 value

· assignTo 对应 target

· name converter 没有对应。

【注意】因为需要向 request 传递参数,因此 name 属性一定不能少。

 

<!-- [if !supportLists]-->3)  <!-- [endif]-->不同点:

· <a4j:actionparam> request 传参数,因此当要传的不是 String 的时候,需要 Converter 的支持;而 <f:setPropertyActionListener> 是直接设置 Bean property ,因此它不需要指定 Converter

 

· <f:setPropertyActionListener> 因为是 <f:actionListener> 类的 ActionListener ,因此总比 actionListener 属性类的方法调用的晚(《 JSF 核心编程》)。因此想用 <f:setPropertyActionListener> actionListener 属性类的方法传递数据,恐怕不可行。但 <a4j:actionparam> 兼具两种功能,因此可以用作给 actionListener 属性类的方法传递数据。

 

· <a4j:actionparam> 既可以给 <a4j:commandButton> <a4j:commandLink> 传递参数,也可以给 <a4j:support> 传递参数。

 

 

<!-- [if !supportLists]-->6.       <!-- [endif]-->使用 <a4j:repeat>

 

<!-- [if !supportLists]-->1)  <!-- [endif]--><a4j:repeat> <h:dataTable> 很相似,用法也接近。不同点在于 Ajax Request 之后 <a4j:repeat> 可以只刷新选中的行或列,而不必刷新整个表格。

 

<!-- [if !supportLists]-->2)  <!-- [endif]--><a4j:repeat> 的体可以包含多种代码,从 JSF 控件到 HTML ,不一而足。

 

<!-- [if !supportLists]-->3)  <!-- [endif]-->使用 ajaxKeys 属性对选中列或行进行部分刷新

【注意】通过 reRender 刷新的控件,必须确保它能生成一些标记 markup ;如果组件不生成任何 markup 或者 rendered 设为 false ,则应该将其置于 PlaceHolder 中,比如 <h:panelGrid> 或者 <a4j:outputPanel>

 

· 基本属性:

     value var <h:dataTable> 相同;

     rowKeyVar 代表行号的变量名, String 类型。

 

· ajaxKeys 属性,指向一个 java.util.Set 对象,其中包含着需要被刷新的行号,从 0 开始计数,接受 EL 表达式;

 

· 每一行里引发 Ajax Request 的控件的 reRender 属性决定哪些列要被刷新;而 ajaxKeys 决定哪些行要被更新。这两个属性精确定位了需要刷新的“单元格”,从而实现页面的部分刷新。

 

<rich:panel header="a4j:repeat Test">

<table>

<a4j:repeat value="#{nameListBean.nameList}" var="name"

rowKeyVar="rowNo" ajaxKeys="#{nameListBean.rowsToUpdate}">

<tr>

<td>

<h:outputText value="#{rowNo}"></h:outputText>

</td>

<td>

<h:outputText id="fullName" value="#{name.fullName}"></h:outputText>

</td>

<td>

<h:inputText id="firstName" value="#{name.firstName}">

<a4j:support event="onblur"

actionListener="#{nameListBean.refreshRowsToUpdate}"

reRender="fullName">

<a4j:actionparam name="rowNo" value="#{rowNo}"

assignTo="#{nameListBean.currentRow}"/>

</a4j:support>

</h:inputText>

</td>

<td>

<h:inputText id="lasttName" value="#{name.lastName}">

<a4j:support event="onblur"

actionListener="#{nameListBean.refreshRowsToUpdate}"

reRender="fullName">

<a4j:actionparam name="rowNo" value="#{rowNo}"

assignTo="#{nameListBean.currentRow}"/>

</a4j:support>

</h:inputText>

</td>

</tr>

</a4j:repeat>

</table>

</rich:panel>

 

 

<!-- [if !supportLists]-->7.       <!-- [endif]-->使用 <a4j:status>

 

<!-- [if !supportLists]-->1)  <!-- [endif]--><a4j:status> 可以用来显示 Ajax Request 发送和结束的状态。

<!-- [if !supportLists]-->2)  <!-- [endif]-->可以引发 Ajax Request 的那四个 <a4j> 控件都可以通过‘ status ’属性来指定 <a4j:status> 控件。

<!-- [if !supportLists]-->3)  <!-- [endif]--><a4j:status> 也可以被指定给 Region

<!-- [if !supportLists]-->4)  <!-- [endif]--><a4j:status> 的主要属性:

· startText stopText

· <f:facet name=”start”> <f:facet name=”stop”> ,任何 JSF 控件都可以加进来,包括 GraphicImage

<!-- [if !supportLists]-->5)  <!-- [endif]--> Status 指定给 Region

· 无需特别操作,只将 <a4j:status> 放在 Region 内即可;

· <a4j:status> 只为所在的 Region 服务,所在 Region 内部或外部的 Region 都不服务;

· <a4j:status> 也可以用其自身的 left top 等属性精确定位。

 

 

<!-- [if !supportLists]-->8.       <!-- [endif]-->使用 <a4j:include> <a4j:keepAlive>

 

<!-- [if !supportLists]-->1)  <!-- [endif]-->可以使用 <a4j:include> 在父 View 中包含子 View ,而子 View 仍然可以像正常 JSF 一样,按照导航规则导航。通常用来做向导之类的页面。

 

<!-- [if !supportLists]-->2)  <!-- [endif]--><a4j:include viewId="/step1.xhtml"/> 可以被放置于页面的任何位置。

【注意】 viewId 属性应该以“ / ”开头。

 

<!-- [if !supportLists]-->3)  <!-- [endif]--> faces-config.xml 中为子 View 定义导航规则, <from-view-id> 应该是子 View view id

 

<!-- [if !supportLists]-->4)  <!-- [endif]-->使用 <a4j:keepAlive>

· 可以使 requestScope bean 的生命长于 request 而又短于 Session

· name 属性指向 managed bean 的名字,而不是 EL 表达式;

· 原理在于, name 属性所指向的 bean ,在页面 render 之前被存储;当下一个 Request 到来时, bean 又被倒回 request ,而其之前的值仍然可用。

· 默认情况下, <a4j:keepAlive> 也可以为非 Ajax 请求服务;要想限制其只为 Ajax Request 服务,则要将其 ajaxOnly 属性设为 true

 

 

<!-- [if !supportLists]-->9.       <!-- [endif]-->使用 <a4j:jsFunction>

 

<!-- [if !supportLists]-->1)  <!-- [endif]--><a4j:jsFunction> 与其他四种可以引发 Ajax Request 的控件非常相似;不同点在于 <a4j:commandButton> <a4j:support> 是通过 DHTML event 引发 Ajax Request ,而 <a4j:jsFunction> 是通过自定义的 JavaScript 函数来引发 Ajax Request 。当自定义 JavaScript 函数被调用的时候, Ajax Request 被引发。

<!-- [if !supportLists]-->2)  <!-- [endif]--><a4j:jsFunction> 也包含 action actionListener reRender 等属性,也可以包含 <f:param> <a4j:actionparam>

<!-- [if !supportLists]-->3)  <!-- [endif]--><a4j:jsFunction> 也可以像 <a4j:commandButton> 一样作为独立控件使用,而不是像 <a4j:support> 一样。

 

 

<!-- [if !supportLists]-->10.   <!-- [endif]-->使用 <a4j:ajaxListener>

 

<!-- [if !supportLists]-->1)  <!-- [endif]--> Listener 只在 Render Response 阶段被调用,因此它总是会被调用到,不会被跳过。

<!-- [if !supportLists]-->2)  <!-- [endif]--> Listener 只为 Ajax Request 所调用。

<!-- [if !supportLists]-->3)  <!-- [endif]-->通常用来检查或设置需要被 render 的控件

分享到:
评论

相关推荐

    JSF控件详细说明

    **JSF(JavaServer Faces)控件详解** JavaServer Faces(JSF)是Java平台上的一个用于构建用户界面的Web应用程序框架。它提供了一种组件化的方式来创建动态、交互式的Web应用。JSF的核心概念是组件,这些组件代表...

    jsf常用控件的使用

    在JavaScript Server Faces (JSF) 中,控件是构建用户界面的关键组成部分,它们允许开发者创建交互式的Web应用程序。本文将深入探讨JSF中的一些常见控件及其使用方法,旨在帮助开发者更好地理解和应用这些控件。 1....

    JSF日历控件

    **JSF日历控件详解** JavaServer Faces (JSF) 是Java平台上的一个用于构建Web应用程序的MVC(Model-View-Controller)框架。在JSF中,开发者可以使用各种预定义的UI组件,包括日历控件,来简化前端用户界面的开发。...

    jsf动态创建表单控件实例.

    在JSF中,动态创建表单控件是一项强大的功能,它允许开发者在运行时根据需求生成不同的用户输入元素,提高了代码的灵活性和可扩展性。下面我们将详细探讨JSF动态创建表单控件的概念、实现方法以及相关的实例。 1. *...

    jsf 控件速查手册

    jsf 控件速查手册,html格式。jsf标签使用培训教程。新手速查教程!

    JSF调用的JAR包

    这个库简化了属性的访问和设置,通过提供一个动态调用属性的方法。在JSF应用中,BeanUtils可以帮助开发者更方便地操作和绑定后台Bean的属性,增强了代码的可读性和易维护性。 2. **commons-collections-3.1.jar**:...

    JSF2.xdatatable分页控件与左侧菜单最简单应用

    JSF2.xdatatable分页控件与左侧菜单最简单应用  JSF2.x,功能强大,使用方便。全世界使用JSF的人越来越多。而且也有很多很好的控件给发出来了,如:richfaces、primefaces、myfaces等,就日前来讲primefaces功能...

    jsf 控件说明(很好)

    JavaServer Faces(JSF)是一种基于Java的Web应用程序开发框架,专门用于构建用户界面。...通过利用JSF提供的控件和标记库,开发者可以更高效地构建交互式、动态的用户界面,同时享受到Java的强大后端支持。

    JSF1.2日历组件

    JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种模型-视图-控制器(MVC)框架。JSF 1.2是该框架的一个早期版本,发布于2006年,它提供了丰富的UI组件库和强大的事件处理机制,简化了Web界面的开发。...

    JSF分页控件 ,支持大容量可查询分页

    "JSF分页控件" 是一个专门设计用于处理大数据集并提供用户友好查询分页功能的组件。本文将深入探讨JSF分页控件的关键知识点,以及如何实现大容量数据的可查询分页。 首先,理解JSF(JavaServer Faces)框架的基础是...

    JSF入门(一)

    JSF组件有一个明确的生命周期,包括六步:恢复视图、应用请求值、处理验证、更新模型值、调用后处理和渲染响应。在每个阶段,JSF都会执行特定的任务,如解析请求参数、验证用户输入、更新bean的属性等。 **6. ...

    JSF 详解

    1. Restore View:JSF的处理核心是控件树,他会先将页面上所声明的控件转换为一棵控件树,后续的操作将在这棵控件树上进行。为了提高性能,系统会为之前生成的控件树提供缓存。Restore View的工作就是在缓存当中查找...

    jsf1.2_04api

    这个API包“jsf1.2_04api”包含了JSF 1.2版本的类库和接口,供开发者在项目中引用和使用。 JSF的核心组件包括: 1. **Facelets**:JSF 1.2引入了Facelets作为默认的视图定义语言,替代了原来的JSP。Facelets是一种...

    JSF2datatable分页控件与左侧菜单

    JSF2.xdatatable分页控件与左侧菜单最简单应用  JSF2.x,功能强大,使用方便。全世界使用JSF的人越来越多。而且也有很多很好的控件给发出来了,如:richfaces、primefaces、myfaces等,就日前来讲primefaces功能...

    JSF控件详细参考手册

    ### JSF控件详细参考手册 #### 概述 本文档旨在为BIMP平台开发者提供一个全面且深入的JSF Facelets标签集参考指南。通过详细介绍这些标签的用途与用法,帮助开发者更好地掌握和利用这些工具来提高Web应用的质量与...

    jsf控件卡快速查手册

    2. **JSF生命周期**:JSF应用遵循一系列预定义的阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应。理解这个生命周期对于有效地处理表单提交和数据验证至关重要。 3. **EL...

    JSF04~05

    在"JSF04~05"这个资源中,我们可以推测包含的是JSF源码的第四部分和第五部分,这可能是某个项目或库的源代码分发。这些源码文件(mann_srcs.part04.rar、mann_srcs.part05.rar)可能包含了JSF框架的实现细节,对于...

    编写JSF用户自定义UI组件(之五)

    在JSF(JavaServer Faces)框架中,用户自定义UI组件是实现个性化界面和扩展功能的关键部分。这篇博文“编写JSF用户自定义UI组件(之五)”可能深入探讨了如何创建和使用自定义组件的过程,虽然描述部分为空,但我们...

    jsf第一个例子 jsf架包 jsf实例

    1. **JSF生命周期**:JSF有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑以及渲染响应。开发者可以在这些阶段插入自定义行为。 2. **JSF页面(Facelets)**:JSF使用Facelets...

Global site tag (gtag.js) - Google Analytics