2012-03-30 15 views
4

Ich lese Struts2 in Aktion, und es wird gesagt, dass wenn Abfangjäger B Brände nach Abfangjäger A und B bestimmt, dass die Kontrolle nicht zu Aktion erlaubt sein soll, gehen (wie könnte es Validierungsfehler sein wie getan von DefaultWorkFLowInterceptor). Es gibt dann "Eingabe" zurück .. und die Seite wird dem Benutzer gerendert. Das Steuerelement kehrt dann zum Interceptor A zurück, aber A kann das Ergebnis jetzt nicht ändern, da die Seite bereits an den Client gesendet wurde.Warum kann ein Struts 2-Interzeptor die von nachfolgenden Interzeptoren erzeugte 'Ergebnis'-Seite nicht verändern?

Aber, da die Abfangjäger B kehrt nur eine Zeichenfolge, die Abfangjäger A einfach eine andere Zeichenfolge an seinem Platz, und ändert sich das Ergebnis zurückkehren können. DefaultWorkFLowInterceptor gibt nur eine Zeichenfolge zurück, schreibt jedoch nichts in den Antwortstream. Wenn also die Steuerung zu ihren vorhergehenden Interzeptoren zurückkehrt, warum können sie dann die Eingabe nicht ändern?

Antwort

0

I hatte den Eindruck, dass ein Interceptor andere Interceptor aufruft (und daher wird der String durch einen Interceptor zurückgegeben wird durch seine vorhergehende empfangenen , die es ändern kann). Tatsächlich ruft ein Interceptor die Aufrufmethode der Klasse ActionInvocation auf, die ihrerseits den nächsten Interceptor aufruft. Dies bedeutet auch, dass die von einem Interceptor zurückgegebene Ergebniszeichenfolge zuerst von ActionInvocation empfangen wird, wodurch die Antwortseite tatsächlich dem Client gerendert werden kann, bevor die Kontrolle an die vorhergehenden Interzeptoren übergeben wird.

7

Auch wenn Sie die Ergebniszeichenfolge ändern, ist dies zu spät, da das Ergebnis bereits auf dem Client (UI) gerendert wurde.

Der Interceptor-Aufruf erfolgt in umgekehrter Reihenfolge, so dass Nachbearbeitungen wie das Bereinigen von Ressourcen oder das Schreiben kritischer Informationen ausgeführt werden können.

Wenn Sie das Ergebnis ändern möchten, können Sie PreResultListener verwenden. Ein PreResultListener kann einen Aktionsaufruf zwischen der Interceptor-/Aktionsphase und der Ergebnisphase beeinflussen. Zu typischen Verwendungszwecken gehört das Wechseln zu einem anderen Ergebnis oder das Ändern der Ergebnis- oder Aktionsobjekte vor der Ausführung des Ergebnisses.

Details siehe das Dokument

+0

Ich möchte hier eine kleine Korrektur vorschlagen. Interzeptoren können vor [und/oder] nach der Ausführung einer Aktion ausgeführt werden. Die Interceptors, die diese nachbearbeiten müssen, werden nur in umgekehrter Reihenfolge aufgerufen, da nicht alle Interzeptoren teilnehmen würden. Bitte überprüfen Sie Ihren zweiten Punkt. –

+0

@MohanaRaoSV: stimme zu und dies ist in Bezug auf den Interceptor-Stack, den wir konfigurieren und was ich einen generischen Fluss erklärt habe, wie S2 durch die Interceptor-Schicht läuft und was sie tatsächlich tun –