4.4 tutorial de jsp 2.0, jstl y apache strutsfbellas/teaching/is-2006-2007/tema4apart... · unifica...
TRANSCRIPT
![Page 1: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/1.jpg)
4.4 Tutorial de JSP 2.0, JSTL y Apache Struts
![Page 2: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/2.jpg)
JSP 2.0 (1)
¿Qué añade JSP 2.0 frente a JSP 1.x?Lenguaje de expresiones
Anteriormente sólo estaba disponible en JSTL
“Documentos JSP”Páginas JSP en sintaxis XMLJSP 1.2 también permitía escribir documentos JSP, pero de una manera más incómoda
Implementar tags a medida utilizando la propia tecnología JSP
Se implementan en páginas JSPMás sencillo que el API de extensión de tags(javax.servlet.jsp.tagext), pero menos potenteÚtil para tags orientados a presentación, para tags que hagan uso de librerías existentes y para desarrolladores de páginas JSP que no dispongan de conocimientos de Java
![Page 3: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/3.jpg)
JSP 2.0 (y 2)
Compatibilidad con JSP 1.xUn contenedor de JSP 2.0 tiene que poder ejecutar aplicaciones con sintaxis JSP 1.xEs posible migrar una aplicación JSP 1.x a sintaxis JSP 2.0 página a página
En este apartado, y en los dos siguientes, se ilustran la sintaxis de los documentos JSP y el lenguaje de expresiones
![Page 4: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/4.jpg)
Lenguaje de expresiones (1)
En JSP 1.x si se desea dar valor a un atributo de un tag, es preciso usar una expresión <%= ... %>
Ejemplo<jsp:useBean id="shoppingCart" scope="session"
class="org.acme.ShoppingCart"/><xxx:if test="<%= shoppingCart.getNumberOfProducts() > 0 %>">
...</xxx:if>
JSP 2.0 proporciona un lenguaje de expresiones para facilitar su construcción
Ejemplo<xxx:if test="${sessionScope.shoppingCart.numberOfProducts > 0}">
...</xxx:if>
![Page 5: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/5.jpg)
Lenguaje de expresiones (2)
Expresiones y literalesLas expresiones tienen que ir rodeadas por ${ y }.Cualquier valor que no empiece por ${, se considera un literal
Los literales que incluyen el símbolo ${, han de escaparlo rodeándolo de ${' y '}Ejemplo:
<xxx:aTag att="This literal includes ${'${'} character"/>
Acceso a atributos de objetos Java en expresionesSe puede acceder a las propiedades de un JavaBean, y a objetos de un Map, List o vector
![Page 6: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/6.jpg)
Lenguaje de expresiones (3)
Acceso a atributos de objetos Java en expresiones (cont)
Ejemplos${user.firstName} = user.getFirstName()${user.address.city} = user.getAddress().getCity()${user.preferencesMap["shipping"]} = user.getPreferencesMap().get("shipping")${user.preferencesList[0]} = user.getPreferencesList().get(0)
Unifica el tratamiento de los operadores . y []${user.firstName} es equivalente a ${user["firstName"]}
${user.preferencesMap["shipping"]} es equivalente a ${user.preferencesMap.shipping}
Para determinados casos, es preciso usar el operador []${user.preferencesMap["book.fiction"]} es equivalente a user.getPreferencesMap().get("book.fiction")
${user.preferencesMap[product.category]} es equivalente a user.getPreferencesMap().get(product.getCategory())
![Page 7: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/7.jpg)
Lenguaje de expresiones (4)
Objetos implícitosEntre otros
pageScope (Map)requestScope (Map)sessionScope (Map)applicationScope (Map)param (Map que mapea nombres de parámetros univaluados a String)paramValues (Map que mapea nombres de parámetros multivaluados a String[])
Cuando se usa un objeto sin especificar su ámbito (el objeto implícito en el que está contenido), se busca en los ámbitos page, request, session y application (en este orden)
Ejemplo<xxx:if test="${shoppingCart.numberOfProducts > 0}">
...</xxx:if>
![Page 8: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/8.jpg)
Lenguaje de expresiones (y 5)
LiteralesBoolean (true y false)NuméricosCadenas de caracteres (entre comillas simples o dobles)null
OperadoresAritméticos: +,-, *, /, div, %, modLógicos: &&, and, ||, or, !, notRelacionales: ==, eq, !=, ne, <, lt, >, gt, <=, le, >=, geempty: permite comprobar si un valor es nullEjemplos<xxx:if test="${!empty requestScope.previous}">
...</xxx:if><xxx:if test="${sessionScope.shoppingCart.numberOfProducts > 0}">
...</xxx:if>
Se pueden usar paréntesis
![Page 9: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/9.jpg)
JSTL (1)
En el pasado existían numerosas librerías de tags JSP que permitían
Iterar sobre coleccionesImprimir valores de propiedades de JavaBeans de forma seguraInternacionalización de mensajes, números, fechas, etc.Generación de URLs aplicando URL rewritingAcceso a documentos XMLEtc
Por ello, se decidió estandarizar una librería general de tags, llamada JSTL (JSP Standard Tag Library)
![Page 10: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/10.jpg)
JSTL (2)
Tags en JSTLCore
Control de flujoSoporte para URLs
I18n (internacionalización)Soporte para internacionalización: establecimiento del Locale, generación de mensajes, formateo de números, cantidades monetarias, fechas, etc.
XMLParsing de un documento XMLFlujo de control para recorrer un documento XML (alternativa a XSL para casos sencillos)Tags para lanzar transformaciones XSL
![Page 11: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/11.jpg)
JSTL (y 3)
Tags en JSTL (cont)Acceso a BDs
Permiten lanzar sentencias SQL a BDs relacionalesSólo deberían usarse para prototipado rápido o aplicaciones muy simples
FuncionesJSP 2.0 define un mecanismo para añadir funciones al lenguaje de expresionesJSTL 1.1 define un conjunto de funciones estándar
length (aplicable a Collection y String), toLowerCase, toUpperCase, substring, contains, etc
En este apartado y en los dos siguientes se ilustran parte de los tags de los grupos Core e I18n
![Page 12: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/12.jpg)
¿ Qué es Struts ?
Framework OpenSource para implementar aplicaciones web con servlets y JSP según el patrón arquitectónico Model-View-ControllerProyecto de Apache
Autor original: Craig R. McClanahan
Funciona sobre cualquier servidor de aplicaciones web que implemente las APIs de servlets y JSPHa ganado gran relevancia en el mundo de las aplicaciones web Java
Versión 1.0 estable en Julio 2001Posteriormente, surgieron otros framework MVC
![Page 13: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/13.jpg)
¿ Qué proporciona Struts ?
Un framework que da soporte para implementar las capas controlador y vista de una aplicación web
Servlet Front Controller y clases relacionadasSistema de plantillasValidación de parámetrosUna librería de tags JSP muy completa
![Page 14: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/14.jpg)
El patrón Front Controller en Struts (1)
javax.servlet.http.HttpServlet
org.apache.struts.action.Action
+ execute
ActionN
0..n
Action1...
org.apache.struts.action.ActionServlet
# doGet# doPost
org.apache.struts.action.ActionForm
+ reset+ validate
<<instantiate>>
ActionFormNActionForm1... <<use>>
<<use>>
![Page 15: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/15.jpg)
El patrón Front Controller en Struts (2)
ActionServletServlet Front ControllerEn web.xml se especifica que todas las URLs que impliquen procesamiento (por GET o POST) vayan a este servlet
Ej.: las URLs que termine en .do
Clases ActionFormSi el programador lo desea, puede acceder a los parámetros de la request a través de un JavaBean que extiende ActionForm
Especialmente útil en formulariosClase Action => método execute
Accede a los parámetros de la request, directamente o vía el ActionForm correspondienteRealiza la operación invocando un método de un SessionFacade del modelo o una fachada del controladorDeja el resultado devuelto por el método en la request o en la sesiónDevuelve un objeto ActionForward, que representa la URL que hay que visualizar a continuación (sendRedirect o forward)
![Page 16: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/16.jpg)
El patrón Front Controller en Struts (3)
Fichero de configuraciónClases ActionForm que usa nuestra aplicación
Nombre lógico (ej.: loginForm)Nombre completo de la clase (ej.: es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.actionforms.LoginForm)
URLs que implican procesamientoURL de tipo path relativo a contexto (ej.: /Login)
No llevan el .do final
Nombre completo de la clase Action (ej.: es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.LoginAction)Nombre lógico de la clase ActionForm asociada
![Page 17: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/17.jpg)
El patrón Front Controller en Struts (y 4)
Fichero de configuración (cont)Definiciones de nombres lógicos de URLs
Nombre que usan las acciones cuando devuelven un ActionForward (ej.: ShowMainPage) sendRedirect o forwardURL a invocar (ej.: /MainPage.jsp)
Cuando el servlet ActionServlet arranca (init), lee el fichero de configuraciónCrea una única instancia de cada clase Action
No se crea una instancia de una clase Action por cada petición que se recibeTienen que ser thread-safeMisma situación que cuando se trabaja con servlets
![Page 18: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/18.jpg)
La librería de tags de Struts (1)
BeanImprimir el valor de las propiedades de JavaBeans de manera seguraSoporte para internacionalización de mensajesNo los usaremos, dado que JSTL ofrece una alternativa estándar
LogicControl de flujoNo los usaremos, dado que JSTL ofrece una alternativa estándar
HTMLGeneración de HTML básico
Campos de entrada en formulariosEnlaces (con URL rewriting)
![Page 19: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/19.jpg)
La librería de tags de Struts (y 2)
TilesCaso particular del patrón Composite View
Sistema de plantillas para páginas JSP
Reemplaza a TemplateEl sistema de plantillas que se usaba con Struts 1.0
![Page 20: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/20.jpg)
Arquitectura MVC con Struts
ModeloClases independientes de la vista y el controlador
ControladorConjunto de clases ActionInteractúan con el modelo y seleccionan la siguiente vista (dejándole los datos en uno de los cuatro posibles ámbitos, normalmente request o session)
VistaConjunto de clases ActionFormConjunto de páginas JSP
No contienen código JavaSólo visualizan datosUsan acciones JSP para recuperar los valores a mostrar y formatearlos
![Page 21: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/21.jpg)
Demo Portal-3 (1)
Lanzar el navegador
Acceder a Portal-3 main page
![Page 22: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/22.jpg)
Demo Portal-3 (2)
Clic en Login
Clic en el botón “Login”
![Page 23: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/23.jpg)
Demo Portal-3 (3)
Portal-3 main page(Welcome to Portal-3)
Clic en LogoutTerminar y lanzar el navegador dos días más tarde
Acceder a Portal-3 main page
![Page 24: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/24.jpg)
Demo Portal-3 (4)
Este ejemplo, al igual que los siguientes, usa XHTML 1.0 Estricto y CSS 2.0XHTML
Versión XML de HTML (ej.: todos los tags tienen que cerrarse, los valores de los atributos tienen que entrecomillarse, tags en minúsculas, etc)
CSSEl XHTML generado sólo contiene contenido estructuradoEl formato (fuentes, colores, posicionamiento, etc) se especifica en una hoja (fichero) de estilos CSSEl aspecto gráfico de la aplicación puede cambiarse modificando la hoja CSS
![Page 25: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/25.jpg)
Demo Portal-3 (y 5)
CSS (cont)También puede ser interesante tener un conjunto de hojas CSS con distintos formatos para una misma aplicación web
Visualización en ordenador de sobremesaVisualización en PDA (ej.: no muestra o resume cabecera, sidebar y pié de página)“Printer-friendly pages”Etc
Se procura huir del uso de tablas, excepto para la presentación de datos que siempre han de visualizarse de manera tabular (ej.: las cuentas de un usuario en una aplicación bancaria)
CSS tiene sus propios mecanismos de posicionamiento
![Page 26: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/26.jpg)
Estructura de paqueteses.udc.fbellas.j2ee.util.struts.action
es.udc.fbellas.j2ee.strutstutorial.portal3
http
controller
actions
model
userfacade
delegate
exceptions
view
actionforms
messages
![Page 27: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/27.jpg)
jar tvf StrutsTutorial.war (1)
Index.jspxInternalError.jspxLogin.jspxMainPage.jspxcss/styles.cssWEB-INF/Struts/struts-config.xmlWEB-INF/lib/jstl.jarWEB-INF/lib/standard.jarWEB-INF/lib/antlr.jarWEB-INF/lib/commons-*.jarWEB-INF/lib/jakarta-oro.jarWEB-INF/lib/struts.jarWEB-INF/lib/StandardUtil.jarWEB-INF/lib/WebUtil.jar
![Page 28: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/28.jpg)
jar tvf StrutsTutorial.war (y 2)
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/controller/actions/LoginAction.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/controller/actions/LoginManager.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/controller/actions/LogoutAction.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/controller/actions/MainPageAction.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/view/actionforms/LoginForm.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/model/userfacade/delegate/UserFacadeDelegate.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/model/userfacade/exceptions/IncorrectPasswordException.class
WEB-INF/classes/es/udc/fbellas/j2ee/strutstutorial/portal3/http/view/messages/Messages.properties
WEB-INF/web.xml
![Page 29: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/29.jpg)
Comentarios (1)
Documentos JSPExisten varios métodos para especificar que una página JSP es un documento JSPQuizás la manera más natural consiste en usar un descriptor de la aplicación web conforme a Servlet 2.4 (como ya hicimos en anteriores apartados) y usar jspx como extensión de las páginas JSP que sean documentos JSP
WEB-INF/Strutsstruts-config.xml: configuración de Struts para la aplicación del tutorial
![Page 30: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/30.jpg)
Comentarios (y 2)
WEB-INF/libstruts.jar, commons-*.jar: Strutsstandard.jar, jstl.jar, jakarta-oro.jar, antlr.jar: Jakarta Standard TagLibs (implementación OpenSource de JSTL)StandardUtil.jar y WebUtil.jar: subsistema Util de J2EE-Examples
WEB-INF/classes/es/.../Messages.properties
Internacionalización de mensajes
![Page 31: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/31.jpg)
WEB-INF/web.xml (1)<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
<distributable/>
<!-- =============== Standard TagLibs configuration ============= -->
<context-param><param-name>javax.servlet.jsp.jstl.fmt.localizationContext
</param-name><param-value>es.udc.fbellas.j2ee.strutstutorial.portal3.http.
view.messages.Messages</param-value></context-param>
![Page 32: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/32.jpg)
WEB-INF/web.xml (2)<!-- ================= Front controller configuration =========== -->
<servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.action.ActionServlet
</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/Struts/struts-config.xml</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>
![Page 33: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/33.jpg)
WEB-INF/web.xml (y 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>Index.jspx</welcome-file>
</welcome-file-list>
</web-app>
![Page 34: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/34.jpg)
Comentarios (1)
context-paramPermite definir un parámetro de configuración global a toda la aplicación webAccesible vía Servlet.getServletConfig().getServletContext().getInitParameter()
En el ejemplo se utiliza para dar valor al parámetro de configuración javax.servlet.jsp.jstl.fmt.localizationContext
Lo usan los tags de internacionalización de mensajes de JSTLNombre del fichero de mensajes (sin sufijo .properties)Debe estar debajo de WEB-INF/classes y usar un nombre consistente con su ubicación (como si de una clase se tratase)
![Page 35: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/35.jpg)
Comentarios (2)
Servlet org.apache.struts.actions.ActionServletAparecen dos tags que no hemos usado hasta ahora
init-paramPermite definir un parámetro de configuración específico al servlet y su valorAccesible vía Servlet.getServletConfig().getInitParameter()
load-on-startupIndica que el servlet se debería cargar cuando el servidor arranque la aplicación webEl valor (opcional) indica el orden relativo de carga con respecto a otros servlets (cuanto menor sea el valor, antes se carga)
![Page 36: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/36.jpg)
Comentarios (y 3)
Servlet org.apache.struts.actions.ActionServletParámetros de inicialización
configPath de tipo relativo a contexto del fichero de configuración de Struts
detailNivel de detalle en los mensajes de depuración durante el parsingde los ficheros de configuración
debugNivel de detalle en los mensajes de depuración de ActionServlet
![Page 37: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/37.jpg)
WEB-INF/Struts/struts-config.xml (1)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<!-- ============ Form Bean Definitions =========================== -->
<form-beans>
<form-bean name="loginForm"type="es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.
actionforms.LoginForm"/>
</form-beans>
![Page 38: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/38.jpg)
WEB-INF/Struts/struts-config.xml (2)<!-- ============ Global Forward Definitions ====================== -->
<global-forwards><forward name="MainPage" path="/MainPage.do" redirect="true"/><forward name="InternalError" path="/InternalError.jspx"
redirect="true"/></global-forwards>
<!-- ============ Action Mapping Definitions ====================== -->
<action-mappings>
<action path="/MainPage"type="es.udc.fbellas.j2ee.strutstutorial.portal3.http.
controller.actions.MainPageAction"><forward name="ShowMainPage" path="/MainPage.jspx"/>
</action>
<action path="/Login"type="es.udc.fbellas.j2ee.strutstutorial.portal3.http.
controller.actions.LoginAction" name="loginForm" scope="request" input="/Login.jspx"validate="true"/>
![Page 39: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/39.jpg)
WEB-INF/Struts/struts-config.xml (y 3)<action path="/Logout"
type="es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.LogoutAction"/>
<!-- ==============================================================The standard administrative actions available with Struts.These must be either omitted or protected by security in a realapplication deployment.
================================================================ -->
<action path="/admin/addFormBean"type="org.apache.struts.actions.AddFormBeanAction"/>
...
</action-mappings>
<!-- ============ Message Resources Definitions =================== -->
<message-resources parameter="es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.messages.Messages"/>
</struts-config>
![Page 40: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/40.jpg)
Comentarios (1)
En el fichero struts-config.xml se usa<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN""http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
El especificador PUBLIC permite especificar un identificador y una URI para la ubicación del DTDEl procesador del documento XML (en este caso, Struts) puede usar el identificador para recuperar un DTD localmente almacenado, y en consecuencia, no usar la URI especificada
struts.jar incluye el DTD
![Page 41: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/41.jpg)
Comentarios (2)
Definiciones de nombres lógicos de URLsSe usan en la implementación de las acciones para devolver un ActionForward y en algunas acciones JSPSe especifican con forward
Atributos documentados en JavaDoc de org.apache.struts.action.ActionForward
name: nombre lógicopath: path relativo a contexto de la URL a la que se invocaráredirect: true (sendRedirect) o false (forward)
false por defecto
Pueden ser globales (global-forwards) o particulares a una acción (action)
![Page 42: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/42.jpg)
Comentarios (3)
actionAtributos documentados en JavaDoc de org.apache.struts.config.ActionConfigtype: nombre completo de la clase Actionpath: URL (path relativo a contexto) que provocará la invocación de la acción
¡ Se especifican sin el sufijo .do !
name: nombre del ActionForm (definido por form-bean) que captura los parámetros de la invocaciónscope: ámbito (request o session) del ActionForm
En general, request
input: path relativo a contexto del formulario de entradavalidate: true si el Front Controller tiene que llamar al método validate del ActionForm
En general, true
![Page 43: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/43.jpg)
Comentarios (y 4)
message-resourcesEspecifica la ubicación del fichero de mensajesActualmente Struts no está integrado con JSTL
![Page 44: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/44.jpg)
WEB-INF/classes/es/.../Messages.properties (1)
Buttons.login=Login
ErrorMessages.loginName.notFound=Login name not foundErrorMessages.mandatoryField=Mandatory fieldErrorMessages.password.incorrect=Incorrect passwordErrorMessages.retry=Please, check if the operation has been performed, \
and retry if necessary
errors.footer=</span>errors.header=<span class="errorMessage">
InternalError.title=Internal error
![Page 45: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/45.jpg)
WEB-INF/classes/es/.../Messages.properties (y 2)
Login.loginName=Login nameLogin.password=PasswordLogin.rememberMyPassword=Remember my password (cookies must be enabled)Login.title=Portal-3 login form
MainPage.hello=HelloMainPage.login=LoginMainPage.logout=LogoutMainPage.title=Portal-3 main pageMainPage.welcome=Welcome to Portal-3
![Page 46: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/46.jpg)
Comentarios (1)Asocia pares <identificadorMensaje, mensaje>
Convenios de nombrado para los identificadores de mensajesOrdenados alfabéticamenteerrors.footer y errors.header son dos identificadores especiales que entiende la acción html:errors de Struts
Messages.propertiesMensajes en el lenguaje por defecto del servidor
Messages_xx.propertiesMensajes en el lenguaje cuyo código ISO es xxCódigos ISO en http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
en: Ingléses: Españolgl: GallegoEtc
![Page 47: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/47.jpg)
Comentarios (y 2)
Messages.properties sólo resuelve un aspecto particular de la internacionalización de aplicaciones: impresión de mensajes en distintos idiomas
En una aplicación más compleja puede ser necesario tener trozos de páginas en distintos idiomas (con gran cantidad de texto estático) y seleccionarlos o incluirlos dinámicamente en función del idioma
Otros aspectos en internacionalizaciónFormatear y tratar fechas, horas, números, cantidades monetarias
JSTL proporciona tags para elloTambién paquetes java.text y java.util
Puede requerir tablas para almacenar contenido en distintos idiomas
Ej.: un servicio de noticias
![Page 48: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/48.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.model.userfacade.delegate
Simula la fachada del modelo que proporciona las operaciones relativas a la interacción del usuario con el portal
UserFac adeDelegate
+ UserFacadeDelegate()+ login(loginName : String, password : St ring, pas swordIsEncrypted : boo lean) : void
![Page 49: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/49.jpg)
es.udc.fbellas.j2ee.util.struts.action
Action(from action)
Def aul tAct ion
+ execute(actionMapping, actionForm, request, response) : ActionForward# doExecute(actionMapping, actionForm, request, response) : ActionForward# doOnInternalError(actionMapping, actionForm, request, response, internalErrorException) : ActionForw...
P ropert yValidat or
![Page 50: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/50.jpg)
Comentarios
DefaultActionProblema
En general, las clases Action invocarán una operación sobre un Business Delegate del modelo o una fachada del controlador, que puede lanzar InternalErrorExceptionEs necesario (1) capturarla, (2) imprimirla en un log (para depuración) e (3) ir a una página que indique error interno
Las clases Action derivarán de DefaultActionImplementa execute (Template Method) en términos de doExecute y doOnInternalErrorLas clases hijas implementan doExecute, que tiene la misma signatura que execute, pero puede lanzar adicionalmente InternalErrorException
PropertyValidatorClase utilidad para validar campos de entrada comunes (double, long, String, etc.)
![Page 51: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/51.jpg)
es.udc.fbellas.j2ee.util.struts.action.DefaultAction (1)
package es.udc.fbellas.j2ee.util.struts.action;
import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletException;import org.apache.struts.action.Action;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
![Page 52: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/52.jpg)
es.udc.fbellas.j2ee.util.struts.action.DefaultAction (2)
public abstract class DefaultAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {
try { return doExecute(mapping, form, request, response);
} catch (Exception e) {// Any exception thrown by "doExecute",// including instances of// "RuntimeException".
return doOnException(mapping, form, request,response, e);
}
}
protected abstract ActionForward doExecute(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException, InternalErrorException;
![Page 53: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/53.jpg)
es.udc.fbellas.j2ee.util.struts.action.DefaultAction (y 3)
protected ActionForward doOnException(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response, Exception exception)throws IOException, ServletException {
/* * Log error, even with debug level <= 0, because it is a* severe error. */
ServletContext servletContext = servlet.getServletConfig().getServletContext();
servletContext.log(exception.getMessage(), exception);
/* Redirect to input page. */return mapping.findForward("InternalError");
}
}
![Page 54: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/54.jpg)
es.udc.fbellas.j2ee.util.struts.action.PropertyValidator (1)
public final class PropertyValidator {
private final static String INCORRECT_VALUE = "ErrorMessages.incorrectValue";
private final static String MANDATORY_FIELD = "ErrorMessages.mandatoryField";
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;
![Page 55: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/55.jpg)
es.udc.fbellas.j2ee.util.struts.action.PropertyValidator (2)
try {propertyValueAsLong =
new Long(propertyValue).longValue();if ( (propertyValueAsLong < lowerValidLimit) ||
(propertyValueAsLong > upperValidLimit) ) {propertyValueIsCorrect = false;
}} catch (NumberFormatException e) {
propertyValueIsCorrect = false;}
if (!propertyValueIsCorrect) {errors.add(propertyName,
new ActionMessage(INCORRECT_VALUE));}
}
return propertyValueAsLong;
}
![Page 56: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/56.jpg)
es.udc.fbellas.j2ee.util.struts.action.PropertyValidator (y 3)
public final static boolean validateMandatory(ActionErrors errors,String propertyName, String propertyValue) {
if ((propertyValue == null) || (propertyValue.length() == 0)) {errors.add(propertyName, new ActionMessage(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 métodos validateXXX => Análogos ...}
![Page 57: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/57.jpg)
Comentariosorg.apache.struts.action.ActionMapping
Permite acceder a los valores configurados en struts-config.xml para la acción en ejecución (inclusive a los forwardsglobales)
org.apache.struts.action.ActionErrorsJuega el papel del mapa de errores que hemos empleado en apartados anterioresEl mensaje de error es un org.apache.struts.action.ActionMessage, que dispone de un constructor que permite especificar el identificador del mensaje de error (en Messages.properties)
ActionMessage se introdujo en Struts 1.2, y reemplaza a ActionError
org.apache.struts.action.ActionForwardRepresenta la siguiente URL a la que hay que irEl Front Controller lo invocará después de llamar al método execute sobre la acción
![Page 58: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/58.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.actionforms.LoginForm (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) {this.loginName = loginName.trim();
}
![Page 59: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/59.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.actionforms.LoginForm (2)
public String getPassword() {return password;
}
public void setPassword(String password) {this.password = password;
}
public boolean getRememberMyPassword() {return rememberMyPassword;
}
public void setRememberMyPassword(boolean rememberMyPassword) {this.rememberMyPassword = rememberMyPassword;
}
![Page 60: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/60.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.view.actionforms.LoginForm (y 3)
public void reset(ActionMapping mapping, HttpServletRequest request) {reset();
}
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
PropertyValidator.validateMandatory(errors, "loginName", loginName);PropertyValidator.validateMandatory(errors, "password", password);
return errors;
}
private void reset() {loginName = null;password = null;rememberMyPassword = false;
}
}
![Page 61: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/61.jpg)
ComentariosLoginForm
Juega el mismo papel que la clase vista en el apartado 4.2Hereda de org.apache.struts.action.ActionForm
Generalmente interesa redefinir reset y validatereset
El Front Controller lo llama antes de dar valor a las propiedadesvalidate
Permite validar las propiedades después de que el FrontController les haya dado valoresSólo se invoca si se ha especificado validate="true" para la acción correspondiente en struts-config.xmlSi devuelve un ActionErrors no vacío, el Front Controller (1) no invocará el método execute sobre la acción 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 struts-config.xml (formulario de entrada)
![Page 62: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/62.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions
Defaul tAc tion(from action)
LoginAct ion LogoutActionMainPageAct ion
LoginManager
UserFacadeDelegate(from delegate)
<<use>><<use>>
<<use>>
<<us e>>
![Page 63: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/63.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.LoginAction (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 = loginForm.getLoginName();String password = loginForm.getPassword();boolean rememberMyPassword = loginForm.getRememberMyPassword();
/* Do login. */ActionMessages errors = new ActionMessages();
![Page 64: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/64.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.LoginAction (y 2)
try {
LoginManager.login(request, response, loginName, password,rememberMyPassword);
} catch (InstanceNotFoundException e) {errors.add("loginName", new ActionMessage(
"ErrorMessages.loginName.notFound"));} catch (IncorrectPasswordException e) {
errors.add("password", new ActionMessage("ErrorMessages.password.incorrect"));
}
/* Return ActionForward. */if (errors.isEmpty()) {
return mapping.findForward("MainPage");} else {
saveErrors(request, errors); return new ActionForward(mapping.getInput());
}
}
}
![Page 65: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/65.jpg)
Comentarios
Las acciones utilizan el método saveErrors(heredado de org.struts.apache.action.Action) para insertar un atributo con los errores en la requestorg.apache.struts.action.ActionMessages
Se introdujo en Struts 1.2Similar a ActionErrorsExisten dos versiones del método saveErrors, una que acepta ActionErrors (“deprecated”) y otra que acepta ActionMessages (el usado en el ejemplo)
![Page 66: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/66.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.LogoutAction
public class LogoutAction extends DefaultAction {
public ActionForward doExecute(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException, InternalErrorException {
/* Do logout. */LoginManager.logout(request, response);
/* Return ActionForward. */ return mapping.findForward("MainPage");
}
}
![Page 67: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/67.jpg)
MainPage.jspx (1)<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page"xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"xmlns:html="http://struts.apache.org/tags-html"xmlns:c="http://java.sun.com/jsp/jstl/core">
<jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"omit-xml-declaration="true" />
<jsp:directive.page contentType="text/html; charset=iso-8859-1" />
<head> <title><fmt:message key="MainPage.title" /></title><c:url var="stylesURL" value="/css/styles.css" /><link rel="StyleSheet" href="${stylesURL}"
type="text/css" media="all" /><meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" /></head>
<body>
![Page 68: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/68.jpg)
MainPage.jspx (2)
<!-- Welcome -->
<div id="header">
<c:choose><c:when test="${empty sessionScope.loginName}">
<fmt:message key="MainPage.welcome" /></c:when><c:otherwise>
<fmt:message key="MainPage.hello" /><c:out value=" ${sessionScope.loginName}" />
</c:otherwise></c:choose>
</div>
![Page 69: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/69.jpg)
MainPage.jspx (y 3)<!-- Links to Login or Logout -->
<p>
<c:choose><c:when test="${empty sessionScope.loginName}">
<c:url var="loginURL" value="Login.jspx" /><a href="${loginURL}">
<fmt:message key="MainPage.login" /></a>
</c:when><c:otherwise>
<html:link action="Logout.do"><fmt:message key="MainPage.logout" />
</html:link></c:otherwise>
</c:choose>
</p>
</body>
</html>
![Page 70: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/70.jpg)
Comentarios (1)
La página JSP es un documento XML bien formadoImportación de librerías
En el tag raíz aprovechamos para importar las librerías de tags que se precisan, especificando sus espacios de nombresEl espacio de nombres por defecto es el correspondiente a los tags de XHTML (http://www.w3.org/1999/xhtml)Librerías
http://java.sun.com/JSP/Page (jsp)Tags estándar de JSP (proporcionados por el contenedor)
http://java.sun.com/jsp/jstl/fmt (fmt)Tags I18n de JSTL
http://struts.apache.org/tags-html (html)Tags HTML de Struts
http://java.sun.com/jsp/jstl/core (c)Tags Core de JSTL
![Page 71: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/71.jpg)
Comentarios (2)
Importación de librerías (cont)Cuando se importa una librería, el contenedor busca automáticamente su descriptor (fichero .tld) en
WEB-INF (y sus subdirectorios)En los ficheros .jar que usa la aplicación
Dentro del fichero .jar busca debajo de META-INF (y sus subdirectorios)
El descriptor especifica, entre otras cosas,La URI del espacio de nombres (que es lo que utiliza el contenedor para saber que éste es el descriptor de la librería)Los nombres de los tags que proporciona la librería y los nombres de las clases que los implementanEn el servlet generado por el contenedor, por cada aparición de un tag de una librería, se crea una instancia la clase correspondiente y se invocan los métodos necesarios a través de un interfaz estándar
![Page 72: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/72.jpg)
Comentarios (3)
Importación de librerías (cont)Cuando el contenedor encuentra un tag no JSP (ej.: html), que importa librerías JSP (ej.: xlmns:fmt="... "), en la respuesta generada no incluye los xlmns:xxxcorrespondientes
Ej.: Para ...
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:jsp="http://java.sun.com/JSP/Page"xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"xmlns:html="http://struts.apache.org/tags-html"xmlns:c="http://java.sun.com/jsp/jstl/core">
... genera ...
<html xmlns="http://www.w3.org/1999/xhtml">
![Page 73: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/73.jpg)
Comentarios (4)
En MainPage.jspx se utiliza<jsp:output doctype-root-element="html"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"omit-xml-declaration="true" />
... lo que genera ...<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
... y se genera en el lugar adecuado, es decir, antes de que se genere el tag raíz htmlomit-xml-declaration="true" provoca que no se genere la declaración XML
Por defecto, el contenedor añade la declaración XML al principio del documento generado por un documento JSPLo lógico sería generar la declaración XML (dado que todo documento XML debería tenerla), sin embargo causa problemas en algunos navegadores
![Page 74: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/74.jpg)
Comentarios (5)
Tags jsp:directive.XXXEquivalentes a las directivas <%@ XXX ... %>, con sus mismos atributosEn MainPage.jspx se utiliza
<jsp:directive.page contentType="text/html; charset=iso-8859-1" />
Permite especificar el contentType de la respuesta HTTPEn un documento JSP, el contentType por defecto es text/xml, lo que provoca que algunos navegadores (ej.: Internet Explorer) visualicen la respuesta como un documento XML (y no como una página HTML)En una página JSP (que no sea un documento JSP), el contentType por defecto es text/html, y por eso nunca lo hemos tenido que especificar en los ejemplos anteriores
![Page 75: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/75.jpg)
Comentarios (6)
En el ejemplo se usa<c:url var="stylesURL" value="/css/styles.css" /><link rel="StyleSheet" href="${stylesURL}"
type="text/css" media="all" />
Alternativamente se podría haber usado<link rel="StyleSheet" href="css/styles.css"
type="text/css" media="all" />
Pero esto resultaría tedioso y propenso a errores en una aplicación web grande con páginas JSP en directorios con cierto nivel de anidamiento (ej.: href="../../../css/styles.css")
Usar<link rel="StyleSheet" href="/css/styles.css"
type="text/css" media="all" />
No funcionaría, dado que la URL /css/styles.css no existe
![Page 76: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/76.jpg)
Comentarios (7)
Usar<link rel="StyleSheet" href="/StrutsTutorial/css/styles.css"
type="text/css" media="all" />
Sería una mala idea, dado que el administrador del servidor de aplicaciones web podría querer instalar la aplicación web con otro nombre
El ejemplo usa el tag c:urlAplica URL rewriting si el navegador no acepta cookies(aunque en este caso no es útil)Si la URL es de tipo path relativo a contexto (ej.: /css/styles.css), le antepone el nombre de la aplicación web, de manera que la URL resultante es de tipo path absoluto (ej.:. /StrutsTutorial/css/styles.css)
![Page 77: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/77.jpg)
Comentarios (y 8)
html:linkGenera el enlace HTML (<a href= ... </a>)Cuando se utiliza el atributo action, aplica URL rewriting si el navegador no acepta cookies
El atributo action tiene que especificar la URL de una acción de Struts
NOTA: también dispone (alternativamente) del atributo href
La URL puede apuntar a cualquier sitioNo se aplica URL rewriting
![Page 78: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/78.jpg)
Login.jspx (1)<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page"xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"xmlns:html="http://struts.apache.org/tags-html"xmlns:c="http://java.sun.com/jsp/jstl/core">
<jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"omit-xml-declaration="true" />
<jsp:directive.page contentType="text/html; charset=iso-8859-1" />
<head> <title><fmt:message key="Login.title" /></title><c:url var="stylesURL" value="/css/styles.css" /><link rel="StyleSheet" href="${stylesURL}"
type="text/css" media="all" /><meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" /></head>
<body>
![Page 79: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/79.jpg)
Login.jspx (2)<!-- Struts tags must render XHML -->
<html:xhtml/>
<!-- Print login form -->
<html:form action="Login.do">
<!-- Login name -->
<div class="field"> <span class="label">
<fmt:message key="Login.loginName" /></span><span class="entry">
<html:text property="loginName" size="16" maxlength="16" /><html:errors property="loginName" />
</span></div>
![Page 80: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/80.jpg)
Login.jspx (3)<!-- Password -->
<div class="field"> <span class="label">
<fmt:message key="Login.password" /></span><span class="entry">
<html:password property="password" size="16" maxlength="16" />
<html:errors property="password" /></span>
</div>
<!-- Remember my password -->
<div class="field"> <span class="label">
<fmt:message key="Login.rememberMyPassword" /></span><span class="entry">
<html:checkbox property="rememberMyPassword" /></span>
</div>
![Page 81: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/81.jpg)
Login.jspx (y 4)
<!-- Login button -->
<div class="button"><html:submit><fmt:message key="Buttons.login" /></html:submit>
</div>
</html:form>
</body>
</html>
![Page 82: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/82.jpg)
Comentarios (1)html:xhtml
Causa que los tags de Struts de la librería HTML que se usen en esa página generen XHTML en vez de HTML (por defecto, algunos tags, como html:text, html:password o html:checkbox generan los tags sin cerrarlos, mientras que otros sí los cierran, como por ejemplo, html:link)
html:text, html:password y html:checkboxrecuperan el valor de la propiedad asociada a través del método getXXX (property="XXX") sobre la instancia de LoginForm enganchada a la request(con nombre loginForm)
Saben que el ActionForm asociado se llama loginForm, dado que el atributo action de html:form es igual a Login.dostruts-config.xml especifica loginForm como el nombre del ActionForm para la URL /Login.do
![Page 83: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/83.jpg)
Comentarios (y 2)
html:errorsImprime el mensaje de error asociado a la propiedad especificada si figura en el ActionErrors/ ActionMessages enganchado a la requestEl mensaje vendrá flanqueado por errors.header y errors.footer (Messages.properties)
![Page 84: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/84.jpg)
InternalError.jspx (1)<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page"xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"xmlns:c="http://java.sun.com/jsp/jstl/core">
<jsp:output doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"omit-xml-declaration="true" />
<jsp:directive.page contentType="text/html; charset=iso-8859-1" />
<head> <title><fmt:message key="InternalError.title" /></title><c:url var="stylesURL" value="/css/styles.css" /><link rel="StyleSheet" href="${stylesURL}"
type="text/css" media="all" /><meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" /></head>
<body>
![Page 85: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/85.jpg)
InternalError.jspx (y 2)
<p><fmt:message key="InternalError.title" />.<fmt:message key="ErrorMessages.retry" /></p>
</body>
</html>
![Page 86: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/86.jpg)
Un pequeño problema
SituaciónImaginemos que la página de bienvenida fuese MainPage.jspx
En realidad es Index.jspx
Un usuario se autentica seleccionando “Remember mypassword”Termina la sesiónAccede dos días después tecleando la URL de la aplicación en su navegador (ej.: http://www.acme.org/StrutsTutorial)
Se ejecuta MainPage.jspx
La sesión no contendrá el atributo loginName, dado que no se ha ejecutado LoginManager.getLoginName
![Page 87: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/87.jpg)
Una solución
El navegador nunca invocará a /MainPage.jspxdirectamente
Index.jspxPágina de bienvenidaHace un forward a /MainPage.do => se ejecuta MainPageAction
MainPageActionLoginManager.getLoginName y forward a /MainPage.jspx
Cuando se haga un sendRedirect a la página principal se hará siempre con la URL /MainPage.do y nunca con /MainPage.jspx
/MainPage.jspx nunca aparecerá en la caja de diálogo del navegador, de manera que el usuario nunca hará un bookmarka esa página, sino a /MainPage.do
En MiniPortal volveremos a discutir este problema
![Page 88: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/88.jpg)
es.udc.fbellas.j2ee.strutstutorial.portal3.http.controller.actions.MainPageAction
public class MainPageAction extends DefaultAction {
public ActionForward doExecute(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException, InternalErrorException {
/* * "LoginManager.getLoginName" 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. */
LoginManager.getLoginName(request);
/* Return ActionForward. */ return mapping.findForward("ShowMainPage");
}
}
![Page 89: 4.4 Tutorial de JSP 2.0, JSTL y Apache Strutsfbellas/teaching/is-2006-2007/Tema4Apart... · Unifica el tratamiento de los operadores .y [] ... Cadenas de caracteres ... Ha ganado](https://reader031.vdocuments.us/reader031/viewer/2022031123/5bb75ab109d3f2a4338d3719/html5/thumbnails/89.jpg)
Index.jspx
<jsp:forward xmlns:jsp="http://java.sun.com/JSP/Page"page="MainPage.do" />