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