在GWT应用中外部化大量HTML 的最佳方法是什么?我们有一个相当复杂的GWT应用程序,大约30“页”;每个页面底部都有一个指南,它是HTML标记的几个段落。我想将HTML外化,以便它可以保持尽可能“未转义”。
我知道并了解如何在GWT中使用属性文件;这肯定比在Java类中嵌入内容要好,但对于HTML来说仍然有点难看(你需要对所有内容进行反斜杠处理,以及转义引号等)。
通常这是你要放在JSP中的那种东西,但我没有看到任何与GWT相同的内容。我正在考虑编写一个小部件,它只是从服务器上的html文件中获取内容,然后将文本添加到HTML小部件中。但似乎应该有一种更简单的方式。
答案 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)
您可以使用一些模板机制。试试FreeMarker或Velocity模板。您将在文件中使用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。不幸的是它仍然在孵化器中,所以我们需要解决这个问题。
我用几种不同的方式解决它:
有效叠加,即:您创建标准HTML / CSS并通过<script>
标记注入GET代码。你需要从GWT代码中访问一个元素,你可以写这样的东西:
RootPanel.get("element-name").setVisible(false);
你编写代码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“页面”更改时提示并更改其位置。
优点:
缺点:
为了使这种方法更好一些,您可以处理加载错误并在404错误上重定向到默认语言/主题。因此,搜索优先级将是这样的:
我认为创建此类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插件。