Подключение GWT-Dispatch с республикой и MVP4G
-
03-10-2019 - |
Вопрос
У меня есть несколько вопросов, касающихся GWT-Dispatch и Bearice. Я использую GWT-Dispatch 1.1.0, GWT-Dispatch 1.1.0, MVP4G 1.1.0 и джин 1.0
Прежде всего, я определил простое действие, результат и обработчик:
Listcontactsaction.java
public class ListContactsAction implements Action<ListContactsResult>{
public ListContactsAction() {
}
}
Listcontactsresult.java
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
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
Для инъекций, что-то вроде этого:
@Provides
public SqlSessionFactory getSqlSessionFactory(){
// some code here
}
Я прочитал на GWT-Dispatch начать, что я должен обеспечить привязку между моим действием, и он обработчик, который должен выглядеть что-то подобное:
public class ContactModule extends ActionHandlerModule{
@Override
protected void configureHandlers() {
bindHandler(ListContactsAction.class, ListContactsHandler.class);
}
}
Но у меня есть проблемы с проводкой все это с республикой, потому что этот пример от сайта GWT-Dispatch:
public class DispatchServletModule extends ServletModule {
@Override
public void configureServlets() {
serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
}
}
не работает, так как нет DispatchServiceServlet
в пакете.
Мои вопросы:
- Как я должен написать DispatchservletModule и как сделать его (с тем, что я должен обслуживать путь)
- Что я должен поместить в файл Web.xml в моем приложении, чтобы иметь возможность правильно выполнять действия из моего ведущего, который вводится джин
DispatcherAsync
реализация - Где я должен положить свой
SqlSessionFactory
Обеспечение метода (в каком модуле) сможет вводить SQLSessionFactory, где мне это нужно - Как я создал инжектор, поэтому я могу использовать его в других обработчиках действий правильно
Я думаю, что это все, и я решил себя ясно. Если что-то недостаточно ясно, я постараюсь быть более конкретным.
Нет правильного решения
Другие советы
Вы создали класс GuiceVlevletConfig? Это то, где вы устанавливаете ваш модуль Servlet Dispatch, а также модуль обработчика действий с ущевием.
plubic class GuiceServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
}
}
HandleModule - это ваш класс модуля ActionHandler, так что из вашего кода вы поставьте свой класс контактаModule.
Для вашей SQLSessionFactory вы можете настроить привязку для него в вашем контактМодуле, с моим кодом у меня есть только один серверModule, который устанавливает все моих привязки моего обслуживания и обработчика действий. Это в основном для простоты.
GWT-Platform Framework использует вилку GWT-Dispatch для обработки запросов RPC. Есть много кода, который вы, вероятно, наверное пришлось вас, если вы думаете о серьезном использовании диспетчера и удивления. Я настоятельно рекомендую это.
Во-первых, я сочувствую. Положить это все вместе не документировано ни в одном месте. Я отвечу каждому из ваших вопросов в свою очередь. Добавьте комментарии к моему ответу, если кто-то из него неясен.
Qu: Как я должен написать DispatchservletModule и как сделать его (с тем, что я должен обслуживать путь)?
В пакете Net.Customware.gwt.dispatch.server.gwice есть класс GuicestandddispatchsEvlets использовать это. Я не на 100% уверен, почему, но используемый путь, включает имя моего модуля GWT, а затем «/ Dispatch». Возможно, вам придется экспериментировать с этим.
public class MyServletModule extends ServletModule {
@Override protected void configureServlets() {
serve("/com.my.module.name/dispatch")
.with(GuiceStandardDispatchServlet.class);
}
}
Qu: Что я должен поместить в файл Web.xml в моем приложении, чтобы иметь возможность правильно выполнять действия из моего ведущего, который имеет DispatcheraSync Джин впрыснул Dispatcherasync?
<?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>
... И тогда вам понадобится пользовательский слушатель контекста, который создает инжектор для говядины следующим образом. Обратите внимание, что я включил ваш контактModule, который связывает обработчики действий.
public class MyContextListener extends GuiceServletContextListener {
@Override protected Injector getInjector() {
return Guice.createInjector(new MyServletModule(),
new ContactModule(), new SQLStuffModule());
}
}
Qu: Где я должен поставить свой метод предоставления SQLSessionFactory (в каком модуле) сможет ввести SQLSessionFactory, где мне это нужно?
Обратите внимание, что я включил новый SQLStuffModule в предыдущем фрагменте кода; Это было бы хорошим местом для привязки к SQLSessionSessionalactory. Там нет вреда, имея несколько модулей, и я обнаружил, что он сохраняет различные проблемы красиво разделенными.
Qu: Как я создал инжектор, поэтому я могу использовать его в других обработчиках действий?
Для Server-Side см. Фарпте кода MyContextListener выше.
На стороне клиента вам понадобится пользовательский интерфейс инжектора что-то вроде этого:
@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
MyWidgetMainPanel getMainPanel();
}
... И вы можете связать ваш MVP вещи в пользовательском модуле Gin следующим образом. Мне жаль, что я не знаком с MVP4G, но я предполагаю, что вам нужно будет провозить взгляды и ведущие вместе в классе модулей.
public class MyClientModule extends AbstractGinModule {
@Override protected void configure() {
bind(...).to(...);
...
}
}