首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GUI组织服务器体系结构

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

Stack Overflow用户
提问于 2012-12-03 15:43:51
回答 1查看 183关注 0票数 1

我正在开发一个银行客户-服务器架构。

我想知道什么是最方便的方式来组织服务器端。银行是否需要在同一个文件中充当服务器和GUI?

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

  1. 我的第一个问题是服务器GUI中的JTable。事实上,银行存储了客户以前所做的每一项操作的ArrayList。我编写了一个AbstractTableModel实现,它也存储一个ArrayList。问题是服务器为JTable实例化一个银行和一个JTable。因此,当银行在其ArrayList中添加操作时,TableModel并不知道这一点。我怎样才能把这两者联系起来,而不把TableModel交给银行呢?
  2. 第二个问题涉及到与客户端的连接。当登录/密码正确时,服务器将会话接口传递给客户端。会话包含客户端可以执行的银行操作。如果SessionImpl封装了Bank实例,这是一个安全问题吗?因为在现实中,会话方法调用Bank。会话是客户端和服务器之间唯一的远程对象,但是封装银行给我的印象是客户机可以直接访问银行。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-03 17:12:47

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

解决银行对象变更问题的方法有两种。

( a)使用一种方法假设一个银行对象:

代码语言:javascript
复制
public List<Operation> getOperations();

每次向表模型发出请求时,都可以调用getOperations()。例如:

代码语言:javascript
复制
public Object getValueAt(int row, int column) {
  return bank.getOperations().get(row)...
}

这是一个缓慢,但一个简单的方式来获得更新。

( b)以更复杂的方式,当向银行添加新的操作时,您将在Bank对象中使用AbstractTableModel寄存器来接收事件。这看起来应该是:

代码语言:javascript
复制
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)...
  }
}

这方面的问题是,RMI没有为服务器提供与客户端对话的机制,因此服务器和客户端都需要成为RMI端点。见RMI Events

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

我将摆脱会话对象,直接返回Bank对象。如果要将所有调用转发给Bank对象,那么您实际上只是想直接与Bank对象交互。在一个更复杂的系统中,您可能有合理的理由添加代理或外观层,但在这种情况下,我会保持简单。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13686681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档