1. Internationalisation
Préparez les fichiers de ressources. Le format de dénomination des fichiers de ressources est le suivant :
baseName_langue_pays.properties
baseName_langue.properties
baseName.properties
Parmi eux, baseName est le nom de base du fichier de ressources. Nous pouvons le personnaliser, mais la langue et le pays doivent être la langue et le pays pris en charge par Java. comme:
Chine continentale : baseName_zh_CN.properties
États-Unis : baseName_en_US.properties
Ajoutez maintenant deux fichiers de ressources à l'application :
Le premier stocke le chinois : csdn_zh_CN.properties
Le contenu est : bienvenue=Bienvenue sur Chuanzhi Podcast Le deuxième dépositaire est en anglais (États-Unis) : csdn_en_US.properties
Le contenu est : bienvenue = bienvenue sur csdn
Pour les fichiers de propriétés chinois, après les avoir écrits, nous devons utiliser la commande native2ascii fournie par jdk pour convertir les fichiers en fichiers codés en Unicode. La commande s'utilise comme suit :
fichier source native2ascii.properties fichier cible.properties
2. Configurer les ressources mondiales et générer des informations internationales
Après avoir préparé le fichier de ressources, nous pouvons définir le fichier de ressources comme un fichier de ressources global via la constante struts.custom.i18n.resources dans struts.xml, comme suit :
<constant name="struts.custom.i18n.resources" value="csdn" />
csdn est le nom de base du fichier de ressources.
Plus tard, nous pourrons accéder aux informations d'internationalisation sur la page ou dans l'action :
Utilisez la balise <s:text name=""/> dans la page JSP pour afficher les informations d'internationalisation :
<s:text name="user"/>, le nom est la clé dans le fichier de ressources
Dans la classe Action, vous pouvez hériter d'ActionSupport et utiliser la méthode getText() pour obtenir des informations d'internationalisation. Le premier paramètre de cette méthode est utilisé pour spécifier la clé dans le fichier de ressources.
Dans la balise form, spécifiez la clé dans le fichier de ressources via l'attribut key, tel que :
<s:textfield name="realname" key="user"/>
3. Internationalisation - Afficher les informations d'internationalisation avec des espaces réservés
Le contenu du fichier de ressources est le suivant :
bienvenue= {0}, bienvenue sur le podcast Chuanzhi {1}
Afficher les informations d'internationalisation avec des espaces réservés dans la page jsp
<s:text name="bienvenue">
<s:param><s:property value="realname"/></s:param>
<s:param>Apprentissage</s:param>
</s:texte>
Pour obtenir des informations d'internationalisation avec des espaces réservés dans la classe Action, vous pouvez utiliser la méthode getText(String key, String[] args) ou getText(String aTextName, List args).
4. Internationalisation – portée des fichiers de ressources
Dans une grande application, l'application entière contient une grande quantité de contenu qui doit être internationalisé. Si nous plaçons tout le contenu internationalisé dans le fichier d'attributs de ressources global, le fichier de ressources deviendra évidemment trop volumineux, gonflé et peu pratique. à maintenir. Parfois, nous pouvons utiliser la portée du package pour organiser les fichiers d'internationalisation pour différents modules.
Voici comment procéder :
Placez le fichier de ressources package_lingual_country.properties sous le package Java. Le package est une méthode d'écriture fixe. Les actions sous ce package et les sous-packages peuvent accéder à cette ressource. Lors de la recherche de messages avec une clé spécifiée, le système recherchera d'abord à partir du fichier de ressources du package. Lorsque la clé correspondante ne peut pas être trouvée, il recherchera à partir du fichier de ressources spécifié par la constante struts.custom.i18n.resources.
5. Fichier de ressources sur la portée de l'action d'internationalisation
Nous pouvons également spécifier un fichier de ressources séparément pour une action comme suit :
Dans le chemin où se trouve la classe Action, placez le fichier de ressources ActionClassName_lingual_country.properties ActionClassName qui est le nom simple de la classe d'action.
Lors de la recherche de messages avec une clé spécifiée, le système recherchera d'abord dans le fichier de ressources ActionClassName_langue_country.properties. Si la clé correspondante n'est pas trouvée, il recherchera le fichier de ressources avec le package de nom de base le long du package actuel jusqu'à ce qu'il le trouve. le package de niveau supérieur. Si la clé correspondante n'a pas été trouvée, elle sera finalement recherchée à partir du fichier de ressources spécifié par la constante struts.custom.i18n.resources.
6. Internationalisation - accès direct à un fichier de ressources dans JSP
Struts2 nous fournit la balise <s:i18n> En utilisant la balise <s:i18n> nous pouvons obtenir des données internationalisées directement à partir d'un fichier de ressources sur le chemin de classe sans aucune configuration :
<s:i18n name="csdn">
<s:text name="bienvenue"/>
</s:i18n>
csdn est le nom de base du fichier de ressources dans le chemin de classe.
Si le fichier de ressources auquel vous souhaitez accéder se trouve sous un certain package sur le chemin de classe, vous pouvez y accéder comme ceci :
<s:i18n name="cn/csdn/action/package">
<s:text name="bienvenue">
<s:param>Xiao Zhang</s:param>
</s:texte>
</s:i18n>
Ce qui précède accède au fichier de ressources essentiellement nommé package sous le package cn.csdn.action.
7. Langage d'expression OGNL
OGNL est l'abréviation de Object Graphic Navigation Language, qui est un projet open source. Le framework Struts 2 utilise OGNL comme langage d'expression par défaut.
Par rapport aux expressions EL, il fournit certaines fonctions dont nous avons habituellement besoin, telles que :
Prend en charge les appels de méthode objet, tels que xxx.sayHello();
Prend en charge l'appel de méthode statique de classe et l'accès aux valeurs. Le format de l'expression est @[nom complet de la classe (y compris le chemin du package)]@[nom de la méthode | nom de la valeur], par exemple : @java.lang.String@format('foo %s'. , 'bar') ou @cn.csdn.Constant@APP_NAME ;
Manipuler les objets de la collection.
Ognl a un concept de contexte. Pour parler franchement, le contexte est une structure MAP, qui implémente l'interface java.utils.Map. Dans Struts2, l'implémentation du contexte est ActionContext.
Pour accéder aux objets dans le contexte, vous devez utiliser le symbole # pour marquer l'espace de noms, tel que #application, #session
De plus, OGNL définira un objet racine (objet racine). Dans Struts2, l'objet racine est ValueStack (pile de valeurs). Si vous souhaitez accéder aux propriétés de l'objet dans l'objet racine (c'est-à-dire ValueStack), vous pouvez omettre l'espace de noms # et accéder directement aux propriétés de l'objet.
Dans struts2, la classe d'implémentation de l'objet racine ValueStack est OgnlValueStack. Cet objet ne stocke pas seulement une valeur unique comme nous l'imaginions, mais stocke un groupe d'objets. Il existe une variable racine de type List dans la classe OgnlValueStack, qui est utilisée pour stocker un groupe d'objets.
|--demande
|--application
contexte ------|--Variable racine OgnlValueStack [action, OgnlUtil, ... ]
|--session
|--attr
|--paramètres
Le premier objet de la variable racine est appelé l'objet supérieur de la pile. Habituellement, nous pouvons accéder aux propriétés de l'objet dans la variable racine en écrivant directement le nom de la propriété dans l'expression OGNL. La séquence de recherche commence à partir de l'objet en haut de la pile si la propriété n'existe pas sur l'objet. en haut de la pile, il sera recherché à partir du deuxième objet, s'il n'est pas trouvé, recherchez à partir du troisième objet et accédez-y dans l'ordre jusqu'à ce qu'il soit trouvé.
Attention : Dans Struts2, les expressions OGNL doivent être utilisées avec les balises Struts. Par exemple : <s:property value="name"/>
Puisque ValueStack est l'objet racine d'OGNL dans Struts 2, si l'utilisateur a besoin d'accéder aux objets de la pile de valeurs, la page JSP peut accéder directement aux propriétés des objets dans ValueStack via l'expression EL suivante :
${foo} //Obtenir l'attribut foo d'un objet dans la pile de valeurs
Si vous accédez à des objets dans d'autres contextes, puisqu'il ne s'agit pas d'objets racine, vous devez ajouter le préfixe # lors de l'accès.
objet application : utilisé pour accéder à ServletContext, tel que #application.userName ou #application['userName'], ce qui équivaut à appeler getAttribute("username") de ServletContext.
objet session : utilisé pour accéder à HttpSession, tel que #session.userName ou #session['userName'], ce qui équivaut à appeler session.getAttribute("userName").
objet request : carte utilisée pour accéder aux attributs HttpServletRequest, tels que #request.userName ou #request['userName'], ce qui équivaut à appeler request.getAttribute("userName").
Objet settings : utilisé pour accéder aux paramètres de requête HTTP, tels que #parameters.userName ou #parameters['userName'], ce qui équivaut à appeler request.getParameter("username").
Objet attr : utilisé pour accéder à ses attributs dans l'ordre page->requête->session->application.
8. Pourquoi pouvez-vous utiliser des expressions EL pour accéder aux propriétés des objets dans valueStack ?
La raison en est que Struts2 encapsule davantage HttpServletRequest. Le code simplifié est le suivant :
la classe publique StrutsRequestWrapper étend HttpServletRequestWrapper {
public StrutsRequestWrapper (requête HttpServletRequest) {
super(req);
}
Objet public getAttribute (String s) {
...
ActionContext ctx = ActionContext.getContext();
Attribut d'objet = super.getAttribute(s);//Obtenir d'abord la valeur de l'attribut à partir de la portée de la demande
si (ctx != nul) {
if (attribute == null) {//Si la valeur de l'attribut n'est pas trouvée dans la plage de requêtes, recherchez la valeur de l'attribut de l'objet dans ValueStack
...
Pile ValueStack = ctx.getValueStack();
attribut = stack.findValue(s);
...
}
}
attribut de retour ;
}
}
9. Créez des objets de collection List/Map à l'aide d'expressions OGNL
Si vous avez besoin d'un élément de collection (tel qu'un objet List ou un objet Map), vous pouvez utiliser les expressions liées à la collection dans OGNL.
Utilisez le code suivant pour générer directement un objet List :
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:itérateur>
Générez un objet Map :
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:itérateur>
La balise Set est utilisée pour placer une valeur dans une plage spécifiée.
Portée : Spécifie la portée dans laquelle la variable est placée. Cet attribut peut accepter une application, une session, une demande, une page ou une action. Si cet attribut n'est pas défini, il sera placé par défaut dans le contexte OGNL.
value : la valeur attribuée à la variable. Si cet attribut n'est pas défini, la valeur en haut de la pile ValueStack est affectée à la variable.