同一模块中有多个入口点的问题

时间:2009-05-30 12:28:37

标签: gwt module project-structure entry-point

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

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

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

我现在的安装方式 - 我需要在我的内容中查看这样的内容 OnModuleLoad:

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

以便在Home时不执行Admin Entrypoint 页面被打开,反之亦然。

不进行上述检查也涉及到如果我有一个div 无论我注入的是Home和Admin页面中的相同名称 它每个都出现两次。

这在1000英里之外发臭,显然是错误的:这是正确的 在人们体验中这样做的方法?

任何帮助表示赞赏!

7 个答案:

答案 0 :(得分: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代码已准备好处理任何情况。上面没有什么东西发臭,这是你的入口点应该写的方式。

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

不要将管理员和主页视为不同的页面。页面概念不适用于GWT,因为只有一个页面,即单个入口点。  如果要实现不同页面的效果,请使用GWT的URL重写功能。

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

答案 3 :(得分:1)

通常只有一个EntryPoint会更好。一个模块中的多个EntryPoints都在同一时间开始,有时可以执行您不期望的事情。

您有很多选择如何单独处理它: - 有2个不同的编辑,一个用于管理员,一个用于家庭应用程序。 - 使用历史记录标记表示您需要管理员或主页 - 检查JS变量以显示其中一个 - 检查是否存在特定的DIV ID以显示Admin或Home(RootPanel.get(id)) - 使用URL参数指示应用程序。 - ......等

答案 4 :(得分:1)

有一种简单(棘手)的方法可以实现这一目标:

制作主要课程您的入门点。

<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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你有没有试过这个框架? http://gwtmultipage.org/ 克劳