建立,打包,部署及运行Duke 银行应用程序

建立,打包,部署及运行Duke 银行应用程序 
作者:Jimsons
目录
1. 准备工作...
2.    启动服务器...
2.1创建银行数据库...
2.2捕获数据库模式...
2.3创建JDBC数据源...
2.4 将用户和组添加到file域...
3. 编译Duke银行应用程序代码...
4. 打包并部署Duke银行应用程序...
4.1 打包企业Beans.
4.2 打包应用程序客户端...
4.3 打包Web客户端...
4.4 打包并部署应用程序...
5. 运行应用程序客户端Application Client
6. 运行Web客户端...
7. 关于例子源代码中的错误更正...
7.1 NextIdBean代码中的错误...
7.2 Web模块中的错误...
8. 参考资料...   
 
1. 准备工作
假设你的计算机中已经安装了J2EE 1.4 SDK,在建立DUKE银行应用程序之前,你必须到 http://java.sun.com/j2ee/1.4/download.html #tutorial下载j2eetutorial压缩包并将其解压缩,假定你解压的路径为 <INSTALL>/j2eetutorial14,打开例子的配置文件 <INSTALL>/j2eetutorial14/examples/common/build.properties
l         将j2ee.home的值设为你应用程序服务器(Application Server)的安装位置,例如你的应用程序服务器安装在C:/Sun/AppServer,那么你应该设置如下: j2ee.home=C:/Sun/AppServer
l         将j2ee.tutorial.home  的值设置为你j2eetutorial的安装位置,例如: j2ee.tutorial.home=C:/j2eetutorial14
l         假如你安装应用程序服务器的时候管理员的用户名不是用默认的admin,那你要将admin.user的值改为你设置的用户名
l         假如你安装应用程序服务器时不是用默认的8080端口,则要将domain.resources.port的值改为你设置的端口.
l         将<INSTALL>/j2eetutorial14/examples/common/admin-password.txt文件中AS_ADMIN_PASSWORD的值设为你安装应用程序服务器时设置的管理员密码,如: AS_ADMIN_PASSWORD=yourpassword
你必须先启动PointBase数据库服务器并且向数据库中添加客户和帐号的资料,你还要向应用程序服务器中添加一些资源, 最后你才能开始打包,部署和运行例子.
2.1创建银行数据库
你必须先创建数据库并向数据表中输入数据,然后企业Bean才能从中读取或向其中写入数据,请根据以下步骤来创建数据表并输入数据:
1.       启动PointBase数据库服务器
2.       打开命令行,转到<INSTALL>/j2eetutorial14/examples/bank/目录下,执行命令asant create-db_common, 这条命令调用PointBase终端工具库执行<INSTALL>/j2eetutorial14/examples/bank/sql/create-table.sql中的SQL语句, 这些SQL语句的功能是先删除所有已经存在的表并创建新表并向表中插入数据, 因为第一次运行这些语句时这些表并不存在, 所以你会看到一些SQL错误信息,你可以忽略不理这些错误信息.
2.2捕获数据库模式
在创建表并输入数据之后,你可以捕获表间的结构并保存到一个模式文件中,请通过以下步骤来捕获模式:
1.       打开命令行并切换到<INSTALL>/j2eetutorial14/examples/bank/目录
2.       执行以下命令asant capture-db-schema , 执行此命令后生成模式文件<INSTALL>/j2eetutorial14/examples/bank/build/dukesbank.dbschema
2.3创建JDBC数据源
Duke银行的企业Bean用JNDI名jdbc/BankDB来引用数据库,请执行以下步骤:
1.       打开管理终端页面 http://localhost:4848/asadmin
2.       展开JDBC分支,选择JDBC Resources, 选择 New
3.       将其命名为jdbc/BankDB并将它映射到 PointBasePool
2.4 将用户和组添加到file域
将用户和组添加到file安全域后,应用程序服务器就能判断哪些用户能访问Web客户端的企业Bean的方法和资源,添加的步骤如下:
1.       打开管理终端页面 http://localhost:4848/asadmin
2.       展开Configuration分支并展开Security分支
3.       展开Realms分支并选中file域
4.       点击Manage Users并点击New
5.       根据下表输入Duke银行的用户和组
User
Password
Group
200
j2ee
bankCustomer
bankadmin
j2ee
bankAdmin
 
