"Que si debiera caer a través del centro de la tierra... y salir del otro lado, donde la gente caminan al revés "
3.1 Visión General
El framework provee soporte de infraestructura para componentes de vista, pero no provee cualquier componente propios vista. Varias tecnologías de presentación están disponibles, incluyendo a lo largo de otros, Cocoon, JSP, Plantillas Velocity y XSLT.
Características previstas por el framework por el uso directo por los componentes vista incluyen Recursos de Mensajes para localizar texto e imágenes y FormBeans para proveer una población automática y validación.
3.2 Mensajes internacionalizados
Hace unos años, las aplicaciones de desarrolladores podría contar en tener soporte solo residentes en su propio país, que son usados solo uno(o algunas veces dos) lenguajes y un camino que representa cantidades numéricas como fechas, números y valores monetarios. Sin embargo, la explosión de aplicaciones desarrolladas basadas en tecnologías web, así como el despliegue de tales aplicaciones en el Internet y otros ampliamente redes accesibles, tengan prestados limites nacionales invisibles en muchos casos. Esto tiene traducido (si me permite el juego de palabras) dentro de una aplicación necesaria para soporte internacionalización(a menudo llamado "i18n" porque 18 es el número de letras entre la "i" y la "n") y localización.
El framework se basa en las clases estándar disponibles en la plataforma Java para construir aplicaciones internacionalizadas y localizada. El concepto clave para familiarizarse con estos:
- Locale - La clase fundamenta de Java que soporta internacionalización es Locale. Cada Locade representa una opción en particular de país y lenguaje(mas un lenguaje variante opcional) y un conjunto de supuestos formatos para pensar como números y datos.
- ResourceBundle - La clase java.util.ResourceBundle provee herramientas fundamentales para el soporte de mensajes en múltiples lenguajes. Ver el Javadocs para la clase ResourceBundle y la información de Internacionalización en la documentación acumulada para tu JDK libre, para mas información.
- PropertyResourceBundle - Uno de implementación estandar de ResourceBundle que permite definir recursos usando la misma sintaxis "name=value" usado para inicializar propiedades de archivos. Hay muchos convenientes para preparar recursos con mensajes que son usados en una aplicación web, porque estos mensajes son generados en texto
- MessageFormat - La clase java.text.MessageFormat permite remplazar una parte de la cadena del mensaje(en este caso, recuperar desde un manojo de recursos) con argumentos específicos en tiempo de ejecución. Esto es útil en casos donde creas una sentencia, pero las palabras podrían aparecer en un diferente ordeny en diferentes lenguajes. La cadena de marcador de posición {0} en el mensaje es remplazado por el primer argumento en ejecución, {1} es remplazado por el segundo argumento, etcétera.
- MessageResource - La clase del framework org.apache.struts.util.MessageResources permite tratar un conjunto de recursos aplicados como una base de datos y permite una solicitud un mensaje de cadenas en particular para un local en particular(normalmente un asociado con el usuario en particular) en lugar de el Local por default el servidor mismo este corriendo.
Para una aplicación internacionalizada, sigue los pasos descritos en el documento internacionalizado en la documentación JDK compilada para la plataforma para crear un archivo de propiedades conteniendo los mensajes para cada lenguaje. Un ejemplo mas se ilustrará:
Asume que el código fuente es creado en un paquete com.mycompany.mypackage, por lo que es almacenado en un directorio(relativo al directorio fuente) nombrado com/mycompany/mypackage. Para crear un recurso compilado llamado com.mycompany.mypackage.MyApplication, crearia los siguiente archivos en el directorio com/mycompany/mypackage:
- MyApplication.properties - Contiene los mensajes en el lenguaje inicial para el servidor. Si el lenguaje inicial es el Ingles, es posibles que tengas una entrada como esto: prompt.hello=Hello
- MyApplication_xx.properties - Contiene los mismos mensajes en el lenguaje cuyo código lenguaje ISO es "xx"(Ver la página ResourceBundle Javadoc para un enlace en la lista actual). Para la versión Frances de los mensajes mostrados arriba se tendrá esta entrada: prompt.hello=Bonjour Puedes tener archivos de recursos compilados para muchos lenguajes que sea necesarios.
<message-resource parameter="com.mycompany.mypackage.MyApplication"/>
La cosa importante es por el recurso compilado que se encuentran en el camino de las clases de la aplicación. Otros enfoques es almacenar en el archivo de MyResources.properties en el folder de la aplicación. Lo puedes simplificar especificando "myResources" como el valor de la aplicación. Pero ten cuidado este no debe ser borrado si construyes clases como parte de un objetivo de "limpia".
Si lo hace, aquí la tarea de Ant es correr cuando compilas la aplicación que copia el contenido del directorio src/conf al directorio clases:
<!--Copy any configuration files-->
<copy todir="classes">
<fileset dir="src/conf"/>
</copy>
3.3 Interacciones Forms y FormBean
Nota: Mientras el ejemplodado aqui usa JSP y tags personalizado, el beans ActionForm y otros componentes controladores son una Vista neutral. El framework tambien puede ser usado con Cocoon, Plantillas Velocity, XSLT y cualquier otra tecnología de presentación que pueden ser prestados vía un servlet Java.
3.3.1 Población Automática de Form
De una sola vez u otras, más desarrolladores web han construidos forms usando las capacidades estándar de HTML, tales como el tag <input>. Los usuarios han venidos esperando que las aplicaciones interactivas tengan ciertos comportamientos y una de estas expectativas relaciona el manejo de errores -- si el usuario marca un error, la aplicación debería permitir la reparación solo que sea necesario ser cambiado -- sin tener que reingresar cualquier información en la página actual o form.
Cumpliendo esta expectación es tediosa y engorrosa cuando codificamos con el estandar HTML y páginas JSP. Por ejemplo, un elemento de entrada para un campo usarname se veria como este(en JSP):
<input type="text" name="username"
value="<%= login.Bean.getUsername() >"/>
el cual es dificil para escribir correctamente, confuso a los desarrolladores HTML quien no estan bien informados acerca de los conceptos de programación y puede causar problemas con los editores HTML. En vez Struts Taglib provee una facilidad comprensiva para construir forms, basados en laBiblioteca Tag Personalizada faclitada por JSP 1.1. El caso de arriba serían prestados como se usan los Struts Taglibs:
<html:text property="username"/>;
sin necesidad para referirse de forma explicita a el JavaBean desde el cual el valor inicial es recuperado. Eso se maneja automáticamente por el tag JSP, usando las facilidades proporcionados por el framework.
Forms HTML son algunas veces usadas para actualizar otros archivos. Mas browser esto a través de un elemento <input type="file">, que genera un botón de archivo navegable, pero le tocaal desarrollador manejar los archivos de entrada. El framework maneja estos forms "multiparte" en un idéntico camino para construir forms normales.
Para un ejemplo de uso del framework para crear un simple form login, ver Construir un ActionForm Howto.
3.3.2 Validación Automática Form
En suma a las interacciones de form y bean descritas arriba, el framework ofrece una facilidad para validar la entrada de campos que ha recibido. Para utilizar estas características, reescribir el siguiente método en la clase ActionForm:
validate(ActionMapping mapping HttpServletRequest request);
El método validate es llamado por el controlador servlet despues la propiedad bean ha sido poblada, pero antes el correspondiente método execute de la clase action es invocada. El método validate tiene las siguientes opciones:
- Realizan la apropiada validación y no encuentran problemas -- Regresan null o una instancia de longitud cero y el controlador servlet procederá a llamar al método execute de la clase Action.
- Realizan la apropiada validación y encuentran problemas -- Regresa una instancia ActionError conteniendo ActionMessage, los cuales son clases que contienen llaves de mensajes de error(dentro compilados de MessageResource de aplicaciones) que deberían ser mostrados. El controlador servlet almacenará estas colecciones como un atributo de solicitud adecuada para el uso del tag <html:errors> y reenviará de regreso el control al form de entrada(identificado por la propiedad input para esta ActionMapping).
Como se mencionó anteriormente, estas características son enteramente opcionales. La implementación inicial del método validate regrese null y el controlador servlet asumirá que requiera cualquier validaciónque sea hecha por la clase action.
Un enfoque común es realizarlo simple, la prima facia validación usa el método ActionForm validate y luego maneja la validacion de "lógica de negocios" desde el Action.
El Struts Validator cubierta en la proxima sección, puede ser usado para facilitar la validación ActionFroms.
3.3.3 El Validador Struts
Configurar el Validador para ejecutar la validación del form es fácil.
1. El bean ActionForm deberá extenderse ValidatorForm.
2. Los JSP de forms incluye el tag <html:javascript> para el lado de la validación del cliente.
3. Deberá definir las reglas de validación en un archivo xml como este:
<form-validation>
<formset>
<form name="logonForm">
<field property="username" depends="required">
<msg name="required" key="error.username"/>
</field>
</form>
</formset>
</form-validation>
El punto elemental msg a la llave de recursos de mensaje para usar cuando generamos el mensaje de error.
4. Por último debe habilitar el ValidatorPlugin en el archivo struts-config.xml como sigue
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>
Nota: Si requiere la propiedad de form si uno de los objetos representados de Java de tipos primitivos(p.e. java.lang.Integer) debe establecer el paramaetro convertNull init de ActionServlet's a verdadero. Si no se hace este regresará la validación requerida no se realizará en el campo porque este será de inicio 0.
Para más acerca de Struts Validator, ver el Guía de los Desarrolladores
3.3.4 Composición de Páginas con Azulejos
Los azulejos con una poderosa biblioteca de plantillas que permite construir vistas conteniendo varios "azulejos". He aquí una instalación rápida:
1. Crear un archivo /layout/layout.jsp que contiene las aplicaciones comunes para verse y sentirse:
<html>
<body>
<tiles:insert attribute="body">
</body>
</html>
2. Crear un archivo página de inicio /index.jsp
<h1>This is my hompage</h1>
3. Crear un archivo /WEB-INF/tiles-defs.xml que se vea como sigue:
<tiles-definitions>
<definition name="layout" path="/layout/layout.jsp">
<put name="body" value=""/>
</definition>
<definition name="homepage" extends="layout">
<put name="body" value="/index.jsp">
</definition>
<tiles-definitions>
4. Configurar el TilesPlugin en el archivo struts-config.xml
<plug-in className="org.apache.struts.titles.TilesPlugin">
<set-property property="definitions-config" values="/WEB-INF/tiles-defs.xml"/>
</plug-in>
5.Configurar un mapeo action en struts-config.xml al punto al azulejo de la pagina de inicio:
<action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="homepage">
La configuración TilesPlugin a un especial RequesProcessor que determina si la solicitud fue vista es un azulejo y procesarlo en consecuencia. Nota que hicimos el azulejo de página de inicio extendido a nuestro plan raiz y cambiar los atributos del cuerpo. Los azulejos insertan el nombre del archivo en los atributos del cuerpo dentro del plan principal.
Ver el página web de Azulejos Struts para ejemplos en profundidad.
3.4 Presentación de Frameworks
El framework es soportado por muchas tecnologías de presentación y hay un buen de números de extensiones que facilitan la creación de componentes vistas aun más fácil. Algunas tecnologías de presentaciones populares son:
3.5 Otras Técnicas de Presentación
Aunque la apariencia de la aplicación puede ser completamente construida basada en las capacidades estándar de las bibliotecas de presentación, es posible que necesites emplear otras técnicas para hacer algunas respuestas directamente.
3.5.1 Componentes de Interpretación de Imágenes
Algunas aplicaciones requieren imágenes generadas dinámicamente, como los gráficos de precios en la existencia de reporte del sitio. Dos diferentes enfoques son comunmente usados para conocer estes requerimientos:
Hacer un enlace con la URL que ejecuta una solicitud servlet. El servlet usará una biblioteca de gráficos para hacer la imágen, configurar el tipo de contenido apropiadamente(tal como image/gif) y enviar de vuelta los bytes de la imagen al browser, la cual mostrará como si hubiera recibido un archivo estático.
Hacer el código HTML necesario para descargar el applet JAva que crea el gráfico solicitado. Puedes configurar el gráfico configurando los parámetros de inicialización apropiados para el applet en el código realizado, o puedes hacer el applet con la misma conexión al server para recibir estos parámetros
3.5.2 Interpretando Imágenes
Algunas aplicaciones requieren texto generado o de margen, tal como XML. Si una página completa que se quedan y puede ser la salida usando un PrintWriter, esto es muy fácil de hacer desde un Action:
response.setContentType("text/plain"); // or text/xml
PrinterWriter writer = response.getWriter();
//use writer to render text
return(null);
Siguiente: Construcción de Componentes Controladores
©
2000-2008
Apache Software Foundation