实验四基于WAS和RAD的EJB应用开发.docx
《实验四基于WAS和RAD的EJB应用开发.docx》由会员分享,可在线阅读,更多相关《实验四基于WAS和RAD的EJB应用开发.docx(29页珍藏版)》请在冰豆网上搜索。
![实验四基于WAS和RAD的EJB应用开发.docx](https://file1.bdocx.com/fileroot1/2022-12/17/643989e6-7858-4df0-bea6-f6a2a7913607/643989e6-7858-4df0-bea6-f6a2a79136071.gif)
实验四基于WAS和RAD的EJB应用开发
实验四基于WAS和RAD的EJB应用开发
实验目的:
掌握使用WAS和RAD进行EJB开发
目标要求:
1.掌握运用WAS和RAD开发EJB
实验说明:
第一节建立EJB项目
在RAD的“项目资源管理器”中,选中“EJB项目”然后右键点击“新建”—〉“EJB项目”,如下图所示。
此时会出现“新建EJB项目”对话框。
在“名称”中填入“HotelEJB”,“项目位置”一栏默认即可。
点开“隐藏高级”选项,确认“EJB版本”是“2.1”,选中“将模块添加到EAR项目”复选框,然后在“EAR项目”中选中“HotelEnterpriseApplication”,点击“完成”,具体见下图。
在“项目资源管理器”中,我们会看到如下的EJB项目目录结构。
第二节建立会话Bean
接下来,我们要建立第一个会话Bean,该会话Bean是一个无状态的会话Bean,它将完成注册成功的用户查询自己的注册资料的功能。
在这里说明一下关于无状态会话Bean和有状态会话Bean的区别。
所谓有无状态指的是服务器的EJB容器是否保存该会话Bean的状态,例如:
如果是无状态会话Bean,容器并不保存该会话Bean的状态,也就是说,容器只需要维护该会话Bean的一个实例即可,每个需要调用该会话Bean的请求都使用该Bean的同一实例。
而有状态会话Bean的状态由容器管理,但是它的生命周期也就仅仅是请求期,当请求结束时,该有状态会话Bean的生命周期也随之结束,也就是说,每个求情对应一个有状态会话Bean的实例,这就是由状态会话Bean和无状态会话Bean的本质区别。
通过上面的分析,我们看到,在这里只需要建立无状态会话Bean就可以满足我们的需要。
在“EJB项目”—〉“HotelEJB”—〉“部署描述符”—〉“会话Bean”上,右键选择“新建”—〉“会话Bean”,见下图。
在随之出现的“创建企业Bean”对话框中,确定“会话Bean”但选框被选中,“EJB项目”一栏中是“HotelEJB”,“Bean名”一栏填写“Getguest”,“源文件夹”一栏是“ejbModule”,而“缺省包”一栏改为“tju.ibm.hotel.ejbs”,具体见下图。
点击“下一步”,进入“详细信息”对话框。
在该对话框中,确保“会话类型”一栏是“Stateless”,当然,如果要创建有状态会话Bean就选“Stateful”,“事物类型”一栏是“Container”,“远程客户机视图”复选框被选中。
同时观察一下要生成的Bean的结构,具体的参看下图的结构。
点击完成,我们可以看到该会话Bean的类图出现在“default.dnx”视图中,保存该文件,然后关闭它。
该视图可以呈现EJB类于接口之间的关系,例如:
将刚刚生成的Home接口和Remote接口拖入该视图中,我们将会看此三者的关系,具体的请见下图。
同时,我们在“项目资源管理器”中看到刚刚生成好的会话Bean的结构,如下图。
下面的工作是修改已经生成的会话Bean,首先我们用该Bean来调用在前些章节中编写好的数据库管理程序来进行和数据库的联系。
我们双击“HotelEJB”—〉“部署描述符”,在打开的编辑区中选中“引用”,然后点击“Getguest”,并点击下面的“添加”,出现“添加引用”对话框,见下图所示。
选择“资源引用”,然后点击“下一步”,此处是添加数据库引用。
在出现的“添加资源引用”对话框中,“名称”一栏填写“jdbc/hotel2”,“类型”一栏选择最后一项的“javax.sql.DataSource”,认证一栏选择“Application”,“共享作用域”一栏选择“Shareable”,然后点击“完成”。
见下图。
此时在“WebSphere绑定”—〉“JNDI名称”一栏中填写“jdbc/hotelDev”。
同时注意,此时不要在“WebSphere扩展”—〉“隔离级别”中选择任何选项。
如下图所示。
关闭“EJB部署描述符”,并在“HotelEJB”-〉“ejbModule”中添加包“tju.ibm.hotel.databases”,并在该包中添加接口“GuestDatastore”和“BuildConnection”,以及类“DatastoreFactory”、“GuestDatastoreJDBC”、“DataSourceConnection”、“ConnectionFactory”和“Guest”,代码见具体的接口和类,这里不再赘述。
但是要注意的是在类“DatastoreFactory”中,“lookupName”的值要和刚刚添加的数据源资源的名称一致,即为“java:
comp/env/jdbc/hotel2”,具体见下图。
此时要修改会话Bean的Bean代码。
双击“HotelEJB”—〉“部署描述符”—〉“会话Bean”—〉“Getguest”—〉“GetguestBean”文件,在编辑区中出现“GetguestBean.java”文件。
添加方法“publicGuestgetGuestInfo(Stringguest_id,Stringpassword)”,并在此方法中添加如下代码,见下图。
保存修改后,在右边的“大纲”视窗中选中“GetguestBean”—〉“getGuestInfo”,并点击右键,选中“企业Bean”—〉“提升至远程接口”。
见下图。
此时会在“大纲”视窗中选中“GetguestBean”—〉“getGuestInfo”上出现一个“R”,它代表着该方法已经成为了远程接口方法了,这样,当请求得到会话Bean的实例后就可以调用该方法了,同时在远程接口类“Getguest”中会看到该接口,见下图所示。
接下来我们要做的是生成Bean代码并进行服务器的部署,右键点击“HotelEJB”—〉“部署描述符”—〉“会话Bean”—〉“Getguest”,选择“部署”,见下图。
然后我们就可以验证该会话Bean了,首先使用“通用客户测试机”。
仍然右键点击“HotelEJB”—〉“部署描述符”—〉“会话Bean”—〉“Getguest”,选择“运行”—〉“在服务器上运行”。
见下图。
此时,WebSphere应用服务器会启动,等待一段时间后,会在“服务器”一栏处看到“已启动”,并且在编辑区出现“测试客户机”,如下图所示。
点击“EJBBean”—〉“Getguest”—〉“GetguestHome”,我们看到“create”方法,点击它,在右边的“参数”区域里出现“调用”,点击它,在下面的“结果来自”一栏中出现“Getguest”对象,并且下面有“处理对象”的按钮,如下图所示。
点击“处理对象”,在左边的“JNDI资源管理器”一栏下面看到出现一个新的对象“Getguest1”,展开它,我们得到了“getGuestInfo”方法。
点击它,在右面的“参数”区域里的“值”一栏中分别填入“ivan”和“ivan”,点击“调用”,见下图。
此时得到“Guest”对象,同样点击“处理对象”按钮,在左边的“对象”区域里出现它的对象,见下图。
展开“Guest”对象,选择“getEmail”方法,然后在右边的“参数”区域中点击“调用”,我们会得到chaoxu@的结果,这就说明我们的会话Bean创建成功了,见下图所示的结果。
在上面我们用“通用客户机”测试了会话Bean,在成功返回正确结果的基础上,我们就可以创建Web客户端了,下面我们要创建调用该会话Bean的Web客户端。
在这之前先关闭“通用客户机端”和应用服务器。
第一步是添加一个登陆的jsp页面,右键点击“动态Web项目”—〉“HotelWeb”—〉“WebContent”—〉“新建”—〉“JSP文件”,出现“新建JSP文件”对话框。
见下图。
在“文件夹”一栏中应该是默认的“/HotelWeb/WebContent”,在“文件名”一栏中填入“ListGuestInfo”,同时确保“模型”一栏中为“无”,应为我们这里不是用Struts框架,然后点击“完成”,见下图。
在编辑区中出现“ListGuestInfo.jsp”文件,编辑该JSP文件,代码见附件的文件,具体的页面形式如下图所示。
该JSP的动作响应为“/Hotel/GuestInfo”的Servlet,见下图。
于是我们接下来要创建一个Servlet,它的URL映射为“/Hotel/GuestInfo”。
关闭“ListGuestInfo.jsp”文件。
右键点击“动态Web项目”—〉“HotelWeb”—〉“部署描述符”—〉“servlet”,选择“新建”—〉“servlet”,如下图所示,出现“创建Servlet”对话框。
在出现的“创建Servlet”对话框中的“名称”一栏填写“GuestInfo”,此时在“URL映射”一栏中会出现“/GuestInfo”,点击“下一步”,确定“文件夹”一栏是“\HotelWeb\JavaSource”,点击“Java包”一栏右侧的“浏览”,选择“tju.ibm.hotel.servlet”,点击“下一步”,选上“doGet”和“doPost”复选框。
点击“完成”,生成该Servlet。
见下图所示。
在生成的“GuestInfo.java”文件中,修改“doGet”和“doPost”方法的代码,在这之前需要将HotelEJB中的Getguest会话Bean做一个Web的本地映射,然后在“GuestInfo”此servlet中即可获得该Bean的实例。
下面,我们先创建Getguest会话Bean的本地映射。
双击“动态Web项目”—〉“HotelWeb”—〉“部署描述符”,在编辑区中会出现“Web部署描述符”,选择“引用”,点击左边的“添加”,出现“添加引用”对话框,选择第一项“EJB引用”,点击“下一步”,见下图。
在“为WebEJB引用添加字符串”对话框中的“名称”一栏中填写“ejb/Getguest”,“引用类型”选择“本地”,此时,在该对话框的面板上方会出现“如果EJB在相同的EAR中,则最好的方法是创建对EJB的本地引用。
”的信息,选上“工作空间中的企业Bean”,然后在下面选上“Getguest”,点击“完成”,见下图所示。
这样,我们的EJB引用就设置好了,现在可以修改“GuestInfo.java”的代码了,在“doGet”方法中添加如下代码可以得到“Getguest”会话Bean的远程接口,如下:
GetguestHomehome=(GetguestHome)
ServiceLocatorManager.getRemoteHome("ejb/Getguest",GetguestHome.class);
Getguestgetguest=null;
try
{
getguest=home.create();
}
catch(RemoteExceptione)
{
e.printStackTrace();
}
catch(CreateExceptione)
{
e.printStackTrace();
}
如果得到的远程接口getguest为空,则重定向到“ListGuestInfo.jsp”,代码如下:
req.setAttribute("message",newMessage("Loginfailed:
Thereisanerror.Pleasetrytologinlater."));
req.setAttribute("idcookie",guest_id);
context.getRequestDispatcher("/ListGuestInfo.jsp").forward(req,resp);
如果得到的远程接口不为空,则显示用户的信息,定向到“ListInfo.jsp”文件,代码如下:
HttpSessionsession=req.getSession();
session.setAttribute("guest",guest);
CookieidCookie=newCookie("idcookie",guest_id);
idCookie.setMaxAge(7*24*60*60);
resp.addCookie(idCookie);
req.setAttribute("message",newMessage(guest_id+"Loginsucceed,hereisyourinfomation!
"));
context.getRequestDispatcher("/ListInfo.jsp").forward(req,resp);
这里,我们还缺少一个“ListInfo.jsp”文件,该文件用来显示用户的信息,具体的创建方法和“ListGuestInfo.jsp”相同,具体的设计可以参见项目代码,这里给出该文件的设计概要,见下图所示。
接下来就可以测试我们的Web客户端了,右键点击“ListGuestInfo.jsp”,选择“运行”—〉“在服务器上运行”,出现“选择服务器”对话框,默认所有设置,点击“完成”,见下图所示。
等待一段时间,当服务器启动完毕后,会出现“Web浏览器”,在“Username”和“Password”一栏中分别填上“ivan”和“ivan”,点击“ok”按钮,见下图所示。
少许等待后,我们会看到返回的结果,说明我们的Web客户端创建成功,具体见下图所示。
关闭服务器和所有编辑区打开的内容,我们将进入下一环节,创建一个实体Bean。
第三节建立实体Bean
在上一节中我们已经通过RAD创建了一个无状态的会话Bean,同时我们也介绍了无状态会话Bean和有状态会话Bean的区别。
这一节中,我们将介绍如何使用RAD创建一个实体Bean,正如在本章前述节中介绍的,实体Bean分为容器管理持久化的CMP和Bean管理持久化的BMP,这里我们主要介绍CMP。
由于数据库已经设计完成,我们将使用“自底向上”的方法来创建和已有数据库中的表对应的CMP。
点击“EJB项目”—〉“HotelEJB”,选择“EJB至RDB映射”—〉“生成映射”,将出现“EJB至RDB映射”对话框,见下图所示。
在出现的“EJB至RDB映射”对话框中,由于此时并没有为该EJB项目添加任何的“后端文件夹”,我们并没有任何选择,只能选择“创建新的后端文件夹”,并点击“下一步”,具体的见下图所示。
同时,在下一个对话框中也没有任何选择,只有“自底向上”可以选择,这是因为上一步并没有创建“后端文件夹”,只能选择“自底向上”,我们看到,它的作用是“根据现有数据库模式生成企业Bean和映射”,也就是说,我们可以借助该更能实现从现有数据库的数据表映射生成所需要的CMP,点击“下一步”
在下一个对话框中,填写“连接名称”一栏为“HotelConn”,在“数据库”一栏中填写“HOTEL”,并且在“数据库位置”一栏中填写hotel数据库的位置,点击“下一步”,具体急见下图所示。
我们将下一对话框的“HOTEL”一项都选上,点击“下一步”,如图所示。
在最后一个对话框中的“生成EJB类的包”一栏中,填写“tju.ibm.hotel.ejbs”,然后点击“完成”,见下图所示。
生成三个CMP,但是我们只需要保留“Guest”,所以删除其他的两个CMP。
展开“EJB项目”—〉“HotelEJB”—〉“实体Bean”—〉“Guest”,并双击它,将会在编辑区出现“EJB部署描述符”,在右边的“JNDI名称”一栏填入“hotel/GuestLocalHome”,如下图所示。
点击“EJB部署描述符”下边的“引用”,给会话Bean“Getguest”添加一个EJB引用,选择“Getguest”,并点击“添加”,同样像上次给Web项目添加EJB引用那样,选择“EJB引用”,点击“下一步”,此处的“名称”一栏填写“ejb/GuestLocalHome”,“引用类型”选择“本地”,并且选中“工作空间中的企业Bean”,选中“Guest”Bean,点击“完成”,见下图所示。
关闭“EJB部署描述符”,我们需要修改“Guest”CMP,打开“GuestBean.java”,修改“ejbCreate”和“ejbPostCreate”方法,代码如下:
publictju.ibm.hotel.ejbs.GuestKeyejbCreate(Guestguest)throwsjavax.ejb.CreateException
{
setGuest_id(guest.getGuest_id());
setPassword(guest.getPassword());
setFirst_name(guest.getFirst_name());
setLast_name(guest.getLast_name());
setIc_card(guest.getIc_card());
setEmail(guest.getEmail());
setTelephone(guest.getTelephone());
setRank("guest");
returnnull;
}
publicvoidejbPostCreate(Guestguest)throwsjavax.ejb.CreateException
{
}
保存后,关闭该文件,同时打开“GuestLocalHome.java”文件,它是“GuestBean”的本地Home接口,我们需要相应的修改“create”方法,修改代码如下:
publictju.ibm.hotel.ejbs.GuestLocalcreate(Guestguest)throwsjavax.ejb.CreateException;
保存后关闭该文件。
下面需要部署该实体Bean到应用服务器,右键点击“EJB项目”—〉“HotelEJB”—〉“实体Bean”—〉“Guest”,选择“部署”,该过程和上一小节中部署会话Bean类似。
这里我们需要修改一下已经创建好的会话Bean“Getguest”,使它可以得到这一节中创建好的实体Bean的实例,首先打开“EJB项目”—〉“HotelEJB”—〉“实体Bean”—〉“Getguest”—〉“GetguestBean”,修改“getGuestInfo”方法,代码如下:
GuestLocalHomeguestLocalHome=(GuestLocalHome)
ServiceLocatorManager.getLocalHome("ejb/GuestLocalHome",GuestLocalHome.class);
if(guestLocalHome==null)
returnnull;
GuestLocalguestLocal=null;
try
{
guestLocal=guestLocalHome.findByPrimaryKey(newGuestKey(guest_id));
}
catch(FinderExceptione)
{
e.printStackTrace();
}
if(guestLocal!
=null&&password.equalsIgnoreCase(guestLocal.getPassword()))
{
guest=newGuest(guest_id,password,
guestLocal.getFirst_name(),
guestLocal.getLast_name(),
guestLocal.getIc_card(),
guestLocal.getEmail(),
guestLocal.getTelephone());
returnguest;
}
保存关闭该文件后,重新部署该会话Bean,方法和上述章节中叙述的相同,这里就不再赘述了。
最后,打开服务器,并且使用我们在上一节中创建的Web客户端来测试该会话Bean和CMP实体Bean的协同工作,我们应该会得到和上一节中相同的结果。