(最新)JSFSpringHibernate的实例讲解._第1页
(最新)JSFSpringHibernate的实例讲解._第2页
(最新)JSFSpringHibernate的实例讲解._第3页
免费预览已结束,剩余19页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JSF+Spring+Hibernate 的实例讲解使用JSF建立一个真实的Web应用程序不是没有意义的任务,这篇文章介绍了如何将 JSF与Sping Framework和Hibernate集成,并且给出了使用这些技术建立这个真实的 Web应用程序的最佳实践和设计 指导JavaServer Faces(JSF)技术是J2EE应用程序的一个新的用户接口框架,它非常适合基于 MVC(Model-View-Controller)体系结构的应用程序。已经有大量的文章介绍JSF。然而,很多文章都是站在理论研究的层面上,没有挑战一个真实的企业开发。很多问题没有解决,例如,JSF怎样全面适合MV(体系结构?

2、 JSF如何与其他JAVA框架集成?业务逻辑应该放在 JSF的backing beans里面吗?怎样 处理JSF里面的安全问题?最重要的是你怎样使用JSF建立一个真实的 Web应用程序?这篇文章涉及所有这些问题。它向你展示如何集成其他特定的 Java 框架, Spring Framework 和 Hibernate,它示范怎样去创建一个叫JCatalog的Web应用程序,一个在线的产品目录系统。这篇文章 使用JCatalog例子,介绍了 Web应用程序设计的每一个阶段,包括业务需求收集,分析,技术选择, 高层体系结构和详细设计。这篇文章论述了 JCatalog 里面好的和不好的技术,示范了应用

3、程序设计中 一些关键方面的方法和步骤。这篇文章是写给正在从事基于 J2EE Web应用程序的Java架构师,开发者,它不是对JSF、Spring Framework和Hibernate的入门教程。如果您对这些领域不熟悉,请参考文章最后的资源链接。例子应用程序的功能需求这篇文章的例子应用程序JCatalog是一个真实的Web应用程序,例子足够现实是为了决定应用程序 架构而进行意味深长的讨论的基础。我通过介绍 JCatalog 项目的需求开始。我在这里谈到后面贯穿于 整个文章的内容是为了演示技术选择和体系结构设计。设计Web应用程序的第一步是收集系统的功能需求,这个例子应用程序是一个典型的电子商务

4、应用 系统。用户能浏览产品目录和查看产品细节,管理员能管理产品目录。功能还可以增加,举例来说,为 了开发一个成熟的电子商务系统,可以添加库存管理和订单处理的功能。用例用例分析被用于去访问例子应用程序的功能需求,图 1 是应用程序的用例图DeieteProduct图1用例图7个身份一个用例图确定在一个系统中的参与者以及参与者可以执行的操作。例子应用中用例必须被实现。参与者中的 User能浏览产品目录和察看产品细节。一旦用户以Admi ni strator连接到系统,他就能创建新产品,编辑存在的产品,删除老的产品。业务规则JCatalog必须符合下面的业务规则:每个产品有一个唯一的产品ID每个产品

5、至少属于一个目录产品ID 一旦被创建就不能改变假定对于产品的设计和实现,我们做下面的假定。英语是默认语言;不要求国际化目录中不超过500种产品目录的更新不频繁页面流图2显示了所有JCatalog的页面和它们之间的转换图2页面流图应用程序有两组页面:公共的国际互联网和管理员的企业内部网。企业内部网 只有对那些成功登陆到系统的用户有效。产品概要页面是公用的,它作为产品目录的内容包含在 一个HTML框架里面。产品列表是一个特殊的目录,只能被管理员看见,它包含创建、编辑和删 除产品的链接。图3是目录页的一个模型。理想情况下,每一个页面所有的控制和必要的内容明细的模型应该被包含在需求文档里面JCatal

6、og Projectloginhome | contact us | place orderCategory One Product4扎OCM Size 18 OW 14 OH $22.99short description There are two groups of pages in the sample application- public internet and administration intranet. The intranet is onlyacces&itile to the users who log in the system successfdlly.

7、ProductSummary Is not presented to the users as a separate morepage 1 of 2 »Category OneCategory TwoCategory ThreeCategory FourDerek Y. Shen, "PutJSF to woriC JavaWorld, July 19, 2004图3目录页面模型高级体系结构设计下一步的设计是Web应用程序的高级体系结构设计,它包括将应用程序细分成功能组件以及将这些组件 划分到各自所属的层。高级体系结构设计独立于使用的技术。多层体系结构一个多层体系结构将整个

8、系统划分成清晰的单元客户端、表示层、业务逻辑层、集成层和企业信息 系统(EIS),这保证了清晰的责任划分以及可维护性和可扩展性。三层或多层系统已经被证明比没有 业务逻辑层的客户-服务器系统具有更多的可升级性和柔韧性。客户端是数据模型被消费和呈现的地方。对于一个Wet应用程序,客户层通常是 Web浏览器。基于浏览器的瘦客户不包含表示逻辑;它依赖于表示层。表示层使用业务逻辑层为用户服务,它知道怎样去处理一个客户请求,怎样去和业务逻辑层结合以及怎 样去选择下一个试图去显示。业务逻辑层包含一个应用程序的业务对象和业务服务。它从表示层接受请求,基于请求处理业务逻辑, 作为访问EIS层资源的的中介。业务逻

9、辑层组件使用许多系统级别的服务,例如,安全管理、事物管理 和资源管理。集成层是业务逻辑层和EIS层之间的桥梁。它封装了与 EIS层相结合的逻辑。有时,集成层和业务逻辑 层的结合是作为中间层被提到。应用程序数据在EIS层被持久化,包括关系数据库,面向对象数据库和遗留系统。JCatalog的体系结构设计图4显示了 JCatalog的高级体系结构设计以及它怎样适合多层体系结构。图4高级体系结构图应用程序使用了一个多层的非分布式的体系结构, 图4显示应用程序层和每一层技术选择的划分。 它也用于应用程序的部署图。对于一个可配置的体系结构,表示层、业务逻辑层和集成层被定位 在同样的Web容器。定义良好的接

10、口隔离了每一层的职责。可配置的体系结构使应用程序简单和 可升级。对于表示层,经验告诉我们,最好的实践是选择一个存在的,被验证的 Web应用框架,远比设计 开发一个定制的框架好。我们有几个 Web应用框架可供选择,举例来说,Struts、WebWor和 JSF。 对于 JCatalog 项目,我们使用 JSF。对于业务逻辑层,不是使用 EJB(Enterprise JavaBeans) 就是使用 POJO(plain old Java objects) 。 如果应用程序是分布式的,EJB具有远程接口是一个较好的选择。 因为JCatalog是一个典型的没 有远程访问请求的 Web应用程序,POJO

11、在 Spring框架的帮助下,用于实现业务逻辑层。Pure JDBC(Java Database Co nn ectivity):这是最灵活的实现方法;然而,低级的JDBC和不好的JDBC弋码工作是麻烦的,执行的不好。Entity beans :一个容器管理持久化( CMP,container-managed persistence )的 entity bean 是隔离数据访问弋码和处理 O/R(object- relational) mapping 数据持久化的昂贵的方法。它是 一个以应用服务器为中心的解决办法。一个en tity bean不和特定的数据库紧耦合,但是应用程序和EJB容器进耦

12、合。O/R mapping framework :一个O/R影射的框架采用以对象为中心的方法实现数据持久化。一个 以对象为中心的应用程序是容易开发和高度轻便的。在这个领域内存在几个框架 JDO(JavaData Objects) ,Hibernate,Toplink 。 CocoBase是一个新的例子。在例子应用程序中我们使用 HIbernate 。现在,让我们讨论将应用程序的每一个层联合起来设计的问题。因为JSF相对来说是一个新技术,我强调一下它的使用。表现层和 JavaServer Faces(JSF) 表现层收集用户输入,呈现数据,控制页面导航,弋替用户与业务逻辑层交互。表现层也能校验

13、用户输入,维护应用程序的会话状态。下面的章节,我讨论表现层的设计考虑和模式以及我选择JSF去实现JCatalog项目的表现层的原因。MOdel-View-Controller(MVC)MVC是 Java蓝皮书(BluePrints )中推荐的交互式应用程序体系结构设计模式。 MVC分别设计关 注的问题,因此减少了代码的重复,集中控制,使应用程序更具扩展性。MVC也帮助开发者使用不同的技术集合,集中他们核心的技术,通过定义清晰的接口进行合作。MVC是表现层的体系结构设计模式。JavaServer FaceJSF是一个基于Java的Web应用程序服务端的用户接口组件框架。JSF包括表示UI组件和管

14、理 其状态的 API; 处理事件,服务端校验,数据转换;定义页面导航;支持国际化和可访问性;提供组件,一个用于配置服务端的对象组件。JSF和 MVCJSF很适合基于MVC勺表现层体系结构。它提供动作和表现之间清楚地划分。 它影响了 UI组件和 Web层概念,不限定你去使用特定的脚本技术或者标记语言。JSF backing beans 是model层(后面的章节有关于 backing beans 的更多内容)。它们也包含 动作,这是控制层的扩展,代理用户对业务逻辑层的请求。请注意,从整体应用程序的体系结构 来看,业务逻辑层也能被作为 Model层提到。使用JSF定制标签的JSP页面是视图层。Fa

15、ces Servlet 提供控制者的功能。为什么用 JSFJSF不仅仅只是另一个 Web框架,下面是JSF与其他Web框架不同的特点:象Swing 样面向对象的 Web应用程序开发:服务端有状态的 UI组件模型,具有事件监听和操 作者,开始了面向对象 Web应用程序开发。Backing-bean 管理:Backing beans 是页面中 JavaBeans组件和 UI 组件的联合。Backing-bean 管理UI组件对象定义和对象执行应用程序特殊过程以及控制数据的分离。 JSF在正确的范围内执 行存储和管理这些 backing-bean 实例。可扩展的UI组件模型:JSF UI组件是组成J

16、SF应用程序用户接口可配置、可复用的元素。你能 扩展标准的 UI 组件和开发更多的复杂组件。举例来说,菜单条和树型构件。灵活的表现模型:一个 renderer 分隔一个 UI 组件的功能和视图。多个 renderer 能被创建,用 于定义相同或不同客户端上同样组件的不同外观。可扩展的转化和校验模型:基于标准的转换者和校验者,你能开发定制的转换者和校验者,它们 提供最好的模型保护。尽管JSF很强大,但是现在还不成熟。组件、转换者和校验者是 JSF基本的。每一个校验模型不 能处理组件和校验者之间多对多的校验。另外, JSF定制标签不能和JSTL(JSP Standard Tag Library )

17、无缝结合。在下面的部分,我讨论用JSF实现JCatalog项目时几个关键方面和设计决定。首先讨论 JSF中 man aged bea ns和backi ng bea ns的定义和使用。然后,我介绍 JSF中怎样处理安全、分页、缓 存、文件上传、校验和错误消息定制。Managed bean,backing bean,view object 和 domain object modelJSF介绍了两个新的术语: man aged bean和backi ng bea n。JSF提供一个强大的 ma naged-bean 工厂。被JSF执行的JavaBean对象管理被叫做 managedbeans。一个

18、managedbean描述一个bean 怎样被创建和管理。它没有利用 bean 的功能性。Backing bean 定义页面特性和处理逻辑与 UI 组件的联合。每一个 backing-bean 属性被绑定到 校验组件的数据,处理组件触发事件,组件激活时与导航相关的执行过程。一个典型的JSF应用程序在应用程序的每一个页面中连接一个backing bean。然而,有时在真实的世界里,强迫一个 backing bean 和一个页面一对一的关系不是一个理想的解决方案。它能造 成象代码重复这样的问题。 在真实世界的场景里, 几个页面可能需要共享在后台的同样的 backing bean。例如,在 JCat

19、alog 项目里,CreateProduct 和 EditProduct 页面共享同样的 ProductBean 的定义。一个试图对象是在表示层明确使用的模型对象。它包含了必须显示在视图层的数据和校验用户输 入,处理事件和与业务逻辑层相结合的逻辑。backing bean是基于JSF应用程序的视图对象。在这篇文章中 Backing bean 和视图对象是可交换的术语。比较Struts中的Actionform 和Action ,在JSF中开发backing beans遵循面向对象设计的最好 实践。一个 backing bean 不仅包含视图数据,也包含与数据相关的行为。在 Struts 中, A

20、ction 和 ActionForm 包含数据和逻辑分离。我们都听说过域对象模型。那么,域对象模型和视图对象有什么不同呢?在一个简单的Web应用程序里,一个域对象模型能被用于所有的层,然而,在一些复杂的Web应用程序里面,一个单独的视图对象模型需要被使用。域对象模型是关于业务对象,应该归入业务逻辑层。它包含特定业 务对象相关的业务数据和业务逻辑。 一个视图对象包含特定数据和行为的表示。 JCatalog 项目的 ProductListBean 提供了一个好的例子。它包含表示层数据和逻辑细节,举例来说,与分页相关 的数据和逻辑。从域对象模型分离视图对象的缺点是数据映射必须发生在两个对象模型之间。

21、在 JCatalog 项目中, ProductBeanBuilder 和 UserBeanBuilder 使用基于反射的 CommonBs eanUtils 去实现数据映射。安全当前,JSF没有内置的安全特征。例子的安全需求是基本的:用户连接到管理员使用的公司内部 网需要的认证是基于用户名和密码,不需要授权。在JSF里面几个处理用户认证的方法已经被提出:Use a base backing bean :这个解决方 案是简单的。然而,它使 backing beans 与特殊的遗产 层次绑定。Use JSF ViewHa ndler decorator :这种方法使安全逻辑紧紧地加上一个特殊的We

22、t层技术。Use a servlet filter :一个JSF应用程序与其他基于Java的Web应用程序不同。它在一个恰 当的地方使用一个过滤器处理认证检查。这种方法使Web应用程序中的认证逻辑减弱了。在例子应用程序中, SecurityFilter 类处理用户认证。当前,受保护的资源只有三个页面,为了 简单,它们被硬编码在 Filter 类里面。可以通过扩展安全规则来改进它,把受保护的资源放到 配置文件中。分页应用程序的目录页需要分页。 表现层能处理分页, 这意味着所有数据必须被重新得到存储在这层。 分页也能在业务逻辑层、集成层甚至是EIS层处理。JCatalog项目的假定是在目录中的产品

23、不超 过 500 种。所有产品信息适合保存在用户 session 中。分页逻辑存在 ProductListBean 类中。与 分页有关的参数“每页的产品”通过 JSF的man aged-bean工具配置。缓存缓存是Web应用程序中改善性能的众多重要技术中的一种。缓存能在应用程序体系结构内的许多层完成。体系结构中的一层减少调用它下面的层时,缓存是非常有益的。JSF man aged-bea n工具使在表现层实现缓存更容易。通过改变一个 managed bean的范围,包含在 managed bean中的数 据能在不同的范围内缓存。例子应用程序使用二级缓存。 第一级缓存在业务逻辑层里面。 Cach

24、edCatalogServiceImpl 类维护 所有产品和目录的读/写缓存。Spring管理的类作为一个单独服务bean。所以,一级缓存是一个 应用程序范围的读 /写缓存。对于简单的分页逻辑和将来应用程序速度的提高,表现层的会话范围内的产品也被缓存。每个用 户维护他 session 里面自己的 ProductListBean 。缺点是占用系统内存和存在旧数据。在一个用 户session的持续时间里,如果管理员更新了目录,用户可能会看到旧的目录数据。然而,基于 这样的假定,目录中部超过 500种产品,而且目录更新不频繁,我们应该能够忍受这些缺点。 文件上传目前,JSF的Sun参考实现中不支持文

25、件上传。Struts有很好的文件上传能力,然而,Struts外 观集成库是必须使用。 在 JCatalog 项目中,一个图片与每个产品关联。一个用户创建一个新的 产品之后,必须上传与之相关的图片。图片保存在应用服务器的文件系统里面。产品 ID 是图片 名.例子应用程序使用 <input type="file">,Servlet 和 Jakarta 通用的文件上传 API, 实现一个简单 的文件长传功能。这个功能使用两个参数:产品图片路径和图片上传结果页面。它们都通过 ApplicatonBean 配置。请参考 FileUploadServlet 类的详细资料。校

26、验JSF具有的标准校验是简单基本的,不能满足真实的需求。开发自己的JSF校验是容易的。我在例子应用程序中使用定制标签来开发 SelectedItemsRange 校验。它校验通过 UISelectMany UI 组件选择的项目数量:<h:selectManyListbox value="#productBean.selectedCategoryIds" id="selectedCategoryIds"><catalog:validateSelectedItemsRange minNum="1"/><f:s

27、electItems value="#applicationBean.categorySelectItems" id="categories"/></h:selectManyListbox>更多的详细资料请参考例子应用程序错误消息定制在 JSF 里面,你可以设置资源包定制转换和校验时的错误消息。资源包被设置在 faces-config.xml 里面: 业务逻辑层和 Spring Framework 业务对象和业务服务在业务逻辑层。一个业务对象不仅包含数据,也有与特定对象关联的逻辑。 在例子应用程序中标识了三个业务对象: Product,

28、Category 和 User. 业务服务与业务对象相结合,提供高级的业务逻辑。一个包含直接使用的服务接口的标准的业务 接口层应该被定义。在 Spring Framework的帮助下,POJC实现了 Jcatalog项目业务逻辑层。有 两个业务服务: CatalogService 包含与目录管理相关的业务逻辑, UserService 包含了用户管理 逻辑。Spring 是基于控制反转概念( IOC,inversion of control )。在例子应用程序中使用的 Spring 特征包括:Bean management with application contexts:Spring 能有

29、效地组织我们的中间层对象,垂直处理。 Spring 能避免一个实体功能的分解,促进好的面向对象设计实现,举例来说,接口设计。Declarative transaction management :Spring 使用 AOP(aspect-oriented programming) 去描 述不使用EJB容器的声明性事务处理。这种方法,事务管理能被应用到任何POJO Spring事务管理不和 JTA(Java Transaction API) 绑定,使用不同的事物策略工作。在例子应用程序中声明 性事务管理 Hibernate 中的事务。Data-access exception hierarchy

30、 :Spring 提供一个值得回味的异常层次代替 SQLException。 使用 Spring 数据访问异常层次, Spring 数据访问异常翻译者必须在 Spring 配置文件里面定 义:<property name="dataSource"><ref bean="dataSource"/></property></bean>在例子应用程序中,如果插入的一个新产品的 ID 是重复的,一个DataIntegrityViolationException 会被抛出。这个异常会被捕获然后作为 Duplicate

31、ProductIdException 被抛出。这种方法, DuplicateProductIdException 能处理不同 的数据访问异常。Hibernate integration: Spring不强迫我们使用它强大的 JDBG由象特征。它和 0/R映射框架集成的很好,尤其是 Hibernate 。 Sping 提供有效的、安全的 Hibernate 会话操作。在应用程序上下文操作 Hibernate 的配置 SessionFactories 集成层和 HibernateHibernate是一个开源0/R映射框架,它减少使用SQL数据库管理系统。Hibernate Query Lan gu

32、age 象和关系世界间提供了一个优雅的桥。 Hibernate 连接池, programmatic and declarative queries,和JDBC数据源,使应用程序容易测试。JDBCAPI 的需要。 Hibernate 支持所有主流的 是SQL面向对象的最小的扩展来设计的,在对 提供数据恢复和更新的工具,事务管理,数据 声明实体关系管理。SQL在系统开Hibernate和其他O/R映射框架相比入侵性较小。使用反射和运行时产生字节码,始时产生。它允许我们开发符合 Java 习惯的持久对象,包括联合,继承,多态,聚合和 Java 集 合框架。在例子应用程序中的业务对象是POJO不需要实

33、现Hibernate的特殊接口。Data Access 0bject (DA0)JCatalog项目使用DAO模式。这个模式抽象和封装了所有对数据源的访问。应用程序有两个DAO接口。CatalogDao 和 UserDac。它们的实现类是 HibernateCatalogdaoImpI 和 HibernateUserDaoImpl 包含与 Hibernate 相关的管理和持久化数据逻辑。实现设计 现在,让我把每件事情都串起来,实现 JCatalog 项目。你可以冲资源列表中下载应用程序的完 整源代码。数据库设计ProductPKidnamepr ice widthheightdescripti

34、onCategoryPKidnamedescri plionprod u ct_ca tegoryIPK PKproduct idcategory idFK2id图5数据结构图useru客令iTiam令tpassword类设计:图6图解了 JCatalog项目的类图<<ViewObject>>Product Bean«ViewObject» ProductListBean«ViewObject>>UseiBean«ViewObjec1»re ate Ad ion Q '- jpdateActionQ

35、delereActionQlogirActionOIcgoutActionQinvokesinvokes1 .nsearchByCategoryAclionOTTTisubmit Act ionO1,n厂11 oServiceLocator1. ninvokesinvokesCatalogServiceeProductO update Pro duct() dfisteProduclQ getProductf) getCalegoryO etAHProd uctsQ etAl I Catego ria sQ«Bu6inessService»CachedCatalogServ

