代码之家  ›  专栏  ›  技术社区  ›  Toji

GWT的服务器端配置

  •  6
  • Toji  · 技术社区  · 15 年前

    尽量避免在这里重新发明轮子。我有一个准备部署的GoogleWebToolkit页面,但是我正在与之通信的WebService在部署的服务器上的相对地址与本地测试机器上的相对地址不同。

    因此,我正在寻找一种简单的部署方法,使用某种易于编辑的配置文件,我可以将基本设置放在服务器端。我有一些关于如何做到这一点的想法,但它们似乎有些老套,在我看来,对于这种问题,肯定已经有了解决方案(毕竟,每台服务器的设置是一件很常见的事情!)

    有什么想法吗?

    编辑: 由于这似乎没有引起太多关注,让我概述一下我最初的想法:在任何其他逻辑之前,先将静态文件存储到我用Ajax调用查询的GWT文件的本地位置。当返回文件时,我解析数据并将其存储为全局可访问的变量,然后允许运行页面构建逻辑。看起来很笨拙,而且在加载之前等待Ajax返回有很大的缺点,但是它可以工作。有更好的建议吗?(请?)

    我的解决方案: 我自己找到了一个解决方案,但它非常具体地针对我的具体场景,所以我不知道它对一般用户有多有用。不管怎样,我都会把它贴在这里,以防有人发现它有用。

    我正在处理的页面实际上是嵌入在ASP.NET站点中的GWT控件。利用这一点,以及我对GWT Dictionary类的发现,我构建了这样一个“设置”系统:

    首先,我想要的设置(在本例中是WebService的地址)是在ASP.NET web.config文件中设置的。

    <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 回复  |  直到 9 年前
        1
  •  5
  •   Bob    9 年前

    请随意更正我的错误,但您似乎不需要运行时服务器端配置。在这种情况下,您真的需要这种灵活性,或者您想对所有部署使用单个.zip,您可以使用中给出的技术 Yahoo's Performance Rules -(请参阅“添加过期或缓存控制头”一节)-将来的过期头。这意味着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文件,每个部署服务器一个。然后使用parent.gwt.xml文件最小化任何重复。有关此主题的更多信息,请阅读 CompileOnePermutation on the GWT Wiki

    总之,在per deployment.gwt.xml中添加以下代码段(并确保添加所需的继承行):

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

    希望能有所帮助:)

        2
  •  1
  •   Robert Munteanu    15 年前

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

    您有多种选择,通常是:

    • 设置环境变量;
    • 设置系统属性;
    • 在类路径中放置属性文件;
    • 找一个JNDI bean。
        3
  •  1
  •   Steve Armstrong    15 年前

    我对你的要求有点困惑。

    如果您希望编译一次,并在具有不同选项的不同服务器上运行GWT应用程序,并且在GUI构建期间让这些选项在客户端使用,那么有许多选项。

    使用以下方法将信息输入程序:

    • 环境变量
    • 系统特性

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

    • 对文件的Ajax调用(如您指定的那样)
    • 从JSP而不是静态HTML提供GUI。让JSP将信息嵌入到JS变量中,您的GUI可以使用JSNI调用访问该变量。这就为你节省了一次往返旅行。