Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何为GWT排列动态提供清单服务_Html_Gwt_Offline Caching_Mgwt - Fatal编程技术网

Html 如何为GWT排列动态提供清单服务

Html 如何为GWT排列动态提供清单服务,html,gwt,offline-caching,mgwt,Html,Gwt,Offline Caching,Mgwt,考虑以下问题。您希望为GWT项目提供脱机清单/appcache文件。在这种情况下,有两个问题: GWT生成js文件的不同排列(取决于浏览器版本)。加载应用程序时,一些GWT javascript代码使用您的用户代理属性来包含适当的属性。您需要为每个排列生成不同的清单文件,因为您不想缓存不使用的文件(每个排列的这些文件大约为0.5MB)。此问题包含在中,它在编译过程中生成不同的清单文件 在浏览器中加载webapp时提供适当的清单文件 这个问题涉及第2个问题。我们如何以一种健壮的方式动态地提供这个清

考虑以下问题。您希望为GWT项目提供脱机清单/appcache文件。在这种情况下,有两个问题:

  • GWT生成js文件的不同排列(取决于浏览器版本)。加载应用程序时,一些GWT javascript代码使用您的用户代理属性来包含适当的属性。您需要为每个排列生成不同的清单文件,因为您不想缓存不使用的文件(每个排列的这些文件大约为0.5MB)。此问题包含在中,它在编译过程中生成不同的清单文件
  • 在浏览器中加载webapp时提供适当的清单文件
  • 这个问题涉及第2个问题。我们如何以一种健壮的方式动态地提供这个清单?根据请求中的用户代理,MGWT使用服务于清单的代理。 您需要将用户代理字符串(例如
    Mozilla/4.0(兼容;MSIE 6.0b;Windows NT 5.1)
    )映射到“用户代理id”(例如
    ie6
    )。使用MGWT链接器创建的映射文件,可以找到要服务于客户端的清单文件。一个主要的缺点是,您需要执行一些简单的字符串操作,以将完整的用户代理字符串映射到此用户代理id,并进行一些简单的字符串匹配。对于这种映射,您将无法重用客户端GWT代码。(这些都在本文中讨论)。因此,每当GWT接收到更改排列数量和/或支持的浏览器的更新时,您也需要更改servlet代码。换句话说:这不是一个健壮的解决方案


    问题是:我们可以通过在客户端动态地提供这些文件,以不同的方式为这些GWT排列提供清单吗?

    是的,但是可以通过roundabit方式。无法通过javascript动态更改html“manifest”属性。一种解决方法是通过javascript生成iframe,它引用一个带有特定清单属性的空html页面(请参阅)。要在GWT中工作,您需要:

  • 更改MGWT链接器,以便为每个排列创建一个空html页面,并引用此排列清单。比如:

    toReturn.add(emitString(
            logger, 
            "<html manifest=\"" + permutation + ".manifest\"><head></head><body></body></html>", 
            permutation + ".manifest.html")
    );
    

    请注意,
    GWT.getPermutationStrongName
    在开发模式下返回“HostedMode”。也就是说,您将无法在开发模式下使用此方法(或者您应该确保也为
    HostedMode
    编写一个单独的清单/iframe)

    我不确定在客户端计算清单文件的方法。让我解释一下:

    manifest属性告诉浏览器,必须缓存并从缓存中获取此页面以及包含在manifest中并由此页面使用的所有资产

    如果不在index.html中设置manifest属性,则页面将不会被缓存,也不会使用缓存中的任何资源

    使用iframe方法,您将加载一个iframe.html和manifest属性集,该清单将包括index.html及其所有资产


    我没有对此进行测试,但我认为尽管浏览器会缓存并从脱机存储中获取index.html,但它不会获取其中包含的任何资产,因为index.html没有manifest属性集,因此,如果设备处于脱机状态,您的module.nocache.js将永远无法加载。

    我不理解您在修改号码或排列时的担忧。您不是在gwt编译的东西中部署servlet吗?。使用mgwt方法,当您修改任何内容并进行编译时,静态内容包括servlet了解当前排列所需的信息。在我的项目中,它就像一个魔咒,我确实配置了我的web.xml和gwt.xml文件一次,然后每次maven编译时,它都会生成一个.war文件,我将其复制到我的servlet容器中。我同意使用MGWT aproach是可行的。我的问题是,每当我更新到下一个版本的GWT时,GWT使用的置换检测脚本可能会改变(例如,将新的IE版本链接到(可选的新)置换)。我不想在更新GWT时更改servlet。此外,我更喜欢这个解决方案,因为我无法让servlet执行与javascript置换检测脚本完全相同的操作,因为后者不仅使用用户代理,还使用其他dom文档属性。我不会担心gwt中的新置换,我相信mgwt将同时更新,因为mgwt维护人员是gwt核心团队的一部分。Servlet检测速度非常快,它执行非常基本的字符串操作。如果我重新表述您的评论,您是说您怀疑这是否有效,对吗?;)您可以在此处找到一个工作原型(仍在开发中):。这是在chrome和firefox上测试的。原始html页面没有manifest属性这一事实不是问题。您所需要做的就是确保引用清单文件缓存部分中的原始html页面(登录页面)以及一个补充:通过iframe包含清单会导致任何与appcache相关的事件处理都应该在iframe html中进行。将这些事件处理程序添加到iframe父级将不起作用。我使用的一种解决方案是将事件从iframe转发给其父级
    public void onModuleLoad() {
        appendManifestIframe(GWT.getPermutationStrongName() + ".manifest.html");
    }
    
    public static native void appendManifestIframe(String manifestIframe) /*-{
            var ifrm = document.createElement("iframe"); 
            ifrm.setAttribute("src", manifestIframe); 
            ifrm.style.width = 0+"px"; 
            ifrm.style.height = 0+"px"; 
            $doc.body.appendChild(ifrm); 
        }-*/;