GWT的服务器端配置

6
尝试避免重复造轮子。我有一个Google Web Toolkit页面要部署,但是我要通信的Web服务在部署服务器上的相对地址与我的本地测试机器不同。
因此,我正在寻找一种简单的方法来部署,使用某种易于编辑的配置文件,在其中可以放置基本设置的服务器端。我有几个想法,但它们似乎有些hacky,并且我认为必须已经有解决这种问题的解决方案(毕竟,每个服务器的设置都是非常常见的事情!)
有什么好的建议吗?
编辑:由于这似乎没有引起太多关注,让我概述一下我的初步想法:存储一个静态文件,本地查询GWT文件时进行AJAX调用。当文件返回时,我解析出数据并将其存储为全局可访问的变量,然后允许页面构建逻辑运行。看起来很笨重,并且存在等待AJAX返回之前的任何加载的巨大缺点,但它可以工作。有更好的建议吗? (请?)
我的解决方案: 我自己找到了一个解决方案,但它非常特定于我的确切情况,所以我不知道对一般用户有多大用处。无论如何,我会在这里发布它,以防万一有人发现它有用。
我正在工作的页面实际上是嵌入在ASP.net网站中的GWT控件。利用这一点和我的GWT字典类的发现,我制作了一个像这样的“设置”系统:
首先,在ASP.net Web.Config文件中设置我想要的设置(在本例中为指向Web服务的地址)
<appSettings>
    <add key="serviceUrl" value="http://mySite.com/myService.asmx"/>
</appSettings>

在嵌入GWT控件的ASP页面中,我添加了一个“静态”Javascript对象,其中包含我需要的配置设置:
<head runat="server">
    <title>Picklist Manager</title>

    <script type="text/javascript" language="javascript">
        var AppConfig = {
            serviceUrl: "<%= ConfigurationManager.AppSettings["serviceUrl"] %>"
        };
    </script>
    <script type="text/javascript" language="javascript" src="gwtcontrol.nocache.js"></script> <!-- Include my GWT control -->
</head>

最后,在GWT中,我创建了一个静态的“AppConfig”类,像这样暴露了这个设置:
public class AppConfig {
    public static String serviceUrl = "defaultUrl";

    public static void Initialize() {
        Dictionary appConfig = Dictionary.getDictionary("AppConfig");
        if(appConfig == null) { return; }

        servicePath = appConfig.get("serviceUrl");
    }
}

从那里,我可以在代码的任何地方调用AppConfig.serviceUrl来获取设置...哇!所以,是的,这是一种漫长而复杂的方式,但它对我有效。在给出的答案中,亚历山大的答案似乎最符合我的要求,所以奖励给了他,但感谢每个人在我的棘手问题上提供帮助!

3个回答

5

请随意纠正我,但是似乎您不需要运行时服务器端配置。如果您真的需要这种灵活性或者想要在所有部署中使用单个zip文件,则可以使用雅虎性能规则中给出的技术-(参见“添加过期或缓存控制标头”)- 远期到期标头。这意味着AJAX请求将被浏览器大量缓存,并且仅在第一个请求时会导致轻微的减速。

与其这样做,我实际上建议使用编译时标志和GWT提供的属性系统。为了简化这个过程,我制作了一个名为自动配置的小包,可在github上获得。使用这个工具使得访问每个部署配置非常简单。添加以下类:

public interface MyConfiguration extends AutoConfiguration {
    public String getFoobar();
}

要从GWT代码中访问该值,请添加此简单助手:

private MyConfiguration getMyConfiguration() {
    return (MyConfiguration) GWT.create(MyConfiguration.class);
}

请创建几个不同的.gwt.xml文件,每个服务器部署一个。然后通过使用父级.gwt.xml文件来最小化任何重复。有关此主题的更多信息,请阅读GWT Wiki上的CompileOnePermutation。(链接)简而言之,在您的每个部署.gwt.xml中添加以下代码段(并确保添加所需的继承行)。
<set-configuration-property name="foobar" value="whee1234" />

希望我能帮到您:)

你的第二个链接有效 :) 我认为第一个链接只是格式有点奇怪,但它传达了要点。我会研究这种方法... - Toji
哇...这确实是一个相当复杂的例子。我不确定应该看哪一部分。我知道PropertyOracle是通过Generator获得的,但Generator对我有什么作用,我该如何使用它呢?通常我很擅长阅读这些内容,但在这种情况下,我感觉缺乏很多上下文。:( - Toji
我需要这个来做一个项目,所以我现在会深入研究它。 - Alexander Kellett
@Alexander:github链接已经失效了(用户账户被删除了?) - Laurens Rietveld
@LaurensRietveld 对不起,我刚看到你的回复,新链接是:https://github.com/lypanov/gwt-autoconfig。不过我已经有很长时间没用它了,所以可能需要进行一些大型更新才能与最新版本兼容。 啊,看起来有人已经在故事中添加了正确的链接。神奇! - Alexander Kellett

1

我有点困惑你在问什么。

如果你想要的是编译一次,在不同的服务器上运行GWT应用程序,并且在GUI构建期间使用客户端选项,那么有很多选择。

通过以下方式将信息传递到您的程序中:

  • 环境变量
  • 系统属性
  • 等等

通过以下方式将信息传递到您的客户端:

  • 通过AJAX调用文件(如您所指定的)
  • 从JSP提供GUI而不是静态HTML。让JSP将信息嵌入JS变量中,您的GUI可以使用JSNI调用访问该变量。这样可以节省一次往返。

1

最简单的方法似乎是将此配置信息存储在对server代码可访问的地方,即您的ServiceImpl类。

您有多种选项,通常包括:

  • 设置环境变量;
  • 设置系统属性;
  • 将属性文件放置在类路径中;
  • 查找JNDI bean。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接