1. Internationalisierung
Bereiten Sie Ressourcendateien vor. Das Benennungsformat von Ressourcendateien ist wie folgt:
baseName_sprache_land.properties
baseName_sprache.properties
baseName.properties
Unter diesen ist baseName der Basisname der Ressourcendatei. Wir können ihn anpassen, aber Sprache und Land müssen die von Java unterstützten Sprachen und Länder sein. wie:
Festlandchina: baseName_zh_CN.properties
Vereinigte Staaten: baseName_en_US.properties
Fügen Sie nun der Anwendung zwei Ressourcendateien hinzu:
Der erste speichert Chinesisch: csdn_zh_CN.properties
Der Inhalt lautet: willkommen=Willkommen beim Chuanzhi-Podcast. Die zweite Quelle ist Englisch (USA): csdn_en_US.properties
Der Inhalt lautet: Willkommen = Willkommen bei csdn
Bei chinesischen Eigenschaftendateien sollten wir nach dem Schreiben den von jdk bereitgestellten Befehl native2ascii verwenden, um die Dateien in Unicode-codierte Dateien zu konvertieren. Der Befehl wird wie folgt verwendet:
native2ascii Quelldatei.Eigenschaften Zieldatei.Eigenschaften
2. Konfigurieren Sie globale Ressourcen und geben Sie internationale Informationen aus
Nachdem wir die Ressourcendatei vorbereitet haben, können wir die Ressourcendatei über die Konstante struts.custom.i18n.resources in struts.xml wie folgt als globale Ressourcendatei definieren:
<constant name="struts.custom.i18n.resources" value="csdn" />
csdn ist der Basisname der Ressourcendatei.
Später können wir auf die Internationalisierungsinformationen auf der Seite oder in der Aktion zugreifen:
Verwenden Sie das Tag <s:text name=""/> auf der JSP-Seite, um Internationalisierungsinformationen auszugeben:
<s:text name="user"/>, Name ist der Schlüssel in der Ressourcendatei
In der Action-Klasse können Sie ActionSupport erben und die Methode getText() verwenden, um Internationalisierungsinformationen abzurufen. Der erste Parameter dieser Methode wird verwendet, um den Schlüssel in der Ressourcendatei anzugeben.
Geben Sie im Formular-Tag den Schlüssel in der Ressourcendatei über das Schlüsselattribut an, z. B.:
<s:textfield name="realname" key="user"/>
3. Internationalisierung – Internationalisierungsinformationen mit Platzhaltern ausgeben
Der Inhalt der Ressourcendatei ist wie folgt:
willkommen= {0}, willkommen beim Chuanzhi Podcast {1}
Geben Sie Internationalisierungsinformationen mit Platzhaltern auf der JSP-Seite aus
<s:text name="willkommen">
<s:param><s:property value="realname"/></s:param>
<s:param>Lernen</s:param>
</s:text>
Um Internationalisierungsinformationen mit Platzhaltern in der Action-Klasse zu erhalten, können Sie die Methode getText(String key, String[] args) oder getText(String aTextName, List args) verwenden.
4. Internationalisierung – Umfang der Ressourcendateien
In einer großen Anwendung verfügt die gesamte Anwendung über eine große Menge an Inhalten, die internationalisiert werden müssen. Wenn wir den gesamten internationalisierten Inhalt in der globalen Ressourcenattributdatei platzieren, wird die Ressourcendatei offensichtlich zu groß, aufgebläht und unpraktisch um dies zu verwalten. Manchmal können wir den Paketbereich verwenden, um Internationalisierungsdateien für verschiedene Module zu organisieren.
So geht's:
Platzieren Sie die Ressourcendatei package_lingual_country.properties unter dem Java-Paket. Aktionen unter diesem Paket und Unterpakete können auf diese Ressource zugreifen. Bei der Suche nach Nachrichten mit einem angegebenen Schlüssel sucht das System zunächst in der Paketressourcendatei. Wenn der entsprechende Schlüssel nicht gefunden werden kann, sucht es in der durch die Konstante struts.custom.i18n.resources angegebenen Ressourcendatei.
5. Ressourcendatei für den Geltungsbereich der Internationalisierungsaktion
Wir können eine Ressourcendatei auch separat für eine Aktion wie folgt angeben:
Platzieren Sie im Pfad, in dem sich die Action-Klasse befindet, die Ressourcendatei ActionClassName_sprache_land.properties. ActionClassName ist der einfache Name der Aktionsklasse.
Bei der Suche nach Nachrichten mit einem bestimmten Schlüssel sucht das System zunächst in der Ressourcendatei ActionClassName_Sprache_Land.properties. Wenn der entsprechende Schlüssel nicht gefunden wird, durchsucht es die Ressourcendatei mit dem Basisnamen Paket entlang des aktuellen Pakets, bis es es findet das Top-Level-Paket. Wenn der entsprechende Schlüssel nicht gefunden wurde, wird er schließlich in der durch die Konstante struts.custom.i18n.resources angegebenen Ressourcendatei gesucht.
6. Internationalisierung – direkter Zugriff auf eine Ressourcendatei in JSP
Struts2 stellt uns das Tag <s:i18n> zur Verfügung. Mit dem Tag <s:i18n> können wir internationalisierte Daten direkt aus einer Ressourcendatei im Klassenpfad erhalten, ohne dass eine Konfiguration erforderlich ist:
<s:i18n name="csdn">
<s:text name="willkommen"/>
</s:i18n>
csdn ist der Basisname der Ressourcendatei im Klassenpfad.
Wenn sich die Ressourcendatei, auf die Sie zugreifen möchten, unter einem bestimmten Paket im Klassenpfad befindet, können Sie wie folgt darauf zugreifen:
<s:i18n name="cn/csdn/action/package">
<s:text name="willkommen">
<s:param>Xiao Zhang</s:param>
</s:text>
</s:i18n>
Das Obige greift auf die Ressourcendatei mit dem grundsätzlichen Namen „Paket“ unter dem Paket „cn.csdn.action“ zu.
7. OGNL-Ausdruckssprache
OGNL ist die Abkürzung für Object Graphic Navigation Language, ein Open-Source-Projekt. Das Struts 2-Framework verwendet OGNL als Standardausdruckssprache.
Im Vergleich zu EL-Ausdrücken bietet es einige Funktionen, die wir normalerweise benötigen, wie zum Beispiel:
Unterstützen Sie Objektmethodenaufrufe wie xxx.sayHello();
Unterstützt den Aufruf statischer Klassenmethoden und den Wertzugriff. Das Ausdrucksformat ist @[vollständiger Klassenname (einschließlich Paketpfad)]@[Methodenname |, zum Beispiel: @java.lang.String@format('foo %s'. , 'bar') oder @cn.csdn.Constant@APP_NAME;
Sammlungsobjekte bearbeiten.
Ognl hat ein Kontextkonzept. Um es klar auszudrücken: Kontext ist eine MAP-Struktur, die die Schnittstelle java.utils.Map implementiert.
Um auf Objekte im Kontext zuzugreifen, müssen Sie das #-Symbol verwenden, um den Namespace zu markieren, z. B. #application, #session
Darüber hinaus legt OGNL ein Stammobjekt (Stammobjekt) fest. In Struts2 ist das Stammobjekt ValueStack (Wertstapel). Wenn Sie auf die Eigenschaften des Objekts im Stammobjekt (d. h. ValueStack) zugreifen möchten, können Sie den #-Namespace weglassen und direkt auf die Eigenschaften des Objekts zugreifen.
In struts2 ist die Implementierungsklasse des Stammobjekts ValueStack OgnlValueStack. Dieses Objekt speichert nicht nur einen einzelnen Wert, wie wir es uns vorgestellt haben, sondern speichert eine Gruppe von Objekten. In der Klasse OgnlValueStack gibt es eine Stammvariable vom Typ List, die zum Speichern einer Gruppe von Objekten verwendet wird.
|--Anfrage
|--Anwendung
context ------|--OgnlValueStack-Stammvariable [Aktion, OgnlUtil, ...]
|--session
|--attr
|--Parameter
Das erste Objekt in der Stammvariablen wird als oberstes Objekt auf dem Stapel bezeichnet. Normalerweise können wir auf die Eigenschaften des Objekts in der Stammvariablen zugreifen, indem wir den Namen der Eigenschaft direkt in den OGNL-Ausdruck schreiben. Die Suchsequenz beginnt beim Objekt oben im Stapel, wenn die Eigenschaft nicht auf dem Objekt vorhanden ist Oben im Stapel wird es vom zweiten Objekt aus durchsucht. Wenn es nicht gefunden wird, wird vom dritten Objekt aus gesucht und nacheinander darauf zugegriffen, bis es gefunden wird.
Achtung: In Struts2 müssen OGNL-Ausdrücke mit Struts-Tags verwendet werden. Beispiel: <s:property value="name"/>
Da ValueStack das Stammobjekt von OGNL in Struts 2 ist, kann die JSP-Seite über den folgenden EL-Ausdruck direkt auf die Eigenschaften der Objekte in ValueStack zugreifen, wenn der Benutzer auf die Objekte im Wertestapel zugreifen muss:
${foo} //Ruft das foo-Attribut eines Objekts im Wertestapel ab
Wenn Sie auf Objekte in anderen Kontexten zugreifen, müssen Sie beim Zugriff das Präfix # hinzufügen, da es sich nicht um Stammobjekte handelt.
Anwendungsobjekt: Wird für den Zugriff auf ServletContext verwendet, z. B. #application.userName oder #application['userName'], was dem Aufruf von getAttribute("username") von ServletContext entspricht.
Sitzungsobjekt: Wird für den Zugriff auf HttpSession verwendet, z. B. #session.userName oder #session['userName'], was dem Aufruf von session.getAttribute("userName") entspricht.
Anforderungsobjekt: Karte, die für den Zugriff auf HttpServletRequest-Attribute wie #request.userName oder #request['userName'] verwendet wird, was dem Aufruf von request.getAttribute("userName") entspricht.
Parameterobjekt: Wird für den Zugriff auf HTTP-Anforderungsparameter wie #parameters.userName oder #parameters['userName'] verwendet, was dem Aufruf von request.getParameter("username") entspricht.
attr-Objekt: Wird verwendet, um auf seine Attribute in der Reihenfolge Seite->Anfrage->Sitzung->Anwendung zuzugreifen.
8. Warum können Sie EL-Ausdrücke verwenden, um auf die Eigenschaften von Objekten in valueStack zuzugreifen?
Der Grund dafür ist, dass Struts2 HttpServletRequest weiter kapselt. Der vereinfachte Code lautet wie folgt:
öffentliche Klasse StrutsRequestWrapper erweitert HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
öffentliches Objekt getAttribute(String s) {
...
ActionContext ctx = ActionContext.getContext();
Objektattribut = super.getAttribute(s);//Erhalten Sie zuerst den Attributwert aus dem Anforderungsbereich
if (ctx != null) {
if (attribute == null) {//Wenn der Attributwert nicht im Anforderungsbereich gefunden wird, suchen Sie den Attributwert des Objekts in ValueStack
...
ValueStack stack = ctx.getValueStack();
attribute = stack.findValue(s);
...
}
}
Rückgabeattribut;
}
}
9. Erstellen Sie Listen-/Kartensammlungsobjekte mithilfe von OGNL-Ausdrücken
Wenn Sie ein Sammlungselement benötigen (z. B. ein Listenobjekt oder ein Kartenobjekt), können Sie die sammlungsbezogenen Ausdrücke in OGNL verwenden.
Verwenden Sie den folgenden Code, um direkt ein List-Objekt zu generieren:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:iterator>
Generieren Sie ein Kartenobjekt:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:iterator>
Das Set-Tag wird verwendet, um einen Wert in einem angegebenen Bereich zu platzieren.
Geltungsbereich: Gibt den Geltungsbereich an, in dem die Variable platziert wird. Dieses Attribut kann Anwendung, Sitzung, Anfrage, Seite oder Aktion akzeptieren. Wenn dieses Attribut nicht festgelegt ist, wird es standardmäßig im OGNL-Kontext platziert.
Wert: Der der Variablen zugewiesene Wert. Wenn dieses Attribut nicht festgelegt ist, wird der Variable der Wert oben im ValueStack-Stack zugewiesen.