36、icelmpImaneg.eslookupsmanagesetCatalogService j'getUserSeiviceQ«S erviceLo cator>>SetviceLocatorBeanlojikups«6usinessObject»Category.77-UserServiceloginendEmilO<<BusinessSeivice>>UserSenncelmpImanages<<BusinessObject>>Productrr y 豪 fA:<<Business

37、Object>>UserjTAcreatescreatesIV1CatalogDao«DAO»CatalogDaolHibematelrnpl«DAO»UserDaoHibernatelmpIV 1-oUseiD ao类图面向接口编程贯穿于整个设计。在表现层,四个bean被使用:ProductBean, ProductListBean,UserBean 和 MessageBear。业务逻辑层包含两个服务(CatalogService and UserService )和三 个业务对象(Product, Category, and User )

38、。集成层包括两个 DAC接口和它们的 Hibernate 实现。Spring即plicati on con texts包含和管理业务逻辑层和集成层的很多object bea ns 。ServiceLocator 使JSF和业务逻辑层结合到一起。Wire everyth ing up因为这篇文章篇幅的限制,我们只看一个用例。CreateProduct用例示范了怎样将每件事情串起来建造应用程序。深入细节以前,让我们使用一个序列图(图7)示范所有层端到端的整合:图7 CreateProduct用例的序列图现在,让我们通过对每一层的介绍讨论如何实现CreateProduct用例的更多细节。表现层表现层

