2010-08-24 60 views
1

因此,这里是我的项目:GWT + Java的:全局,单身,和头痛

我建立一个集中的界面/仪表板呈现的测试数据为多个测试类型的多个版本的产品。我们在我们的大量产品上使用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原则。

编辑经过一番思考后,想出了一个可能的解决方法。怎么样,而不是回传只有结果列表,我传回了一些其他自定义列表实现,其中包括全局的'头'对象?我可以保持状态。

回答

1

你可以通过一个带有HashMap思想的GWT-RPC调用的简单对象来传递这些全局变量,或者仅仅包含这个Hashmap和你已经在第一个地方检索到的结果(沿着“结果的大列表[是]发送回客户端进行UI处理/显示。“)

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传递它,然后将其放在客户端代码中。

5

一个简单的解决办法是Dictionary类:

提供在 模块的HTML网页定义 键/值字符串对动态字符串查找。 Dictionary的每个唯一 实例都绑定到名为JavaScript对象的 ,该对象位于主机 页面的窗口对象的全局名称空间中的 。绑定的 JavaScript对象直接用作关联数组 。

你只需要一些动态内容添加到您的HTML网页 - 使服务器打印从属性读取文件中的值在JavaScript对象的形式:

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

然后,使用字典在你的代码来读取这些值:

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在内部使用的一些指导原则)。