3. 编译Duke银行应用程序代码
打开命令行,转到<INSTALL>/j2eetutorial14/examples/bank/目录,执行命令asant build ,这个命令就编译了企业Bean,应用程序客户端和Web客户端的全部代码,编译后的代码位于<INSTALL>/j2eetutorial14/examples/bank/build目录下.
4. 打包并部署Duke银行应用程序
以下过程假设你对用部署工具打包企业Bean, 应用程序客户端和Web应用程序的过程都比较熟悉,下面介绍如何打包并部署Duke银行(如果你按照以下步骤做了之后,部署或运行此应用程序还存在问题,那你可以用我们在<INSTALL>/j2eetutorial14/examples/bank/provided-jars/ 目录下提供的EAR文件即打包好的文件来部署和运行这个例子)
4.1 打包企业Beans
1.       创建一个EJB JAR模块并命名为DukesBankEJBJAR ,将其保存到<INSTALL>/j2eetutorial14/examples/bank/目录下.
2.       添加<INSTALL>/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的ejb和util包, 还有 <INSTALL>/j2eetutorial14/examples/bank/build/目录下的dukesbank.dbschema文件.
3.       创建实体Beans(选择添加到DukesBankEJBJAR中)
a. 用企业Bean向导创建下面每个表格中的CMP2.0 (容器管理持久性) 企业bean:
 
AccountBean 的设置如下表 :
Setting
Value
Local Home Interface
LocalAccountHome
Local Interface
LocalAccount
Persistent Fields
accountId, balance, beginBalance, beginBalanceTimeStamp, creditLine, description, type
Abstract Schema Name
AccountBean
Primary Key Class
Existing field accountId
CustomerBean 的设置如下表 :
 
Setting
Value
Local Home Interface
LocalCustomerHome
Local Interface
LocalCustomer
Persistent Fields
city, customerId, email, firstName, lastName, middleInitial, phone, state, street, zip
Abstract Schema Name
CustomerBean
Primary Key Class
Existing field customerId
TxBean 的设置如下表 :
 
Setting
Value
Local Home Interface
LocalTxHome
Local Interface
LocalTx
Persistent Fields
amount, balance, description, timeStamp, txId
Abstract Schema Name
TxBean
Primary Key Class
Existing field txId
NextIdBean 的设置如下表 :
 
Setting
Value
Local Home Interface
LocalNextIdHome
Local Interface
LocalNextId
Persistent Fields
beanName, id
Abstract Schema Name
NextIdBean
Primary Key Class
Existing field beanName
 
4. 根据下表建立实体bean的关系:
 
Multi-plicity
Bean A
Field Referencing Bean B and Field Type
Bean B
Field Referencing Bean A and Field Type
*:*
AccountBean
customers, java.util.Collection
CustomerBean
accounts, java.util.
Collection
1:*
AccountBean
none
TxBean
account
 
b. 在Sun-specific SettingsàCMP Database 对话框
1.       将JNDI名字命名为jdbc/BankDB
2.       点击Create Database Mappings,选中Map to Tables in Database Schema File并从下拉列表中选择dukesbank.dbschema,如下图所示
 
3.       每选择一个企业bean,下方就会显示持久域的映射, 请确认那些域和关系.
c. 根据下表为finder设置EJB QL查询语句
 
Duke 银行中的finder 查询
Enterprise Bean
Method
EJB QL Query
AccountBean
findByCustomerId
select distinct object(a)
from AccountBean a, in (a.customers) as c
where c.customerId = ?1
CustomerBean
findByAccountId
select distinct object(c)
from CustomerBean c, in (c.accounts) as a
where a.accountId = ?1
CustomerBean
findByLastName
select object(c)
from CustomerBean c
where c.lastName = ?1
TxBean
findByAccountId
select object(t)
from TxBean t
where t.account.accountId = ?3
and (t.timeStamp >= ?1 and t.timeStamp <= ?2)
d. 在NextIdBean的Transaction标签中,将 NextIdBean.getNextId 方法的Transaction Attributes属性设置为Requires New.
 