39、的实现包括创建JSP页面,定义页面导航,创建和配置backing beans,将JSF与业务逻辑层结合。JSP page: createProduct.jsp是创建新产品的页面。它包括 UI组件和捆绑这些组件的ProductBean。ValidateltemsRa nge自定义标签检验用户选择目录的数目。每个新产品至少有一个目录被选择。Pagenavigation :应用程序的导航定义在应用程序的配置文件里面,faces-navigation.xml。CreateProduct定义的导航规则是:<n avigati on-rule>vfrom-view-id>*v/from-

40、view-id><n avigati on-case><from-outcome>createProduct</from-outcome><to-view-id>/createProduct.jsp</to-view-id></navigation-case></navigation-rule><navigation-rule><from-view-id>/createProduct.jsp</from-view-id><navigation-case>&l

41、t;from-outcome>success</from-outcome><to-view-id>/uploadImage.jsp</to-view-id></navigation-case><navigation-case><from-outcome>retry</from-outcome><to-view-id>/createProduct.jsp</to-view-id></navigation-case><navigation-case><fr

42、om-outcome>cancel</from-outcome><to-view-id>/productList.jsp</to-view-id></navigation-case>actions :</navigation-rule>Backing bean: ProductBean 不仅包含了页面中 UI 组件与数据映射的属性,也包含三个createAction,editAction 和 deleteAction 。这是 createAction() 方法的代码:public String createAction() tr

