本文介绍利用JSF和Hibernate构建Web应用,以及介绍为什么选用JSF?

JSF是一种新的用于构架j2ee运用用户界面的技能,它特别适合于根据 MVC架构的运用中。虽已有许多文章介绍过了JSF,但是它们大多从理论高度来介绍JSF而不是面向于实践运用。现在关于实践运用,JSF仍有许多问题没有解决,例如:怎么使JSF适应于MVC全体构架中?怎么将JSF与其他Java 结构整合起来?是否应该将事务逻辑放置在JSF的backing beans中?怎么处理JSF中的安全机制?更为重要的是怎么运用JSF构架实际国际的Web运用?

使用JSF和Hibernate构建Web使用  JSF Hibernate Web应用 第1张

本文将触及到上面的这些问题,它将演示怎么将JSF、Spring和Hibernate整合在一同,构架出一个名为JCatalog的在线产品价目体系。运用该Demo,本文涵盖了Web运用开发的每一个阶段,包括需求搜集、剖析,技能挑选,体系架构和完成。本文评论了在JCatalog中触及到的各种技能的长处和缺陷并展现了一些要害部分的规划办法。

本文的目标是从事根据J2ee的Web运用架构人员和开发人员,它并不是对JSF、SpringFramework和Hibernate的简略介绍,假如对这些范畴不甚了解,请参看相关资源。

该典范的功用需求
JCatalog是一个实际国际的Web运用,我首要描绘JCatalog的需求,在通篇的技能决议计划和架构规划时都将触及到本部分。

在规划Web运用的***阶段是搜集体系的功用需求,典范运用是一个典型的电子商务运用体系,用户能够阅读产品的catalog并查看产品的具体情况,而办理员能够办理产品的catalog。经过添加一些其他功用,如inventory办理和订单处理等,该运用可成为一个老练的电子商务体系。

Use cases
Use-case剖析被用来展现典范运用的功用需求,图1便是该运用的use-case图。


use-case图用于标明体系中的actors以及或许进行的operations,在该运用中将有七个use-case,用户能够阅读产品 catalog和查看产品的具体情况,一旦用户登录到体系中,她将成为办理员,然后能够创立新的产品,修正已存在的产品或许删去老的产品等。

Business rules
JCatalog有必要契合以下business rules:
◆每个产品有必要具有仅有的ID
◆每个产品有必要归于至少一个category
◆产品ID一旦创立不得修正

Assumptions
咱们在体系的规划和完成中做以下假定:
◆英语讲是缺省言语,且不需事前国际化
◆在Catalog不讲不会超越500个产品
◆catalog将不会被频频的修正

Page flow
一切的JCatalog的pages以及它们之间的transitions联络:


该运用中存在两组pages:揭露的internet和用于办理的intranet,其间 intranet只能被那些成功登录到体系的用户拜访。 ProductSummary不作为一个独自的page展现给用户,它显现在Catalog page中的frame中。ProductList只对办理员可视,它包括用于创立、修正和删去产品的链接。

构架规划
Web运用开发的下一个阶段是构架规划,它包括将运用区分为多个功用组件并将这些组件切割组合成层,高层的构架规划应该中立于所选用的特定技能。

多层架构
多层架构是将整个体系明晰的分为多个功用单元:client、presentation、business-logic、integration和 EIS,这将保证责任得到明晰的区分,使得体系更易于保护和扩展。具有三层或等多层的体系被证明比C/S模型具有更好的伸缩性和灵敏性。

client层是运用和标明数据模型的当地,关于一个Web运用,client层通常是阅读器,根据阅读器的瘦客户端不包括任何标明逻辑,它依赖于presentation层。

presentation层将business-logic层的服务展现给用户,它应知道怎么处理用户的恳求,怎么同business-logic层交互,并且知道怎么挑选下一个视图显现给用户。

business-logic层包括运用的business objects和business services。它承受来在于presentation层的恳求、根据恳求处理事务逻辑。事务逻辑层组件将获益于体系级的服务,如安全办理、事务办理和资源办理等。

integration层是介于business-logic层和EIS层之间的桥梁,它封装了与EIS层交互的逻辑。有时,将integration层和business-logic层合称为中间层。

运用的数据被保存在EIS层中,它包括联络数据库、面向目标数据库和以及留传体系等。

JCatalog的构架规划
JCatalog的构架规划以及怎么运用于多层构架体系中。


