SSH 组建轻量级架构

原文: 
struts+spring+hibernate 组装web应用
用spring、Hibernate、Struts组建轻量级架构



应用程序的分层 (Application Layering)/  SSH       大多数不复杂的web应用都能被分成至少4个各负其责的层次。这些层次是:表现层(presentation)、持久层(persistence)、业务层(business)、领域模型层(domain model)。每层在应用程序中都有明确的责任,不应该和其它层混淆功能。每一应用层应该彼此独立但要给他们之间放一个通讯接口。让我们从审视各个层开始,讨论这些层应该提供什么和不应该提供什么。

 
为什么采用这样的四层架构?



表现层 (The Presentation Layer) / Struts   在一个典型的web应用的一端是表现层。很多Java开发者也理解Struts所提供的。然而,太常见的是,他们把像业务逻辑之类的耦合的代码放进了一个org.apache.struts.Action。所以,让我们在像Struts这样一个框架应该提供什么上取得一致意见。这儿是Struts负责的:  

     为用户管理请求和响应;  
     提供一个控制器(controller)代理调用业务逻辑和其它上层处理; 
     处理从其它层掷出给一个Struts Action的异常; 
     为显示提供一个模型;
     执行用户接口(UI)验证。


这儿是一些经常用Struts编写的但是却不应该和Struts表现层相伴的项目:

     直接和数据库通讯,比如JDBC调用; 
     业务逻辑和与你的应用程序相关的验证; 
     事务管理;

在表现层中引入这种代码将导致典型耦合(type coupling)和讨厌的维护。

为什么使用Struts?



业务层(The Business Layer) / Spring       在一个典型的web应用程序的中间的组件是业务层或服务层。从编码的视角来看,这个服务层是最容易被忽视的一层。不难在用户接口(UI)层或者持久层里找到散布在其中的这种类型的代码。这不是正确的地方,因为这导致了应用程序的紧耦合,这样一来,随着时间推移代码将很难维护。幸好,针对这一问题有好几种Frameworks存在。在这个领域两个最流行的框架是Spring和PicoContainer,它们叫作微容器(microcontainers),你可以不费力不费神的把你的对象连在一起。所有这些框架都工作在一个简单的叫作“依赖注入”(dependency injection)(也通称“控制反转”(inversion of control))的概念上。这篇文章将着眼于Spring的为指定的配置参数通过bean属性的setter注入(setter injection)的使用。Spring也提供了一个构建器注入(constructor injection)的复杂形式作为setter注入的一个替代。对象们被一个简单的XML文件连在一起,这个XML文件含有到像事务管理器(transaction management handler)、对象工厂(object factories)、包含业务逻辑的服务对象(service objects)、和数据存取对象(DAO)这些对象的引用(references)。
 

这篇文章的后面将用例子来把Spring使用这些概念的方法说得更清楚一些。业务层应该负责下面这些事情:

    处理应用程序的业务逻辑和业务验证;
    管理事务;
    预留和其它层交互的接口;
    管理业务层对象之间的依赖;
    增加在表现层和持久层之间的灵活性,使它们互不直接通讯;
    从表现层中提供一个上下文(context)给业务层获得业务服务(business services );
    管理从业务逻辑到持久层的实现。

为什么使用Spring ?



持久层 (The Persistence Layer ) / Hibernate

        在典型web应用的另一端是持久层。这通常是使事情迅速失控的地方。开发者低估了构建他们自己的持久层框架的挑战性。一般来说,机构内部自己写的持久层不仅需要大量的开发时间,而且还经常缺少功能和变得难以控制。有几个开源的“对象-关系映射”(ORM)框架非常解决问题。尤其是,Hibernate框架为java提供了"对象-关系持久化"(object-to-relational persistence)机制和查询服务。Hibernate对那些已经熟悉了SQL和JDBC API的Java开发者有一个适中的学习曲线。Hibernate持久对象是基于简单旧式Java对象(POJO)和Java集合(Java collections)。此外,使用Hibernate并不妨碍你正在使用的IDE。下面的列表包含了你该写在一个持久层框架里的代码类型:

        查询相关的信息成为对象。Hibernate通过一种叫作HQL的面向对象(OO)的查询语言或者使用条件表达式API(expressive criteria API)来做这个事情。 HQL非常类似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。有一些新的专用的HQL语言成分要学;不过,它们容易理解而且文档做得好。HQL是一种使用来查询对象的自然语言,花很小的代价就能学习它。

        保存、更新、删除储存在数据库中的信息。

        像Hibernate这样的高级“对象-关系”映射(object-to-relational mapping)框架提供对大多数主流SQL数据库的支持,它们支持“父/子”(parent/child)关系、事务处理、继承和多态。


这儿是一些应该在持久层里被避免的项目:

    业务逻辑应该在你的应用的一个高一些的层次里。持久层里仅仅允许数据存取操作。

    你不应该把持久层逻辑(persistence logic)和你的表现层逻辑(presentation logic)搅在一起。避免像JSPs或基于servlet的类这些表现层组件里的逻辑和数据存取直接通讯。通过把持久层逻辑隔离进它自己的层,应用程序变得易于修改而不会影响在其它层的代码。例如:Hebernate能够被其它持久层框架或者API代替而不会修改在其它任何层的代码。

为什么使用Hibernate ?



领域模型层 (The Domain Model Layer )         最后,因为我们讨论的是一个不是很复杂的、基于web的应用程序,我们需要一组能在不同的层之间移动的对象。领域对象层由那些代表现实世界中的业务对象的对象们组成,比如:一份订单(Order)、订单项(OrderLineItem)、产品(Product)等等。这个层让开发者停止建立和维护不必要的数据传输对象(或者叫作DTOs),来匹配他们的领域对象。例如,Hibernate允许你把数据库信息读进领域对象(domain objects)的一个对象图,这样你可以在连接断开的情况下把这些数据显示到UI层。那些对象也能被更新和送回到持久层并在数据库里更新。而且,你不必把对象转化成DTOs,因为DTOs在不同的应用层间移动,可能在转换中丢失。这个模型使得Java开发者自然地以一种面向对象的风格和对象打交道,没有附加的编码。
posted on 2008-09-04 16:45  黄小二  阅读(347)  评论(0编辑  收藏  举报