La View comprende las JSP (principalmente) y los servlets involucrados en la generaci�n de la interfaz de usuario o con otros Sistemas. Struts provee soporte para construir aplicaciones multi-idioma, interacci�n con formularios y otras utilidades mediante la utilizaci�n de Tags especiales (TagLibraries).
�Internacionalizaci�n
Lo podemos abreviar en la siguiente receta:
- Crear un archivo de texto (ej: MiAplicacion.properties) en el directorio donde se encuentren las clases de la aplicaci�n (ej: d:\com\empresa\aplicacion) donde se contengan las claves y valores con el formato clave.subclave=texto de los textos que pertenezcan al idioma principal. Ejemplo:
- Para cada idioma alternativo se crear� un archivo nuevo que se llame igual pero que termine en "_xx.properties" siendo xx el c�digo ISO de idioma (ej: MiAplicaci�n_en.properties).
- En struts-config.xml se debe configurar el Tag /servlet/init-param/param-name application y ponerle como param-value la localizaci�n del archivo con el idioma principal. Ejemplo:
- En web.xml deberemos inclur:
- En las JSPs donde utilicemos la internacionalizaci�n deberemos incluir al comienzo:
- Y finalmente, utilizaremos el Tag <bean:message key="clave.subclave"/> donde clave y subclave corresponden al texto por el que se reemplazar� seg�n el idioma del usuario. Ejemplo
... application.title= Demo de Struts en APLICACION index.header=Bienvenido a la Demo de Struts en APLICACION ...
<servlet> <servlet-name>action</servlet-name> ... <init-param> <param-name>application</param-name> <param-value>com.empresa.aplicacion.MiAplicacion</param-value> </init-param> ...
<web-app> ... <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> ... </web-app>
... <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> ...
para declarar que utilizaremos la TagLibrary struts-bean con el prefijo bean y definida en /WEB-INF/struts-bean.tld
... <TITLE><bean:message key="application.title"/></TITLE> ...
Por defecto Struts asigna a cada usuario el idioma principal de la aplicaci�n. Si se utiliza el tag <html:html locale="true"> (reemplaza a "<html>" y debe cerrarse con "</html:html>") entonces se utilizar� el primero de los idiomas soportados por la aplicaci�n que se encuentre en el header "Accept-Language" enviado por su navegador. Pero si se desea proponerle al usuario una lista de idiomas entonces �ste podr� cambiarse mediante session.setAttribute( Action.LOCALE_KEY, new java.util.Locale(country, language)) donde country y language ser�n el string del pa�s e idioma a establecer.
Adem�s de texto podran incluirse variables (al igual que se hace en los println) y hasta formato de datos. Para m�s informaci�n ver la documentaci�n oficial de Sun disponible en http://java.sun.com/j2se/1.3/docs/guide/intl/
�Forms
Una de las tareas que durante el desarrollo de una aplicaci�n insume mucho trabajo (aunque en realidad no lo merezcan) es la interacci�n con formularios, ya sea para editar u obtener nueva informaci�n. Las comprobaciones, la gesti�n de errores, el volver a presentarle el mismo form al usuario con los valores que puso y los mensajes de error y un largo etc�tera est�n soportadas por Struts a fines de hacernos la vida un poco m�s f�cil.
La idea es la siguiente: todo el trabajo de comprobaciones y generaci�n de mensajes de error se implementa en los ActionForm y todo el trabajo de generaci�n de interfaz en la/s JSP.
Veamos la receta:
- Crear el ActionForm (ver la secci�n Model / ActionForm Beans)
- Crear la p�gina JSP del formulario utilizando los Tags que provee Struts (ver la secci�n View / Tags). Ejemplo:
- Declarar el ActionForm en struts-config.xml agregando en /struts-config/form-beans el tag <form-bean name="nombreForm" type="paquete.clase"/> y en la declaraci�n del Action (ver la secci�n Controller / Action Beans) agregar los atributos name="nombreForm", scope="(request � session)", e input="paginaForm.jsp". Ejemplo:
... <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> ... <html:html> ... <html:form action="/logon" focus="username"> ... <h1><bean:message key="logon.header"/></h1> <html:form action="/logon" focus="username"> <h5><html:errors/></h5> <h3><bean:message key="logon.mainText"/></h3> <p><bean:message key="logon.username"/> <html:text property="username" size="16" maxlength="16"/></p> <p><bean:message key="logon.password"/> <html:password property="password" size="16" maxlength="16" redisplay=false/></p> <p><html:submit property="submit" value="Submit"/></p> <p><html:reset/></p> ... </html:form> ... </html:html>
<struts-config> ... <form-beans> ... <form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/> ... </form-beans> ... <action-mappings> ... <action path="/logon" type="com.empresa.aplicacion.LogonAction" name="logonForm" scope="request" input="/logon.jsp"> ... </action> ... <action-mappings> ... </struts-config>
�Tags
B�sicamente, un Tag de JSP consiste en un Tag con formato <prefijoTagLib:nombreTag atributo=valor ... > que cuando la JSP se compila es sustitu�do por una llamada a la clase TagHandler que se encarga de resolver su funcionalidad.
El TagHandler extiende BodyTagSupport o TagSupport (seg�n si es un tag que tiene body), que implementa su funcionalidad en los m�todos doStartTag(), doEndTag(),doInitBody(), doAfterBody() (los dos �ltimos s�lo en las que extienden BodyTagSupport), adem�s de los getters y setters correspondientes a sus atributos. Esta clase se define en un Tag Library Definition (archivo xml con extensi�n TLD donde se define el nombre del tag, la clase TagHandler que lo atiende, la definici�n de sus atributos, si tiene body, etc.) que a su vez se debe declarar en el web.xml (dentro de <web-app> se pone <taglib> <taglib-uri> nombreTagLib </taglib-uri> <taglib-location>/directorios/nombreArchivo.tld </taglib-location> </taglib>) y en la JSP donde se utilizar� (<%@ taglib uri="nobreTagLib" prefix="prefijoTagLib" %>). Finalmente, el Tag que se usa en la JSP consiste en <prefijoTagLib:nombreTag atributo=valor ... >. Para m�s info, ver la p�gina oficial de Sun sobre TagLibraries en http://java.sun.com/products/jsp/taglibraries.html.
La funcionalidad de los Tags inclu�dos en Struts se encuentran documentados en:
- html: http://jakarta.apache.org/struts/struts-html.html
- bean: http://jakarta.apache.org/struts/struts-bean.html
- logic: http://jakarta.apache.org/struts/struts-logic.html
- nested: http://jakarta.apache.org/struts/struts-nested.html
Las clases TagHandlers que implementan dicha funcionalidad est�n documentadas en:
- html: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/html/package-summary.html
- bean: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/bean/package-summary.html
- logic: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/logic/package-summary.html
- nested: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/nested/package-summary.html