9

我在同一个模块中有多个入口点。

例如,我有一个主页入口点和管理页面的管理入口点。

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

我现在的设置方式 - 我需要在我的 OnModuleLoad 中检查 somt:

if((RootPanel.get("someHomeWidget")!=null)&& 
  (RootPanel.get("someOtherHomeWidget")!=null)) 
{ 
  // do the stuff 
} 

为了在主页打开时不执行管理入口点,反之亦然。

不进行上述检查还涉及如果我在主页和管理页面中有一个同名的 div,无论我在其中注入什么,都会在每个页面上显示两次。

这在 1000 英里外很臭,显然是错误的:在人们的经验中,这样做的正确方法是什么?

任何帮助表示赞赏!

4

7 回答 7

8

正确的方法是每个模块有一个入口点,将适当的小部件粘贴在适当的 div 中:

RootPanel panel = RootPanel.get("someHomeWidget");
if (panel) panel.add(new HomeWidget());

panel = RootPanel.get("adminWidget");
if (panel) panel.add(new AdminWidget());

这样,它只会扫描页面以查找您拥有的任何 div 并插入适当的小部件。因此,您的 HTML 页面决定了何时显示哪些小部件,并且 GWT 代码已准备好处理任何情况。上面没有什么不好的,这是你的入口点应该写的方式。

另一种选择是,如果您的管理区域和通常区域完全不同(例如:您想在不同的时间加载它们),那么它们应该是单独的模块,具有单独的入口点。

于 2009-05-31T00:27:49.803 回答
4

我还想在 GWT 玩具应用程序中使用多个页面,我想我想通了。它需要对部署描述符(myApp.gwt.xml)进行一些按摩,但这就是我所做的。

  • 制作了另一个实现 EntryPoint 的类,并添加了一些仅在新页面中添加到 div 的代码。
  • 复制了原来的gwt.xml,改了两处:
    • 模块重命名为 - 我改为“anothergwtapp”
    • 入口点指定了新类。
  • 当我编译项目时,“war”文件夹中有另一个目录,称为(等待它......)“anothergwtapp”。它包含 GWT 魔法“anothergwtapp.nocache.js”。
  • 最后,我复制了原始 HTML 页面并将“stockwatcher/stockwatcher.nocache.js”替换为“anothergwtapp/anothergwtapp.nocache.js”(是的,我很新——教程还在我的机器上)
    • 我将新的 HTML 更改为稍有不同(用于填充新入口点的新 div),并在第一页的新页面中添加了一个简单的 href。

有效。只需复制 gwt.xml 并为模块提供一个新名称以与新的应用程序页面一起使用。我查看了其他一些链接,实际上我可能已经完成了所描述的内容,但是有太多的单词和重定向等(即我并没有真正阅读任何内容)。我正在为 Galileo 使用最新的 GWT 插件,所以现在可能是 IJW。

于 2009-10-08T04:51:00.873 回答
1

不要将管理和主页视为不同的页面。页面的概念不适用于 GWT,因为只有一个页面,即单个入口点。如果你想赋予不同页面的效果,那么使用 GWT 的 URL 重写特性。

如果您确实想使用不同的入口点,那么如上面评论中所述,使用不同的模块。

于 2009-06-01T06:20:17.863 回答
1

通常最好只有一个入口点。一个模块中的多个入口点都同时启动,有时会做一些你没想到的事情。

在如何分别处理它时,您有很多选择: - 有 2 种不同的编译,一种用于 Admin,一种用于 Home 应用程序。- 使用历史标记来指示您想要管理员或主页 - 检查 JS 变量以显示其中一个 - 检查特定 DIV id 的存在以显示管理员或主页 (RootPanel.get(id)) - 使用 URL 参数来表明申请。- ... ETC

于 2009-06-12T07:23:36.893 回答
1

有一个简单(棘手)的方法来实现这一点:

将 Main 类设为您的切入点。

<module rename-to='gwt'>
  <inherits name='com.google.gwt.user.User'/>
  <entry-point class='com.example.client.Main'/>
  <source path='client'/>
  <source path='shared'/>
</module>;<br/>

创建此 Main.java 以像调度程序一样工作:

package com.example.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;

public class Main implements EntryPoint {

  public void onModuleLoad() {

    String url = Window.Location.getHref();
    if ( url.indexOf("?install")>-1 ) {
      Install install = Install.getInstance();
      RootPanel.get().add(install);      
    else if ( url.indexOf("?admin")>-1 ) {
      Admin admin = Admin.getInstance();
      RootPanel.get().add(admin);    
    } else {
      Application app = Application.getInstance();
      RootPanel.get().add(app);      
    }
  }
}

现在,不同的类 Application、Admin 和 Install 像单独的单元一样工作。

这是一个简单的安装示例:

package comexample.client;

import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;

public class Install extends FlowPanel {

  /** Singleton stuff - to access Main from all subclasses! */
  private static Install singelton;
  public static Install getInstance() {
    if (singelton == null) {singelton = new Install();}
    return singelton;
  }

  /** Constructor - called by Main.onModuleLoad() */
  private Install() {
    this.add(new HTML("<h1>Do whatever You have to do!</h1>"));
  }
}

您不需要 Singleton 的东西 (getInstance),但它在大型应用程序中非常方便。

现在在 /war-directory 中创建名为 install 和 admin 的目录,并在其中创建一个 HTML 页面,如下所示:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0; URL=/index.html?install">
</head>
<body></body>
</html>

因此,当用户将他的浏览器指向http://www.example.com/install时,他将被重定向到http://www.example.com/index?install并且 index.html 绑定到将调度的 Main.java请求并加载 Install.java

于 2011-12-14T12:29:24.847 回答
0

我的博客上有一个解决方案。您可以下载具有多个入口点并使用 url-rewriting 的示例 maven 项目。看看:http: //zenoconsulting.wikidot.com/blog :16

于 2009-09-10T20:33:50.623 回答
0

你试过这个框架了吗? http://gwtmultipage.org/ 克劳迪斯

于 2010-08-01T20:56:12.680 回答