petstore小节

petstore是MVC的应用,分为表示层、控制层和逻辑层。

在提供的sample(我用的是weblogic自带的例子)目录中有四个目录:apps,component,lib,waf。

apps:主要存放表示层的应用,里面有jsp,还有控制层的一些action和event.

components:存放逻辑层,里面包含了10多个EJB组件,每个EJB组件都可以在不同的服务器上运行,而且组件可以任意被替换。

lib:存放ant等工具。

waf:这是可服用的框架逻辑,基本不用修改,就像struts.jar一样的包,里面包括了测试jsp和抽象出的接口和类。


我认为应该首先从框架顺序图开始理解,了解petstore框架的大体结构,而后分别理解components。本身代码很容易看懂,基本上没有什么困难。

与struts的区别,思想很象,只是多加了ejb层,实现的很好,两个控制器,一个是象struts一样的webcontroller,另一个是ejbcontroller,中间用值对象传递,当然也会有两套facade,一套是web的,一套是ejb的。总之,为达到复用性,就要不停的增加层次结构。让这种结构成为标准,成为框架。

ejb放在何处很有规律性,何时用local何时用remote也是很有意思。何时用有状态session何时用无态。希望大家讨论讨论。

小妹妹你很强呀

对,ejb和web层之间是通过Event来触发的,是一个很典型的事件触发机制,值得借鉴。

WAF是一个很好的框架,结构清析。配置也比较简单。 但用做商用的例子听到不多。不像Structs使用那样广范,不知为什么?

Event 的设计是好的,但是不是自动生成 Event.而是交由程序员来做,这不合理。所以 Petstore.WAF 需要做进一步的改进。

efan1@etang.com

太感谢了~

写的很不错。
多谢了,学习ing

偶然看见这个帖子,不得不说一下了。

http://www.jdon.com/jive/thread.jsp?forum=16&thread=3843&message=397901&redirect=true&hilite=true&q=transaction

在petstore中只在一个地方使用了DAO模式,重要的是,这个模式不同于我们平常使用的DAO,这个DAO是只读的(只由get方法组成)。

在components目录下的catalog包中,sun唯一使用了DAO模式来弥补cmp在查询方面上的缺陷。目的:一,加快速度,提高性能;二,减少cmp在内存中的存储;三,可读性提高了。这三个方面也是cmp的缺点。

因此,在面对大量查询操作的时候,尤其是要组合sql语句的时候,推荐使用dao的只读模式。并且,这种操作对事务的要求很少。

dao普通模式(就是有insert/update等方法的模式)应该尽量被ejb的cmp替代。减少代码工作量,cmp的建立是非常简单的,尤其是数据库操作等方面,其将大量操作交给容器来做。

在dao只读的上层,是无状态sessionfacade。facade层次用来控制事务处理,逻辑等操作。catalog.ejb的包中的CatalogEJB类,就使用了这一层关系。

我一直找不到petstore中自己处理事务的好方法,不知道谁有好建议?

我的mail:chenchen@foundercy.com

2001.5 月,我刚到现在的公司的时候,开始写自己的 Framework(不要问我要这个东东,
因为已经在垃圾箱里了),我那时的思想是:一个视图(Petstore 中叫Screen)即负责显示,
又负责该视图中事件的处理。当一个视图需要转向另一个视图时,
它会向 ViewManager 发一个请求,然后转到相应的视图中。

我当时写的 Framework 主要是demo目的,为的是在 WEB 上实现基于TabPanel 这种视图的快速开发。
因为我们发现,这种视图对于管理软件来说是相当有用的,而且基于这种视图我们的东西能做到非常
快速的开发。

(闲话少说,还是说说事件处理)

在那个 Framework 里我遇到了几个问题,其中之一是当一个按钮按下时,我必须要能判断当前的窗体是谁,
然后调用该窗体的一个 callback 方法,如:execute(Command cmd){}
Command 是经过封装的对象,Command.getEventSource() 会得到按钮的名字.Command.getRequest()则会得到
当前请求的 HttpRequest 对象,然后我就能通过 Request 获取当前的请求信息。

