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

Java 在GWT应用程序中外部化HTML的最佳方法?,java,html,gwt,Java,Html,Gwt,在GWT应用程序中,将大量HTML外部化的最佳方法是什么?我们有一个相当复杂的GWT应用程序,大约有30页;每个页面的底部都有一个类似于指南的部分,即HTML标记的几个段落。我希望将HTML外部化,使其尽可能保持“无场景” 我知道并理解如何在GWT中使用属性文件;这当然比将内容嵌入Java类要好,但对于HTML来说仍然有点难看(需要反斜杠,以及转义引号等) 通常情况下,这是您在JSP中放入的内容,但我看不到任何与GWT中的内容等效的内容。我正在考虑编写一个小部件,它只需从服务器上的html文件中

在GWT应用程序中,将大量HTML外部化的最佳方法是什么?我们有一个相当复杂的GWT应用程序,大约有30页;每个页面的底部都有一个类似于指南的部分,即HTML标记的几个段落。我希望将HTML外部化,使其尽可能保持“无场景”

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


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

您可以使用一些模板机制。尝试使用或修改模板。您将在模板库检索的文件中包含HTML。这些文件可以用适当的扩展名命名,例如.html、.css、.js,这些扩展名可以自己查看。

您可以尝试实现一个
生成器,在编译时从文件加载外部html,并构建一个类来发出它。在创建发电机方面,网上似乎没有太多的帮助,但这里有一篇给GWT小组的帖子,可能会让你开始学习:。

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

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

  • 活动覆盖,即:创建标准HTML/CSS并通过
    标记注入GET代码。在需要从GWT代码访问元素的任何地方,您都可以编写如下代码:

    RootPanel.get("element-name").setVisible(false);
    
    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);
    
  • 您可以100%GWT编写代码,然后,如果需要一个大的HTML块,您可以通过IFRAME或AJAX将其带到客户端,然后通过HTML面板将其注入,如下所示:

    RootPanel.get("element-name").setVisible(false);
    
    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);
    
    String html=“”
    + "";
    HTMLPanel=新的HTMLPanel(html);
    面板设置尺寸(“200px”、“120px”);
    panel.addStyleName(“演示面板”);
    面板。添加(新按钮(“不做”)和“一”);
    panel.add(新文本框(),“两个”);
    RootPanel.get(“demo”).add(panel);
    

  • 我认为您可以通过一个

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


    这是一个正在运行的框架。

    不知道GWT,但您不能在应用程序html中定义并锚定div标记,然后对所需的html文件执行get,并附加到div吗?这和一个普通的家庭有什么不同

    更新:


    我刚刚在回答另一个问题时发现了这个漂亮的jQuery插件。

    您可以将servlet与JSP一起用于页面的html部分,并且仍然包含在页面上运行gwt应用程序所需的javascript

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

    优点:

    • 点击存储在任何结构的单独可维护HTML文件中
    • AJAX风格的加载,服务器端完全不编码
    • 如果需要,应用程序仍然可以与加载的信息交互
    缺点:

    • 每个提示文件都应该有指向共享CSS的链接,以获得通用的外观
    • 难以国际化
    为了使这种方法更好一些,您可以处理加载错误,并在404错误上重定向到默认语言/主题。因此,搜索优先级如下所示:

  • 当前语言的当前主题
  • 默认语言的当前主题
  • 当前语言的默认主题
  • 默认错误页

  • 我认为创建这样的GWT组件以合并iFrame交互非常容易,GWT2.0在发布时应该有一个ClientBundle,这可能解决了这一需求

    GWT Portlet框架()包括一个WebAppContentPortlet。这将提供web应用程序中的任何内容(静态HTML、JSP等)。您可以将它放在其他portlet中具有附加功能的页面上,当页面加载时,通过一个异步调用获取所有内容

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

    WebAppContentPortlet(客户端)

    ((HasHTML)getWidget()).setHTML(html==null?“Web应用程序内容”:html);
    
    WebAppContentDataProvider(服务器端):

    HttpServletRequest-servletRequest=req.getServletRequest();
    字符串路径=f.path.startsWith(“/”)?f、 路径:“/”+f路径;
    RequestDispatcher rd=servletRequest.getRequestDispatcher(路径);
    BufferedResponse res=新的BufferedResponse(req.getServletResponse());
    试一试{
    rd.include(servletRequest,res);
    res.getWriter().flush();
    f、 html=新字符串(res.toByteArray(),res.getCharacterEncoding());
    }捕获(例外e){
    log.error(“错误包括“+path+”:“+e,e”);
    f、 html=“包含“”的错误”+路径+
    “'
    (有关详细信息,请参阅服务器日志)”; }
    我不确定我是否理解您的问题,但我假设您已将此常见摘要分解到它自己的小部件中。如果是这样,问题是您不喜欢将HTML嵌入Java代码的丑陋方式

    GWT2.0有UiBinder,它允许您在原始HTMLish模板中定义GUI,并且您可以从Java世界向模板中注入值。通读后,它给出了一个非常好的大纲。

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

    查看

    我在类似的设置中使用了ClientBundle。我已经创建了一个包my.resources,并将我的HTML文档和以下c
    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)";
    }
    
    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();
    
    }
    
    HTML htmlPanel = new HTML();
    String html = MyHtmlResources.INSTANCE.getIntroHtml().getText();
    htmlPanel.setHTML(html);
    
    <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>