43、y Product product = ProductBeanBuilder.createProduct(this);/Save the product./Store the current product id inside the session bean./For the use of image uploader.FacesUtils.getSessionBean().setCurrentProductId(this.id);/Remove the productList inside the cache.FacesUtils.resetManagedBean(BeanNames.PR

44、ODUCT_LIST_BEAN); catch (DuplicateProductIdException de) String msg = "Product id already exists"FacesUtils.addErrorMessage(msg);return NavigationResults.RETRY; catch (Exception e) String msg = "Could not save product"FacesUtils.addErrorMessage(msg + ": Internal Error")

45、;return NavigationResults.FAILURE;String msg = "Product with id of " + this.id + " was created successfully."FacesUtils.addInfoMessage(msg);return NavigationResults.SUCCESS;在这个 action 里面,基于 ProductBean 的一个 Product 业务对象被建立。 ServiceLocator 查询 CatalogService 。最后, createProduct 的请求被委

46、派给业务逻辑层的 CatalogService 。Managed-bean declaration: ProductBean 必须在 JSF的配置资源文件 faces-managed-bean.xml 中配置:<managed-bean><description>Backing bean that contains product information.</description><managed-bean-name>productBean</managed-bean-name><managed-bean-scope>r

47、equest</managed-bean-scope><managed-property><property-name>id</property-name><value>#ductId</value></managed-property><managed-property><property-name>serviceLocator</property-name><value>#serviceLocatorBean</value><

