1. Verschiedene Standardwerte in der Aktionskonfiguration
<Paketname="csdn" namespace="/test" erweitert="struts-default">
<action name="helloworld" method="execute" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</Paket>
1>Wenn keine Klasse für die Aktion angegeben ist, ist der Standardwert ActionSupport.
2>Wenn für die Aktion keine Methode angegeben ist, wird standardmäßig die Methodeexecute() in der Aktion ausgeführt.
3>Wenn das Namensattribut des Ergebnisses nicht angegeben ist, ist der Standardwert „Erfolg“.
2. Verschiedene Weiterleitungsarten führen zu Aktion
<Aktionsname="helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
Die Ergebniskonfiguration ähnelt der Weiterleitung in struts1, struts2 bietet jedoch mehrere Ergebnistypen: Dispatcher (Standardwert), Redirect, RedirectAction, PlainText.
Das Folgende ist ein Beispiel für den Ergebnistyp „redirectAction“, wenn sich die umgeleitete Aktion im selben Paket befindet:
<result type="redirectAction">helloworld</result>
Wenn sich die umgeleitete Aktion in einem anderen Namespace befindet:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</result>
Klartext: Zeigt den ursprünglichen Dateiinhalt an. Wenn wir beispielsweise den Quellcode der JSP-Datei so anzeigen müssen, wie er ist, können wir diesen Typ verwenden.
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- Geben Sie die Kodierung zum Lesen von Dateien an -->
</result>
Im Ergebnis können Sie auch den Ausdruck ${attribute name} verwenden, um auf die Attribute in der Aktion zuzugreifen. Die Attributnamen im Ausdruck entsprechen den Attributen in der Aktion. wie folgt:
<result type="redirect">view.jsp?id=${id}</result>
3. Mehrere Aktionen teilen sich eine Ansicht – globale Ergebniskonfiguration
Wenn dieselbe Ansicht in mehreren Aktionen verwendet wird, sollten wir das Ergebnis als globale Ansicht definieren. Global Forward wird in Struts1 bereitgestellt, und ähnliche Funktionen werden auch in Struts2 bereitgestellt:
<Paket....>
<globale-ergebnisse>
<result name="message">/message.jsp</result>
</global-results>
</Paket>
4. Fügen Sie Werte in Aktionseigenschaften ein
Struts2 bietet eine Abhängigkeitsinjektionsfunktion für die Eigenschaften in Action. In der Struts2-Konfigurationsdatei können wir problemlos Werte in die Eigenschaften in Action einfügen. Hinweis: Eigenschaften müssen Setter-Methoden bereitstellen.
öffentliche Klasse HelloWorldAction{
privater String savePath;
öffentlicher String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
...
}
<Paketname="csdn" namespace="/test" erweitert="struts-default">
<Aktionsname="helloworld" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</Paket>
Das Obige fügt „/images“ über den <param>-Knoten in das savePath-Attribut der Aktion ein.
5. Geben Sie das Anforderungssuffix an, das von Struts 2 verarbeitet werden muss
Zuvor haben wir standardmäßig das Suffix .action verwendet, um auf Action zuzugreifen. Tatsächlich kann das Standardsuffix über die Konstante „struts.action.extension“ geändert werden. Beispielsweise können wir Struts 2 so konfigurieren, dass nur Anforderungspfade mit .do als Suffix verarbeitet werden:
<?xml version="1.0"kodierung="UTF-8"?>
<!DOCTYPE steht für PUBLIC
„-//Apache Software Foundation//DTD Struts Configuration 2.0//EN“
„http://struts.apache.org/dtds/struts-2.0.dtd“>
<Streben>
<constant name="struts.action.extension" value="do"/>
</struts>
Wenn der Benutzer mehrere Anforderungssuffixe angeben muss, trennen Sie die mehreren Suffixe durch Kommas (,). wie:
<constant name="struts.action.extension" value="do,go"/>
6. Beschreiben Sie die Definition von Konstanten im Detail
Konstanten können in struts.xml oder struts.properties konfiguriert werden. Es wird empfohlen, sie in struts.xml zu konfigurieren. Die beiden Konfigurationsmethoden sind wie folgt:
Konfigurieren Sie Konstanten in der Datei struts.xml
<Streben>
<constant name="struts.action.extension" value="do"/>
</struts>
Konfigurieren Sie Konstanten in struts.properties
struts.action.extension=do
Da Konstanten in mehreren Konfigurationsdateien unten definiert werden können, müssen wir die Suchreihenfolge verstehen, in der struts2 Konstanten lädt:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
Wenn dieselbe Konstante in mehreren Dateien konfiguriert ist, überschreibt der in der letztgenannten Datei konfigurierte Konstantenwert den in der vorherigen Datei konfigurierten Konstantenwert.
7. Einführung in häufig verwendete Konstanten
<!-- Geben Sie den Standardcodierungssatz an, der auf die setCharacterEncoding-Methode von HttpServletRequest und die Ausgabe von freemarker und Velocity wirkt -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- Dieses Attribut gibt das Anforderungssuffix an, das von Struts 2 verarbeitet werden muss. Der Standardwert dieses Attributs ist action, dh alle Anforderungen, die mit *.action übereinstimmen, werden von Struts2 verarbeitet.
Wenn der Benutzer mehrere Anforderungssuffixe angeben muss, trennen Sie die mehreren Suffixe durch Kommas (,). ->
<constant name="struts.action.extension" value="do"/>
<!-- Legen Sie fest, ob der Browser statischen Inhalt zwischenspeichert. Der Standardwert ist „true“ (wird in der Produktionsumgebung verwendet). Deaktivieren Sie ihn am besten während der Entwicklungsphase
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- Wenn die Struts-Konfigurationsdatei geändert wird und das System die Datei automatisch neu lädt, ist der Standardwert false (wird in der Produktionsumgebung verwendet). Es ist am besten, ihn während der Entwicklungsphase zu aktivieren ->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- Wird im Entwicklungsmodus verwendet, damit detailliertere Fehlermeldungen ausgedruckt werden können -->
<constant name="struts.devMode" value="true" />
<!--Standardansichtsthema-->
<constant name="struts.ui.theme" value="simple" />
<! Geben Sie bei der Integration mit Spring an, dass Spring für die Erstellung des Aktionsobjekts verantwortlich ist -->
<constant name="struts.objectFactory" value="spring" />
<!Diese Eigenschaft legt fest, ob Struts 2 dynamische Methodenaufrufe unterstützt. Der Standardwert dieser Eigenschaft ist true. Wenn Sie den dynamischen Methodenaufruf deaktivieren müssen, können Sie diese Eigenschaft auf „false“ setzen. ->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--Größenbeschränkung für hochgeladene Dateien-->
<konstanter Name="struts.multipart.maxSize" value="10701096"/>
8. Geben Sie mehrere Struts-Konfigurationsdateien für die Anwendung an
In den meisten Anwendungen nimmt mit zunehmender Anwendungsskala auch die Anzahl der Aktionen im System erheblich zu, was dazu führt, dass die Konfigurationsdatei struts.xml sehr aufgebläht wird. Um zu vermeiden, dass die Datei struts.xml zu groß und aufgebläht wird, und um die Lesbarkeit der Datei struts.xml zu verbessern, können wir eine Konfigurationsdatei struts.xml in mehrere Konfigurationsdateien zerlegen und dann andere Konfigurationsdateien in die Datei struts.xml aufnehmen Datei. Die folgende struts.xml gibt über das <include>-Element mehrere Konfigurationsdateien an:
<?xml version="1.0"kodierung="UTF-8"?>
<!DOCTYPE steht für PUBLIC
„-//Apache Software Foundation//DTD Struts Configuration 2.0//EN“
„http://struts.apache.org/dtds/struts-2.0.dtd“>
<Streben>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>
Auf diese Weise können wir Struts 2 Action nach Modul zu mehreren Konfigurationsdateien hinzufügen.
9. Dynamischer Methodenaufruf
Wenn die Aktion mehrere Methoden enthält, können wir !+Methodenname verwenden, um die angegebene Methode aufzurufen. wie folgt:
öffentliche Klasse HelloWorldAction{
private String-Nachricht;
....
public Stringexecute() löst eine Ausnahme aus{
this.message = „Meine erste Struts2-Anwendung“;
„Erfolg“ zurückgeben;
}
public String other() löst eine Ausnahme aus{
this.message = "Zweite Methode";
„Erfolg“ zurückgeben;
}
}
Angenommen, der URL-Pfad für den Zugriff auf die obige Aktion lautet: /struts/test/helloworld.action
Um auf die other()-Methode der Aktion zuzugreifen, können wir sie wie folgt aufrufen:
/struts/test/helloworld!other.action
Wenn wir den dynamischen Methodenaufruf nicht verwenden möchten, können wir den dynamischen Methodenaufruf über die Konstante struts.enable.DynamicMethodInvocation deaktivieren.
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
10. Verwenden Sie Platzhalter, um Aktionen zu definieren
<Paketname="csdn" namespace="/test" erweitert="struts-default">
<action name="helloworld_*" method="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</Paket>
öffentliche Klasse HelloWorldAction{
private String-Nachricht;
....
public Stringexecute() löst eine Ausnahme aus{
this.message = „Meine erste Struts2-Anwendung“;
„Erfolg“ zurückgeben;
}
public String other() löst eine Ausnahme aus{
this.message = "Zweite Methode";
„Erfolg“ zurückgeben;
}
}
Um auf die other()-Methode zuzugreifen, können Sie über eine URL wie diese darauf zugreifen: /test/helloworld_other.action
11. Anforderungsparameter empfangen
Verwenden Sie Basistypen, um Anforderungsparameter zu erhalten (Get/Post).
Definieren Sie ein Attribut mit demselben Namen wie der Anforderungsparameter in der Action-Klasse. Struts2 kann den Anforderungsparameter automatisch empfangen und dem Attribut mit demselben Namen zuweisen.
Anforderungspfad: http://localhost:8080/test/view.action?id=78
öffentliche Klasse ProductAction {
private Ganzzahl-ID;
public void setId(Integer id) {//struts2 verwendet Reflektionstechnologie, um die Setter-Methode der Eigenschaft mit demselben Namen wie der Anforderungsparameter aufzurufen, um den Anforderungsparameterwert zu erhalten
this.id = id;
}
public Integer getId() {return id;}
}
Verwenden Sie einen zusammengesetzten Typ, um den Anforderungspfad für Anforderungsparameter zu erhalten: http://localhost:8080/test/view.action?product.id=78
öffentliche Klasse ProductAction {
privates Produktprodukt;
public void setProduct(Produkt Produkt) { this.product = Produkt }
öffentliches Produkt getProduct() {Produkt zurückgeben;}
}
Struts2 erstellt zunächst das Produktobjekt, indem es den Standardkonstruktor des Produkts mithilfe der Reflexionstechnologie aufruft, und ruft dann mithilfe der Reflexionstechnologie die Setter-Methode der Eigenschaft mit demselben Namen wie der Anforderungsparameter im Produkt auf, um den Anforderungsparameterwert zu erhalten.
12. Die Bedeutung der Typkonvertierung
Für ein intelligentes MVC-Framework ist es unvermeidlich, eine Typkonvertierung zu implementieren. Da die Anforderungsparameter von B/S-Strukturanwendungen (Browser/Server) über den Browser gesendet werden, können diese Parameter keine Rich-Datentypen aufweisen Die Konvertierung muss serverseitig abgeschlossen werden
Das MVC-Framework ist eine Präsentationsschichtlösung und sollte Unterstützung für die Typkonvertierung bieten. Struts2 bietet eine sehr leistungsstarke Unterstützung für die Typkonvertierung.
13. Verarbeitung von Präsentationsschichtdaten
Bei Webanwendungen wird die Präsentationsschicht hauptsächlich zur Interaktion mit Benutzern verwendet, einschließlich der Erfassung von Benutzereingabedaten und der Präsentation des Serverstatus für Benutzer. Daher hat der Datenfluss in der Präsentationsschicht hauptsächlich zwei Richtungen: Eingabedaten und Ausgabedaten.
Für Eingabedaten: Sie müssen die Konvertierung von Zeichenfolgendaten in mehrere Datentypen abschließen. Das Programm kann in der Regel nicht automatisch abgeschlossen werden und muss manuell im Code konvertiert werden.
Für Ausgabedaten: Sowohl Java als auch JSP unterstützen die direkte Ausgabe mehrerer Datentypen.
Eine weitere Datenverarbeitung in der Präsentationsschicht ist die Datenüberprüfung, die in Clientüberprüfung und serverseitige Überprüfung unterteilt wird. Dies wird später ausführlich erläutert.
14. Typkonvertierung
HTTP-Parameter sind alle String-Typen. Die gespeicherten Daten können vom Typ Zeichenfolge, Zahl, Boolescher Wert, Datum und Uhrzeit usw. oder vom Typ JavaBean sein. Manuelle Typkonvertierung, z. B. Konvertieren einer Zeichenfolge in ein Datum, indem: die Zeichenfolge über die Methode „request.getParameter“ abgerufen wird und überprüft wird, ob sie leer ist;
15. Struts2-Typkonvertierung
In Struts2 integrierte Typkonvertierung
String und Boolean vervollständigen die Konvertierung zwischen String- und Booleschen Werten
String- und Zeichenkonvertierung zwischen gewöhnlichen Strings und Zeichen
String, int und Integer vervollständigen die Konvertierung zwischen Strings und Integer.
String und Long vervollständigen die Konvertierung zwischen String- und Long-Integer-Werten
String, Double und Double vervollständigen die Konvertierung von Strings und Gleitkommawerten mit doppelter Genauigkeit.
String und Float vervollständigen die Konvertierung zwischen Strings und Gleitkommazahlen mit einfacher Genauigkeit
String und Date vervollständigen die Konvertierung zwischen String- und Datumstypen. Das Datumsformat verwendet das SHORT-Format des Gebietsschemas, in dem der Benutzer das Format anfordert.
String und Array Im Standardfall ist das Array-Element ein String. Wenn der Benutzer einen Typkonverter definiert, können es auch andere zusammengesetzte Datentypen sein.
String und Map und List
16. Struts-Typkonvertierungs-API
Der Typkonverter von Struts2 wird tatsächlich basierend auf OGNL implementiert. Im OGNL-Projekt gibt es eine Schnittstelle, die zur Implementierung des Typkonverters implementiert werden muss. Die Schnittstelle ist wie folgt definiert:
öffentliche Schnittstelle TypeConverter {
öffentliches Objekt konvertierenValue(Map arg0, Objekt arg1, Mitglied arg2, String arg3,
Objekt arg4, Klasse arg5) {
null zurückgeben;
}
Um einen Typkonverter zu implementieren, müssen Sie den oben genannten TypeConverter implementieren. Die Methoden in der obigen Schnittstelle sind jedoch zu kompliziert, daher stellt das OGNL-Projekt auch eine Implementierungsklasse dieser Schnittstelle bereit: ognl.DefaultTypeConverter diese Klasse erben. Die Klasse ist wie folgt definiert:
Die öffentliche Klasse DefaultTypeConverter erweitert Object implementiert TypeConverter{
public Object ConvertValue(Map<String,Object> context, Object value, Class toType) {
}
……//Andere Methoden
}
Die Rolle der ConvertValue-Methode besteht darin, die Typkonvertierung abzuschließen. Diese Typkonvertierung ist jedoch bidirektional. Wenn eine Objektinstanz in eine Objektinstanz konvertiert werden muss, wird diese Methode ebenfalls verwendet gebraucht. Diese Konvertierung erfolgt über den toType-Parametertyp, der der Zieltyp ist, der konvertiert werden muss. Daher kann die Konvertierungsrichtung anhand des toType-Parameters bestimmt werden.
ConvertValue-Methodenparameter und Rückgabebedeutung Der erste Parameter: context ist der Kontext der Typkonvertierungsumgebung. Der zweite Parameter: value ist der Parameter, der konvertiert werden muss. Der Wert des Wertparameters ist ebenfalls unterschiedlich, je nach Konvertierungsrichtung.
Der dritte Parameter: toType ist der konvertierte Zieltyp. Der Rückgabewert dieser Methode ist der Wert nach der Typkonvertierung. Mit der Richtung der Konvertierung ändert sich auch die Art des Werts. Es ist ersichtlich, dass die konvertierte Methode „convertValue“ den zu konvertierenden Wert akzeptiert, der zu konvertierende Zieltyp ein Parameter ist und dann den konvertierten Zielwert zurückgibt.
Warum ist Value ein String-Array?
Für den DefaultTypeConverter-Konverter muss er die häufigste Situation berücksichtigen, sodass er alle Anforderungsparameter als String-Arrays und nicht als Strings behandelt. Entspricht den von getParameterValues() erhaltenen Parameterwerten