Java 吕震中本:如何创建新页面

Java 吕震中本:如何创建新页面,java,gwt,Java,Gwt,我有一个一页的GWT MVP应用程序。如何创建新页面并链接到该页面?您可以做一件事,在同一页面上制作不同的布局,在特定操作中,您可以隐藏一个布局并显示其他布局或组件。GWT支持通过URL在应用程序内创建页面,即http://www.yourhost.vom/main#pagename,其中“pagename”是表示应用程序中“页面”的片段标识符 通过向主机页添加iframe启用: <iframe src="javascript:''" id="__gwt_historyF

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

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

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

  • 通过向主机页添加iframe启用:

    <iframe src="javascript:''" 
            id="__gwt_historyFrame" 
            style="width:0;height:0;border:0">
    </iframe>
    
    
    
  • 注册ValueChangeHandler,以便在历史记录(页面)更改时收到通知。在这个处理程序中,您放置了一个显示新页面的逻辑

  • 通过调用
    History.newItem(“newpage”)


  • 这就是我最后做的:

    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
    

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

    使用它,您可以使用简单的Java注释定义视图(由唯一URL标记引用的小部件)。该框架为您提供服务,并隐藏所有样板代码

    以下是一个例子:

    @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 tracking和用户授权。

    无论您想在哪里开始监听页面更改,通常是在应用程序启动时(例如,在您的
    onModuleLoad()中)
    History.newItem(Login.TOKEN);
    
    @View(Login.TOKEN)
    public class Login extends Composite {
    //... your code, you can use UIBinder, procedural UI, whatever you like