Story Transcript
4.4 Tutorial de JSTL y Jakarta Struts
¿ Qué es JSTL ? n
Existen numerosas librerías de tags JSP que permiten n n
n n n n
n
Iterar sobre colecciones Imprimir valores de propiedades de JavaBeans de forma segura Internacionalización de mensajes, números, fechas, etc. Generación de URLs aplicando URL rewriting Acceso a documentos XML Etc.
Recientemente, se ha estandarizado JSTL (JSP Standard Tag Library) n
Librería de tags estándar y lenguaje de expresiones
Tags en JSTL (1) n
Core n n
n
I18n (internacionalización) n
n
Control de flujo Soporte para URLs Soporte para internacionalización: establecimiento del Locale, generación de mensajes, formateo de números, cantidades monetarias, fechas, etc.
XML n n
n
Parsing de un documento XML Flujo de control para recorrer un documento XML (alternativa a XSL para casos sencillos) Tags para lanzar transformaciones XSL
Tags en JSTL (y 2) n
Acceso a BDs n n
n
n
Permiten lanzar sentencias SQL a BDs relacionales Sólo deberían usarse para prototipado rápido 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 librería 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 expresión n
Ejemplo
... n
JSTL proporciona un lenguaje de expresiones para facilitar su construcción n
Ejemplo
... n
JSP 2.0 incluirá este lenguaje de expresiones n
Estará disponible para cualquier librería 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
n
Los literales que incluyen el símbolo ${, han de escaparlo rodeándolo de ${' y '} Ejemplo:
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
n
n
${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 [] n
n
${user.firstName} es
equivalente a ${user["firstName"]} ${user.preferencesMap["shipping"]} es equivalente a ${user.preferencesMap.shipping}
n
Para determinados casos, es preciso usar el operador [] n
n
${user.preferencesMap["book.fiction"]} es equivalente user.getPreferencesMap().get("book.fiction")
a
${user.preferencesMap[product.category]} es equivalente user.getPreferencesMap().get(product.getCategory())
a
Lenguaje de expresiones en JSTL (4) n
Objetos implícitos n
Entre otros n n n n n
n
n
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) n
Ejemplo
...
Lenguaje de expresiones en JSTL (y 5) n
Literales n n n n
n
Boolean (true y false) Numéricos Cadenas de caracteres (entre comillas simples o dobles) null
Operadores n n n n n
Aritméticos: +,-, *, /, div, %, mod Lógicos: &&, and, ||, or, !, not Relacionales: ==, eq, !=, ne, , gt, =, ge empty: permite comprobar si un valor es null Ejemplos ... ...
n
Se pueden usar paréntesis
¿ Qué es Struts ? n
n
Framework OpenSource para implementar aplicaciones web con servlets y JSP según el patrón arquitectónico Model-View-Controller Subproyecto de Jakarta n
n
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
Versión 1.0 estable en Julio 2001 Posteriormente, surgieron muchos otros framework MVC Actualmente se está estandarizando JavaServer Faces (http://java.sun.com/j2ee/javaserverfaces), que formará parte de J2EE n
Struts 1.2 estará parcialmente integrado con JSTL y JavaServer Faces, y la integración será completa en Struts 2.0
¿ Qué proporciona Struts ? n n
Un servlet Front Controller y clases relacionadas Una librería de tags JSP muy completa
El patrón Front Controller en Struts (1) javax.servlet.http.HttpServlet
org.apache.struts.action.ActionServlet 0..n
# doGet # doPost
org.apache.struts.action.Action + execute
org.apache.struts.action.ActionForm + reset + validate
Action1
ActionN
...
ActionForm1
ActionFormN
...
El patrón Front Controller en Struts (2) n
ActionServlet n n
Servlet Front Controller En web.xml se especifica que todas las URLs que impliquen procesamiento (por GET o POST) vayan a este servlet n
n
Clases ActionForm n
Si el programador lo desea, puede acceder a los parámetros de la request a través de un JavaBean que extiende ActionForm n
n
Ej.: las URLs que termine en .do
Especialmente útil en formularios
Clase Action => método execute n
n
n
n
Accede a los parámetros de la request, directamente o vía el ActionForm correspondiente Realiza la operación invocando un método de un Session Facade del modelo o una fachada del controlador Deja el resultado devuelto por el método en la request o en la sesión Devuelve un objeto ActionForward, que representa la URL que hay que visualizar a continuación (sendRedirect o forward)
El patrón Front Controller en Struts (3) n
Fichero de configuración n
Clases ActionForm que usa nuestra aplicación n n
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 procesamiento n
URL de tipo path relativo a contexto (ej.: /Login) n
n
n
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
El patrón Front Controller en Struts (y 4) n
Fichero de configuración (cont) n
Definiciones de nombres lógicos de URLs n
n n
n
n
Nombre que usan las acciones cuando devuelven un ActionForward (ej.: ShowMainPage) sendRedirect o forward URL a invocar (ej.: /MainPage.jsp)
Cuando el servlet ActionServlet arranca (init), lee el fichero de configuración Crea una única instancia de cada clase Action n
n n
No se crea una instancia de una clase Action por cada petición que se recibe Tienen que ser thread-safe Misma situación que cuando se trabaja con servlets
La librería de tags de Struts (1) n
Bean n
n n
n
Imprimir el valor de las propiedades de JavaBeans de manera segura Soporte para internacionalización de mensajes No los usaremos, dado que JSTL ofrece una alternativa estándar
HTML n
Generación de HTML básico n n
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 estándar
La librería de tags de Struts (y 2) n
Template n
n
n
Caso particular del patrón Composite View (plantillas de páginas JSP) Lo veremos con MiniBank y MiniPortal
Tiles n n
Una versión mejorada de Template Se incorporó en la versión 1.1
Arquitectura MVC con Struts n
Modelo n
n
Controlador n n
n
Clases independientes de la vista y el controlador Conjunto de clases Action Interactúan con el modelo y seleccionan la siguiente vista (dejándole los datos en uno de los cuatro posibles ámbitos, normalmente request o session)
Vista n n
Conjunto de clases ActionForm Conjunto de páginas JSP n n n
No contienen código Java Sólo 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 días más tarde
Acceder a Portal-3 main page
Portal-3 main page (Welcome to Portal-3)
Estructura de paquetes es.udc.fbellas.j2ee.util.struts.action es.udc.fbellas.j2ee.strutstutorial.portal3 http controller actions view actionforms messages model userfacade delegate exceptions
jar tvf StrutsTutorial.war (1) MainPage.jsp InternalError.jsp Login.jsp Index.jsp WEB-INF/Struts/struts-html.tld WEB-INF/Struts/struts-config.xml WEB-INF/StdTagLibs/fmt.tld WEB-INF/StdTagLibs/c.tld WEB-INF/lib/standard.jar WEB-INF/lib/jstl.jar WEB-INF/lib/jaxen-full.jar WEB-INF/lib/saxpath.jar WEB-INF/lib/struts.jar WEB-INF/lib/commons-*.jar WEB-INF/lib/StandardUtil.jar WEB-INF/lib/WebUtil.jar
jar tvf StrutsTutorial.war (y 2) 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/ 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/LoginAction.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/http/view/ messages/Messages.properties WEB-INF/web.xml
Comentarios n
WEB-INF/Struts n
n
n
Ficheros *.tld: descriptores de las librerías de las acciones proporcionadas por Struts struts-config.xml: configuración de Struts para la aplicación del tutorial
WEB-INF/StdTagLibs n
Ficheros *.tld: descriptores de las librerías de las acciones proporcionadas por JSTL
n
WEB-INF/lib
n
struts.jar, commons-*.jar: Struts n standard.jar, jstl.jar, jaxen-full.jar, saxpath.jar: Jakarta Standard TagLibs (implementación OpenSource de JSTL) n StandardUtil.jar y WebUtil.jar: subsistema Util de J2EEExamples WEB-INF/classes/es/.../Messages.properties n
n
Internacionalización de mensajes
WEB-INF/web.xml (1)