在Struts + Spring + Hibernate的组合框架模式中三者各自的特点都是什么?
Struts 的MVC设计模式可以使我们的逻辑变得很清晰
Spring 的IOC和AOP可以使我们的产品在最大限度上解藕
hibernate的当然就是实体对象的持久化了
典型的JEE三层结构分为表现层中间层(业务逻辑层)和数据服务层三层体系将业务规则数据访问及合法性校验等工作放在中间层处理客户端不直接与数据库交互而是通过组件与中间层建立连接再由中间层与数据库交互
表现层是传统的JSP技术自年问世以来经过多年的发展其广泛的应用和稳定的表现为其作为表现层技术打下了坚实的基础
中间层采用的是流行的Spring+Hibernate为了将控制层与业务逻辑层分离又细分为以下几种
Web层就是MVC模式里面的C(controller)负责控制业务逻辑层与表现层的交互调用业务逻辑层并将业务数据返回给表现层作组织表现该系统的MVC框架采用Struts
Service层(就是业务逻辑层)负责实现业务逻辑业务逻辑层以DAO层为基础通过对DAO组件的正面模式包装完成系统所要求的业务逻辑
DAO层负责与持久化对象交互该层封装了数据的增删查改的操作
PO持久化对象通过实体关系映射工具将关系型数据库的数据映射成对象很方便地实现以面向对象方式操作数据库该系统采用Hibernate作为ORM框架
Spring的作用贯穿了整个中间层将Web层Service层DAO层及PO无缝整合其数据服务层用来存放数据
一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力它可以被扩展以进行内部的定制化并且有强大的用户社区来支持它框架通常能很好的解决一个问题然而你的应用是分层的可能每一个层都需要各自的框架仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合
不可否认对于简单的应用采用ASP或者PHP的开发效率比采用JEE框架的开发效率要高甚至有人会觉得这种分层的结构比一般采用JSP + Servlet的系统开发效率还要低
笔者从一下几个角度来阐述这个问题
开发效率软件工程是个特殊的行业不同于传统的工业例如电器建筑及汽车等行业这些行业的产品一旦开发出来交付用户使用后将很少需要后续的维护但软件行业不同软件产品的后期运行维护是个巨大的工程单纯从前期开发时间上考虑其开发效率是不理智的也是不公平的众所周知对于传统的ASP和 PHP等脚本站点技术将整个站点的业务逻辑和表现逻辑都混杂在ASP或PHP页面里从而导致页面的可读性相当差可维护性非常低即使需要简单改变页面的按钮也不得不打开页面文件冒着破坏系统的风险但采用严格分层JEE架构则可完全避免这个问题对表现层的修改即使发生错误也绝对不会将错误扩展到业务逻辑层更不会影响持久层因此采用JEE分层架构即使前期的开发效率稍微低一点但也是值得的
需求的变更以笔者多年的开发经验来看很少有软件产品的需求从一开始就完全是固定的客户对软件需求是随着软件开发过程的深入不断明晰起来的因此常常遇到软件开发到一定程度时由于客户对软件需求发生了变化使得软件的实现不得不随之改变当软件实现需要改变时是否可以尽可能多地保留软件的部分尽可能少地改变软件的实现从而满足客户需求的变更?答案是采用优秀的解耦架构这种架构就是JEE的分层架构在优秀的分层架构里控制层依赖于业务逻辑层但绝不与任何具体的业务逻辑组件耦合只与接口耦合同样业务逻辑层依赖于DAO层也不会与任何具体的DAO组件耦合而是面向接口编程采用这种方式的软件实现即使软件的部分发生改变其他部分也尽可能不要改变
注意即使在传统的硬件行业也有大量的接口规范例如PCI接口显卡或者网卡只要其遵守PCI的规范就可以插入主板与主板通信至于这块卡内部的实现不是主板所关心的这也正是面向接口编程的好处假如需要提高电脑的性能需要更新显卡只要更换另一块PCI接口的显卡而不是将整台电脑抛弃如果一台电脑不是采用各种接口组合在一起而是做成整块那将意味着即使只需要更新网卡也要放弃整台电脑同样对于软件中的一个个组件当一个组件需要重构时尽量不会影响到其他组件实际上这是最理想的情况即使采用目前最优秀的架构也会有或多或少的影响这也是软件工程需要努力提高的地方
技术的更新系统重构软件行业的技术更新很快虽然软件行业的发展不快但小范围的技术更新特别快一旦由于客观环境的变化不得不更换技术时如何保证系统的改变最小呢?答案还是选择优秀的架构
在传统的Model 的程序结构中只要有一点小的需求发生改变将意味着放弃整个页面或者改写虽然前期的开发速度快除非可以保证以后永远不会改变应用的结构否则不要采用Model 的结构
采用Hibernate作为持久层技术的最大的好处在于可以完全以面向对象的方式进行系统分析系统设计
DAO模式需要为每个DAO组件编写DAO接口同时至少提供一个实现类根据不同需要可能有多个实现类用Spring容器代替DAO工厂
通常情况下引入接口就不可避免需要引入工厂来负责DAO组件的生成Spring实现了两种基本模式单态模式和工厂模式而使用Spring可以完全避免使用工厂模式因为Spring就是个功能非常强大的工厂因此完全可以让Spring充当DAO工厂
由Spring充当DAO工厂时无须程序员自己实现工厂模式只需要将DAO组件配置在Spring容器中由ApplicationContext负责管理DAO组件的创建即可借助于Spring提供的依赖注入其他组件甚至不用访问工厂一样可以直接使用DAO实例
优点
Struts跟TomcatTurbine等诸多Apache项目一样是开源软件这是它的一大优点使开发者能更深入的了解其内部实现机制
除此之外Struts的优点主要集中体现在两个方面Taglib和页面导航Taglib是Struts的标记库灵活动用能大大提高开发效率另外就目前国内的JSP开发者而言除了使用JSP自带的常用标记外很少开发自己的标记或许Struts是一个很好的起点
关于页面导航我认为那将是今后的一个发展方向事实上这样做使系统的脉络更加清晰通过一个配置文件即可把握整个系统各部分之间的联系这对于后期的维护有着莫大的好处尤其是当另一批开发者接手这个项目时这种优势体现得更加明显
缺点
Taglib是Struts的一大优势但对于初学者而言却需要一个持续学习的过程甚至还会打乱你网页编写的习惯但是当你习惯了它时你会觉得它真的很棒
Struts将MVC的Controller一分为三在获得结构更加清晰的同时也增加了系统的复杂度
Struts从产生到现在还不到半年但已逐步越来越多运用于商业软件虽然它现在还有不少缺点但它是一种非常优秀的JEE MVC实现方式如果你的系统准备采用JEE MVC架构那么不妨考虑一下Struts