gpt4 book ai didi

java - 客户端服务器应用程序的设计模式

转载 作者:行者123 更新时间:2023-11-29 08:48:31 24 4
gpt4 key购买 nike

我们在 GWT 中有一个客户端服务器应用程序。来自客户端浏览器的用户将获得所提供服务的选项。

我想通过单个 RPC(远程过程调用)方法发送所有请求。这意味着我将发送一个字符串,代表服务,服务器将接收此字符串并返回结果。

现在,由于这将通过单个 RPC 请求,我只能选择向客户端返回单一类型的结果,并且它必须是可序列化的(不能返回 java 对象)。

例如,用户可能想要 Users ,应用程序将返回用户对象列表,或者用户可能想要交易,服务器将返回交易对象列表,或者将来用户可以请求 Apple 和服务器将返回一个字符串。

想要收集所有服务并将其置于策略或命令模式下,但每个服务都可以返回不同的类型,我该如何解决这个问题?或者你们认为哪种模式最好?

我能想到的最好的事情是有一个 Wrapper 对象,它将包含所有服务的所有不同返回类型,在服务器上设置它,并在客户端上获得结果,但它看起来有点乱。

感谢任何建议。

请注意服务器执行 Java 代码 (Servlet),所以这是一个 Java 问题,客户端基本上是 Java,但有一些限制,因为 GWT 在编译时将其转换为 JavaScript。

谢谢。

最佳答案

在我们的项目中,我们已经完成了您正在寻找的事情:一个单一的 RPC 函数,它将包装的请求传输到服务器,服务器执行相应的代码,然后再次将结果返回给客户端。其中有多少是臭代码——我不确定。但这里是我们所做工作的简要总结:

RPC函数:

public <P extends Command<R>, R extends CommandReturnValue> R execute(P command) throws SharedException;

哪里Command<T extends CommandReturnValue>CommandReturnValue是扩展 com.google.gwt.user.client.rpc.IsSerializable 的空接口(interface).每个命令实现都有其对应的 CommandReturnValue 实现,它可以包装任何 GWT 可序列化的对象。

CommandReturnValue 示例:

public class SaveCommandReturnValue implements CommandReturnValue{

private String errorMessage;

// getter and setter and other important information to return

}

示例对应命令:

public class SaveCommand implements Command<SaveCommandReturnValue>{

private List<String> stringsToSave;

// other serializable fields and their getters + setters

}

RPC 函数的服务器端实现然后根据命令类分派(dispatch)调用。在我们的例子中,我们为每个命令都有一个实现类(实现 CommandImplementation<T extends Command, U extends CommandReturnValue> )。

示例实现:

public class SaveCommandImpl implements CommandImplementation<SaveCommand, SaveCommandReturnValue>{

@Override
public SaveCommandReturnValue execute(SaveCommand command){

// code to save whatever the command says to save
}
}

我们在服务器端使用 Spring,因此将实现注册为 Spring-bean 并使用 Spring-bean-name 注释命令是一件简单的事情。调度程序首先在传入命令中搜索 Spring-bean-name 注释,从应用程序上下文中获取正确的 CommandImplementation-bean,然后调用该 bean 的“执行”方法。

关于java - 客户端服务器应用程序的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com