Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Strusts
Strusts
Struts
Framework
Contenido
¡ Patrón de diseño MVC
¡ El framework Apache Struts
l Instalación
l Flujo de control en Struts
¡ Procesamiento de peticiones
¡ Control de errores
¡ Manejo de Formularios
1
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Modelos de desarrollo de
aplicaciones web en Java
¡ Los servlets son buenos ejecutando lógica de
negocio, pero no son tan buenos presentando
información
¡ JSPs son muy buenos presentando pero pésimos
introduciendo lógica programática en ellos
¡ La combinación Servlet/JSPs es lo más común hoy en
día en el desarrollo de aplicaciones web
¡ Dos arquitecturas:
l Model-1.5: JSPs para presentación y control y
JavaBeans para la lógica
l Model-2: Model-View-Controller = JavaBeans-JSPs-
Servlets
¡ MVC es tan común que se han desarrollado varias
infraestructuras en torno a este patrón de diseño:
l Apache Struts
l Java Server Faces
2
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Arquitectura Model 2
Modelo MVC
3
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Implementación
MVC en Java
¡ El Controlador (Controller)
l Servlet central recibe peticiones, procesa
URL recibida y delega procesamiento a
JavaBeans
l Servlet guarda resultado de
procesamiento realizado por JavaBeans en
el contexto de la petición, la sesión o la
aplicación
l Servlet transfiere control a un JSP que
lleva a cabo la presentación de resultados
Implementación
MVC en Java
¡ El Modelo (Model)
l JavaBeans (o EJBs para aplicaciones más
escalables) juegan el rol de modelo:
¡ Algunos beans ejecutan lógica
¡ Otros guardan datos
l Normalmente:
1. Servlet controlador invoca un método en
bean lógico y éste devuelve un bean de
datos
2. Autor de JSP tiene acceso a bean de datos
4
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Implementación
MVC en Java
¡ La Vista (View)
l Rol ejecutado por JSPs
l Servlet Controlador transfiere control al
JSP después de haber guardado en un
contexto el resultado en forma de un bean
de datos
l JSP usa jsp:useBean y jsp:getProperty
para recuperar datos y formatear
respuesta en HTML o XML
Implementación
MVC en Java
¡ En resumen:
l Los beans (o EJBs) ejecutan la lógica de
negocio y guardan los resultados
l Los JSPs proveen la información
formateada
l Los servlets coordinan/controlan la
ejecución de los beans y los JSPs
5
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
¿Qué son los Frameworks?
¡ Los frameworks pueden ser vistos como
implementaciones de patrones de
diseño que facilitan la reutilización de
diseño y código
¡ Dado que MVC ha sido utilizado en muchas
aplicaciones web, el desarrollo de
frameworks que den soporte a áreas
comunes en todas las aplicaciones MVC es
necesario
l Apache Struts es una de estas frameworks
¡ Aplicaciones basadas en Struts consistirán
de:
l Código Java
l Deployment descriptors que configuran el
framework para el uso de nuestra aplicación
6
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
¿Qué proporciona Struts?
¡ Un servlet (ActionServlet) que actúa como
controlador MVC totalmente configurable
¡ Clases base que son extendidas para implementar la
lógica de la aplicación web:
l Struts Action
l Struts ActionForm
¡ Un rico conjunto de etiquetas personalizadas JSP que
cooperan con el controlador para su uso en la capa
view de MVC
¡ Varias opciones para la validación de entrada de
usuario en formularios HTML: ActionForm o
Validator Framework
¡ Mecanismos para el manejo y reporte de errores
¡ Soporte para la internacionalización (i18n) a través
de ficheros de recursos y Java Locales
¡ Soporte para fuentes de datos
¡ Y más …..
Documentación y ejemplos de
Struts
¡ En el directorio webapps de la distribución de Struts
1.1 se pueden encontrar varios ficheros .war muy
útiles:
l struts-documentation.war
¡ En el subdirectorio api/index.html se puede
encontrar JavaDoc de Struts API
¡ Si se ejecuta esta aplicación web en
http://localhost:8080/struts-documentation/ se puede
también obtener información detallada sobre el uso de
Struts
l Ejemplos de uso de Struts:
¡ struts-example.war
¡ struts-blank.war à base para la creación de
cualquier aplicación que use Struts
¡ etc.
7
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Flujo de Control en Struts I
8
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Flujo de control en Struts III
¡ La clase org.apache.struts.action.ActionServlet es el eje de
Struts. Dada una petición de entrada HTTP:
l Crea un objeto ActionForm donde guarda y valida los parámetros de
entrada
l Decide que objeto Action se debe invocar y le pasa el objeto
ActionForm creado
l Transfiere control a la siguiente etapa de procesamiento de la petición
(típicamente un JSP).
¡ El fichero de configuración web.xml contiene los url mappings
para enviar las peticiones de llegada al ActionServlet, mientras
que el fichero de configuración de Struts struts-config.xml
contiene los mappings a acciones
¡ Los form beans creados por ActionServlet deben ser
implementados por el programador, extendiendo
org.apache.struts.action.ActionForm.
l El programador deberá definir un conjunto de getters y setter y
sobreescribir los métodos validate() y reset()
¡ Los objetos Action invocados deben ser desarrollados por el
programador y extienden org.apache.struts.action.Action.
Tienen un método execute() o (perform() en Struts 1.0) que
ejecuta la lógica de negocio
¡ La acción devuelve un objeto ActionForward al servlet que
especifica el siguiente paso a ejecutar, normalmente se transfiere
el control a un JSP para que visualice los resultados.
9
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Actions en Struts
¡ Se crea una acción extendiendo la clase
org.apache.struts.action.Action
¡ El ActionServlet ejecuta acciones invocando el
método execute() tu clase Action
l El método execute() contiene código para
manipular el modelo
¡ Dentro del método execute() tienes acceso a:
l Cabeceras y parámetros de peticiones HTTP
l Atributos/beans guardados en los contextos
application/session/request scope
l Struts ActionForm asociados con la acción
(opcional)
l El ActionMapping associado a esta acción
(opcional)
l El objeto httpResponse
¡ El método execute() devuelve un objeto
ActionForward que indica al ActionServlet a
dónde transferir el control a continuación
Form Beans
¡ Un ActionForm es un JavaBean con propiedades que corresponden a
los controles de un formulario HTML. Los parámetros son mapeados
a propiedades del bean.
l Proveen un mecanismo de buffer/validate/convert que necesitamos para
asegurarnos que el usuario introduce los datos esperados
l Actúa como puente entre el navegador y el objeto de negocio
¡ El programador define un form bean extendiendo la clase
org.apache.struts.action.ActionForm (o de forma declarativa
usando org.apache.struts.action.DynaActionForm)
¡ Hay que definir cada una de las propiedades en la clase y escribir los
getters/setters correspondientes, siguiendo las reglas de JavaBeans
¡ Después de escribir el código del form bean, es necesario asociarlo
con una o más acciones a través del fichero de configuración de
Struts struts-config.xml
¡ Cada vez que se llama a la acción , el ActionServlet poblará las
propiedades con los valores de los parámetros recibidos en el
formulario HTML
¡ Las propiedades no sólo pueden ser escalares sino que también
pueden ser colecciones de valores
10
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
¿Por qué se necesitan Forms
Beans?
¡ ¿Por qué no simplemente se accede a los parámetros de
una petición, en vez de usar un form bean como
intermediario?
¡ Razones:
l Los Form beans pueden ser validados antes de que una acción
sea invocada
¡ Si la propiedad validate de un elemento Action en el fichero
struts-config.xml contiene el valor true (por defecto), el
método validate será invocado
l Si un form bean falla en la validación puede hacer que Struts
envíe al usuario de vuelta a la vista (JSP) desde la que se
realizó el POST en primer lugar, junto con un mensaje de
error
¡ Es importante asignar a la propiedad input del elemento
action en struts-config.xml una referencia a la vista que
entregó el formulario
l Los form beans pueden ser usados por múltiples acciones o
incluso una aplicación completa
¡ Si se configura al ActionController para que guarde un form
bean en el contexto de sesión se permitirá el uso del form
bean en todas las peticiones web que llegan a la aplicación
<form-bean name=“checkoutForm”
type=“org.apache.struts.action.DynaActionForm”>
<form-property name=“firstName”
type=“java.lang.String”/>
<form-property name=“lastName”
type=“java.lang.String”/>
<form-property name=“age” type=“java.lang.Integer”
initial=“18”/>
</form-bean>
11
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Recursos de String/Manejo de
Errores
¡ Recursos de String
l Todos los strings usados en mensajes en JSPs tanto de
datos de aplicación como de errores puedes ser colocados
en un ficheros de recursos
(ApplicationResources.properties)
l Struts proporciona etiquetas personalizadas JSP tags para
acceder a estos recursos
<bean:message key="prompt.goodguess.heading"/>
¡ Manejo de errores
l Se recomienda que el manejo de errores se lleve a cabo
dentro del método execute() y el control se transfiera a la
vista apropiada
errors.add("passphrase",new
ActionError("error.passphrase.required"));
l Struts proporciona un mecanismo separado para permitir la
implementación de un manejador global de excepciones
l Struts proporciona etiquetas JSP que ayudan en la
visualización de los errores en tu JSP:
<html:errors property=“passphrase”/>
Internationalization i18n
¡ Struts soporta internacionalización a través de ficheros de recursos,
sus librerías de etiquetas personalizadas y Java Locales
¡ Se pueden definir strings a visualizar en tu fichero de recursos, y
luego ser usados en tus JSPs
¡ Los strings del idioma por defecto se guardan en el fichero
ApplicationResources.properties
¡ Otros ficheros de recursos adicionales pueden ser definidos que
incluyen el idioma a usar en el nombre del fichero.
l Ejemplo:
¡ ApplicationResources_eu.properties (Contiene mensajes en Euskera)
¡ ApplicationResources_es.properties (Contiene mensajes en Castellano)
¡ Para cambiar el idioma preferido en IE: Toolsà Internet
Optionsà Languages
¡ Los navegadores envían la cabecera HTTP Accept-Language en cada
petición que indica cuál es el idioma preferido por el usuario
¡ Los ficheros de recursos deben colocarse en un lugar accesible desde
el CLASSPATH de la aplicación web, por ejemplo, debajo del directorio
WEB-INF/classes
12
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Ejemplo web.xml de aplicación
usando Struts
<web-app>
<!-- Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-
class>
<init-param>
<param-name>application</param-name>
<param-value>
com.develop.ejsp.struts.resources.ApplicationResources
</param-value>
</init-param>
<init-param>
<!– etc. -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <!-- Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
Configurando Struts
¡ Como en todo framework se minimiza el código Java a
escribir y se maximiza la configuración a través de ficheros
XML
l Struts se configura a través struts-config.xml
l Leído por el framework cuando arranca
¡ Contiene:
l Fuentes de datos (data-sources)
l Form beans, variaciones de JavaBeans.
¡ Ejecutan una petición basado en una entrega de un
formulario.
¡ Son poblados por el controlador con los datos del formulario
¡ Llevan a cabo validación de datos
¡ Son procesados por objetos Action
l Global forwards y
l ActionMappings
¡ Mapean el nombre de una acción a un objeto Action
13
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Ejemplo struts-config.xml I
<struts-config>
<data-sources>
<data-source>
<set-property property= "autoCommit" value="false"/>
<set-property property= "description" value="MessageBoard"/>
<set-property property= "driverClass"
value="..SQLServerDriver"/>
<set-property property= "maxCount" value="4"/>
<set-property property= "minCount" value="2"/>
<set-property property="password" value=""/>
<set-property property= "url"value="someurl"/>
<set-property property= "user" value="someuser"/>
</data-source>
</data-sources>
<!-- === Form Bean Definitions === -->
<form-beans>
<form-bean name="SigninForm"
type= "com.develop.ejsp.struts.beans.SigninForm"/>
</form-beans>
<!-- === Global Forward Definitions === -->
<global-forwards>
<forward name="signin" path="/signin.jsp"/>
</global-forwards>
Ejemplo struts-config.xml II
<!-- === Action Mapping Definitions === -->
<action-mappings> <!-- Process a user logon -->
<action path="/SigninAction“
type=
"com.develop.ejsp.struts.actions.SigninAction“
name="SigninForm"
scope="session“
input="/signin.jsp">
<forward name="succeeded" path="/groups.jsp"/>
<forward name="failed" path="/groups.jsp"/>
</action>
<action path="/GotoReplyToAction“
type=
"com.develop.ejsp.struts.actions.GotoMessageAction">
<forward name="succeeded" path="/newmessage.jsp"/>
<forward name="failed" path="/groups.jsp"/>
</action>
</action-mappings>
</struts-config>
14
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Procesamiento de una petición en
Struts I
Procesamiento de petición en
Struts II
public class GotoMessageAction
extends org.apache.struts.action.Action {
15
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Procesamiento de petición en
Struts III
¡ De los cuatro parámetros recibidos en
execute(), ActionMapping y
ActionForm son específicos a Struts
¡ El objeto ActionMapping contiene
información de configuración proveniente
de struts-config.xml file.
¡ El objeto ActionForm contiene el bean del
formulario que fue inicializado por el
ActionServlet al procesar la petición
Procesamiento de petición en
Struts IV
¡ En el mapeo de la acción GotoReplyToAction hay
dos posibles forward definidos:
l Uno con el nombre "succeeded" y otro
l "failed“
¡ Si el método execute() se completa sin errores
el método ActionMapping.findForward() es
llamado, pasando el nombre del siguiente recurso
a llamar.
l El método findForward() devuelve un objeto
ActionForward que es pasado al ActionServlet
l El objeto ActionForward contiene detalles de a
dónde debería el ActionServlet enviar la petición
(contiene el path del JSP que va a visualizar los
resultados)
16
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Manejo de errores en Struts I
¡ Struts define la clase ActionErrors que mantiene una colección
de objetos ActionError.
ActionErrors errors = new ActionErrors();
errors.add (ActionErrors.GLOBAL_ERROR,
new ActionError("error.signing.connect"));
saveErrors(request,errors);
return (new ActionForward
(mapping.findForward(“failed")));
¡ El código añade un sólo objeto ActionError a la colección, pero si
se llevase a cabo validación de los campos de un formulario
varios errores podrían ser mostrados.
¡ Luego devuelve una instancia de ActionForward que redirige a
"failed".
¡ El ActionServlet guardará en el objeto request el objeto
ActionErrors bajo un nombre bien conocido por Struts:
request.setAttribute( Action.ERROR_KEY, errors);
¡ Este objeto ActionErrors es ahora disponible a cualquier página
o acción consecutiva.
¡ La página JSP “failed” anterior debería tener un área donde se
mostrasen los errores producidos.
¡ El string usado para construir un objeto ActionError no es un
mensaje de error sino que un identificador de un recurso (i18n
Struts)
if (!errors.empty()) {
saveErrors(request, errors);
ActionForward af = mapping.findForward("failed");
return af;
}
request.setAttribute(Message.MESSAGE_NAME, message);
ActionForward af = mapping.findForward("succeeded");
return af;
}
}
17
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Manejo de Formularios I
¡ La otra acción definida en el fichero de configuración de
Struts era:
<action path="/SigninAction"
type="com.develop.ejsp.struts. actions.SigninAction"
name="SigninForm" scope="session"
input="/signin.jsp">
<forward name="succeeded" path="/groups.jsp"/>
<forward name="failed" path="/groups.jsp"/>
</action>
¡ Esta acción está asociada con el formulario llamado
SigningForm, también definido en el fichero de
configuración:
<form-beans>
<form-bean name="SigninForm"
type="com.develop.ejsp.struts. beans.SigninForm"/>
</form-beans>
Manejo de Formularios II
¡ Si una acción tiene un formulario asociado
a ella (atributo name en action mapping),
el ActionServlet crea un form bean
¡ Todo form bean hereda de
org.apache.struts.action.ActionForm
, que es un JavaBean serializable.
¡ Dos métodos en ActionForm pueden ser
sobreescritos:
l validate() y
l reset()
18
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Manejo de Formularios III
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((username == null) || (username.length() < 1))
errors.add ("username",
new ActionError("error.username.required"));
if ((password == null) || (password.length() < 1))
errors.add("password",
new ActionError("error.password.required"));
return errors;
}
¡ El FormBean es poblado por el ActionServlet con los
parámetros de la petición de entrada llamando a los métodos
setXXX() correspondientes.
¡ Una vez poblado, el form bean es validado:
l Si el objeto ActionErrors devuelto es null o vacío significa que la
validación tuvo éxito y una instancia del form bean creado, en este
caso SigningForm, es pasado al objeto SigningAction
l Si la validación falla, la petición será re-direccionada por Struts a la
página que contenía el formulario inicialmente el formulario, dada por
el atributo input del elemento action en struts-config.xml
Manejo de Formularios IV
public class SigninForm extends ActionForm {
String userName = null;
String password = null;
public SigninForm() {}
...
19
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Manejo de Formularios V
public ActionErrors validate(ActionMapping actionMapping,
HttpServletRequest
httpServletRequest) {
ActionErrors errors = new ActionErrors();
if ((password == null) || (password.length() < 1))
errors.add("password", new
ActionError("error.password.required"));
if ((userName == null) || (userName.length() < 1))
errors.add("username", new
ActionError("error.username.required"));
return errors;
}
Manejo de Formularios VI
public class SigninAction
extends org.apache.struts.action.Action {
try {
String username = ((SigninForm) form). getUserName();
String password = ((SigninForm) form). getPassword();
// etc.
}
}
}
20
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
DataSources en Struts
try {
DataSource ds =
servlet.findDataSource(null);
message = new Message();
message.getMessage(ds,
request.getParameter(
Message.MESSAGE_ID)),
request.getParameter( GROUP_ID_NAME))
}
¡ El código arriba muestra otra característica de Struts,
la habilidad de configurar y usar referencias a
javax.jdbc.DataSources
¡ El extracto de struts-config.xml anteriormente
mostrado tiene una sección <data-sources> para
configurar las data sources de la aplicación.
¡ Struts provee las clases GenericDataSource y
GenericConnection que son wrappers sobre los
objetos JDBC Connections y DataSources definidos en
el fichero de configuración.
¡ Documentadas en
http://www.onjava.com/lpt/a/4034
¡ La framework Struts proporciona un conjunto de 6
librerías de etiquetas, que asisten en la tarea de la
creación de la vista de MVC para evitar incluir código
Java en los JSPs:
l Bean Tags
l HTML Tags
l Logic Tags
l Nested Tags
l Template Tags
l Tiles Tags
21
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
HTML Tags
¡ Estas etiquetas son principalmente usadas para:
l Crear formularios de entrada de datos y
l Otras utilidades para visualizar interfaces basados
en HTML.
¡ Algunas de las acciones más útiles son:
l base à genera un elemento HTML <base>
l errors à condicionalmente visualiza un conjunto
acumulado de mensajes de error
l form à define un formulario de entrada
l text à visualiza un campo de entrada de tipo texto
l messages à condicionalmente visualiza un conjunto
de mensajes acumulados
l submit à visualiza un botón de entrega
l Etc.
Logic Tags
¡ Usadas para:
l Iterar sobre colecciones
l Generación condicional de salida, y
l Flujo de aplicación
¡ Algunas de las acciones más útiles son:
l present à genera el contenido de marcado
dentro de esta etiqueta si el valor indicado es
encontrado en esta petición
l notPresent à lo opuesto a present
l iterate à repite el contenido anidado dentro
de esta etiqueta al iterar sobre una colección
l forward à transfiere control a la página
especificada por la entrada ActionForward.
l Etc.
22
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Tiles Tags (Framework)
¡ La librería de etiquetas Tiles es un super-conjunto de
la librería Templates
¡ Intenta evitar la duplicación de contenido de lenguaje
de marcado dentro de una aplicación web con
respecto al look-and-feel de un portal:
l Un mecanismo normalmente utilizado es usar la
directiva jsp:include para añadir cabeceras/menús y
pies de páginas a un portal web
¡ Tiles reduce el tamaño de código redundante en una
aplicación web y separa el contenido de la
visualización del mismo de manera más eficiente
l Tiles define Layout Managers para JSPs
¡ Su objetivo principal es evitar en los JSPs contenido
de marcado que corresponda con el look-and-feel del
portal à factoriza este marcado, de tal manera que
la modificación del layout sea sencilla y eficiente
23
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Welcome.html
<HTML>
<HEAD>
<TITLE>Welcome World!!</TITLE>
<base
href="http://localhost:8080/logon/pages/Welcome.js
p">
</HEAD>
<BODY>
<H3>Welcome World!</H3>
<UL>
<LI><a href="/logon/logon.do">Sign in</a></LI>
</UL>
<IMG src='struts-power.gif' alt='Powered by Struts'>
</BODY>
</HTML>
Welcome.jsp I
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<HTML>
<HEAD>
<TITLE>Welcome World!!</TITLE>
<html:base/>
</HEAD>
<BODY>
<logic:present name="user">
<H3>Welcome <bean:write name="user" property="username"/>!</H3>
</logic:present>
<logic:notPresent scope="session" name="user">
<H3>Welcome World!</H3>
</logic:notPresent>
<html:errors/>
<UL>
<LI><html:link forward="logon">Sign in</html:link></LI>
<logic:present name="user">
<LI><html:link forward="logoff">Sign out</html:link></LI>
</logic:present>
</UL>
<IMG src='struts-power.gif' alt='Powered by Struts'>
</BODY>
</HTML>
24
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Welcome.jsp II
¡ <html:base/> garantiza que referencias a imágenes o otros
recursos son relativas a la localización del JSP
<logic:present name="user">
<H3>Welcome <bean:write name="user"
property="username"/>!</H3>
</logic:present>
¡ Esta etiqueta personalizada asegura que el usuario solamente
es saludado si ha efectuado login
¡ <logic:notPresent> tiene el comportamiento opuesto
<LI><html:link forward="logon">Sign
in</html:link></LI>
¡ Struts reescribe automáticamente los enlaces para mantener
la sesión del usuario. También permite dar a los enlaces un
nombre lógico y luego guardar los enlaces reales en un
fichero de configuración.
Logon.html
<HTML>
<HEAD>
<TITLE>Sign in, Please!</TITLE>
</HEAD>
<BODY>
<form name="logonForm" method="POST" action="/logon/LogonSubmit.do">
<TABLE border="0" width="100%">
<TR>
<TH align="right">Username:</TH>
<TD align="left"><input type="text" name="username" value=""></TD>
</TR>
<TR>
<TH align="right">Password:</TH>
<TD align="left"><input type="password" name="password" value=""></TD>
</TR>
<TR>
<TD align="right"><input type="submit" name="submit" value="Submit"></TD>
<TD align="left"><input type="reset" name="reset" value="Reset"></TD>
</TR>
</TABLE>
</form>
<script language="JavaScript" type="text/javascript">
<!--
document.forms["logonForm"].elements["username"].focus()
// -->
</script>
</BODY>
</HTML>
25
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Logon.jsp I
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<HTML>
<HEAD>
<TITLE>Sign in, Please!</TITLE>
</HEAD>
<BODY>
<html:errors/>
<html:form action="/LogonSubmit" focus="username">
<TABLE border="0" width="100%">
<TR>
<TH align="right">Username:</TH>
<TD align="left"><html:text property="username"/></TD>
</TR>
<TR>
<TH align="right">Password:</TH>
<TD align="left"><html:password property="password"/></TD>
</TR>
<TR>
<TD align="right"><html:submit/></TD>
<TD align="left"><html:reset/></TD>
</TR>
</TABLE>
</html:form>
</BODY>
</HTML>
Logon.jsp II
<%@ taglib uri="/tags/struts-html"
prefix="html"%>
¡ La librería de etiquetas html definida por Struts es
disponible a la página
¡ <html:errors/> garantiza si ha habido algún
error durante el login, que estos errores sean
visualizados
<html:form action="/LogonSubmit"
focus="username">
¡ Produce un formulario HTML para la entrada de
datos. También genera JavaScript para mover el
cursor al campo username del formulario
l La propiedad action hace referencia a un
componente ActionMapping en el fichero de
configuración de Struts à dice al formulario que
JavaBean (derivado de ActionForm) debe usar para
poblar los controles de HTML.
26
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Logon.jsp III
<html:text property="username"/>
¡ Crea un control de entrada HTML para un
campo de texto. Asignará a este campo la
propiedad username del JavaBean de
ayuda antes mencionado.
¡ <html:password> crea un campo de
entrada
¡ <html:submit> y <html:reset> generan
botones HTML Submit y Reset. Dos
objetos serán invocados cuando se usen
estos botones:
l ActionForm
l Action
27
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
Configuración de la acción logon II
<html:form action="/LogonSubmit" focus="username">
¡ La configuración asociada al atributo acción en Struts sería:
<action path="/LogonSubmit"
type="app.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/pages/Logon.jsp"/>
¡ path à identicador único para el mapping
¡ type à acción a invocar cuando el formulario es entregado
¡ name à el helper JavaBean (ActionForm) a usarse con el
formulario HTML
¡ scope à indica en qué contexto debe guardarse el ActionForm
¡ validate à indica si es necesario invocar al método validate
del ActionForm antes de invocar al objeto Action
¡ input à indica a donde ir si validate devuelve falso
<form-bean name="logonForm"
type="app.LogonForm"/>
¡ Este extracto del fichero de configuración relaciona el nombre
lógico logonForm con la clase app.LogonForm
LogonForm: un ejemplo de un
ActionForm
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((username == null) || (username.length() < 1))
errors.add ("username",
new ActionError("error.username.required"));
if ((password == null) || (password.length() < 1))
errors.add("password",
new ActionError("error.password.required"));
return errors;
}
¡ Si validate no devuelve null, entonces el ActionController
servlet guardará el objeto ActionErrors devuelto en el contexto
request, bajo una clave conocida por la etiqueta html:errors
¡ Los tokens error.username.required y
error.password.required son claves que son utilizadas para
mirar los strings correspondientes en el fichero de recursos de
Struts
l Recordar que cada Locale contiene su propio fichero de recursos lo que
hace que los mensajes sean fácilmente localizables.
28
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
LogonAction: un ejemplo de un
LogonAction I
package app;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
LogonAction: un ejemplo de un
LogonAction II
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// Obtain username and password from web tier
String username = ((LogonForm) form).getUsername();
String password = ((LogonForm) form).getPassword();
// Validate credentials
boolean validated = false;
try {
validated = isUserLogon(username,password);
} catch (UserDirectoryException ude) {
// couldn't connect to user directory
ActionErrors errors = new ActionErrors();
errors.add (ActionErrors.GLOBAL_ERROR, new ActionError("error.logon.connect"));
saveErrors(request,errors);
// return to input page
return (new ActionForward (mapping.getInput()));
}
// Save our logged-in user in the session, because we use it again later.
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, form);
// Log this event, if appropriate
if (servlet.getDebug() >= Constants.DEBUG) {
StringBuffer message = new StringBuffer("LogonAction: User '");
message.append(username);
message.append("' logged on in session ");
message.append(session.getId());
servlet.log(message.toString);
}
// Return success
return (mapping.findForward (Constants.WELCOME));
} // end perform
} // end LogonAction
29
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
LogonAction: un ejemplo de un
LogonAction III
// Validate credentials
boolean validated = false;
try {
validated = isUserLogon(username,password);
} catch (UserDirectoryException ude) {
// couldn't connect to user directory
ActionErrors errors = new ActionErrors();
errors.add (ActionErrors.GLOBAL_ERROR,
new ActionError("error.logon.connect"));
saveErrors(request,errors);
// return to input page
return (new ActionForward(mapping.getInput()));
}
¡ Si un error es encontrado mientras se lleva a cabo la validación de la
entrada del usuario y una excepción es lanzada, entonces el error es
transformado en un ActionError y el control es devuelto a la página de
entrada. Lo mismo se lleva a cabo si se puede contactar al servicio de
directorio pero el login del usuario no es correcto
return (mapping.findForward (Constants.WELCOME));
¡ Un objeto de tipo ActionForward será devuelto al ActionServlet si todo va
bien. En este caso se envía control al forward success declarado en el
fichero de configuración como:
<forward name=“success”
path=“/pages/Welcome.jsp”/>
Referencias
¡ URLs
l http://jakarta.apache.org/Struts
l http://theserverside.com
l http://paginaspersonales.deusto.es/dipina/
Página de Diego López de Ipiña.
¡ Libros
l Programming Jakarta Struts de O’Reilly
l Mastering Tomcat Development de WILEY
l Java Server Programming J2EE Edition de
Wrox
30
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com