Categorías destacadas
programacion php    
Artículo
4
¡votar!

 JSTL 1.0. Estandarizando JSP.


Internacionalización y Formateo

Las grandes sites normalmente necesitan complacer a los visitantes de todo el mundo, y servir el contenido sólo en un idioma no es suficiente. Para desarrollar una site que proporcione una elección de idiomas, tenemos dos opciones:

  • Escribir un conjunto de páginas para cada idioma.
  • Escribir un conjunto compartido de páginas que ponga el contenido en diferentes idiomas desde fuentes externas.

Frecuentemente terminaremos con una mezcla de estas técnicas, usar páginas separadas para la mayoría de las grandes cantidades de contenido estático y páginas compartidas cuando la cantidad de contenido sea pequeña pero dinámica (por ejemplo, una página con unas pocas etiquetas fijas mostradas en diferentes idiomas y todos los demás datos que vengan desde una base de datos).

Preparar una aplicación para varios idiomas se llama internacionalización (comunmente abreviado i18n) y hacer que el contenido esté disponible para un idioma específico se llama localización (o l10n). Para hacer esto necesitamos considerar otras cosas además del idioma. Cómo se formatean las fechas y números entre los diferentes países, e incluso dentro de los países. También podríamos necesitar adaptar los colores, las imágenes y otro contenido no textual. El término localidad se refiere a un conjunto de reglas y contenido aceptable para una región o cultura.

. Formateo de Fechas y Números Sensible a la Localidad

JSTL incluye un conjunto de acciones para simplificar la internacionalización, principalmente cuando páginas compartidas se usan para varios idiomas. Primero veamos cómo formatear apropiadamente fechas y números. Este ejemplo formatea la fecha actual y un número basándose en las reglas de la localidad por defecto:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<html>
<body>
  <h1>Formatting with the default locale</h1>
  <jsp:useBean id="now" class="java.util.Date" />
  Date: <fmt:formatDate value="${now}" dateStyle="full" />
  Number: <fmt:formatNumber value="${now.time}" />
</body>
</html>

La primera línea es la directiva taglib para la librería JSTL que contiene las acciones de formateo e internacionalización. El prefijo por defecto, usado aquí, es fmt. Para obtener un valor a formatear, entonces crea un objeto java.util.Date que representa la fecha y hora actuales, y lo graba como una variable llamada now.

Ya estamos preparados para hacer algún formateo sensible a la localidad. La acción JSTL <fmt:formatDate> formatea el valor de la variable now asignado al valor del atributo value usando el tipo de expresión EL que aprendimos en la página anterior. El atributo dateStyle le dice a la acción cómo debe formatear la fecha.

Podemos usar cualquiera de los valores default, short, medium, long, o full para el atributo dateStyle. El tipo de formateo que representa cada uno de estos tipos depende exactamente de la localidad. Para la localidad English, full resulta en un string como Thursday, August 29, 2002. En este ejemplo, sólo hemos formateado la parte de la fecha, pero también podemos incluir la parte de la hora (o formatear sólo la hora), y definir reglas de formateo personalizadas tanto para la fecha como para la hora en lugar de los estilos dependientes de la localidad:

<fmt:formatDate value="${now}" type="both" 
pattern="EEEE, dd MMMM yyyy, HH:mm" />

El atributo pattern toma un patrón de formateo personalizado del mismo tipo que la clase java.text.SimpleDateFormat. El patrón usado aquí resulta en Thursday, 29 August 2002, 17:29 con la localidad English. La acción <fmt:formatNumber> soporta atributos similares para especificar cómo formatear un número usando estilos dependientes de la localidad para números normales, valores de moneda, o un porcentaje, así como usar patrones personalizados de diferentes tipos.

. Usar JSTL para Seleccionar la Localidad

Volviendo a la cuestión principal: ¿Cómo se determina la localidad para formatear las fechas y los números? Si usamos las acciones JSTL exactamente como en este ejemplo, sin hacer nada más, el formateo de localidad se determina comparando las localidades especificadas en un cabecera de solicitud llamada Accept-Language con las localidades soportadas por el entorno de ejecución Java.

La cabecera, si está presente, contiene una o más especificaciones de localidades (en la forma de código de idioma y posiblemente un código de país), con información sobre su prioridad relativa. El usuario utiliza las configuracioens del navegador para definir qué especificaciones de localidades enviar. Las localidades de la solicitud se comparan en orden de prioridad con las ofrecidas por la máquina virtual Java, y se selecciona la que mejor coincida.

