解决J2EE下的web项目的架构问题的方法
解决J2EE下的web项目的架构问题的方法
做J2EE已经有一段比较长的日子了,项目也做了好几个,可对于究竟什么才算是一个比较标准的J2EE的实施方案了,又或是对于一个已经有具体需求的项目我们如何将实际需求转化成程序方案了,这是一个需要思考和总结的问题!
现在的web项目我们通常分为三层(也有多层的),表现层,业务逻辑层和持久层,过去刚开始的时候我曾错误的把MVC理解对应上面的三层,以为使用了诸如Struts,webwork2之类的框架来做项目就是实行了三层的解决方案,其实这是错误的,MVC的设计模式与我们所说的三层架构是两个层次的东西,或者可以说不是相对应异或是有某种必然的联系的,(当然有些论坛上曾讨论过MVC仅仅是对表现层的一种理解,但我只是听说过有这种说法,相关的帖子没有具体看到,所以没办法思考他们所说的理由,但我觉得对于MVC,其Modul,Controller如何来对应我们所说的业务逻辑层和持久层了,并没有很准确的对应,所以我说两者似乎是不同层次,而且从历史来看,MVC80年代就有了,而那时恐怕web项目还没怎么起步把;那么还有的说象Struts,webwork2它们是属于web框架,我觉得这也不是很明确,比如什么叫web框架,是web项目吗?那要这么说j2ee本来就是用来开发web项目的,如果你要说它也可以用在分布式结构中,也可以用来做中间件,那我要说的是后者是不是也要通过网络来使用,那从这个层次来说,它们是不是也是web项目的一部分了,所以本身来说web项目就不是个好定义的词,所以web框架就更来有个定语了)。但对于Struts,webwork2之流的框架,Spring则不然,它要复杂一些,它是一个轻量级的J2EE框架(这也是一部分人的说法,轻量是指不使用EJB),包含了三层体系的实现方式。当然Sun对于这三层体系的实现有它自己的技术,表现层是jsp/servlet,业务逻辑层是session bean,持久层是实体bean。
在这里我仅尝试对轻量级的解决方案进行一些总结,对于EJB我并不太熟,仅仅使用过session bean,对于实体bean,消息bean都没有用过。
说总结从什么地方入手了,先从三层解决方案的表现层说起把,那么首推jsp,当然通过servlet也能往客户端浏览器写东西,但全在字符串中写起来不方便(象asp一样),说到要注意的地方就是jsp中尽量少有java代码,即在jsp中不要添加过多的业务逻辑代码,现在在表现层除了jsp,还有不少不错的开源项目,象freemarker,velocity,Tapestry,我觉得它们主要从两个方面来改善表现层的开发,一个是让页面的组件能够最大限度的重复使用,(象比较新的webflow,页面流,spring也有它的webflow,我想它也是为了更大程度的复用资源,毕竟画出一个好的页面,美工的活还是挺难的呀,身有感触,哈哈!)一个是更好的使表现层更专注与自己的范畴,不要含有过多的业务逻辑。Sun对于jsp也在不断的出些新的内容,象jsp2.0中的EL,我觉得使用起来就比较方便,当然JSTL这一套标签库也因该好好了解和使用。(前段时间玩了玩Tapestry,感觉确实和普通的页面开发不太一样,刚开始感觉挺怪的,还要再看看,学习的资料也不是太多!)
对于业务逻辑层来说,没有什么框架性的东西,实际上就是用java来写,象session bean之类的,实际上其逻辑性的东西就是java类,不过象写servlet,session bean这些逻辑部分时,它们还是跟具体的容器关联上了,虽然写起来可能更容器些,但另一方面要对业务逻辑部分进行测试就要比较麻烦了,因为要测试,你就必须要启动容器,而且复用起来也要困难些(我是指跨项目的复用)。在业务逻辑层还有个很显你功力的地方,就是这些java的方法,类中你的设计模式使用的如何,程序效率的高低和对异常的处理,这些都不是一两天能提升的,需要长时间的积累和学习。
对于持久层,解决方案就不少了,因为它是一个很重要的部分。从Sun官方的实体bean(以前一直是为人所诟病的,但ejb3.0改了很多,还没玩过,只是道听途说),到开源项目Hibernate(一站式的解决方案),iBatis(半站式,实际上就是可以在配置文件中写sql语句)等等,还有些其它的解决。在对持久层进行操作时有个比较长用的设计模式DAO模式,用它来对传过来的PO(或DTO)调用相应的操作方法进行持久化,似乎觉得它有点象个Facade的了。
在web项目开发的三层解决方案中,有个问题就是在这三层中数据应该如何传输,很多人觉得应该分开(其实就是进行不同的封装),比如在业务逻辑层中用VO来表示,而在持久层中用PO来表示,当然进行不同的封装,其好处就是当某一层的数据需求发生变化时,如果其它层没变,则其它层的代码也不用改变了,当然这些object的设计和粒度的把握也是需要下工夫的。
以上就是我的一些架购问题方面的思考,罗嗦了一些,但也仅仅是泛泛而谈,很多东西还是没太整明白,希望在以后的工作学习中能够进一步的理解深理解透吧!!