gpt4 book ai didi

java - Gwt 中的多个 Html 页面

转载 作者:行者123 更新时间:2023-11-28 00:08:26 25 4
gpt4 key购买 nike

我正在尝试在 GWT 中开发网站,我必须在其中制作 2 个 html 页面。第一个 html 页面是主欢迎页面,第二个 html 页面是调用 GWT 的所有小部件的主页面。

我必须从第二个 html 页面调用项目的入口点类,因此我必须提供脚本

<script type="text/javascript" language="javascript" src="firstpage/firstpage.nocache.js"></script>

所以我的项目统计信息来自欢迎页面,然后重定向到第二个 html 页面。但是从第二个 html 页面我无法调用入口点类,因为我上面的脚本不起作用。

请帮助我从第二个 html 页面执行脚本。提前致谢。

最佳答案

鉴于您希望向现有 GWT 应用程序添加“html 页面”,我建议操作 DOM 而不是创建第二个入口点。如果您需要为此应用程序创建联系页面、关于页面和隐私页面怎么办?

克里斯的 SO answer on GWT navigation为在 GWT 应用程序中维护多个状态提供了一个非常好的解决方案。


我已经根据 Chris 的回答实现了自己的变体;在这里,我只进一步详细说明我的实现细节。我发现这对于在具有 历史 支持的 GWT 应用程序中管理 多个状态 非常有效。

按照建议,我使用以下 HTML:

<table id="wrapper">
<!-- Header row -->
<tr style="height: 60px;">
<td colspan="2" id="header"></td>
</tr>

<!-- Body row and left nav row -->
<tr style="vertical-align: top;">
<td id="leftnav"></td>
<td id="content"></td>
</tr>
</table>

然后我定义了一个顶级复合类,每个单独的页面在应用程序中继承:

public abstract class Content extends Composite{
public abstract String getToken();
public abstract String getWindowTitle();
}

每个页面的 token 和窗口标题都在一个名为 PageDefs 的类中定义:

public class PageDefs{
public static final String WelcomeToken = "WELCOME";
public static final String WelcomeTitle = "Welcome to My App";
public static final String AppToken = "APP";
public static final String AppTitle = "My App";
}

Content 类由单例 ContentContainer 抽象使用:

public class ContentContainer implements ValueChangeHandler<String> {

@Override
public void onValueChange(ValueChangeEvent<String> event) {
String token = (String) event.getValue();
this.setContentByToken(token);
}

public void setContentByToken(String token) {
if (token.equals(PageDefs.WelcomeToken)) {
this.setContent(new WelcomePage());
} else if (token.equals(PageDefs.AppToken)) {
this.setContent(new MyApp());
} else {
Window.alert("Error in parsing history token: '" + token + "'");
}
}

private void setContent(Content content) {
RootPanel contentRoot = RootPanel.get("content");
contentRoot.clear();
this.content = content;
History.newItem(content.getToken(), false);
// check for special initializations:
if (content.getToken().equals(PageDefs.AppToken)) {
((MyApp) content).MyInit();
}
contentRoot.add(content);
header.setHeader(content.getWindowTitle());
Window.setTitle(content.getWindowTitle());
Window.scrollTo(0, 0);
}

private static ContentContainer myInstance = new ContentContainer();
public static synchronized ContentContainer getInstance() {
return myInstance;
}
private ContentContainer() {
History.addValueChangeHandler(this);
}

private Header header;
private Content content;

public void setHeader(Header h) {
this.header = h;
}
}

ContentContainer 保留对 header 类的本地引用。这是因为我需要一个取决于应用程序状态的动态标题和窗口标题。此外,管理应用程序内容、标题、窗口标题和历史记录的所有内容都包含在一个类中
在我的实际实现中,ContentContainer 还跟踪用户的 session 。因此,如果用户的 session 不存在或已过期,ContentContainer 的 onValueChange 方法会强制加载登录页面。

header 是一个 UI 绑定(bind)器,带有一个 InlineHTML 变量,其 HTML 由 setHeader 方法设置。对于左侧导航菜单,我还使用带有 GWT anchor 的 UI Binder ,并将 #WELCOME#APP 作为 href 值。

最后,我们需要在入口点加载应用程序的每个部分:

public void onModuleLoad() {
Header h = new Header();
h.setHeader(PageDefs.WelcomeTitle);
RootPanel.get("header").add(h);
ContentContainer.getInstance().setHeader(h);
RootPanel.get("leftnav").add(new NavMenu());
String token = Window.Location.getHash().length() == 0?
PageDefs.WelcomeToken : Window.Location.getHash();
ContentContainer.getInstance().setContentByToken(PageDefs.SignupToken);
}

这就是我在 GWT 应用程序中管理多个页面的方式。这项额外的工作可能看起来很艰巨,但我发现这是值得的。如果您的应用程序处理一些输入并可视化输出,则前进和后退按钮是表单和可视化之间的直观导航工具。

关于java - Gwt 中的多个 Html 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com