GXT的MVC框架(转的自己看)

对于过去几个月,我一直在开发一个GWT应用程序使用的是混合纯醇'的GWTGXT 部件。当我第一次开始开发它,我不知道如何以最佳方式组织我的代码和单独的逻辑。该解决方案,我又是通过一些MVC框架排序。既然我已经使用GXT,我选择了GXT的轻量级MVC实现

正如提到的GWT应用测试 外,GXT的MVC 没有那么多的文档 。最好的参考文件似乎是基督徒的GWT - Ext的入门:邮件参考应用

佩奇的过渡与调度
经过与GXT MVC的工作了几个月,我真不知道我完全明白如何导航和事件调度工作。我最大的一点混乱的,是如何以最佳方式使用GXT的调度 类。

与调度的问题是它有两种方法,似乎做同样的事情。

  • forwardEvent (4变化)
  • dispatch (3变化)

除了这些方法在调度员,有2 fireEvent 的方法GXT 视图 类。根据我的计算,这意味着有一种意见认为从9过渡到下一个不同的选择。哪一个是最好用?

从我所学到的,我认为这是最好使用fireEvent 的意见和forwardEvent 在控制器和其它部件。海事组织, dispatcher 应该永远不会被执行,除非你使用HistoryListener的onHistoryChanged 方法。重要的是要实现这个方法是应该 只工作,如果在视图的控制器是事件注册的。

  保护无效fireEvent(AppEvent事件)(
    控制器? =控制器;
    而(三!=空)(
      如果(c.canHandle(事件))(
        c.handleEvent(事件);
      )
      ? = c.parent;
    )
  )

然而, fireEvent 似乎工作,即使在视图的控制器是不注册该事件。这是因为onHistoryChanged 得到入口点调用的。对于有经验的GXT MVC的用户,这是否与您的导航处理结果网?

在导航最重要的工作是成功地使历史的支持。如何有效地完成这项下一节会谈。

启用历史支持
为了更好地帮助解释的事情,我创建了一个简单的GWT的MVC示例应用程序和使用Maven来创建一个与它的原型。您可以创建一个从原型项目使用以下命令:

命令mvn原型:创建,DarchetypeGroupId = org.appfuse.archetypes \
- DarchetypeArtifactId =的GWT的MVC - DarchetypeVersion = 1.0 - SNAPSHOT的\
- DgroupId = com.mycompany.app - DartifactId = myproject \
- DremoteRepositories = http://oss.sonatype.org/content/repositories/appfuse-snapshots

为了让历史在此应用程序支持,我实现了HistoryListener 在我的入口点(Application.java)并添加下面的逻辑来初始化:

/ /如果在应用程序启动,没有历史的象征,重定向到'家'的状态
弦乐initToken = History.getToken();
如果(initToken.length()== 0)(
    History.newItem(HistoryTokens.HOME);
)

/ /添加监听器的历史
History.addHistoryListener(本);

/ /现在我们已经设置的侦听器,火灾初期的历史状态。
History.fireCurrentHistoryState();

在这个例子中,HistoryTokens是一个类,包含了所有的“意见申请”的网址。

公共类HistoryTokens(
    公共静态最后弦乐首页=“家”;
    公共静态最后弦乐日历=“日历”;
    最后附注公共静态字符串=“笔记”;
    公共静态最后字符串搜索=“搜索”;
)

为了使像http://localhost:8080/#网址查看日历到日历,下面的逻辑存在于onHistoryChanged 方法。

        调度调度= Dispatcher.get();

        如果(historyToken!=空)(
            如果(historyToken.equals(HistoryTokens.HOME))(
                dispatcher.dispatch(AppEvents.GoHome);
            )否则如果(historyToken.equals(HistoryTokens.CALENDAR))(
                dispatcher.dispatch(AppEvents.Calendar);
            )否则如果(historyToken.equals(HistoryTokens.NOTES))(
                dispatcher.dispatch(AppEvents.Notes);
            )否则如果(historyToken.equals(HistoryTokens.SEARCH))(
                dispatcher.dispatch(AppEvents.Search);
            否则)(
                GWT.log(“HistoryToken'”+ historyToken +“'不存在!”,空);
            )
        )

对于EntryPoint控制器是在注册如下:

        最后调度调度= Dispatcher.get();
        dispatcher.addController(新CalendarController());
        dispatcher.addController(新HomeController的());
        dispatcher.addController(新NotesController());
        dispatcher.addController(新SearchController());

控制器回应他们注册的事件。这是在他们的构造函数:

    公共CalendarController()(
        registerEventTypes(AppEvents.Calendar);
    )

在航行秩序的工作,你必须创建1个 链接历史标记。例如,这里是一个链接,从HomeView 类:

	超链接notesLink =新的超链接(“票据”,HistoryTokens.NOTES);
	notesLink.addClickListener(新ClickListener()(
	    公共无效的onClick(小工具小工具)(
	        Dispatcher.get()。fireEvent(AppEvents.Notes);
	    )
	));

你会注意到在这个例子中,我使用Dispatcher的fireEvent 方法。如果我想通过您的活动的一些数据,您将需要使用forwardEvent 。下面是一个从例子CalendarView

    按钮提交=新的按钮(“提交”);

    submit.addSelectionListener(新SelectionListener <ButtonEvent>()(
        公共无效componentSelected(ButtonEvent CE认证)(
            AppEvent <日期> =事件 
                新AppEvent <日期(AppEvents.GoHome,date.getValue(),HistoryTokens.HOME);
            Dispatcher.forwardEvent(事件);
        )
    ));

在这个例子中,你也可以使用Dispatcher.dispatcher() 但我相信,这将导致发生两次转变,因为onHistoryChanged 方法被调用了。这并不是问题的大部分,除了当您开始使用DispatcherListener

希望这篇文章已经帮助您了解如何GXT的MVC框架工程。我现在在学习如何其他GWT的MVC框架的工作感兴趣。如果您使用过的,我很乐意听到你的经验。

1。如果您使用默认的构造和使用上的超链接setText() 请务必致电setTargetHistoryToken() 了。如果你不这样做,一个空白的历史将被用来标记和#导致浏览器出现滚动页面过渡前的顶部。


本文摘自:http://java.dzone.com/articles/gxts-mvc-framework

你可能感兴趣的:(maven,mvc,框架,gwt,Appfuse)