Seam与Richface性能及错误处理
http://www.enthp.com/thread-22-1-1.html
org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component
1. 用队列控制 Event Traffic
1) 以下两个属性用来避免由频繁的 DHTML 事件所引发大量的 request 请求。
- eventsQueue
- requestDelay
2) 对于能够引发 Ajax Request 的 4 种控件来说,以上两种属性都是可用的。
3) 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 清除掉。
4) requestDelay 属性
- 单位毫秒 ms ,用来定义 Request 被发送出去之前,需要在队列里强制等待的时间。即使前面一个 Request 都没有,也必须老老实实等着到点。
- 可以将 eventsQueue 和 requestDelay 一起使用。
5) ignoreDupResponse 属性
- 将此属性设为 true ,则当同一控件发出新的 Request 的时候,当前的 Response 将被 Ajax 忽略掉。
注意,之前的 Request 在 Server 上已经被处理,只是 Response 在 Client 上被忽略掉了。
- eventsQueue 和 ignoreDupResponse 的区别在于:
前者的 Response 总是会被 Client 处理,然后队列中的 Request 才被发出,属于"先来后到";而对于后者来说,一旦发现同一控件又有了新的 Request ,则立即抛弃现有的 Response ,属于"喜新厌旧"。
- 如果设置了 ignoreDupResponse 而没有设置 eventsQueue ,则系统会根据控件的 ID 创建一个默认的事件队列。
2. JavaScript 交互
1) 调用自定义的 JavaScript 函数
尽管使用 RichFaces 时不用写 JavaScript ,但 RichFaces 仍然允许你调用自定义的 JavaScript 函数。
- onsubmit :仅当 Ajax Request 被发送之前;
- onbeforedomupdate :仅当 DOM 更新被处理之前;
- oncomplete : 当 DOM 更新被处理完毕之后。
2) data 属性
- 可以从 Server 上得到任何额外的数据,可以通过 EL 表达式简单地将 data 属性指向 bean property ,然后数据将会按照 JSON 的格式串行化到客户端。比如:
<a4j:commandButton value="Submit" reRender="out"
data="#
Unknown macro: {bean.text}
"/>- 除了基础类型,其他可以被串行化的复杂类型(数组、集合),也可以加入 JSON 格式。
3. 性能方面的考虑
1) 使用 eventsQueue 和 requestDelay
2) 使用 bypassUpdate 属性
当此属性设为 true 的时候, Update Model 和 Invoke Application 阶段将会被跳过,从而缩短响应时间。通常用在表单验证上。
3) 使用 <a4j:region>
- 当 renderRegionOnly 属性被设为 true 时, Browser 将只刷新当前 Region ,也就是发出 Ajax Request 的 Region 。对于 Region 以外的, Partial-Page 刷新将不会被处理。
- 当 renderRegionOnly 属性被设为 true 时,只有同时 满足以下两点的部分会被刷新:
控件必须在引发 Ajax Request 的 Region 里;
被设置为需要刷新(在当前 Region 的其他控件的 reRender 里或者在 <a4j:outputPanel ajaxRendered="true"> 里)。
其他的部分一概不会被刷新。
- selfRendered 属性
4. 验证用户输入(实例)
1) 使用 <a4j:region> 或者 ajaxSingle 属性来限制 process 的 Region ,以避免控件间相互干扰。
2) 使用 <rich:message> 来显示错误信息。
3) 使用 <a4j:region> 以及 renderRegionOnly 属性,而不是 ajaxSingle ,来避免错误信息被其他控件的单独 process 而被清除掉。
4) 使用 bypassUpdate 属性来跳过 Update Model 和 Invoke Application 阶段。
5. 使用 <a4j:actionparam>
1) <a4j:actionparam> 可以被认为是 <f:param> 和 <f:actionListener> 的组合:
- <f:param> - 在 request 中传递参数;
- <f:actionListener> - 设置 Bean property 的值。
2) 与 <f:setPropertyActionListener> 非常相似:
- value 对应 value ;
- assignTo 对应 target ;
- name 、 converter 没有对应。
【注意】因为需要向 request 传递参数,因此 name 属性一定不能少。
3) 不同点:
- <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> 传递参数。
6. 使用 <a4j:repeat>
1) <a4j:repeat> 与 <h:dataTable> 很相似,用法也接近。不同点在于 Ajax Request 之后 <a4j:repeat> 可以只刷新选中的行或列,而不必刷新整个表格。
2) <a4j:repeat> 的体可以包含多种代码,从 JSF 控件到 HTML ,不一而足。
3) 使用 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 决定哪些行要被更新。这两个属性精确定位了需要刷新的"单元格",从而实现页面的部分刷新。
7. 使用 <a4j:status>
1) <a4j:status> 可以用来显示 Ajax Request 发送和结束的状态。
2) 可以引发 Ajax Request 的那四个 <a4j> 控件都可以通过' status '属性来指定 <a4j:status> 控件。
3) <a4j:status> 也可以被指定给 Region 。
4) <a4j:status> 的主要属性:
- startText 和 stopText
- <f:facet name="start"> 和 <f:facet name="stop"> ,任何 JSF 控件都可以加进来,包括 GraphicImage
5) 将 Status 指定给 Region
- 无需特别操作,只将 <a4j:status> 放在 Region 内即可;
- <a4j:status> 只为所在的 Region 服务,所在 Region 内部或外部的 Region 都不服务;
- <a4j:status> 也可以用其自身的 left 、 top 等属性精确定位。
8. 使用 <a4j:include> 和 <a4j:keepAlive>
1) 可以使用 <a4j:include> 在父 View 中包含子 View ,而子 View 仍然可以像正常 JSF 一样,按照导航规则导航。通常用来做向导之类的页面。
2) <a4j:include viewId="/step1.xhtml"/> 可以被放置于页面的任何位置。
【注意】 viewId 属性应该以" / "开头。
3) 在 faces-config.xml 中为子 View 定义导航规则, <from-view-id> 应该是子 View 的 view id 。
4) 使用 <a4j:keepAlive>
- 可以使 requestScope 的 bean 的生命长于 request 而又短于 Session ;
- name 属性指向 managed bean 的名字,而不是 EL 表达式;
- 原理在于, name 属性所指向的 bean ,在页面 render 之前被存储;当下一个 Request 到来时, bean 又被倒回 request ,而其之前的值仍然可用。
- 默认情况下, <a4j:keepAlive> 也可以为非 Ajax 请求服务;要想限制其只为 Ajax Request 服务,则要将其 ajaxOnly 属性设为 true 。
9. 使用 <a4j:jsFunction>
1) <a4j:jsFunction>
与其他四种可以引发 Ajax Request 的控件非常相似;不同点在于 <a4j:commandButton> 、
<a4j:support> 是通过 DHTML event 引发 Ajax Request ,而
<a4j:jsFunction> 是通过自定义的 JavaScript 函数来引发 Ajax Request 。当自定义
JavaScript 函数被调用的时候, Ajax Request 被引发。
2) <a4j:jsFunction> 也包含 action 、 actionListener 、 reRender 等属性,也可以包含 <f:param> 或 <a4j:actionparam> 。
3) <a4j:jsFunction> 也可以像 <a4j:commandButton> 一样作为独立控件使用,而不是像 <a4j:support> 一样。
10. 使用 <a4j:ajaxListener>
1) 该 Listener 只在 Render Response 阶段被调用,因此它总是会被调用到,不会被跳过。
2) 该 Listener 只为 Ajax Request 所调用。
3) 通常用来检查或设置需要被 render 的控件。
分享到:
相关推荐
通过监控请求处理时间和页面加载时间,可以识别性能瓶颈。 - **并发用户数**:模拟多用户同时访问,检查系统在高负载下的表现。 - **资源利用率**:包括CPU、内存、网络带宽等,过高可能引发性能问题。 2. **代码...
- **JBoss Seam Support**:Seam是一个流行的Java EE框架,此处讲解了如何在Seam环境中使用Richface。 - **Portlet Support**:针对portlet开发的支持情况。 - **Sybase EAServer**:在Sybase环境下使用Richface的...
seam:在IE8中部分richface组件不能兼容的解决办法
8. **错误处理和日志**:熟悉Seam的异常处理和日志记录机制。 9. **国际化与本地化**:学习如何配置Seam进行多语言支持。 10. **实用工具**:包括邮件服务、定时任务、PDF生成等功能的使用说明。 通过阅读这些材料...
Seam 是一个开源的 Java 框架,主要用于简化企业级 Java 应用程序的开发,特别是与 JBoss 服务器的集成。它提供了一个统一的框架来整合多种技术,包括 JavaServer Faces (JSF)、Java Persistence API (JPA) 和 Java ...
1. **JSF集成**: Seam与JSF的紧密结合,使得UI层的开发更为简便,通过Seam可以直接在JSF页面上操作后端数据。 2. **JPA集成**: Seam支持JPA,方便地处理数据库操作,包括实体管理和事务控制。 3. **EJB 3集成**: ...
6. **缓存和性能优化**:Seam支持缓存策略,能够提高与Hibernate交互的性能,减少不必要的数据库访问。 7. **测试支持**:Seam的测试工具和API使得对整合后的JSF和Hibernate应用进行单元测试和集成测试变得更为便捷...
9. **错误处理与日志**:Seam提供了一套强大的错误处理机制,包括异常处理和日志记录。开发者可以自定义错误页面和日志策略。 10. **国际化与本地化**:Seam支持多语言环境,通过资源包(Resource Bundle)可以轻松...
4. **EJB集成**:Seam与EJB 3.0无缝集成,允许开发者在不牺牲可维护性和性能的前提下,利用EJB来实现业务逻辑。这使得Seam成为开发企业级应用的理想选择。 5. **持久性管理**:Seam通过JPA提供了简单且强大的数据...
"为Seam做好准备"这个标题暗示我们即将探讨的是关于Seam框架的入门与准备工作。Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他...
根据提供的信息,我们可以推断出这是一本...通过对本书的学习,开发者可以掌握如何利用 Seam 快速构建高性能的企业级 Web 应用程序。此外,本书还提供了大量实用案例和最佳实践,帮助读者更好地理解和应用 Seam 框架。
这涉及到在web.xml文件中配置Seam Filter和Seam Listener,以便处理JSF请求生命周期中的事件,并确保Seam组件与JSF页面正确交互。 #### 1.1.2. 使用Facelets Facelets是JSF推荐的视图表示技术,提供了更简洁、可...
除了JBPM(一个用于业务流程管理的工具)之外,Seam还支持与其他常用的工具和组件如Spring、邮件发送、权限管理等进行集成,从而增强应用的功能。 #### 三、Seam框架的功能与特点 ##### 1. 一站式(FullStack)的...
5. **测试和调试**:在Tomcat中运行Seam应用可能需要额外的调试步骤,因为日志和错误信息的输出方式可能与在完整的应用服务器上有所不同。确保你配置了正确的日志框架(如Log4j)和调试级别,以便有效地解决问题。 ...
【JBoss教程及深入浅出JBoss+Seam】是一个针对企业级Java应用服务器JBoss的深度学习资源,其中包含了两个主要部分:JBoss教程和对JBoss与Seam框架结合使用的详细介绍。这两个主题都是Java开发人员在部署和管理企业...
2. **工作原理**:深入探讨了Seam与jBPM之间的交互机制,以及如何利用Seam的特性来增强工作流的灵活性和易用性。 ##### 1.5 Seam页面流:猜数字游戏 通过实现一个猜数字游戏,展示了Seam页面流的概念及其应用。 1...
**Seam Carving 技术详解** Seam Carving,又称图像拉链,是一种基于能量最小化的图像调整方法,主要用于图像大小的动态调整,而不仅仅是简单的等比例缩放。它能够在保持图像主要结构不变的情况下,根据需要增加或...
- **Hibernate预订系统**: 通过结合Seam与Hibernate ORM框架,展示了如何处理持久化操作。 - **Blog示例**: 提供了一个RESTful风格的Seam应用案例,适用于现代Web应用开发。 - **JSF1.2 RI环境下运行Seam**: 介绍...
- **Seam与增量热部署**:支持热部署,提高开发效率。 - **在Jboss4.0下使用Seam**: - **安装JBoss4.0**:确保 JBoss 版本兼容。 - **安装JSF1.2RI**:满足 SEAM 的运行环境要求。 #### 四、上下文相关的组件...
Seam是一种Java EE框架,它在开发企业级应用...此外,你还可以了解到Seam的其他特性,如国际化、测试支持和性能优化等。总之,深入学习Seam对于提升Java EE开发能力,尤其是构建大型企业级应用的能力,是非常有帮助的。