基于RMI技术的数据库操作中间件设计 综合实践报告

前言

1.1  实践目的和要求

为了将理论用于实践,巩固所学知识,提高自己发现问题并用所学知识分析问题和解决问题的能力,锻炼自己的工作能力,适应社会能力,自我管理能力,了解目前软件的应用情况,需求情况,发展方向及前景。

要求:

要求在实习过程中认真学习技术知识,能够理解当天的内容。对技术的理论知识要及时实践,认真完成项目要求的内容,探讨项目的解决方案以及进展。

 

 

二、实践内容

2.1  实践过程

过程主要分为以下三个阶段:

第一周:查阅资料,完成项目需求,撰写需求分析报告。

第二周:进行系统总体设计,划分功能模块,选择技术方案,撰写系统概要说明书。

第三周:进行系统详细设计和实现,并撰写详细设计说明书。

第四周:整合各功能模块,进行联调,并根据系统设计指标进行测试,完成整个系统开发,提交设计报告文档,进行成果展示和答辩。

 

2.2  实践内容

为数据库应用(如JSP,即RMI客户端),提供一个“数据库操作中间件”(RMI服务)。该中间件通过接口为应用提供增加记录、修改记录、删除记录和查询操作。Web应用(JSP)中增、改、删操作不用再书写SQL语句,而只专注于页面风格和操作逻辑,从而即使一个没学过数据库操作的程序员经过简单培训也能设计出操作数据库的应用;此外所有针对数据的操作都封装在RMI服务端,出现问题容易厘清问题原因。

 

 

4 软硬件平台

软件与硬件

最低配置

推荐配置

管理员端运行环境

网络浏览器(IE6及以上)

最新版火狐浏览器

服务器操作系统

Win7

Win10

服务器JDK

JDK1.7

最新JDK

服务器CPU

双核3.2GHz及以上

四核3.2GHz及以上

服务器网络

以太网3Mbps及以上

以太网10Mbps及以上

客户端CPU

双核1.6GHz及以上

双核3.2GHz及以上

 

 

2.3  主要成果

1.1.2各个阶段的时间进度大致安排

第一阶段:进行需求的分析和数据库的设计,完成了需求说明文档,并对项目的工作量进行了评估,确定了小组分工以及时间进度表。

第二阶段:完成了数据库的编写和约束的创建,完成了概要设计文档,每个人的分工进行了进一步的细化,同时统一了代码编写环境。

第三阶段:编写并整合详细设计文档,开始具体功能的编写。

第四阶段:配合小组对项目进行了整合。

1.2各阶段工作任务分解

阶段名称

任务名称

任务描述

  

第一阶段

需求分析

任务分配

1 完成需求分析文档

2 为队员分配任务

3 设计任务进度表

  

第二阶段

统一开发环境

统一数据库

前端编写

1 完成数据库的编写和约束的创建

2 完成前端界面

  

第三阶段

编写代码

1 完成项目具体功能的实现

2 整合项目

  

第四阶段

整合项目

1 测试项目

2 整理文档

3 PPT制作

  

2需求分析

2.1概述

为数据库应用(如JSP,即RMI客户端),提供一个“数据库操作中间件”(RMI服务)。该中间件通过接口为应用提供增加记录、修改记录、删除记录和查询操作。Web应用(JSP)中增、改、删操作不用再书写SQL语句,而只专注于页面风格和操作逻辑,从而即使一个没学过数据库操作的程序员经过简单培训也能设计出操作数据库的应用;此外所有针对数据的操作都封装在RMI服务端,出现问题容易厘清问题原因。

2.2数据库操作中间件主要功能

基本功能1:RMI服务端数据库连接接口。该接口可使“数据库操作中间件”连接当前主流的数据库,如Oracle、SQLServer、MySQL、Access等;参数要求:指示数据库类型,数据库相应的连接参数。 设计接口并实现该接口。

基本功能2:RMI服务端数据库查询语句接口。该接口传入组装好的字符串型的SQL查询语句,返回参数为字符串数组,该数组代表查询的结果。

基本功能3:RMI服务端数据库操纵语句接口。该接口传入参数为哈希表,哈希表中记录了查询的表名、字段名、操纵语句类型标志等;传出参数为成功和失败的布尔值。针对哈希表中的这些信息

  1. 多类型(insert、update、delete)操纵语句的自动拼装;
  2. 根据表名自动获取数据类型,从而在拼装SQL语句时决定数值是否加单引号;
  3. 提供事务确认和回滚处理;
  4. 操纵语句需要可带上where条件。
  5. 评价:进行主表(如学生信息表)、从表(学生消费流水表)的操作。

