0% encontró este documento útil (0 votos)
22 vistas75 páginas

Tutorial de JSTL y Struts en JSP

Este documento proporciona una introducción a JSTL y Struts. Explica que JSTL es una librería estándar de tags para JSP que permite iterar sobre colecciones, formatear fechas y números, entre otras funciones. También presenta Struts como un framework MVC para aplicaciones web Java que implementa el patrón Front Controller y proporciona una librería de tags JSP. Finalmente, muestra un ejemplo demostrativo de una aplicación construida con Struts.

Cargado por

lordpakixu
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
22 vistas75 páginas

Tutorial de JSTL y Struts en JSP

Este documento proporciona una introducción a JSTL y Struts. Explica que JSTL es una librería estándar de tags para JSP que permite iterar sobre colecciones, formatear fechas y números, entre otras funciones. También presenta Struts como un framework MVC para aplicaciones web Java que implementa el patrón Front Controller y proporciona una librería de tags JSP. Finalmente, muestra un ejemplo demostrativo de una aplicación construida con Struts.

Cargado por

lordpakixu
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

4.

4 Tutorial de JSTL y Jakarta Struts

Qu es JSTL ?
n

Existen numerosas libreras de tags JSP que permiten


n n

n n n n

Iterar sobre colecciones Imprimir valores de propiedades de JavaBeans de forma segura Internacionalizacin de mensajes, nmeros, fechas, etc. Generacin de URLs aplicando URL rewriting Acceso a documentos XML Etc.

Recientemente, se ha estandarizado JSTL (JSP Standard Tag Library)


n

Librera de tags estndar y lenguaje de expresiones

Tags en JSTL (1)


n

Core
n n

Control de flujo Soporte para URLs Soporte para internacionalizacin: establecimiento del Locale, generacin de mensajes, formateo de nmeros, cantidades monetarias, fechas, etc. Parsing de un documento XML Flujo de control para recorrer un documento XML (alternativa a XSL para casos sencillos) Tags para lanzar transformaciones XSL

I18n (internacionalizacin)
n

XML
n n

Tags en JSTL (y 2)
n

Acceso a BDs
n n

Permiten lanzar sentencias SQL a BDs relacionales Slo deberan usarse para prototipado rpido o aplicaciones muy simples

En este apartado y en los dos siguientes se ilustran parte de los tags de los grupos Core e I18n Existen dos versiones de la librera de tags (twin libraries)
n n

JSTL-RT: no soporta el lenguaje de expresiones JSTL-EL: soporta el lenguaje de expresiones


n

Es la que usaremos

Lenguaje de expresiones en JSTL (1)


n

Actualmente en JSP si se desea dar valor a un atributo de un tag, es preciso usar una expresin <%= ... %>
n

Ejemplo

<jsp:useBean id="shoppingCart" scope="session" class="[Link]"/> <xxx:if test="<%= [Link]() > 0 %>"> ... </xxx:if> n

JSTL proporciona un lenguaje de expresiones para facilitar su construccin


n

Ejemplo

<xxx:if test="${[Link] > 0}"> ... </xxx:if> n

JSP 2.0 incluir este lenguaje de expresiones


n

Estar disponible para cualquier librera de tags

Lenguaje de expresiones en JSTL (2)


n

Expresiones y literales
n n

