1. Interceptor in Struts2 (Rahmenfunktionskern)
1. Filter gegen Interceptor
Die Funktion "Filter vs Interceptor" ist eine Sache. Filter sind Technologie in der Servlet -Spezifikation, die Anforderungen und Antworten filtern kann.
Interceptors sind Technologie im Struts2-Framework und implementieren die AOP-Programmierungsidee (abschnittsorientiert), die steckbar ist und vor oder nach dem Zugriff auf eine bestimmte Aktionsmethode abgefangen werden kann.
Interceptor Stack: Verbinden Sie die Interceptors in einer bestimmten Reihenfolge in eine Kette. Bei dem Zugriff auf die Interceptor -Methode werden die Interceptors in der Struts2 -Interceptor -Kette in der zuvor definierten Reihenfolge in Sequenz aufgerufen.
Struts2 Ausführungsprinzip - zugrunde liegende Analyse
2. Custom Interceptor
Struts2 definiert eine Interceptor -Schnittstelle Interceptor -Schnittstelle.
Es gibt drei abstrakte Methoden in der Interceptor -Schnittstelle
• Init: Diese Methode wird unmittelbar nach dem Erstellen des Interceptors aufgerufen und wird während des Lebens des Interceptors nur einmal aufgerufen. Die relevanten Ressourcen können in dieser Methode initialisiert werden.
• Intercept: Diese Methode wird einmal jedes Mal aufgerufen, wenn eine Aktionsanforderung abgefangen wird.
• Zerstören: Diese Methode wird aufgerufen, bevor der Interceptor zerstört wird, und sie wird nur einmal während des Lebenszyklus des Interceptors aufgerufen.
Struts rufen wiederum die Intercept -Methode jedes vom Programmierer registrierten Interceptor für eine Aktion auf. Jedes Mal, wenn die Intercept -Methode aufgerufen wird, passieren Streben eine Instanz der ActionInvocation -Schnittstelle.
ActionInvocation: Repräsentiert den Ausführungsstatus einer bestimmten Aktion. Der Interceptor kann das Aktionsobjekt und das Ergebnisobjekt erhalten, das der Aktion aus dem Objekt dieser Klasse zugeordnet ist. Nach Abschluss der eigenen Aufgabe des Interceptors ruft der Interceptor die Invoke -Methode des ActionInvocation -Objekts zum nächsten Schritt im Aktionsverarbeitungsprozess auf.
Sie können auch die addPreresultListener -Methode des ActionInvocation -Objekts aufrufen, um einen oder mehrere Vorhörer zu "hängen". Dieses Listener -Objekt kann etwas tun, bevor das Aktionsergebnis nach Ausführung der Aktion ausgeführt wird.
Benutzerdefinierte Interceptor -Schritte:
A. Schreiben Sie eine Klasse, um die com.opensymphony.xwork2.Interceptor.Interceptor -Schnittstelle oder Erbe
com.opensymphony.xwork2.Interceptor.abstractInterceptor Class. (Adaptermodus), im Allgemeinen zum Erben des AbstractInterceptors (Interceptor befindet sich im Speicher). Weil die AbstractInterceptor -Klasse die Interceptor -Schnittstelle implementiert. Es bietet eine leere Implementierung für Init und Destroy
Schreiben Sie zwei Interceptors Interceptordemo1 und Interceptordemo2
Paket com.itheima.Interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Interceptor.abstractInterceptor; öffentliche Klasse Interceptordemo1 erweitert die AbstractInterceTor {// Diese Methode wird anhand der Action auf öffentliche Streicher (ActionInVocation) -Systeme genannt. String rtvalue = invocation.invoke (); // Release, warum kehrt String hier zurück? Weil das Endergebnis das Ergebnis der Aktion zurückgibt und das Ergebnis der Aktion String Typ System.out.println ("Intercept Demo1") ist; retValue zurückgeben; }} Paket com.itheima.Interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Interceptor.abstractInterceptor; com.opensymphonie.xwork2.Interceptor Intercept (ActionInvocation Invocation) löst eine Ausnahme aus {// Invocation.addPreresultListener (New PreresultListener () {// // public void beeresult (actionInvocation Incopocation, String -ErgebnisCode) {// System.out.println ("Bevor das Ergebnis angezeigt wird); System.out.println ("vor dem Intercept Demo2"); String rtvalue = invocation.invoke (); // Release System.out.println ("Intercepted Demo2"); retValue zurückgeben; }}B. Es muss in Struts.xml definiert werden, den Interceptor definieren und zuerst vor der Verwendung definieren.
<package name = "p1" extends = "Struts-Default"> <!-Definition Interceptor: Nur für das aktuelle Paket-> <Interceptor name = "interceProtDemo1"> </interceptor> <interceptor name = "interceProtDemo2"> </interceptor> </interceptor> </interceptor> </interceptor>
C. Es kann in der Aktionskonfiguration verwendet werden
<action name = "action1" methode = "execute"> <!- Verwenden Sie den definierten Interceptor. Wenn kein Interceptor angegeben ist, werden alle Interceptors im Standardstapelstapel standardmäßig verwendet. Sobald ein Interceptor angegeben ist, ist die Standardeinstellung ungültig.
Implementieren Sie die Aktionsklassen -Demo1Actaktion
Paket com.itheima.Action; import com.opensymphony.xwork2.actionsupport; öffentliche Klasse Demo1Action erweitert actionupport. Erfolgserfolg; }}
Auslaufergebnisse
Da Funktionen wie Datei -Upload, Datenüberprüfung und Einkapselung von Anforderungen an die Aktion in Struts2 vom Interceptor im Standard -Standardstack des Systems implementiert werden, muss der von uns definierte Interceptor auf den Standard -Standardstack des Systems verweisen, damit die vielen Funktionen, die im Strümpfe2 -Framework bereitgestellt werden.
Wenn kein Interceptor angegeben ist, werden alle Interceptors im Standardstapelstapel standardmäßig verwendet. Sobald ein Interceptor angegeben ist, ist der Standard ungültig. Zusätzlich zur Verwendung eines benutzerdefinierten Interceptors müssen Sie DefaultStack verwenden. Sie können das tun
Methode 1: (von Ihnen selbst verwendet) Konfigurieren Sie einfach benutzerdefinierte und Standardstack in Aktion.
Methode 2: (Wenn jeder es verwendet), müssen Sie den Interceptor-Stapel-Interceptor-Stapel verwenden, wenn alle Aktionen unter dem Paket einen benutzerdefinierten Interceptor-Stapel verwenden, einen Interceptor-Stack definieren, und dann können Sie in der Aktion den Interceptor als Standard-Abfangversorgungsstapel definieren, indem Sie mit dem Standard-Interceptor-Ref-Name = "mydefaultStack"/> und Sie können.
<interceptors> <interceptor name = "interceProtDemo1"> </interceptor> <interceptor name = "interceProtDemo2"> </interceptor> <interceptor-stack name = "mydefaultStack"> <interceptor-ref name = "DefaultStack"> </interceptor-rref> <interceptor-ref> <interceptor-ref> </interceptor-rref> <interceptor-rref-name = "desinfceTack"> </interceptor-rref> <interceptor-rref> </interceptor-ref> < name = "interceProtDemo1"> </interceptor-ref> <interceptor-ref name = "interceProtDemo2"> </interceptor-ref> </interceptor-stack> </interceptors> <actionname = "action3" method = "login"> <interceptor-ref name = "mydefaultstack" <Eltr EREWERN> /SUCCESS.JSP </result> </action>
3..
Fall 1: Überprüfen Sie, ob der Benutzer angemeldet ist
1. Schreiben Sie die Seite Login.jsp
<body> <form action = "$ {pageContext.request.contextPath}/login.Action" methode = "post"> <input type = "text" name = "userername"/> <br/> <Eingabe type = "text" name = "password"/> <br/> <Eingabe type = "subine" value = "login"/</> </> </> </> </> </> </> </> </> </> </> </> </> </</</body>2. schreiben
Paket com.itheima.Interceptor; import Javax.servlet.http.httpSession; import org.apache.struts2.ServletActionContext; Invocation) löst eine Ausnahme aus {httpSession session = servletActActionContext.getRequest (). getSession (); // das Sitzungsobjekt über das ServletActActionContext -Objekt user = session.getAtTribute ("Benutzer"); if (user == null) {// Kein Login -Return "Login"; // kehren Sie zu einer logischen Ansicht zurück} return aufrufen.invoke (); // Release}}3. Schreiben Sie die Konfigurationsdatei Struts.xml
<package name = "p2" extends = "Struts-Default"> <interceptors> <interceptor name = "logincheckinterceptor"> </interceptor> <interceptor-stack name = "mydefaultStack"> <interceptor-ref name = "DefaultStack"> </interceptor-ref> </interceptor-ref-rref-name </interceptor-ref> </interceptor-stack> </interceptor-stack> </interceptors> <actionname = "login" methode = "login"> <ergebnisse> /login.jsp </result> </action> </package>
4. Schreiben Sie eine Action -Klasse -Kundenaktion
Paket com.itheima.Action; import org.apache.struts2.servletactactactacontext; import com.opensymphony.xwork2.actionsupport; öffentliche Klasse CustomerAction erweitert actionupport {public String login () {System.out.println ("Login"); ServletActionContext.getRequest (). GetSession (). SetAttribute ("Benutzer", "PPP"); Erfolgserfolg; }}Fall 2: Überwachung der Ausführungseffizienz von Aktionsmethoden
TimerInterceptor schreiben
Paket com.itheima.Interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Interceptor.abstractInterceptor; TimerInterceptor der Öffentlichkeit Klasse erweitert die AbstractInterceptor {public String Intercept (ActionInVocation Invocation) Ausnahme {Long Time = System.Nanotime (); String rtValue = Invocation.invoke (); System.out.println (rtValue+"Ausführungszeit:"+(System.Nanotime ()-Zeit)+"Nanosekunde"); retValue zurückgeben; }}Schreiben Sie Konfigurationsdateien
<package name = "p2" extends = "Struts-Default"> <interceptors> <interceptor name = "logincheckinterceptor"> </interceptor> <interceptor name = "TimerInterceptor"> </interceptor> <interceptor-stack name = "myDefaultStack"> <interceptor-ref name = " name = "loginCheckinterceptor"> </interceptor-ref> <interceptor-ref name = "logincheckinterceptor"> </interceptor-ref> <interceptor-ref name = "TimerInterceptor"> </interceptor-ref> </interceptor-stack> </isrtor> <sergebnisse> </ergebnisname "
Wie aus den oben genannten Erscheinen ersichtlich ist, können mehrere Filter in einer Aktion konfiguriert werden.
4. Benutzerdefinierte Interceptor: Kann die Abschlussmethode oder die Methode des Nichtabfangens angeben
Es kann die Methode des Abfangens oder einer Methode ohne Abfangen festlegen. Beim Schreiben eines Filters können Sie die MethodeFilterInterceptor -Klasse mit zwei Feldern implementieren. Durch die Injektion von Parametern können Sie diese ohne Abfangen angeben. Es kann nur einer der beiden Parameter verwendet werden. Wenn weniger Abschnitte vorhanden sind, können Sie inklusive Auszeichnungen verwenden. Wenn es mehr Abschnitte gibt, können Sie Excludemethods verwenden.
excludemethods = collectionss.eMptySet (); // diese ausschließen
includeemethods = collectionss.EmptySet (); // schließen diese ein
Fall: Login -Überprüfungsbeispiel fortsetzen.
1. Schreiben Sie einen Filter -Logincheckinterceptor
Paket com.itheima.Interceptor; import Javax.servlet.http.httpSession; import org.apache.struts2.ServletActionContext; com.opensymphony.xwork2.ActactionInvocation; Import Com.opensymphony.xwork2.InterceTor.abractIntercin; com.opensymphony.xwork2.Interceptor.methodFilterInterceptor; public class LoginCheckInterceptor erweitert MethodFilterInterceptor {Protected String doIntercept (actionInvocation Invocation) löst die Ausnahme aus {httpSession Session Object user = session.getAttribute ("Benutzer"); if (user == null) {// Kein Login -Return "Login"; // kehren Sie zu einer logischen Ansicht zurück} return aufrufen.invoke (); // Release}}2. Schreiben Sie Konfigurationsdateien
3. Schreiben Sie eine Action -Klasse -Kundenaktion
Paket com.itheima.Action; import org.apache.struts2.servletactactacontext; com.opensymphony.xwork2.actionsupport; öffentliche Klasse erweitert die Aktionssupport. Erfolg;
4. Schreiben Sie eine Seite
addCustomer.jsp
<Body> Fügen Sie einen Kunden hinzu </body>
editcustomer.jsp
<Body> Ändern Sie den Kunden </body>
login.jsp
<body> <form action = "$ {pageContext.request.contextPath}/login.Action" methode = "post"> <input type = "text" name = "userername"/> <br/> <Eingabe type = "text" name = "password"/> <br/> <Eingabe type = "subine" value = "login"/</> </> </> </> </> </> </> </> </> </> </> </> </> </</</body>Success.jsp
<body> oyeah </body>
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.