Si no se encuentra una correspondencia, la acción de formateo busca la llamada selección de configuración de la localidad pre-definida. Una selección de configuración es un valor seleccionado por un parámetro de contexto en el fichero web.xml de la aplicación o por una acción JSTL o una sentencia Java en uno de los ámbitos JSP. Para seleccionar esta localidad en el fichero web.xml, incluimos estos elementos:

<context-param>
<param-name>
  javax.servlet.jsp.jstl.fmt.fallbackLocale
</param-name>
<param-value>
  de
</param-value>
</context-param>

Con esta selección, se usará la localidad German (especificada por el código de idioma de como valor de parámetro) si ninguna de las localidades especificadas por la solicitud está soportada por el entorno Java.

JSTL también nos permite seleccionar una localidad por defecto para la aplicación que podremos sobreescribir cuando lo necesitemos. Esto nos da control total sobre la localidad a utilizar, en lugar de dejarlo a la configuración del navegador del visitante. La localidad por defecto también es una selección de configuración. Se puede especificar con un parámetro de contexto en el fichero web.xml de esta forma:

<context-param>
<param-name>
  javax.servlet.jsp.jstl.fmt.locale
</param-name>
<param-value>
  en
</param-value>
</context-param>

Esta selección establece English como la localidad por defecto, resultando en la anterior página JSP siempre formateará la fecha y los números de acuerdo a las reglas inglesas.

Para sobreescribir la configuración del localidad por defecto, podemos usar la acción <fmt:setLocale>. Selecciona la localidad por defeco dentro de un ámbito JSP específico. Aquí tenemos un ejemplo que selecciona la localidad por defecto del ámbito de la página, basándose en una cookie que sigue la pista de la localidad seleccionada por el usuario en una visita anterior:

<h1>Formatting with a locale set by setLocale</h1>
<c:if test="${!empty cookie.preferredLocale}">
<fmt:setLocale value="${cookie.preferredLocale.value}" />
</c:if>
<jsp:useBean id="now" class="java.util.Date" />
Date: <fmt:formatDate value="${now}" dateStyle="full" />
Number: <fmt:formatNumber value="${now.time}" />

Aquí, primero hemos usado la acción JSTL <c:if> para comprobar si con la solicitud se ha recibido una cookie llamada preferredLocale. Si es así, la acción <fmt:setLocale> sobreescribe la localidad para la página actual seleccionan la variable de configuración de la localidad en el ámbito de la página. Si lo queremos, podemos seleccionar la localidad para otro ámbito usando el atributo scope. Finalmente, se formatean la fecha y el número de acuerdo a las reglas de la localidad especificada por la cookie, o la localidad por defecto, si la cookie no está presente.

Además de acciones para formateo, JSTL incluye acciones para interpretar (analizar) fechas y número de una forma sensible a la localidad: <fmt:parseDate> y <fmt:parseNumber>. Estas acciones soportan casi todos los mismos atributos que sus contrapartidas de formateo, y se pueden utilizar para convertir entradas de fechas y números en sus formas nativas antes de procesarlas.

. Usar un Controlador para Selecciona la Localidad

Si has desarrollado aplicaciones Web usando tecnología Java, sin duda habrás oído algo sobre el patrón MVC y mejor, sobre el marco de trabajo Struts de Apache. La idea básica que hay detrás del patrón MVC es que una aplicación es más fácil de mantener y evolucionar si las diferentes partes de la aplicacion (Modelo, Vista y Controlador) se implementan como componentes separados. Para Java, esto normalmente significa usar Beans como el Modelo (lógica de negocio), páginas JSP para la Vista (el interface de usuario) y un servlet como el Controlador (la parte que controla la comunicación entre la Vista y el Modelo). Struts proporciona un servlet Controlador genérico que delega el procesamiento específico de tipos específicos de solicitudes a classes llamadas clases Action, y luego usa una página JSP especificada por la Action para generar la respuesta.

