ActionContext
ActionContext ist der Kontext der Aktion, in dem Struts2 automatisch einige Objekte speichert, die während der Aktionsausführung erforderlich sind, z. B. Sitzungen, Parameter, Gebietsschema usw. Struts2 erstellt den entsprechenden ActionContext basierend auf jedem Thread, der die HTTP -Anforderung ausführt, dh ein einzigartiger ActionContext. Daher können Benutzer die statische Methode actioncontext.getContext () verwenden, um den ActionContext des aktuellen Threads zu erhalten. Genau aus diesem Grund müssen Benutzer sich keine Sorgen machen, dass Action-Thread-Safe erstellt wird.
In jedem Fall wird ActionContext verwendet, um Daten zu speichern. Struts2 selbst wird viele Daten in sie einfügen, und Benutzer können auch die gewünschten Daten einfügen. Die Datenstruktur von ActionContext selbst ist eine Zuordnungsstruktur, dh eine Karte, die einen Schlüssel zum Zuordnen des Werts verwendet. So können Benutzer es verwenden, wie die MAP verwendet oder die Methode der Aktion.GetContextMap () direkt verwenden, um auf der Karte zu arbeiten.
Die in Struts2 selbst platzierten Daten umfassen ActionInvocation, Anwendung (d. H. ServletContext), ConversionErrors, Gebietsschema, Aktionsname, Anforderungsparameter, HTTP -Sitzung und Wertstapel usw. Für eine vollständige Liste finden Sie in ihrem Javadoc (der Anhang dieses Artikels diskutiert, was sie enthält).
Aufgrund der Eigenschaften, die durch Thread- und statische Aktionsmethoden erhalten werden können, kann es direkt in Nicht-Handlungsklassen erhalten werden, ohne auf die Übergabe oder Injektion der Aktion zu warten. Es ist zu beachten, dass es in Threads, die aufgrund von Anforderung erstellt wurden, nur gültig ist (da der entsprechende ActionContext bei Anforderung erstellt wird), aber in Threads, die vom Server gestartet wurden (z. B. die Init -Methode von Fliter), ungültig ist. Aufgrund der Bequemlichkeit des Zugriffs in Nicht-Handlungsklassen kann ActionContext auch verwendet werden, um Daten an JSP in Nicht-Handlungsklassen weiterzugeben (da JSP auch leicht darauf zugreifen kann).
Die Verbindung und der Unterschied zwischen Evalestack und ActionContext:
Ähnlichkeiten: Sie werden alle im Rahmen einer HTTP -Anfrage verwendet, d. H. Ihre Lebensdauer ist eine Anfrage.
Unterschiede: Der Wertstapel ist die Struktur des Stapels, und ActionContext ist die Struktur der Karte (Karte).
Kontakt: Die von der Methode Evalestack.getContext () erhaltene Karte ist tatsächlich die Karte von ActionContext. Wenn wir uns den Quellcode von Struts2 ansehen, können wir sehen (Zeile 79 von org.apache.struts2.dispatcher.ng.prepareoperations in struts2.3.1.2, createActionContext -Methode). Beim Erstellen von ActionContext wird Evalestack.getContext () als Parameter des Konstruktors von ActionContext verwendet. Daher können Evalestack und ActionContext im Wesentlichen voneinander erhalten werden.
Hinweis: In einigen Dokumenten wird das Wort "Stack's Context" angezeigt, was tatsächlich der Wert ist, der in Aktion gespeichert wird. Beim Lesen dieser Dokumente müssen Sie also klar sehen, ob die Stapelstruktur (d. H. Wertstapel) in oder in der Zuordnungsstruktur (der Kontext des Wertstapels, dh ActionContext) platziert ist.
So erhalten Sie ActionContext:
In einem benutzerdefinierten Interceptor: Verwenden Sie ActionInvocation.getInvocationContext () oder verwenden Sie actionContext.getContext ().
In Aktionsklasse: Lassen Sie den Interceptor actionContext.getContext () injizieren oder verwenden.
In Nicht-Handlungsklassen: Lassen Sie die Action-Class-Passparameter mit dem Injektionsmechanismus injizieren oder actioncontext.getContext () verwenden. Hinweis: ActionContext.getContext () kann nur nach Code aufgerufen werden, der im Anforderungs -Thread ausgeführt wird, da Null zurückgegeben wird.
In JSP: Im Allgemeinen müssen die ActionContext selbst nicht erhalten.
So speichern Sie einen Wert in einen ActionContext:
In Java-Klassen wie Interceptor, Aktionsklasse, Nicht-Handlungsklasse usw.: Verwenden Sie die Methode von ActionContext.put (Objektschlüssel, Objektwert).
In JSP: Das Tag <s: set value = "..."/> speichert den Wert in ActionContext standardmäßig (natürlich kann das <s: set> Tag den Wert an anderen Stellen speichern). Darüber hinaus haben viele Tags VAR -Attribute (das ID -Attribut wurde zuvor verwendet, aber jetzt wurde das ID -Attribut veraltet). Dieses Attribut kann einen Wert in den ActionContext speichern, der Schlüssel ist der Wert des VAR -Attributs und der Wert ist der Wert des Wertungsattributs des Tags. (Einige Dokumente schreiben über das Speichern von Werten in den Kontext von Evalestack, was eigentlich gleich ist)
So lesen Sie einen Wert aus einem ActionContext:
In Java-Klassen wie Interceptor, Aktionsklasse, Nicht-Action-Klasse usw.: Verwenden Sie die Methode ActionContext.get (Objektschlüssel).
Verwenden Sie in JSP: Verwenden Sie einen OGNL -Ausdruck, der mit #beginnt, beispielsweise die Methode ActionContext.get ("Name"). HINWEIS: Wenn die Attribute eines bestimmten Tags nicht als OGNL -Ausdrücke analysiert werden, müssen Sie %{} verwenden, um den Ausdruck einzuschließen, und ein Ausdruck, ähnlich wie " %{#name}", wird angezeigt. (Weitere für "#" hier)
Kurz gesagt, die Verwendung von ActionContext in JSP liegt daran, dass es sich um eine Zuordnungsstruktur handelt und andererseits einige Aktionskonfigurationen lesen kann. Wenn Sie für viele Aktionen gemeinsame Werte bereitstellen müssen, können Sie jede Aktion die Methode getXxx () bereitstellen. Eine bessere Möglichkeit besteht darin, diese gemeinsamen Werte im ActionContext im Interceptor- oder JSP -Vorlage zu speichern (da Interceptor oder JSP -Vorlage häufig für mehrere Aktionen verwendet wird).
Einige Beispiele:
Java -Code
// Diese Klasse zeigt den Operation in ActionContext im Interceptor PublicClass MyInterceptor erweitert den AbstractInterceptor {public String intercept (actionInvocation Invocation) löst die Ausnahme aus {// actionContext actionContext actionContext = Invocation.getInvocationContext (); // Speichern Sie die Wertperson Person = new Person (); ActionContext.put ("Person", Person); // den value Object value = actionContext.get ("Person") abrufen; // httpServletRequest httpServletRequest Request = (httpServletRequest) actionContext.get (strutStatics.http_request); // Erhalten Sie die Karte der Anforderung, dh den Wert, der von httpServletRequest.getAttribute (...) und httpServletRequest.SetatTribute (...) MAP RequestMap = (MAP) ActionContext.get ("Anfrage") betrieben wird. // andere Codes // ...... return Invocation.invoke (); }} Java -Code
// Diese Klasse zeigt den Betrieb von ActionContext in Aktion publicClass myAction erweitert actionupport. // Speichern Sie den Wert personperson = new Person (); // Dies ist die Klasse, die im vorherigen Beispiel -ActionContext.put ("Person", Person) definiert ist. // das Value Object Object = actionContext.get ("Person") abrufen; // andere Codes // ...... Erfolgserfolg; }} HTML -Code
<! DocType html> <html> <kopf> <metahttp-äquiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp Seite </title> </head> <body> <! Der actioncontext wurde im actioncontext gespeichert. <S: PropertyValue = "#request"/> <!-Erhalten Sie den von Struts2 in ActionContext gespeicherten Wert wie folgt wie folgt-> <s: propertyValue = "#Sitzung"/> <! demonstriert, wie der Wert in actioncontext in jsp-> <!-speichern Sie eine Zeichenfolge "myName", der Schlüssel ist "mykey", wie folgt-> <s: setValue = "%{'myName'}" var = "mykey"/> <! <s: beanname = "com.example.person" var = "myObject"/> <!-Danach können Sie "#" verwenden, um sie wie folgt zu lesen-> <s: propertyValue = "#mykey"/> <s: PropertyValue = "#myobject"/> </body> </html> <s: 3..
Struts2 bietet zwei Vorgänge auf Anfrage: Eine ist die vom Webserver bereitgestellte HTTPServletRequest -Klasse, die dem Betrieb von Anforderungen in herkömmlichen Java -Webprojekten entspricht. Das andere ist eine "Anforderungskarte", eine Zuordnungsklasse, die die Attribute von httpServletRequest zusammenfasst. Der Betrieb der Karte entspricht dem Betrieb der Attribute von httpServletRequest. Der Grund, warum Karte bereitgestellt wird, ist, dass es bequem zu bedienen ist, und der andere kann OGNL verwenden, um Anforderungen in JSP -Tags zu lesen. In jedem Fall sind diese beiden Anfragen interoperabel. In Bezug auf die Konzepte wie den Lebenszyklus der Anfrage unterscheidet sich dies nicht von anderen Java -Webprojekten, und dieser Artikel wird nicht ausführlich beschrieben.
Verwenden Sie die httpServletRequest -Klasse oder eine Anforderungskarte
Obwohl die beiden interoperabel sind, ist die Verwendung von Request -Maps in Bezug auf Leseranforderungsattribute viel bequemer und enthält keine unnötigen Schnittstellen. Natürlich hat HttpServletRequest einige Methoden, die die Anforderungskarte nicht hat. Natürlich sollte erstere bei der Verwendung dieser Methoden verwendet werden.
Verwenden Sie die Karte oder den ActionContext von Request:
Beide sind Karte und beide Lebenszyklen sind eine Anfrage.
In traditionellen Java -Webprojekten wird der Wert häufig durch die Attribute der Anfrage an JSP übergeben: First SetTTribute () im Servlet und dann getattribute () im JSP. Natürlich können Sie im Struts2 -Projekt diese Methode weiterhin anwenden, aber die Abgabe der von Struts2 bereitgestellten Lieferfunktion ist die Mühe nicht wert. Obwohl der Autor das offizielle Dokument nicht gefunden hat, dass Sie die Karte der Anfrage durch ActionContext ersetzen müssen, und nicht festgestellt hat, dass es eine Karte im Programm gibt, die ActionContext erhalten kann, die Anfrage jedoch nicht im Rahmen des Struts2 -Frameworks erhalten kann, ist Betriebsaktionskontext bequemer als das Betrieb der Karte der Anfrage. Daher empfiehlt der Autor: Versuchen Sie, ActionContext anstelle der MAP von Request zu verwenden, um den Wert zu übergeben.
Die Karte der Anforderung enthält manchmal Werte, die von anderen Frameworks wie Spring Frameworks festgelegt wurden. Wenn Sie diese Werte erhalten, müssen Sie die Anforderungskarte verwenden, da im ActionContext keine enthalten ist.
Über ActionContext können Sie die httpServletRequest -Klasse erhalten: "httpServletRequest Request = (httpServletRequest) actionContext.get (strutstatics.http_request);".
Sie können auch die Karte der Anforderung über ActionContext erhalten: "MAP RequestMap = (MAP) ActionContext.get (" Request ");". Daher können Sie im JSP -Tag die Daten der Karte der Anforderung mit dem Ausdruck "#Request" abrufen.
So erhalten Sie httpServletRequest:
Wenn es bereits einen ActionContext gibt, verwenden Sie "actionContext.get (strutStatics.http_request)", um den httpServletRequest zu erhalten.
Erhalten Sie in einem benutzerdefinierten Interceptor zuerst den ActionContext und erhalten Sie ihn dann über den ActionContext.
Erhalten Sie in Aktion zuerst den ActionContext und erhalten Sie ihn dann über den ActionContext. Oder lassen Sie die Aktion die ServletRequestaware -Schnittstelle implementieren und verwenden Sie den ServletConFigInterceptor Interceptor, damit der Interceptor httpServletRequest injiziert.
In JSP müssen Sie im Allgemeinen keine httpServletRequest erhalten.
So erhalten Sie die Karte der Anfrage:
Wenn es bereits einen ActionContext gibt, verwenden Sie "actionContext.get (" Anfrage "), um zu erhalten.
Erhalten Sie in einem benutzerdefinierten Interceptor zuerst den ActionContext und erhalten Sie ihn dann über den ActionContext.
Erhalten Sie in Aktion zuerst den ActionContext und erhalten Sie ihn dann über den ActionContext. Oder lassen Sie die Aktion die RequestAwe -Schnittstelle implementieren und verwenden Sie den ServletConFigInterceptor Interceptor, damit der Interceptor die Kartenanforderung injiziert.
Verwenden Sie in JSP "#Request", um die Karte der Anforderung zu erhalten, und verwenden Sie "#Request.Key" oder "#Request ['Key']", um den Wert auf der Karte zu lesen.
Kurz gesagt, die Anfrage entspricht immer noch den allgemeinen Regeln von Java -Websites. Der Autor empfiehlt jedoch, dass Benutzer versuchen sollten, die Verwendung von Anforderungen zur Übergabe von Werten zu vermeiden.
Einige Beispiele:
// Diese Klasse zeigt den Betrieb der Karte von httpServletRequest und die Anfrage im Interceptor publicClass myInterceptor erweitert den AbstractInterceptor {public String intercept (actionInvocation Invocation) löst die Ausnahme aus {// ActionContext ActionContext ActionContext = Invocation.getInvocationContext (); // httpServletRequest httpServletRequest httpServletRequest = (httpServletRequest) ActionContext.get (strutStatics.http_request); // actionContext.get ("request") abrufen map map requestmap = (map); // Erstellen Sie eine Klasse als Instanzperson Person = new Person (); // Die folgenden zwei Zeilen von Aussagen haben die gleiche Funktion httpServletRequest.setattribute ("Person", Person); RequestMap.put ("Person", Person); // andere Codes // ...... return Invocation.invoke (); }} // Diese Klasse zeigt den Betrieb der Karte von httpServletRequest und Anforderung in Aktion (die statische Methode erhält ActionContext). // httpServletRequest httpServletRequest httpServletRequest = (httpServletRequest) ActionContext.get (strutStatics.http_request); // actionContext.get ("request") abrufen map map requestmap = (map); // Erstellen Sie eine Klasse als Instanzperson Person = new Person (); // Die folgenden zwei Zeilen von Aussagen haben die gleiche Funktion httpServletRequest.setattribute ("Person", Person); RequestMap.put ("Person", Person); // andere Codes // ...... Erfolgserfolg; }} // Diese Klasse zeigt die Verwendung von ServletRequestaware in Aktion, um httpServletRequest zu erhalten (Hinweis: Sie müssen servletConFigInterceptor Interceptor verwenden) publicClass myAction erweitert ActionVeroptions -Geräte implementiert servletRequestaware {private httpServletRequest -Anfrage; // Diese Methode ist eine Methode der Schnittstelle ServletRequestaware PublicVoid setServletRequest (httpServletRequest -Anforderung) {this.Request = Request; } @Override public String execute () löst eine Ausnahme aus. }} // Diese Klasse zeigt die Verwendung von ServletRequestaware in Aktion, um die Karte der Anforderung zu erhalten (Hinweis: Sie möchten ServletConFigInterceptor Interceptor) publicClass MyAction erweitert actionupport -implements requestAweare {map <String, Objekt> Anforderung; // Diese Methode ist eine Methode der Schnittstelle RequestAware PublicVoid SetRequest (MAP <String, Object> Request) {this.Request = Request; } @Override public String execute () löst Ausnahme aus {// Die Karte der Anforderung ist im Bereich der Klasse fertig und kann direkt verwendet werden // ...... Erfolgs Erfolg; }}<! DocType html> <html> <kopf> <meta http-äquiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp Seite </title> </head> <body> <! Ist der Wert automatisch im ActionContext von Struts2 gespeichert (der Schlüssel ist Anforderung). Verwenden Sie also "#", um auf den ActionContext zuzugreifen und die Anforderung daraus zu lesen. </body> </html>
3. Parameter, dh Parameter der GET -Anforderung oder nach Anfrage
Parameter sind Parameter, die vom Browser an den Server übergeben werden, wenn Sie Get oder Post anfordern. Verwenden Sie in herkömmlichen Java -Webprojekten Methoden wie httpServletRequest.getParameter (), um Parameter zu erhalten, und Sie können httpServletRequest.GetParameterMap () direkt verwenden, um eine Karte mit eingekapselten Parametern zu erhalten. In Struts2 speichert Struts2 die obige Karte in ActionContext direkt mit den Schlüssel "Parametern". Darüber hinaus stellt ActionContext auch die Methode ActionContext.getParameters () direkt zur Verfügung, um diese Karte zu erhalten. Daher ist die Methode der Betriebsparameter in jeder Komponente von Struts2 der Methode zum Betrieb der Anforderungskarte sehr ähnlich, und dieser Absatz wird nicht ausführlich beschrieben.
4. Karte der Klasse und Sitzung der HttpServletSession
Die Sitzung in herkömmlichen Java -Webprojekten ist mit dem Sitzungsstatus eines Benutzers vertraut. Struts2 verkauft die httpServletSession in eine Karte, dh die "Sitzungskarte", die der Verarbeitung der Anforderung ähnlich ist. Um Systemressourcen zu sparen, werden wir jedoch keine Sitzungen erstellen, wenn wir keine Sitzungen benötigen. Aus diesem Grund wird die httpServletSession nicht in den ActionContext in Struts2 gesteckt. Wenn Ihr Programm httpServletSession verwenden muss, sollten Sie zuerst den httpServletRequest erhalten und dann GetSession () oder GetSession (Boolean B) verwenden, um sie zu erhalten, und zu entscheiden, ob Sie eine Sitzung erstellen müssen. Für die Sitzungskarte stellt Struts2 sie immer noch in den ActionContext (Schlüssel ist "Sitzung"), aber keine Sorge, der Mechanismus dieser Karte macht Sitzungen nur, wenn neue Werte erstellt werden. Kurz gesagt, der Betrieb von httpServletSession in Struts2 muss sie zuerst über httpServletRequest erhalten, und der Betrieb der Sitzungskarte entspricht genau dem Betrieb der Anforderungskarte, die in diesem Absatz nicht ausführlich beschrieben wird.
5. Karte von ServletContext und Anwendung
In traditionellen Java -Webprojekten wird ServletContext verwendet, um globale Variablen zu speichern, und jede Java -virtuelle Maschine verfügt nur über einen ServletContext pro Webprojekt. Dieser ServletContext wird von einem Webserver erstellt, um seine Einzigartigkeit zu gewährleisten. ServletContext verfügt über einige Methoden, die seine Attribute bedienen können, und diese Operationen ähneln dem Betrieb einer Karte. Also, stolz2 verkauft erneut: Es verkauft die Attribute von ServletContext in eine Karte, dh "Anwendungskarte" und füllt sie auch in den ActionContext (Schlüssel ist Anwendung). Wenn der Betrieb der Anwendungskarte auf die Karte der Anfrage liegt, wird dieser Absatz nicht ausführlich beschrieben.
Was den Betrieb in ServletContext betrifft, ähnelt er dem Vorgang auf httpServletRequest: Struts2 bringt den ServletContext in den ActionContext ein, und ServletConFigInterceptor bietet die Injection Interface ServletContextaware für ServletContext. Daher wird dieser Absatz nicht ausführlich beschrieben.
HINWEIS: Verwenden von "#Application" in OGNL -Ausdrücken kann die Karte der Anwendung abrufen, nicht den ServletContext. In dem in JSP eingebetteten Java -Code (z. B. "< % application.getAttribute (" "); %>") ist die Anwendung jedoch ein ServletContext, keine Karte.