Las expresiones tienen que ir rodeadas por ${ y }. Cualquier valor que no empiece por ${, se considera un literal
n

Los literales que incluyen el smbolo ${, han de escaparlo rodendolo de ${' y '} Ejemplo:

<xxx:aTag att="This literal includes ${'${'} character"/> n

Acceso a atributos de objetos Java en expresiones


n

Se puede acceder a las propiedades de un JavaBean, y a objetos de un Map, List o vector

Lenguaje de expresiones en JSTL (3)


n

Acceso a atributos de objetos Java en expresiones (cont)


n

Ejemplos
n n n

${[Link]} = [Link]() ${[Link]} = [Link]().getCity() ${[Link]["shipping"]} = [Link]().get("shipping") ${[Link][0]} = [Link]().get(0)

Unifica el tratamiento de los operadores . y []


n

${[Link]} es

equivalente a ${user["firstName"]} ${[Link]["shipping"]} es equivalente a


${[Link]}

Para determinados casos, es preciso usar el operador []


n

${[Link]["[Link]"]} es equivalente [Link]().get("[Link]")

a a

${[Link][[Link]]} es equivalente [Link]().get([Link]())

Lenguaje de expresiones en JSTL (4)


n

Objetos implcitos
n

Entre otros
n n n n n

pageScope (Map) requestScope (Map) sessionScope (Map) applicationScope (Map) param (Map que mapea nombres de parmetros univaluados a String) paramValues (Map que mapea nombres de parmetros multivaluados a String[])

Cuando se usa un objeto sin especificar su mbito (el objeto implcito en el que est contenido), se busca en los mbitos page, request, session y application (en este orden)
n

Ejemplo

<xxx:if test="${[Link] > 0}"> ... </xxx:if>

Lenguaje de expresiones en JSTL (y 5)


n

Literales
n n n n

Boolean (true y false) Numricos Cadenas de caracteres (entre comillas simples o dobles) null Aritmticos: +,-, *, /, div, %, mod Lgicos: &&, and, ||, or, !, not Relacionales: ==, eq, !=, ne, <, lt, >, gt, <=, le, >=, ge empty: permite comprobar si un valor es null Ejemplos
<c:if test="${!empty [Link]}"> ... </c:if> <c:if test="${[Link] > 0}"> ... </c:if>

Operadores
n n n n n

Se pueden usar parntesis

Qu es Struts ?
n

Framework OpenSource para implementar aplicaciones web con servlets y JSP segn el patrn arquitectnico Model-View-Controller Subproyecto de Jakarta
n

Autor principal: Craig R. McClanahan

Funciona sobre cualquier servidor de aplicaciones web que implemente las APIs de servlets y JSP Ha ganado gran relevancia en el mundo de las aplicaciones web Java
n n n

Versin 1.0 estable en Julio 2001 Posteriormente, surgieron muchos otros framework MVC Actualmente se est estandarizando JavaServer Faces ([Link] que formar parte de J2EE
n

Struts 1.2 estar parcialmente integrado con JSTL y JavaServer Faces, y la integracin ser completa en Struts 2.0

Qu proporciona Struts ?
n n

Un servlet Front Controller y clases relacionadas Una librera de tags JSP muy completa

El patrn Front Controller en Struts (1)


[Link]

[Link]
0..n

[Link] + execute

# doGet # doPost <<use>> <<instantiate>>

[Link] + reset + validate Action1 ActionN

...
ActionFormN

ActionForm1

...

<<use>>

El patrn Front Controller en Struts (2)


n

ActionServlet
n n

Servlet Front Controller En [Link] se especifica que todas las URLs que impliquen procesamiento (por GET o POST) vayan a este servlet
n

Ej.: las URLs que termine en .do

Clases ActionForm
n

Si el programador lo desea, puede acceder a los parmetros de la request a travs de un JavaBean que extiende ActionForm
n

Especialmente til en formularios

Clase Action => mtodo execute


n

Accede a los parmetros de la request, directamente o va el ActionForm correspondiente Realiza la operacin invocando un mtodo de un Session Facade del modelo o una fachada del controlador Deja el resultado devuelto por el mtodo en la request o en la sesin Devuelve un objeto ActionForward, que representa la URL que hay que visualizar a continuacin (sendRedirect o forward)

El patrn Front Controller en Struts (3)


n

Fichero de configuracin
n

Clases ActionForm que usa nuestra aplicacin


n n

Nombre lgico (ej.: loginForm) Nombre completo de la clase (ej.: [Link] .[Link]) URL de tipo path relativo a contexto (ej.: /Login)
n

URLs que implican procesamiento


n

No llevan el .do final

Nombre completo de la clase Action (ej.: [Link] .[Link]) Nombre lgico de la clase ActionForm asociada

El patrn Front Controller en Struts (y 4)


n

Fichero de configuracin (cont)


n

Definiciones de nombres lgicos de URLs


n

n n

Nombre que usan las acciones cuando devuelven un ActionForward (ej.: ShowMainPage) sendRedirect o forward URL a invocar (ej.: /[Link])

Cuando el servlet ActionServlet arranca (init), lee el fichero de configuracin Crea una nica instancia de cada clase Action
n

n n

No se crea una instancia de una clase Action por cada peticin que se recibe Tienen que ser thread-safe Misma situacin que cuando se trabaja con servlets

La librera de tags de Struts (1)


n

Bean
n

n n

Imprimir el valor de las propiedades de JavaBeans de manera segura Soporte para internacionalizacin de mensajes No los usaremos, dado que JSTL ofrece una alternativa estndar Generacin de HTML bsico
n n

HTML
n

Campos de entrada en formularios Enlaces (con URL rewriting)

Logic
n n

Control de flujo No los usaremos, dado que JSTL ofrece una alternativa estndar

La librera de tags de Struts (y 2)


n

Template
n

Caso particular del patrn Composite View (plantillas de pginas JSP) Lo veremos con MiniBank y MiniPortal Una versin mejorada de Template Se incorpor en la versin 1.1

Tiles
n n

Arquitectura MVC con Struts


n

Modelo
n

Clases independientes de la vista y el controlador Conjunto de clases Action Interactan con el modelo y seleccionan la siguiente vista (dejndole los datos en uno de los cuatro posibles mbitos, normalmente request o session) Conjunto de clases ActionForm Conjunto de pginas JSP
n n n

Controlador
n n

Vista
n n

No contienen cdigo Java Slo visualizan datos Usan acciones JSP para recuperar los valores a mostrar y formatearlos

Demo Portal-3 (1)


Lanzar el navegador

Acceder a Portal-3 main page

Demo Portal-3 (2)


Clic Login

Demo Portal-3 (y 3)

Clic en Logout Terminar y lanzar el navegador dos das ms tarde

Acceder a Portal-3 main page

Portal-3 main page (Welcome to Portal-3)

Estructura de paquetes
[Link] [Link].portal3 http controller actions view actionforms messages model userfacade delegate exceptions

jar tvf [Link] (1)


[Link] [Link] [Link] [Link] WEB-INF/Struts/[Link] WEB-INF/Struts/[Link] WEB-INF/StdTagLibs/[Link] WEB-INF/StdTagLibs/[Link] WEB-INF/lib/[Link] WEB-INF/lib/[Link] WEB-INF/lib/[Link] WEB-INF/lib/[Link] WEB-INF/lib/[Link] WEB-INF/lib/commons-*.jar WEB-INF/lib/[Link] WEB-INF/lib/[Link]

jar tvf [Link] (y 2)


WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/model/ userfacade/delegate/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/model/ userfacade/exceptions/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/ controller/actions/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/ controller/actions/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/ controller/actions/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/ controller/actions/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/view/ actionforms/[Link] WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/view/ messages/[Link] WEB-INF/[Link]

Comentarios
n

WEB-INF/Struts
n

Ficheros *.tld: descriptores de las libreras de las acciones proporcionadas por Struts [Link]: configuracin de Struts para la aplicacin del tutorial Ficheros *.tld: descriptores de las libreras de las acciones proporcionadas por JSTL

WEB-INF/StdTagLibs
n

WEB-INF/lib
[Link], commons-*.jar: Struts n [Link], [Link], [Link], [Link]: Jakarta Standard TagLibs (implementacin OpenSource de JSTL) n [Link] y [Link]: subsistema Util de J2EEExamples WEB-INF/classes/es/.../[Link]
n n

Internacionalizacin de mensajes

WEB-INF/[Link] (1)
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN "[Link] <web-app> <distributable/> <!-- =============== Standard TagLibs configuration ============= --> <context-param> <param-name>[Link]. localizationContext</param-name> <param-value>[Link]. [Link]</param-value> </context-param>

WEB-INF/[Link] (2)
<!-- ================ Front controller configuration ============ --> <servlet> <servlet-name>action</servlet-name> <servlet-class>[Link] </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/Struts/[Link]</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>

WEB-INF/[Link] (3)
<!-- =================== Servlet mapping ======================== --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- ========================= Session ========================== --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- ======================= Welcome page ======================= --> <welcome-file-list> <welcome-file>[Link]</welcome-file> </welcome-file-list>

WEB-INF/[Link] (y 4)
<!-- ================= Standard TagLibs descriptors ============ --> <taglib> <taglib-uri>[Link] <taglib-location>/WEB-INF/StdTagLibs/[Link]</taglib-location> </taglib> <taglib> <taglib-uri>[Link] <taglib-location>/WEB-INF/StdTagLibs/[Link]</taglib-location> </taglib> <!-- =============== Struts Tag Library descriptors ============= --> <taglib> <taglib-uri>/[Link]</taglib-uri> <taglib-location>/WEB-INF/Struts/[Link]</taglib-location> </taglib> </web-app>

Comentarios (1)
n

context-param
n

Permite definir un parmetro de configuracin global a toda la aplicacin web Accesible va [Link]().getServletContext ().getInitParameter() En el ejemplo se utiliza para dar valor al parmetro de configuracin [Link]
n n n

Lo usan los tags de internacionalizacin de mensajes de JSTL Nombre del fichero de mensajes (sin sufijo .properties) Debe estar debajo de WEB-INF/classes y usar un nombre consistente con su ubicacin (como si de una clase se tratase)

Comentarios (2)
n

Servlet [Link]
n

Aparecen dos tags que no hemos usado hasta ahora


n

init-param
n

Permite definir un parmetro de configuracin especfico al servlet y su valor Accesible va [Link]().getInitParameter() Indica que el servlet se debera cargar cuando el servidor arranque la aplicacin web El valor (opcional) indica el orden relativo de carga con respecto a otros servlets (cuanto menor sea el valor, antes se carga)

load-on-startup
n

Comentarios (3)
n

Servlet [Link]
n

Parmetros de inicializacin
n

config
n

Path de tipo relativo a contexto del fichero de configuracin de Struts Nivel de detalle en los mensajes de depuracin durante el parsing de los ficheros de configuracin Nivel de detalle en los mensajes de depuracin de ActionServlet

detail
n

debug
n

Ms informacin en JavaDoc de
[Link]

Comentarios (y 4)
n

Libreras de tags proporcionadas por JSTL y Struts


n

Aparece un tag que no hemos usado hasta ahora, taglib, que contiene los elementos
n

taglib-uri: URI a usar en la directiva taglib de JSP (para importar la librera) taglib-location: path relativo a contexto del fichero .tld (Tag Library Descriptor) de la librera de tags

n n n

[Link]: Tags Core de JSTL [Link]: Tags de internacionalizacin de JSTL [Link]: Tags HTML de Struts

WEB-INF/Struts/[Link] (1)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "[Link] <struts-config> <!-- ============= Form Bean Definitions ========================== --> <form-beans> <form-bean name="loginForm type="[Link]. LoginForm"/> </form-beans>

WEB-INF/Struts/[Link] (2)
<!-- ============ Global Forward Definitions ====================== --> <global-forwards> <forward name="MainPage" path="/[Link]" redirect="true"/> <forward name="InternalError" path="/[Link] redirect="true"/> </global-forwards> <!-- ============ Action Mapping Definitions ====================== --> <action-mappings> <action path="/MainPage" type="[Link]. [Link]"> <forward name="ShowMainPage" path="/[Link]"/> </action> <action path="/Login" type="[Link]. [Link]" name="loginForm" scope="request" input="/[Link]" validate="true"/>

WEB-INF/Struts/[Link] (y 3)
<action path="/Logout" type="[Link]. [Link]"/> <!-- ================================================================= The standard administrative actions available with Struts. These must be either omitted or protected by security in a real application deployment. ================================================================ --> <action path="/admin/addFormBean" type="[Link]"/> ... <!-- ========== Message Resources Definitions ================== --> <message-resources parameter="[Link]. [Link]"/> </action-mappings> </struts-config>

Comentarios (1)
n

Definiciones de nombres lgicos de URLs


n

Se usan en la implementacin de las acciones para devolver un ActionForward y en algunas acciones JSP Se especifican con forward
n

n n n

Atributos documentados en JavaDoc de [Link] name: Nombre lgico path: path relativo a contexto de la URL a la que se invocar redirect: true (sendRedirect) o false (forward)
n

false por defecto

Pueden ser globales (global-forwards) o particulares a una accin (action)

Comentarios (2)
n

action
n

n n

Atributos documentados en JavaDoc de [Link] type: nombre completo de la clase Action path: URL (path relativo a contexto) que provocar la invocacin de la accin
n

Se especifican sin el sufijo .do !

name: nombre del ActionForm (definido por form-bean) que captura los parmetros de la invocacin scope: mbito (request o session) del ActionForm
n

En general, request

n n

input: path relativo a contexto del formulario de entrada validate: true si el Front Controller tiene que llamar al mtodo validate del ActionForm
n

En general, true

Comentarios (y 3)
n

message-resources
n n

Especifica la ubicacin del fichero de mensajes Actualmente Struts no est integrado con JSTL

WEB-INF/classes/es/.../[Link] (1)
[Link]=Login [Link]=Login name not found [Link]=Mandatory field [Link]=Incorrect password [Link]=Please, check if the operation has been performed, \ and retry if necessary [Link]=</b></font> [Link]=<font color="red"><b> [Link]=Internal error

WEB-INF/classes/es/.../[Link] (y 2)
[Link]=Login name [Link]=Password [Link]=Remember my password (cookies must be enabled) [Link]=Portal-3 login form [Link]=Hello [Link]=Login [Link]=Logout [Link]=Portal-3 main page [Link]=Welcome to Portal-3

Comentarios (1)
n

Asocia pares <identificadorMensaje, mensaje>


n n n

Convenios de nombrado para los identificadores de mensajes Ordenados alfabticamente [Link] y [Link] son dos identificadores especiales que entiende la accin html:errors de Struts Mensajes en el lenguaje por defecto del servidor Mensajes en el lenguaje cuyo cdigo ISO es xx Cdigos ISO en [Link]
n n n n

[Link]
n

Messages_xx.properties
n n

en: Ingls es: Espaol gl: Gallego Etc.

Comentarios (y 2)
n

[Link] slo resuelve un aspecto particular de la internacionalizacin de aplicaciones: impresin de mensajes en distintos idiomas
n

En una aplicacin ms compleja puede ser necesario tener trozos de pginas en distintos idiomas (con gran cantidad de texto esttico) y seleccionarlas o incluirlas dinmicamente desde otras en funcin del idioma Formatear y tratar fechas, horas, nmeros, cantidades monetarias
n n

Otros aspectos en internacionalizacin


n

JSTL proporciona tags para ello Tambin paquetes [Link] y [Link]

Puede requerir tablas para almacenar contenido en distintos idiomas


n

Ej.: un servicio de noticias

[Link]

UserFacadeDelegate + UserFacadeDelegate() + login(loginName : String, password : String, passwordIsEncrypted : boolean) : void

Simula la fachada del modelo que proporciona las operaciones relativas a la interaccin del usuario con el portal

[Link]

Action (from action)

DefaultAction

+ execute(actionMapping, actionForm, request, response) : ActionForward


# doExecute(actionMapping, actionForm, request, response) : ActionForward

# doOnInternalError(actionMapping, actionForm, request, response, internalErrorException) : ActionForw...

PropertyValidator

Comentarios
n

DefaultAction
n

Problema
n

En general, las clases Action invocarn una operacin sobre un Business Delegate del modelo o una fachada del controlador, que puede lanzar InternalErrorException Es necesario (1) capturarla, (2) imprimirla en un log (para depuracin) e (3) ir a una pgina que indique error interno Implementa execute (Template Method) en trminos de doExecute y doOnInternalError Las clases hijas implementan doExecute, que tiene la misma signatura que execute, pero puede lanzar adicionalmente InternalErrorException

Las clases Action derivarn de DefaultAction


n

PropertyValidator
n

Clase utilidad para validar campos de entrada comunes (double, long, String, etc.)

[Link] (1)
package [Link]; import import import import import import import import import import import [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link];

import [Link];

[Link] (2)
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { return doExecute(mapping, form, request, response); } catch (InternalErrorException e) { return doOnInternalErrorException(mapping, form, request, response, e); } } protected abstract ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, InternalErrorException;

[Link] (y 3)
protected ActionForward doOnInternalErrorException( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, InternalErrorException internalErrorException) throws IOException, ServletException { /* * Log error, even with debug level <= 0, because it is a * severe error. */ ServletContext servletContext = [Link]().getServletContext(); [Link]([Link](), internalErrorException); /* Redirect to input page. */ return [Link]("InternalError"); } }

[Link] (1)

public final class PropertyValidator { private final static String INCORRECT_VALUE = "[Link]"; private final static String MANDATORY_FIELD = "[Link]"; private PropertyValidator() {} public final static long validateLong(ActionErrors errors, String propertyName, String propertyValue, boolean mandatory, long lowerValidLimit, long upperValidLimit) { long propertyValueAsLong = 0; if (validateMandatory(errors, propertyName, propertyValue, mandatory)) { boolean propertyValueIsCorrect = true;

[Link] (2)
try { propertyValueAsLong = new Long(propertyValue).longValue(); if ( (propertyValueAsLong < lowerValidLimit) || (propertyValueAsLong > upperValidLimit) ) { propertyValueIsCorrect = false; } } catch (NumberFormatException e) { propertyValueIsCorrect = false; } if (!propertyValueIsCorrect) { [Link](propertyName, new ActionError(INCORRECT_VALUE)); } } return propertyValueAsLong; }

[Link] (y 3)
public final static boolean validateMandatory(ActionErrors errors, String propertyName, String propertyValue) { if ((propertyValue == null) || ([Link]() == 0)) { [Link](propertyName, new ActionError(MANDATORY_FIELD)); return false; } else { return true; } } private final static boolean validateMandatory(ActionErrors errors, String propertyName, String propertyValue, boolean mandatory) { if (mandatory) { return validateMandatory(errors, propertyName, propertyValue); } else { return true; } } // Resto de mtodos validateXXX => Anlogos ... }

Comentarios
n

[Link]
n

Permite acceder a los valores configurados en [Link] para la accin en ejecucin (inclusive a los forwards globales) Juega el papel del mapa de errores que hemos empleado en apartados anteriores El mensaje de error es un [Link], que dispone de un constructor que permite especificar el identificador del mensaje de error (en [Link]) Representa la siguiente URL a la que hay que ir El Front Controller lo invocar despus de llamar al mtodo execute sobre la accin

[Link]
n

[Link]
n n

[Link] (1)

public class LoginForm extends ActionForm { private String loginName; private String password; private boolean rememberMyPassword; public LoginForm() { reset(); } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { [Link] = [Link](); }

[Link] (2)

public String getPassword() { return password; } public void setPassword(String password) { [Link] = password; } public boolean getRememberMyPassword() { return rememberMyPassword; } public void setRememberMyPassword(boolean rememberMyPassword) { [Link] = rememberMyPassword; }

[Link] (y 3)
public void reset(ActionMapping mapping, HttpServletRequest request) { reset(); } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); [Link](errors, "loginName", loginName); [Link](errors, "password", password); return errors; } private void reset() { loginName = null; password = null; rememberMyPassword = false; } }

