Seam无缝集成:为JSF定做应用程序框架

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

JavaServerFaces(JSF)是用于Java™Web应用程序的第一个标准化的用户界面框架。而Seam是一个扩展JSF的强大的应用程序框架。在这个由三部分组成的新系列中的第一篇文章中,发现这两种框架之间的互补性。DanAllen介绍了Seam对JSF生命周期的增强,包括上下文状态管理、RESTfulURL、Ajaxremoting、适当的异常处理和约定优于配置。JSF正开始凭借其JavaWeb标准的地位主导JavaWeb应用程序市场。随着更多的开发人员受托使用JSF作为基础来架构应用程序,他们发现JSF的核心规范中清楚地说明:JSF不是为成为一个完整的Web应用程序框架而设计的。相反,它提供一个健壮的、事件驱动的API和UI组件库,用于构建更复杂的应用程序框架。我在寻找用于弥补JSF的组件驱动架构的扩展时,发现Shale和Struts2都有不足之处。我排除了Struts2,因为它将JSF看作是面向更大范围的设计。而Shale似乎更靠近一些,它基本上是基于JSF,但是对此我持保留意见。相反,JBossSeam是一个全面的应用程序框架,它构建在JSF的基础上,但是并没有损害它的核心目标。这个由三部分组成的系列将介绍Seam应用程序框架,演示它的优点,并希望使您相信它与JSF是开发Java企业应用程序的极好的组合。在阅读本系列之前,如果您想下载Seam,那么请阅读参考资料一节。寻找Seam刚刚阅读到关于JBossSeam的文章(见参考资料)的第一页,我就知道Seam正是我要找的项目。Seam的开发人员,尤其是GavinKing,在经过足够多的、实际的开发之后,知道一个Web应用程序框架必须从一开始就攻破难题,包括上下文状态管理、RESTful和用户友好的URL、Ajaxremoting、适当的异常处理和约定优于配置。令Java开发人员欣喜的是,Seam可以满足所有这些需求,甚至可以满足更多需求。如果您正使用JSF,并且还没听说过Seam,那么我强烈建议您看看Seam的参考文档(见参考资料)。Seam附带的手册就是最好的资料!尽管Seam显然非常适合作为JSF的补充,但是在激烈的竞争环境中,它遭到了一定程度的轻视。当今市场中充斥着各种各样的Web应用程序框架??包括Shale和Struts2,新来者往往不受重视,Seam还没有在主流行列站稳脚跟。Seam没有很快流行的另一个原因是关于这种框架的某些流言使Java开发人员没能认识到它的直接优点。我要粉碎的一个流言是:Seam只有和EJB3一起使用时才有用,或者说在使用Seam开发应用程序时需要一个EJB3容器。实际上,Seam的文档清楚地驳斥了这种误解:Seam并不要求组件是EJB,甚至在没有兼容EJB3.0的容器时也能使用。如果说只有在使用EJB3的同时才能使用Seam,那么无异于说只有在使用Hibernate的同时才能使用Spring。虽然这两对都有很强的互补性,但是每一对的两者之间都不是相互依赖的。对EJB3的考虑正如我将要解释的那样,Seam通过一些有价值的hook和组件管理进程扩展默认JSF生命周期。还可以完全独立于EJB3使用Seam。但是要记住,和EJB3一样,Seam依赖于JDK5注释元数据进行组件声明,因此使用Seam时,还需要同时使用兼容Java5的JVM。图1显示了一个SeamPOJO实现的应用程序堆栈:图1.一个SeamPOJO应用程序堆栈实际上,即使完全不引用EJB3jar或描述符文件,也可以使用Seam的很多功能。当和POJO一起使用Seam时,该框架保留对组件实例化的完全控制,并且不要求任何专门的配置。Seam负责大多数Java5注释处理,而不需要依赖于EJB3中的任何机制。的确依赖于EJB3容器的一组有限的注释则是专用于那个环境的。在某些情况下,将Seam集成到一个没有EJB3耦合的IT投资中可以获得更好的成本效益。如何使用Seam视个人偏好而定。配置并使用如今有那么多种Java框架,每天只有有限的那么多小时,显然,如果Seam难于集成的话,它就无立足之地。幸运的是,将Seam添加到项目中很简单。因为JSF生命周期仍然是Seam应用程序的中心部分,所以不需要经历一个再训练时期。只需添加4个jar文件,注册一个servlet监听器和一个JSFphase监听器,最后再加上一个空白的Java属性文件。完成这些设置后,就可以一次性地将本地JSF应用程序转移到Seam管理的bean上。要开始使用Seam,首先需要将所需的jar文件添加到项目中。如果您当前不是使用Hibernate,或者还没有升级到最新的版本,那么在设置时需要执行一个额外的步骤。这里需要包含来自Hibernate3.2distribution的jar,以及它的众多的依赖项。Seam还使用Hibernate注释用于数据验证,所以除了主Hibernatejar之外,还必须包括那个扩展jar。需要的Seam发行版中的库有jboss-seam.jar和jboss-seam-ui.jar,以及两个支持库:Javassist(用于Java的加载时反射系统)和JavaPersistenceAPI。图2中的项目树说明了一个Seam项目中的jar集合。该图中显示的大多数附加库支持JSF的MyFaces实现。图2.Seam项目中的jar库配置Seam接下来的步骤是在web.xml文件中安装servlet监听器类。该监听器在部署应用程序时初始化Seam。清单1.Seamservlet监听器配置listenerlistener-classorg.jboss.seam.servlet.SeamListener/listener-class/listener接下来,将JSFphase监听器添加到faces-config.xml文件中,如清单2所示。该监听器将Seam集成到标准JSF生命周期中。(图3大致描绘了集成到这个生命周期中的Seam增强。)清单2.Seamphase监听器配置lifecyclephase-listenerorg.jboss.seam.jsf.SeamPhaseListener/phase-listener/lifecycle最后,将一个空的seam.properties文件放在类路径的根下,以便指示Seam进行加载,如清单3所示。这个空白文件被用作一个JVM类加载器优化,使Seam在类路径下更小的区域内搜索组件,从而大大减少加载时间。清单3.Seam属性文件#ThemeredivsenceofthisfiletriggersSeamtoload#ItcanalsobeusedtotuneparametersonconfigurableSeamcomponents当然,在这种最小设置中,Seam的很多特性是不可用的。以上说明只是为了演示Seam很少涉足入门级使用。例如,Seam包括一个servlet过滤器,该过滤器扩展JSF生命周期以外的Seam特性。servlet过滤器的用法包括与非JSF请求集成,通过重定向传播conversation,以及管理文件上传。请参阅参考资料,看看Seam参考文档,其中讨论了用于控制附加功能的配置文件??特别是EJB3集成。与Seam关联与典型的JSF配置过程相比,使用Seam开发受管bean非常容易。为了将bean暴露到JSF生命周期中,只需在类定义的上面添加一个简单的注释@Name。然后,Seam会负责控制组件的可见性和生命周期。最妙的是,不需要在faces-config.xml文件中定义这个bean。清单4显示了@Name注释以及@DataModel、@DataModelSelection、@In、@Out和@Factory。这些注释使变量能够在视图模板和Seam组件之间双向流动。在Seam用语中,这个动作被称作双射(bijection,即bidirectionalinjection的简称)。当注出(outject)属性数据时,视图可以通过名称找到它。在postback或者组件初始化时,数据被注入(inject)到一个组件中。后者是著名的控制反转(inversionofcontrol,IOC)模式的一种实现,可用于连接委托对象。传统IOC与Seam的双射之间的主要不同点在于,双射使长期作用域中的组件可以引用短期作用域中的组件。可以进行这种连接是因为Seam在调用组件时(而不是启动容器时)解析依赖项。双射是有状态组件开发的基础。显然,清单4中的POJObean只是简单地演示了Seam的用法。随着本系列讨论的继续,我将探索另外的方法来实现Seam。清单4.一个典型的SeamPOJObean@Name(addressManager)publicclassAddressManagerBean{@DataModelprivateListAddressaddresses;@DataModelSelection@Out(required=false)privateAddressselectedAddress;@Factory(value=addresses)publicvoidloadAddress(){//logictoloadaddressesintothis.addresses}publicStringshowDetail(){//noworkneedstobedonetodivparetheselectedaddressreturn/address.jspx;}publicStringlist(){return/addresses.jspx;}}Spring的注入为了使用由一个已有的Spring容器管理的服务层对象中的投资,需要将所有处理相关业务逻辑的Springbean注入到Seam组件中。首先需要确保已经配置了Spring-JSF集成,它由Spring框架附带的一个定制变量解析器进行处理(见参考资料)。有了这座桥梁,Spring与Seam的集成就很简单,只需使用@InJava5注释和一个值绑定表达式,以表明Seam组件的哪些属性应该接收一个Springbean的注入,如清单5所示。(将来版本的Seam将包括用于Spring的一个定制的名称空间,以满足值绑定表达式的需要。)清单5.注入一个Springbean@Name(addressManager)publicclassAddressManagerBean{@In(#{addressService})privateAddressServiceaddressService;}这个例子设置支持使用以轻量级容器(这里就是Spring)配置的无状态服务和数据访问(DAO)层。因为不需要EJB3,所以部署的目标可以是任何基本的servlet容器。现在,您对Seam-JSF实现有了一个初步的印象,接下来我将更深入地探讨我在使用JSF时遇到的挑战,以及Seam如何缓解这些挑战。再谈JSF为了充分理解Seam为JSF带来了什么,就需要理解JSF与其他流行的基于Web的编程方法有何不同。JSF是实现传统的Model-View-Controller(MVC)架构的一种Web框架。不同之处在于,它采用该模式的一种特别丰富的实现。与Model2或者Struts、WebWork和SpringMVC之类的框架中使用的“push-MVC”方法相比,JSF中的MVC实现更接近于传统的GUI应用程序。前面那些框架被归类为基于动作的(action-based),而JSF则属于基于组件模型的新的框架家族中的一员。如果将基于动作的框架想象为使用“push”模型,而将组件框架想象为使用“pull”模型,那么这种区别就很容易理解了。组件框架中的控制器不是预先处理页面请求(在基于动作的框架中控制器就是这么做的),而是在请求生命周期中作出让步,在视图中调用数据提供方法。此外,页面上的元素,即组件被绑定到事件,这些事件可以触发服务器端对象(激活后)的方法调用,从而导致重新显示相同的视图,或者转换到另一个页面。因此,

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功