SSH 组建轻量级架构

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



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

wiring.gif 
ContractedBlock.gif ExpandedBlockStart.gif 为什么采用这样的四层架构?
None.gif 通过成熟的开源产品实现各层,同自己编写代码实现,相比之下能缩短开发周期,且架构所用到的开源产品均有 很广泛的用户群,经受过实践的考验,质量和性能更有保障。  
None.gif
None.gif 层与层之间松散耦合,增加代码重用率。 
None.gif
None.gif 各层分工明确,这样也利于团队的明确分工。 



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

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


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

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

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

ContractedBlock.gif ExpandedBlockStart.gif 为什么使用Struts?
None.gifStruts将业务数据、页面显示、动作处理进行分离,这有利各部分的维护。 
None.gif
None.gifStruts采用Front Controller模式来实现动作处理,让所有的动作请求都是经过一个统一入口, 然后进行分发。这样方便我们在入口加入一些全局控制代码的实现,如安全控制、日志管理、国际化编码等。 
None.gif
None.gif通过Struts提供的ActionForm封装web form 中的元素,使重用web表单成为可能。 
None.gif
None.gif借助Struts Validator框架帮助完成web层的验证工作,通常情况下我们不用再去为每个web页面写其验证代码,只需通过配置即可实现。这也减少了我们的开发量,由于验证代码的集中管理,也为维护带来便利。 



业务层(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 );
    管理从业务逻辑到持久层的实现。

ContractedBlock.gif ExpandedBlockStart.gif 为什么使用Spring ?
None.gif利用延时注入思想组装代码,提高系统扩展性,灵活性,实现插件式编程。 
None.gif
None.gif利用AOP思想,集中处理业务逻辑,减少重复代码,构建优雅的解决方案。 
None.gif
None.gif利用其对Hibernate的SessionFactory、事务管理的封装,更简洁的应用Hibernate。 

ps.     Spring 的开发大部分情况下就是编写 XML 配置文件来组织各种各样的 Bean和切面。将程序个部分 软连接 起来,通过使用注释或者 XML 配置文件方式,程序运行的时候 Spring 能够“按需”创建或者初始化所有的对象关系。(不要要重新编译程序,鼓励使用模块化的架构来维护应用)
        ++1、动态注入 Bean的值,号称不用编程赋值,用 XML 文件可以解决一切赋值语句。



持久层 (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代替而不会修改在其它任何层的代码。

ContractedBlock.gif ExpandedBlockStart.gif 为什么使用Hibernate ?
None.gif1、减轻了编写Sql语句工作量
None.gif例 
4.1. 传统的数据库访问代码
None.gifinsert into table (field_1,field_2,field_n) values(
'"+ field_value1 +"','" + field_value2 + "','" + field_value3 + "'"
None.gif

None.gif例 
4.2. 借助Hibernate后数据库访问代码
None.gifsession.save(table_Object) 
None.gif
None.gif由代码比较可以看出,数据表可以跟对象一样被操作,这样代码显得更加简洁,可读性也增强。在实际开发中,这里是业务变动频繁的地方,保证代码的可读性和易维护,很有价值。 
None.gif
None.gif
2、Hibernate封装了数据库访问、事务管理、数据缓存等工作。省去了自己去编写这些代码。 
None.gif
None.gif
3、将数据表数据映射到对象中,以对象作为传输媒介,能更好的在系统各层传输数据。 



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

转载于:https://www.cnblogs.com/kiant71/archive/2008/09/04/1752078.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值