GWT + Java:全球,单身和头痛

时间:2010-08-24 17:55:51

标签: java gwt singleton rpc testng

所以这是我的项目:

我正在构建一个中央界面/仪表板,以显示多个产品版本的多种测试类型的测试数据。我们在我们的大型产品上使用TestNG,虽然没有编写足够的测试,但这是另一个主题的讨论。这是目录结构的样子:

文件系统/的ProductVersion + testType / uniqueDateAndBuildID / TestNG的-results.xml

results.xml文件包含带有子测试标记的标记,这些标记对应于文件系统目录,然后是包含实际测试用例结果的xml文件(通过,失败等) XML解析和文件系统遍历都很好,很好/可靠。

控制流程: 客户访问主页 - >服务器打开属性文件 - >服务器检查Web服务器属性(如果我在本地工作,则为Websphere或Tomcat) - >服务器根据它设置一堆常量。常量包括:根文件系统目录,文件系统分隔符(转换),“类似类型(在不同平台上基本相同的测试)”,以及要附加到的基本URL。 - >然后,服务器再读取属性文件并完成所有XML处理。结果使用ObjectOutputStream缓存在内存和文件系统中。 - >将大量结果发送回客户端以进行UI处理/显示。

这是我遇到问题的地方:我无法访问那些全局变量(在Globals类中包含/设置...我知道错误: - /)回到客户端,即使它们在共享中夹。如果你想知道为什么我不能再次加载属性,那是因为客户端是GWT-ified Javascript,它不包含File()。所以我的下一个想法是,做了一点上层Java阅读可能是使用一个Globals单例对象并将其传回去。但是看起来这也是坏的,如果不是不可能的话。 这里的建议会很棒。

这一切都非常紧密,我以前的Java教育还没有真正进入过。由于这只是开发人员检查的内部门户,因此实际测试我的代码似乎没有多大意义。只要它正确显示,正确记录,并优雅地处理错误,对吗?总而言之,它是< 15级,所以我猜这并不是什么大不了的事。我应该重构清理它并使其成为“更好的Java”,评论所有内容以清楚地描述控制流程,或者不要过于担心它因为它很小?我知道将来在设计之前要多考虑一些事情,但我真的不知道自开始以来我接触过的大量Java原则。

在做了一些思考后,

编辑,提出了一个可能的解决方法。那么,我传回了一些包含全局“标题”对象的其他自定义列表实现,而不是传回结果列表?我可以保留国家。

3 个答案:

答案 0 :(得分:5)

一个简单的解决方案是Dictionary类:

  

提供动态字符串查找   a中定义的键/值字符串对   模块的主机HTML页面。每个独特   Dictionary的实例绑定到了   命名的JavaScript对象   在主机的全局命名空间中   页面的窗口对象。界限   JavaScript对象直接用作   关联数组。

您只需要向主机HTML页面添加一些动态内容 - 让服务器以JavaScript对象的形式打印从属性文件中读取的值:

var GlobalProperties = {
  property1: "value1",
  property2: "value2"
};

然后,在代码中使用Dictionary来读取这些值:

Dictionary globalProperties = Dictionary.getDictionary("GlobalProperties");
String property1 = globalProperties.get("property1");

PS:如果您正在寻找关于如何使代码更少耦合的好主意/建议 - >更可测试,我建议Misko Hevery's blog。他有很多有趣的帖子,比如why singletons are usually bad(全局状态,而不是模式本身)。但最重要的是 - 它具有令人敬畏的guide to writing testable code(Google内部使用的一些指导原则)。

答案 1 :(得分:1)

你可以使用HashMap认为GWT-RPC调用的简单对象传递那些全局变量,或者只是将你已经检索过的结果包含在这个Hashmap中(沿着“发送结果的大结果列表”)返回客户端进行UI处理/显示。“)

答案 2 :(得分:1)

您无法从已编译的JavaScript中访问服务器端单例。

你基本上有两种选择。您可以在客户端代码中创建一个代表全局变量的Serializable类,或者传递您的全局变量对象,但这是一个相当低效的解决方案。

最简单的方法是在可序列化对象中使用HashMap<String, String>,您可以使用RPC调用来检索它:

public class GwtGlobalVariables implements Serializable {
    private HashMap<String, String> map = new HashMap<String, String>();

    public void put(// a  delegate put method of choice

    public void setMap() // a getter / setter for the map if you need it
}

确保该类位于GWT模块的源文件夹中,即与您的入口点位于同一位置。

使用所需的值填充地图,将其传递给rpc,然后将其放在客户端代码中。