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

时间:2009-04-13 14:51:56

标签: java html gwt

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

我知道并了解如何在GWT中使用属性文件;这肯定比在Java类中嵌入内容要好,但对于HTML来说仍然有点难看(你需要对所有内容进行反斜杠处理,以及转义引号等)。

通常这是你要放在JSP中的那种东西,但我没有看到任何与GWT相同的内容。我正在考虑编写一个小部件,它只是从服务器上的html文件中获取内容,然后将文本添加到HTML小部件中。但似乎应该有一种更简单的方式。

14 个答案:

答案 0 :(得分:22)

我在类似的设置中使用过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

答案 1 :(得分:7)

您可以使用一些模板机制。试试FreeMarkerVelocity模板。您将在文件中使用HTML,这些文件将由模板库检索。这些文件可以使用适当的扩展名命名,例如.html,.css,.js可单独使用。

答案 2 :(得分:5)

我说你通过Frame加载外部html。

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

您可以为 getCurrentPageHelp()安排一些约定或查找以返回相应的路径(例如: /manuals/myPage/help.html

这是一个example框架。

答案 3 :(得分:5)

在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中的元素。

答案 4 :(得分:3)

GWT 2.0在发布时,应该有一个ClientBundle,它可能解决了这个需求。

答案 5 :(得分:1)

您可以尝试在编译时实现Generator从文件加载外部HTML并构建一个发出它的类。在线创建生成器似乎没有太多帮助,但这里有一篇可以帮助你入门的GWT小组的帖子:GWT group on groups.google.com

答案 6 :(得分:1)

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

我用几种不同的方式解决它:

  1. 有效叠加,即:您创建标准HTML / CSS并通过<script>标记注入GET代码。你需要从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);
    

答案 7 :(得分:1)

为什么不使用优质的IFRAME?只需创建一个iFrame,您希望在GWT“页面”更改时提示并更改其位置。

优点:

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

缺点:

  • 每个提示文件都应该包含指向共享CSS的链接以获得常见的外观
  • 难以国际化

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

  1. 当前语言的当前主题
  2. 默认语言的当前主题
  3. 当前语言的默认主题
  4. 默认错误页面
  5. 我认为创建此类GWT组件以合并iFrame交互非常容易

答案 8 :(得分:1)

GWT Portlets框架(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)";
}

答案 9 :(得分:0)

您可以将带有jsps的servlet用于页面的html部分,并且仍然包含在页面上运行gwt app所需的javascript。

答案 10 :(得分:0)

我不确定我理解你的问题,但我会假设你已经将这个共同的摘要考虑在它自己的小部件中。如果是这样,问题在于你不喜欢将HTML嵌入Java代码的丑陋方式。

GWT 2.0有 UiBinder ,它允许您在原始HTMLish模板中定义GUI,您可以从Java世界将值注入模板。仔细阅读dev guide,它给出了一个非常好的轮廓。

答案 11 :(得分:0)

您可以尝试GWT App生成html模板并在运行时绑定,无需编译时。

答案 12 :(得分:0)

答案 13 :(得分:-2)

不知道GWT,但你不能在app html中定义和锚定div标签,然后对你需要的HTML文件执行get,并附加到div?这与micro-template有何不同?

更新:

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