Comentarios
n

LoginForm
n n

Juega el mismo papel que la clase vista en el apartado 4.2 Hereda de [Link] reset
n

Generalmente interesa redefinir reset y validate


n

El Front Controller lo llama antes de dar valor a las propiedades Permite validar las propiedades despus de que el Front Controller les haya dado valores Slo se invoca si se ha especificado validate="true" para la accin correspondiente en [Link] Si devuelve un ActionErrors no vaco, el Front Controller (1) no invocar el mtodo execute sobre la accin correspondiente, (2) insertar un atributo con los errores en la request, y (3) har un forward a la URL que especifica el atributo input del action correspondiente en [Link] (formulario de entrada)

validate
n

[Link]
DefaultAction (from action)

MainPageAction

LoginAction

LogoutAction

<<use>>

<<use>>

<<use>>

LoginManager

<<use>> UserFacadeDelegate (from delegate)

[Link] (1)
public class LoginAction extends DefaultAction { public ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, InternalErrorException { /* Get data. */ LoginForm loginForm = (LoginForm) form; String loginName = [Link](); String password = [Link](); boolean rememberMyPassword = [Link](); /* Do login. */ ActionErrors errors = new ActionErrors();

[Link] (y 2)
try { [Link](request, response, loginName, password, rememberMyPassword); } catch (InstanceNotFoundException e) { [Link]("loginName", new ActionError( "[Link]")); } catch (IncorrectPasswordException e) { [Link]("password", new ActionError( "[Link]")); } /* Return ActionForward. */ if ([Link]()) { return [Link]("MainPage"); } else { saveErrors(request, errors); return new ActionForward([Link]()); } } }

