2013-09-30 2 views
0

У меня есть страница входа и главная страница. После входа у меня естьКак создать несколько страниц в GWT?

public void onSuccess(String result) { 
     // go to the next page 
     SDM_Mailer page = new SDM_Mailer(); 
     RootPanel.get().remove(0); 
     RootPanel.get().add(page); 
    } 

Однако RootPanel не принимает объект EntryPoint! add() принимает только виджет! Хорошо, таким образом я расширяю виджет

public class SDM_Mailer extends Widget implements EntryPoint {

Но теперь, когда я пытаюсь изменить SDM_Mailer в конструкторе GWT, он дает эту ошибку:

Imgur

Так как именно вы создаете несколько страниц, которые не все находятся в одном файле гигантского класса или с помощью вкладки? Я знаю, что сделал это раньше, но не помню и с более старой версией.

ответ

-2

Это то, что я в конечном итоге делает:

package com.example.client; 

import java.util.logging.Logger; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.shared.GWT; 
import com.google.gwt.event.logical.shared.ValueChangeEvent; 
import com.google.gwt.event.logical.shared.ValueChangeHandler; 
import com.google.gwt.user.client.History; 
import com.google.gwt.user.client.ui.RootPanel; 

public class Controller implements EntryPoint { 
    private static Controller instance; 
    private static final Logger log = Logger.getLogger(Controller.class.getName()); 

    // I have a feeling GWT does not respect private constructors, or else it uses some other voodoo. 
    private Controller(){} 

    public static Controller getInstance() { 
     if (instance == null) instance = new Controller(); 
     return instance; 
    } 

    @Override 
    public void onModuleLoad() { 
     String token = History.getToken(); 
     log.info("****************************** token:"+token); 
     History.addValueChangeHandler(new ValueChangeHandler<String>() { 
      @Override 
      public void onValueChange(ValueChangeEvent<String> event) { 
       navigate(event.getValue()); 
      } // onValueChange 
     }); 
     if (token == null || token.length() == 0) History.newItem(Login.TOKEN); // no token 
     else navigate(token); // restore app state 
    } 

    private static void navigate(String token) { 
     RootPanel rootPanel = RootPanel.get("gwtApp"); 
     if (rootPanel.getWidgetCount() > 0) rootPanel.remove(0); // clear the page 

     if (Login.TOKEN.equals(token)) { 
      Login page = Login.getInstance(); 
      page.onModuleLoad(); 
     } else if (MainApp.TOKEN.equals(token)) { 
      MainApp page = MainApp.getInstance(); 
      page.onModuleLoad(); // display the page 
//   page.setAuthenticated(true); 
//   page.setUsername(email); 
     } 

    } 

} // Controller 

В вашем * .gwt.XML-файл:

<entry-point class='com.example.client.Controller' /> 

Теперь, когда вы хотите, чтобы перейти на новую страницу:

History.newItem(Login.TOKEN); 

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

+0

Зачем вы это делаете? Похоже, что GWT не используется. Там должен быть только один «EntryPoint». Ypu действительно должен использовать MVP. – enrybo

+0

Именно так предполагается использовать GWT. История находится в документах. В противном случае плагин Google предоставит раскрывающееся меню «Создать новую страницу GWT», и он автоматически добавит все плиты котла, и он будет доступен для редактирования в GWT Designer, и в руководстве Getting Started будет многостраничный пример. Видя, как ничто из этого не существует, Google хочет, чтобы вы создали свой собственный контроллер и систему навигации. Это очень похоже на Rails. – Chloe

0

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

Очень простой способ сделать это для небольшого приложения может состоять в использовании .setVisible(true) и setVisible(false) на разных виджетах, представляющих страницы, но это не очень хороший метод в долгосрочной перспективе.

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

container.clear(); 
container.add(widget) 

Предложения, приведенные выше, подходят для небольших приложений, но не очень хороши, когда в вашем приложении много страниц (просмотров). Популярным способом управления страницами (представлениями) является использование MVP Activities and Places. Это много накладных расходов, но они масштабируемы и хорошо работают.

+1

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

+0

Это зависит от того, как вы предоставляете доступ к виджетам. Если это чисто по URL-адресу, это может быть проблемой безопасности. Но все, что вам нужно сделать, это проверить разрешения перед установкой представления. Это в основном та же проблема с '.clear()' /'.add() 'или с MVP Activities и Places. Вы должны проверить разрешения, прежде чем сделать видимым вид. – enrybo

+0

@fascynacja Это определенно не безопасно, но затем все ваше приложение загружается для начала, и если пользователь был определен, можно декомпилировать весь Javascript. Всегда проверяйте аутентификацию и учетные данные на стороне сервера для каждого действия. Этот ответ на самом деле не рассматривает разделение нескольких страниц и редактирование их в дизайнере в отдельных файлах. Вы не можете просто использовать классы Widget, потому что дизайнер не загрузит Widgets. – Chloe

1

Вы можете принять Рубрики и области.

Как уже говорилось в официальном gwt project site:

The Activities and Places framework allows you to create bookmarkable URLs within your application, thus allowing the browser's back button and bookmarks to work as users expect.

активность

An activity simply represents something the user is doing. An Activity contains no Widgets or UI code.

Место

A place is a Java object representing a particular state of the UI. A Place can be converted to and from a URL history token

Источник: http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html

0

Расширение виджета не делает магическим образом что-то представимое в HTML. Виджеты предоставляют графическое представление чего-то в HTML, то есть способ сделать себя в HTML, это достигается путем реализации UIBinders. Я настоятельно рекомендую вам использовать подход MVP и использовать «Действия», «Места» и «Виды». проверьте official documentation о том, как это сделать, это проще, чем вы думаете.

Если вы работаете с Eclipse, the GWT plugin делает большую часть шаблона. Вы можете посмотреть this video о том, как его использовать.

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