Your SlideShare is downloading. ×
0
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Curso de programacion Web en Java
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Curso de programacion Web en Java

710

Published on

Curso de programación web en Java. …

Curso de programación web en Java.
Servlets, JSP y JSTL

1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
710
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
96
Comments
1
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Programación Web con JavaJorge Guilló – jguillo@gmail.com
  • 2. Contenido Introducción  JSP programación Web  Sintaxis básica  Cliente / Servidor  Expresiones (EL)  HTTP, HTML  JSP Beans Servlets  JSTL  Conceptos  Etiquetas  HttpServletRequest personalizadas  HttpServletResponse  Sesiones  Cookies
  • 3. Funcionamiento de una petición web Servidor Recursos Servidor Web Navegador Apache, IIS,...http://www.google.es Petición HTTP Traducción GET / HTTP/1.0 Host: www.google.es Buscar index.html recurso Devolver Respuesta HTTP recurso HTTP/1.0 200 OK Date: ... Content-Type: text/html Content-Length: ... <HTML>...
  • 4. HTTP HyperText Transfer Protocol Protocolo de las peticiones WWW  Basado en texto  Sin estado  Cada petición es independiente  Funciona sobre TCP/IP
  • 5. Petición HTTP URI Método POST /buscar.jsp HTTP/1.1 POST /buscar.jsp HTTP/1.1 Protocolo Host: www.example.comCabeceras Host: www.example.com User-Agent: Mozilla/4.0 User-Agent: Mozilla/4.0 Cuerpo search=Java search=Java Métodos:  GET: Solicita un recurso  No tiene cuerpo  POST: Envía información al servidor  El cuerpo contiene la información enviada  Otros:  PUT, DELETE, OPTIONS, HEAD, TRACE, CONNECT
  • 6. Cabeceras HTTP Contienen información adicional sobre la petición o respuesta HTTP  Accept  Expires  Accept-Language  Host  Cache-Control  Last-Modified  Content-Type  Pragma  Content-Length  Referer  Date  User-Agent
  • 7. Respuesta HTTP Código de estado Protocolo HTTP/1.1 200 OK HTTP/1.1 200 OK Cache-Control: private Cache-Control: private Content-Type: text/html; charset=ISO-8859-1 Content-Type: text/html; charset=ISO-8859-1Cabeceras Server: GWS/2.1 Server: GWS/2.1 Transfer-Encoding: chunked Transfer-Encoding: chunked Date: Sun, 27 May 2007 19:19:34 GMT Date: Sun, 27 May 2007 19:19:34 GMT <html> <html> <head> Cuerpo <head> <title>Ejemplo</title> <title>Ejemplo</title> ... ...
  • 8. Códigos de estado Las respuestas HTTP incluyen un código de estado indicando el resultado de la petición 1xx – Información  4xx – Error de cliente  100 – Continuar  400 – Petición errónea 2xx – Éxito  401 – No autorizado  200 – OK  403 – Prohibido  202 – Aceptado  404 – No encontrado 3xx – Redirección  407 – Proxy requiere autentificación  301 – Movido permanentemente  5xx – Error de servidor  302 – Encontrado (redirigir)  500 – Error interno  307 – Redirección temporal  501 – No implementado
  • 9. HTML Lenguaje para definición de contenido Contiene etiquetas para definir los distintos elementos de una página También se incluyen etiquetas para definir formularios que permiten enviar datos al servidor
  • 10. Documento HTML<html> <!–- Engloba todo el documento --> <html> <!–- Engloba todo el documento --><head> <!–- Cabecera --> <head> <!–- Cabecera --><title>Título de la página</title> <title>Título de la página</title><link type="text/css" rel="stylesheet" <link type="text/css" rel="stylesheet" href="estilos.css"> href="estilos.css"></head> </head><body> <!–- Cuerpo del documento --> <body> <!–- Cuerpo del documento --> <h1>Página de prueba</h1> <h1>Página de prueba</h1> Aquí va el texto de la página Aquí va el texto de la página</body> </body></html> </html>
  • 11. Elementos HTML <!-- ... -->: Comentario <p>...</p> : Párrafo  <p align="center">Párrafo centrado</p> <br>: Salto de línea <img>: Imagen  <img src="imagen.jpg"> <a>...</a>: Enlace  <a href="www.google.es">Google</a> <h1>...</h1>: Títulos (<h2>,<h3>,...)  <h1>Título</h1>
  • 12. Elementos HTML <b>...</b>: Negrita <i>...</i>: Cursiva <u>...</u>: Subrayado <ul>...</ul>: Lista con viñetas <li>..</li>: Línea con viñeta  <ul> <li>Linea 1</li> <li>Linea 2</li> </ul> <span>...</span>: Bloque <div>...</div>: Capa
  • 13. Elementos HTML <table>...</table>: Tabla <tr>...</tr>: Fila de tabla <th>...</th>: Cabecera de columna <td>...</td>: Celda de tabla  <table border=1 cellpadding=3> <tr><th>ID</th><th>Nombre</th></tr> <tr><td>1</td><td>Juan</td></tr> <tr><td>2</td><td>Ana</td></tr> </table>
  • 14. Formularios HTML <form>: engloba un formulario  <textarea>: Área de texto  method: Método HTTP para varias líneas  action: URL a la que se envía  rows: Nº de líneas el formulario  cols: Nº de columnas <input>: elemento de entrada  <select>: Lista  name: Nombre del control  name: Nombre del control  value: Valor  <option>: Elemento de lista  type: Tipo de control  value: Valor de la opción  text: Caja de texto (por  Contenido: Texto de la opción defecto)  checkbox: Casilla de  <select name="lista"> verificación <option value="1">  radiobutton: Casilla de Opcion 1 opción </option>  button: Botón <option value="2">  submit: Botón de envío Opcion 2  file: Fichero </option>  hidden: Valor oculto </select>
  • 15. Formulario HTML<form method="GET"<form method="GET" action="http://www.google.es/search"> action="http://www.google.es/search"> <input type="hidden" name="hl" <input type="hidden" name="hl"value="es">value="es"> Buscar en Google: <input name="q"> Buscar en Google: <input name="q"> <input type="Submit" value="Buscar"> <input type="Submit" value="Buscar"></form></form>
  • 16. Tecnologías Web de Java Servlets  Componentes ejecutables en el servidor  Similar a CGI JSP  Páginas "vivas"  Mezcla HTML con código  Similar a ASP
  • 17. Servlets Son clases de Java Se ejecutan en el servidor web Ventajas sobre CGI:  Eficientes: Proceso único multihilo  Convenientes: Comunican con el servidor  Potentes: Toda la API Java al alcance  Portables: Bytecode Java  Seguros: Infraestructura Java  Baratos: Servidores y librerías gratuitos
  • 18. Proceso de funcionamiento Servidor Web Navegador Encontrar Fichero de servlet configuración http://.../servlet para la URL ____________ Máquina ___________ virtual Java _____________ _____________ __________ Servlet
  • 19. Proceso de funcionamiento Leer la petición HTTP  Datos enviados por el usuario  Cabeceras, cookies, etc... Procesar los resultados  Consulta a base de datos  Acceso a servicios Formateo de los resultados  Normalmente en HTML, pero pueden devolver una imagen, texto, XML, ficheros binarios (PDF),... Preparar la respuesta  Añadir cabeceras, establecer cookies,... Enviar la respuesta al cliente
  • 20. Mi primer servlet!import java.io.*; import java.io.*;import javax.servlet.*; import javax.servlet.*;import javax.servlet.http.*; import javax.servlet.http.*;public class HolaServlet extends HttpServlet { public class HolaServlet extends HttpServlet { public void doGet(HttpServletRequest request, public void doGet(HttpServletRequest request, HttpServletResponse HttpServletResponseresponse) response) throws ServletException, throws ServletException,IOException IOException {{ String nombre = request.getParameter("nombre"); String nombre = request.getParameter("nombre"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); out.println("<HTML><H1>"); out.println("<HTML><H1>"); out.println("Hola " + nombre + "!"); out.println("Hola " + nombre + "!"); out.println("</H1></HTML>"); out.println("</H1></HTML>"); }}}}
  • 21. Interface Servlet javax.servlet.Servlet  Define los métodos que debe tener cualquier servlet, para cualquier protocolo  init(ServletConfig config)  service(ServletRequest request, ServletResponse response)  destroy()  ServletConfig getServletConfig()  java.lang.String getServletInfo()
  • 22. Clase HttpServlet javax.servlet.http.HttpServlet  Implementa el interface Servlet específicamente para el protocolo HTTP  Normalmente, se deriva directamente de HttpServlet en lugar de implementar Servlet  Añade los métodos  doGet(HttpServletRequest, HttpServletResponse)  doPost(HttpServletRequest, HttpServletResponse)  ...
  • 23. Instalación en el servidor El servidor web contiene aplicaciones web (webapps) Cada aplicación es un directorio con una estructura determinada  Raíz: *.html, *.jsp, imágenes,...  WEB-INF/web.xml : Fichero de descripción. XML indicando los servlets y componentes que forman la aplicación.  WEB-INF/classes/: Clases y recursos de la aplicación, que no estén empaquetados en JAR. Mantiene la estructura de paquetes.  WEB-INF/lib/: Ficheros JAR necesarios para la aplicación Toda esta estructura se puede empaquetar en un sólo archivo WAR (Web Application Archive) Los contenidos de WEB-INF están protegidos y no son descargables por el cliente
  • 24. Fichero web.xml El fichero web.xml contiene toda la configuración de una aplicación web  Servlets instalados  Filtros  Gestores de eventos de aplicación  Seguridad  Variables de entorno
  • 25. Ejemplo fichero web.xml<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app> <web-app> <display-name>Pruebas</display-name> <display-name>Pruebas</display-name> <description>Pruebas.</description> <description>Pruebas.</description> <servlet> <servlet> <servlet-name>HolaServlet</servlet-name> <servlet-name>HolaServlet</servlet-name> <servlet-class>HolaServlet</servlet-class> <servlet-class>HolaServlet</servlet-class> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>HolaServlet</servlet-name> <servlet-name>HolaServlet</servlet-name> <url-pattern>/Hola</url-pattern> <url-pattern>/Hola</url-pattern> </servlet-mapping> </servlet-mapping></web-app> </web-app>
  • 26. Configuración de servlets En el fichero web.xml hay que añadir dos directivas por cada servlet que se quiera instalar  <servlet> <servlet-name>...</servlet-name> <servlet-class>...</servlet-class> </servlet>  Indica la clase que implementa un servlet y el nombre que se le da en la aplicación  <servlet-mapping> <servlet-name>...</servlet-name> <url-pattern>...</url-pattern> </servlet-mapping>  Asigna una URL a un servlet
  • 27. Instalar la aplicación web Hay varias opciones para instalar una aplicación web en Tomcat  Copiar el directorio de la aplicación en el directorio webapps de Tomcat  Copiar el archivo war de la aplicación en el directorio webapps de Tomcat  Tomcat puede descomprimir automáticamente el archivo  Utilizar las páginas y comandos de Tomcat Manager  Utilizar tareas Ant de Tomcat Deployer La manera de instalar aplicaciones varía de un servidor de aplicación a otro  Todos deben aceptar archivos war  La mayoría tienen administración por web
  • 28. Ciclo de vida de un servlet Durante la ejecución de un servlet se llama a sus distintos métodos en distintos momentos  init(): Cuando se crea el servlet  service(): Para atender cada petición. Este método llama a su vez a:  doGet(): Para peticiones GET  doPost(): Para peticiones POST  destroy(): Cuando se libera el servlet
  • 29. Interfaz SingleThreadModel Normalmente, se crea una sola instancia del servlet y multiples hilos que acceden a dicha instancia  Los metodos deben sincronizar los accesos a variables de la instancia Implementando el interfaz SingleThreadModel, se asegura que los métodos se acceden por un solo thread Puede afectar al rendimiento de la aplicación
  • 30. Obtener parámetros El objeto HttpServletRequest contiene toda la información enviada por el cliente  getParameter(nombre): devuelve el valor de un parámetro  getParameterValues(nombre): devuelve un array con los valores de un parámetro multivalor  getParameterNames(): devuelve un array con los nombres de los parámetros recibidos
  • 31. Obtener cabeceras El método getHeader() obtiene el valor de una cabecera HTTP Además, existen métodos específicos para las cabeceras más comunes  getCookies  getContentType  getContentLength Otros métodos:  getHeaderNames: Devuelve los nombres de todas las cabeceras recibidas  getHeaders: Devuelve los valores de una cabecera multivalor  getDateHeader: Devuelve el valor de una cabecera de tipo fecha  getIntHeader : Devuelve el valor de una cabecera de tipo entero
  • 32. Devolver resultados El objeto HttpServletResponse permite generar la respuesta para el cliente. Se puede generar el código de resultado (404, 500, 200,...) con el método setStatus(int code) Además, se pueden utilizar:  sendError(int code, String message)  Envía un código de error (404, 500,...) y una descripción  sendRedirect(String url)  Realiza una redirección a otra URL
  • 33. Cabeceras de respuesta El método setHeader(name, value) de HttpServletResponse permite enviar cabeceras al cliente Otros métodos útiles  setDateHeader(String name, long millis)  setIntHeader(String name, int value)  setContentType(String value)  setContentLength(int value)  addCookie(Cookie value)
  • 34. Escribir la respuesta En el objeto HttpServletResponse:  getWriter(): devuelve un objeto PrintWriter para escribir texto en el documento de respuesta  Utilizando el método println() de PrintWriter  getOutputStream(): devuelve el stream de respuesta, en el que se puede escribir en modo binario
  • 35. Ejercicio: Servlet de imagen 1. Leer los parámetros del servlet 2. Construir una imagen  Utilizar la clase BufferedImage 3. Dibujar en la imagen  Obtener el objeto Graphics de la imagen  Utilizar los métodos de Graphics (drawXXX(), fillXXX(),...) 4. Establecer la cabecera Content-Type  Usar "image-jpeg" 5. Obtener el stream de salida  response.getOutputStream() 6. Escribir la imagen en el stream de salida  Utilizar las clases de com.sun.image.codec.jpeg  JPEGCodec: Factoría de JPEGImageEncoder, usando el método createJPEGEncoder(OutputStream stream)  JPEGImageEncoder: Permite guardar imágenes en formato JPEG con el método encode(BufferedImage img)
  • 36. Configuración de la aplicación El archivo web.xml puede contener varios tipos de valores de configuración:  Parámetros de inicialización de servlet  Configuración propia de un servlet determinado  Se accede a través de la configuración del servlet  Parámetros de contexto  Configuración global de la aplicación  Se accede través del contexto del servlet  Sólo de tipo String  Entradas de entorno  Configuración global de la aplicación  Se accede a través de JNDI  Accesibles desde cualquier clase  Pueden ser String, Integer, Boolean, Double y Float
  • 37. Parámetros de inicializaciónde servlet Definición en web.xml <servlet> <servlet> <servlet-name>...</servlet-name> <servlet-name>...</servlet-name> <servlet-class>...</servlet-class> <servlet-class>...</servlet-class> <init-param> <init-param> <param-name>rutaFicheros</param-name> <param-name>rutaFicheros</param-name> <param-value>C:ficheros</param-value> <param-value>C:ficheros</param-value> </init-param> </init-param> </servlet> </servlet> Acceso al valor desde código String ruta = this.getServletConfig() String ruta = this.getServletConfig() .getInitParameter("rutaFicheros"); .getInitParameter("rutaFicheros");
  • 38. Parámetros de contexto Definición en web.xml <context-param> <context-param> <param-name>rutaFicheros</param-name> <param-name>rutaFicheros</param-name> <param-value>C:ficheros</param-value> <param-value>C:ficheros</param-value> </context-param> </context-param> Acceso al valor desde código String ruta = this.getServletContext() String ruta = this.getServletContext() .getInitParameter("rutaFicheros"); .getInitParameter("rutaFicheros");
  • 39. Entradas de entorno Definición en web.xml <env-entry> <env-entry> <env-entry-name>rutaFicheros</env-entry-name> <env-entry-name>rutaFicheros</env-entry-name> <env-entry-value>C:ficheros</env-entry-value> <env-entry-value>C:ficheros</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> <env-entry-type>java.lang.String</env-entry-type> </env-entry> </env-entry> Acceso al valor desde código InitialContext ctx = new InitialContext(); InitialContext ctx = new InitialContext(); Context env = ctx.lookup("java:comp/env"); Context env = ctx.lookup("java:comp/env"); String ruta = (String)env.lookup("rutaFicheros"); String ruta = (String)env.lookup("rutaFicheros");
  • 40. Redirigir la petición La petición se puede redirigir a otro servlet o JSP  Se utiliza el objeto RequestDispatcher  El cliente (navegador) no es consciente de la redirección Dos tipos de redirección:  forward: La petición se redirige al otro servlet y se termina el proceso en este servlet  include: La petición se redirige al otro servlet y después vuelve a este servlet // Se obtiene el RequestDispatcher para la URL // Se obtiene el RequestDispatcher para la URL // a la que se quiere redirigir (la URL es // a la que se quiere redirigir (la URL es // relativa al contexto de la aplicación) // relativa al contexto de la aplicación) RequestDispatcher rd = RequestDispatcher rd = request.getRequestDispatcher("/OtroServlet"); request.getRequestDispatcher("/OtroServlet"); rd.forward(request,response); rd.forward(request,response);
  • 41. Cookies Una cookie es un valor que se proporciona al navegador y que éste adjunta después en cada petición Se implementan a través del objeto Cookie  Se leen con getCookies()  Se escriben con addCookie() Métodos de Cookie:  get/setMaxAge()  get/setName()  get/setComment()  get/setValue()  get/setSecure()  get/setDomain()  get/setVersion()  get/setPath() Para las cookies que se leen del cliente, sólo se obtienen las propiedades Name y Value
  • 42. Gestión de sesiones El objeto HttpSession permite almacenar información asociada a una sesión  Se obtiene con request.getSession()  Se basa en cookies o reescritura de URL Métodos:  getValue(String nombre) getAttribute(String nombre)  Devuelve un valor asociado a la sesión  putValue(String nombre, Object valor) setAttribute(String nombre, Object valor)  Almacena un valor en la sesión  removeValue(String nombre) removeAttribute(String nombre)  Borra un valor de la sesión  getValueNames() (array) getAttributeNames() (enumeración)  Devuelve los nombres de los valores almacenados en la sesión
  • 43. Comunicación entre servlets Se pueden almacenar valores que se compartan entre distintos servlets en diversos ámbitos  ServletContext: Los valores son globales para todos los servlets de la aplicación para cualquier usuario  HttpSession: Los valores están asociados a la sesión del usuario  HttpServletRequest: Los valores se asocian a la petición y se pueden acceder desde cualquier servlet que participe en la petición (a través de forward o execute) Se utilizan los métodos getAttribute(nombre) y setAttribute(nombre,valor)  Se puede guardar cualquier tipo de objeto
  • 44. JSP (Java Server Pages) Evolución de los servlets Permite combinar de manera sencilla contenido estático con contenido dinámico El motor de JSP compila la página y genera un servlet correspondiente
  • 45. Elementos de JSP Scriptlets (bloques de código)  <% código %>  Se inserta en el método _jspService() (que es llamado por service()) Expresiones  <%= expresión %>  Se inserta en el resultado de la página, incluyendo llamadas println() en _jspService Declaraciones  <%! código %>  Se inserta en el cuerpo del servlet, fuera de los métodos Comentarios  <%-- comentario --%>  No se envían al cliente ni se ejecutan en servidor
  • 46. Sintaxis XML En JSP se puede usar también una sintaxis XML  Expresiones  <jsp:expression> Expresión </jsp:expression>  Scriptlets  <jsp:scriptlet> Código </jsp:scriptlet>  Declaraciones  <jsp:declaration> Código </jsp:declaration>
  • 47. Variables predefinidas request  application  Objeto petición  Objeto de aplicación (HttpServletRequest) (HttpServletContext) response  config  Objeto respuesta  Objeto ServletConfig (HttpServletResponse)  pageContext out  Contexto de la página  PrintWriter de salida  page session  La propia página  Objeto de sesión (sinónimo de this) (HttpSession)
  • 48. Ejemplo de JSP: Expresiones<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HTML><HEAD> <HEAD><TITLE>Expresiones JSP</TITLE> <TITLE>Expresiones JSP</TITLE></HEAD> </HEAD><BODY> <BODY><H2>Expresiones JSP</H2> <H2>Expresiones JSP</H2><UL> <UL><LI>Fecha/hora actual: <%= new java.util.Date() %> <LI>Fecha/hora actual: <%= new java.util.Date() %><LI>Tu nombre de host: <%= request.getRemoteHost() %> <LI>Tu nombre de host: <%= request.getRemoteHost() %><LI>Tu ID de sesi&oacute;n: <%= session.getId() %> <LI>Tu ID de sesi&oacute;n: <%= session.getId() %><LI>El par&aacute;metro <CODE>prueba</CODE>: <LI>El par&aacute;metro <CODE>prueba</CODE>:<%= request.getParameter("prueba") %> <%= request.getParameter("prueba") %></UL> </UL></BODY> </BODY></HTML> </HTML>
  • 49. Ejemplo de JSP: Scriptlets<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HTML><HEAD><TITLE>Cambio de color</TITLE></HEAD> <HEAD><TITLE>Cambio de color</TITLE></HEAD><% <%String bgColor == request.getParameter("bgColor"); String bgColor request.getParameter("bgColor");boolean tieneParametro; boolean tieneParametro;if (bgColor != null) {{ if (bgColor != null) tieneParametro = true; tieneParametro = true;}} else {{ else tieneParametro == false; tieneParametro false; bgColor == "WHITE"; bgColor "WHITE";}}%> %><BODY bgcolor="<%=bgColor%>"> <BODY bgcolor="<%=bgColor%>"><H2 align="center">Prueba de color</H2> <H2 align="center">Prueba de color</H2><% if (tieneParametro) {{ %> <% if (tieneParametro) %>Has indicado el color <I><%=bgColor%></I> Has indicado el color <I><%=bgColor%></I><% }} else {{ %> <% else %>No has indicado color de fondo, lo muestro en blanco.<br> No has indicado color de fondo, lo muestro en blanco.<br>Usa el par&aacute;metro <I>bgColor</I> para indicar el color. Usa el par&aacute;metro <I>bgColor</I> para indicar el color.<% }} %> <% %></BODY> </BODY></HTML> </HTML>
  • 50. Ejemplo de JSP: Declaraciones<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> Transitional//EN"><HTML> <HTML><HEAD><TITLE>Declaraciones JSP</TITLE></HEAD> <HEAD><TITLE>Declaraciones JSP</TITLE></HEAD><BODY> <BODY><H1>Declaraciones JSP</H1> <H1>Declaraciones JSP</H1><%! private int accesos = 0; %> <%! private int accesos = 0; %><H2> <H2> Accesos a la p&aacute;gina desde Accesos a la p&aacute;gina desde el &uacute;ltimo reinicio: el &uacute;ltimo reinicio: <%= ++accesos %> <%= ++accesos %></H2> </H2></BODY> </BODY></HTML> </HTML>
  • 51. Directivas JSP Las directivas afecta a la estructura del servlet resultante de una página JSP  Sintaxis: <%@ directiva atributo="valor" %>  Sintaxis XML: <jsp:directive.directiva atributo="valor" /> Existen tres directivas en JSP  page: Configuración del servlet  include: Inclusión de ficheros  taglib: Referencia a librerías de etiquetas
  • 52. Directiva page Su función depende de los atributos que presenta  <%@ page import="..." %>  Importación de paquetes que se utilicen en el script JSP  <%@ page contentType="MIME-Type" %>  Establece la cabecera Content-Type  <%@ page isThreadSafe="true|false" %>  Indica si el servlet implementa el interfaz SingleThreadModel (por defecto true)  <%@ page session="true|false" %>  Indica si se utilizan sesiones en la página (defecto true)  <%@ page buffer="kbytes|none" %>  Tamaño del buffer de la página
  • 53. Directiva page (II)  <%@ page autoflush="true|false" %>  Indica si se vacía el buffer automáticamente (por defecto true)  <%@ page extends="paquete.clase" %>  Especifica la clase base del servlet  <%@ page info="mensaje" %>  Descripción del servlet  <%@ page errorPage="url-relativa" %>  URL de la página a la que se redirige en caso de error  <%@ page isErrorPage="true|false" %>  Indica si la página funciona como página de error para otras páginas  <%@ page language="java" %>  Lenguaje de la página (java es el único valor válido)
  • 54. Inclusión de ficheros En tiempo de compilación:  <%@ include file="..." %>  Se incluye el fichero completo y se compila junto con la página  Si se modifica el fichero incluido, hay que actualizar todas las páginas en las que aparece En tiempo de ejecución:  <jsp:include page="..." flush="true" />  Se incluye el resultado de la ejecución de la página  Se le pueden pasar parámetros a la página:  <jsp:include page="saludo.jsp" flush="true" > <jsp:param name="nombre" value="Juan" /> </jsp:include>
  • 55. Inclusión de applets Para incluir un applet en JSP se utiliza la etiqueta jsp:plugin  <jsp:plugin type="applet" code="MyApplet.class" width="..." height="..."> <jsp:parameters> <jsp:param name=".." value=".." /> ... </jsp:parameters> </jsp:plugin> Esta estructura se transforma en el correspondiente bloque <OBJECT> para Java Plug-in
  • 56. Paso a otra página La ejecución de un JSP se puede transferir a otra página  La ejecución del JSP se corta  Si el JSP ha generado resultados, se pierden y son sustituidos por los nuevos Se utiliza la etiqueta <jsp:forward page="..." />  Se pueden incluir parámetros como en <jsp:include>
  • 57. pageContext:Acceso a objetos JSP El objeto PageContext (accesible por la propiedad pageContext) proporciona acceso a los objetos intrínsecos de JSP  ServletRequest getRequest()  ServletResponse getResponse()  JspWriter getOut()  HttpSession getSession()  ServletContext getServletContext()  ServletConfig getServletConfig()  Object getPage()  Throwable getException()
  • 58. pageContext:Almacenamiento de valores PageContext permite almacenar valores en distintos ámbitos  Object getAttribute(String name, int scope)  void setAttribute(String name, Object object, int scope)  void removeAttribute(String name, int scope) Los ámbitos donde se pueden almacenar valores son:  PageContext.PAGE_SCOPE: El valor es visible en la propia página  PageContext.REQUEST_SCOPE: Visible en todas las páginas y servlets que participen en el procesado de la petición (con forward o include)  PageContext.SESSION_SCOPE: Visible en todas las páginas y servlets mientras dure la sesión del cliente  PageContext.APPLICATION_SCOPE: Visible para todas las páginas y servlets de la aplicación, para cualquier sesión Otros métodos útiles:  Enumeration getAttributeNamesInScope(int scope) Devuelve el nombre de todos los valores almacenados en un ámbito  public Object findAttribute(String name) Devuelve el valor de un atributo sin especificar el ámbito  public int getAttributesScope(String name) Devuelve el ámbito en el que está almacenado un determinado valor
  • 59. pageContext:Inclusión y paso de petición Además, PageContext tiene métodos para la inclusión de ficheros y la transferencia de la petición a otra página (forwarding)  public void forward(String url) throws IOException, ServletException  public void include(String url) throws IOException, ServletException
  • 60. JavaBeans ¿Qué es un JavaBean?  Es una clase Java que cumple ciertas reglas  Esas reglas permiten que pueda ser utilizada de forma automatizada Reglas de un JavaBean  Debe tener un constructor vacío  No debe tener variables públicas  Sus propiedades deben ser accesibles por métodos getXXX / isXXX / setXXX
  • 61. Utilizar un JavaBean La etiqueta <jsp:useBean> crea una instancia de una clase JavaBean, o da acceso a la instancia si ya existe  <jsp:useBean id="nombre" class="paquete.Clase" scope="request"/>  Crea una variable nombre de tipo paquete.Clase  La variable es accesible normalmente desde el código  La instancia se almacena en el contexto de la página en el ámbito indicado (por defecto page)
  • 62. Acceso a propiedades <jsp:getProperty name="bean" property="propiedad"/>  Devuelve el valor de la propiedad bean.propiedad() y lo envía al resultado de la página  Equivale a <%=bean.getPropiedad()%> <jsp:setProperty name="bean" property="propiedad" value="valor"/>  Establece el valor valor en la propiedad bean.propiedad  Equivale a <% bean.setPropiedad("valor"); %>  Se puede utilizar <%=..%> para establecer un valor dinámico <jsp:setProperty name="bean" property="propiedad" param="parametro"/>  Establece el valor del parámetro parametro en la propiedad bean.propiedad <jsp:setProperty name="bean" param="*"/>  Establece el valor de las propiedades del JavaBean con el valor de los parámetros del mismo nombre
  • 63. Lenguaje de expresiones (EL) El lenguaje de expresiones es un sustituto de las expresiones <%=..%> Una expresión EL se encierra entre ${..} Tiene acceso directo a todos los valores almacenados en el contexto como si fuesen variables  ${abc} equivale a < %=pageContext.findAttribute("abc")%> Se puede acceder a las propiedades de los JavaBeans y realizar operaciones aritméticas  ${producto.precio * lineaPedido.unidades}  A las propiedades se accede directamente por el nombre, sin usar el método getXXX
  • 64. Operadores de acceso En EL existen dos operadores de acceso: el punto (.) y los corchetes ([]) Teniendo en cuenta que var.prop equivale a var["prop"], el comportamiento es el siguiente:  Si var es null, el resultado es null (no hay NullPointerException)  Si prop es null (prop puede ser una expresión y no un literal), el resultado es null.  Si var es un Map, el resultado es var.get(prop), y null si no existe la clave prop en el Map.  Si var es un array o una lista, prop se evalúa como entero. Si no se puede, se produce un error. Si no, el resultado es el elemento correspondiente al índice prop de la lista/array. Si prop está fuera de los límites de la lista/array, devuelve null.  Si var es un JavaBean y prop corresponde al nombre de una propiedad, el resultado es el valor de dicha propiedad. Si no, da un error.
  • 65. Objetos implícitos EL pageContext  param  Objeto pageContext  Valores de los parámetros pageScope  paramValues  Valores almacenados en el  Valores de los parámetros ámbito page como arrays de String requestScope  header  Valores almacenados en el  Valores de las cabeceras ámbito request  headerValues sessionScope  Valores de las cabeceras  Valores almacenados en el como arrays de String ámbito session  cookie applicationScope  Valores de las cookies  Valores almacenados en el ámbito application
  • 66. Librerías de tags JSP se puede extender utilizando librerías de etiquetas Las etiquetas personalizadas pueden  Producir contenido  Modificar variables  Procesar su propio contenido Permiten separar el código del HTML
  • 67. JSP Standard Tag Library JSP define una librería de tags estándar denominada JSTL (JSP Standard Tag Library)  La implementación de referencia es la del proyecto Apache Jakarta Se compone de cuatro librerías de tags  Core: programación  XML: tratamiento de ficheros XML  SQL: acceso a BD  Fmt: formateo de valores Además cuenta con una librería de funciones que pueden usarse desde EL
  • 68. JSTL: Core Se utiliza con la directiva <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:out value="..." />  Escribe un valor en la respuesta (similar a <%=..%>)  Acepta EL en el atributo value  Más cómodo para obtener propiedades de beans  Tiene un atributo escapeXML que añade secuencias de escape a <, >, &,...  Si el valor indicado es nulo, se puede dar un valor por defecto para mostrar  <c:out value="bean.propiedad" default="No hay valor"/>  <c:out value="bean.propiedad">No hay valor</c:out> <c:set var="..." value="..." /> <c:set var="...">...</c:set>  Asigna un valor a una variable  Se le puede indicar el ámbito con scope="..."  También se usa para establecer propiedades con la sintaxis: <c:set target="bean" property="propiedad" value="..:"/> <c:remove var="..." scope="..." />  Elimina una variable de un ámbito determinado  Si no se especifica ámbito, elimina la variable del primer ámbitos donde la encuentre
  • 69. JSTL: Core (condicionales) <c: catch var="...">...</c:catch>  Encierra las tags que contenga en un try...catch y almacena la excepción en la variable indicada <c:if test="...">...</c:if>  Realiza las acciones dentro del tag si la expresión test evalúa a true  Se puede indicar una variable que recibe el resutlado de test <c:choose> <c:when test="...">...</c:when> <c:otherwise>...</c:otherwise> </c:choose>  Ejecuta el primer bloque en el que test devuelve true
  • 70. JSTL: Core (bucles) <c:forEach var="..." start="..." end="...> </c:forEach>  Realiza un bucle for. El valor de la iteración se almacena en la variable var y toma valores entre start y end <c:forEach var="..." items="..."> </c:forEach>  Realiza un bucle sobre una colección <c:forTokens items="..." delimiters="..." var="..."> </c:forTokens>  Separa el valor especificado en items en subcadenas que se hallen separadas por cualquier carácter de delimiters  <c:forTokens items="a,b,c,d,e,f" delimiters="," var="val"> </c:forTokens>
  • 71. JSTL: Core (URLs) <c:url value="/track.jsp" var="trackingURL"> <c:param name="..." value="..."/> </c:url>  Formatea una URL y almacena el resultado en una variable  Se le pueden indicar parámetros a añadir a la URL  Se puede indicar una URL relativa de otra webapp, indicando el argumento context="/nombre-webapp"  Añade el ID de sesión si el navegador cliente no soporta cookies  Si no se indica variable, escribe el resultado en la salida <c:import url="..." />  Obtiene el resultado de la ejecución de la URL  Se le puede indicar var o varReader para almacenar o leer los contenidos en lugar de escribirlos directamente en la respuesta  Acepta parámetros y contexto como <c:url>  Se puede indicar un contexto (webapp) <c:redirect url="..." />  Redirige el navegador a otra página  Acepta parámetros y contexto como <c:url>
  • 72. JSTL: Funciones fn:contains  fn:split fn:containsIgnoreCase  fn:startsWith fn:endsWith  fn:substring fn:escapeXml  fn:substringAfter fn:indexOf  fn:substringBefore fn:join  fn:toLowerCase fn:length  fn:toUpperCase fn:replace  fn:trim
  • 73. JSTL: SQL La directiva para usar los tags de SQL es la siguiente:  <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <sql:setDataSource driver=".." url=".." var=".." />  Crea una conexión de BD (DataSource)  driver: Clase del driver JDBC  url: URL JDBC de conexión  var: Variable donde se almacena el DataSource (si no se indica se almacena como DataSource por defecto) <sql:query sql=".." var=".." dataSource=".." />  Realiza una consulta SQL y almacena el resultado en var  El resultado es un RowSet, que se puede usar como JavaBean  Puede recibir parámetros con etiquetas <sql:param value=".." /> <sql:update sql=".." var=".." dataSource=".." />  Ejecuta una sentencia SQL y devuelve el número de filas afectadas  Puede recibir parámetros con etiquetas <sql:param value=".." /> <sql:transaction dataSource="..">..</sql:transaction>  Ejecuta todas las consultas que contenga dentro de una transacción
  • 74. Ejemplo JSTL: SQL<%@ taglib prefix="c" <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="sql" <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> uri="http://java.sun.com/jsp/jstl/sql" %><sql:setDataSource driver="com.mysql.jdbc.Driver" <sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test?user=root" var="ds" /> url="jdbc:mysql://localhost/test?user=root" var="ds" /><sql:query sql="select id, nombre from prueba" <sql:query sql="select id, nombre from prueba" var="resultados" dataSource="${ds}"/> var="resultados" dataSource="${ds}"/><html> <html> <body> <body> <table border="4"> <table border="4"> <tr><th>Id</th><th>Nombre</th></tr> <tr><th>Id</th><th>Nombre</th></tr> <c:forEach var="row" items="${resultados.rows}"> <c:forEach var="row" items="${resultados.rows}"> <tr><td><c:out value="${row.id}"/></td> <tr><td><c:out value="${row.id}"/></td> <td><c:out value="$ <td><c:out value="${row.nombre}"/></td></tr> {row.nombre}"/></td></tr> </c:forEach> </c:forEach> </table> </table> </body> </body></html> </html>
  • 75. Creación de librerías de tags Creación de clases de etiquetas (tag handlers) Creación del fichero descriptor de la librería (TLD) Instalación de la librería en una aplicación web Uso de la librería en las páginas JSP
  • 76. Creación de clases etiqueta Se crea una clase que implementa el interfaz Tag Dependiendo de las necesidades se puede utilizar una de las clases predefinidas y extenderla:  TagSupport: Etiquetas sin contenido  BodyTagSupport: Etiquetas con contenido Se deben implementar dos métodos:  doStartTag(): Se invoca cuando se encuentra la etiqueta de apertura  doEndTag(): Se invoca cuando se encuentra la etiqueta de cierre
  • 77. Ejemplo de etiquetapackage ejemplos.tags; package ejemplos.tags;import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*; import javax.servlet.jsp.*;import java.io.*; import java.io.*;public class TagHolaMundo extends TagSupport { public class TagHolaMundo extends TagSupport { public int doStartTag() public int doStartTag() throws JspException, throws JspException,IOException { IOException { JspWriter out = pageContext.getOut(); JspWriter out = pageContext.getOut(); out.println("<h1>Hello World!</h1>"); out.println("<h1>Hello World!</h1>"); return SKIP_BODY; return SKIP_BODY; }} public int doEndTag() { return EVAL_PAGE; } public int doEndTag() { return EVAL_PAGE; }}}
  • 78. Fichero TLD Cuando se crea una librería de etiquetas, se debe incluir un fichero TLD (Tag Library Descriptor)  Indica las etiquetas que hay definidas en la librería<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= xsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee/web- "http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" jsptaglibrary_2_0.xsd" version="2.0"> version="2.0"> <tlib-version>1.0</tlib-version> <tlib-version>1.0</tlib-version> <short-name>ejemplos</short-name> <short-name>ejemplos</short-name> <description>Ejemplos de tags</description> <description>Ejemplos de tags</description> <tag> <tag> <name>hola</name> <name>hola</name> <tag-class>ejemplos.tags.TagHolaMundo</tag-class> <tag-class>ejemplos.tags.TagHolaMundo</tag-class> <body-content>empty</body-content> <body-content>empty</body-content> </tag> </tag></taglib> </taglib>
  • 79. Instalación en una aplicación Para cada librería de tags que se utilice en una aplicación, se debe añadir una entrada <taglib> en el fichero web.xml  <taglib> <taglib-uri>/hello</taglib-uri> <taglib-location> /WEB-INF/tld/hola.tld </taglib-location> </taglib> Las clases de los tags se deben incluir en el directorio classes (o en lib, en forma de JAR), y el fichero TLD en la ruta indicada en web.xml
  • 80. Uso en una página JSP Para utilizar una librería de tags en una página, se incluye una directiva taglib  <%@ taglib uri="/hola" prefix="mitag" %>  uri: indica la URL en la que se publica la librería, según se indica en web.xml  prefix: asocia un prefijo a las etiquetas para su uso dentro de la página En la página se incluyen las etiquetas con el nombre <prefijo:etiqueta>  <html> <body> <mitag:hola/> </body> </html>  El nombre de la etiqueta es el definido en el TLD
  • 81. Contenidos posibles de un tag En el TLD, se indica el tipo de contenido de cada tag con <body- content>  empty: la etiqueta es siempre vacía  tagdependant: el contenido es interpretado por la propia etiqueta  jsp: el contenido es código JSP y HTML interpretable por el motor JSP
  • 82. Procesado del contenido Dependiendo del valor devuelto por doStartTag() y doEndTag(), el contenido de la etiqueta es procesado de manera distinta  doStartTag()  SKIP_BODY: El contenido se ignora, y se pasa directamente a doEndTag()  EVAL_BODY_INCLUDE: Envía el contenido a la respuesta y luego ejecuta doEndTag()  EVAL_BODY_BUFFERED: El contenido se procesa con los métodos doInitBody() y doAfterBody() (BodyTagSupport)  doAfterBody()  SKIP_BODY: Se pasa a doEndTag()  EVAL_BODY_AGAIN: Se vuelve a procesar el contenido  doEndTag()  EVAL_PAGE: Continúa la ejecución de la página JSP contenedora  SKIP_PAGE: Ignora el resto de la página JSP contenedora
  • 83. Procesado del contenido (II) doInitBody() realiza tareas de inicialización doAfterBody() se lanza después de interpretar el contenido de la etiqueta (pero sin que éste se haya enviado a la respuesta)  getBodyContent() devuelve un objeto BodyContent para procesar el contenido El objeto BodyContent contiene los métodos:  getString() devuelve el contenido en forma de String  getReader() devuelve un Reader para leer el contenido  writeOut(Writer) escribe el contenido en el Writer especificado  getEnclosingWriter() devuelve el Writer asociado al contenedor
  • 84. Atributos de las etiquetas Una etiqueta puede presentar atributos  <mitag:hola nombre="Juan" /> Por cada posible atributo:  La clase debe implementar métodos de acceso como en un JavaBean  Se deben especificar con etiquetas <attribute> en el TLD  <tag> <name>hola</name> <tag-class>ejemplos.tags.TagHola</tag-class> <attribute> <name>nombre</name> <required>yes</required> </attribute> <body-content>empty</body-content> </tag>  Al ejecutar doStartTag(), las propiedades han sido inicializadas por el motor JSP
  • 85. Atributos de las etiquetas (II) La etiqueta <attribute> del TLD tiene los siguientes componentes  <name>...</name> Nombre del atributo  <required>yes|no|true|false</required> Indica si el atributo es obligatorio  <type>...</type> Tipo de datos del atributo (p.ej. java.lang.Date)  <rtexprvalue>yes|no|true|false</rtexprvalue> Indica si el atributo puede tener un valor evaluado en tiempo de ejecución  Expresión JSP: <%=...%>  Expresión EL: {$...}
  • 86. Interfaz SimpleTag Introducida en JSP 2.0, la interfaz SimpleTag (y su clase SimpleTagSupport) permiten implementar tags de manera más sencilla  Sólo existe un método doTag()  La implementación se basa en objetos JspFragment  Representan fragmentos de código JSP  Tienen un método invoke() que recibe un Writer y ejecuta el fragmento JSP escribiendo la salida en el Writer  Los fragmentos JSP no deben contener scriptlets ni expresiones JSP, únicamente tags y expresiones EL  Por ejemplo, getJspBody() devuelve el contenido de la etiqueta como un JspFragment En el TLD, se debe especificar <body-content>scriptless</body-content>
  • 87. Atributos en SimpleTag Los atributos se pueden implementar como JspFragment  El tipo de datos del atributo es JspFragment  En el TLD se añade la etiqueta <fragment> al atributo:  <attribute> <name>atributo</name> <required>no</required> <fragment>true</fragment> </attribute>
  • 88. Ficheros .tag (Tag Files) Se pueden crear tags personalizadas creando un fichero JSP con extensión .tag  Permite crear tags personalizadas sin usar Java El fichero .tag se debe incluir  En el directorio WEB-INF/tags  No necesita TLD  Empaquetado en un JAR, en el directorio WEB-INF/lib  El fichero .tag debe residir en el directorio META-INF/tags del archivo JAR  Debe incluir un TLD Las etiquetas definidas en ficheros tag se importan con:  <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>  Se llaman
  • 89. Directivas de ficheros .tag En un fichero .tag se incluyen directivas similares a las de las páginas JSP  <%@ tag ... %>  Análogo a la directiva <%@page %> de JSP  Permite hacer import, definir una descripción para el tag,...  <%@ attribute ... %>  Define un atributo para la etiqueta  Tiene los mismos parámetros que la etiqueta <attribute> del TLD  <%@ variable ... %>  Define una variable que se exporta al JSP contenedor y puede utilizarse en variables EL cuando se llama al tag
  • 90. Acciones de ficheros .tag En los ficheros .tag, se utilizan dos acciones JSP especiales:  <jsp:doBody /> Evalua el contenido de la etiqueta  <jsp:invoke fragment="atributo" /> Evalúa un atributo de tipo fragment Ambas acciones pueden recibir los siguientes parámetros  var="nombreVariable" Recoge el resultado del fragmento JSP y lo almacena en una variable de tipo String con el nombre indicado  varReader="nombreVariable" Crea una variable Reader con el nombre indicado para leer el resultado del fragmento JSP  scope="page|request|session|application" Ámbito en el que se crea la variable indicada en var o varReader Si no reciben un parámetro var o varReader, vuelcan el resultado en la respuesta JSP
  • 91. Ejemplo de fichero .tag<%@ attribute name="imagen" %> <%@ attribute name="imagen" %><%@ attribute name="titular" fragment="true" %> <%@ attribute name="titular" fragment="true" %><table border="0"> <table border="0"> <tr> <tr> <td> <td> <h1> <h1> <jsp:invoke fragment="titular"/> <jsp:invoke fragment="titular"/> </h1> </h1> </td> </td> <tr> <tr> <tr> <tr> <td valign="top"><img src="${imagen}"></td> <td valign="top"><img src="${imagen}"></td> <td> <td> <jsp:doBody /> <jsp:doBody /> </td> </td> </tr> </tr></table> </table>
  • 92. Inclusión de fichero .tag<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %><tags:noticia imagen="img/noticia.jpg"> <tags:noticia imagen="img/noticia.jpg"> <jsp:attribute name="titular"> <jsp:attribute name="titular"> Nuevo tipo de <i>tags</i> Nuevo tipo de <i>tags</i> </jsp:attribute> </jsp:attribute> <jsp:body> <jsp:body> Ahora puedes crear tags Ahora puedes crear tags de una nueva manera.<br> de una nueva manera.<br> Bienvenido a los <b>Ficheros .tag</b>! Bienvenido a los <b>Ficheros .tag</b>! </jsp:body> </jsp:body></tags:noticia> </tags:noticia>
  • 93. Crear funciones EL  Desde EL se puede utilizar cualquier función Java  Definir una función estática  Añadirla al fichero TLD <!–- JSP --> <!–- JSP --> <% taglib prefix="fun" <% taglib prefix="fun"// Funciones.java // Funciones.java uri="..." %>package mypkg; uri="..." %> package mypkg; ... ...public class Funciones {{ public class Funciones ${fun:trim(nombre)} ${fun:trim(nombre)} ... ... public static String trim(String s) {{ public static String trim(String s) return s.trim(); return s.trim(); }} <!–- TLD --> <!–- TLD -->}} ... ... <function> <function> <name>trim</name> <name>trim</name> <function-class>mypkg.Funciones</function-class> <function-class>mypkg.Funciones</function-class> <function-signature> <function-signature> java.lang.String trim(java.lang.String) java.lang.String trim(java.lang.String) </function-signature> </function-signature> </function> </function> ... ...
  • 94. Buenas prácticas En las páginas JSP se debe evitar en la medida de lo posible la mezcla de HTML con scriptlets  Utilizar acciones JSP (<jsp:XXX />)  Sustituir las expresiones <%=..%> por sintaxis EL  Utilizar JavaBeans para almacenar los datos de los parámetros  Separar el procesado, acceso a datos, etc.. en servlets y dejar las páginas JSP sólo para mostrar el resultado, accediendo a JavaBeans almacenados en el ámbito request  Crear etiquetas personalizadas para definir elementos reutilizables entre distintas páginas  Cabecera, menú, pie  Utilizar tags JSTL para realizar bucles, condiciones, etc...
  • 95. Arquitecturas para web Modelo 1: La petición se atiende en un JSP que construye un JavaBean y accede a objetos de negocio JavaBean petición u otros servicios Objetos Cliente JSP de negocio respuesta
  • 96. Arquitecturas para web Modelo 2: La petición se atiende en un servlet encargado de todo el proceso y acceso a objetos de negocio. El servlet construye un JavaBean y pasa la ejecución a un JSP que se encarga de la presentación petición Servlet JavaBean u otros servicios Objetos Cliente de negocio respuesta JSP
  • 97. Ventajas del modelo 2 Permite separar las tareas de presentación del procesado de datos Se basa en el patrón modelo-controlador-vista  Modelo: Contiene los datos que describen  Corresponde a los JavaBeans y objetos de negocio  Vista: Muestra los datos  Corresponde al JSP  Controlador: Componente que realiza operaciones con el modelo y conecta la vista con el modelo  Corresponde al servlet Da una mayor flexibilidad y facilita la reutilización  Controladores genéricos  Distinta vista dependiendo del usuario
  • 98. Patrones de diseñoMVC: Modelo-Vista-Controlador Las responsabilidades se separan en tres roles  Modelo: Contiene los datos de la aplicación  Vista: Presenta los datos al usuario  Controlador: Accede a los datos del modelo y selecciona la vista a presentar Normalmente se implementa:  Controlador: Servlet que recibe la petición  Modelo: Objetos de negocio  Vista: Páginas JSP
  • 99. Patrones de diseñoBusiness Facade Ofrece métodos de negocio simplificados que encapsulan las distintas operaciones necesarias  Ejemplo: añadirAlCarrito(usuario,producto)  Comprueba stock  Inserta el producto en el carrito  Decrementa stock Un servlet controlador normalmente utilizará un objeto de negocio que implementa Business Facade
  • 100. Patrones de diseñoDAO: Data Access Object Ofrece las operaciones de acceso a la base de datos ocultando los detalles de implementación  Tipo de base de datos  Creación de conexiones, statements, etc. Ofrece métodos de tipo:  Carga  Inserta  Actualiza  Lista  Borra
  • 101. Patrones de diseñoDTO: Data Transfer Objects Objetos sencillos que almacenan los datos que se traspasan entre distintas capas Suelen implementarse como JavaBeans  Constructor vacío  Métodos get/set Los métodos de los Business Facade, DAO, etc. reciben y devuelven DTOs
  • 102. Arquitectura completa Modelo Servlet Business DAO petición Facade controladorCliente forward DTO JavaBean JSP BD respuesta vista
  • 103. Flujo de proceso El servlet controlador recibe la petición Guarda los parámetros en un DTO y llama al Business Facade El Business Facade realiza las operaciones de negocio solicitadas utilizando los DAO correspondientes, y construyendo los DTO que necesite El Business Facade compone un DTO de respuesta para el controlador El controlador guarda los datos necesarios como atributos del objeto request y redirige la petición a la página JSP que implementa la vista correspondiente La página JSP muestra los datos de respuesta
  • 104. Enlaces y Bibliografía En Internet:  http://jakarta.apache.org/ Página de la implementación de referencia de JSP Libros:  "Servlets y Java Server Pages“ Marty Hall - Pearson Educación  “Java for the Web with Servlets, JSP, and EJB” Budi Kurniawan - New Readers

×