Проблема с несколькими точками входа в одном модуле - PullRequest
9 голосов
/ 30 мая 2009

У меня есть несколько точек входа в одном модуле.

Например, у меня есть домашняя точка входа для домашней страницы и администратор точка входа для страницы администратора.

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

Способ, которым я сейчас настроен - мне нужно проверить somt, как это в моем OnModuleLoad:

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

, чтобы точка входа администратора не выполнялась, когда домашний страница открывается и наоборот.

Отсутствие проверки выше также подразумевает, что если у меня есть div с одно и то же имя на домашней странице и странице администратора, что бы я ни вводил в он появляется дважды на каждом из них.

Это воняет за 1000 миль и, очевидно, неправильно: что правильно способ сделать это в опыте людей?

Любая помощь приветствуется!

Ответы [ 7 ]

8 голосов
/ 31 мая 2009

Правильный способ состоит в том, чтобы иметь одну точку входа на модуль, которая вставляет соответствующие виджеты в соответствующие 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 готов справиться с любой ситуацией. Ничто в вышеперечисленном не воняет, именно так должна быть написана ваша точка входа.

Альтернативой является то, что если ваша административная область и обычно область совершенно разные (например, вы хотите загружать их в разное время), тогда они должны быть отдельными модулями с отдельными точками входа.

4 голосов
/ 08 октября 2009

Я также хотел использовать несколько страниц в игрушечном приложении 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-код, чтобы он немного отличался (новые div-ы для загрузки новой точки входа для заполнения), и я добавил простую ссылку на новую страницу на первой странице.

Это сработало. Просто продублируйте gwt.xml и введите новое имя для модуля, чтобы он соответствовал новой странице приложения. Я посмотрел на некоторые другие ссылки и, возможно, я действительно сделал то, что было описано, но было слишком много слов и перенаправлений и тому подобного (т.е. я действительно ничего не читал). Я использую последний плагин GWT для Galileo, так что, возможно, IJW сейчас.

1 голос
/ 14 декабря 2011

Существует простой (хитрый) способ добиться этого:

Сделать основной класс Вашей точкой входа.

<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 создайте каталоги с именем 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

1 голос
/ 12 июня 2009

Обычно лучше иметь только одну EntryPoint. Несколько EntryPoints в одном модуле запускаются одновременно, и это может иногда делать то, что вы не ожидали.

У вас есть много вариантов, как обращаться с ним отдельно: - Имеют 2 разных компиляции, один для администратора и один для домашнего приложения. - Используйте жетоны истории, чтобы указать, что вы хотите администратора или дома - Проверьте переменную JS, чтобы показать одну или другую - Проверьте наличие определенного идентификатора DIV, чтобы показать администратора или дома (RootPanel.get (id)) - Используйте параметры URL, чтобы указать приложение. - ... и т. д.

1 голос
/ 01 июня 2009

Не рассматривайте Admin и домашнюю страницу как разные страницы. Концепция страниц не применима к GWT, поскольку существует только одна отдельная страница, то есть одна точка входа. Если вы хотите придать эффект различным страницам, используйте функции перезаписи URL в GWT.

Если вы хотите использовать разные точки входа, то, как сказано в комментарии выше, используйте разные модули.

0 голосов
/ 02 августа 2010

Вы уже пробовали этот фреймворк? http://gwtmultipage.org/ Клавдий

0 голосов
/ 11 сентября 2009

У меня есть решение для этого в моем блоге. Вы можете скачать пример проекта maven, который имеет несколько точек входа и использует перезапись URL. Взгляните: http://zenoconsulting.wikidot.com/blog:16

...