Java 如何在GWT中创建多个页面?

Java 如何在GWT中创建多个页面?,java,gwt,Java,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不接受入口点对象!add()只接受一个小部件!好

我有一个登录页面和主页。登录后,我有

    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不接受入口点对象!add()只接受一个小部件!好的,我扩展这个小部件

公共类SDM_Mailer扩展小部件实现入口点{

但现在,当我尝试在GWT Designer中编辑SDM_Mailer时,会出现以下错误:


那么,究竟如何创建多个页面,这些页面不都在同一个巨型类文件中,也不都在使用tab?我知道我以前做过,但不记得了,而且使用的是较旧的版本。

通常只有一个
入口点
,从那里可以添加不同的小部件(可以表示不同的页面)并对其进行管理

对于小型应用程序来说,一个非常简单的方法是在表示页面的不同小部件上使用
.setVisible(true)
setVisible(false)
,但从长远来看,这不是一个好方法

您还可以有一个容器小部件,在其中添加您想要显示的任何小部件,然后当您想要在其中放置新的小部件时,将其清除

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

上述建议适用于小型应用程序,但在应用程序具有大量页面(视图)时并不适用。管理页面(视图)的常用方法是使用。这会带来大量开销,但可扩展且效果良好。

您可以采用活动和位置

正如向该官员提到的:

Activities and Places框架允许您在应用程序中创建可设置书签的URL,从而允许浏览器的后退按钮和书签按照用户的预期工作

活动

活动只是表示用户正在做的事情。活动不包含小部件或UI代码

地点

place是表示UI特定状态的Java对象。place可以转换为URL历史标记,也可以转换为URL历史标记


来源:

扩展小部件并不能神奇地使某些东西在HTML中表现出来。小部件提供HTML中某些东西的图形表示,也就是说,将它们自己呈现为HTML的一种方式,这通常是通过实现来实现的。我强烈建议您采用MVP方法,并使用活动、位置和视图。请查看做吧,这比你想象的要简单


如果您使用的是Eclipse,那么大部分样板文件都会用到它。您可以看看如何使用它。

这就是我最后要做的:

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

这似乎很熟悉,可能是我几年前提出的。

只是出于好奇,你认为隐藏/可见的解决方案是安全的吗?例如,我可以想象,没有登录的人只需更改html属性,就可以访问页面的授权版本。你的意见是什么?这取决于你如何提供e访问小部件。如果纯粹通过URL访问,则可能存在安全问题。但您需要做的只是在设置视图之前检查权限。这与
.clear()
/
.add()基本相同
或MVP活动和场所。在使任何视图可见之前,您需要检查权限。@fascynacja它肯定不安全,但随后您的整个应用程序将从一开始下载,如果用户确定,则可以反编译所有Javascript。始终在服务器端验证ev的身份验证和凭据这个答案并没有真正解决将多个页面分离并在设计器中以单独的文件编辑它们的问题。你不能只使用小部件类,因为设计器不会加载小部件。你为什么要这样做?这不是GWT应该使用的方式。应该只有一个
入口点
。Ypu应该真正使用MVP。它是e确切地说,GWT应该如何使用。历史记录在文档中。否则,谷歌插件将提供一个下拉菜单来“创建新的GWT页面”,它将自动添加所有锅炉板,并在GWT Designer中进行编辑,在入门指南中会有一个简单的多页面示例。看看这些都不存在s、 谷歌希望你制作自己的控制器和导航框架,这与Rails非常不同。
<entry-point class='com.example.client.Controller' /> 
History.newItem(Login.TOKEN);