1. Internacionalización
Prepare archivos de recursos. El formato de denominación de los archivos de recursos es el siguiente:
nombrebase_idioma_país.properties
nombrebase_idioma.properties
nombrebase.properties
Entre ellos, baseName es el nombre base del archivo de recursos. Podemos personalizarlo, pero el idioma y el país deben ser el idioma y el país admitidos por Java. como:
China continental: baseName_zh_CN.properties
Estados Unidos: baseName_en_US.properties
Ahora agregue dos archivos de recursos a la aplicación:
El primero almacena chino: csdn_zh_CN.properties
El contenido es: bienvenido=Bienvenido a Chuanzhi Podcast El segundo depósito es inglés (Estados Unidos): csdn_en_US.properties
El contenido es: bienvenido = bienvenido a csdn
Para los archivos de propiedades chinos, después de escribirlos, debemos usar el comando nativo2ascii proporcionado por jdk para convertir los archivos en archivos codificados en Unicode. El comando se utiliza de la siguiente manera:
archivo de origen nativo2ascii.properties archivo de destino.properties
2. Configurar recursos globales y generar información internacional.
Después de preparar el archivo de recursos, podemos definir el archivo de recursos como un archivo de recursos global a través de la constante struts.custom.i18n.resources en struts.xml, de la siguiente manera:
<nombre constante="struts.custom.i18n.resources" valor="csdn" />
csdn es el nombre base del archivo de recursos.
Posteriormente podremos acceder a la información de internacionalización en la página o en la acción:
Utilice la etiqueta <s:text name=""/> en la página JSP para generar información de internacionalización:
<s:text name="user"/>, el nombre es la clave en el archivo de recursos
En la clase Action, puede heredar ActionSupport y usar el método getText () para obtener información de internacionalización. El primer parámetro de este método se usa para especificar la clave en el archivo de recursos.
En la etiqueta del formulario, especifique la clave en el archivo de recursos a través del atributo clave, como por ejemplo:
<s:campo de texto nombre="nombre real" clave="usuario"/>
3. Internacionalización: generar información de internacionalización con marcadores de posición
El contenido del archivo de recursos es el siguiente:
bienvenido= {0}, bienvenido al podcast Chuanzhi {1}
Generar información de internacionalización con marcadores de posición en la página jsp
<s:nombre del texto="bienvenido">
<s:param><s:property value="nombre real"/></s:param>
<s:param>Aprendizaje</s:param>
</s:texto>
Para obtener información de internacionalización con marcadores de posición en la clase Acción, puede utilizar el método getText(String key, String[] args) o getText(String aTextName, List args).
4. Internacionalización: archivos de recursos de alcance
En una aplicación grande, toda la aplicación tiene una gran cantidad de contenido que debe internacionalizarse. Si colocamos todo el contenido internacionalizado en el archivo de atributos de recursos globales, obviamente hará que el archivo de recursos se vuelva demasiado grande, inflado e inconveniente. para mantener.Esto A veces podemos usar el alcance del paquete para organizar archivos de internacionalización para diferentes módulos.
He aquí cómo:
Coloque el archivo de recursos package_language_country.properties en el paquete java. El paquete es un método de escritura fijo. Las acciones de este paquete y los subpaquetes pueden acceder a este recurso. Al buscar mensajes con una clave específica, el sistema primero buscará en el archivo de recursos del paquete. Cuando no se pueda encontrar la clave correspondiente, buscará en el archivo de recursos especificado por la constante struts.custom.i18n.resources.
5. Archivo de recursos de alcance de acción de internacionalización
También podemos especificar un archivo de recursos por separado para una acción de la siguiente manera:
En la ruta donde se encuentra la clase Acción, coloque el archivo de recursos ActionClassName_language_country.properties ActionClassName es el nombre simple de la clase de acción.
Al buscar mensajes con una clave específica, el sistema primero buscará en el archivo de recursos ActionClassName_language_country.properties. Si no se encuentra la clave correspondiente, buscará el archivo de recursos con el nombre básico del paquete junto con el paquete actual hasta que lo encuentre. el paquete de nivel superior. Si no se ha encontrado la clave correspondiente, finalmente se buscará en el archivo de recursos especificado por la constante struts.custom.i18n.resources.
6. Internacionalización: acceso directo a un archivo de recursos en JSP
Struts2 nos proporciona la etiqueta <s:i18n>. Usando la etiqueta <s:i18n> podemos obtener datos internacionalizados directamente desde un archivo de recursos en el classpath sin ninguna configuración:
<s:i18n nombre="csdn">
<s:nombre del texto="bienvenido"/>
</s:i18n>
csdn es el nombre base del archivo de recursos en la ruta de clase.
Si el archivo de recursos al que desea acceder se encuentra en un determinado paquete en el classpath, puede acceder a él de esta manera:
<s:i18n nombre="cn/csdn/acción/paquete">
<s:nombre del texto="bienvenido">
<s:param>Xiao Zhang</s:param>
</s:texto>
</s:i18n>
Lo anterior accede al archivo de recursos básicamente llamado paquete en el paquete cn.csdn.action.
7. Lenguaje de expresión OGNL
OGNL es la abreviatura de Object Graphic Navigation Language, que es un proyecto de código abierto. El marco Struts 2 utiliza OGNL como lenguaje de expresión predeterminado.
En comparación con las expresiones EL, proporciona algunas funciones que normalmente necesitamos, como:
Admite llamadas a métodos de objetos, como xxx.sayHello();
Admite llamadas a métodos estáticos de clase y acceso a valores. El formato de expresión es @[nombre completo de la clase (incluida la ruta del paquete)]@[nombre del método | nombre del valor], por ejemplo: @java.lang.String@format('foo %s'. , 'barra') o @cn.csdn.Constant@APP_NAME;
Manipular objetos de colección.
Ognl tiene un concepto de contexto. Para decirlo claramente, el contexto es una estructura MAP, que implementa la interfaz java.utils.Map. En Struts2, la implementación del contexto es ActionContext.
Para acceder a objetos en el contexto, debe usar el símbolo # para marcar el espacio de nombres, como #aplicación, #sesión
Además, OGNL establecerá un objeto raíz (objeto raíz). En Struts2, el objeto raíz es ValueStack (pila de valores). Si desea acceder a las propiedades del objeto en el objeto raíz (es decir, ValueStack), puede omitir el espacio de nombres # y acceder directamente a las propiedades del objeto.
En struts2, la clase de implementación del objeto raíz ValueStack es OgnlValueStack. Este objeto no solo almacena un valor único como imaginamos, sino que también almacena un grupo de objetos. Hay una variable raíz de tipo Lista en la clase OgnlValueStack, que se utiliza para almacenar un grupo de objetos.
|--solicitud
|--aplicación
contexto ------|--Variable raíz OgnlValueStack [acción, OgnlUtil, ...]
|--sesión
|--atributo
|--parámetros
El primer objeto de la variable raíz se denomina objeto superior de la pila. Por lo general, podemos acceder a las propiedades del objeto en la variable raíz escribiendo directamente el nombre de la propiedad en la expresión OGNL. La secuencia de búsqueda comienza desde el objeto en la parte superior de la pila si la propiedad no existe en el objeto. en la parte superior de la pila, se buscará desde el segundo objeto; si no se encuentra, se buscará desde el tercer objeto y se accederá a él en secuencia hasta que se encuentre.
Atención: en Struts2, las expresiones OGNL deben usarse con etiquetas de Struts. Por ejemplo: <s:valor de propiedad="nombre"/>
Dado que ValueStack es el objeto raíz de OGNL en Struts 2, si el usuario necesita acceder a los objetos en la pila de valores, la página JSP puede acceder directamente a las propiedades de los objetos en ValueStack a través de la siguiente expresión EL:
${foo} //Obtiene el atributo foo de un objeto en la pila de valores
Si accede a objetos en otros contextos, dado que no son objetos raíz, debe agregar el prefijo # al acceder.
Objeto de aplicación: se utiliza para acceder a ServletContext, como #application.userName o #application ['userName'], que equivale a llamar a getAttribute ("nombre de usuario") de ServletContext.
Objeto de sesión: se utiliza para acceder a HttpSession, como #session.userName o #session['userName'], que equivale a llamar a session.getAttribute ("userName").
Objeto de solicitud: mapa utilizado para acceder a los atributos HttpServletRequest, como #request.userName o #request['userName'], que equivale a llamar a request.getAttribute("userName").
Objeto de parámetros: se utiliza para acceder a los parámetros de solicitud HTTP, como #parameters.userName o #parameters ['userName'], que equivale a llamar a request.getParameter ("nombre de usuario").
Objeto attr: se utiliza para acceder a sus atributos en el orden de página->solicitud->sesión->aplicación.
8. ¿Por qué puedes usar expresiones EL para acceder a las propiedades de los objetos en valueStack?
La razón es que Struts2 encapsula aún más HttpServletRequest. El código simplificado es el siguiente:
la clase pública StrutsRequestWrapper extiende HttpServletRequestWrapper {
StrutsRequestWrapper público (solicitud HttpServletRequest) {
super(requisito);
}
objeto público getAttribute (cadena s) {
...
ActionContext ctx = ActionContext.getContext();
Atributo de objeto = super.getAttribute(s);//Primero obtenga el valor del atributo del alcance de la solicitud
si (ctx! = nulo) {
if (attribute == null) {// Si el valor del atributo no se encuentra en el rango de solicitud, busque el valor del atributo del objeto en ValueStack
...
Pila ValueStack = ctx.getValueStack();
atributo = pila.findValue(s);
...
}
}
atributo de retorno;
}
}
9. Cree objetos de colección de listas/mapas usando expresiones OGNL
Si necesita un elemento de colección (como un objeto Lista o un objeto Mapa), puede usar las expresiones relacionadas con la colección en OGNL.
Utilice el siguiente código para generar directamente un objeto Lista:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:valor del iterador="#lista" id="n">
<s:valor de propiedad="n"/>><br>
</s:iterador>
Generar un objeto de mapa:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:valor del iterador="#foobar" >
<s:valor de propiedad="clave"/>=<s:valor de propiedad="valor"/>><br>
</s:iterador>
La etiqueta Set se utiliza para colocar un valor en un rango específico.
Alcance: especifica el alcance en el que se coloca la variable. Este atributo puede aceptar aplicación, sesión, solicitud, página o acción. Si este atributo no está configurado, se colocará en el contexto OGNL de forma predeterminada.
valor: el valor asignado a la variable. Si este atributo no está establecido, el valor en la parte superior de la pila ValueStack se asigna a la variable.