У меня несколько точек входа в один модуль.
Например, у меня есть точка входа Home для домашней страницы и точка входа администратора для страницы администратора.
<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 миль и, очевидно, неверно: как правильно это сделать на собственном опыте?
Любая помощь приветствуется!
7 ответов
Правильный способ - иметь одну точку входа для каждого модуля, которая вставляет соответствующие виджеты в соответствующие 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 готов обработать любую ситуацию. В вышеперечисленном нет ничего плохого, это то, как должна быть написана ваша точка входа.
Альтернативой является то, что ваша административная область и обычная область совершенно разные (например, вы хотите загружать их в разное время), тогда они должны быть отдельными модулями с отдельными точками входа.
Я также хотел использовать несколько страниц в игрушечном приложении 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 для загрузки новой точки входа для заполнения), и я добавил простой href на новую страницу на первой странице.
Это сработало. Просто продублируйте файл gwt.xml и укажите новое имя для модуля, которое будет отображаться вместе с новой страницей приложения. Я просмотрел некоторые другие ссылки и, возможно, действительно сделал то, что было описано, но было слишком много слов, перенаправлений и тому подобного (т.е. я действительно ничего не читал). Я использую последний плагин GWT для Galileo, так что, возможно, сейчас IJWs.
Не считайте админку и домашнюю страницу разными страницами. Концепция страниц не применима к GWT, так как существует только одна отдельная страница, то есть одна точка входа. Если вы хотите создать эффект разных страниц, воспользуйтесь функцией перезаписи URL в GWT.
Если вы действительно хотите использовать разные точки входа, то, как сказано в комментарии выше, используйте разные модули.
Обычно лучше иметь только одну точку входа. Несколько EntryPoints в одном модуле запускаются одновременно, и иногда это может делать то, чего вы не ожидали.
У вас есть множество вариантов, как обрабатывать это по отдельности: - Имейте 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>"));
}
}
Вам не нужен материал 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.
У меня есть решение в моем блоге. Вы можете загрузить образец проекта maven, который имеет несколько точек входа и использует функцию перезаписи URL. Взгляните: http://zenoconsulting.wikidot.com/blog:16
Вы уже пробовали этот фреймворк? http://gwtmultipage.org/ Клавдий
Похожие вопросы
Новые вопросы
gwt
GWT (ранее Google Web Toolkit) - это набор инструментов для разработки и оптимизации сложных браузерных приложений. Его цель - обеспечить продуктивную разработку высокопроизводительных веб-приложений, не требуя от разработчика быть экспертом в особенностях браузера, XMLHttpRequest и JavaScript. GWT используется во многих продуктах Google, включая новые версии AdWords и групп. Это с открытым исходным кодом и совершенно бесплатно (Apache 2.0 лицензирован).