该运用选用了多层非分布式的构架,体系的分层以及每一层中挑选的技能,它一同又是该典范的布置图,它的presentation、 business-logic和integration层将存在于同一个web容器中。界说杰出的接口将孤立每一层的责任,这一架构使得运用更为简略和更好的伸缩性。

关于presentation层,经历标明,***的办法是挑选已存在的并已得到证明了的Web运用结构,而不是自己去规划和开发新的结构。咱们具有多个可挑选的结构,如Struts,WebWork和JSF等,在JCatalog中,咱们挑选选用JSF。

EJB 和POJO都能够用来创立事务逻辑层,假如运用是分布式的,选用具有remote接口的EJB是一个好的挑选;因为JCatalog是一个典型的不需求长途拜访的Web运用,因而选用POJO,并充分运用Spring Framework的协助,将是完成事务逻辑层的更好挑选。

integration层运用联络型数据库事前数据的继续化,存在多种办法可用来完成:

◆JDBC:这是最为灵敏的办法,但是,初级的JDBC难以运用,并且质量差的JDBC代码很难工作杰出
◆Entity beans:CMP的Entity bean是一种别离数据拜访代码和处理ORM的贵重的办法,它是以运用服务器为中心的办法,即entity bean不是将运用与某种数据库类型而是EJB容器束缚在一同。
◆O/R mapping framework:一个ORM结构选用以目标为中心的办法完成数据继续化,一个以目标为中心的运用易于开发并具有高度的可移植性。在该范畴中存在几个结构可用—JDO、Hibernate、TopLink以及CocoBase等。在咱们的典范中将选用Hibernate。

现在,咱们将评论每一层中的规划问题,因为JSF是一个相对较新的技能,因而将着重于它的运用:

presentation层和JSF
标明层的功用是搜集用户的输入、展现数据、操控页面导航并将用户的输入传递给事务逻辑层,标明层一同需求验证用户的输入以及保护运用的session状况。鄙人面几部分中,我将评论标明层规划时的考虑和形式,并阐明挑选JSF作为JCatalog标明层的原因。

MVC
MVC是Java-Blueprints引荐的架构规划形式,MVC将几个方面别离开来,然后削减代码的重复,它以操控为中心并使得运用更具扩展性。MVC一同可协助具有不同技能的用户更重视于自己的技能,经过界说杰出的接口进行相互合作。MVC是标明层的架构规划形式。

JSF
JSF 是Web运用的服务器端用户组件结构,它包括以下API:标明UI组件、办理它们的状况、处理事情、服务器端验证、数据转化、界说页面导航、支撑国际化,并为这些特性供给扩展才能。它一同包括两个JSP的tag库以在JSP页面中标明UI组件,以及将组件wire为服务器端目标。

JSF和MVC
JSF十分适合于根据MVC的标明层架构,它在行为和标明之间供给了明晰的别离,它使得你能够选用了解的UI组件和web层概念而无需受限于某种特别的脚本技能或符号言语。

JSF backing beans是JSF的Model层,此外,它相同包括actions,action是controller层的扩展,用于将用户的恳求委派给事务逻辑层。这儿请注意,从全体的运用构架看,事务逻辑层也被称为model层。包括JSF标签的JSP页面是标明层,Faces Servlet供给了controller的功用。

为什么选用JSF?
JSF不只仅是别的一个Web结构,下面这些特性是JSF差异于其他Web结构之地点:
◆类Swing的面向目标的Web运用开发:服务器端有状况的UI组件模型,合作event listeners和handlers,促进了面向目标的Web运用开发。
◆backing-bean办理: backing bean是与页面中运用的UI组件相关联的javabean组件,backing-bean办理将UI组件目标的界说同履行运用相关处理和具有数据的目标别离开来。JSF在适宜的规模内保存和办理这些backing-bean实例。
◆可扩展的UI模型:JSF的UI模型是可装备的、可重用的,用以构建JSF运用的用户界面。你能够经过扩展规范的UI组件来开宣布更为杂乱的组件,例如菜单条、树组件等。
◆灵敏的rendering模型:renderer别离了UI组件的功用和显现,多个renderers可创立和用来为同一客户端或不同的客户端界说不同的显现。
◆可扩展的转化和验证模型:根据规范的converter和validator,你能够开宣布自己的可供给更好的模型保护的converter和validator。

尽管如此,JSF现在没有老练,伴随JSF发布的 components、converters和validators都是最根底的,并且per-component验证模型不能处理components 和validators间的many-to-many验证。此外,JSF标签不能与JSTL间无缝的整合在一同。