48、;/managed-property></managed-bean>ProductBean有一个请求的范围,这意味着如果 ProductBean在JSP页面内引用JSF执行为每一 个请求创建ProductBean实例的任务。被管理的ID属性与productId这个请求参数组装。JSF从 请求得到参数,设置 managed property 。Integration between presentation and business-logic tiers: ServiceLocator抽象了查询服务的逻辑。在例子应用程序中, ServiceLocator 被定义成一个一个接口

49、。接口被 JSF managed bean 实现为 ServiceLocatorBean ,它从 Spring application context 查询服务: ServletContext context = FacesUtils.getServletContext();this.appContext =WebApplicationContextUtils.getRequiredWebApplicationContext(context);this.catalogService = (CatalogService)this.lookupService(CATALOG_SERVICE_BEA

50、N_NAME); this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);ServiceLocator 被定义为 BaseBean中的一个属性。JSF managedbean容易连接 ServiceLocator 执行必须访问 ServiceLocator 的那些 man aged bea n& 使用了 In version of con trol(IOC,控制反转)业务逻辑层定义业务对象,创建服务接口和实现,在 Spring 中配置这些对象组成了这一层的任务。Business objects

51、: 因为 Hibernate 提供了持久化, Product 和 Category 业务对象需要为它们包 含的所有属性提供 getter 和 setter 方法。Business services:CatalogService 接口定义了所有与目录管理有关的服务:public interface CatalogService public Product saveProduct(Product product) throws CatalogException;public void updateProduct(Product product) throws CatalogException;p

