Java GWT MVP:连接演讲者、活动、显示器上的点;地点

Java GWT MVP:连接演讲者、活动、显示器上的点;地点,java,gwt,mvp,gwt-activities,gwt-places,Java,Gwt,Mvp,Gwt Activities,Gwt Places,我正在尝试设计我的第一个超级简单的GWT应用程序,它利用了GWT的大多数主要API特性。我想我已经完成了70-80%的工作,但是在浏览了大量的GWT文档、无数的文章,并在这里发布了许多其他与GWT相关的问题之后,我仍然很难理解最后20-30%的工作是什么 我已经调用了第一个测试应用程序ClickItToWinIt,我希望它看起来像这样: 当用户单击“Win”按钮时,左侧的图像框中会弹出一张图片(Win pic.png)。当用户单击“丢失”按钮时,同一帧中会弹出一张图片(Lose pic.png

我正在尝试设计我的第一个超级简单的GWT应用程序,它利用了GWT的大多数主要API特性。我想我已经完成了70-80%的工作,但是在浏览了大量的GWT文档、无数的文章,并在这里发布了许多其他与GWT相关的问题之后,我仍然很难理解最后20-30%的工作是什么

我已经调用了第一个测试应用程序
ClickItToWinIt
,我希望它看起来像这样:

当用户单击“Win”按钮时,左侧的图像框中会弹出一张图片(
Win pic.png
)。当用户单击“丢失”按钮时,同一帧中会弹出一张图片(
Lose pic.png
)。用户可以在按钮之间来回单击以显示不同的图片。这将是一个单页应用程序,在我的机器上本地托管,只需要包含一个主页、一个模块/入口点等

请注意对于这样一个简单的
ClickItToWinIt
app来说,下面提出的打包/类结构肯定是过火了。然而,不久之后,我想用GWT做更多更好的事情,所以在我开始使用更复杂的UI处理更大的应用程序之前,了解正确的GWT编码对我来说很重要

此外,以下提议的结构基于谷歌似乎不懈鼓励的3项GWT原则:

  • 表现;客户端速度
  • 保安
  • 分离关注点(MVP等),便于测试
这里还有最后一项:通常,在我的PHP webdev时代,我在一些网站中使用了“主题/皮肤”的概念,方法是使用不同的CSS文件部署网站,该文件只是将不同的样式规则应用于相同的DOM元素。因此,我可能有一个“
normal styles.css
”文件,使网站看起来“正常”,但也有一个“
facebook styles.css
”文件,使网站具有facebook的外观(颜色、字体等),等等,我想在这里完成同样的事情,并提出一个
net.bfodder.c2w.client.views.themes
包,其中将包含
AbstractTheme
子类。这些子类在构建时会以某种方式注入/烘焙到视图/演示器中,并为我提供了一种使用不同主题或外观部署应用程序的方法。我相信这是正确的方法,因为(如果我对
ClientBundle
CssResource
的理解是正确的)GWT似乎将对象化CSS样式转换为GWT POJO。我的
AbstractTheme
子类将以某种方式与
CssResource
绑定,并为我的所有
小部件定义样式

下面是建议的
src/main/java
结构
ClickItToWinIt
(我正在使用谷歌Eclipse插件在Eclipse3.7Indigo中开发):

AppController
用于任何不属于任何特定
IPresenter
子类的古怪应用程序级业务逻辑。
main模块
是一切开始的地方(DI、开始初步的
活动
等)。按钮放在
ButtonContainer
中,
ImageViewer
放在
ImageContainer
中,这两个内部容器都放在
maincainer
中(我假设它是在
MainModule
中创建的)。至于这些UI组件的布局和样式,就像我说的,这将取决于注入/配置的
AbstractTheme
在其规则集中定义的内容

我正在使用推荐的
ClientFactory
,以方便访问应用程序GWT管道的主要部分

至于MVP“东西”,我是这么想的:

public class WinActivity extends AbstractActivity {
    private final ClientFactory clientFactory;
    private final WinPlace place;

    public WinActivity(ClientFactory clientFactory, WinPlace place) {
        this.clientFactory = clientFactory;
        this.place = place;
    }

    @Override
    public void start(AcceptsOneWidget panel, EventBus eventBus) {
        ImagePresenter presenter = clientFactory.getImagePresenter();

        // Inject the presenter with any stateful data here
        // presenter.setImage(getWinImageUri());

        presenter.go(panel);
    }
}
问题! 正如我上面所说的,我相信我就快到了,我只是在一些事情上很难弥合差距。所以我问:

  • 如何连接我的
    AbstractTheme
    子类以使用
    CssResource
    ClientBundle
    ,以便我的应用程序被注入/配置正确的主题,并且客户端浏览器下载正确的CSS文件(
    normal style.CSS
    facebook style.CSS
  • 有人能正确地解释一下
    i呈现者
    (来自经典MVP)、
    AbstractActivity
    、“显示区域”(
    AcceptsOneWidget
    )和
    Place
    之间的关系吗?这里是否存在1对1对1的关系,或者GWT是否打算为每个
    抽象活动
    ,或者其他一些比率设置多个显示区域
  • 如何将
    WinPlace
    与GWT的历史API连接?因此,如果用户单击
    WinButton
    LoseButton
    WinButton
    ,如何将其保存在浏览器历史记录中,以便他们可以点击前/后浏览器按钮并反复重新创建此使用模式
  • 单击
    WinButton
    时,它会在事件总线上放置一个some click事件。在何处以及如何将处理程序/侦听器连接到事件总线,该事件总线将知道:(a)在
    ImageViewer
    中更改图像,以及(b)在历史API中存储此状态更改
  • 我从中得到了关于
    AppController
    的想法,不幸的是,它从未提供任何关于
    AppController
    实际外观的代码片段。任何人(熟悉GWT的
    AppController
    模式的人)都能解释一下这是什么样子吗?也许它是一个
    IPresenter
    子类,没有特定的
    活动
    或视图组件
  • 总的来说,我知道这种“氨基硝酸盐”式的问题是不被鼓励的,但我必须问任何在战场上的GWT老兵:我在这里离基地太远了,还是我或多或少地走上了GW的轨道
    public class WinActivity extends AbstractActivity {
        private final ClientFactory clientFactory;
        private final WinPlace place;
    
        public WinActivity(ClientFactory clientFactory, WinPlace place) {
            this.clientFactory = clientFactory;
            this.place = place;
        }
    
        @Override
        public void start(AcceptsOneWidget panel, EventBus eventBus) {
            ImagePresenter presenter = clientFactory.getImagePresenter();
    
            // Inject the presenter with any stateful data here
            // presenter.setImage(getWinImageUri());
    
            presenter.go(panel);
        }
    }