中间件实验报告.docx
《中间件实验报告.docx》由会员分享,可在线阅读,更多相关《中间件实验报告.docx(67页珍藏版)》请在冰豆网上搜索。
中间件实验报告
学生学号
0120910680223
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称软件构件与中间件技术
开课学院计算机科学与技术学院
指导老师姓名祁明龙
学生姓名彭新辉
学生专业班级软件0902
2011—2012学年第二学期
实验课程名称:
软件构件与中间件技术
实验项目名称
基于RMI/IIOP创建一个查询Excel电子表格的分布式计算
实验成绩
实验者
彭新辉
专业班级
软件0902
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
基于RMI/IIOP创建一个查询Excel电子表格的分布式计算
电子表格(名为book1.xls)见附录一
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
A.实验原理:
(1)RMI-IIOP的工作机制
(2)RMI/IIOP和RMI不同的地方是,前者使用IIOP“标准”CORBA的网络协议,因此可以和其它CORBA应用进行互操作,而相同的地方是,RMI和RMI/IIOP都使用Java定义远程对象所“暴露”的接口。
这就是IntheframeworkofpureJava,“纯Java爷们”框架类内的分布式应用。
RMI/IIOP和“标准”CORBA不同的地方是,后者必须用IDL定义远程对象所“暴露”的接口。
(2)“内存数据库表单”即一个java.sql.ResultSet对象是不能被“序列化”的,即不能把这样一个对象的状态写到一个网络Socket文件里的,所以,必须把“内存数据库表单”里的每一条记录封装到一个实现java.io.Serializable,根据数据库表单“量身定做”的JavaBean一个对象里,再把该对象“丢到”一个java.util.ArrayList数组列表对象里。
Java数据结构标包中的任一类的对象都能被“序列化”,可以从一个网络的一个节点传到另一点。
B.实验步骤:
1)定义远程接口:
(文件名:
ROInter.java所在包:
mia.ham.football)
2)定义JavaBean:
(文件名:
STUDENT.java所在包:
mia.ham.football)
3)实现远程接口:
(文件名:
ROImpl.java所在包:
mia.ham.football)
4)编写服务器端程序:
(文件名:
Server.java所在包:
mia.ham.football)
5)编写客户端程序:
(文件名:
Client.java所在包:
mia.ham.football)
6)配置book1.xls电子表格的ODBC数据源,命名为rmiiiop_ds。
7)打开一个DOS命令行窗口,cd到你的工作目录
%WORKING_DIRECTORY%\mia\ham\footbal,把以上Java源码文件复制到
%WORKING_DIRECTORY%\mia\ham\footbal之下,按以下命令编译解释:
编译:
javac.\mia\ham\footbal\*.java,回车。
8)使用rmic编译远程对象类字节码,从而产生客户端和服务器端代理,即
所谓的客户端码根和服务器端框架,其命令是:
rmic–iiopmia.ham.footbal.ROImpl,回车。
9)启动RMI/IIOPJNDI命名目录服务器,输入:
orbd-ORBInitialPort1050,如果端口1050被占用,可以改用其他端口号。
10)启动RMI/IIOP的服务器应用:
打开一个DOS命令行窗口,切入到工作目录之下,这是因为RMI/IIOPJNDI命名目录服务器占用了刚才那个DOS命令行窗口。
输入命令:
myjavamia.ham.footba.Server,回车,从而启动了RMI/IIOP的服务器应用。
11)启动RMI/IIOP的客户端:
在客户端所在物理主机上,安装jdk1.6,配置Path和Classpath两个系统参数,创建相同的目录结构,复制所有的文件。
当然,如果你把应用打包到了一个jar文件,只需使用jar命令解包,自动生成类包的目录结构,而不需要手工创建相同的目录结构。
输入命令:
javaorbmia.ham.footba.Client,回车,从而启动了RMI/IIOP的客户端应用。
(myjava为你定义的批处理文件,其内容为:
java-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory-Djava.naming.provider.url=iiop:
//localhost:
1050%1)
实验代码见附录二
三、主要仪器设备及耗材
电脑,Dos,NetBeansIDE6.5JDK1.6等
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现问题等)
若在程序运行过程中发现接口1050被其他程序占用,可以尝试其他接口在运行程序。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
实验结果截图
服务器端:
客户端:
三、实验小结、建议及体会
通过本次试验明白并掌握了RMI-IIOP的中间件技术工作机制,实现了一个基于RMI/IIOP查询Excel电子表格的分布式计算。
在实验过程中,掌握了很多技能,如配置数据源,定义远程接口等。
在服务器端通过函数naming.rebind("Students",remoteObject)将指定的名称重新绑定到一个新的远程对象。
在客户端通过函数ObjectobjRef=ct.lookup("Students");在注册表中找到远程对象。
实验课程名称:
软件构件与中间件技术
实验项目名称
基于标准CORBA创建一个查询以上Exel电子表格的分布式计算
实验成绩
实验者
彭新辉
专业班级
软件0902
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
三、实验内容描述(问题域描述)
基于标准CORBA创建一个查询以上Exel电子表格的分布式计算
电子表格(名为book1.xls)见附录一
四、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
实验步骤:
1)安装jdk1.6,配置系统参数Path,Classpath和JAVA_HOME。
2)配置book1.xls电子表格的ODBC数据源,命名为rmiiiop_ds。
3)定义一个IDL接口文件:
(文件名:
dbapp.idl所在目录:
C:
\rmiiiop\src)
moduleIDLDBApp
{
typedefstruct_STUDENT
{
stringid;
stringname;
stringmajor;
stringcalss;
}STUDENT;
typedefsequenceAllStudents;
interfaceDisplayDBTable
{
voidgetStudents(outAllStudentsstudents);
};
};
注意:
为了表达对应数据库表单的一行记录,如果使用的开发方法是RMI或RMIoverIIOP,那么定义一个JavaBean就可以了,而在IDLCORBA中,需定义一个结构体来表达数据库表单的一行记录,该结构体的一个序列(Sequence)存放整个表单的数据。
在使用jdk1.6的idlj,把这个IDL文件映射成Java目标代码时,该结构体被映射成_STUDENT.java,一个CORBA的JavaBean。
定义一个名为DisplayDBTable的接口,其中有一个名为AllStudentsgetStudents();远程方法。
换言之,在客户端调用该远程方法,就可获取处于服务器端的Exel文档中,区
域逻辑名为student的电子表格。
4)编译idl文件
命令为:
idlj–falldbapp.idl.
产生许多辅助类:
5)实现远程对象:
(文件名:
ROImpl.java所在包:
IDLDBApp)
ROImpl是DisplayDBTablePOA的一个子类。
利用JDBC-ODBC数据源连接到Exel文档,提取student电子表格,保存到一个java.sql.ResultSet对象里。
JDBC数据集对象是一个Hashtable,一个哈希表,有可以移动的游标。
把游标移到最后一行,就可返回整个表单的记录数,但是这样做会带来意想不到的bug,所以还是把数据集中所有数据复制到一个数组列表中,再做后续处理。
数据集对象和后台的数据库做intime连接,直接对它进行数据处理开销大,安全性差,受后台数据库载荷情况的影响,把数据集中所有数据复制到一个数组列表中,是一个分布式应用不成文的规定。
6)开发服务器端:
(文件名:
Server.java所在包:
IDLDBApp)
7)开发客户端:
(文件名:
Client.java所在包:
IDLDBApp)
8)编译和测试程序:
同实验一
实验代码见附录二
三、主要仪器设备及耗材
电脑,Dos,NetBeansIDE6.5JDK1.6等
第二部分:
实验调试与结果分析(可加页)
四、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现问题等)
1)在编译*.java文件时,出现以下情况,不影响实验结果,可忽略不不计。
2)在运行客户端程序时出现
一定要再程序名前加上包名:
五、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
实验结果:
服务器端:
客户端:
六、实验小结、建议及体会
通过本次试验明白并掌握了CORBA中间件技术的工作机制。
也初步了解了idl(接口定义语言)。
通过编写接口定义语言,然后通过idlj–fallfile.idl编译,生成的诸多辅助类,为CORBA技术的实现节省了很多工作。
通过自己的亲身实践,实现了一个基于标准CORBA查询Exel电子表格的分布式计算。
同时也扩充了自己的代码量。
实验课程名称:
软件构件与中间件技术
实验项目名称
利用J2EEEJB3.0无状态会话Bean(StatelessSessionBean)和实体Bean(EntityBen)开发一个数据库应用
实验成绩
实验者
专业班级
软件0902
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
五、实验内容描述(问题域描述)
利用J2EEEJB3.0的无状态会话Bean(StatelessSessionBean)和实体Bean(EntityBen)开发一个数据库应用
限制:
数据库表单book1.xls,共有学号,姓名,专业以及专业班级五个字段(ColumnsorFieldsofadabasetable)。
不使用JDBC-ODBC桥直接连接到Exel电子表格文档,而是编写一个JavaApplication把电子表格转换成MySqlRDBMS的一个数据库表单。
设置MySql以及创建数据库表单时的字符集为UTF-8,或GBK,以确保当显示中文时不乱码。
电子表格(名为book1.xls)见附录一
六、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
预备知识:
Java数据结构标包:
java.util.ArrayList,List,……
JavaJDBC标包:
java.sql.*
JavaJNDI标包:
:
javax.naming.*;
Java标注(Javaannotation).
原理:
实体Bean所表达的是所谓的数据层,名字已经使我们联想到数据库设计方法之ER(EntityRelationship)。
事实上,实体类(以后我们不区分实体bean,EB,EntityBean和实体类)它的每一个成员变量都和一个已经存在或将要创建的数据库表单的字段一一对应。
J2EE容器借助于JPA(JavaPersistenceAPI),不但保持EB和对应数据库表单的逻辑映射关系,而且提供EB和此表单的数据交流,即所谓的持久化(Persistence),还有诸如EJB生命周期(LifeCycle)和安全等等服务,把程序员从重复繁琐的数据库编程中解放出来。
一个JavaBean即所谓的一个POJO,通过J2EEEJB3.0的Java标注变成EJB,J2EE容器把这些Java标注转换成Java代码。
这个POJO必须实现java.io.Serializable,这样它就可以被“序列化”,即它的一个实例及其状态就可以在一个网络文件即一个socket读写了。
一个没有实现“序列化”接口的POJO是不能在RMI,CORBA中作为一个远程方法RM(Remotemethod)的参数或返回类型的。
一个“内存数据库表单”,即JDBC的数据集对象——java.sql.ResultSet,是不能作为一个远程方法RM(Remotemethod)的参数或返回类型的,因为它没有实现“序列化”接口。
所以当涉及到使用非EJB方法开发数据库分布式应用时,我们不得不编写一个实现“序列化”接口,成员变量与有关数据库表单字段严格对应的POJO,借助于循环迭代对象,把JDBC的数据集,即“内存数据库表单”的每一行记录取出来,包装在一个像这样定制的POJO对象里,然后加进一个象java.util.ArrayList数据结构对象里。
而众所周知,一个ArrayList对象是可以网络“序列化”。
SLSB,即StatelessSessionBean,亦即无状态会话Bean,表达的是业务逻辑层(BusinessLogicLayer),同样借助于EJB的Java标注所引入的所谓注入机制(InjectionMechanism),访问一个EB从而达到读写一个数据库表单的作用,而对于该数据库表单的操作预先在一个远程Java
接口中定义(带有@Remote标注),类似RMI中的远程对象方法,CORBA中的侍服对象方法(aservant’smethods)。
下面的示意图粗线条的给出若干核心概念解释。
J2EE容器的选择在EJB开发中很重要。
一般的原则是:
一用正版的软件,象IBM的WebSpere,BEA的WebLogic,以及Borland的Jbuilder等;二是选择稳定的高版本的软件;最后选择大家都在使用的开源软件,例如数据库选MySqlServer。
使用低版本的某个J2EE容器,首先要手工配置很多xml文档形式的“描述符”(Apersistencedescriptor,forinstance),其次低版本与其他工具的不兼容性,往往会出项许多意想不到没有出处的编译问题,既耗费程序员的时间,又违背软件的可移植性等来源于软件工程“美学”原则。
实验步骤:
(一)安装jdk1.6,配置系统参数Path,Classpath和JAVA_HOME。
(二)安装MySqlServer4.1。
注意配置时字符集使用UTF-8。
我们约定,用户名为
root,口令为miaham。
(三)开启一个MySql命令窗口,使用命令创建一个新的数据库,名为students。
(四)安装NetBeanIDE6.5。
(五)配置book1.xls电子表格的ODBC数据源,命名为rmiiiop_ds。
(六)把MySqlJDBC4th驱动的jar编辑到Classpath系统参数中。
(好像NetBean
IDE自带这个包。
)
(七)在NetBeanIDE中创建一个Java应用,并运行。
目的:
把电子表格写到MySql
students数据库种的一个名为student的表单中。
(DBApp.java)
注意:
在配置ODBC数据源时,电子表格文档是“数据库”,表格所占的区域是“数据库表单”。
第一行是“数据库表单”元数据(Metadataofthetable),即字段名。
所以,要在第一行记录前插一行,五列分别命名为ID,Name,Major,Class1。
注意class是java自反的一个方法,避免作为
字段名。
(八)在NetBeanIDE6.5创建一个JavaEE应用。
在上图中,选择JavaEE,然后是企业级应用程序。
在下一张截图中,选择“项目”所在的目录和“项目”名称。
在这个例子中,项目”名称是MyEJBApp02,其所在的目录是D:
\rmiiiop(所有三个实验都在这个目录之下,容易打包)。
在下一步,NetBeanIDE6.5自动生成一个EJB模块可一个WEB应用客户端,但是,我们并不使用WEB应用客户端,而在另一个JAVA一般应用中创建EJB客户端。
一个WEB应用客户端需要课程“WEB应用开发”的知识。
虽然简单,但不在这里使用。
要知道,OracleGlassFishV2应用服务器,既是EJB容器,也是WEB容器,更有JNDI命名目录服务器。
这个WEB容器,又叫WEB服务器,是ApacheTomat6.x。
(注意,这个MyEJBApp02已经存在,所以为了演示的目的,换成MyEJBApp。
如果是第一次创建MyEJBApp02,可以直
接到这个界面的。
)
在下图中,显示了所有的服务。
主要是GlassFishv2EJB容器,WEB服务器
Tomcat6.0.18,以及数据库。
(九)建立一个到MySqlRDBMS的连接:
点击“驱动程序”,发现有JDBC-ODBC桥驱动(sun.jdbc.odbc.JdbcOdbcDriver所有的JDK自带),JAVADB是NETBEANIDE自带的数据库RDBMS的驱动,名为ApacheDerby;MySqlJDBC驱动。
看来,NetBeanIDE6.5自带含有MySqlJDBC驱动的jar包,不然的话,要下载,并添加到NetBeanIDE6.5里,就是指定这个jar文件他的物理位置。
把光标定位在“MySql(Connector/Jdriver)”节点上,点击右键,在
弹出的菜单中选择“连接设置”,出现以下窗体:
(十)在以上的窗体中,选择“直接输入URL”,给定用户名,这里是超级用户root,口令,这里假定是miaham,再输入连接到MySql的URL:
jdbc:
mysql:
//localhost:
3306/students。
假定同学们已了解URL各部分的含义。
完成后,在数据库里,应该出现students数据库及其下的表单(见上上图),表明我们已经成功的连接到数据库里了。
选择某一个表单后,可以再NetBeanIDE6.5之下,直接输入SQL语句。
(十一)选择MyEJBApp02-ejb项目,点击右键,选择“新建——通过数据库生成实体类”,出现以下窗体:
(十二)在以上的窗体中,指定数据源的JNDI名称。
注意,一切资源都必须在JNDI
“黄页”里注册和查找,点击“确定”得到以下窗体:
(十三)在以上的窗体中选择你要生成EntityBean的对应的数据库表单。
这里,student表单已经生成,所以呈灰色。
选择,例如,age表单和famille表单,
那么,NetBeanIDE6.5自动生成与他们对应的实体类。
点击下一步,出现:
(十四)在以上的窗体中中,点击“下一步”,在新窗体中,选择“持久化单元”——一个EJB容器了解数据源信息的xml文档,名称为:
persistence.xml。
如果使用Eclipse+Jboss,要手工配置这个“描述符”,极易出错,除非开发者很了解Hibernat。
下面是这个xml的具体标记:
xmlversion="1.0"encoding="UTF-8"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
miaham_ds
(十五)生成的实体类即EntityBean:
Student.java
(十六)通过StatelessSessionBean实现业务逻辑:
StudentSLSBBean.java
注意一:
在@Stateless(mappedName="ejb/StudentSLSBBean")这个标注(JavaAnnotation)中mappedName是在客户端中所需要的这个SLSB的JNDI名称注意二:
在@PersistenceContext(unitName="MyEJBApp02-ejbPU")这个标注(JavaAnnotation)中unitName与persistence.xml中同名标记(tag)的相同。
EJB3.0容器通过这个标注(JA)实现了InjectionMechanism即“注入机制”,从而使得在一个SB中可以访问一个EB,再通过JPA,达到与后台数据库对应表单的数据交流。
(十七)对应的远程接口:
StudentSLSBRemote.java
(十八)部署EJB组件:
点击MyEJBApp02-ejb模块,选择“部署”。
如果部署成功,那么在GlassFishV2上可以可视化已部署的组件,表明服务器端应用已启动,等待客户端的请求。
见下图:
(十九)创建客户端应用:
新建一个正常的JAVA应用,编写一个客户端。
名称:
Client.java,所在包:
ejbtest
(二十)测试客户端:
客户端需要四个GlassFishV2jar包文件:
appserv-rt.jar,appserv-ext.jar,appserv-client-deployment.jar和javaee.jar包,当然还有我们的EJB组件包C:
\RMIIIOP\MyEJBApp02\MyEJBApp02-ejb\dist\MyEJBApp02-ejb.jar。
把这五个包设置到Classpath系统变量中。
可以预先写一个DOSBatch文件,避
开通过“控制面板”设置到Classpath系统