JSTL 1.0. Estandarizando JSP.

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

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

Frecuentemente terminaremos con una mezcla de estas tcnicas, usar pginas separadas para la mayora de las grandes cantidades de contenido esttico y pginas compartidas cuando la cantidad de contenido sea pequea pero dinmica (por ejemplo, una pgina con unas pocas etiquetas fijas mostradas en diferentes idiomas y todos los dems datos que vengan desde una base de datos).

Preparar una aplicacin para varios idiomas se llama internacionalizacin (comunmente abreviado i18n) y hacer que el contenido est disponible para un idioma especfico se llama localizacin (o l10n). Para hacer esto necesitamos considerar otras cosas adems del idioma. Cmo se formatean las fechas y nmeros entre los diferentes pases, e incluso dentro de los pases. Tambin podramos necesitar adaptar los colores, las imgenes y otro contenido no textual. El trmino localidad se refiere a un conjunto de reglas y contenido aceptable para una regin o cultura.

.Formateo de Fechas y Nmeros Sensible a la Localidad

JSTL incluye un conjunto de acciones para simplificar la internacionalizacin, principalmente cuando pginas compartidas se usan para varios idiomas. Primero veamos cmo formatear apropiadamente fechas y nmeros. Este ejemplo formatea la fecha actual y un nmero basndose 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 lnea es la directiva taglib para la librera JSTL que contiene las acciones de formateo e internacionalizacin. 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 algn formateo sensible a la localidad. La accin JSTL <fmt:formatDate> formatea el valor de la variable now asignado al valor del atributo value usando el tipo de expresin EL que aprendimos en la pgina anterior. El atributo dateStyle le dice a la accin cmo 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, slo hemos formateado la parte de la fecha, pero tambin podemos incluir la parte de la hora (o formatear slo 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 patrn de formateo personalizado del mismo tipo que la clase java.text.SimpleDateFormat. El patrn usado aqu resulta en Thursday, 29 August 2002, 17:29 con la localidad English. La accin <fmt:formatNumber> soporta atributos similares para especificar cmo formatear un nmero usando estilos dependientes de la localidad para nmeros normales, valores de moneda, o un porcentaje, as como usar patrones personalizados de diferentes tipos.

.Usar JSTL para Seleccionar la Localidad

Volviendo a la cuestin principal: Cmo se determina la localidad para formatear las fechas y los nmeros? Si usamos las acciones JSTL exactamente como en este ejemplo, sin hacer nada ms, 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 ejecucin Java.

La cabecera, si est presente, contiene una o ms especificaciones de localidades (en la forma de cdigo de idioma y posiblemente un cdigo de pas), con informacin 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 mquina virtual Java, y se selecciona la que mejor coincida.

Si no se encuentra una correspondencia, la accin de formateo busca la llamada seleccin de configuracin de la localidad pre-definida. Una seleccin de configuracin es un valor seleccionado por un parmetro de contexto en el fichero web.xml de la aplicacin o por una accin 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 seleccin, se usar la localidad German (especificada por el cdigo de idioma de como valor de parmetro) si ninguna de las localidades especificadas por la solicitud est soportada por el entorno Java.

JSTL tambin nos permite seleccionar una localidad por defecto para la aplicacin que podremos sobreescribir cuando lo necesitemos. Esto nos da control total sobre la localidad a utilizar, en lugar de dejarlo a la configuracin del navegador del visitante. La localidad por defecto tambin es una seleccin de configuracin. Se puede especificar con un parmetro 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 seleccin establece English como la localidad por defecto, resultando en la anterior pgina JSP siempre formatear la fecha y los nmeros de acuerdo a las reglas inglesas.

Para sobreescribir la configuracin del localidad por defecto, podemos usar la accin <fmt:setLocale>. Selecciona la localidad por defeco dentro de un mbito JSP especfico. Aqu tenemos un ejemplo que selecciona la localidad por defecto del mbito de la pgina, basndose 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 accin JSTL <c:if> para comprobar si con la solicitud se ha recibido una cookie llamada preferredLocale. Si es as, la accin <fmt:setLocale> sobreescribe la localidad para la pgina actual seleccionan la variable de configuracin de la localidad en el mbito de la pgina. Si lo queremos, podemos seleccionar la localidad para otro mbito usando el atributo scope. Finalmente, se formatean la fecha y el nmero de acuerdo a las reglas de la localidad especificada por la cookie, o la localidad por defecto, si la cookie no est presente.

Adems de acciones para formateo, JSTL incluye acciones para interpretar (analizar) fechas y nmero 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 nmeros en sus formas nativas antes de procesarlas.

.Usar un Controlador para Selecciona la Localidad

Si has desarrollado aplicaciones Web usando tecnologa Java, sin duda habrs odo algo sobre el patrn MVC y mejor, sobre el marco de trabajo Struts de Apache. La idea bsica que hay detrs del patrn MVC es que una aplicacin es ms fcil 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 (lgica de negocio), pginas JSP para la Vista (el interface de usuario) y un servlet como el Controlador (la parte que controla la comunicacin entre la Vista y el Modelo). Struts proporciona un servlet Controlador genrico que delega el procesamiento especfico de tipos especficos de solicitudes a classes llamadas clases Action, y luego usa una pgina JSP especificada por la Action para generar la respuesta.

JSTL est diseado para jugar bien en una aplicacin 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 configuracin usadas por las acciones JSTL en las pginas 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 configuracin, y mtodos para seleccionar, obtener y eliminar las variables en diferentes mbitos JSP. Podemos usar cdigo como este en una clase Action de Struts para seleccionar la localidad por defecto para la sessin, basado en un prfil de datos, cuando un usuario entra en la aplicacin:

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 mtodos set(), uno por cada mbito JSP (especificado por el primer parmetro de mtodo). Aqu hemos usado el que selecciona la variable en el mbito de sesin. El segundo parmetro es el nombre de la configuracin, tpicamente seleccionado por la constante correspondiente. El tercer parmetro es el valor de la variable. Para leer y eliminar variable, la clase proporciona mtodos get() y remove() similares, ms un mtodo find() para localizar una variable en cualquier mbito. Adems de usar estos mtodos en un Controlador, podramos querer usarlos en nuestro propios manejadores de etiquetas personalizados para aprovecharnos de los mecanismos de configuracin JSTL.

.Generar Texto Localizado

Aunque formatear fechas y nmero es importante cuando se localiza una aplicacin, el cotenido de texto es, por supuesto, incluso ms importante. JSTL est basado en Java, por eso trata con el soporte genrico 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 ms 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, debera almacenarse en un fichero llamado labels_en.properties. El paquete de recursos para la localidad Swedish sera almacenado en un fichero llamado labels_sv.properties, donde sv es el cdigo 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 especificacin de localidad (como un cdigo de idioma) para encontrar el paquete de recursos para una localidad especfica. Todos los paquetes de recursos incluyen las mismas claves; slo 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 aplicacin.

La accin JSTL que aade texto desde un paquete de recursos a una pgina es <fmt:message>. El paquete a utilizar puede especificarse de varias formas. Una es anidar las acciones <fmt:message> dentro del cuerpo de una accin <fmt:bundle>:

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

En este caso, la accin <fmt:bundle> localiza el paquete de la localidad que es la correspondencia ms cercana entre la seleccin de configuracin 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 aplicacin con un parmetro de contexto o con la accin <fmt:setBundle> o la clase Config para un mbito JSP especfico:

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

Despus 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.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.