首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将gwt-调度与guice和mvp4g连接起来

将gwt-调度与guice和mvp4g连接起来
EN

Stack Overflow用户
提问于 2010-05-05 20:58:32
回答 3查看 1.4K关注 0票数 0

我有一些关于gwt-调度和guice的问题。我正在使用Guice2.0,gwt-分派1.1.0快照,mvp4g 1.1.0和GIN 1.0

首先,我定义了简单的操作、结果和处理程序:

ListContactsAction.java

代码语言:javascript
复制
public class ListContactsAction implements Action<ListContactsResult>{

    public ListContactsAction() {
    }

}

ListContactsResult.java

代码语言:javascript
复制
public class ListContactsResult implements Result {

    private List<Contact> contactList;

    public ListContactsResult() {
    }

    public ListContactsResult(List<Contact> contactList) {
        this.contactList = contactList;
    }

    public List<Contact> getContactList() {
        return contactList;
    }
}

ListContactsHandler.java

代码语言:javascript
复制
public class ListContactsHandler implements ActionHandler<ListContactsAction, ListContactsResult>{

    @Inject
    private SqlSessionFactory factory;

    public Class<ListContactsAction> getActionType() {
        return ListContactsAction.class;
    }

    public ListContactsResult execute(ListContactsAction a, ExecutionContext ec) throws DispatchException {
        // some code using SqlSessionFactory and returning ListContactResult
        // with list of contacts
    }

    public void rollback(ListContactsAction a, ListContactsResult r, ExecutionContext ec) throws DispatchException {
        /* get action - no rollback needed */
    }

}

在我的应用程序的早期版本中,它使用rpc服务而不是命令模式,在这个版本中,我有一个为注入提供SqlSessionFactory的方法,如下所示:

代码语言:javascript
复制
@Provides
    public SqlSessionFactory getSqlSessionFactory(){
        // some code here
    }

我在gwt-分派入门版上读到,我必须在我的操作和它的处理程序之间提供绑定,它应该是这样的:

代码语言:javascript
复制
public class ContactModule extends ActionHandlerModule{
    @Override
    protected void configureHandlers() {
        bindHandler(ListContactsAction.class, ListContactsHandler.class);
    }
}

但是我在与Guice连接时遇到了问题,因为这个来自gwt-分派站点的例子:

代码语言:javascript
复制
public class DispatchServletModule extends ServletModule {
    @Override
    public void configureServlets() {
        serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
    }
}

不工作,因为包中没有DispatchServiceServlet

我的问题是:

我应该如何编写implementation

  • Where,以及如何使它运行(使用我应该使用的路径)

我想仅此而已,我说得很清楚。如果有些事情不够清楚,我会尽量说得更具体一些。

EN

回答 3

Stack Overflow用户

发布于 2010-05-06 00:36:13

您创建了一个GuiceServletConfig类吗?这是您使用Guice设置模块和动作处理程序模块的地方。

代码语言:javascript
复制
plubic class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
    }
}

HandlerModule是您的ActionHandler模块类,因此您可以从代码中放置ContactModule类。

对于您的SqlSessionFactory,您可以在ContactModule中为它设置绑定,使用我的代码,我只有一个ServerModule来设置所有服务和操作处理程序绑定。这主要是为了简单。

票数 1
EN

Stack Overflow用户

发布于 2011-01-19 16:19:31

gwt-平台框架使用gwt-分派叉来处理rpc请求。如果您认真考虑使用dispatcher和Guice,可能需要自己处理大量代码。我强烈推荐它。

票数 1
EN

Stack Overflow用户

发布于 2011-01-19 18:08:59

首先,我对此表示同情。所有这些都没有记录在任何一个地方。我会依次回答你们的每一个问题。如果有任何不清楚的地方,请在我的回答中添加评论。

QU:我应该如何编写DispatchServletModule,以及如何使它运行(我应该为路径服务)?

在GuiceStandardDispatchServlet包中有一个net.customware.gwt.dispatch.server.guice类;请使用它。我不能百分之百确定原因,但是我使用的路径包括我的GWT模块的名称,后面是‘/分派’。你可能得试一试。

代码语言:javascript
复制
public class MyServletModule extends ServletModule {
  @Override protected void configureServlets() {
    serve("/com.my.module.name/dispatch")
      .with(GuiceStandardDispatchServlet.class);
  }
}

QU:我应该在我的应用程序的web.xml文件中放些什么才能正确地执行我的演示者的操作,它已经注入了DispatcherAsync实现?

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>com.myapp.whatever.MyContextListener</listener-class>
  </listener>
  ...
</web-app>

..。然后,您将需要一个自定义上下文侦听器,它创建Guice注入器,如下所示。注意,我已经包含了您的ContactModule,它绑定了操作处理程序。

代码语言:javascript
复制
public class MyContextListener extends GuiceServletContextListener {
  @Override protected Injector getInjector() {
    return Guice.createInjector(new MyServletModule(), 
      new ContactModule(), new SQLStuffModule());
  }
}

QU:我应该把我的SqlSessionFactory提供方法(哪个模块)放在哪里才能在我需要它的地方注入SqlSessionFactory?

注意,我在前面的代码片段中包含了一个新的SQLStuffModule;这将是放置SqlSessionFactory绑定的好地方。拥有多个模块是没有坏处的,我发现它使不同的关注点保持了良好的分离。

如何实例化注入器,以便在其他动作处理程序中正确地使用它?

有关服务器端,请参见上面的MyContextListener代码片段。

在客户端,您需要一个定制的注入器接口,如下所示:

代码语言:javascript
复制
@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
  MyWidgetMainPanel getMainPanel();
}

...and,您可以将MVP内容绑定到定制的Gin模块中,如下所示。很抱歉,我不熟悉mvp4g,但我假设您需要在模块类中将视图和演示程序连接在一起。

代码语言:javascript
复制
public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2776726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档