[Link]
public class LogoutAction extends DefaultAction { public ActionForward doExcute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, InternalErrorException { /* Do logout. */ [Link](request, response); /* Return ActionForward. */ return [Link]("MainPage"); } }

Comentarios
n

Las acciones utilizan el mtodo saveErrors (heredado de [Link]) para insertar un atributo con los errores en la request

[Link] (1)
<%@ taglib prefix="c" uri="[Link] %> <%@ taglib prefix="fmt" uri="[Link] %> <%@ taglib prefix="html" uri="/[Link]" %> <html> <head> <title><fmt:message key="[Link]"/></title> </head> <body text="#000000" bgcolor="#ffffff" link="#000ee0" vlink="#551a8b" alink="#000ee0">

[Link] (2)
<%-- Welcome --%> <h1> <c:choose> <c:when test="${empty [Link]}"> <fmt:message key="[Link]"/> </c:when> <c:otherwise> <fmt:message key="[Link]"/> <c:out value="${[Link]}"/> </c:otherwise> </c:choose> </h1> <%-- Some <br>'s --%> <br> <br> <br>

[Link] (y 3)
<%-- Links to Login or Logout --%> <c:choose> <c:when test="${empty [Link]}"> <html:link href="[Link]"> <fmt:message key="[Link]"/> </html:link> </c:when> <c:otherwise> <html:link href="[Link]"> <fmt:message key="[Link]"/> </html:link> </c:otherwise> </c:choose> </body> </html>

