泥巴麒麟的BLOG

shenAwesome@hotmail.com 纵不能,将醉做生涯,休拘束

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  195 Posts :: 2 Stories :: 80 Comments :: 0 Trackbacks

目前情况

       自动工单管理系统,使用自开发的类似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中代码判断。

posted on 2005-05-30 12:57 泥巴麒麟 阅读(4942) 评论(20)  编辑  收藏

Feedback

# re: 项目小结(hibernate + spring + webwork) 2005-06-03 13:55 Emma
真高深啊,看不懂,做崇拜状!  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2005-06-03 13:55 Emma
真高深啊,看不懂,做崇拜状!  回复  更多评论
  

# 真是曲高和寡亚 2005-06-06 13:12 泥巴麒麟
哎呀呀  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-03-03 09:39 hathor
很不错的!  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-06-21 10:19 nqna
采用 webwork2.2.2 , 加上 freemarker 应该好些。  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-08-08 09:46 kavon2006
请问如何进行action的单元测试呢?  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-10-26 15:03 outuo2
Spring到webwork使用autoware的拦截机制自动装配,可以简单的解释下吗  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-11-24 14:30 leifeng
hehe  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2006-12-11 11:32 泥巴麒麟
这篇文章是一年半前写的,里面提到的拦截方式,现在很可能有更好的解决方案,加上自己最近也没有在搞spring和webwork,所以不敢误导别人。那个自动装配的方案本身也很简单,记得有人做好了类,google一下就好  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-02-09 15:04 兔子超人
displaytag那个东西是垃圾,数据量大一点就麻烦了,首先displaytag设计上就没有想到为30000条记录以上的考虑过,查询出来的集合全部都放在list里面,这样有再多的内存都会溢出。

还有我觉得你设计上还是遗憾,没有看见你是如何运用webwork模型驱动来设计的。
这样说是因为没有看出你使用webwork以后和之前使用struts的最大区别!!

而且拦截器的在的右边说明上也是不很明显的能看出来。切点在什么地方都没有看到?!  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-02-09 15:15 兔子超人
我又看了一边,您说:“感觉用jdbc实现dao效率非常低”,请问jdbc效率地在了什么地方??如果说jdbc效率地,那么hibernate的效率就更低了,hibernate实现的基础不可能脱离原始的jdbc。

你应该清楚的认识到hibernate只是在设计上引导了你,让我们认识到模型和模式,hibernate只是让我们少些了很多代码,而不是说采用了hibernate就能提高效率,希望您不要悟到大家。

技术上本质的东西是不会变化多少的,技术也没有高低之分,不存在hibernate和jdbc谁好谁坏,只有使用者的强弱之别而已。

  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-02-26 16:10 泥巴麒麟
感谢这么久前的东西还有人评论!

首先关于displaytag.我认为并不能说设计失误而是设计如此,所以使用非常简单,而且不用为分页的东西而穿透逻辑层,在列表不大的时候,和hibernate配合,代码非常自然简练。而且排序无需依赖Sql字段。但也因此有他的性能问题。一个东西肯定是有缺点和优点的,找到符合自己需要的就可以。当时我也测试了数据量,并定死最多选择10000条,再多的分页基本上用户是没可能看的。

关于webwork,坦率说我对基于web的mvc设计并不是很感兴趣,怎么简单怎么好。所以webwork比struts好就好在简单。而且也很久没用webwork了。你所说的模型驱动如果我没记错,指的是直接在action里面直接使用pojo作为一个field来传递数据,印象中这个也没什么特别好说的,无非是jsp里格式写正确了就好。如果要我起名字,我宁愿把这个叫做自动装配,无非是把页面的数据自动装到pojo里传走,省得大家写的累。我写javaBean+jsp的年代就用反射写过类似的东西,个人认为不是什么大不了的设计思想。spring才是有设计思想的。

拦截器实在记不大清,参考别人做法而已,应该是在webwork的配置文件里做的。

"经过实写代码,感觉用jdbc实现dao效率非常低,而且容易出错",
这句话我的意思是当时我在考虑到DAO层次的实现上,和spring结合,我可以采用jdbc直接实现,也可以采用hibernate实现,自己试写,比较之后认为jdbc开发效率低,写好了之后再写测试,把我累得不行。当时我们的人手太紧,项目日程上不允许你慢慢来。用hibernate我就基本放心,单元测试就做得比较弱了。

我说是效率而不是性能,这句话不至于让人有误解吧。我觉得能看到这里的朋友都是有一定基础的。就好象说用c开发比用汇编快。你非要说快在那里?汇编最快了,这就抬杠了。








  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork)[未登录] 2007-05-08 11:32 YANG
个人觉得框架这种东西.只是给我们带来效率.

要从性能上讲还是能从底层的实现那才是最好.达到最佳.

JDBC是最基本的吧.但性能可是最佳.
框架用了好几层.在性能上大大降低.但是效率可是大大的提高.

所以有得必有失.这是没有办法的办法....  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-05-14 23:35 辛酸果冻
我也在研究但是还有很多地方搞不懂,唉,不知楼主能否让我看看您的原程序啊,谢谢
zhoudaqingidea@gmail.com  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-06-14 15:31 王娟
搂住,我也想看看源程序,谢谢。我的邮箱:
juju_good@163.com  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork)[未登录] 2007-06-28 10:18 青颖
楼主, 我想看看源码。 能不能发给我研究一下 谢谢
发部分代码也可以 daitiejian@163.com  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-07-02 12:00 泥巴麒麟
源码是公司产品了。而且这个文章是2年前做的了,那源码对现在来说也没太多价值。  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2007-10-07 11:56 qixoo.com 企讯网--5000万企业速查|求职参考|企业点评|企业从业者与企业的桥梁
企讯网创立于2005年10月,创办之初,受到了众多企业从业者的鼎立支持。但在创办网站的过程中我们也经历了重重磨难,并且因为某些原因,网站曾于2007年1月到6月期间停办。直到2007年7月,企讯网重新开办,并且拥有新域名www.qixoo.com 与 www.qixoo.net 。

企讯网是一个沟通平台。我们建立本站的初衷是为了建立企业从业者与企业的桥梁,使得员工能与企业更好的沟通,我们希望员工能在此平台为企业提出一些好的发展建议,同时企业也能倾听员工的声音,为员工创造一个更好的环境。

企讯网是一个参考平台。通过本站,可以帮助企业人员在求职过程中能有一个参考,并且查询相关的企业信息,以便企业人员能找到符合自身发展的企业。当然,本站的参考信息都是由网友添加,我们不可能验证每一条信息的可靠性,对于部分企业的评价,也许会比较片面和失实。大家在求职过程中,还是应以实际出发,毕竟这里只代表部分声音。

企讯网是一个监督平台。诚然,作为一个普普通通的网站并没有资格与权利去监督一个企业的行为。但作为一个网络媒体,虽然还是那么的微小,但我们希望能通过网络的声音能改变一些企业不恰当的做法,哪怕只是一点点。我们期望能有一个良好的企业大环境,以利于我们国家企业业的发展。




  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2012-03-28 18:57 泥巴麒麟
那么多年前的东西,看起来实在感慨  回复  更多评论
  

# re: 项目小结(hibernate + spring + webwork) 2014-01-13 12:39 邱惠平
很好啊,  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问