代码之家  ›  专栏  ›  技术社区  ›  Limbic System

在GWT应用程序中实现HTML外部化的最佳方法?

  •  19
  • Limbic System  · 技术社区  · 17 年前

    最好的方法是什么 外部化大量HTML 在GWT应用程序中?我们有一个相当复杂的GWT应用程序,大约有30个“页面”;每个页面的底部都有一种指南,即HTML标记的几个段落。我想将HTML外部化,以便尽可能地保持“无范围”状态。

    我知道并理解如何使用 属性文件 在GWT中,这当然比在Java类中嵌入内容要好,但是对于HTML来说仍然很难看(你需要对所有内容进行反汇编,以及避免引用等)。

    通常情况下,这是您将在JSP中放入的类型 但是在GWT中我看不到任何等价物。我正在考虑编写一个小部件,它只需从服务器上的HTML文件中获取内容,然后将文本添加到HTML小部件中。但似乎应该有一个更简单的方法。

    14 回复  |  直到 14 年前
        1
  •  7
  •   Boris Pavlović    17 年前

    您可以使用一些模板化机制。尝试 FreeMarker Velocity 模板。您将把HTML保存在模板化库将检索到的文件中。这些文件可以用适当的扩展名命名,例如.html,.css,.js可以自己观察到。

        2
  •  22
  •   Futzilogik    15 年前

    我在类似的环境中使用了clientbundle。我已经创建了一个包my.resources,并将html文档和以下类放在那里:

    package my.resources;
    
    import com.google.gwt.core.client.GWT;
    import com.google.gwt.resources.client.ClientBundle;
    import com.google.gwt.resources.client.TextResource;
    
    public interface MyHtmlResources extends ClientBundle {
     public static final MyHtmlResources INSTANCE = GWT.create(MyHtmlResources.class);
    
     @Source("intro.html")
     public TextResource getIntroHtml();
    
    }
    

    然后,我通过从我的GWT客户机代码调用以下内容来获取该文件的内容:

    HTML htmlPanel = new HTML();
    String html = MyHtmlResources.INSTANCE.getIntroHtml().getText();
    htmlPanel.setHTML(html);
    

    http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html 更多信息。

        3
  •  5
  •   Miguel Ping    17 年前

    我认为您可以通过 Frame .

    Frame frame = new Frame();
    frame.setUrl(GWT.getModuleBase() + getCurrentPageHelp());
    add(frame);
    

    您可以为 获取当前页面帮助( )返回适当的路径(例如: /手册/mypage/help.html )

    这里有一个 example 框架的作用。

        4
  •  5
  •   Andrew Newdigate    15 年前

    在GWT 2.0中,可以使用 UiBinder .

    <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
      <div>
        Hello, <span ui:field='nameSpan’/>, this is just good ‘ol HTML.
      </div>
    </ui:UiBinder>
    

    这些文件与Java代码保持分开,可以被编辑为HTML。它们还提供了与GWT小部件的集成,以便您可以从GWT代码轻松访问HTML中的元素。

        5
  •  3
  •   Tomer    17 年前

    当GWT2.0发布时,它应该有一个clientbundle,可能可以解决这个需求。

        6
  •  1
  •   Steve Reed    17 年前

    您可以尝试实现 Generator 在编译时从文件加载外部HTML,并构建一个发出它的类。对于创建生成器,似乎没有太多的在线帮助,但以下是GWT组的一篇文章,您可以从中开始: GWT group on groups.google.com .

        7
  •  1
  •   Community Mohan Dere    9 年前

    我做过类似的研究,到目前为止,我发现解决这个问题的最佳方法是通过 DeclarativeUI or UriBind . 不幸的是,它还在孵化器中,所以我们需要解决这个问题。

    我用两种不同的方法来解决它:

    1. 活动覆盖,即:创建标准HTML/CSS并通过 <script> 标签。在需要从GWT代码访问元素的任何地方,都要编写如下内容:

      RootPanel.get("element-name").setVisible(false);
      
    2. 您编写代码100%GWT,然后,如果需要一个大的HTML块,您可以通过iframe或ajax将其带到客户机,然后通过如下HTML面板注入:

      String html = "<div id='one' "
         + "style='border:3px dotted blue;'>"
         + "</div><div id='two' "
         + "style='border:3px dotted green;'"
         + "></div>";
      HTMLPanel panel = new HTMLPanel(html);
      panel.setSize("200px", "120px");
      panel.addStyleName("demo-panel");
      panel.add(new Button("Do Nothing"), "one");
      panel.add(new TextBox(), "two");
      RootPanel.get("demo").add(panel);
      
        8
  •  1
  •   Alexander Kosenkov    17 年前

    为什么不使用好的旧iframe?只需创建一个iframe,在其中放置提示,并在GWT“page”更改时更改其位置。

    优势:

    • 点击量存储在任何结构的单独可维护HTML文件中。
    • Ajax样式加载 完全没有编码 在服务器端
    • 如果需要,应用程序仍然可以与加载的信息交互

    缺点:

    • 每个提示文件都应该有指向共享CSS的链接,以获得常见的外观和感觉。
    • 难以国际化

    为了使这种方法更好一点,您可以处理加载错误,并针对404错误重定向到默认语言/主题。所以,搜索优先级是这样的:

    1. 当前语言的当前主题
    2. 默认语言的当前主题
    3. 当前语言的默认主题
    4. 默认错误页

    我认为很容易创建这样的GWT组件来合并iframe交互。

        9
  •  1
  •   David Tinker    17 年前

    GWTPortlets框架( http://code.google.com/p/gwtportlets/ )包括webappcontentportlet。这将服务于Web应用程序中的任何内容(静态HTML、JSP等)。您可以将它放在其他portlet中具有附加功能的页面上,当页面加载时,所有内容都通过单个异步调用获取。

    请查看webappcontentportlet和webappcontentdataprovider的源代码,以了解它是如何完成的,或者尝试使用框架本身。以下是源的相关位:

    webappcontentportlet(客户端)

    ((HasHTML)getWidget()).setHTML(html == null ? "<i>Web App Content</i>" : html);
    

    webappcontentdataprovider(服务器端):

    HttpServletRequest servletRequest = req.getServletRequest();
    String path = f.path.startsWith("/") ? f.path : "/" + f.path;
    RequestDispatcher rd = servletRequest.getRequestDispatcher(path);
    BufferedResponse res = new BufferedResponse(req.getServletResponse());
    try {
       rd.include(servletRequest, res);
       res.getWriter().flush();
       f.html = new String(res.toByteArray(), res.getCharacterEncoding());
    } catch (Exception e) {
       log.error("Error including '" + path + "': " + e, e);
       f.html = "Error including '" + path +
            "'<br>(see server log for details)";
    }
    
        10
  •  0
  •   harmanjd    17 年前

    对于页面的HTML部分,您可以使用带有JSP的servlet,并且仍然包含在页面上运行GWT应用程序所需的javascript。

        11
  •  0
  •   Steve Armstrong    16 年前

    我不确定我是否理解您的问题,但我假设您已经将这个常见的摘要分解成它自己的小部件。如果是这样,问题是你不喜欢把HTML嵌入到Java代码中的丑陋方式。

    GWT 2有 收银机 ,它允许您在原始HTMLICE模板中定义GUI,并且可以从Java世界向模板注入值。通读 dev guide 它给出了一个很好的轮廓。

        13
  •  0
  •   Matthieu kelly    14 年前

    你可以试试 GWT App 在运行时生成和绑定HTML模板,没有编译时间。

        14
  •  -2
  •   Community Mohan Dere    9 年前

    不知道GWT,但是你不能在你的应用HTML中定义并锚定DIV标记,然后对你需要的HTML文件执行GET,并附加到DIV吗?这和 micro-template ?

    更新:

    我刚在另一个的答案中找到了这个不错的jquery插件 StackOverflow 问题。