52、ublic void deleteProduct(Product product) throws CatalogException;public Product getProduct(String productId) throws CatalogException;public Category getCategory(String categoryId) throws CatalogException;public List getAllProducts() throws CatalogException;public List getAllCategories() throws Cata

53、logException;CachedCatalogServicelmpI 服务的接口实现,它包含 CatalogDao 对象的一个 setter 。Spring 将 CachedCatalogServiceImpl 和 CatalogDao 连接在一起。因为我们提供了接口,所以对实现的依 赖不是很紧密。Spring configuration:下面是 CatalogService 的 Spring comfiguration :<!- Hibernate Transaction Manager Definition -><property name="sessio

54、nFactory"><ref local="sessionFactory"/></property></bean><!- Cached Catalog Service Definition -><property name="catalogDao"><ref local="catalogDao"/></property></bean><!- Transactional proxy for the Catalog Ser

55、vice -><property name="transactionManager"><ref local="transactionManager"/></property><property name="target"><ref local="catalogServiceTarget"/></property><property name="transactionAttributes"><props

56、><prop key="get*">PROPAGATlON_REQUlRED,readOnly</prop><prop key="save*">PROPAGATlON_REQUlRED</prop><prop key="update*">PROPAGATlON_REQUlRED</prop><prop key="delete*">PROPAGATlON_REQUlRED</prop></props>&l

57、t;/property></bean>Spring 声明事务管理是在 CatalogService. CatalogService 里面设置,它能实现不同CatalogDao。Spring创建并管理单体实例 Catalogservice,不需要工厂。现在,业务逻辑层准备好了,让我们将它与集成层整合。Integration between Spring and Hibernate:下面是 HibernateSessionFactory 的配置:<!- Hibernate SessionFactory Definition -><bean id="se

58、ssionFactory"<property name="mappingResources"><list></list></property><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop></props></property><property name="dataS

59、ource"><ref bean="dataSource"/></property></bean>CatalogDao 使用 HibernateTemplate 集成 Hibernate 和 Spring. 下面是 HibernateTemplate 的配<!- Hibernate Template Defintion -> <bean id="hibernateTemplate"vproperty n ame="sessi onF actory"><ref bea n="sessi onF actory"/></property>vproperty n ame="jdbcExcept

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论