使用MVP模式保留GWT中的导航/历史状态

时间:2010-12-09 17:35:42

标签: java gwt mvp gwt-mvp gwt-history

我已根据Google推荐的MVP模式实施了一个基本的GWT应用。我想弄清楚的是,一旦用数据填充应用程序,存储导航/历史状态的最佳方法。

假设您有一个将一堆数据返回到CellTable的搜索。如果我导航到搜索结果中的特定项目到另一个面板,除非Presenter / View存储在某个地方,否则带有搜索结果的初始Panel将会消失,因此我可以在后退导航中轻松访问它。

所以,我的问题是,像Gmail这样的应用程序如何保留状态以进行反向导航?有没有关于如何实施这个的例子?

3 个答案:

答案 0 :(得分:2)

Gmail不使用GWT,所以我假设你只想要一个高级答案。

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

答案 1 :(得分:1)

GWT有几个MVP库项目,它们使用Place的概念来表示Presenters的状态。场所实现通常将状态映射到#之后的URL片段。因此,它们的工作方式与Gmail的状态处理类似。

例如,使用gwt-presenter项目,您可能拥有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());
}
}

当网址格式为/ data#state = 12345时,系统会要求此地点根据参数准备Presenter。之后,将调用Presenter中的reveal方法。由于该地方已经准备好了州,因此您可以根据需要恢复视图。

答案 2 :(得分:1)

您在哪里创建活动?您应该返回现有活动,而不是每次更改地点时创建新活动。活动通常在ActivityMapper中创建。您有两种选择:

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

  2. 使用CachingActivityMapper打包ActivityMapper。它将返回现有的Activity,而不是创建新的。{/ p>