Java 使用MVP模式在GWT中保存导航/历史状态

Java 使用MVP模式在GWT中保存导航/历史状态,java,gwt,mvp,gwt-mvp,gwt-history,Java,Gwt,Mvp,Gwt Mvp,Gwt History,我已经根据谷歌推荐的模式实现了一个基本的GWT应用程序。我想弄明白的是,一旦用数据填充应用程序,存储导航/历史状态的最佳方法 假设您有一个搜索,它将一组数据返回到CellTable中。如果我将搜索结果中的特定项目导航到另一个面板,则带有搜索结果的初始面板将消失,除非演示者/视图存储在某个位置,以便我可以通过反向导航轻松访问它 所以,我的问题是,像Gmail这样的应用程序做了什么来保留状态以供反向导航?有没有关于如何实现这一点的例子 Gmail不使用GWT,所以我假设你只是想要一个高层次的答案 G

我已经根据谷歌推荐的模式实现了一个基本的GWT应用程序。我想弄明白的是,一旦用数据填充应用程序,存储导航/历史状态的最佳方法

假设您有一个搜索,它将一组数据返回到CellTable中。如果我将搜索结果中的特定项目导航到另一个面板,则带有搜索结果的初始面板将消失,除非演示者/视图存储在某个位置,以便我可以通过反向导航轻松访问它


所以,我的问题是,像Gmail这样的应用程序做了什么来保留状态以供反向导航?有没有关于如何实现这一点的例子

Gmail不使用GWT,所以我假设你只是想要一个高层次的答案


Gmail使用URL片段(在
#
之后的部分)。当你在Gmail中浏览时,你会注意到片段会变成Gmail导航中每个“位置”的唯一标识符。使用片段可以让浏览器为您执行所有跟踪,而无需重新加载页面。然后,您只需监视片段,当它发生更改时,您就可以导航到它指定的位置。

GWT有几个MVP库项目使用位置的概念来表示演示者的状态。Place实现通常将状态映射到#后面的URL片段。因此,它们的工作原理与Gmail的状态处理类似

例如,使用该项目,您可能有一个DataPresenter和一个DataPlace:

public class DataPlace extends ProvidedPresenterPlace<DataPresenter> {

@Inject
public DataPlace(Provider<DataPresenter> presenter) {
    super(presenter);
}

@Override
public String getName() {
    return "data";
}

@Override
protected void preparePresenter( PlaceRequest request, DataPresenter presenter ) {
    String state = request.getParameter("state", null);
    if (state != null) {
        // set the presenter state
        presenter.setState(State.valueOf(state));
    }
}

@Override
protected PlaceRequest prepareRequest( PlaceRequest request, DataPresenter presenter ) {
    return request.with("state", presenter.getState().toString());
}
}
公共类DataPlace扩展提供的PresenterPlace{
@注入
公共数据场所(提供程序-演示者){
超级(主持人);
}
@凌驾
公共字符串getName(){
返回“数据”;
}
@凌驾
受保护的void preparePresenter(PlaceRequest请求、DataPresenter presenter){
字符串状态=request.getParameter(“状态”,null);
如果(状态!=null){
//设置演示者状态
presenter.setState(State.valueOf(State));
}
}
@凌驾
受保护的PlaceRequest prepareRequest(PlaceRequest请求、DataPresenter presenter){
返回request.with(“state”,presenter.getState().toString());
}
}

当URL的表单/数据#state=12345时,将要求该位置根据参数准备演示者。之后,将调用Presenter中的reveal方法。由于该位置已准备好状态,因此您可以根据需要恢复视图。

在何处创建活动?您应该返回现有的活动,而不是在每次位置更改时创建新的活动。活动通常在
ActivityMapper
中创建。您有两个选择:

  • 更改
    ActivityMapper
    ,以便在第一次调用时创建
    Activity
    实例,并在后续调用时返回此实例。或者

  • 用于包装您的
    活动标签
    。它将返回现有的
    活动
    ,而不是创建新活动


  • 是的,我见过。但是,我也注意到它有时缓存结果,有时返回并在返回时加载。那么,如果你想将这种行为转化为GWT应用程序,它会是什么样子呢。是否可以将客户端上的演示者缓存在某种Hashmap中,并基于历史标记以保留状态从映射中检索它们?我有一些关于如何做到这一点的想法,我只是想知道在我开始实施之前,是否有一种更可接受/更好的方法来做到这一点。默认情况下,浏览器不会强制重新加载。您必须提供确定显示器是否刷新的逻辑。这是一种很好的做事方式——继续并开始实施吧!我想我有点困惑,既然GWT2.1已经实现了这个模式,为什么我需要为MVP使用一个单独的库。这两者的区别是什么?我假设这在不使用外部库的情况下是可以解决的,这是旧的1.7代码中的一个例子。我还没有接触到2.1,所以你可能会在那里找到更好的东西。:)