5. 调用企业Bean向导创建下表中的stateful session beans(即有状态会话bean)
 
Session Bean
Home Interface
Remote Interface
Implementation Class
Account
ControllerBean
Account
ControllerHome
Account
Controller
AccountControllerBean
Customer
ControllerBean
Customer
ControllerHome
Customer
Controller
CustomerControllerBean
TxControllerBean
TxControllerHome
TxController
TxBean
    
a.       根据下表列出的添加session beans 到local entity beans 的EJB references即EJB引用.
 
EJB References in AccountControllerBean
Coded Name
EJB Type
Interfaces
Home Interface
Local Interface
Enterprise Bean Name
ejb/account
Entity
Local
Local
AccountHome
LocalAccount
AccountBean
ejb/
customer
Entity
Local
Local
CustomerHome
LocalCustomer
CustomerBean
ejb/nextId
Entity
Local
Local
NextIdHome
LocalNextId
NextIdBean
EJB References in CustomerControllerBean
Coded Name
EJB Type
Interfaces
Home Interface
Local Interface
Enterprise Bean Name
ejb/customer
Entity
Local
Local CustomerHome
Local
Customer
CustomerBean
ejb/nextId
Entity
Local
Local
NextIdHome
Local
NextId
NextIdBean
EJB References in TxControllerBean
Coded Name
EJB Type
Interfaces
Home Interface
Local Interface
Enterprise Bean Name
ejb/account
Entity
Local
Local
AccountHome
Local
Account
AccountBean
ejb/
tx
Entity
Local
Local
TxHome
LocalTx
TxBean
ejb/nextId
Entity
Local
Local
NextIdHome
Local
NextId
NextIdBean
 
b.       将所有session bean的Transaction Management设置为Container-Managed即容器管理
6.       保存这个模块
 
4.2 打包应用程序客户端
       1. 调用 Application Client 向导
a.      创建一个应用程序客户端模块,将它命名为DukesBankACJAR并把它保存到<INSTALL>/j2eetutorial14/examples/bank/目录下
b.      添加<INSTALL>/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的appclient, util, ejb/exception包和 ejb/*/*Controller* 即home和远程接口文件(即AccountController, AccountControllerHome, CustomerController, CustomerControllerHome, TxController, TxControllerHome) 到JAR中.
c.       选择appclient.BankAdmin 作为应用程序客户端的main class (主类)
2. 根据下表添加对session bean的EJB 引用
Coded Name
EJB Type
Interface
JNDI Name of Session Bean
ejb/accountController
Session
Remote
AccountControllerBean
ejb/customerController
Session
Remote
CustomerControllerBean
3. 保存这个模块.
4.3 打包Web客户端
1.      通过Web Component向导创建一个web模块,命名为DukesBankWAR并保存到<INSTALL>/j2eetutorial14/examples/bank/目录下,选择Dispatcher 作为Servlet类,其它保持默认.
2.      添加以下内容到web模块中
a.      添加<INSTALL>/j2eetutorial14/examples/bank/build/com/sun/ebank/目录下的web, util, ejb/exception包和 ejb/*/*Controller* 即home和远程接口文件(即AccountController, AccountControllerHome, CustomerController, CustomerControllerHome, TxController, TxControllerHome) 到模块中.
b.      添加<INSTALL>/j2eetutorial14/examples/bank/build/目录下的template目录,所有的jsp页面,所有的WebMessages*.properties文件和tutorial-template.tld文件到模块中.
c.       在添加文件的对话框中将WebMessages*.properties文件从根目录拖到WEB-INF/classes目录下,如下图
 