功能4:基于功能2,每个查询Web页面都对应一个JSP页面,这个JSP页面充当RMI客户端,获得查询记录;将页面浏览操作封装在中间件中,从而实现对单表记录分页面的浏览操作;在浏览页面的同时可选择记录进行删除或切换到修改页面,可切换到增加记录页面。

功能5:所有对记录增加、修改和删除的的Web页面都提交给一个“统一JSP”进行集中处理,这个JSP将充当RMI客户端角色,

2.3主要约束

1.需要提供相应的JSP应用来验证中间件效果增加、修改、删除、查询操作效果。

2.数据库类型支持当今主要流行的数据库。

 

3设计与实现

3.1概述

第一步定义远程接口和远程接口方法:ConnInterface.java

第二步实现远程接口和远程接口方法:Conn.java

第三步启动RMI注册服务并进行对象注册:ConnServer.java

第四步查找远程对象并调用远程方法:ConnClient.java

第五步在需要使用远程方法的*.jsp文件中用usebean动作实现ConnClient类对象,使用远程方法。

3.2设计要点

1.需要提供一个典型的“B/S(浏览器服务器)+RMI”设计架构。

2.需要制定相应的统一规则,规定Web页面中的字段命名,能识别主关键字、表名称以及执行动作,从而在进行数据表增、改、删操作提交给统一JSP时,具有完整的语义含义。

3. 统一JSP提供哈希表结构收集提交的字段名称和值对、表名对、增删改动作对。

4.JSP中的RMI客户端可以以类的形式或bean的形式来充当。

5.以给定的RMI的DEMO为例,扩展出相应的数据库操纵中间件。

3.3 主要程序文件

定义远程接口和远程接口方法:

ConnInterface.java

public interface ConnInterface extends Remote{

    public Connection getMySQLConnect(String root,String pass) throws RemoteException;

    public  ResultSet executeQuery(String sql) throws RemoteException;

    public void executeUpdate(String sql) throws RemoteException;

}

实现远程接口和远程接口方法

Conn.java

以实现连接数据库为例

public Connection getMySQLConnect(String root,String pass) throws RemoteException

       {

              //连接MySQL数据库的方法

              Connection con=null;

              String driverName="com.mysql.cj.jdbc.Driver";

              String userName=root;

              String userPasswd=pass;

              String conURL="jdbc:mysql://localhost:3306/dbstudent?serverTimezone=GMT%2B8";

              try

              {

                     Class.forName(driverName);

                     System.out.println("Success loading MySQL Driver!");

              }

              catch(ClassNotFoundException e)

              {

                     System.out.println("Error loading MySQL Driver!");

              }



              try

              {

                     //连接数据库

       con=DriverManager.getConnection(conURL,userName,userPasswd);

                     System.out.println("Success linking MySQL Driver!");

              }

              catch(SQLException e)

              {

                     System.err.println(e.getMessage());

              }

              return con;

       }

启动RMI注册服务并进行对象注册

ConnServer.java

以连接数据库方法为例

LocateRegistry.createRegistry(1099);

ConnInterface Conn = new Conn();

Naming.rebind("conn",Conn);

查找远程对象并调用远程方法

ConnClient.java

以实现连接数据库方法为例

public Connection Conn(String root,String pass){

              Connection con=null;

              try{

                     ConnInterface conn=(ConnInterface)Naming.lookup("conn");

                    

                     //调用远程方法

                    

                     con=conn.getMySQLConnect(root,pass);

                    

              }

              catch(Exception e)

              {

                     System.out.println("ConnClient exception: " + e); 

              }

              return con;

       }

在需要使用远程方法的*.jsp文件中用usebean动作实现ConnClient类对象,使用远程方法。

MySQL.jsp

以实现连接数据库为例

<jsp:useBean id="Conn" scope="page" class="conn.ConnClient"/>

<%

String user=request.getParameter("username");

String pass=request.getParameter("password");

Conn.Conn(user,pass);

out.print("MySQL数据库连接成功!");

%>

 

4.1.1数据库连接功能

(1)

6df0d6b1b27442fbb12f66f5d361d481.png

(2) 

 

26d73c7592e64eb88060f287971f28b9.png

(3)

9127e98f43184d009e827f7c00cbd6da.png

4.1.2案例展示

50d587950b824b4ca3c8d11eb7094e2b.png

4.1.3 增加

 

72b4d8ba531e426084788a8c93bd6ff2.png

4.1.4编辑

(1)

68c51f5f4de64ee494221f2062feda6c.png

(2)

e7ec827aaee84beda486af01bec0ea94.png

a499a71227f54501b243f42265f138f0.png

4.1.6查找

(1)

a239385661064874b7491b893afb4354.png

 

(2)

 

 

a6b4002aacb24ccd914d4cde572a9c7d.png

4.1.6数据库操纵语句

d4f165082e5a4c7aaf395b4624d13e49.png

 

 