[Link] (1)
<%@ taglib prefix="fmt" uri="[Link] %> <%@ taglib prefix="html" uri="/[Link]" %> <html> <head> <title><fmt:message key="[Link]"/></title> </head> <body text="#000000" bgcolor="#ffffff"> <html:form action="[Link]"> <table width="100%" border="0" align="center" cellspacing="12"> <%-- Login name --%> <tr> <th align="right" width="50%"> <fmt:message key="[Link]"/> </th> <td align="left"> <html:text property="loginName" size="16" maxlength="16"/> <html:errors property="loginName"/> </td> </tr>

[Link] (2)
<%-- Password --%> <tr> <th align="right" width="50%"> <fmt:message key="[Link]"/> </th> <td align="left"> <html:password property="password" size="16 maxlength="16"/> <html:errors property="password"/> </td> </tr> <%-- Remember my password --%> <tr> <th align="right" width="50%"> <fmt:message key="[Link]"/> </th> <td align="left"> <html:checkbox property="rememberMyPassword"/> </td> </tr>

[Link] (y 3)
<%-- Login button --%> <tr> <td width="50%"></td> <td align="left" width="50%"> <html:submit> <fmt:message key="[Link]"/> </html:submit> </td> </tr> </table> </html:form> </body> </html>

Comentarios
n