鄙人面的章节中,我将评论几个在JCatalog完成中的要害部分和规划决议计划。我首要解说managed bean的界说和运用以及JSF中的backing bean,然后,我将阐明怎么处理安全、分页、caching、file upload、验证以及错误信息定制。

Managed bean,backing bean,view object 和domain object model
JSF 中引入了两个新的名词:managed bean和backing bean。JSF供给了一个强壮的managed-bean东西,由JSF来办理的JavaBean目标称为managed-bean,一个 managed bean表述了一个bean怎么被创立和办理,它不包括该bean的任何功用性描绘。

backing bean界说了与页面中运用的UI组件相关联的特点和处理逻辑。每一个backing-bean特点邦定于一个组件实例或某实例的value。一个 backing-bean一同界说了一组履行组件功用的办法,例如验证组件的数据、处理组件触发的事情、实施与组件相关的导航等。

一个典型的JSF运用将其间的每个页面和一个backing-bean结合起来,但是在实际运用中,强制的履行这种one-on-one的联络不是一种抱负的解决方案,它或许会导致代码重复等问题。在实际的运用中,多个页面能够同享一个backing-bean,例如在JCatalog中, CreateProduct和EditProduct将同享同一个ProductBean界说。

model目标特定于标明层中的一个 view目标,它包括有必要显现在view层的数据以及验证用户输入、处理事情和与事务逻辑层交互的处理逻辑等。在根据 JSF的运用中backing bean便是view目标,在本文中backing bean和view目标是可交换的名词。

比照于struts中的 ActionForm和Action,运用JSF中的backing-bean进行开发将能更好的遵从面向目标办法,一个 backing-bean不只包括view数据,并且还包括与这些数据相关的行为,而在struts中,Action和ActionForm别离包括数据和逻辑。

咱们都应该听说过domain object model,那么,domain object model和view目标之间有什么差异呢?在一个简略的Web运用中,一个domain object model能够横穿一切层中,而在杂乱的运用中,需求用到一个独自的view目标模型。domain object model应该归于事务逻辑层,它包括事务数据和与特定事务目标相关的事务逻辑;一个view目标包括presentation-specific的数据和逻辑。将view目标从domain object model中别离出来的缺陷是在这两个目标模型之间必将呈现数据映射。在JCatalog中,ProductBeanBuilder和 UserBeanBuilder运用reflection-based Commons BeanUtils来完成数据映射。

安全
现在,JSF没有内建的安全特性,而关于典范运用来说安全需求是十分根底的:用户登录到administration intranet中仅需用户名和暗码认证,而无需考虑授权。
针关于JSF的认证,已有几种办法提出:
◆运用一个backing bean:这一个办法十分简略,但是它却将backing bean与特别的承继联络结合起来了
◆运用JSF的ViewHandler decorator:这一办法中,安全逻辑严密地与一特定Web层技能联络在了一同
◆运用servlet filter:一个JSF运用与其他的Web运用没有什么两样,filter仍是处理认证查看的***当地,这种办法中,认证逻辑与Web运用别离开来

在咱们的典范程序中,SecurityFilter类被用来处理用户的认证,现在,受保护的资源只包括三个页面,出于简略的考虑,将它们的方位被硬编码到Filter类中。

分页
该运用中的Catalog页面需求分页,标明层可用来处理分页,即它取出一切的数据并保存在这一层;分页相同可在business-logic层、 integration层、乃至EIS层中完成。因为在JCatalog中假定不超越500个产品,因而一切的产品信息能存放在一个user session中,咱们将分页逻辑放在了ProductListBean中,与分页相关的参数将经过JSF managed-bean东西装备。

Caching
Caching 是进步Web运用功能的最重要技能之一,在运用构建中的许多层中都能够完成caching。JSF managed-bean东西能够使在标明层完成caching十分简略。经过改动一个managed bean的规模,这个managed bean中包括的数据能够在不同的规模内缓存。

典范运用中选用了两级caching,***级caching存在于事务逻辑层,CachedCatalogServiceImpl类保护了一个一切产品和目录的读写cache,Spring将该类作为一个singleton service bean来办理,所以,一级cache是一个运用规模的读写cache。