三、总结

3.1  个人心得

完成了自己的任务,熟悉了RMI相关技术的使用,从一个项目的初期开始完成一个项目,体验了项目开发的整个流程。需求分析在一个项目中是非常重要的,后期的所有工作都在围绕着需求分析来做。后期编写类的函数和成员,要根据前期编写的项目概要设计和详细设计来编写。期间出现了许多编程方面的细节问题。

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
web报表工具 请移步:http://download.csdn.net/source/2881508 不多说,除了RMI的学习外,gui对新手入门也是个不错的学习 /* *此类适合在本地注册的RMI服务器,避免了使用了多个DOS的写法,只需要简单的给使用 *本类提供的方法即可。 */ package common.rmiserver; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.Remote; import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; //import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.server.UnicastRemoteObject; import common.zip.ZipClientSocketFactory; import common.zip.ZipServerSocketFactory; public final class RMIServer { private Registry registry = null; // @jve:decl-index=0: private String serverName = "RMIServer"; private String serverPath = "localhost"; private int port = 1099; private Remote serverInterface = null; private Boolean isStart = false; private AllFace dataAllFace = null; private int dataPort = 0;// 数据端口,0表示端口由RMI服务器动态生成. private Remote stub; public RMIServer() { } /* * 使用默认端口,默认服务器名称,服务路径构造函数 use the default port,server name and the url */ public RMIServer(Remote obj) { this.serverInterface = obj; } /* * 使用默认端口,服务路径构造函数 use the default port and server url */ public RMIServer(String servername, Remote obj) { this.serverName = servername; this.serverInterface = obj; } /* * 服务器为默认值的构造函数 use the default url */ public RMIServer(String servername, int port, Remote obj) { this.port = port; this.serverName = servername; this.serverInterface = obj; } /* * 适合1.4范围的版本,当然也适合5.0的版本 */ public Boolean setStart() throws RemoteException, MalformedURLException, NotImplementInterfaceException { if (registry == null) registry = LocateRegistry.createRegistry(port); if (serverInterface == null) { throw new NotImplementInterfaceException( "not found the reote interface method!!"); } Naming.rebind("rmi://"+serverPath + ":" + port + "/" + serverName, serverInterface); isStart = true; return isStart; } /* * jdk5.0以后的写法,在使用之前使用setXxx方法给对象赋值 */ public Boolean start() throws RemoteException, MalformedURLException, NotImplementInterfaceException { if(stub==null) stub = (Remote) UnicastRemoteObject.exportObject(dataAllFace, dataPort);// 0表示端口随机生成. if (registry == null) registry = LocateRegistry.createRegistry(port, new ZipClientSocketFactory(), new ZipServerSocketFactory()); setProperty(serverPath); //绑定IP registry.rebind(serverName, stub); isStart = true; return isStart; } /* * 如果有多个ip,则使用这个方法绑定指定的IP */ public void setProperty(String ip) { System.setProperty("java.rmi.server.hostname", ip); } /* * close the server */ public void close() throws RemoteException, MalformedURLException, NotBoundException { //UnicastRemoteObject.unexportObject(dataAllFace, true); Naming.unbind("rmi://"+serverPath + ":" + port + "/" + serverName); isStart = false; } /* * set server name,if not set the name,the service will use the default name * "RMIServer" */ public void setServerName(String serverName) { this.serverName = serverName; } /* * set the server URL,default localhost "rmi://localhost" */ public void setServerPath(String serverPath) { this.serverPath = serverPath; } /* * set the server port default port is 1099. */ public void setPort(int port) { this.port = port; } /* * set then remote implement method */ public void setServerInterface(Remote serverInterface) { this.serverInterface = serverInterface; } /* * set the server Security */ public void setSecurityManager() { /* if (System.getSecurityManager() == null) { try { // java -Djava.security.policy=policy.txt // common.rmiserver.RMIServer System.setSecurityManager(new RMISecurityManager());// 暂时不要安全设置, } catch (java.rmi.RMISecurityException exc) { throw exc; } }*/ } /* * set the remote method */ public void setDataAllFace(AllFace dataAllFace) { this.dataAllFace = dataAllFace; } /* * set the remote dataport */ public void setDataPort(int dataPort) { this.dataPort = dataPort; } // ----------------------------------------------- /* * return the server URL */ public String getServerPatth() { return serverPath; } /* * return remote method */ public Remote getserverInterface() { return serverInterface; } /* * return the server name */ public String getServerName() { return serverName; } /* * return the server use port */ public int getPort() { return port; } /* * return the server then action state */ public Boolean isStart() { return isStart; } /* * return remote method */ public AllFace getDataAllFace() { return dataAllFace; } /* * return remote dataport */ public int getDataPort() { return dataPort; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hinomoto Oniko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值