1、计算机科学与技术学院实验报告实验题目: 实验 2.2 学号:200805130095日期:2011/4/23 班级: 08 电商 姓名:孟然Email:实验目的:利用上一个实验所学知识,基于 corba 技术开发一个考试查询系统,要求: 建立一个数据库,包括学生基本信息表(考试证号,姓名) ,考试成绩表(考试证号,科目号,成绩),考试科目表(考试科目号,科目名称) 服务器提供:a) 查询服务:允许用户通过考试证号查询所有科目成绩,或通过考试证号+科目名称查询某一科目成绩b) 录入服务:允许管理员对数据库录入考生信息,及其考试成绩 客户可:a) 录入:与服务器端录入服务对应b) 查询:与服务器端
2、查询服务对应硬件环境:机房电脑软件环境:JDK1.3+VisiBroker5.1实验步骤:(一) 编写 Student.idl 并进行编译,命令为 idl2javaStudent.idl / 学生管理系统的对象接口定义module Student interface DataManager/通过考试证号查询所有科目成绩 返回考试证号、姓名、科目名称、成绩string lookup_1(in string stu_id);/通过考试证号+科目名称查询某一科目成绩string lookup_2(in string stu_id, in string course_name);/管理考生信息-录入s
3、tring delStudent(in string stu_id);/管理考生成绩-录入;编译完毕以后,VisiBroker 会生成一个 Student 文件夹,内部包含了与 Student 接口相关的各类。其中,真正与成绩查询和数据录入相关的类是 DataManager 类,它分装了 8 个方法,这些方法均与成绩查询和数据录入相关。(二) 编写 DBConnect.java。该类主要负责与数据库的交互,其中的两个方法 executeQuery(String sql)和executeUpdate(String sql)负责执行 SQL 语句。import java.sql.*;public
4、class DBConnectprivate String url = “jdbc:odbc:chang“;private Connection conn = null;private Statement stmt = null;public DBConnect() try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“);conn = DriverManager.getConnection(url,“sa“,“);stmt = conn.createStatement(); catch (Exception e) System.err.print(“
5、Error“ + e.getMessage();public ResultSet executeQuery(String sql) ResultSet rs = null;try rs = stmt.executeQuery(sql); catch (SQLException e) System.err.print(“Error“ + e.getMessage();return rs;public int executeUpdate(String sql) int update = 0;try update = stmt.executeUpdate(sql);mit(); catch (SQL
6、Exception e) System.err.print(“Error“ + e.getMessage();return update;public void close() try stmt.close();conn.close(); catch (SQLException e) System.err.print(“Error“ + e.getMessage();(三) 编写 DataManagerImpl.java。 该类是最为重要的一个类,他的主要功能是实现 Datamanager 中的所有方法,由于具体代码很多,只列举其中之一。 public String lookup_2(Stri
7、ng stu_id, String course_name) String result = “;ResultSet rs = null;try /第一步:查询学号为 stu_id 的学生是否存在。String sql = “SELECT 姓名 FROM 学生 WHERE 考试证号=“+ stu_id + “;String stu_name = null;rs = db.executeQuery(sql);if (rs.next() stu_name = rs.getString(“姓名“); else result = “Sorry,I cant find “ + stu_id;return
8、 result;/第二步:查询科目名称为 course_name 的科目是否存在。sql = “SELECT 考试科目号 FROM 考试科目 WHERE 科目名称=“ + course_name + “;String cou_id = null;rs = db.executeQuery(sql);if (rs.next() cou_id = rs.getString(“考试科目号“); else result = “Sorry,I cant find “ + course_name;return result;/第三步:成绩查询sql = “SELECT 成绩 FROM 考试成绩 WHERE
9、考试证号=“ + stu_id + “ AND 考试科目号 =“ +cou_id + “;String score = null;rs = db.executeQuery(sql);if (rs.next() score = rs.getString(“成绩“); else result = “Sorry,student “ + stu_id +“do not have achievemet about “ + course_name;return result;/第四步:输出result = stu_name + “ “ + course_name + “ “ + score; catch
10、(Exception e) e.printStackTrace();return result;(四) 编写 Server.java 并进行编译,命令为 vbjc Server.java该方法的主要作用是实例化一个 DataManagerImpl 对象,并将改对象放入 POA 上,等待客户端通过 ORG 对其进行调用。import org.omg.PortableServer.*;public class Serverpublic static void main(String args)try org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(ar
11、gs, null);POA rootPOA = POAHelper.narrow(orb.resolve_initial_references(“RootPOA“);org.omg.CORBA.Policy policies =rootPOA.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);POA myPOA = rootPOA.create_POA(“DataManagerPOA“,rootPOA.the_POAManager(), policies);DataManagerImpl managerServant =new Dat
12、aManagerImpl();myPOA.activate_object_with_id(“DataManager“.getBytes(), managerServant);rootPOA.the_POAManager().activate();System.out.println(“DataManager 已就绪 .n“);orb.run(); catch(Exception exc) exc.printStackTrace();(五) 编写 Client.java 并编译, Client 的作用主要是从 ORG 上取得 DataManagerImpl 对象,并调用其中的方法,以便对数据库进
13、行操作。 import java.io.*;public class Client public static void main(String args) try org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);/ 利用 POA 全称与对象标识 “BankManager“查找帐户管理员Student.DataManager manager = Student.DataManagerHelper.bind(orb,“/DataManagerPOA“, “DataManager“.getBytes();BufferedRead
14、er reader = new BufferedReader(new InputStreamReader(System.in);String answer = null;while (true) System.out.println(“请选择您要进行的操作: A-查询操作 B-录入考生信息 C-录入考试成绩 D-退出“);answer = reader.readLine();if (answer.equals(“A“) | answer.equals(“a“) System.out.println(“请选择您要进行的查询方式 “);System.out.println(“ 1-通过考试证号查询
15、所有科目成绩“);System.out.println(“ 2-通过考试证号+科目名称查询某一科目成绩“);answer = reader.readLine();if (answer.equals(“1“) System.out.print(“请输入您想要查找的学生的考试证号:“);answer = reader.readLine();System.out.println(manager.lookup_1(answer); else System.out.print(“请输入您想要查找的学生的考试证号:“);String stu_id = reader.readLine();System.ou
16、t.print(“请输入科目名称:“);String course_name = reader.readLine();System.out.println(manager.lookup_2(stu_id, course_name); else if (answer.equals(“B“) | answer.equals(“b“) System.out.println(“ 请选择您要进行的操作 1-添加 2-删除 3-修改“);answer = reader.readLine();if (answer.equals(“1“) System.out.print(“ 添加:请输入你要添加的学生的准考
17、证号:“);String stu_id = reader.readLine();System.out.print(“ 添加:请输入你要添加的学生的姓名:“);String stu_name = reader.readLine();System.out.println(manager.addStudent(stu_id, stu_name); else if (answer.equals(“2“) System.out.print(“ 删除:请输入你要删除的学生的准考证号:“);answer = reader.readLine();System.out.println(manager.delSt
18、udent(answer); else System.out.print(“ 修改:请输入你要修改的学生的准考证号:“);String stu_id = reader.readLine();System.out.print(“ 修改:请输入修改后的学生的姓名:“);String stu_name = reader.readLine();System.out.println(manager.modifyStudent(stu_id,stu_name); else if (answer.equals(“C“) | answer.equals(“c“) System.out.println(“ 请选
19、择您要进行的操作 1-添加 2-删除 3-修改“);answer = reader.readLine();if (answer.equals(“1“) System.out.print(“ 添加:请输入考试证号:“);String stu_name = reader.readLine();System.out.print(“ 添加:请输入科目名称:“);String course_name = reader.readLine();System.out.print(“ 添加:请输入科目成绩:“);String result = reader.readLine();System.out.print
20、ln(manager.addResult(stu_name,course_name, Double.parseDouble(result); else if (answer.equals(“2“) System.out.print(“ 删除:其输入考试证号 :“);String stu_name = reader.readLine();System.out.print(“ 删除:其输入科目名称 :“);String course_name = reader.readLine();System.out.println(manager.delResult(stu_name,course_name)
21、; else System.out.print(“ 修改:其输入考试证号 :“);String stu_name = reader.readLine();System.out.print(“ 修改:其输入科目名称 :“);String course_name = reader.readLine();System.out.print(“ :其输入新的科目成绩 :“);String result = reader.readLine();System.out.println(manager.modifyResult(stu_name,course_name,Double.parseDouble(result); else break; catch (Exception e) System.out.println(“错误:“ + e.toString();(六) 运行智能代理,命令为 osagent(七) 运行 Server, 命令为 start vbj Server(八) 运行 Client, 命令为 vbj Client(九) 根据客户端的要求进行操作即可结论分析与体会:Corba 属于一种比较老的技术,环境配置和运行过程都很麻烦。花费时间的地方不在编程而在配置环境。