Защо прехващач на Struts 2 не може да модифицира страницата с „резултат“, генерирана от последващи прихващачи?

Четох Struts2 в действие и се казваше, че ако прехващач B стреля след прехващач A и B определя, че на контрола не трябва да бъде разрешено да премине към действие (тъй като може да има грешки при проверката, както е направено от DefaultWorkFLowInterceptor). След това връща "input".. и страницата се изобразява на потребителя. След това контролът се връща към прихващача A, но A не може да промени резултата сега, тъй като страницата вече е изпратена до клиента.

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


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


Отговори (2)


Дори и да промените резултатния низ, ще е твърде късно, тъй като резултатът вече е изобразен на клиента (UI).

Извикването на прехващач се извършва в обратен ред, така че всяка работа по последваща обработка може да бъде извършена като почистване на всякакви ресурси или писане на критична информация.

Ако се интересувате от промяна на резултата, можете да използвате PreResultListener. PreResultListener може да повлияе на извикване на действие между фазата на прихващане/действие и фазата на резултата. Типичните употреби включват превключване към различен резултат или модифициране по някакъв начин на обектите Result или Action, преди резултатът да се изпълни.

За подробности вижте документа

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

Останах с впечатлението, че интерцепторът извиква друг интерцептор (и следователно низът, върнат от интерцептор, се получава от неговия предходен, който той може да модифицира). Всъщност прехващачът извиква метода за извикване на класа ActionInvocation, който от своя страна извиква следващия прихващач. Това също така означава, че резултатният низ, върнат от прихващач, първо ще бъде получен от ActionInvocation, който всъщност може да изобрази страницата с отговор на клиента, преди да предаде контрола на предходните прихващачи.

person Daud    schedule 30.03.2012