`
yongtree
  • 浏览: 233965 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

基于JBoss Seam拦截器的异常消息提示体系设计

阅读更多

每个技术体系框架都有自己的消息(message)机制,Struts2框架下有ActionError、ActionMessage、FieldError这三种消息方式,JSF框架也提供了消息API—FacesMessage,这些消息处理结合页面消息标签,将程序产生的错误、人为的消息显示在页面上,给用户非常友好的提示。但是在使用这些消息API的时候,我感觉这些提供的功能还是比较原始,达不到我想要的程度。比如,在Struts2中我如果想将错误消息通过弹出框弹出,我发现是一种非常难以实现的工作。在不使用AJAX的时候,本页提示更是想都不敢想,还要防止出错后的重复提交问题。采用基于事件的JSF框架,本页消息提示容易实现多了,通过标签输出类似于alert(‘程序出错啦’)来达到弹出提示的功能,但是这种实现方式如此简陋。在OECP项目中,客户端采用的是基于JSF的架构,怎样来提供统一的、漂亮的消息提示呢?同时怎样将捕获到的所有异常来封装成消息来显示到客户端呢?现在我就来简单的介绍一下OECP项目中对异常消息提示体系的设计思路。

       JSF作为一个标准大力推广,然而SUN却没有提供一个非常强大的实现,SUN的实现太简陋了,网上笔诛讨伐甚多。开发JSF应用,我们依然要采用其他第三方的实现,现在存在比较成熟的第三方实现主要有Apache的MyFaces,JBoss的Richfaces,ICEFaces,甚至把Seam也加上。Seam作为JBoss大力发展的大一统的Web集成框架,已经在各方面展示强劲的能力。OECP客户端也是基于JBoss Seam框架体系的,引入JBoss Seam后,在拦截器、UI展现等方面都对JSF起到一个非常好的补充。
为什么要引入JBoss Seam的拦截器,主要是因为虽然JSF的监听器机制虽然已经比较强大了,但是却存在一个缺陷(也许是自己才疏学浅没有研究深入)。JSF提供的PhaseListener接口提供了两个方法beforePhase和afterPhase让我们在事件执行前后做一些处理,但是我却得不到当前执行的类、方法,我无法获得这些方法操作的控制权,最简单的异常捕获封装消息的操作都不知道怎么实现,这让我很怀念Struts2的拦截器功能。幸亏JBoss Seam想到了这些问题,JBoss Seam为自己的组件提供了强大的拦截器实现,通过JBoss Seam的拦截器我们不就可以将所有的操作给拦住,然后做加工处理了吗?那就看看JBoss Seam是怎么做的吧。
      首先要为你的应用添加JBoss Seam,这个我就不多说了,google一下吧。OECP项目开始就使用JBoss Seam构建,所以那就赶紧添加拦截器吧。在使用EJB的情况下,JBoss Seam推荐使用会话Bean作为Seam的action,使用EJB标准的拦截器和Seam本身的拦截器都可以很好工作。但是在OECP项目中,我们为了保证业务组件的纯洁性(按标准实现,无框架污染),我们放弃了JBoss Seam的方式而采用了JavaEE标准的分层架构,那么客户端的Action就是简单的Manage Bean。

1、将这个Manage Bean变成Seam的组件。将action类加入Seam提供的@Name注解,这个普通的manage bean就成了Seam组件。
 
Java代码
  1. @Name("resourceRegisterAction")  
  2. @Scope(ScopeType.PAGE)  
  3. public class ResourceRegisterAction  

 2、构建拦截器

Seam构建拦截器的方式是采用的标准的JavaEE体系。如下面代码所示,构造一个拦截机要有一个带有InvocationContext参数的方法,返回值使用Object。需要注意的是,一定要加上@AroundInvoke这个注解,否则框架不将它作为拦截方法。然后在ic.proceed()前后就可以加入你要处理的操作了。建议继承seam提供的AbstractInterceptor,seam会在效率上进行相应的优化。isInterceptorEnabled是该拦截器的开关,如果返回false,该拦截器将不可用。该方法在容器一启动就加载执行,不要想着在里面处理一些动态的信息。

Java代码
  1. public class DefaultActionInterceptor extends AbstractInterceptor {  
  2.     private Object rv = null;  
  3. @AroundInvoke  
  4. public Object aroundInvoke(InvocationContext ic) throws Exception {  
  5.                     try {  
  6.                         rv = ic.proceed();  
  7.                     } catch (Exception e) {  
  8.                         dealException(ic, e);  
  9.                     }  
  10. return rv;            
  11. }  
  12.                   
  13.                 @Override  
  14.                 public boolean isInterceptorEnabled() {  
  15.                     return true;  
  16.                 }  
  17.                   
  18. }  

 

3、封装异常消息

在OECP中,我们把异常粗略的分为业务异常和系统异常。对于这两种异常我们将区分对待。业务异常是EJB业务组件抛出的业务执行过程中出现的异常,而系统异常通常是客户端的程序书写存在问题而出现的异常。我们把异常信息包装后,通过OecpUtil.setPopMsg(msg)将异常信息放到request上下文中,并在页面上显示出来。

Java代码
Java代码
  1. private void dealException(InvocationContext ic, Exception e)  
  2.                 throws NamingException {  
  3.                 if (e instanceof BusinessEJBException) {  
  4.                     OecpUtil.setPopMsg(new Message("出错提示", e.getMessage()));  
  5.                     BusinessEJBException be = (BusinessEJBException) e;  
  6.                     if (!be.isLogged()) {// 如果该异常没有被记录,则调用日志记录组件记录  
  7.                         log(ic, be);  
  8.                 }  
  9.             } else {  
  10.                 OecpUtil.setPopMsg(new Message("出错提示",  
  11.                     "程序出现错误,您可以拨打以下电话告知处理。1364642****"));  
  12.                 log(ic, e);  
  13.             }  
  14. }  
  15.   
  16. OecpUtil.java  
  17. public static void setPopMsg(Message message) {  
  18. FacesUtil.getExternalContext().getRequestMap().put("_pop", message);  
  19.     }  

 未完,请点击《基于JBoss Seam拦截器的异常消息提示体系设计(二)

分享到:
评论
1 楼 yourenyouyu2008 2010-12-21  
seam本身已经提供了异常机制,会解决任何地方抛出的异常,比如页面el,jsf阶段内异常(事务提交在jsf阶段内完成)。你上面的方案只能对action级的方法调用中的异常进行处理。消息的显示通过配置的方式。

相关推荐

    Beginning JSF2 APIs and JBoss Seam

    - **拦截器**:掌握如何使用拦截器对请求进行预处理或后处理,增强应用的安全性和功能性。 - **集成测试**:学会编写集成测试来验证Seam应用的功能和性能。 #### 四、综合运用 **1. 结合JSF2与JBoss Seam** - **...

    Beginning JBoss Seam - From Novice to Professional

    - **事件与拦截器**:介绍Seam的事件驱动模型,以及如何利用拦截器扩展组件行为。 #### 4. 数据持久化与业务逻辑 - **实体与关系**:讨论Seam与JPA集成,实现数据持久化的方法。 - **服务层设计**:讲解如何设计和...

    jboss seam 中文文档

    - **拦截器**:在 Seam 中,拦截器被用来增强组件的行为,如权限检查、日志记录等。 - **组件名字**:每个 Seam 组件都需要有一个唯一的名称,以便于引用和配置。 - **定义组件作用域**:通过配置文件或注解,可以...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................

    JbossSeam中文开发指南.docx

    Seam拦截器提供了一个统一的编程模型,能够将JSF、EJB、JPA等技术整合在一起,提供了一个强大且灵活的开发环境。 Seam异常处理 Seam异常处理是一个基于异常处理的编程模型,能够帮助开发者快速构建企业级应用程序...

    《SeamInAction》+《JbossSeam》+《官方中文指南》

    此外,Seam还支持CDI,这使得开发者可以利用更多的Java EE特性,如拦截器和异步处理。 总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业...

    jboss-seam 注解

    ### jboss-seam 注解详解 #### @Name 在JBoss Seam框架中,`@Name`注解主要用于定义一个Seam组件。为了确保组件能够被正确识别与使用,每个Seam组件都必须拥有一个唯一的名称标识,即通过`@Name`来指定。例如: `...

    java培训课程-JBOSS-SEAM开发.pptx

    2. **SEAM架构**:SEAM的架构分为多个层面,包括组件模型、领域模型、事件系统、拦截器和异常控制等。这些部分协同工作,构建了一个强大且灵活的框架。例如,组件模型允许开发者定义和管理应用的各个部分,而事件...

    seam+in+action+中文版

    Seam 还支持 **拦截器** 的使用,可以用来增强组件的行为。 - **状态无关的 SessionBean**:通常用于处理那些不需要保持状态的业务逻辑。 - **状态相关的 SessionBean**:这类组件会保存与特定用户会话相关的状态...

    seam参考手册中文版

    - **拦截器**: 为组件提供额外的行为扩展点,如日志记录、安全性检查等。 - **组件命名规则**: 为了确保组件名称的唯一性和易于识别,Seam定义了一套规范化的命名机制。 ##### 组件范围定义 - **定义组件作用域**: ...

    JSF2.0实战 - 9、自定义Filter处理资源文件依赖关系

    在本章节"JSF2.0实战 - 9、自定义Filter处理资源文件依赖关系"中,我们将深入探讨如何利用自定义过滤器(Filter)来优化和管理这些资源文件的依赖关系。 过滤器在Java web应用中扮演着关键角色,它们允许我们在HTTP...

    Seam - 语境相关的组件 .pdf

    Seam组件可以是无状态Session Bean、有状态Session Bean、实体Bean、JavaBeans、消息驱动Bean等,支持拦截器、多角色组件以及自定义作用域,为开发者提供了灵活的编程模型。 综上所述,Seam是一个强大的Java EE框架...

    seam 注解 pdf

    Seam注解主要分为几个类别:组件定义注解、生命周期管理注解、拦截器控制注解等。下面将详细介绍这些注解的具体用法及其应用场景。 #### 三、组件定义注解 组件定义注解主要用于定义Seam中的组件行为和属性。这些...

    各种在线api

    而Struts 2 Core 2.0.11.1则引入了更多的特性,如拦截器、自由标记库等,使其更加灵活和强大。 ### Ajax4jsf: JSF Ajax Ajax4jsf是JSF(JavaServer Faces)的一个扩展,它允许开发者在不重新加载整个页面的情况下...

    resteasy技术说明

    3. **组件支持**:资源(Resources)和提供者(Providers)可以作为 Seam components(JavaBean 或 EJB),享受全面的 Seam 注入、生命周期和拦截器等功能。 4. **GZIP 压缩**:支持客户端和服务器端自动的 GZIP 解...

    J2EE程序员需掌握的技术

    - Struts2:基于MVC的框架,整合了许多其他技术如OGNL和拦截器。 - Spring MVC:Spring框架的一部分,提供了强大的MVC支持。 - Tapestry:强调类型安全和组件重用。 - Wicket:基于组件的Web框架,注重开发者...

Global site tag (gtag.js) - Google Analytics