2009-09-18 56 views
6

试图避免在这里重新发明车轮。我准备部署一个Google Web Toolkit页面,但与我通信的Web服务在部署的服务器上的相对地址与本地测试机器不同。GWT的服务器端配置

因此,我正在寻找一种简单的方法来部署一些容易编辑的配置文件,我可以将基本设置放在服务器端。我有一些关于如何做到这一点的想法,但它们看起来有些不合适,而且在我看来,似乎必须已经有针对此类问题的解决方案(毕竟,每个服务器设置是非常常见的事情!)

有没有想法?

编辑:由于这似乎并没有成为倍受关注,让我概括我最初的想法:存储静态文件,局部的,我与其他任何逻辑之前AJAX调用查询GWT文件。当文件返回时,我解析出数据并将它们存储为全局可访问的变量,然后允许页面构建逻辑运行。看起来很笨重,并且在加载之前等待AJAX​​返回有很大的不利之处,但它会起作用。有更好的建议吗? (请?)

我的解决方案: 我发现我自己的解决方案,但它是非常具体的,以我的确切的情况,所以我不知道这将是给广大用户多么有用。无论如何,我会在这里发布它,因为有人认为它很有用。

我正在处理的页面实际上是嵌入在ASP.net站点中的GWT控件。利用这一点,以及我发现的GWT词典类,我把这样一个“设置”系统放在一起:

首先,我想要的设置(在这种情况下,一个web服务的地址)设置在ASP .NET Web.Config文件

<appSettings> 
    <add key="serviceUrl" value="http://mySite.com/myService.asmx"/> 
</appSettings> 

在ASP页面中嵌入真实的GWT控制,我添加了一个“静态”的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获得设置... 噢!所以是的,这是一个很长很复杂的方法,但它适用于我。给出的答案亚历山大看起来最符合我所寻找的内容,所以奖金贴在他身上,但是要感谢所有在我的粘性小问题上投入的人!

回答

5

随时纠正我,但它似乎并不像你需要运行时服务器端配置。在这种情况下,你真的需要这种灵活性,或者你想使用一个.zip你可以使用在Yahoo's Performance Rules给出的技术所有部署 - (请参见“添加一个Expires或Cache-Control头)” - 遥远的将来到期头。这意味着AJAX请求会被浏览器高速缓存,并且只会导致第一个请求的轻微减速。

,而不是做这个其实我建议使用编译时标志和GWT提供的产权制度。为了简化操作,我制作了一个名为auto-config available on github的小包。使用它可以使访问每个部署配置非常简单。添加下面的类:

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

访问从GWT代码的价值添加这个简单的辅助:

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

创建多个不同的.gwt.xml文件,每一个部署服务器。然后通过使用父级.gwt.xml文件来最小化任何重复。有关此主题的更多信息,请阅读CompileOnePermutation on the GWT Wiki

综上所述,添加以下代码片段到你的每部署.gwt.xml的(并确保添加所需的继承线):

<set-configuration-property name="foobar" value="whee1234" /> 

希望有帮助:)

+0

你的第二个环节的工作:)我第一个想到的是刚刚格式化滑稽,但它跨越获取点。我会研究这种方法... – Toji 2009-09-21 19:53:36

+0

哇...这是一个相当复杂的例子。我不确定我应该看哪个部分。我知道PropertyOracle是我通过Generator获得的东西,但Generator对我做了什么,以及我将如何使用它?阅读这些东西通常都很不错,但我觉得在这种情况下我缺乏很多背景知识。 :( – Toji 2009-09-21 20:07:05

+0

我反正需要这个项目,所以我现在就去挖掘它吧。 – 2009-09-22 09:00:47

1

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

您有多个选项,通常为:

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

我有点困惑,你问什么。

如果你想要的是一次编译,并运行在具有不同选项的不同服务器上的应用程序GWT,并有选择的GUI构建过程中使用的客户端,有一堆的选项。

使用获取信息到你的程序:

  • 环境变量
  • 系统属性

获得由资讯提供给您的客户端:

  • AJAX调用文件(如您指定的)
  • 从JSP,而不是静态的HTML即成你的GUI。让JSP将信息嵌入JS变量中,您的GUI可以使用JSNI调用访问该变量。这为您节省了往返时间。