html:text, html:password y html:checkbox recuperan el valor de la propiedad asociada a travs del mtodo getXXX (property="XXX") sobre la instancia de LoginForm enganchada a la request
n

Saben que el ActionForm asociado es de tipo LoginForm, dado que el atributo action de html:form es igual a [Link] [Link] especifica LoginForm como la clase ActionForm para la URL /[Link] Imprime el mensaje de error asociado a la propiedad especificada si figura en el ActionErrors enganchado a la request El mensaje vendr flanqueado por [Link] y [Link] ([Link])

html:errors
n

[Link]
<%@ taglib prefix="fmt" uri="[Link] %> <html> <head> <title><fmt:message key="[Link]"/></title> </head> <body text="#000000" bgcolor="#ffffff"> <h3><div align="center"><font color="red"> <fmt:message key="[Link]"/>. <fmt:message key="[Link]"/> </font></div></h3> </body> </html>

Un pequeo problema
n

Situacin
n

Imaginemos que la pgina de bienvenida fuese [Link]


n

En realidad es [Link]

n n

Un usuario hace el login y selecciona Remember my password Termina la sesin Accede dos das despus tecleando la URL de la aplicacin en su navegador (ej.: [Link] La sesin no contendr el atributo loginName, dado que no se ha ejecutado [Link] Se le redirige a la pgina de login

Una solucin
n

El navegador nunca invocar a /[Link] directamente, sino a /[Link] o /[Link]


n

[Link]
n n

Pgina de bienvenida Hace un forward a /[Link] => se ejecuta MainPageAction [Link] y forward a /[Link]

MainPageAction
n

Cuando se haga un sendRedirect a la pgina principal se har siempre con la URL /[Link] y nunca con /[Link]
n

/[Link] nunca aparecer en la caja de dilogo del navegador, de manera que el usuario nunca har un bookmark a esa pgina, sino a /[Link] o /[Link]

En MiniPortal volveremos a discutir este problema

[Link]
public class MainPageAction extends DefaultAction { public ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, InternalErrorException { /* * "[Link]" creates an appropriate session * if the session had expired, or the user had not logged in, * but he/she had selected "remember my password" in the last * login. */ [Link](request); /* Return ActionForward. */ return [Link]("ShowMainPage"); } }

[Link]
<jsp:forward page="[Link]"/>

Action forms dinmicos y Validator


n

Action forms dinmicos (Struts 1.1)


n n

Se especifican (en XML) en el fichero de configuracin Evitan la necesidad de programar action forms de tipo Java Bean Permite definir reglas de validacin (en XML) de las propiedades de los action forms (sean dinmicos o no), evitando tener que codificar stas en Java

Validator (Struts 1.1)


n

También podría gustarte