2009-05-30 2 views
9

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

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

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

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

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

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

Любая помощь оценена!

ответ

8

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

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

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

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

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

+0

В моем случае главная страница и страница администратора должны загружаться в разное время (они разные страницы!) - так что даже с одной точкой входа он не найдет divs, и это вызовет исключение. С другой стороны, неясно, как использовать разные модули, как настроить конфигурацию, с которой следует запускать страницу. – JohnIdol

+1

Почему бы ему не найти divs? Вы понимаете, что вы можете поместить импорт javascript для GWT на столько страниц, сколько захотите. Таким образом, вы положили его на свою страницу администратора и уделили бы админу div дальше страницы. Затем вы также поместите его на обычную страницу и получите нормальный div дальше страницы. Если у вас есть несколько модулей, с другой стороны, вы просто включаете импорт javascript для модуля, который вы хотите на нужную вам страницу, на самом деле это довольно просто. – rustyshelf

+0

Это приятное решение. – Feargal

1

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

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

+0

Спасибо. Я не очень хорошо знаком с переписыванием URL (не могли бы вы предоставить некоторые ссылки?). Каков наилучший подход в любом случае между этим и несколькими модулями? В таком сценарии, как тот, который вы описываете, почему это возможно в первую очередь для определения нескольких точек входа? Вы говорите, что нельзя использовать несколько точек входа в одном модуле? – JohnIdol

+0

Hi John, Для перезаписи URL я предлагаю вам пройти всю историю, связанную с материалами в GWT. Множественные точки входа для модулей - много раз, особенно для корпоративных приложений, вы можете захотеть развернуть набор модулей и не развернуть другой набор модулей на основе того, что клиент купил. Это основная концепция модуля. Каждый модуль, имея отдельную точку входа, представляет собой отдельно развертываемую единицу приложения. Несколько точек входа в одном модуле, не имеет смысла для меня с технической точки зрения, а также с точки зрения бизнеса. – sbidwai

1

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

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

+0

Ваш комментарий о нескольких точках ввода, все, начиная с того же времени, - это то, что я испытываю, когда пытаюсь упаковать базовое приложение и расширить его. Спасибо, что подтвердили мои подозрения в том, почему точка входа может быть вызвана несколько раз. – Stevko

0

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

4

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

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

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

+0

Я искал это! Спасибо. – McTrafik

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

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

Вот, например, простая установка:

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), но это очень удобно в больших приложениях.

Теперь в/военном каталоге создавать каталоги с именем установки и администратором, и очень их создать 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