Учитывая, что вы хотите добавить «HTML-страницы» для существующего приложения GWT, я предлагаю манипулировать DOM, а не создавать вторую точку входа. Что делать - если вам нужно создать страницу контакта, страницу и страницу конфиденциальности для этого приложения?
Chris's SO answer on GWT navigation дает действительно хорошее решение для поддержки нескольких состояний в приложении GWT.
Я внедрил свой собственный вариант, основанный на ответе Криса; здесь я подробно останавливаюсь только на деталях моей реализации. Я считаю, что это эффективно для управления
несколькими штатами в приложении GWT с
история поддержка.
Как было предложено, я использую следующий HTML:
<table id="wrapper">
<!-- Header row -->
<tr style="height: 60px;">
<td colspan="2" id="header"></td>
</tr>
<!-- Body row and left nav row -->
<tr style="vertical-align: top;">
<td id="leftnav"></td>
<td id="content"></td>
</tr>
</table>
Затем я определил топ-уровня Composite класса, каждый из которых отдельные страницы наследуется в применении:
public abstract class Content extends Composite{
public abstract String getToken();
public abstract String getWindowTitle();
}
Токен и название окна для каждой страницы определяются в классе под названием «PageDefs:
»
public class PageDefs{
public static final String WelcomeToken = "WELCOME";
public static final String WelcomeTitle = "Welcome to My App";
public static final String AppToken = "APP";
public static final String AppTitle = "My App";
}
Содержание класс используется абстрактно одноэлементной ContentContainer:
public class ContentContainer implements ValueChangeHandler<String> {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
String token = (String) event.getValue();
this.setContentByToken(token);
}
public void setContentByToken(String token) {
if (token.equals(PageDefs.WelcomeToken)) {
this.setContent(new WelcomePage());
} else if (token.equals(PageDefs.AppToken)) {
this.setContent(new MyApp());
} else {
Window.alert("Error in parsing history token: '" + token + "'");
}
}
private void setContent(Content content) {
RootPanel contentRoot = RootPanel.get("content");
contentRoot.clear();
this.content = content;
History.newItem(content.getToken(), false);
// check for special initializations:
if (content.getToken().equals(PageDefs.AppToken)) {
((MyApp) content).MyInit();
}
contentRoot.add(content);
header.setHeader(content.getWindowTitle());
Window.setTitle(content.getWindowTitle());
Window.scrollTo(0, 0);
}
private static ContentContainer myInstance = new ContentContainer();
public static synchronized ContentContainer getInstance() {
return myInstance;
}
private ContentContainer() {
History.addValueChangeHandler(this);
}
private Header header;
private Content content;
public void setHeader(Header h) {
this.header = h;
}
}
ContentContainer хранит локальную ссылку на класс заголовка. Это связано с тем, что мне нужен динамический заголовок и заголовок окна, которые зависят от состояния приложения. Кроме того, все, от управления содержимым приложения, заголовка, заголовка окна и истории, содержится в одном классе.
В моей реальной реализации ContentContainer также отслеживает сеанс пользователя. Таким образом, метод ContentContainer onValueChange
заставляет загружать страницу входа в систему, если сеанс пользователя отсутствует или истек.
Заголовок представляет собой связующее устройство UI с одной переменной InlineHTML, HTML которой устанавливается методом setHeader
.Для левого навигационного меню я также использую связующее UI с анкерами GWT с #WELCOME
и #APP
в качестве значений href.
Наконец, нам нужно загрузить каждый раздел приложения в точке входа:
public void onModuleLoad() {
Header h = new Header();
h.setHeader(PageDefs.WelcomeTitle);
RootPanel.get("header").add(h);
ContentContainer.getInstance().setHeader(h);
RootPanel.get("leftnav").add(new NavMenu());
String token = Window.Location.getHash().length() == 0?
PageDefs.WelcomeToken : Window.Location.getHash();
ContentContainer.getInstance().setContentByToken(PageDefs.SignupToken);
}
Вот как мне удается несколько страниц в своих приложениях GWT. Эта дополнительная работа может показаться трудной, но я считаю, что это стоит усилий. Если ваше приложение обрабатывает некоторый ввод и визуализирует вывод, кнопки вперед и назад представляют собой интуитивные навигационные инструменты между формой и визуализацией.