3.      将context root 设置为 /bank
4.      打开Dispatcher组件的Aliases标签, 添加/accountHist, /accountList, /atm, /atmAck, /main, /transferAck, /transferFunds, and /logoff作为aliases
5.      添加下表列出的session bean对EJB 的引用
Coded Name
EJB Type
Interface
JNDI Name of Session Bean
ejb/accountController
Session
Remote
AccountControllerBean
ejb/customerController
Session
Remote
CustomerControllerBean
ejb/txController
Session
Remote
TxControllerBean
6.      在标签JSP property添加名为bank的组,这个组对应的URL pattern(URL模式)为*.jsp,添加/template/prelude.jspf 到include prelude 中
7.      在Context标签,添加参数名为javax.servlet.jsp.jstl.fmt.localizationContext,值为WebMessages.
8.      在Security标签添加安全控制
a. 选择Form Based作为user authentication方法,在authentication设置中将realm的值设置为file, login page (登录页) 设置为/logon.jsp, error page (错误页)设置为/logonError.jsp.
b. 添加一个security constraint和web resource collection, 用deploytool提供的默认名称
c. 在web resource collection.中添加URL Patterns(URL模式): /main, /accountList, /accountHist, /atm, /atmAck, /transferFunds, 和 /transferAck
d. 选中HTTP方法POST和GET.
e. 添加安全角色(authorized role ) bankCustomer
       9. 保存这个模块
 
4.4 打包并部署应用程序
1.      创建一个J2EE application(J2EE应用程序), 将它命名为DukesBankApp,并保存到<INSTALL>/j2eetutorial14/examples/bank/目录下
2.     添加 DukesBankACJAR 应用程序客户端模块到DukesBankApp
3.     添加DukesBankEJBJAR即EJB模块到DukesBankApp
4.     添加DukesBankWAR即Web模块到DukesBankApp
5.     添加安全角色(security roles) 名为 bankAdminbankCustomer
6.     为企业bean添加以下的安全设置(security settings)
a.     AccountControllerBean: 在Security标签,将方法removeCustomerFromAccount, removeAccount, createAccount, 和 addCustomerToAccount 的限制访问权限的安全角色为bankAdmin ;在General标签, 点击Sun-specific Settings,然后在弹出的对话框中点击IOR, 在Context对话框将Required设置为true, 将realm设置为file.
b.     CustomerControllerBean: 在Security标签,将方法getCustomersOfAccount, createCustomer, getCustomersOfLastName, setName, removeCustomer, 和 setAddress 的限制访问权限的安全角色为bankAdmin ;在General标签, 点击Sun-specific Settings,然后在弹出的对话框中点击IOR, 在Context对话框将Required设置为true, 将realm设置为file.
c.     TxControllerBean :在Security标签,将方法getTxsOfAccount, makeCharge, deposit, transferFunds, withdraw, 和 makePayment 的限制访问权限的安全角色为bankCustomer
7.     如果你还没有启动应用程序服务器(Application Server.)那你现在就启动它.
8.     将bankCustomer角色映射到bankCustomer组
9.     将bankAdmin角色映射到bankAdmin组
10.  保存这个应用程序模块
11.  Deploy(部署)这个应用程序,在部署 kesBankApp 对话框选中Return Client Jar即返回客户端Jar选项.
12.  在deploytool中选中server,将右边出现的bank选中并启动它.
5. 运行应用程序客户端Application Client
请根据以下步骤来运行应用程序客户端:
1.           打开命令行,转到 <INSTALL>/j2eetutorial14/examples/bank/目录下
2.           如果是要运行英文版本的客户端就输入以下命令:        appclient -client DukesBankAppClient.jar
DukesBankAppClient.jar 这个文件是你刚才部署时选中返回客户端JAR而返回的文件.
3.           如果想运行西班牙语版本的客户端则运行以下命令:
appclient -client DukesBankAppClient.jar es
4.           在弹出的登录框中,输入用户名bankadmin密码为 j2ee,然后你就可以看到以下的界面.
 
6. 运行Web客户端
请根据以下步骤来运行Web客户端
1.     请在浏览器中打开地址 http://localhost:8080/bank/main , 如果查看西班牙版本的客户端则只需在浏览器的语言设置中更改.
2.     在登录页面,输入用户名200,密码j2ee并提交.
3.     当你选择Account List,则你会看到以下画面.
 
