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

时间:2014-05-28 00:10:34

标签: java gwt design-patterns client-server rpc

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

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

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

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

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

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

感谢任何建议。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

在我们的项目中,我们完全按照您的要求进行操作:单个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的空接口。每个命令实现都有其相应的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函数的服务器端实现然后根据命令类调度调用。在我们的例子中,我们为每个命令都有一个实现类(实现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名称注释Command是一件简单的事情。调度程序首先在传入的命令中搜索Spring-bean-name注释,从应用程序上下文中获取正确的CommandImplementation-bean,然后调用bean执行&#39;执行&#39;方法