所以这是我的项目:
我正在构建一个中央界面/仪表板,以显示多个产品版本的多种测试类型的测试数据。我们在我们的大型产品上使用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原则。
在做了一些思考后,编辑,提出了一个可能的解决方法。那么,我传回了一些包含全局“标题”对象的其他自定义列表实现,而不是传回仅结果列表?我可以保留国家。
答案 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,然后将其放在客户端代码中。