为了简化分页逻辑并进而进步运用的速度,产品相同在session规模内缓存到标明层,每一个用户保护着他自己的ProductListBean,这一办法的缺陷是内存的耗费和数据的失效问题,在一个用户session中,假如办理员更改了catalog,用户可到的将是失效的数据,但是,因为咱们假定运用的数据不会常常的改动,所以这些缺陷将能够忍耐。

File upload
现在的JSF Sun参阅完成中不支撑file upload。Struts虽已具有十分不错的file upload才能,但是要想运用这一特性需求Struts-Faces整合库。在JCatalog中,一个图画与一个产品相关联,在一个用户创立了新的产品后,她有必要将相应的图片上传,图片将保存在运用服务器的文件体系里,产品的ID便是图画称号。

事务逻辑层和Spring Framework
事务目标和事务服务存在于事务逻辑层中,一个事务目标不只包括数据,并且包括相应的逻辑,在典范运用中包括三个事务目标:Product、Category和User。

事务服务与事务目标交互并供给更高档的事务逻辑,需求首要界说一个正式的事务接口,它是直接与终端用户交互的服务接口。在JCatalog中,经过在 Spring Framework协助下的POJO完成事务逻辑层,其间共有两个事务服务:CatalogService包括Catalog办理相关的事务逻辑, UserService中包括User办理逻辑。

Spring是根据IoC概念的结构,在典范运用中用到的Spring特性包括:
◆Bean management with application contexts:Spring能够有效地安排咱们的中间层目标,它能够消除singleton的proliferation,并易于完成杰出的面向目标编程办法,即“编程到接口”。
◆Declarative Transaction management: Spring运用AOP完成事务办理,而无需借助于EJB容器,运用这种办法,事务办理能够用于任何POJO中。Spring的事务办理不局限于JTA,而是能够选用不同的事务战略,在典范运用中,咱们将运用declarative transaction management with Hibernate transaction。
◆Data-access exception hierarchy:Spring供给了十分好的反常来替代SQLException,为运用Spring的反常,有必要在Spring的装备文件中界说以下反常转化:<property name="dataSource"><font color="#a52a2a"><ref bean="dataSource"></ref></font></property>
在典范运用中,假如一个具有重复ID的新产品被刺进,将会抛出DataIntegrityViolationException,这一反常将被catch并rethrown一个DuplicateProductIdException。这样,该反常就能够与其它的反常差异处理。
◆Hibernate integration:Spring与Hibernate这样的ORM结构整合的十分好,Spring供给了对Hibernate session的高效和安全的处理,它可经过application context装备Hibernate的SessionFactories和JDBC数据源,并使得运用易于测验。

Integration层和Hibernate
Hibernate是一个开源的ORM结构,它能够支撑一切干流SQL数据库体系,Hibernate的查询言语为目标和联络架起了十分好的桥梁。Hibernate供给了强壮的功用以完成:数据读取和更新、事务办理、数据连接池、查询和实体联络办理等。

Data Access Ojbect(DAO)
JCatalog 中选用了Dao形式,该形式笼统和封装了一切对数据源的拜访,该运用中包括两个DAO接口:CatalogDao和UserDao,它们相应的完成 HibernateCatalogDaoImpl和HibernateUserDAoImpl包括了Hibernate特定的逻辑来完成数据的办理和耐久化。

完成
现在咱们来看看怎么将上面评论的这些东西包装在一同以完成JCatalog,你能够从这个地址下载源码:source code

“编程到接口”的思维贯穿了整个规划完成中,在标明层,共用到四个backing bean:ProductBean、ProductListBean、UserBean和MessageBean;事务逻辑层包括两个事务服务 (CatalogService和UserService)和三个事务目标(Product、Category和User);Integration层有两个Dao接口和它们相应的Hibernate完成,Spring的application context用来办理绝大多数的事务逻辑层和integration层的目标;ServiceLocator将JSF和事务逻辑层整合在了一同。

Wire everything up
因为篇幅所限,咱们仅举例阐明,典范中use case CreateProduct展现了怎么安装和构建运用,在具体叙述细节前,咱们运用sequence图来阐明一切层的end-tp-end整合。

【修正引荐】

  1. JSF和AJAX企业级开发之路(一)
  2. JSF和AJAX企业级开发之路(二)
  3. 在JSF运用中捕捉managed-bean结构办法
  4. 体现层结构Struts/Tapestry/JSF比较
  5. 简略介绍JSF标签
转载请说明出处
知优网 » 使用JSF和Hibernate构建Web使用

发表评论

您需要后才能发表评论