2014-01-20 2 views
0

Я хочу использовать аннотированные классы DWR в моем проекте. Поэтому я создал 2 класса. Предположим Dwr1.java & Dwr2.javaНесколько классов DWR в web.xml (используя аннотации)

в моей web.xml я иметь следующую запись для загрузки классов:

<servlet> 
    <display-name>DWR Servlet</display-name> 
    <servlet-name>dwr-invoker</servlet-name> 
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>activeReverseAjaxEnabled</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>classes</param-name> 
     <param-value> 
      de.package.Dwr1, 
      de.another.package.Dwr2 
     </param-value> 
    </init-param> 
    <load-on-startup>3</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dwr-invoker</servlet-name> 
    <url-pattern>/dwr/*</url-pattern> 
</servlet-mapping> 

Proplem является то, что Dwr2 класс не получает экземпляр. Если я удалю Dwr1 из моего web.xml, Dwr2 получает экземпляр. Но если у меня есть две записи в моем web.xml, создается только экземпляр Dwr1.

Dwr1 очень простой класс:

@RemoteProxy 
public class Dwr1 { 

    @RemoteMethod 
    public String getString(String key) { 
     return Util.GetString(key); 
    } 
} 

Dwr2 является немного более сложным, как:

@RemoteProxy 
public class Dwr2 { 

    @RemoteMethod 
    public Dwr2() { 
     ServerUtil.registerOnFE(new UpdateClient()); 
    } 

    private void updateBrowser(final String arg) { 
     Browser.withPage("/page.do", new Runnable() { 
      @Override 
      public void run() { 
       ScriptSessions.addFunctionCall("update", arg); 
      } 
     }); 
    } 

    private class UpdateClient { 
     @Override 
     onRecieveUpdate(String arg) { 
      updateBrowser(arg); 
     } 
    } 
} 

Есть ли какие-либо ошибки в моих классах, или в моем web.xml? Или как я могу создать несколько классов DWR с аннотациями?

ответ

0

Я нашел решение, чтобы исправить эту проблему. Кажется, что DWR не создает экземпляр каждого класса при запуске сервера. (Но это, по-видимому, есть, если в файле конфигурации есть только один класс). Однако я только что реализовал «манекен-метод» в dwr-классах, называемый «start()». Метод ничего не делает, но когда он вызван из javascript, класс получает экземпляр. Мое решение выглядит следующим образом:

<servlet> 
    <display-name>DWR Servlet</display-name> 
    <servlet-name>dwr-invoker</servlet-name> 
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>activeReverseAjaxEnabled</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>classes</param-name> 
     <param-value> 
      de.package.Dwr1, 
      de.another.package.Dwr2 
     </param-value> 
    </init-param> 
    <load-on-startup>3</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dwr-invoker</servlet-name> 
    <url-pattern>/dwr/*</url-pattern> 
</servlet-mapping> 
  • Dwr1

    @RemoteProxy 
    public class Dwr1 { 
    
        @RemoteMethod 
        public String getString(String key) { 
         return Util.GetString(key); 
        } 
    } 
    
  • Dwr2

    @RemoteProxy 
    public class Dwr2 { 
    
        public Dwr2() { 
         ServerUtil.registerOnFE(new UpdateClient()); 
        } 
    
        @RemoteMethod 
        public void start() { 
         //Do nothing 
        } 
    
        private void updateBrowser(final String arg) { 
         Browser.withPage("/page.do", new Runnable() { 
          @Override 
          public void run() { 
           ScriptSessions.addFunctionCall("update", arg); 
          } 
         }); 
        } 
    
        private class UpdateClient { 
         @Override 
         onRecieveUpdate(String arg) { 
          updateBrowser(arg); 
         } 
        } 
    } 
    

Вызов старта() - метод класса Dwr2 инициирует наводнение.

+0

в вашем 'start()' из 'Dwr2' вы ничего не писали? –

+0

Нет, это действительно пусто. Но я рекомендую поместить в него комментарий, который описывает, почему существует пустой метод. – Schlangguru

Смежные вопросы