将参数传递给GWT bootstrap .nocache.js脚本

时间:2010-12-04 00:14:36

标签: gwt parameters

有没有办法将参数传递给GWT生成的.nocache.js脚本文件,并在onModuleLoad函数中对它们进行评估?像这样:

<script type="text/javascript" src="application/Application.nocache.js?appId=461333815262909"></script>

主页页面URL应该与内部工作的GWT内容完全分开,因此将appId参数作为主页的查询参数传递并使用Window.Location.getParameter访问它不是一个选项。我知道我可以隐藏这些参数,例如在隐藏的DIV中,然后从脚本中查询它们,但如果可能,我希望避免在主机页面中进一步依赖。

谢谢! 莉莎

3 个答案:

答案 0 :(得分:3)

不是将信息隐藏在可能变得混乱的隐藏div中,而是通过HTML元标记传递参数的简单方法。

在调用GWT脚本的HTML页面中,添加元标记,如下所示:

<html>
  <head>
    <meta name="appId" content="461333815262909">
    ...

然后,在模块的入口点,按如下方式解析它:

@Override
public void onModuleLoad() {
    NodeList<Element> metas = Document.get().getElementsByTagName("meta");
    for (int i=0; i<metas.getLength(); i++) {
        MetaElement meta = (MetaElement) metas.getItem(i);
        if ("appId".equals(meta.getName())) {
            Window.alert("Module loaded with appId: " + meta.getContent());
        }
    }
}

当然,它并不像在脚本标记的src URL中传递参数那么简单,但我相信它比隐藏文档内容中的div更简洁,并且比人工重新解析脚本更不容易出错标签的源属性。

答案 1 :(得分:2)

不,但是this article可能有助于将参数从服务器传递到客户端脚本以便在页面加载时进行评估。

答案 2 :(得分:2)

GWT似乎没有原生支持,但我最近想出了以下解决方案:

假设您的脚本始终遵循命名约定“/<moduleName>.nocache.js”,您可以从主机页面获取所有<script>元素,并在src属性中搜索引用该元素的元素。然后,您可以从那里提取URL编码的属性。

这是我的示例实现,意味着使用GWT.getModuleName()作为第一个参数调用。

/**
 * Fetches a parameter passed to the module's nocache script.
 * 
 * @param moduleName the module's name.
 * @param parameterName the name of the parameter to fetch.
 * @return the value of the parameter, or <code>null</code> if it was not
 *   found.
 */
public static native String getParameter( String moduleName, String parameterName ) /*-{
    var search = "/" + moduleName + ".nocache.js";
    var scripts = $doc.getElementsByTagName( "script" );
    for( var i = 0; i < scripts.length; ++i ) {
        if( scripts[ i ].src != null && scripts[ i ].src.indexOf( search ) != -1 ) {
            var parameters = scripts[ i ].src.match(/\w+=\w+/g);
            for( var j = 0; j < parameters.length; ++j ) {
                var keyvalue = parameters[ j ].split( "=" );
                if( keyvalue.length == 2 && keyvalue[ 0 ] == parameterName ) {
                    return unescape( keyvalue[ 1 ] );
                }
            }
        } 
    }
    return null;
}-*/;   

欢迎提出改进建议。