JSTL está diseñado para jugar bien en una aplicación basada en MVC exponiendo una clase que puede ser utilizada por cualquier componente Java, como una clase Action de Struts, para acceder a las variables de configuración usadas por las acciones JSTL en las páginas JSP que representan la Vista. La clase se llama javax.servlet.jsp.jstl.core.Config y contiene constantes ( variables static final String) para todas las variables de configuración, y métodos para seleccionar, obtener y eliminar las variables en diferentes ámbitos JSP. Podemos usar código como este en una clase Action de Struts para seleccionar la localidad por defecto para la sessión, basado en un pérfil de datos, cuando un usuario entra en la aplicación:

import javax.servlet.jsp.jstl.core.Config;
...
public class LoginAction extends Action {

    public ActionForward perform(ActionMapping mapping, 
        ActionForm form, HttpServletRequest request, 
        HttpServletResponse response) throws IOException, ServletException {

        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        ...
        User user = authenticate(userName, password);
        if (user != null) {
            /*
            * Valid user. Set the default locale in the session
            * to the user's preferred locale
            */
            HttpSession session = request.getSession();
            Config.set(session, Config.FMT_LOCALE, user.getLocale());
            ...
        }    
    }
}

La clase Config proporciona cuatro métodos set(), uno por cada ámbito JSP (especificado por el primer parámetro de método). Aquí hemos usado el que selecciona la variable en el ámbito de sesión. El segundo parámetro es el nombre de la configuración, típicamente seleccionado por la constante correspondiente. El tercer parámetro es el valor de la variable. Para leer y eliminar variable, la clase proporciona métodos get() y remove() similares, más un método find() para localizar una variable en cualquier ámbito. Además de usar estos métodos en un Controlador, podríamos querer usarlos en nuestro propios manejadores de etiquetas personalizados para aprovecharnos de los mecanismos de configuración JSTL.

. Generar Texto Localizado

Aunque formatear fechas y número es importante cuando se localiza una aplicación, el cotenido de texto es, por supuesto, incluso más importante. JSTL está basado en Java, por eso trata con el soporte genérico de i18n de la plataforma Java. Cuando viene con texto, este soporte está basado en lo que se llama un paquete de recursos. En su forma más simple, un paquete de recursos está representado por un fichero de texto que contiene claves y un valor de texto para cada clave. Este ejemplo muestra un fichero con dos claves (hello y goodbye) y sus valores:

hello=Hello
goodbye=Goodbye

Las distintas localidades se soportan creando ficheros separados para cada una de ellas, con un nombre de fichero que incluye el nombre de la localidad. Por ejemplo, si el fichero del paquete de recursos anterior representa la localidad English, debería almacenarse en un fichero llamado labels_en.properties. El paquete de recursos para la localidad Swedish sería almacenado en un fichero llamado labels_sv.properties, donde sv es el código de idioma. La parte fija del nombre de fichero, labels de este ejemplo, se llama el nombre base del paquete de recursos, y se combina con una especificación de localidad (como un código de idioma) para encontrar el paquete de recursos para una localidad específica. Todos los paquetes de recursos incluyen las mismas claves; sólo difiere el texto dependiendo de la localidad. Los ficheros deben situarse en un directorio que sea parte del classpath del contenedor, normalmente el directorio WEB-INF/classes de la aplicación.

La acción JSTL que añade texto desde un paquete de recursos a una página es <fmt:message>. El paquete a utilizar puede especificarse de varias formas. Una es anidar las acciones <fmt:message> dentro del cuerpo de una acción <fmt:bundle>:

<fmt:bundle basename="labels">
Hello: <fmt:message key="hello" />
Goodbye: <fmt:message key="goodbye" />
</fmt:bundle>

En este caso, la acción <fmt:bundle> localiza el paquete de la localidad que es la correspondencia más cercana entre la selección de configuración de la localidad (o las localidades en el cabecera Accept-Language, si no hay localidad por defecto) y los paquetes de recursos disponibles para el nombre base especificado. Las acciones anidadas obtienen el texto desde el paquete por la clave asociada.

Al igual que con las acciones de formateo, podemos establecer un paquete por defecto, para toda la aplicación con un parámetro de contexto o con la acción <fmt:setBundle> o la clase Config para un ámbito JSP específico:

<fmt:setBundle basename="labels"/>
...
Hello: <fmt:message key="hello" />
Goodbye: <fmt:message key="goodbye" />

Después de que se haya definido un paquete por defecto, podemos usar acciones <fmt:message> independientes dentro del ámbito donde se estableció el valor por defecto.

Publicado por:
Bruno Gutierrez
Recomendar
a un amigo
Compartir
en redes
 
Comentarios
 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon