java - GWT:地点、历史和 MVP 示例

标签 java gwt android-activity mvp gwt-history

假设我想创建一个由两个简单“屏幕”组成的 GWT 应用程序:

  • 用户在应用程序首次启动时看到的主菜单(他们转到特定的 URL)- 对于这个简单的示例,忘记登录屏幕等;和
  • 编辑首选项“页面”/屏幕/ View ,当用户单击主菜单上的按钮时,它会取代主菜单;此“编辑首选项”屏幕还有一个按钮,可将用户带回主菜单;因此
  • 用户可以整天简单地在主菜单和编辑首选项“页面”(这是 GWT,所以它实际上是一个单页应用程序)之间来回切换

因此伪代码可能如下所示:

public class MainMenuPresenter implements Presenter {
    // mainMenuScreen may be a Composite that contains a Button for
    // switching/navigating to the EditPreferencesView
    private MainMenuView mainMenuScreen;
}

public class EditPreferencesPresenter implements Presenter {
    // editPrefsScreen may be a Composite that contains a Button for
    // switching/navigating back to the MainMenuView
    private EditPreferencesView editPrefsScreen;
}

问题:

  1. 地点 及其关联的 Activity 如何适应这种范式?如果它是 MVP 和 Places/Activities 之间的选择,那么使用 Activities/Places 范例的这个示例看起来如何?
  2. 如果 MVP 和 Activities/Places 可以很好地协同工作(并且不相互排斥),那么我们如何在这里实现 GWT 的 History API,以便我们可以将 MainMenuView 设置为历史中的一个“位置” , EditPreferencesView 作为第二个“位置”,然后允许用户点击后退/前进浏览器按钮并在它们之间不断切换?
  3. 如果 MVP 和 Activities/Places 相互排斥,而我必须在两者之间做出选择,那么上面问题 #2 中的代码是否有任何不同之处需要更改?

我还对 Place 如何与 ActivityManager 相关联,以及如何/由谁触发/处理 PlaceChangeEvents 感兴趣,但我我会保存它以备后用;我需要先了解这些概念,然后才能继续学习这些概念。提前致谢!

最佳答案

我将尝试概述一个适用于您的情况的示例设置。有很多变体,但我想专注于一个简单的变体(并鼓励您思考可以调整的地方)。

1。定义 URL 标记

选择一些 URL 标记,例如“#mainmenu”和“#editprefs”,它们将附加到主机页面的 URL。它们将用于浏览器历史记录,因此后退和前进按钮起作用等。

URL 处理将由 DefaultHistorian 自动为您完成。 PlaceChangeEvent 将由 PlaceController 触发。

2。将标记映射到 Place 对象

Place 对象只是 token 的面向对象抽象 - 这很有用,因为更高级的 token 也可以采用需要解析的参数。您需要一种方法将标记映射到 Place 对象。这是 PlaceHistoryMapper 的职责。

在我的示例中,我们将简单地手动实现 PlaceHistoryMapper 以将“#mainmenu”映射到 MainMenuPlace 并将“#editprefs”映射到 EditPreferencesPlace。

[或者,也可以使用@WithTokenizers 注释并为每种类型的地点实现一个(空的)PlaceTokenizer。然后,您可以使用 @Prefix 注释将“mainmenu”和“editprefs”指定为标记。]

3。将地点映射到 Activity

Place 对象本身不做任何事情——如上所述,它基本上只是一个抽象标记。实际代码将在 Activity 中运行。因此,您必须将地点映射到 Activity 。这是 ActivityMapper 的职责。

在我的示例中,您将实现它以将 MainMenuPlace 映射到 MainMenuActivity 并将 EditPreferencePlace 映射到 EditPreferenceActivity。

4。 Activity 和主持人

为简单起见,在我的示例中, Activity 还将实现 Presenter。所以 MainMenuActivity 将实现 MainMenuPresenter。这根本不是必需的,但也许是一个不错的起点。这就是 Places+Activities 可以与 MVP 连接的地方。这两个概念互不要求,但可以很好地协同工作:

  • Activities+Places 基本上是关于历史 token 和 Activity 之间的连接。
  • MVP 基本上是关于 Presenter 和 View 之间的连接。

如果您让 Activity(或其委托(delegate)之一)实现 Presenter,则您已将两者连接起来。

5。快速概览

"#mainMenu"
---(PlaceHistoryMapper)---> MainMenuPlace
---(ActivityMapper)---> MainMenuActivity implements MainMenuPresenter

关于java - GWT:地点、历史和 MVP 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12326192/

相关文章:

java - 为什么 ResultSet 不从 MySQL 返回数据

java - 如何将类型添加到 GWT 的序列化策略白名单?

android - 在 Activity 上下文之外启动新的 Activity。

Android Activity 处理(恢复/重启)

android - Activity 太多会影响我的表现吗?

java - 当使用架构验证无效 XML 时,为什么我没有得到异常?

java - 我使用spring-cloud-stream无法发送消息,但可以接收消息

java - 使用 Java 在 Google App Engine 上存储上传的图像

java - 从 Spring Controller 访问 GWT 表单值

css - GXT4.0中通过CSS设置文本域大小