Почему перехватчик Struts 2 не может изменить страницу результатов, созданную последующими перехватчиками?

Я читал Struts2 в действии, и там говорилось, что если перехватчик B срабатывает после перехватчика A и B определяет, что элементу управления нельзя разрешить переход к действию (поскольку могут быть ошибки проверки, как это делает DefaultWorkFLowInterceptor). Затем он возвращает "input" ... и страница отображается для пользователя. Затем управление возвращается перехватчику A, но A не может изменить результат, поскольку страница уже была отправлена ​​клиенту.

Но поскольку перехватчик B возвращает только строку, перехватчик A может просто вернуть другую строку вместо нее, и результат изменится. DefaultWorkFLowInterceptor возвращает просто строку, на самом деле он ничего не записывает в поток ответа, поэтому, когда управление возвращается к своим предыдущим перехватчикам, почему они не могут изменить ввод?


person Daud    schedule 30.03.2012    source источник


Ответы (2)


Даже если вы измените строку результата, уже слишком поздно, поскольку результат уже был отрисован клиенту (UI).

Вызов перехватчика происходит в обратном порядке, чтобы можно было выполнить любую пост-обработку, такую ​​как очистка любых ресурсов или запись любой важной информации.

Если вы хотите изменить результат, вы можете использовать PreResultListener. PreResultListener может повлиять на вызов действия между фазой перехватчика / действия и фазой результата. Типичные варианты использования включают переключение на другой результат или какое-либо изменение объектов результата или действия перед выполнением результата.

Подробнее см. Документ

person Umesh Awasthi    schedule 30.03.2012
comment
Я хочу предложить здесь небольшую поправку. Перехватчики могут быть выполнены до [и / или] после выполнения действия. Перехватчик, который требует постобработки, вызывается только в обратном порядке, но не все перехватчики не участвуют. Пожалуйста, проверьте свой второй пункт. - person MohanaRao SV; 30.03.2012
comment
@MohanaRaoSV: Согласитесь, это касается стека перехватчиков, который мы настраиваем, и того, что я объяснил общий поток, как S2 проходит через уровень перехватчика и что на самом деле они делают в процессе - person Umesh Awasthi; 02.04.2012

У меня создалось впечатление, что перехватчик вызывает другой перехватчик (и, следовательно, строка, возвращаемая перехватчиком, принимается предыдущей, которую он может изменить). Фактически, перехватчик вызывает метод invoke класса ActionInvocation, который, в свою очередь, вызывает следующий перехватчик. Это также означает, что результирующая строка, возвращаемая перехватчиком, сначала будет получена ActionInvocation, который может фактически отобразить страницу ответа для клиента перед передачей управления предыдущим перехватчикам.

person Daud    schedule 30.03.2012