六、CoursesOnline的具体实现
6.1 在Jbuilder 9中新建一个工程
启动Jbuilder 9,File->New Project,项目名为CoursesOnline,选择路径后,点击finish

因为CoursesOnline项目使用Oracle 9i数据库,所以还需要把Oracle的驱动加载进来,Project -> Project Properties -> Path -> Required libraries,点击add,在Select One Or More Libraries窗口中选择OracleJDBCLib

OracleJDBCLib的配置请参考附录A.5.3 配置数据库驱动
6.2 创建Entity Bean(CMP)
6.2.1 新建一个EJB Module
File -> New -> Enterprise ->EJB Module

点击ok,并在接下来的窗口中为EJB Module命名为Courses,结果如下图

6.2.2 Import Schema From Database
在上图中的DataSources上点击右键,或者在Courses设计面板上点击右键,然后点击Import Schema From Database,在弹出的窗口中输入Driver,URL等参数,如下图所示

点击ok,这时数据库中的5个表在DataSources面板中显示出来,如下图所示

6.2.3 创建Entity Bean
在上图中DataSources面板中右键Actor,在弹出菜单中选择Create CMP 2.0 Entity Bean,结果如下图

左键点击Entity Bean Actor可以在弹出的窗口中编辑它的属性,在这里我们暂时使用默认值。接下来用同样的方法为其它四个表创建CMP 2.0 Entity Bean,结果如下图

从左边的Project下拉菜单中可以看到,每个Entity Bean都有三个(或四个)Java程序与之相对应,例如Actor.java、ActorBean.java和ActorHome.java。为了便于管理,以及避免和后面的程序胡搅蛮缠搞得眼睛高度紧张,我把Entity Bean对应的java程序都放在com.chenxc.coursesOnline.ejb20下。点击Entity Bean的名称,在Bean Properties窗口中点击Classes And Packages…按钮,然后为每个类指定路径。
6.2.4 阶段总结
这一节中创建了五个CMP 2.0 Entity Bean,是CMP而不是BMP,是2.0而不是1.x,是local接口而不是remote接口,而且还没有动手写过任何代码。本文并不打算深入探讨EJB的内部机制,而仅仅是举例子来说明使用EJB实现分层思想及分布式计算的方法。如果要研究EJB的细节,请参考附录B 参考资料列举的书籍或文章。
当前阶段的五个Entity Bean只能算是半成品,要完成业务逻辑还需要进一步加工,这些在接下来开发Session Bean的过程中会提到。欲知后事如何,请听下回分解。
6.3 创建Session Bean(Stateless)
6.3.1 SessionFacade - 连接Struts与Entity Bean的桥梁
新建一个名为SessionFacade的Session Bean。SessionFacade负责与Entity Bean沟通,并为Struts提供接口。
这个Session Bean扮演一个中间人的角色,就像是北京西客站的售票厅,旅客可以买T97的火车票去往广州,也可以买T31的火车票去往上海。在CoursesOnline系统中,Struts跟购买火车票的旅客一样,通过SessionFacade提供的接口完成系统登录、学生注册、学生选课等操作。
下面以Actor登录为例来说明SessionFacade是怎样扮演中间人的角色,如下图:

在SessionFacade中新增一个名为actorLogin的方法,返回值boolean,输入参数用户名,口令和用户类型(学生、老师或系统管理员),接口remote。
方法actorLogin提供给远程的Struts调用。 登录处理流程如下:
1、用户在页面上输入用户名、口令和用户类型并提交;
2、JavaBean存储用户在页面提交上来的用户名、口令和用户类型;
3、Struts读取JavaBean的用户名、口令和用户类型;
4、Struts通过远程接口调用SessionFacade的actorLogin(String username,String Password,int actortype)方法;
5、SessionFacade通过本地接口调用Entity Bean(Actor)的findByName(String username,int actortype)方法;
6、SessionFacade获取Entity Bean(Actor)的findByName(String username,int actortype)方法的返回值;
7、SessionFacade在actorLogin(String username,String Password,int actortype)方法中比较Entity Bean(Actor)的findByName(String username,int actortype)得到的password的值;
8、如果两个password的值相等,则actorLogin(String username,String Password,int actortype)返回true,否则返回false;
9、Struts根据SessionFacade的actorLogin(String username,String Password,int actortype)的返回值(true or false)判断登录是否成功,并导航到对应的页面。
|
|