项目小结(hibernate + spring + webwork)

 

目前情况

       自动工单管理系统,使用自开发的类似struts的架构,数据库访问经过包装,返回string数组。 其架构问题:

Action使用同步锁,导致在同一时间只能进行一次web访问,如同时有其他访问,将不必要的被阻塞。

结构不够清晰,不能够完全按mvc的思想明确的分离各层逻辑。jsp代码过多且结构零乱,没有把通用的代码用taglib等技术抽象,后续开发困难

业务逻辑和数据库紧密相关,而没有从表实现中抽象出来。同时,在每次使用同样的业务逻辑的时候都要反复的进行相关sql编程。故而与数据库有强耦合,相关程序重用性低,可读性差。其翻页机制逻辑横贯架构,使层次高度耦合,而数据库封装也可能存在性能问题。

同时,客户也提出了不少整改意见,而在原版本的修改和升级都会较为困难,而且对长期的维护不利。

项目分析:

       目前的各种业务管理系统还是将以j2eeb/s架构为主流,所以有必要完成一个通用的,稳固的整体架构作为以后各种应用的坚实基础。

我认为应尽可能使用业内先进的免费框架技术而不是自开发框架。好处是:

这些框架技术凝聚很多业内精英的智慧,而且经过发布和使用,技术体系已经成熟,性能有所保障。

层次清晰,符合先进的技术理念和设计模式。同时也容易找到熟悉相关技术的人才,维护和后续开发方便。

相比之下自开发框架因为技术实力和时间问题,很难达到这些业内领先框架的技术高度。

   分析一般的j2ee应用,应有如下层次:

显示层 负责界面显示,接受用户指令

显示层有较为经典的MVC,即model,view,control,进一步了细化了显示层的工作。此类著名框架有strutswebwork,spring-mvc等。经考察,我认为struts虽然是时间最长最成熟的技术,但易用性和一些架构理念不如webwork,而view层的开发应尽可能简单快速。故选定用webwork.

 

逻辑层 负责进行业务逻辑的实现

目前的开发过程,往往陷入逻辑层和数据访问层不能分离的情况。面向对象的项目开发最后演变成成程序员在程序各处手工写sql操表。这样做的优点是开发迅速有效,问题是结构将日益混乱,每次逻辑的变化将不得不修改分散于各处的sql语句,而后续的程序员也必须了解整个程序和数据库结构才能进行修改。如果是短期小型项目,可以用这种方式。否则的话,我认为应尽可能贯彻面向对象思想,把业务逻辑抽象出来。

而逻辑层的工作就是针对实体对象进行业务逻辑的实现。我们针对所有的业务操作,对外提供service接口,既服务接口。这类似tuxedoejb所采用的业务外观模式。而为填补service生存周期管理的空白,我们使用著名的spring框架。优点:

实现Ioc,使各层次的耦合可配置化。

按需要实现单例模式等,进行生存周期管理

事务管理。Spring的宣言事务管理(Declarative transaction management)使得一般场景的代码中将不需要考虑事务问题而集中于业务逻辑

拦截机制将为程序提供很好的扩展空间

 

    3.  数据访问层 负责将类操作映射为数据库操作。进行实体类的持久化。从而将所有的数据访问工作集中起来

           这一层我们将完成实体类持久化(persistence),有若干选择:

                     1 jdbc实现

                     2 使用ORM工具 hibernate,ibatis,jdo

经过实写代码,感觉用jdbc实现dao效率非常低,而且容易出错。经过考量选用hibernate。和ibatis相比虽然上手慢且不够灵活,但其架构思想和强大功能都受到业内一致好评,甚至是ejb3也深受hibernate影响 。所以hibernate是很好的选择。

项目设计

              综上,我们使用 webwork+spring+hibernate的架构。

版本:webwork- 2.1.7   spring1.2   hibernate-3.0.3

 

经过一段时间的开发,目前架构基本成形:

      

o_image002.jpg

       src目录下为java源码

dao    负责数据访问对象的定义和实现

 其中Dao结尾为接口,Impl结尾为实现。目前一般用hibernate做实现。
domain 实体对象

logic   针对实体对象封装的逻辑

 这里service是外观接口,serviceimpl是实现,考虑目前情况简单,并没有进一步分离逻辑,业务逻辑都在impl中完成。

web    界面相关的java

 common是一些常用类,如处理中文问题的filter.

 displaytag中放了displaytag相关的类,多为wrapper.

 webwork中都是对应的action

其中 BaseAction是基本的抽象类,基本后续开发应继承此类

CrudAction是为了一般的Crud工作而作的一个抽象类,可以继承用来简化工作。

CaseDispatcher负责菜单点击后分发到相关Action,同时处理权限和session工作。
 
其他action按模块进行了组织

o_image004.jpg

左边是webroot的结构

 

 

重要的配置文件有:

Spring

applicationContext.xml

applicationContext-db.xml

Webwork

xwork.xml

webwork.properties

i18n

 labels.properties

log4j

 log4j.properties

displaytag

 displaytag.properties

dbConnect

 jdbc.properties

 

关于一些技术难点和细节:

1.  各框架连接:springhibernate使用springhibernate支持。Springwebwork使用autoware的拦截机制自动装配。

2.  列表的问题,采用displaytag。功能强大,使用简洁,可实现排序和数据导出。

3.  数据下载,使用displaytag自带的excel下载

4.  文件上传,使用webwork提供的解决方案,用拦截机制实现。

5.jsp代码组织方面,我们使用taglibcss技术使jsp中页面逻辑减少到最小,一般情况完全可以不使用<% %>script 。同时我们使用两个include来包含常用的taglib定义,js引用和html结构,使jsp代码非常简洁。

6.  中文问题 我们使用filter来解决页面gbkjava程序unicode的转换,同时通过正确的设置数据库连接url完成和数据库之间的交互。

7.  I18n国际化。我们要求在jsp代码中不出现中文,所有提示信息都通过资源文件labels.properties来完成。页面中可以使用jstlwebwork标签来调用。

8.  界面验证问题。使用webworkvalidate机制用xml定义,或在action中代码判断。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值