7. 关于例子源代码中的错误更正
       7.1 NextIdBean代码中的错误
    此错误会造成部署发生错误不能完成,将<INSTALL>/j2eetutorial14/examples/bank/src/com/sun/ebank/ejb/util/目录下的NextIdBean.java文件打开,找到下面这行代码
public Object ejbCreate() throws CreateException {
将方法ejbCreate()的返回类型由Object更改为String,再重新编译,并在deploytool中更新此文件,重新部署即可成功
       7.2 Web模块中的错误
    打开Web客户端,输入用户名密码然后提交可能会抛出javax.servlet.jsp.JspTagException错误,请根据以下步骤进行更正:
        1. 用文本编辑器新建java文档命名为CustomerHackFilter,保存到 <INSTALL>/j2eetutorial14/examples/bank/src/com/sun/ebank/web 目录下,内容如下:
package com.sun.ebank.web;
 
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.ebank.util.Debug;
import com.sun.ebank.web.*;
import java.io.IOException;
 
/**
 * this is a dumb hack.  update 4 seems to broken unless a
 * CustomerBean is placed in the request linked to the BeanManager.
 * Naturally, we need to add a BeanManager to the session here,
 * doing some of the work the dispatcher should have done.
 */
public class CustomerHackFilter  implements Filter
{
    private FilterConfig filterConfig = null;
        public void init(FilterConfig filterConfig)
        throws ServletException
    {
        this.filterConfig = filterConfig;
    }
 
    public void destroy() {
        this.filterConfig = null;
    }
 
    public void doFilter(ServletRequest req, ServletResponse response,
                         FilterChain chain)
        throws IOException,
               ServletException
    {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession        session = request.getSession();
 
        BeanManager beanManager =
            (BeanManager) session.getAttribute("beanManager");
 
        if (beanManager == null) {
            Debug.print("hack - Creating bean manager.");
            beanManager = new BeanManager();
            session.setAttribute("beanManager", beanManager);
        }
 
        CustomerBean customerBean = new CustomerBean();
        customerBean.setBeanManager(beanManager);
        request.setAttribute("customerBean", customerBean);
        Debug.print("hack - added customerBean to request");
 
        chain.doFilter(request, response);
    }
}
   2. 重新编译源代码
   3. 选中DukesBankWAR模块,编辑内容,找到com/sun/ebank/web/ CustomerHackFilter.class,将它添加到包中.
   4. 选中DukesBankWAR模块,在Filter Mapping标签,点击Edit Filter List,在弹出的对话框中点击Add Filter,在Filter Class下拉列表中选中com.sun.ebank.web.CustomerHackFilter,Filter Name为CustomerHack,选择OK
   5. 还是在这个标签在,点击Add,弹出 “Add Servlet Filter Mapping”,在Filter Name下拉列表中选CustomerHack,下面选中 “Filter this Servlet”,选OK,如下图.
   6. 保存这个模块并重新部署运行即可修正错误
8. 参考资料
    [3]. 飞思科技产品研发中心.JSP应用开发详解.电子工业出版社.2004.5
银行系统项目设计文档(详细文档) 编写虚拟社区遇到的困难解决方法 在编码的第一开始,我们就遇到了巨大的难题,分工是很细致了,但是如何来让每个人编写的代码其他人都能用呢? 这时候我们才发现设计和分工不是最难的,最难的是合作,但是我们并不惧怕困难,先考虑各个人编写的代码其他那几个人用得到,自己编码时要用到别人的那些代码,同时个人编码之前先写好Public 类名以需要参数和返回参数。这样别人子要知道如何调用函数就行了。在对数据库操作方面我们也屡屡出错,为此我们到图书馆找来数据库SQL方面的书进行学习。后来,我们在RMI远程调用方面也遇到了问题。使用安全策略文件来设置Java程序权限的问题,通过查找网上资料并向网上的高手请教,我们终于让问题得到了圆满的解决。 代码编完后,我们花了近一半的时间进行整合,使得各自的代码能够互相调用,由于代码方面各人之间必须相互调用,因此,我们不得不一个一个事件驱动,一个一个函数的进行调试,虽然最后出来有一些代码编了没用,有一些代码重复编了,还有一些代码不得不重编,但是我们最后还是圆满实现了设计要求,完成了任务。 虚拟社区结构 本虚拟社区由三部分构成:银行端、服务端、客户端。 银行银行服务器,其界面如下图:  在这个界面上,我们可以查看银行数据库里边各个表的内容。  同时,这个界面提供一个增加帐户和一个删除帐户按钮。  作为提供给专业管理员的界面,我们在里面添加了一个直接输入SQL语言的文本框。  管理员可直接使用数据库语言对数据库进行操作。 而整个银行服务器是由银行类、RMI接口实现类、Mypane类构成: public static void main(String[] args) { // System.setSecurityManager(new RMISecurityManager()); try { BankServerInterfaceImpl obj = new BankServerInterfaceImpl(); registerToRegistry("BankServerInterfaceImpl", obj, true); System.out.println("Bank server " + obj + " registered"); } catch (RemoteException ex) { ex.printStackTrace(); } catch (MalformedURLException ex) { ex.printStackTrace(); } MyPanel applet = new MyPanel(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Bank Server SQL Operator "); frame.getContentPane().add(applet, BorderLayout.CENTER); applet.init(); applet.start(); frame.setSize(700, 500); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); frame.setVisible(true); } public static void registerToRegistry(String name, Remote obj, boolean create) throws RemoteException, MalformedURLException{ if (name == null) throw new IllegalArgumentException( "registration name can not be null"); try { Naming.rebind(name, obj); } catch (RemoteException ex) { if (create) { try{ Registry r = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); r.rebind(name, obj); } catch(Exception e){ System.out.println("Cann\'t rebind! "); System.out.println(e);} } else throw ex; } } public BankServerInterfaceImpl() throws RemoteException{ thebank = new Bank(); } public interface BankServerInterface extends Remote{ public double findBalance(String No,String pin) throws RemoteException; public boolean withdraw (String No,String pin,double num) throws RemoteException; public boolean deposit(String No,String pin,double num) throws RemoteException; public boolean deposit(String No,double num) throws RemoteException; public boolean changepin(String No,String pin,String newpin) throws RemoteException; public boolean findAccount(String No,String pin) throws RemoteException;} 服务端 虚拟社区服务器 该服务器界面跟银行类似,但功能有所不同。 通过两次输入IP,服务器完成与银行的RMI远程连接,同时建立RMI服务器等待客户来调用。 最后,服务器弹出面向虚拟社区管理员的窗口,与银行类似。不同之处在于:  有删除会员按钮但无添加会员按钮。  添加向顾客送出所点菜肴按钮,负责向顾客送菜。  添加增加菜肴按钮,为茶餐馆增加新菜服务。  添加查看茶餐馆任务按钮。 以下是虚拟社区服务器对外的远程对象接口: public interface CommunityServerInterface extends Remote{ public boolean getpermission(String name,String password,String genere)throws RemoteException; public boolean addnewmember(String name,String password,String genere,String Address,String Account)throws RemoteException; public String[] findperson(String name,String password,String genere)throws RemoteException; public String changemessage(String name,String password,String genere,String[] information)throws RemoteException; public double findbalance(String name,String pin)throws RemoteException; public boolean changepin(String No,String pin,String newpin)throws RemoteException; public boolean withdraw(String No,String pin,double num)throws RemoteException; public boolean deposit(String No,String pin,double num)throws RemoteException; public Vector finddatabase(String table,int a,String name) throws RemoteException; public void orderdish(String name,String dish,double num) throws RemoteException; public void bid(String name,String soft,double price) throws RemoteException; public void putin(String name,String soft,String account) throws RemoteException; public void settlesoftware(String name,String soft) throws RemoteException; public void buysoftware(String name,String soft) throws RemoteException; public boolean addsoftware(String soft,String description, String needer,double sellingprice) throws RemoteException; } 客户端 客户端首先跳出的是登陆界面:  登陆界面要求提供用户名、密码、以什么身份登录以服务器端IP地址。  点击登录按钮,如果输入信息正确就可以登录到虚拟社区主界面了。  如果没有用户名,或忘记密码可以点击注册按钮,进入注册界面(IP必须正确)。 它通过IP找到主服务器,并绑定远程对象,以后跳出的窗口都是利用这个IP找到远程对象的。然后,就可以调用远程接口里面的函数,实现与主服务器的通信。 如下面一段代码: 绑定: protected boolean initializeRMI(){ if(url!=null) return true; url = jTextField1.getText(); if(url.equals("default")) url = ""; url = "rmi://"+url+"/"; try{ thecommunity = (CommunityServerInterface)Naming.lookup(url+"CommunityServerInterfaceImpl"); System.out.println("Server object "+thecommunity+" found"); url = jTextField1.getText(); return true;} catch(Exception ex){ System.out.println(url); url = null; System.out.println(ex); JOptionPane.showMessageDialog(null,"Please enter right ID!","ID error",JOptionPane.ERROR_MESSAGE); return false; } } 调用远程方法: private void jButton1ActionPerformed(ActionEvent evt) { try { data = thecommunity.finddatabase("Software", 1, name); } catch (Exception ex) { System.out.println(ex); JOptionPane.showMessageDialog(null, "The internet is busy,please retry letter!", "Link error", JOptionPane.ERROR_MESSAGE);} tbmodel = new TbModel(data, titles1); jTable.setModel(tbmodel); model = 1; jTable.updateUI();} 整体描述 整个虚拟社区是这样设计的:首先运行的是银行服务器,他是银行的管理界面,同时伴随着运行的是他提供远程调用的RMIServer。然后,我们再运行虚拟社区服务器,他要求输入一个连到银行端的IP,这时虚拟社区服务器就运行起来了,它包括:面向管理员的界面、银行远程对象的调用、向客户端提供的远程调用RMIServer。最后,我们就可以在任何一台机子上运行客户端了,只要提供服务器的IP,我们就可以登录到虚拟社区进行相应活动。其中银行的转帐等业务必须通过虚拟社区再传达到银行,这样就使得银行的数据库相当安全。 考虑到,银行和服务器的管理员都是专业人士,我们还特意提供了一个供输入SQL语言并执行的文本域,使他们对数据库的操作非常方便和灵活。 补充:运行服务端银行端时,必须先建VCDB 、BankDB数据源。 软件特色 我们编写的软件有如下特色:  在银行、虚拟社区管理界面,我们提供了输入SQL语言的文本域,使得专业管理员对虚拟社区的管理更有力,更方便,更灵活。  在客户端的背后,我们的金钱流动机制都是要通过虚拟社区代收代发,即从一家用户比如投资公司扣费,转到虚拟社区,到适当时候再转到开发公司(如开发公司交货了),这使得用户在网上的消费更加安全。  在远程通信方面,我们采用的是RMI方式,它比Sockets流更加方便,而且可扩展性非常好,还方便。我们只要改一下IP就可以在任何一台机子上运行服务端,而客户端更是随装随用。  数据库上,我们只允许银行访问和修改,服务器又只有虚拟社区可以调用,用户只能通过虚拟社区进行操作,很好的保护了银行数据的安全。 软件实验心得 通过短学期的这次软件实践,我们小组获益匪浅。利用Java语言开发了这个虚拟社区不在话下。我们最重要的还是学习到了如何学习的能力。刚接到这个问题时,我们还一窍不通,但是通过自己上图书馆找资料、上网搜教程、上网找答案、上网求助等各种方法从无到有,从认识到运用,在老师的帮助下,我们大大提高了运用各种资料学习的能力。 其实,这还不是最重要的。更重要的是,在老师的一再督促下,我们终于实现了多人分工开发软件的任务,其实,多人开发和一个人有很大不同,他要求良好的沟通和合作。在完成任务过程中,我们慢慢掌握了与人沟通合作的能力,有了这种能力,相信以后再大的工程也难不倒我们。
参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

jimsons

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值