如果你想了解更好的 Web-Based Event Framework, 请看看 Jato.如果你找不到源码,可以向我要
iceant@21cn.com. 可以说,我在JATO 中发现了很多和我当时设计思想很像的东西,所以我对 Jato 一直情有
独钟。

本人刚刚在研究框架,前一阵玩游戏,荒废了,哎

说实话我也不是很想用EJB的,不过CMP是很方便,各取所需吧,反正我还没学到那。

不过现在还没做完,所以只能空谈谈了。
我是从后面开始做的,平台就定位在jb8+oracle9i+weblogic上,因为这好象是大多数企业用的,虽然JBOSS非常好,不过好象不花钱的东西企业也不用,呵呵,不知大家有没有体会。

先做了个单态的连接池,我的想法每次都去容器里取性能上应该会有影响吧。然后就是做DAO,我真的是把CRUD都做这里了,以后试着按BANQ的改改。这里我参照的是J2EE CORE PATTERN做的抽象工厂,感觉如果数据库变化不大,用工厂就可以了。

然后做前面的BO,在这里我遇到了很多问题。
1。事务是不是应该在这层调用,因为我没有用EJB,所以应该自己写事务吧?
带着这个思想我尝试自己写事务类,原来我也打算从UserTransaction实现。可我发现他里面很多的东西,我不一定能用到的,用不到那么麻烦,所以自己写了个事务类,我也用的单态串行化,因为可能会出现所说的事务A里有事务B。
2。我前面是不是应该有个facade呢,我用的是struts,那action本身不就是么?
看了些资料,并在和别人讨论一番后,否定了这个想法,Action只是前端控制器,后面一定要有facade,但不是BO,因为BO就是处理后台事务的。试想将容器放到另一台机器上,那client和server通信是一个类似线程的过程,所以应该是前后都有控制器的,这个控制器就是delegate,可参看J2EE CORE PATTERN的业务代理。它是一个后面的总控程序,我想前面有几个Action这里就应该有几个总控,但你不要认为CRUD是四个ACTION,这里可以按照struts里的module思想做。
3。测试如何做?
我发现在JB里会出现我改第5步,导致第2步都出错的情况,这才想到进行测试,JUNIT首选。不过这简单的东西至今还很头疼,呵呵,现在在看源码和这期程序员,如果谁不懂也建议这样看,;)还有banq的文章呢

对了,该说事务放到哪了。

无论是DAO还是JDO(不太懂)或EJB,都应该是在最后实现是才获得真正的连接,但事务的开始是在前面获得连接,然后一直把事务和连接传递到后面的。--不知这大家都怎么理解的

所以事务类写到delegate里,而连接是在事务开始前就获得的,所以放到事务构造器中是可行的。开始后进行一定的操作,此操作通过定位器(这也可以就是JNDI吧,我还没太通,我刚到delegate,不过想自己做个JNDI树)查找BO中相应方法,这个方法类似remote interface。最后连接到DAO进行真正的操作。

我做这个有俩个意图:
1。想把扔了这么久的东西捡一下,在深化的同时也不断了解最近都有什么新东西值得学习。
2。不一定每个公司或每个项目都要用到EJB的,即使它非常简单。所以做出象板桥一样的框架程序,应用struts带和不带EJB的俩个框架。

最近学习的心得就是,模式无处不在,只不过你不认识它。还有就是,对接口编程,这总算有深刻体会,虽然它说的不能在明白了。

我这里的接口也包括抽象类,可别问我啥时候用抽象类啥时候用接口啊,我也不懂,不过感觉该用什么就用什么 ;) 废话

看懂是没有什么问题, 但不知道在实际中那些是比较有用的?

The petstore framework is a great asset, even some small coding tricks are very helpful too, when we discuss the design, always refer to petstore architect, I have a group for that topic too at

http://groups.yahoo.com/group/Chinese_Java_club/

bill