2013-06-10 3 views
2

Я пытаюсь разработать веб-сайт в GWT, в котором я должен сделать 2 html-страницу. Первая страница html в главной странице приветствия, а вторая страница html - это главная страница, из которой вызывается весь виджет GWT.Несколько страниц в Gwt

Со второй страницы HTML я должен назвать класс точки входа проекта так для этого я должен предоставить скрипт

<script type="text/javascript" language="javascript" src="firstpage/firstpage.nocache.js"></script>

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

Plz помогите мне выполнить скрипт со второй html-страницы. Заранее спасибо.

ответ

0

Ваша вторая страница html должна содержать запись iframe.

 <!-- OPTIONAL: include this if you want history support --> 

<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' 
style="position:absolute;width:0;height:0;border:0"></iframe>`` 
2

Учитывая, что вы хотите добавить «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. Эта дополнительная работа может показаться трудной, но я считаю, что это стоит усилий. Если ваше приложение обрабатывает некоторый ввод и визуализирует вывод, кнопки вперед и назад представляют собой интуитивные навигационные инструменты между формой и визуализацией.

Смежные вопросы