1、学生学号0120910680223实验课成绩武汉理工大学学 生 实 验 报 告 书实验课程名称 软件构件与中间件技术 开 课 学 院 计算机科学与技术学院 指导老师姓名 祁明龙 学 生 姓 名 彭新辉 学生专业班级 软件0902 2011 2012学年 第二学期实验课程名称: 软件构件与中间件技术 实验项目名称基于RMI/IIOP创建一个查询Excel电子表格的分布式计算实验成绩实验者彭新辉专业班级软件0902组别同组者实验日期第一部分:实验分析与设计(可加页)一、 实验内容描述(问题域描述)基于RMI/IIOP创建一个查询Excel电子表格的分布式计算电子表格(名为book1.xls)见附录
2、一二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)A实验原理:(1)RMI-IIOP的工作机制(2)RMI/IIOP和RMI不同的地方是,前者使用IIOP“标准”CORBA的网络协议,因此可以和其它CORBA应用进行互操作,而相同的地方是,RMI和RMI/IIOP都使用Java 定义远程对象所“暴露”的接口。这就是In the framework of pure Java,“纯Java爷们”框架类内的分布式应用。RMI/IIOP和“标准”CORBA不同的地方是,后者必须用IDL定义远程对象所“暴露”的接口。 (2)“内存数据库表单”即一个java
3、.sql.ResultSet 对象是不能被“序列化”的,即不能把这样一个对象的状态写到一个网络Socket文件里的,所以,必须把“内存数据库表单”里的每一条记录封装到一个实现java.io.Serializable,根据数据库表单“量身定做”的Java Bean一个对象里,再把该对象“丢到”一个java.util.ArrayList 数组列表对象里。Java数据结构标包中的任一类的对象都能被“序列化”,可以从一个网络的一个节点传到另一点。 B实验步骤:1)定义远程接口:(文件名:ROInter.java所在包:mia.ham.football)2)定义Java Bean:(文件名: STUDE
4、NT.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%miahamfootbal,把以上Java源码文件复制到%WORKING_D
5、IRECTORY%miahamfootbal之下,按以下命令编译解释: 编译:javac .miahamfootbal*.java, 回车。 8) 使用rmic编译远程对象类字节码,从而产生客户端和服务器端代理,即所谓的客户端码根和服务器端框架,其命令是: rmic iiop mia.ham.footbal.ROImpl, 回车。 9)启动RMI/IIOP JNDI命名目录服务器,输入:orbd -ORBInitialPort 1050,如果端口1050被占用,可以改用其他端口号。10)启动RMI/IIOP的服务器应用:打开一个DOS命令行窗口,切入到工作目录之下,这是因为RMI/IIOP J
6、NDI 命名目录服务器占用了刚才那个DOS命令行窗口。输入命令:myjava mia.ham.footba.Server,回车,从而启动了RMI/IIOP的服务器应用。 11) 启动RMI/IIOP的客户端:在客户端所在物理主机上,安装 jdk1.6,配置Path和Classpath两个系统参数,创建相同的目录结构,复制所有的文件。当然,如果你把应用打包到了一个jar文件,只需使用jar命令解包,自动生成类包的目录结构,而不需要手工创建相同的目录结构。输入命令:javaorb mia.ham.footba.Client,回车,从而启动了RMI/IIOP的客户端应用。 (myjava 为你定义的
7、批处理文件,其内容为:java-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop:/localhost:1050 %1)实验代码见附录二三、主要仪器设备及耗材电脑,Dos,NetBeans IDE 6.5 JDK 1.6等第二部分:实验调试与结果分析(可加页)一、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现问题等) 若在程序运行过程中发现接口1050被其他程序占用,可以尝试其他接口在运行程序。二、 实验结果及分析(包括结果描述
8、、实验现象分析、影响因素讨论、综合分析和结论等)实验结果截图服务器端:客户端:三、 实验小结、建议及体会通过本次试验明白并掌握了RMI-IIOP的中间件技术工作机制,实现了一个基于RMI/IIOP查询Excel电子表格的分布式计算。在实验过程中,掌握了很多技能,如配置数据源,定义远程接口等。在服务器端通过函数naming.rebind(Students, remoteObject)将指定的名称重新绑定到一个新的远程对象。在客户端通过函数Object objRef = ct.lookup(Students);在注册表中找到远程对象。实验课程名称: 软件构件与中间件技术 实验项目名称基于标准COR
9、BA创建一个查询以上Exel电子表格的分布式计算实验成绩实验者彭新辉专业班级软件0902组别同组者实验日期第一部分:实验分析与设计(可加页)三、 实验内容描述(问题域描述)基于标准CORBA创建一个查询以上Exel电子表格的分布式计算电子表格(名为book1.xls)见附录一四、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)实验步骤:1)安装jdk1.6,配置系统参数Path, Classpath和JAVA_HOME。2)配置book1.xls电子表格的ODBC数据源,命名为rmiiiop_ds。3)定义一个IDL 接口文件:(文件名:dbapp.
10、idl 所在目录:C:rmiiiopsrc) module IDLDBApp typedef struct _STUDENT string id; string name; string major; string calss; STUDENT; typedef sequence AllStudents; interface DisplayDBTable void getStudents(out AllStudents students); ; ; 注意:为了表达对应数据库表单的一行记录,如果使用的开发方法是RMI或RMI over IIOP,那么定义一个Java Bean就可以了,而在IDL
11、 CORBA中,需定义一个结构体来表达数据库表单的一行记录,该结构体的一个序列(Sequence)存放整个表单的数据。在使用jdk1.6的idlj,把这个IDL文件映射成Java目标代码时,该结构体被映射成 _STUDENT.java,一个CORBA的Java Bean。定义一个名为DisplayDBTable的接口,其中有一个名为AllStudents getStudents();远程方法。换言之,在客户端调用该远程方法,就可获取处于服务器端的Exel文档中,区域逻辑名为student的电子表格。 4)编译idl 文件命令为:idlj fall dbapp.idl.产生许多辅助类: 5)实现
12、远程对象:(文件名:ROImpl.java 所在包:IDLDBApp)ROImpl是DisplayDBTablePOA的一个子类。利用JDBC-ODBC数据源连接到Exel文档,提取student电子表格,保存到一个java.sql.ResultSet对象里。JDBC数据集对象是一个Hashtable,一个哈希表,有可以移动的游标。把游标移到最后一行,就可返回整个表单的记录数,但是这样做会带来意想不到的bug,所以还是把数据集中所有数据复制到一个数组列表中,再做后续处理。数据集对象和后台的数据库做in time 连接,直接对它进行数据处理开销大,安全性差,受后台数据库载荷情况的影响,把数据集中
13、所有数据复制到一个数组列表中,是一个分布式应用不成文的规定。 6)开发服务器端:(文件名:Server.java 所在包:IDLDBApp) 7)开发客户端:(文件名:Client.java 所在包:IDLDBApp )8) 编译和测试程序:同实验一实验代码见附录二三、主要仪器设备及耗材电脑,Dos,NetBeans IDE 6.5 JDK 1.6等第二部分:实验调试与结果分析(可加页)四、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现问题等)1)在编译 *.java文件时,出现以下情况,不影响实验结果,可忽略不不计。2)在运行客户端程序时出现一定要再程序名前加上包名:
14、五、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)实验结果:服务器端:客户端:六、 实验小结、建议及体会通过本次试验明白并掌握了CORBA中间件技术的工作机制。也初步了解了idl(接口定义语言)。通过编写接口定义语言,然后通过idlj fall file.idl 编译,生成的诸多辅助类,为CORBA技术的实现节省了很多工作。通过自己的亲身实践,实现了一个基于标准CORBA查询Exel电子表格的分布式计算。同时也扩充了自己的代码量。实验课程名称: 软件构件与中间件技术 实验项目名称利用J2EE EJB3.0无状态会话Bean(Stateless Session B
15、ean)和实体Bean (Entity Ben)开发一个数据库应用实验成绩实验者专业班级软件0902组别同组者实验日期第一部分:实验分析与设计(可加页)五、 实验内容描述(问题域描述)利用J2EE EJB3.0的无状态会话Bean(Stateless Session Bean)和实体Bean (Entity Ben)开发一个数据库应用限制:数据库表单book1.xls,共有学号,姓名,专业以及专业班级五个字段(Columns or Fields of a dabase table)。不使用 JDBC-ODBC 桥直接连接到Exel电子表格文档,而是编写一个Java Application把电子
16、表格转换成MySql RDBMS的一个数据库表单。设置MySql以及创建数据库表单时的字符集为 UTF-8,或GBK,以确保当显示中文时不乱码。 电子表格(名为book1.xls)见附录一六、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)预备知识: Java 数据结构标包:java.util.ArrayList, List, Java JDBC标包: java.sql.* Java JNDI标包:javax.naming.*; Java 标注(Java annotation). 原理: 实体Bean所表达的是所谓的数据层,名字已经使我们联想到数据库
17、设计方法之ER(Entity Relationship)。事实上,实体类(以后我们不区分实体bean,EB,Entity Bean和实体类)它的每一个成员变量都和一个已经存在或将要创建的数据库表单的字段一一对应。J2EE 容器借助于JPA(Java Persistence API),不但保持EB和对应数据库表单的逻辑映射关系,而且提供EB和此表单的数据交流,即所谓的持久化(Persistence),还有诸如EJB生命周期(Life Cycle)和安全等等服务,把程序员从重复繁琐的数据库编程中解放出来。 一个Java Bean即所谓的一个POJO,通过J2EE EJB3.0的Java 标注变成E
18、JB,J2EE容器把这些Java标注转换成Java代码。这个POJO必须实现java.io.Serializable,这样它就可以被“序列化”,即它的一个实例及其状态就可以在一个网络文件即一个socket读写了。一个没有实现“序列化”接口的POJO是不能在RMI,CORBA中作为一个远程方法RM(Remote method)的参数或返回类型的。一个“内存数据库表单”,即JDBC 的数据集对象java.sql.ResultSet,是不能作为一个远程方法RM(Remote method)的参数或返回类型的,因为它没有实现“序列化”接口。所以当涉及到使用非EJB方法开发数据库分布式应用时,我们不得不
19、编写一个实现“序列化”接口,成员变量与有关数据库表单字段严格对应的POJO,借助于循环迭代对象,把JDBC的数据集,即“内存数据库表单”的每一行记录取出来,包装在一个像这样定制的POJO对象里,然后加进一个象java.util.ArrayList 数据结构对象里。而众所周知,一个ArrayList对象是可以网络“序列化”。 SLSB,即Stateless Session Bean,亦即无状态会话 Bean,表达的是业务逻辑层(Business Logic Layer),同样借助于EJB的Java标注所引入的所谓注入机制(Injection Mechanism),访问一个EB从而达到读写一个数据
20、库表单的作用,而对于该数据库表单的操作预先在一个远程Java接口中定义(带有Remote标注),类似RMI中的远程对象方法,CORBA中的侍服对象方法(a servants methods)。 下 面 的 示 意 图 粗 线 条 的 给 出 若 干 核 心 概 念 解 释 。 J2EE容器的选择在EJB开发中很重要。一般的原则是:一用正版的软件,象IBM的WebSpere, BEA的WebLogic,以及Borland的Jbuilder 等;二是选择稳定的高版本的软件;最后选择大家都在使用的开源软件,例如数据库选MySql Server。使用低版本的某个J2EE容器,首先要手工配置很多xml
21、文档形式的“描述符”(A persistence descriptor, for instance),其次低版本与其他工具的不兼容性,往往会出项许多意想不到没有出处的编译问题,既耗费程序员的时间,又违背软件的可移植性等来源于软件工程“美学”原则。 实验步骤: (一) 安装jdk1.6,配置系统参数Path, Classpath和JAVA_HOME。 (二) 安装MySql Server 4.1。注意配置时字符集使用UTF-8。我们约定,用户名为root,口令为miaham。 (三) 开启一个MySql命令窗口,使用命令创建一个新的数据库,名为students。 (四) 安装NetBean ID
22、E 6.5。 (五) 配置book1.xls电子表格的ODBC数据源,命名为rmiiiop_ds。 (六) 把MySql JDBC 4th驱动的jar 编辑到Classpath系统参数中。(好像NetBean IDE 自带这个包。) (七) 在NetBeanIDE中创建一个Java应用,并运行。目的:把电子表格写到MySql students数据库种的一个名为student的表单中。(DBApp.java)注意:在配置ODBC数据源时,电子表格文档是“数据库”,表格所占的区域是“数据库表单”。第一行是“数据库表单”元数据(Meta data of the table),即字段名。所以,要在第一
23、行记录前插一行,五列分别命名为ID,Name,Major,Class1。注意class是java自反的一个方法,避免作为字段名。 (八)在NetBean IDE 6.5创建一个Java EE应用。在上图中,选择Java EE,然后是企业级应用程序。在下一张截图中,选择“项目”所在的目录和“项目”名称。在这个例子中,项目”名称是MyEJBApp02,其所在的目录是 D:rmiiiop(所有三个实验都在这个目录之下,容易打包)。 在下一步,NetBean IDE 6.5自动生成一个EJB模块可一个WEB应用客户端,但是,我们并不使用WEB应用客户端,而在另一个一般应用中创建EJB客户端。一个WEB
24、应用客户端需要课程“WEB应用开发”的知识。虽然简单,但不在这里使用。要知道,Oracle GlassFishV2应用服务器,既是EJB容器,也是WEB容器,更有JNDI命名目录服务器。这个WEB容器,又叫WEB服务器,是Apache Tomat 6.x。(注意,这个MyEJBApp02已经存在,所以为了演示的目的,换成MyEJBApp。如果是第一次创建MyEJBApp02,可以直接到这个界面的。)在下图中,显示了所有的服务。主要是GlassFishv2 EJB容器,WEB 服务器Tomcat 6.0.18,以及数据库。 (九) 建立一个到MySql RDBMS的连接:点击“驱动程序”,发现有
25、JDBC-ODBC桥驱动(sun.jdbc.odbc.JdbcOdbcDriver 所有的JDK 自带),JAVA DB 是NETBEAN IDE自带的数据库RDBMS的驱动,名为Apache Derby;MySql JDBC驱动。看来,NetBean IDE 6.5自带含有MySql JDBC驱动的jar 包,不然的话,要下载,并添加到NetBean IDE 6.5里,就是指定这个jar 文件他的物理位置。把光标定位在“MySql (Connector/J driver)”节点上,点击右键,在 弹出的菜单中选择“连接设置”,出现以下窗体 : (十) 在以上的窗体中,选择“直接输入 URL”,
26、给定用户名,这里是超级用户root,口令 , 这里假定是miaham,再输入连接 到MySql 的URL: jdbc:mysql:/localhost:3306/students。假定同学们已了解URL各部分的含义。完成后,在数据库里,应该出现students数据库及其下的表单(见上上图),表明我们已经成功的连接到数据库里了。选择某一个表单后,可以再NetBean IDE 6.5 之下,直接输入SQL语句。 (十一)选择MyEJBApp02-ejb项目,点击右键,选择“新建通过数据库生成实体类”,出现以下窗体 : (十二)在以上的窗体中,指定数据源的JNDI名称。注意,一切资源都必须在JNDI
27、“ 黄页 ”里注册和查找,点击“确定”得到以下窗体: (十三)在以上的窗体中选择你要生成Entity Bean的对应的数据库表单。这里,student表单已经生成,所以呈灰色。选择,例如,age表单和famille表单,那么,NetBean IDE 6.5自动生成与他们对应的实体类。点击下一步,出现: (十四)在以上的窗体中中,点击“下一步”,在新窗体中,选择“持久化单元”一个EJB容器了解数据源信息的xml文档,名称为:persistence.xml。如果使用Eclipse+Jboss,要手工配置这个“描述符”,极易出错,除非开发者很了解Hibernat。下面是这个xml的具体标记: per
28、sistence version=1.0 xmlns= xmlns:xsi=http:/www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= miaham_ds (十五)生成的实体类即Entity Bean:Student.java(十六)通过Stateless Session Bean实现业务逻辑:StudentSLSBBean.java注意一:在Stateless(mappedName=ejb/StudentSLSBBean)这个标注(Java Annotation)中mappedName是在客户端中所需要的这个SLSB的JNDI名称
29、 注意二:在PersistenceContext(unitName=MyEJBApp02-ejbPU)这个标注(Java Annotation)中unitName与persistence.xml中同名标记(tag)的相同。EJB3.0容器通过这个标注(JA)实现了Injection Mechanism 即“注入机制”,从而使得在一个SB中可以访问一个EB,再通过JPA,达到与后台数据库对应表单的数据交流。 (十七)对应的远程接口:StudentSLSBRemote.java(十八)部署EJB组件:点击MyEJBApp02-ejb模块,选择“部署”。如果部署成功,那么在GlassFish V2上
30、可以可视化已部署的组件,表明服务器端应用已启动,等待客户端的请求。 见下图 :(十九)创建客户端应用:新建一个正常的JAVA 应用,编写一个客户端。名称:Client.java,所在包:ejbtest (二十)测试客户端:客户端需要四个GlassFishV2 jar包文件:appserv-rt.jar, appserv-ext.jar, appserv-client-deployment.jar和javaee.jar包,当然还有我们的EJB组件包C:RMIIIOPMyEJBApp02MyEJBApp02-ejbdistMyEJBApp02-ejb.jar。把这五个包设置到Classpath系统
31、变量中。可以预先写一个DOS Batch文件,避开通过“控制面板”设置到Classpath系统变量。这个DOS BATCH文件可命名为MyClasspath.bat,其内容为: Set classpath = %classpath%;C:RMIIIOPMyEJBApp02MyEJBApp02-ejbdistMyEJBApp02-ejb.jar; C:Program Filesglassfish-v2ur2lib appserv-rt.jar; C:Program Filesglassfish-v2ur2lib appserv-ext.jar; C:Program Filesglassfish-
32、v2ur2lib appserv-client-deployment.jar; C:Program Filesglassfish-v2ur2lib javaee.jar; 假定Working Directory是C:rmiiiopsrc,把MyClasspath.bat复制到该目录之下,打开一个DOS命令行窗口,键入命令wkdir(上两个实验编写的一个切换到工作目录的DOS批命令文件),在键入命令MyClasspath.bat。 (二十一)编译 :javac .ejbtestClient.java 运行:java ejbtest.Client。出现以下窗体: 三、主要仪器设备及耗材电脑,Dos
33、,NetBeans IDE 6.5 JDK 1.6,数据库管理系统 MySql Server 4.1,J2EE EJB3.0容器(J2EE EJB Container)是GlassFish V2等第二部分:实验调试与结果分析(可加页)七、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现问题等)在部署了myejb.jar文件后,通过在浏览器中输入http:/localhost:4848/可以查看部署的EJB模块。八、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)在NetBean 6.5集成开发环境下的运行结果为:九、 实验小结、建议及体会通过
34、本次试验,我利用J2EE EJB3.0的无状态会话Bean(Stateless Session Bean)和实体Bean (Entity Ben)开发一个数据库应用。也明白了EJB容器的概念和应用。Glassfish和JBoss都是EJB容器。通过将自己开发的Myejb部署到EJB容器里,通过开发客户端对其进行访问。附录一Book1.xlsIDNameMajorClass120910680101段文军软件工程(马)软件0901120910680102吴勇强软件工程(马)软件0901120910680103邵劲东软件工程(马)软件0901120910680104高启航软件工程(马)软件09011
35、20910680105彭勇软件工程(马)软件0901120910680106黄亚龙软件工程(马)软件0901120910680107唐诗玮软件工程(马)软件0901120910680108任冲软件工程(马)软件0901120910680109刘璐软件工程(马)软件0901120910680110陈翔软件工程(马)软件0901120910680111陈运软件工程(马)软件0901120910680112曾昂软件工程(马)软件0901120910680114刘毅软件工程(马)软件0901120910680115何文明软件工程(马)软件0901120910680116闫珂软件工程(马)软件09011
36、20910680117周杰新软件工程(马)软件0901120910680118梁崇恺软件工程(马)软件0901120910680119勾自文软件工程(马)软件0901120910680120张健晨软件工程(马)软件0901120910680121刘翔软件工程(马)软件0901120910680122韩强软件工程(马)软件0901120910680123陈浩软件工程(马)软件0901120910680124马帅先软件工程(马)软件0901120910680125贾晨软件工程(马)软件0901120910680126苏兴东软件工程(马)软件0901120910680127王弘扬软件工程(马)软件0
37、901120910680128张辉软件工程(马)软件0901120910680129吴丽丽软件工程(马)软件0901120910680130刘漫软件工程(马)软件0901120910680131喻楚软件工程(马)软件0901120910680132陈春兰软件工程(马)软件0901120910680133卢沛软件工程(马)软件0901120910680135景小娜软件工程(马)软件0901120909300118陈佳辉软件工程(马)软件0902120910680201张奇软件工程(马)软件0902120910680202方天伟软件工程(马)软件0902120910680203蔡贵源软件工程(马)
38、软件0902120910680204黄一桁软件工程(马)软件0902120910680205陈伟软件工程(马)软件0902120910680206酉召君软件工程(马)软件0902120910680207赵岘软件工程(马)软件0902120910680208许明强软件工程(马)软件0902120910680209王道鑫软件工程(马)软件0902120910680210王皓软件工程(马)软件0902120910680211闫晓东软件工程(马)软件0902120910680212宋净超软件工程(马)软件0902120910680213吴连亮软件工程(马)软件0902120910680215刘映师软件
39、工程(马)软件0902120910680216缪少豪软件工程(马)软件0902120910680217张俊软件工程(马)软件0902120910680218李怀软件工程(马)软件0902120910680220邹常京软件工程(马)软件0902120910680221马骏软件工程(马)软件0902120910680222刘松延软件工程(马)软件0902120910680223彭新辉软件工程(马)软件0902120910680224李志伟软件工程(马)软件0902120910680225谌力软件工程(马)软件0902120910680226魏文培软件工程(马)软件0902120910680227胡
40、登软件工程(马)软件0902120910680228王浩软件工程(马)软件0902120910680229陶思达软件工程(马)软件0902120910680230樊仓软件工程(马)软件0902120910680233洪婉芳软件工程(马)软件0902120910680234金秀永软件工程(马)软件0902120914410237刘可人软件工程(马)软件0902120910680301刘心意软件工程(马)软件0903120910680302梁星软件工程(马)软件0903120910680303林最软件工程(马)软件0903120910680304鄢灿康软件工程(马)软件09031209106803
41、05马钰博软件工程(马)软件0903120910680306王召伟软件工程(马)软件0903120910680307欧阳晟软件工程(马)软件0903120910680308徐洪元软件工程(马)软件0903120910680309方漂软件工程(马)软件0903120910680310陈辰软件工程(马)软件0903120910680311杨旗润软件工程(马)软件0903120910680312范毓软件工程(马)软件0903120910680313张成嶒软件工程(马)软件0903120910680314李阳软件工程(马)软件0903120910680315吴超辉软件工程(马)软件0903120910680316姜小林软件工程(马)软件0903120910680317赵航软件工程(马)软件0903120910680318赖建丰软件工程(马)软件0903120910680319尹德放软件工程(马)软件0903120910680320彭怀梁软件工程(马)软件0903120910680321田晓龙软件工程(马)软件0903120910680322龚杰伟软件工程(马)软件0903120910680323安国跃软件工程(马)软件0903120910680324王欢软件工程(马)软件0903120910680325李成阳软件工程(马)软件0903