Struts 1 Ajax-вызов обрабатывается дважды - PullRequest
1 голос
/ 31 января 2012

У меня есть приложение Struts 1, которое использует Ajax для создания и удаления некоторых объектов в приложении.И для операций создания, и для удаления, когда операция публикуется браузером, она обрабатывается сервером дважды.

Это , а не , когда ajax публикуется дваждыбраузер.Я использовал прокси-инструмент Paros, чтобы подтвердить, что ajax-запрос отправляется только один раз браузером, но мой класс действий по-прежнему вызывается дважды.

Используя Eclipse, я установил точку останова отладки и заметил, что вызовстек не всегда одинаков для моего класса действий.

Первый проход, который я получаю

MyActionClass.getDisplayPage(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 65   
MyActionClass(Action).execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 224 
ExecuteAction.execute(ActionContext, Action, ActionConfig, ActionForm) line: 53 
ExecuteAction(AbstractExecuteAction).execute(ActionContext) line: 64    
ExecuteAction(ActionCommandBase).execute(Context) line: 48  
ChainBase.execute(Context) line: 190    
LookupCommand.execute(Context) line: 304    
ChainBase.execute(Context) line: 190    
ComposableRequestProcessor.process(HttpServletRequest, HttpServletResponse) line: 280   
ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1858   
ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 459 

Второй проход, который я получаю (дополнительные строки отмечены ***)

MyActionClass.getDisplayPage(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 65   
***MyActionClass.unspecified(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 199  
***MyActionClass(DispatchAction).dispatchMethod(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse, String) line: 242   
***MyActionClass(DispatchAction).execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 167  
***MyActionClass(Action).execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) line: 217  
ExecuteAction.execute(ActionContext, Action, ActionConfig, ActionForm) line: 53 
ExecuteAction(AbstractExecuteAction).execute(ActionContext) line: 64    
ExecuteAction(ActionCommandBase).execute(Context) line: 48  
ChainBase.execute(Context) line: 190    
LookupCommand.execute(Context) line: 304    
ChainBase.execute(Context) line: 190    
ComposableRequestProcessor.process(HttpServletRequest, HttpServletResponse) line: 280   
ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1858   
ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 459 

За исключением отмеченных различий, стеки вызовов идентичны.

Вот действие по настройке распорок, относящееся к этому сообщению

<action path="/myAjaxRequest"
  type="com..example.MyActionClass"
  name="myActionForm"
  parameter="save">
</action>

Есть ли у кого-нибудь какие-либо идеи относительноидет второй проход?Я не знаю, с чего начать.

1 Ответ

0 голосов
/ 07 февраля 2012

Оказывается, такое поведение вызвано "особенностью" приложения. Кто бы ни разрабатывал приложение, он отвергал метод DispatchAction.execute (). Переопределяющий метод execute () при получении нулевого ActionForward от класса действия попытается снова вызвать действие, используя другой путь вызова.

Так как мое действие обслуживает ajax-запрос, после успешного выполнения он возвращал значение null. В результате мое действие вызывалось снова методом execute (), и запрос обрабатывался второй раз.

...