Java 如何使用GUI组织服务器体系结构

Java 如何使用GUI组织服务器体系结构,java,jtable,client-server,abstracttablemodel,Java,Jtable,Client Server,Abstracttablemodel,我正在开发一个银行客户机-服务器体系结构 我想知道组织服务器端最方便的方式是什么。 银行是否需要成为同一文件中的服务器和GUI 因为目前我有一个实例化银行的服务器GUI。这家银行有一份客户名单,每个客户都有几个账户 我的第一个问题涉及服务器GUI中的JTable。事实上,银行存储了客户以前所做的每一项操作的ArrayList。我编写了AbstractTableModel的一个实现,它还存储了一个ArrayList。问题是服务器实例化了银行和JTable的TableModel。因此,当银行在其Ar

我正在开发一个银行客户机-服务器体系结构

我想知道组织服务器端最方便的方式是什么。 银行是否需要成为同一文件中的服务器和GUI

因为目前我有一个实例化银行的服务器GUI。这家银行有一份客户名单,每个客户都有几个账户

  • 我的第一个问题涉及服务器GUI中的JTable。事实上,银行存储了客户以前所做的每一项操作的ArrayList。我编写了AbstractTableModel的一个实现,它还存储了一个ArrayList。问题是服务器实例化了银行和JTable的TableModel。因此,当银行在其ArrayList中添加操作时,TableModel没有意识到这一点。我如何在不向银行提供TableModel的情况下将这两个链接起来

  • 第二个问题涉及与客户端的连接。当登录/密码正确时,服务器将会话接口传递给客户端。会话包含客户端可以执行的银行操作。如果SessionImpl封装银行实例,是否存在安全问题?因为在现实中,会话方法调用Bank方法。会话是客户端和服务器之间唯一的远程对象,但封装银行给我的印象是,客户端可以直接访问银行

  • 1) 您希望您的AbstractTableModel在构造函数中接受Bank对象。AbstractTableModel方法然后委托给银行对象上的底层操作列表

    有两种方法可以解决银行对象发生变化时的问题

    a) 假设银行对象具有方法:

    public List<Operation> getOperations();
    
    这是一种缓慢但简单的获取更新的方法

    b) 以更复杂的方式,您可以让AbstractTableModel向Bank对象注册,以便在向Bank添加新操作时接收事件。这看起来像:

    public class BankTableModel extends AbstractTableModel {
      private List<Operation> operations;
    
      public BankTableModel(Bank bank) {
        operations = bank.getOperations();
        bank.addOperationEventListener(...);
      }
    
      public Object getValueAt(int row, int column) {
        return operations.get(row)...
      }
    }
    
    公共类BankTableModel扩展了AbstractTableModel{
    私人名单业务;
    公共银行表模型(银行){
    operations=bank.getOperations();
    bank.addOperationEventListener(…);
    }
    公共对象getValueAt(int行,int列){
    返回操作。获取(行)。。。
    }
    }
    
    问题是RMI没有提供服务器与客户端对话的机制,因此服务器和客户端都需要是RMI端点。看

    2) RMI的全部要点是获得驻留在服务器上的远程对象的存根。存根允许您调用远程对象上的方法,就像该对象是本地对象一样。不要担心这个级别的安全性,尤其是在学术环境中

    我会去掉Session对象,直接返回Bank对象。如果您将所有呼叫转发给银行对象,那么您真的只想直接与银行对象交互。在更复杂的系统中,您可能有合理的理由添加代理层或外观层,但在这种情况下,我会保持简单

    3) GUI和服务器应该是两个不同的对象。您的GUI是您的客户机,在您的服务器端应该根本没有GUI代码。

    1)您希望您的AbstractTableModel在构造函数中采用Bank对象。AbstractTableModel方法然后委托给银行对象上的底层操作列表

    有两种方法可以解决银行对象发生变化时的问题

    a) 假设银行对象具有方法:

    public List<Operation> getOperations();
    
    这是一种缓慢但简单的获取更新的方法

    b) 以更复杂的方式,您可以让AbstractTableModel向Bank对象注册,以便在向Bank添加新操作时接收事件。这看起来像:

    public class BankTableModel extends AbstractTableModel {
      private List<Operation> operations;
    
      public BankTableModel(Bank bank) {
        operations = bank.getOperations();
        bank.addOperationEventListener(...);
      }
    
      public Object getValueAt(int row, int column) {
        return operations.get(row)...
      }
    }
    
    公共类BankTableModel扩展了AbstractTableModel{
    私人名单业务;
    公共银行表模型(银行){
    operations=bank.getOperations();
    bank.addOperationEventListener(…);
    }
    公共对象getValueAt(int行,int列){
    返回操作。获取(行)。。。
    }
    }
    
    问题是RMI没有提供服务器与客户端对话的机制,因此服务器和客户端都需要是RMI端点。看

    2) RMI的全部要点是获得驻留在服务器上的远程对象的存根。存根允许您调用远程对象上的方法,就像该对象是本地对象一样。不要担心这个级别的安全性,尤其是在学术环境中

    我会去掉Session对象,直接返回Bank对象。如果您将所有呼叫转发给银行对象,那么您真的只想直接与银行对象交互。在更复杂的系统中,您可能有合理的理由添加代理层或外观层,但在这种情况下,我会保持简单


    3) GUI和服务器应该是两个不同的对象。您的GUI是您的客户机,服务器端不应该有GUI代码。

    您在服务器上使用的是哪种技术(EJB、servlet或其他)?为什么选择将一些对象放在单独的层上?我使用的是RMI。你说的独立层是什么意思?RMI是一种非常低级的API,是实现客户机-服务器应用程序的更复杂的方法之一。我试图弄明白你为什么选择这项技术,以及你希望从中获得什么。也许你想学习RMI,这是一个有效的动机。如果你能帮助我们理解你为什么要走这条路,或者你想完成什么,那么你会得到更好的答案。其实这是一个学术项目。我必须使用RMI实现银行客户机-服务器体系结构。我想通过编写Server/Bank/Customer/Account来尊重OOP原则,但似乎我更愿意将Server和Bank合并。服务器GUI是否可以与服务器本身位于同一文件中?或者最好将服务器GUI和服务器拆分为两个CLA