1

我目前正在为我的 Web 应用程序添加 HTML5 离线支持,并且主要遵循与 mgwt 相同的方法:

  1. 在计算时按排列生成清单文件
  2. 基于浏览器的用户代理,使用 servlet 提供清单文件。

我的问题涉及第 2 步:在我的 servlet 中,我想检测为某个请求提供哪种排列。我现在这样做的方式是:

  • 从请求中获取用户代理字符串
  • 将此(使用简单的字符串操作(例如userAgent.contains("safari"))映射到“代理ID”,我可以使用映射文件将其映射到排列强名称。换句话说,映射Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)ie6我可以映射的(使用生成的映射文件,请参阅下面的例子)到15B454D690F2CCAD57F1DD809429BF42

    <permutation name="15B454D690F2CCAD57F1DD809429BF42">
      <user.agent>ie6</user.agent>
    </permutation>
    

我面临的问题:我想使用与 GWT 使用的相同的方法将用户代理字符串链接到排列(即 map Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)to ie6)。这样,每当我的 GWT 使用其他排列/浏览器版本更新时,我就不必修复我的代码。换句话说,我不喜欢我当前的解决方案,即在我的排列映射中天真地将 servlet 中的完整用户代理字符串与用户代理“id”(在我的示例中为“ie6”)进行匹配。我想到的解决方案是:

  • 页面加载后,检测加载的排列,并将其作为参数传递给 servlet。然后在获取该排列的清单后,使用 javascript 将其作为 html 标记的属性插入。但是,动态插入它似乎无法正常工作。(请参阅动态触发 HTML5 缓存清单文件?)(同一篇文章解释了使用 iframe 动态执行此操作的解决方法,但我更喜欢更简洁的解决方案)
  • 在我的 servlet 中,以某种方式使用客户端将完整的用户代理字符串映射到一个排列。我更喜欢这个解决方案,但还没有找到实现这一目标的方法...... GWT 使用 javascript 来实现这一目标(参见UserAgentPropertyGenerator)。我可以在我的 servlet 中执行这个,但是这个 javascript 方法不仅使用用户代理,还使用 ​​dom 文档......还有其他我忽略的解决方案吗?当然,其他人在创建 HTML5 清单文件时也一定遇到过这个问题......
4

1 回答 1

0

您可以利用 mgwt 提供的HTML5Manifest解决方案。他们有一个链接器,它生成一个可以被他们提供的servlet读取的文件,并根据用户代理标头返回适当的文件列表以供浏览器缓存。

compilation-mappings.txt如果您想自己做,您可以根据 http 用户代理标头和gwt 编译器生成的文件(如果您使用xsiframe链接器)找出每个浏览器最合适的排列。

于 2013-09-09T14:58:26.753 回答