GWT:如何创建新页面

我有一个页面的GWT MVP应用程序。 如何创建新页面并链接到该页面?

如果您使用GWT谈论页面导航,此链接可能对您有所帮助。

您可以做一件事,在同一页面上制作不同的布局,在特定的操作中,您可以隐藏一个布局并显示其他布局或组件。

GWT通过URL 片段标识符支持应用程序中的页面,即http://www.yourhost.vom/main#pagename ,其中“pagename”是表示应用程序中“页面”的片段标识符。

  1. 通过向主页添加iframe来启用历史记录支持 :

      
  2. 注册ValueChangeHandler以在历史(页面)更改时得到通知。 在此处理程序中,您放置一个显示新页面的逻辑。

  3. 通过调用History.newItem("newpage")转到特定页面

我创建了一个开源的MIT许可项目,以简化GWT中的页面导航处理。 看看GWT Views项目。

使用它,您可以使用简单的Java注释定义View(由唯一URL令牌引用的Widget)。 该框架负责为您进行代码分割 ,并隐藏所有样板代码。

这是一个例子:

 @View(Login.TOKEN) public class Login extends Composite { //... your code, you can use UIBinder, procedural UI, whatever you like 

使用History.newItem(Login.TOKEN) ,将在页面上呈现Login小部件。

框架也处理了许多常见用例,例如ViewContainers,404页面,Google Analytics跟踪和用户授权。

这就是我最终做的事情:

 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() { @Override public void onValueChange(ValueChangeEvent 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文件中:

  

现在,当您想要转到新页面时:

 History.newItem(Login.TOKEN);