Проблема с несколькими точками входа в одном модуле

StackOverflow https://stackoverflow.com/questions/929661

Вопрос

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

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

<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 
} 

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

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

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

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

Это было полезно?

Решение

Правильный способ - иметь единую точку входа для каждого модуля, которая вставляет соответствующие виджеты в соответствующие divs:

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

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

Таким образом, он просто сканирует страницу в поисках любых имеющихся у вас divs и вставляет соответствующий виджет.Таким образом, ваша HTML-страница определяет, какие виджеты когда будут отображаться, а код GWT готов справиться с любой ситуацией.В вышесказанном нет ничего такого, что воняло бы, именно так должна быть написана ваша точка входа.

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

Другие советы

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

  • Создал еще один класс, реализующий EntryPoint, и добавил некоторый код, который добавляется в div только на новой странице.
  • Скопировал оригинал gwt.xml и изменил две вещи:
    • Модуль-переименовать-в - I изменен на "anothergwtapp".
    • Точка входа указывала новый класс.
  • Когда я компилирую проект, в папке "war" есть другой каталог под названием (подождите его ...) "anothergwtapp".Он содержал "anothergwtapp.nocache.js", то есть магию GWT.
  • Наконец, я скопировал оригинал страницы HTML и заменить "stockwatcher/stockwatcher.nocache.js" с "anothergwtapp/anothergwtapp.nocache.js" (да, я очень новый - учебник по-прежнему на моей машине)
    • Я изменил новый HTML, чтобы он немного отличался (новые divs для заполнения при загрузке новой точки входа), и я добавил простой href к новой странице на первой странице.

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

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

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

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

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

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

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

<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>"));
  }
}

Вам не нужен синглетный материал (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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top