Java Server Pages, Beans y JSP Tag Library

Dr. Víctor J. Sosa Sosa vjsosa@cinvestav.mx
Sintetizado del curso de Mark Baker University of Portsmouth, UK

1

Introducción
Introducción a los JSP. Elementos de JSP Scripting. JSP, directivas de página: Estructura y generación de Servlets. Incluyendo archivos en documentos JSP. Usar los componentes de JavaBeans con JSP. Creando JSP tag libraries personalizados. Integrando Servlets y JSP con la arquitectura MVC.
2

¿Porqué usar JSP?
Con Servlets es fácil:
Leer datos de un formulario, Leer las cabeceras de las peticiones HTTP. Leer los códigos de estado HTTP y las cabeceras de respuesta, Usar cookies y seguimiento de sesiones, Compartir Datos entre Servlets, Recordar datos entre peticiones.

Qué es lo difícil:
Usar muchas instrucciones println() para generar HTML, Mantenimiento del HTML.

3

El Framework de JSP
La idea:
Uso de HTML para la mayoría de las páginas Web, Identificar código del Servlet con etiquetas especiales, Toda la página JSP es convertida a un Servlet (sólo una vez) y el Servlet es el que realmente es invocado (por cada petición).

Ejemplo:
JSP:
Thanks for ordering <%=request.getParameter(“title”) %/>

URL:
http://host/OrderConfirmation.jsp?title=Java+Servlets.

Result:
Thanks for ordering the “Java Servlets”
4

Java Server Pages (JSP)
Arquitectura de JSP
El propósito de JSP es ofrecer una forma más declarativa y más guiada por la presentación que aquella conseguida con los servlets. Las páginas JSP se utilizan en un proceso que involucra dos fases: 1. Una fase de traducción dinámica a servlets que se
realiza únicamente cuando la página JSP se crea o modifica. Una fase de contestación a peticiones que se consigue cuando las clases de los servlets generados se cargan en el contenedor de servlets.

2.

5

Java Server Pages (JSP)
Arquitectura de JSP
En la segunda fase, para atender concurrentemente al procesamiento de peticiones, el servidor lanza un proceso ligero (thread) por cada uno de los clientes el cual corre el método _jspService(). El método _jspService() no puede reemplazarse por otros métodos definidos por el programador, pero en cambio puede adecuarse su inicialización y terminación con los métodos jspInit() y jspDestroy().

6

8 .Java Server Pages (JSP) Arquitectura de JSP Servlet Evento de iniciación _jspInit() Petición Respuesta _jspService() Evento de terminación _jspDestroy() Contenedor de Servlets 7 Benéficos de usar JSP Ventajas Independencia del servidor Web. Substitución del API de los servlets por conjuntos de elementos de marcado (tags) y fragmentos de programación (scriptlets). Altamente recomendable para conseguir el acceso al servidor Web en arquitecturas de partes múltiples (multi-tier). Separación del contenido estático del dinámico. Separación del contenido dinámico del formato de la presentación.

pero sólo para manejar situaciones donde la información dinámica está basada en el medio ambiente del cliente. 10 . información valiosa. Y. Contra Active Server Pages (ASP): ASP es una tecnología similar que pertenece a Microsoft La parte dinámica de JSP es escrita en Java.Ventajas de JSP frente a las tecnologías similares. Contra JavaScript: JavaScript puede generar dinámicamente HTML del lado cliente. Contra Server-Side Includes (SSI): SSI son tecnologías ampliamente soportadas para incluir. Es portable con otros sistemas operativos y servidores Web que no sean de Microsoft. conexiones a bases de datos. catálogos. Con excepción de las cookies de HTTP y los formularios. puesto que corre del lado cliente. el envío de datos no es posible en JavaScript. dejando lugar para que los programadores de Servlets inserten el contenido dinámico. esto lo hace un mejor lenguaje. Además. JSP es mejor porque le permite utilizar Servlets en lugar de un programa separado para generar la parte dinámica. JavaScript no puede tener acceso a los recursos del lado servidor como bases de datos. Contra Servlets: JSP no proporciona algo más que en principio podría hacerse con un Servlet. no en Visual Basic u otro lenguaje propietario de Microsoft. no para programas reales que usen información de un formulario. en una página Web estática. se puede tener diversas personas en diversas tareas: expertos en diseño de páginas Web pueden construir el HTML. entre otros. etc. SSI está pensado para inclusiones simples. Pero es mas conveniente para escribir y modificar HTML que tener muchas sentencias println() para generarlo. Capacidad útil. partes definidas externamente. haciendo la separación de vista y contenido. 9 Ventajas de JSP frente a las tecnologías similares.

COM + JavaScript o Visual Basic Script Modelo de seguridad de Java Modelo de seguridad de Windows NT Active Data Objects Ninguna 12 Bases de datos Extensibilidad Java Data Base Connectivity Abierto a librerías de elementos .Ventajas de JSP frente a las tecnologías similares. 11 Resumen: JSP vs ASP Propiedad Servidor Java Server Pages La mayoría de los servidores más Conocidos (Apache. JSP es tan fácil y conveniente que es totalmente factible aumentar las páginas HTML que se verán beneficiadas por la inserción de cantidades pequeñas de datos dinámicos. no puede contener información dinámica. MS IIS) Cualquiera que corra una máquina virtual Java Java Beans. DCOM . Contra HTML estático: El HTML normal. Enterprise Java Beans y librerías de elementos Java Active Server Pages Los servidores de Microsoft (IIS y Personal Web Server) Windows Plataforma Modelo de componentes Programación (scripting) Seguridad COM . Netscape.

Preguntas similares: ¿Cómo pongo un Applet en una página JSP? Respuesta: Envié una etiqueta del <APPLET…> al cliente. La página JSP original es ignorada al momento de la petición. solo el Servlet que resulte de la JSP es el que se toma en cuenta. ¿Cómo pongo una imagen en una página JSP? Respuesta: Envié una etiqueta de la <IMG…> al cliente. La traducción de páginas no ocurre en cada petición. ¿Qué pasa en el momento de la petición? El código del Servlet es ejecutado. JSP me dejaría hacerlo? ¿Por qué esta pregunta no tiene sentido? JSP corre completamente del lado servidor. Esto no debería suceder a usuarios reales – los desarrolladores deben probar las páginas que instalan. 14 .Malentendidos comunes: Recordar que JSP es tecnología Server-Side Pregunta muy común: ¿No puedo hacer XYZ con el HTML. No cambia el contenido que el visualizador puede manejar. Ninguna interpretación del JSP ocurre al momento de la petición. ¿Cuándo ocurre la traducción de la página? Generalmente la primera vez que la página JSP es invocada después de ser modificada. 13 2do Malentendidos comunes: Tiempo de Traducción/Petición ¿Qué sucede al momento de traducción de la página JSP? Las JSPs se traducen a código Servlet. ¿Cómo uso un JavaScript/Acrobat/Shockwave/etc? Respuesta: Envié las etiquetas correspondientes del HTML.

jsp 16 .banamex.com.delta.mx/esp/empresarial/monarca/login.http://www.com/ 15 https://portal.

instalación de directorios. Advertencias: Las reglas utilizadas para el acceso al CLASSPATH. 18 . Compilar el código Utilizar los paquetes para evitar conflictos de nombres.excite.http://www. Coloque la página JSP en el directorio correcto: <tomcat_home>/Webapps/ROOT.com/ 17 Configurando el medio ambiente. Configurar CLASSPATH. aun se aplican a las clases utilizadas en JSP.. Use el URL especial para invocar la página JSP. etc.

si la localización es: <tomcat_home>/Webapps/ROOT/Expression.jsp EL URL debe ser: http://localhost:8080/Expressions.Ejemplo.jsp 20 . 19 Ejemplo Con la configuración por defecto.

Ejemplo 21 Elementos del JSP Scripting 22 .

fuera de cualquier método existente.. Uso de Beans. Servlet/JSP combo.println(expression). ej. Aplicaciones complejas 23 Tipos de elementos de Scripting Expresiones: Formato <%=expression %> Se evalua e inserta en la salida del Servlet.Uso de las JSPs Los elementos de Scripting Aplicaciones simples llaman al código del Servlet directamente. Etiquetas personalizadas. Los elementos de Scripting llaman al código del Servlet indirectamente mediante clases de uso general(utilities). el resultado en algo como: out. 24 . Scriptlets: Formato <%code%> Insertado textualmente dentro del método _jspService en los Servlet’s (llamada al servicio). Declaraciones: Formato <%! code%> Insertado textualmente dentro del cuerpo de la clase del Servlet.

setContentType(“text/html”). 25 Correspondencia JSP/Servlet Original JSP: <H1> A Random Number </H1> <%= Math.getRemoteHost()%> Sintaxis compatible XML : <jsp:expression> Java Expression </jsp:expression> Versión de XML no suportada por Tomcat 3.print.util.2. y puesta en la página HTML en el lugar donde ocurrió en la página JSP. convertida a cadena. los servidores no tiene que darle soporte.println(Math.println(“<H1> Random Number</H1>).getWriter().1 Hasta la versión JSP 1. Ejemplos: Tiempo actual: <%=new java.random() %> Resultado posible del código Servlet: public void _jspService(HttpServletRequest request. out. … } 26 . la expresión se pone en el _jspService dentro de out.get Session(true). out. Es decir.randon()). HttpServletResponse response) throws ServletException IOException{ request. JspWriter out = response.Date()%> Tu nombre de maquina: <% request.Expresiones JSP Formato: <%= Expresión Java %> Resultado: Expresión evaluada. HttpSession session = request.

28 . Response: El HttpSerlvetResponse – 2do argumento para doGet(). Application: El ServletContext (para compartir datos) como fue obtenido vía getServletConfig(). Out: El flujo de datos (de tipo JspWriter) usado para enviar la salida al cliente.getContext(). Session: El HttpSession asociada a la petición (al menos que fuera deshabilitada con el atributo de la directiva de sesión).Ejemplo usando expresiones JSP 27 Variables predefinidas Request: El HttpServletRequest – 1er argumento para doGet().

Ejemplo: <%String queryData = request.Java Server Pages (JSP) Objetos Implícitos Objeto request response pageContext Contexto HttpServletRequest HttpServletResponse jsp. espacios de nombres y otras facilidades Conserva el estado de la session Contexto del servlet de configuración Flujo de salida Configuración del servlet del JSP Página que procesa la petición en curso Ámbito Petición Página Página session application out config page http.getQueryString().JspWriter ServletConfig Object Sesión Aplicación Página Página Página 29 JSP Scriptlets Formato: <% Código Java %> Resultado: El código insertado textualmente en el _jspService del Servlet.setContentType(text/plain”). out.%> <%response.PageContext Descripción Invocación del servicio Respuesta a la Petición Características de la página Dependientes de la implementación.println(Attached GET data: “ + queryData). %> Sintaxis compatible XML: <%jsp:scriptlet> Código Java </jsp:scriptlet>%> 30 .HttpSession ServletContext jsp.

setContentType(“text/html”). HttpSession session = request. JspWriter out = response.getWriter().println(bar()). … } 31 Ejemplo usando JSP Scriptlets 32 .Correspondencia JSP/Servlet Original JSP: <%= foo() %> <%= bar() %> Posible resultado del código Servlet: public void _jspService(HttpServletRequest request. HttpServletResponse response) throws ServletException IOException{ request.println(foo()).get Session(true). out. out.

%> <%! private void AlgunMetodo(…) {…} %> Sintaxis compatible XML : <jsp:declaration> Código Java </jsp:declaration> 34 . Ejemplos: <%! private int algunCampo=5.Ejemplo usando JSP Scriptlets 33 Declaraciones JSP Formato: <%! Código Java %> Resultado: El código se inserta textualmente en la definición de la clase del Servlet. fuera de cualquier método existente.

%> <H2>Accesses to page since server reboot: <%= ++accessCount %></H2> </BODY> </HTML> 36 . } %> <%= randomHeading()%> 35 Ejemplo usando declaraciones JSP <!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.Declaraciones JSP JSP: <H!>Someheading</H1> <%! private String randomHeading(){ return(“<H2>” + Math.0 Transitional//EN"> <HTML> <HEAD> <TITLE>JSP Declaraciones</TITLE> </HEAD> <BODY> <H1>JSP Declaraciones</H1> <%! private int accessCount = 0.random() + “</H2>”).

%> </BODY> </HTML> N bienvenido helloworld hellouser response NameHandler 37 Java Server Pages (JSP) Ámbito y Visibilidad de los Objetos JSP Los objetos JSP pueden crearse: implícitamente por directivas JSP explícitamente a través de acciones excepcionalmente usando fragmentos de código El ámbito del objeto establece su duración desde su creación hasta su destrucción.Java Server Pages (JSP) Ejemplo de una Página JSP: La siguiente página JSP presenta un saludo. <%-. su visibilidad indica los lugares de la página donde puede usarse el objeto. 38 .Esta página da un saludo y despedida --%> <HTML> <BODY> <H1>Bienvenido a JSP!</H1> <% out.println("Regrese pronto”).

40 .Java Server Pages (JSP) Ámbito y Visibilidad de Objetos La siguiente tabla muestra los ámbitos que pueden asociarse a los objetos recién creados. existe un conjunto de objetos predefinidos cuyos nombres pueden usarse inmediatamente en JSP. Ámbito 4 (mayor) 3 2 Categoría Aplicación Sesión Petición Descripción Pertenecen a la misma aplicación Pertenecen a la misma sesión Provienen de la petición que es Atendida Pertenecen a la página en que fueron creados 39 1 (menor) Página Java Server Pages (JSP) Objetos Implícitos Debido a que la tecnología JSP se basa en aquella de los servlets.

.. .. . %> <%! . . . . . . scope++) { out.Java Server Pages (JSP) Ejemplo Este ejemplo muestra los cuatro ámbitos de los objetos JSP. . %> <%= . %> <% .getAttributeNamesInScope(scope).. .getServletName() %><br> <% for (int scope = 1. . .nextElement()+”<br>”). . . } } %> </BODY> </HTML> 41 ambitos Java Server Pages (JSP) Resumen de Elementos Básicos de JSP Elementos que se intercalan entre aquellos de HTML o XML. . . . Elemento Directiva Declaraciones Expresiones Scriptlets Sintaxis <%@ . . . . . . while (e.. . %> Descripción Importar clases o incluir archivos HTML Declarar variables o métodos Java Evaluación de expresiones Java Ejecución de instrucciones Java Texto no procesado 42 Comentarios <%-.*”%> <HTML> <BODY> Servlet <%= config. <%@page import=“java. .hasMoreElements()) { out. . Enumeration e = pageContext.. . . . . .util. . .println("<H2>Ambito "+scope+"</H2>").%> . . -. . .println(e.. . . scope <= 4. . .

JSP: Resumen Elementos Básicos Directivas Las directivas son instrucciones dirigidas al contenedor de servlets JSP. se tienen múltiples procesos concurrentes) errorPage que permite indicar si la página se usa para anunciar un error 43 JSP: Resumen Elementos Básicos Ejemplos de Directivas Las directivas: <%@ page import=”java.*. permite usar la variable predefinida session en la página JSP buffer que establece el tamaño del área temporal de la página autoflush que indica si el envío al flujo de salida es inmediato isThreadSafe que establece que a lo más un proceso está activo a la vez (por omisión.css <%@ page buffer=”16k” %> establece el tamaño del buffer a 16k <%@ page isThreadSafe=”true” %> establece que hay sólo un proceso activo a la vez 44 .sql.util <%@ page include=”sty.css” %> inserta los estilos para el documento que están guardados en el archivo sty.java. La directiva de página tiene la forma: <%@ page atributos %> donde los atributos pueden ser: language que indica el lenguaje usado en la página JSP. no al flujo de salida. Las directivas determinan los atributos de la página y las dependencias con el contenedor.*” %> importa los paquetes java. import que establece las clases que se van usar extends que indica las clases que serán extendidas include que inserta un archivo HTML session que cuando toma el valor true.util.sql y java.

pueden también incluir a jspInit() y jspDestroy(). usando los espacios de nombres de XML <jsp:declaration> declaración </jsp:declaration> Las declaraciones permiten introducir variables y métodos a nivel de página y deben seguir la sintaxis de Java. alternativamente. Las declaraciones de métodos. Las variables declaradas pueden inicializarse y deben estar terminadas por punto y coma. además de aquellos usados en la aplicación.%> <%! public void jspInit() { counter = 0.JSP: Resumen Elementos Básicos Declaraciones La sintaxis de una declaración es <%! declaración %> o. 45 JSP: Resumen Elementos Básicos Ejemplo de Declaración Código de iniciación para un contador en una página JSP que declara una variable y los métodos jspInit() y jspDestroy(): <%! int counter. } public void jspDestroy() { } %> 46 .

usando los espacios de nombres de XML <jsp:scriptlet> scriptlet </jsp:scriptlet> Se puede escribir cualquier fragmento de código Java. Ejemplo de Scriptlets: El siguiente scriptlet produce una secuencia de encabezados con tamaño decreciente: <% for (int i=1. extendido por elementos HTML y no limitado a una línea. Ejemplo de Expresiones La siguiente expresión produce un elemento H1 usado para escribir el texto de un encabezado: <%! int i = 1. Las expresiones pueden incluirse en gran variedad de contextos y no deben terminarse por puntos y comas. usando los espacios de nombres de XML <jsp:expression> expresión </jsp:expression> Las expresiones en JSP permiten que el resultado de la evaluación de una expresión Java se convierta a una cadena de caracteres que será incluida en la página generada.JSP: Resumen Elementos Básicos Expresiones La sintaxis de una expresión es <%= expresión %> o. alternativamente. alternativamente. %> <H<%=i%>>Java Server Pages</H<%=i>> 47 JSP: Resumen Elementos Básicos Scriptlets La sintaxis de un scriptlet es <% scriptlet %> o. i<5. i++) { %> <H<%=i%>>Java Server Pages</H<%=i>> <% } %> 48 .

distintos de los comentarios de HTML. ésta página ha sido accesada <%=loadCounter%> <% if (loadCounter++ == 1) out.*"%> <%! Date loadDate = new Date(). %> <% out. --%> 49 JSP: Ejemplo (contador de accesos) Ejemplo de Contador de Accesos: La siguiente página JSP muestra un contador de accesos a una página.println("Regrese pronto").JSP: Resumen Elementos Básicos Comentarios Los comentarios JSP usan elementos especiales. <%-. Los comentarios pueden usarse también para bloquear la ejecución de ciertos fragmentos de la página JSP. Ejemplo: La siguiente instrucción no será ejecutada (ni siquiera será visible en la página enviada al cliente) <%-.println("vez.println("veces. para que no puedan verse en los documentos enviados al cliente. else out. %> </H2> </BODY> </HTML> contadoryfecha 50 . int loadCounter = 1.<BR>").int i = 1.util.<BR>").Esta página da la fecha y hora cuando fue soliciatada así como el número de accesos --%> <%@ page import="java. %> <HTML> <BODY> <H1>Bienvenido!</H1> <H2>Desde <%=loadDate%>.

util.*”%> <% synchronized (application) { Properties list = application. } %> 52 . reduciendo considerablemente el desempeño de sistemas con muchos procesos.new User(“ana”)) list. list.getParameter(field)%></TD> </TR> <%}%> </TABLE> </BODY> </HTML> 51 formulario programa JSP: Manejo de Concurrencia Concurrencia La directiva page con el atributo isThreadSafe ofrece una forma de evitar los problemas que ocasiona la concurrencia.add(“ana”.*"%> <HTML> <BODY> <%Enumeration fields = request. Una alternativa es usar regiones críticas en scriptlets para sincronizar el acceso a objetos compartidos. <%@page import="java.nextElement().JSP: Ejemplo (uso de formularios) Ejemplo con Formas: El siguiente ejemplo demuestra como obtener los valores de un formulario.%> <TABLE border="1" > <TR><TH>Nombre</TH><TH>Valor</TH></TR> <% while (fields.setAttribute(“users”.getParameterNames().%> <TD align=center><%=field%></TD> <TD align=center> <%=request. <%@page import=”java.hasMoreElements()) { %> <TR> <%String field = (String)fields.getAttribute(“users”).list).util. El problema con este enfoque es que no es escalable.

jsp . la directiva: <%@page isErrorPage=”true” %> Esta indicación permite acceder al objeto exception en la página Error.jsp . 54 . se puede usar una página que indique la naturaleza del error. El atributo errorPage de la directiva page se usa para indicar que la página recibe las excepciones lanzadas por algún scriptlet.JSP: Manejo de Excepciones Manejo de Excepciones JSP posee un mecanismo apropiado para el manejo de errores que ocurren a tiempo de ejecución. el atributo errorPage de la misma directiva indica la página JSP a la cual se redirigirá el objeto implícito exception (de tipo Throwable) que describe el problema. 53 JSP: Manejo de Excepciones… Ejemplo de manejo de excepciones Para manejar errores a tiempo de ejecución. Dicha página debe incluir entre sus directivas la siguiente: <%@page isErrorPage=”false” errorPage=”Error. La página Error. Además.jsp”%> la página redirige a su vez el objeto exception a la página Error.jsp debe contener a su vez.

%> El objeto book puede recuperarse realizando una coerción para convertirlo al tipo apropiado: <% Book book = (Book)session. si el browser no maneja cookies. 55 JSP: Manejo de Sesiones…. Una sesión se identifica por un nombre único de sesión y se almacena en el browser del cliente en forma de cookie. La directiva <%page session=”false”%> indica que en la página no se usarán sesiones. por omisión. los objetos se marcan para su recolección como basura.JSP: Manejo de Sesiones Manejo de Sesiones Por omisión todas las páginas JSP participan en una sesión HTTP. 56 . pero se puede guardar cualquier tipo de objeto identificado por una cadena única de caracteres.getValue(“book”). La sesión mantiene referencias a todos los objetos almacenados pero tan pronto como la sesión es invalidada o el plazo de los objetos expira.putValue(“book”. El siguiente scriptlet hace al objeto Book públicamente disponible para todas las páginas y servlets JSP que compartan la misma sesión: <% Book book = new Book().book). El objeto session (de tipo HttpSession) está disponible para almacenar objetos que persistan a lo largo de la vida de la aplicación. session. Manejo de Sesiones No se pueden guardar tipos simples en una sesión. el objeto session es accesible. la sesión se mantiene por reescritura del URL. Generalmente. %> No hay límite en el número de objetos que se pueden manejar en una sesión. aunque un gran número de ellos reducirá el rendimiento del sistema. la duración de una sesión está limitada a 30 minutos. aunque la duración puede ampliarse regularmente usando el método setMaxIntactiveInterval(int secs). El atributo session de la directiva page se usa para permitir o negar el acceso al objeto session en la página.

out. } %> <FORM TYPE="post" ACTION="session2.getAttribute("bible")).println("<P>Recuperar el libro:" +session.jsp: Ejemplo de una sesion con invalidacion--%> <HTML> <BODY> Sesion <%= session.setMaxInactiveInterval(5).JSP: Ejemplo de Sesiones <%--session.jsp"> <INPUT TYPE="submit" NAME="conservar“ VALUE="conservar"> </FORM> </BODY> session1 </HTML> 58 .getCreationTime()%> <P>Duracion usual de la session:<%=session.getAttribute("bible")).getMaxInactiveInterval()%> <P>Depositar un objeto nuevo <%session.getMaxInactiveInterval()%> <P>Reducción de la duracion de la session a 5 segundos <%session.getAttribute("bible")%> </BODY> <HTML> session 57 JSP: Ejemplo de Sesiones <%--session1.%> <P>Nueva duracion de la session:<%=session.%> <P>Mostrar el objeto depositado:<%=session.getId() %> <% if (session.setAttribute("bible".new String("Sacred Bible")).println("<P>Depositar un nuevo libro:" +session.setAttribute("bible".jsp"> <INPUT TYPE="submit" NAME="invalidar“ VALUE="invalidar"> </FORM> <FORM TYPE="post" ACTION="session3. } else { out.jsp: Ejemplo de una sesion--%> <HTML> <BODY> <H1>Sesion <%=session.getId()%></H1> <P>La session fue creada el <%=session.getAttribute("bible")==null) { session.new String("Sacred Bible")).

jsp: Ejemplo de una sesion con invalidacion--%> <%@page isErrorPage="false“ errorPage="ErrorPage.getValue("bible") %> <P>Invalidar la session <% session. %> <P>Recuperar de nuevo al libro: <%= session. en cualquier momento se puede agregar nuevas cookies a las ya existentes. Además.getId()%> <P>Recuperar el libro: <%= session. en JSP es igual de simple su programación. ésta se puede leer.jsp--%> <HTML> <BODY> Sesion <%=session.invalidate().jsp y session3.jsp son llamados por session1.) Los archivos session2.jsp"%> <HTML> <BODY> Sesion <%=session.getValue("bible") %> <FORM TYPE=”post” ACTION=”session1.jsp”> <INPUT TYPE=”submit” NAME=”submit” VALUE=”regresar”> </FORM> </BODY> session2 session3 </HTML> ErrorPage 59 JSP: Uso de Cookies Uso de cookies Las cookies ya fueron introducidas en la programación con servlets. modificar y alterar su fecha de expiración (cambiando su edad máxima).. Una vez obtenida una cookie de la petición. 60 .getId()%> <P>Recuperar al libro: <%= session. Las cookie se obtienen de la petición HTTP (objeto request) y se mandan a la respuesta HTTP (objeto response) siempre que el cliente acepte las cookies.JSP: Ejemplo de Sesiones (Cont.jsp"> <INPUT TYPE="submit" NAME="submit“ VALUE="regresar"> </FORM> </BODY> </HTML> <%--session3.jsp. <%--session2.getValue("bible") %> <FORM TYPE="post" ACTION="session1.

getMaxAge() %><br> <% cookies[i].getMaxAge() %><br> <% } %> <%! int count = 0. %> <% response. %> Nueva duración en segundos: <%= cookies[i].jsp: Este programa puede comportarse distinto en diferentes browsers--%> <HTML> <BODY> Session <%= session.getName() %> <br> Valor: <%= cookies[i].getCookies().getId() %> <% Cookie[] cookies = request.JSP: Ejemplo de Cookies <%--Cookies. %> </BODY> </HTML> Cookies 61 JSP: Acciones comunes Acciones Comunes Las acciones permiten realizar tareas sofisticadas reduciendo considerablemente la codificación requerida en Java. i < cookies. i++) { %> Cookie con nombre: <%= cookies[i].setMaxAge(5).addCookie(new Cookie("Bob" + count++. Algunas acciones más populares son: usar componentes JavaBeans redirigir mensajes encadenar peticiones incluir peticiones 62 .getValue() %><br> Duración máxima en segundos: <%= cookies[i].length. for(int i = 0. int dcount = 0. Las acciones se manifiestan usando elementos especiales (tags) los cuales promueven la reutilización de componentes mejorando el mantenimiento de la aplicación."Dog" + dcount++)).

las cuales se pueden leer o modificar usando métodos públicos apropiados. Un bean debe identificarse con un nombre con ámbito de sesión antes de que pueda usarse.beans.books” scope=”session”/> crea una instancia del Bean y lo agrega a la sesión. 64 .JSP: Usar componentes JavaBeans El modelo de componentes de JSP se basa en la tecnología JavaBeans que son objetos con un esquema de nombramiento bien definido. la cual consiste de un scriptlet que realiza la iniciación de las propiedades del bean cuando éste se crea.books” scope=”session”> <% iniciación de propiedades del bean %> </jsp:useBean> Una vez declarados los beans. sus propiedades pueden accederse usando el elemento <jsp:getProperty name=”book” property=”name”/> Para cambiar el valor de una propiedad. como variables privadas. el elemento XML <jsp:useBean id=”bookBean” class=”com. si se encuentra este elemento en otra página. el objeto se recuperará entonces de la sesión. Un bean encapsula sus propiedades. <jsp:useBean id=”bookBean” class=”com. se usa el elemento <jsp:setProperty name=”book” property=”name” value=”Thinking in Java”/> En el procesamiento de formas es muy conveniente usar las facilidades que brinda JSP para copiar los valores asociados de los campos a los atributos del bean. 63 JSP: Usar componentes JavaBeans El elemento jsp:useBean también puede tener estructura.beans.

JSP: Usar componentes JavaBeans
El elemento
<jsp:setProperty name=”book” property=”*”/>

copia los valores pero sólo cuando los nombres en ambos (los campos de la forma y los atributos del bean) coinciden. Cuando los nombres no coinciden, la correspondencia se debe hacer explícita:
<jsp:setProperty name=”book” property=”propName” parameter=”parmName”/>

65

JSP: Ejemplo de JavaBeans
El siguiente JSP es un juego para adivinar un número.
Copyright (c) 1999 The Apache Software Foundation. All rights reserved. Number Guess Game Written by Jason Hunter, CTO, K&A Software http://www.servlets.com --> <%@ page import = "num.NumberGuessBean" %> <jsp:useBean id="numguess“ class="num.NumberGuessBean" scope="session"/> <jsp:setProperty name="numguess" property="*"/> <html> <head><title>Number Guess</title></head> <body bgcolor="white"> <font size=4> <% if (numguess.getSuccess()) { %> Congratulations! You got it. And after just <%= numguess.getNumGuesses() %> tries.<p> <% numguess.reset(); %> Care to <a href="numguess.jsp">try again</a>? <% } else if (numguess.getNumGuesses() == 0) { %> Welcome to the Number Guess game.<p>

numguess

66

JSP: Ejemplo de JavaBeans (Cont…)

I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> <% } else { %> Good guess, but nope. Try <b> <%= numguess.getHint() %></b>. You have made <%= numguess.getNumGuesses() %> guesses.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> <% } %> </font> </body> </html>

67

JSP: Ejemplo de JavaBeans (Cont…)
El siguiente JavaBean se usa en el juego de adivinanza de números.
/* Originally written by Jason Hunter */ package num; import java.util.*; public class NumberGuessBean { int answer; boolean success; String hint; int numGuesses; public NumberGuessBean() { reset(); } public void setGuess(String guess) { numGuesses++; int g; try { g = Integer.parseInt(guess); } catch (NumberFormatException e) { g = -1; } if (g == answer) { success = true; } else if (g == -1) {hint = "a number next time";

NumberGuessBean

68

JSP: Ejemplo de JavaBeans (Cont…)
} else if (g < answer) { hint = "higher";} else if (g > answer) { hint = "lower"; } } public boolean getSuccess() { return success; } public String getHint() { return "" + hint; } public int getNumGuesses() { return numGuesses; } public void reset() { answer = Math.abs(new Random().nextInt() % 100) + 1; success = false; numGuesses = 0; } } 69

JSP: Redirigir mensajes
Una petición se puede redirigir hacia otra página JSP, servlet o página HTML estática pasándole el contexto de la página que hace la invocación. El procesamiento continúa hasta el punto en el que ocurre la redirección para entonces detenerse por completo en esa página. El elemento <jsp:forward page=”anotherPage.jsp”/> redirige el procesamiento a la página anotherPage.jsp conservando todo el procesamiento realizado en la página actual. Un elemento <jsp:forward> también puede tener parámetros para proporcionar valores a la página invocada: <jsp:forward page=”anotherPage.jsp”> <jsp:param name=”aName1” value=”aValue1”/> <jsp:param name=”aName2” value=”aValue2”/> </jsp:forward>
70

JSP: Ejemplo, redirigir mensajes
<html> <!-- Copyright (c) 1999 The Apache Software Foundation. All rights reserved. --> <% double freeMem = Runtime.getRuntime().freeMemory(); double totlMem = Runtime.getRuntime().totalMemory(); double percent = freeMem/totlMem; if (percent < 0.5) { %> <jsp:forward page="/jsp/forward/one.jsp"/> <% } else { %> <jsp:forward page="two.html"/> <% } %> </html>

71

JSP: Ejemplo, redirigir mensajes (Cont….)
<!--one.jsp--> <html> <!-- Copyright (c) 1999 The Apache Software Foundation. All rights reserved. --> <body bgcolor="white"> <font color="red"> VM Memory usage < 50%. </html> <!--two.jsp--> <html> <!-- Copyright (c) 1999 The Apache Software Foundation. All rights reserved. --> <body bgcolor="white"> <font color="red"> VM Memory usage > 50%. </html>

72

JSP: Incluir páginas
El elemento <jsp:include> puede usarse para redirigir una petición a cualquier página estática o dinámica que esté en el mismo contexto. La llamada también puede incluir los beans como parámetros de la petición. Por ejemplo, el elemento <jsp:include page=”shopingCart.jsp” flush=”true”/> permite tener acceso a cualquier bean y al contexto dinámico generado por la página invocante; finalmente, el contenido generado se inserta en el lugar del elemento <jsp:include>. La página incluida no puede hacer algunas cosas como encabezados HTTP o hacer galletas.
73

JSP: Ejemplo de incluir páginas
La siguiente página inserta la fecha producida por otra.
<html> <!-- Copyright (c) 1999 The Apache Software Foundation. All rights reserved. --> <body bgcolor="white"> <font color="red"> <%@ page buffer="5k" autoFlush="false" %> <p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %> <p> <jsp:include page="/jsp/include/foo.html“ flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/> :-) </html> El JSP que produce la hora: <!-- Copyright (c) 1999 The Apache Software Foundation. All rights reserved. --> <body bgcolor="white"> <font color="red"> <%= System.currentTimeMillis() %> 74

Puede controlar: Qué clases son importadas.Repaso a la directiva page de JSP : Usada como forma para estructurar los Servlets generados 75 Propósito de la directiva page Dar información de alto nivel a cerca del Servlet que resulte del JSP. Qué tipo MIME se genera. Cómo se maneja el multi-threading. Si el Servlet participa en sesiones. Qué página maneja los errores inesperados. El tamaño y compartimiento del buffer de salida. 76 . Qué clases el Servlet extiende o hereda.

Notas: Aunque las páginas JSP pueden estar casi en cualquier parte del servidor. las clases usadas por JSP deben estar en directorios comunes del Servlet.…. con Tomcat esto es: $CATALINA_HOME/Webapps/ROOT/Web-INF/classes 77 Ejemplo del atributo import mab.El atributo Import Formato: <%@ page import=“package.class” %> <%@ page import=“paqckage1. package. Por ejemplo.* 78 .classN”%> Propósito: Generar las declaraciones para importar clases en la parte superior del Servlet.

Ejemplo del atributo import Primer Acceso Acceso Posterior 79 El atributo contentType Formato: <%@ page contentType=“MIME-Type”%> <%@ page contentType=“MIME-Type. 80 . charset=Character-Set”%> Proposito: Especifica el tipo MIME de la página generada por el Servlet que resulta de la página JSP .

com Larry Ellison ellison@microsoft. de modo que el sistema pueda prevenir accesos concurrentes – instruye al Servlet a implementar un SingleThreadModel.Son tabs en lugar de espacios entre las columnas --%> 81 El atributo isThreadSafe Formato: <%@ page isThreadSafe=“true”%> <%-.com <%@ page contentType="application/vnd.org Larry Brown brown@coreWebprogramming.baker@computer.Default--%> <%@ page isThreadSafe=“false”%> Propósito: Le dice al sistema cuando el código no es threadsafe. Notas: Por defecto es true – El sistema asume que se tienen actualizaciones a campos y otros datos compartidos sincronizadamente.El atributo contentType First Last Email Address Mark Baker mark.com Bill Gates gates@sun.ms-excel" %> <%-. 82 . Proporcionando el valor false se puede afectar el buen desempeño.

%> 83 Código Threadsafe <%! private int idNum = 0.println(“Your ID is “ + userID + “. 84 .Código Non-threadsafe ¿Cuál es el problema con este código? <%! private int idNum = 0.println(“Your ID is “ + userID + “. out. idNum = idNum + 1.”). idNum = idNum + 1. } %> acceso seguro a una variable compartida usando la declaración de sincronización normal.%> <% synchronized(this) { String UserID = “userID” + idNum. out.%> <% String UserID = “userID” + idNum.”).

isErrorPage: Indica que la página se puede utilizar como página del error. Extends: Cambia la clase padre del Servlet generado. 85 Incluyendo archivos en documentos JSP 86 . Buffer: Cambia el tamaño minimo del buffer usado por el JspWriter. Error: Indica una página para manejar los errores inesperados.Otros atributos de la directiva de page Session: Permite Elegir no participar en sesiones. Autoflush: Requiere al desarrollador explícitamente vaciar el buffer.

El contenido JSP no puede afectar la página principal – Solamente es utilizada la salida de JSP incluido. HTML o texto plano. Permitir actualizaciones al contenido incluido sin cambiar la página principal. 87 Ejemplo de inclusión de páginas 88 .Incluyendo páginas al momento de la petición Formato: <%jsp:include page=“URL relativo” flush=“true”%> Propósito: Reutilizar contenido JSP.

donde el contenido JSP afecta la página principal. Notas: Los servidores no tiene que detectar cambios en los archivos incluidos.Navbar. y en la práctica muchos no lo hacen – de otra manera se necesita cambiar los archivos JSP cuando los archivos incluidos cambian.jsp modified 27/01/03--%> <%@include file=“Navbar.Ejemplo de inclusión de páginas 89 Incluyendo archivos al momento de la traducción de la página. Formato: <%@include file=“Relative URL”%> Propósito: Reutilizar contenido JSP en múltiples páginas.jsp%> 90 . Puede utilizar mecanismos específicos del sistema operativo tal como el comando touch de UNIX: <%-.

%> <P> <HR> This page &copy. It was last accessed from <%= accessHost %> at <%= accessDate %>.jsp <%@ page import="Java.getRemoteHost(). 2000 <A HREF="http//www.Date" %> <%-. %> <% accessDate = new Date().com</A>.Los siguientes viene a ser campos en cada Servlet que resulta de una página JSP que incluye este archivo.my-company. private Date accessDate = new Date().com/">my-company. --%> <%! private int accessCount = 0.jsp” %> </BODY> </HTML> 92 . private String accessHost = "<I>No previous access</I>". This page has been accessed <%= ++accessCount %> times since server reboot. %> 91 Usando el ContactSection Embebido en la página Web: <HTML> <BODY> <HR> <H1> My Page</H!> <HR> <%@ include file=“contactSection.Contenido JSP reutilizable: Ejemplo: ContactSection.util. <% accessHost = request.

0 fue liberado en el 2004 y trajo nuevas mejoras y ayudas adicionales.Creando bibliotecas de etiquetas JSP personalizadas Los bibliotecas de etiquetas JSP (JSP TL) permiten definir y utilizar etiquetas JSP similares a como se definen y usan en funciones típicas en los lenguajes de programación.5 comenzó a darle soporte a esta versión en el 2004. JSP 2. Tomcat 5. fueron pasos lógicos en la evolución hacia una rápida y mantenible implementación de páginas Web en Java. El debut de JavaServer Pages (JSP) seguido por la inclusión del soporte para etiquetas JSP. 93 Bibliotecas de etiquetas JSP La introducción de los Servlets en 1996 hizo a Java una opción razonable para el desarrollo de páginas Web dinámicas. 94 . Pero la liberación de JSTL (JSP Standard Tag Library) hecha a mediados del 2002 representa tal vez el paso más grande en cuanto a velocidad y simplificación del proceso de desarrollo.

jar. simplemente copie los archivos JAR que están en el directorio lib de la distribución al directorio de la aplicación Web-INF/lib.org/taglibs/ Para utilizar el estándar Taglib de la distribución Jakarta Taglibs. las etiquetas JSTL restantes deben ser tratadas como XML válido. todas las etiquetas JSTL es XML válido: Eso significa que si trata el contexto de una página fuera de las etiquetas JSTL como una plantilla de texto (el cual normalmente será HTML). Standard Taglib JSTL implementation classes: standard. XML y SQL) y soporte para un lenguaje de expresiones (EL: Expression Language). JSTL 1. JSTL proporciona un conjunto de cuatro bibliotecas estándares (core.jar. nos recuerdan explícitamente que están agregando comportamiento dinámico a una página que de otra manera sería estática. 96 . tales como las clases TagLibraryValidator y extensiones a herramientas para creación de páginas que soportan biblioteca de etiquetas. llamándolas acciones. Un objetivo primario del diseño para JSTL y de EL fue simplificar el desarrollo e implementación de las páginas Web. Una etiqueta JSTL corresponde a alguna acción.La biblioteca de etiquetas JSP Las páginas JSTL son también páginas JSP: JSTL es justamente un súper conjunto de la funcionalidad del JSP. 95 ¿Cómo obtener la Librería de Etiquetas? El proyecto Apache Taglibs es un repositorio opensource para las bibliotecas de etiquetas personalizadas JSP y proyectos asociados.0 API classes: jstl. internationalization/format. Jakarta Taglibs http://jakarta.apache. También. Puede usarse tanto expresiones JSP como JSTL EL.

Esto consiste en agregar directivas <taglib> dentro de la directiva principal <Web-app>.Instalando JSTL Para utilizar el JSTL. se deberá instalar JSTL en Tomcat. se debe tener un contenedor JSP 1. Uno de los contenedores JSP mas comúnmente utilizados es el servidor Web Apache Tomcat . Copie los archivos JSTL TLD al directorio WEB-INF de Tomcat: El directorio Web-INF normalmente es: $CATALINA_HOME\ROOT\WEB-INF\tags\. El URL principal para el JSTL es http://Java. Para utilizar JSTL.sun.2 (o superior) instalado.xml para incluir los archivos .com/products/jsp/jstl/ Para usar JSTL. notarás que hay ocho con la extensión TLD que deberán ser copiados al directorio WEB-INF. 98 .xml y agregar una entrada para los archivos tag libraries que usted agregue. se deberá descomprimir los archivos de la distribución e instalarlos en el lugar correcto dentro de Tomcat. Usando sólo Tomcat podrá usar código JSP normal. 97 Instalando el JSTL Copie el archivo JAR del JSTL al directorio lib de Tomcat: Si usas Windows la localización del directorio lib normalmente es $CATALINA_HOME\Webapps\ROOT\WEB-INF\lib.tld: Finalmente se deberá modificar el archivo Web. JSTL se puede obtener del mismo lugar que el Tomcat. Si tu examinas los archivos de la distribución JSTL. Modificar el archivo Web.

jsp para ver su página. Esto puede ser hecho creando una página JSP que utilice JSTL. se debe ahora poder visualizar http://localhost:8080/XXXX.Instalando JSTL – Web. 100 . Una vez que el servidor Tomcat es iniciado.xml 99 Instalando JSTL Después de completar los tres pasos anteriores. esta listo para probar la instalación del JSTL. ($CATALINA_HOME\Webapps\ROOT). Se debe de colocar el archivo JSP dentro del directorio raíz del Web.

102 . JSTL son en realidad cuatro bibliotecas de etiquetas. entradas y salidas basicas. Formatting/Internationalization Tag Library – etiquetas que se utilizan para analizar datos. El Visualizador Web interpretara estas etiquetas como etiquetas desconocidas del HTML. Si JSTL no esta interpretando sus etiquetas. Ejemplos de esta biblioteca de etiquetas incluyen ciclos. Algunas de estas etiquetas analizarán datos. éstas serán pasadas directamente al visualizador Web.Instalando JSTL Si no se tiene instalado correctamente el JSTL. Debido a que XML es utilizado en muchas aplicaciones Web. 101 Bibliotecas de etiquetas JSTL Se habla comúnmente de JSTL como una biblioteca de etiquetas simple. La mayoría de los visualizadores Web normalmente ignoran estas etiquetas desconocidas. tales como fechas basadas en forma diferente dependiendo de la localizacion. evaluacion de expresiones. normalmente no habrá mensaje de error. XML Tag Library – etiquetas que se pueden utilizar para tener acceso a elementos XML. Estos bibliotecas son: Core Tag Library – etiquetas que son esenciales para cualquier aplicación Web. Database Tag Library – etiquetas que pueden ser utilizar para tener acceso a las bases de datos con SQL. el procesamiento de XML es una característica importante de JSTL.

104 . Estas características son importantes para aplicaciones en el Web. Las expresiones en JSTL son siempre parte de valores de atributos en las etiquetas JSTL: Las expresiones pudieran ser la única parte del atributo o pudieran estar combinadas e incrustadas en literales de cadena. De la manera como EL está diseñado. Los atributos de JSTL pueden también contener simples literales de cadenas. y el visualizador siempre envía los parámetros de petición como valores de texto. (EL) fue inspirado en JavaScript y en cierto grado en XPath. donde la entrada esta principalmente en forma de parámetros de petición: Los cuales pueden estar presentes en algunas peticiones pero en otras no. rara vez necesitamos preocuparnos por ausencia de valores o conversión de tipos. pero EL es mucho más flexible con variables sin valor (null) y realiza más conversiones de tipos en forma automática. mientras que la aplicación a menudo necesita usarlos como números o valores booleanos (falso o verdadero). Cualquier Bean contenido en uno de los ámbitos del JSP (página. provee un conjunto amplio y flexible de características. 103 Lenguaje de expresiones (EL) Una expresión EL contiene variables y operadores. petición. Todas las expresiones EL están encerradas en ${ }. Las expreesiones del EL combinadas con etiquetas JSTL tomadas de las cuatro bibliotecas estándares.Lenguaje de expresiones (EL) (EL) define un lenguaje para expresar expresiones simples en una sintaxis que sea fácil de aprender. sesión o aplicación) puede ser utilizada como una variable EL.

se utiliza el operador que accede a la propiedad: ${order.Lenguaje de expresiones (EL) Aquí tenemos a EL que agrega 5 a una variable llamada amount: ${amount + 5} Si se desea agregar 5 al valor de una propiedad de un Bean. como se llaman formalmente): <c:out value="${order.Map). en este caso) en el Bean o colección especifica (order. 105 Lenguaje de expresiones (EL) Como alternativa. el cual puede ser un Bean o Java. se puede usar el operador de acceso a elementos de un arreglo: ${order['amount'] + 5} El valor entre los corchetes debe ser tanto una cadena para el nombre de la propiedad (como en este ejemplo) o una variable (o aun una sub-expresión EL completa ) que mantiene el nombre de la propiedad.amount + 5} EL operador de acceso (punto) le dice a EL que busque por la propiedad indicada (amount.amount + 5}"/> 106 . en este caso.util. Las expresiones EL pueden ser utilizadas para asignar valores a cualquier atributo de acción estándar o personalizado de JSP que acepte un valor dinámico (o valores de atributo request-time.

Para las propiedades indizadas.aProperty} ${anObject["aPropertyName"]} ${anObject[aVariableContainingPropertyName]} 108 . los elementos pueden ser accedidos con la sintaxis siguiente: ${alist[4]} ${aList[someVariable]} 107 Lenguaje de expresiones (EL) Las propiedades de JavaBeans y los elementos de Java. incluyendo arreglos y clases Java.Lenguaje de expresiones (EL) EL proporciona soporte para acceder propiedades de objetos y elementos de colecciones.util. un conjunto de objetos implícitos y utilizar operadores relacionales lógicos y aritméticos. podemos acceder a una propiedad llamada aProperty en un JavaBean o una entrada a Map con la clave aProperty. En la tercera expresión (note que no hay comillas). tenemos acceso a un elemento de anObject con un nombre contenido en la variable aVariableContainingPropertyName: ${anObject.Map (los cuales representan un conjunto de pares nombre/valor) pueden ser accedidos usando unas de la siguientes maneras: En las primeras dos expresiones.List.util.

util.Cookie value per cookie. A collection (a Java. A collection (a Java.Map) of all page scope variables.util.Servlet.Map) of all request parameter values as a String array per parameter. A collection (a Java.Map) of all request cookie values as a single Javax.http.Map) of all request parameter values as a single String value per parameter. A collection (a Java. providing access to various request data.Map) of all application initialization parameter values as a single String value per parameter.jsp.util.Map) of all request header values as a single String value per header. An instance of the Javax.util.util.Map) of all request header values as a String array per header.util.Map) of all application scope variables.Map) of all request scope variables. A collection (a Java.util.Servlet. A collection (a Java. A collection (a Java.util.Map) of all session scope variables.Lenguaje de expresiones (EL) Existe un numero de variables implícitas de EL: Variable name pageScope requestScope sessionScope applicationScope param paramValues header headerValues cookie initParam pageContext Description A collection (a Java. porque son parecidos a los utilizados por la mayoría de los lenguajes: 110 .PageContext class. 109 Lenguaje de expresiones (EL) Los operadores describen lo que se desea hacer con las variables. Los operadores que se pueden usar en una expresión EL parecerán familiar si ya se ha utilizado algún lenguaje de programación antes.util. A collection (a Java. A collection (a Java.util.

0 “bibliotecas gemelas" (una que acepta expresiones EL y un conjunto que acepta expresiones de Java) han sido remplazadas por un conjunto sencillo de bibliotecas que pueden ser utilizadas tanto con EL o con expresiones Java. Subtraction or negation of a value. Test for logical OR. Cuando se importa cualquier biblioteca de etiquetas dentro de una página JSP. Division. Addition. con sus convenciones de prefijos definidos JSTL. Test for an empty variable value: null. A function call. func(args) 111 Bibliotecas de etiquetas JSTL JSTL 1. Access an array or List element. Unary Boolean complement. Map. Note que se podría definir sus propios prefijos. 112 . Group a subexpression to change the evaluation order. Multiplication.Lenguaje de expresiones (EL) Operator . Test for less than or equal. an empty String. Conditional test: condition ? ifTrue : ifFalse. or Collection without entries). se enumeran en la diapositiva siguiente. [] () ?: + * / or div % or mod == or eq != or ne < or lt > or gt <= or le >= or ge && or and || or or ! or not empty Description Access a Bean property or Map entry. Test for less than. or an array.0. El cambio más visible es que el JSTL 1. Test for equality.1 fue pensado para acoplar JSTL con JSP 2. Las cuatro bibliotecas de etiquetas estándar. Test for greater than or equal. Test for greater than. Test for inequality. where func is the function name and args is zero. Modulo (remainder). se define un prefijo que señala un espacio de nombres que corresponde a las etiquetas en esa biblioteca. pero no existe una buena razón para esto. Test for logical AND. one or more comma-separated function arguments.

sun.Bibliotecas de etiquetas JSTL biblioteca Core XML processing I18N formatting Database access Functions URI http://Java.com/jstl/core-rt http://Java. Para tener acceso a estas bibliotecas.com/jstl/xml http://Java.com/jstl/ea/core-rt" %> 114 . Un conjunto toma ventaja del nuevo lenguaje de expresiones y el otro no.sun.com/jstl/functions Prefijo c x fmt sql fn 113 Bibliotecas de etiquetas JSTL Otro punto por mencionar acerca de la biblioteca de etiquetas JSTL es que hay realmente dos versiones de la mayoría de las etiquetas.sun.sun.com/jstl/sql http://Java.sun. simplemente añada -rt al final del URI que señala a la biblioteca: <%@ taglib prefix="c" uri="http://java. Las etiquetas que no hacen uso de un lenguaje de expresiones utilizan expresiones request-time : Esto es útil si se desea la flexibilidad proporcionada por las etiquetas estándares pero no queremos utilizar el lenguaje de expresiones soportado aun.sun.com/jstl/fmt http://Java.

documentos con elementos del XHTML y de JSP. 116 . las directivas JSP y los elementos scripting en un documento JSP deben estar escritos con una sintaxis diferente a la de una página regular JSP. Para satisfacer los requerimientos de bien formado. Documentos JSP los cuales son documentos XML bien formados.Biblioteca de etiquetas JSTL Para usar la biblioteca de etiquetas core del EL en una página. añada un prefijo a cada etiqueta en la página con el prefijo que se ha señalado en la declaración que se incluyó: <c:out value="${anExpression}"/> 115 Reglas más flexibles del formato de documentos JSP La especificación JSP soporta dos tipos de páginas JSP: páginas JSP regulares conteniendo cualquier tipo de texto o marcado y. incluya la directiva del siguiente ejemplo en la parte superior de su página: <%@ taglib prefix="c" uri=http://java. es decir.sun.com/jstl/core-rt %> Para usar las etiquetas que están en esa librería core.

Reglas más flexibles del formato de documentos JSP Página JSP regular <%@ page attribute list %> <%@ include file="path" %> <%! declaration %> <%= expression %> <% scriptlet %> Documento JSP <jsp:directive.page attribute list /> <jsp:directive.include file="path" /> <jsp:declaration>declaration</jsp:declaration> <jsp:expression>expression</jsp:expression> <jsp:scriptlet>scriptlet</jsp:scriptlet> 117 Ejemplos JSTL Sencillos 118 .

<%@ taglib prefix="c" uri="http://java.Ejemplo (a) Como ejemplo simple considere el siguiente fragmento de código que utiliza JSTL. La acción set crea una variable llamada browser y le asigna el valor de la propiedad User-Agent. La acción out imprime entonces el valor de la variable browser.sun.com/jstl/core" %> <html> <head> <title>Ejemplo Simple</title> </head> <body> <c:set var="browser" value="${header['User-Agent']}"/> <c:out value="${browser}"/> </body> </html> 119 Ejemplo (a) 120 .

value}"> <c:out value="${val}"/> </c:forEach> <p> </c:forEach> </body> </html> 121 Ejemplo (b) 122 .com/jstl/core-rc" %> <html> <head> <title>Objetos implictos JSTL</title> </head> <body bgcolor="#FFFFCC"> <h3>Header info:</h3> <c:forEach var="head" items="${headerValues}"> param: <c:out value="${head.Ejemplo (b) <%@ taglib prefix="c" uri="http://Java.key}"/><br> values: <c:forEach var="val" items="${head.sun.

<x:choose>. 123 Etiquetas XML Las acciones del flujo de control XML son las mismas que las acciones del core discutidas anteriormente. and <x:forEach>. En este ejemplo. XPath utiliza expresiones del tipo path para identificar nodos en un documento XML.jsp utiliza las bibliotecas de etiquetas core y XML para procesar un documento XML. Xpath es un lenguaje para definir partes de un documento XML. e incluyen <x:out>. 124 . De hecho. Las acciones XML core son parecidas a las acciones proporcionadas por core discutidas anteriormente. ejemplo: <x:forEach select="$output/portfolio/stock"> <x:out select="price"/> </x:forEach> En la diapositiva siguiente xml-ex1. <x:set>. Estas incluyen: <x:if>. and <x:parse>.Etiquetas XML XML esta siendo cada vez mas importante para los creadores de páginas y JSTL proporciona acciones XML que conducen las necesidades básicas de estos desarrolladores. Las acciones XML pueden ser divididas en core (núcleo). <x:when>. La principal diferencia entre las acciones core discutidas antes y las acciones XML core es que las acciones XML soportan expresiones XPath. La principal diferencia es que utilizan el atributo select para especificar expresiones XPath. Entonces una expresión XPath se utiliza para seleccionar artículos dentro del documento. control de flujo (control flow) y acciones de transformación. las acciones XML están basan en expresiones XPath. el documento XML es incrustado dentro de la página y la etiqueta <x:parse> es utilizada para analizar el documento. <x:otherwise>. mientras las acciones core no.

</author> <price>17. Z.</author> <price>24.com/jstl/core-rt" %> <%@ taglib prefix="x" uri="http://Java.sun.com/jstl/x-rt" %> <html> <head><title>JSTL Support for XML</title></head> <h3>Books Info:</h3> <c:set var="xmltext"> <books> <book> <title>Book Title A</title> <author>A.99</price> </book> </books> </c:set> 125 xml-ex1.95</price> </book> <book> <title>Book Title B</title> <author>X.jsp – ii <x:parse xml="${xmltext}" var="output"/> <b>The title of the first book is</b>: <x:out select="$output/books/book[1]/title"/> <br> <b>The price of the second book</b>: <x:out select="$output/books/book[2]/price"/> </body> </html> 126 .jsp . B. Y. C.xml-ex1.sun.i <%@ taglib prefix="c" uri="http://Java.

Javacourses.com/jstl/x-rt" %> <html> <head> <title>JSTL Support for XML</title></head> <h3>Portfolio</h3> <c:import url="http://www.jsp <%@ taglib prefix="c" uri="http://Java.com/jstl/core-rt" %> <%@ taglib prefix="x" uri="http://Java.sun.com/stocks.jsp 128 .sun.xml" var="xmldoc"/> <x:parse xml="${xmldoc}" var="output"/><p> <table border="2" width="50%"> <tr> <th>Stock Symbol</th> <th>Company Name</th> <th>Price</th> </tr> <tr> <x:forEach select="$output/portfolio/stock" var="item"> <td><x:out select="symbol"/></td> <td><x:out select="name"/></td> <td><x:out select="price"/></td></tr> </x:forEach> </table> </body> </html> 127 xml-ex2.xml-ex2.

Extendiendo el JSTL También es posible que se pueda utilizar JSTL como base para desarrollar sus propias etiquetas. las acciones personalizadas podían solamente ser implementadas como clases de java. dejándolas con esto fuera del alcance de los no programadores. o.Servlet.jstl.Servlet. Javax.IteratorTagSupport. Le permite a implementar fácilmente etiquetas de iteración. Como archivos de texto regular conteniendo elementos de JSP.jsp. Otro problema con la implementación en java de las acciones personalizadas es que era forzado a imprimir código HTML con llamadas a println() para producir contenido complejo – El mismo problema que JSP se supone que resuelve.ConditionalTagSupport. Algunas clases abstractas son proporcionadas de tal manera que asisten en el desarrollo rápido de etiquetas y promueven la integración de sus propios etiquetas personalizados con el conjunto de etiquetas JSTL.0 de la especificación JSP. 130 . 129 Desarrollando bibliotecas de etiquetas personalizadas como archivos de etiquetas Comenzando con la versión 2. Mediante extender: Javax. se podría escribir una etiqueta condicional simplemente implementado un método que regrese un valor booleado correspondiente con el comportamiento condicional deseado de la etiqueta. se puede construir sus propias etiquetas personalizados que hagan uso de los mecanismo EL de JSTL.jsp. Por ejemplo.core.jstl. las acciones personalizadas de la biblioteca de etiquetas pueden ser implementadas de dos maneras: Como clases de java o.core. En versiones anteriores.

También hay algunas directivas JSP que pueden ser permitidas en un archivo de etiquetas. Se debe utilizar un archivo con extension . Todos los elementos JSP que se pueden utilizar en un archivo JSP también pueden ser utilizados como un archivo de etiqueta. el archivo de etiquetas se utiliza igual que las acciones personalizadas implementadas en java que se han visto anteriormente. como lo veremos mas adelante. con excepción a la directiva page (un archivo de etiqueta no es una página). crear un archivo de etiquetas no es diferente de crear una página JSP. 131 Invocación de una etiqueta Obtain handler doStartTag() Set properties setPageContext() setParent() EVAL_BODY_INCLUDE SKIP_BODY Process body Set attribute values SKIP_PAGE doEndTag() EVAL_PAGE release() release() Stop Continue 132 . Una vez creado e instalado.tag* para identificar este tipo de archivo en el contenedor Web.Creando y usando un archivo de etiquetas Un archivo de etiquetas es un archivo de texto que contienen elementos JSP implementando la funcionalidad de acciones personalizadas. Aparte de esto.

134 . que una herramienta de desarrollo de páginas puede mostrar al diseñador. ${now. ejemplo: el mismo tipo de información que se especifico con la directiva page en las página JSP.tag <%@ tag body-content="empty" %> <%@ taglib prefix="c" uri="http://java. queremos decir que el manejador de etiqueta lee o modifica los contenidos del cuerpo o causa evaluación interactiva del cuerpo.sun. Se puede utilizar atributos de esta directiva para especificar una descripción. un icono o un ejemplo. así como información relacionada al código del scripting. Otros atributos le permiten especificar si las expresiones EL deben ser procesadas.year + 1900} My Company Este archivo de etiquetas inserta una declaración de copyright con el año actual en la página que se llama.Date" /> Copyright &copy.com/jstl/core_rt" %> <jsp:useBean id="now" scope="application" class="Java. La primera línea es una directiva de etiqueta.util.Un archivo de etiquetas sencillo copyright. 133 Nota de la etiqueta body-content Un manejador de etiquetas para una etiqueta con un cuerpo es implementado de manera diferente dependiendo si el manejador de etiqueta necesita interactuar con el cuerpo o no: Por interactuar.

las acciones estándares y las acciones personalizadas. 135 Un archivo de etiquetas sencillo El resto del archivo de etiquetas luce como una página ordinaria JSP.util. Si es empty (vació). todas son permitidas. los autores de archivos de etiquetas sólo se preocupan del atributo que define el contenido del cuerpo (body-content): Este atributo dice cómo el cuerpo de la acción personalizada debe manejarse. el intentar usar el cuerpo de la acción personalizada da como resultado un error de sintaxis.Un archivo de etiquetas sencillo En la mayoría de los casos. Declara que utiliza la biblioteca JSTL core. las expresiones EL. el texto de plantilla. Si el atributo se establece a tagdependent el cuerpo del elemento de la acción es tratado como un texto de plantilla (ejemplo. los elementos de la acción y las expresiones EL en el cuerpo no son procesadas. o tagdependent. y debe tener uno de los siguientes valores: empty. una acción estándar <jsp:useBean> para crear una instancia de la clase Java. El valor scriptless significa que el cuerpo puede contener algunos elementos JSP : En otras palabras.year + 1900}. scriptless (por defecto). son manejados como texto plano).* 136 .Date que representa la hora actual y finalmente hace salir el texto estático mezclado con un valor dinámico (el año actual) generado por la expresión EL: ${now.

Por defecto.tag htmlFormat. La carpeta mytags contiene el archivo copyright..tag mas otros tres archivos tag.tag bar.tag forEvenAndOdd..tag motd. así que el archivo copyright. Cada directorio que contiene archivos tag files representa un tag library separado: Web-INF/tags/ mytags/ copyright.tag representa el nombre de la acción personalizada llamada copyright en la librería mytags.tag myothertags/ foo. <my:copyright/> </body> </html> 138 .tag Aquí tenemos dos carpetas de tag: mytags y myothertags. 137 Mas ejemplos Una página JSP debe declarar que utiliza un tag library representada por los archivos tag en la estructura de la aplicación Web con una directiva ligeramente diferente que el usado anteriormente: <%@ page contentType="text/html" %> <%@ taglib prefix="my" tagdir="/Web-INF/tags/mytags" %> <html> <body bgcolor="white"> .Notas Los archivos Tag pueden ser colocados directamente en la aplicación Web bajo la estructura del directorio o subdirectorio Web-INF/tags. el nombre de las acciones implementadas personalizadas por el archivo tag es el nombre de archivo menos la extensión .tag.

BodyTag una extensión del tag dando acceso al manejador al cuerpo. puesto que todos los directorios tag de la biblioteca deben comenzar con este path. release() libera recursos 140 . El Tag Handler tiene dos métodos de acción principales: doStartTag() procesa el comienzo del tag de esta acción. Los archivos tag pueden ser empaquetados en archivos JAR. Puede parecer redundante tener que especificar la parte del path /Web-INF/tags. el grupo que creó la especificación JSP decidió requerir esto para tener consistencia con otros atributos que toman valores del path. Aunque es costoso. Llamado después de retornar de doStartTag. doEndTag() procesa el final del tag de esta acción. 139 El Tag Handler Hay dos interfases que describen al tag handler: Tag usado por los manejadores de etiquetas simples no interesados en la manipulación del contenido del cuerpo. El valor del atributo tagdir es la trayectoria relativa del contexto al directorio que contiene los archivos tag para la biblioteca. Esto requiere un poco mas de trabajo y es sobre todo de interés para los archivos tag prever ser reutilizado en muchas aplicaciones.Mas ejemplos Note que el atributo tagdir es utilizado en lugar que el atributo del URI.

el más importante es el método doTag(). El código en la diapositiva siguiente muestran este método en acción. Proporciona implementacion de los cinco métodos de esta interfaz. 142 . Esta clase es una muy buena implementación de la interfase SimpleTag.Otros ejemplos Tags personalizados 141 Tag Handler Hola mundo Las subclases simples de tag handler soportan la llamada a las clases SimpleTagSupport. El método doTag() en SimpleTagSupport realmente no hace nada – hasta que el desarrollador sobreescribe este metodo y codifica la funcionalidad de su tag.

} Compile y sustituya la clase en \Web-INF\classes\mab 143 Tag Handler Hola mundo Esta clase utiliza simplemente doTag() para imprimir el ‘Hola mundo’ al stream de salida. import Javax. world!" ).jsp.SimpleTagSupport. import Javax.tagext.Tag Handler Hola mundo // Greeter.Java package mab.write( "Hello.jsp. import Java. public class Greeter extends SimpleTagSupport { public void doTag() throws JspException.jar.Servlet. IOException { getJspContext().getOut().jar and Servlet-api. Las dos declaraciones de importación nos dan acceso a todas las clases requeridas: Usted necesitara el Servlet y las clases JSP API en su classpath para que este código compile: Los usuario de Tomcat encontrarán estos en common/lib como jasper-api.Servlet. esta clase extiende la clase SimpleTagSupport y espera que usted sobrescriba el método doTag(). Por estas razones.io. 144 .IOException.JspException.

Tag Handler Hola mundo Otra consecuencia de extender la clase es que un método llamado setJspContext() fue llamado por el contenedor antes del doTag(). Utilizamos este método para conseguir el acceso al stream de salida del JSP. 145 Tag Handler Hola mundo Mapeo de tags a clases: Asumimos que esta clase esta en /WebINF/classes.tags.tld. el siguiente paso debería escribir el archivo TLD.mytags. El TLD (Tag Library Descriptor) es un archivo XML que el contenedor utiliza para trazar los tags personalizados de sus JSPs a su correspondiente implementación de clases simples del tag handler. En la siguiente presentación veremos un demo. un archivo simple del TLD. traza una un tag llamado 'greeter' a la clase 'demo. que cuando esta instalado en el directorio /WebINF/tags/mytags.Greeter'. 146 . que hizo la información actual del contexto del JSP disponible vía getJspContext().

El elemento de uri.sun.dtd"> <!-.2</jsp-version> <short-name>Demo Tag Library</short-name> <tag> <name>greeter</name> <tag-class>mab.demo. La parte interesante es el contenido del elemento del <tag>. entre otras cosas.Greeter</tag-class> <body-content>empty</body-content> </tag> </taglib> Drop this file in Web-INF/tags/mytags/ 147 Tag Handler Hola mundo Mapeando Tags a clases: Los elementos de tlib-version y short-name son bastante directos y se relacionan con la versión del tag library y con el prefijo por defecto del tag respectivamente.com/j2ee/dtds/Web-jsptaglibrary_1_2. sin embargo vale la pena discutirlo: Cuando se inicializa. Es donde. nosotros no tenemos ninguna necesidad de editar el archivo Web. el contenedor usa una característica de auto-discovery para trazar todos los elementos de uri a TLD correspondiente.//DTD JSP Tag Library 1.0"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems.2.tld --> <?xml version="1.Tag Handler Hola mundo <!– demo.tld --> <taglib> <tlib-version>1</tlib-version> <jsp-version>1. y determinar si nuestro tag se le debe o no permitir acceso al contenido del cuerpo. As of JSP 1. 148 .xml para desplegar un tag personalizado – la caracteristica del auto-discovery nos ahorra esta inconvenienza. nosotros podemos dar a nuestro tag un nombre.2//EN" "http://Java. Por lo tanto esta cadena debe ser única dentro de la aplicación. Inc. definir la clase asociado con el tag handler.

sun.0"?> <jsp:root xmlns:jsp="http://Java. si el atributo uri no resuelve la traza al contenedor. donde se localiza nuestra clase simple de la implementación del tag handler. por tanto.tld" version="1.sun. esto se toma con cuidado. --> <my:greeter /> </body> </html> </jsp:root> 150 .2"> <jsp:directive.page contentType="text/html"/> <html> <head><title>JSP Page</title></head> <body> <!-.com/jstl/core" xmlns:my="urn:jsptld:/Web-INF/tags/mytags/demo. Generalmente.jsp --> <?xml version="1.greeter. El contenedor traza alternadamente puntos a la información del TLD.Tag Handler Hola mundo Cortesía de las directivas taglib el atributo uri.prints Hello World.com/JSP/Page" xmlns:c="http://Java. se asume el path del archivo: Esto es útil solo cuando los valores idénticos del uri se encuentran en diferentes archivos TLD. tenemos dicho que el JSP esta donde esta nuestro archivo TDL y. 149 Hello World Tag Handler Este código muestra como podemos utilizar nuestra etiqueta greeter en un JSP: <!-. El atributo uri traza directamente a uno de los mappings del contenedor creado cuando se inicializo.

jsp es solicitada por primera vez. 151 Ejemplo final de Tag 152 . inicializara el objeto y llamara al método doTag() .class : Observe que el archivo TLD es proporcionado en el elemento jsp:root. Después el servidor Tomcat sustituirá el tag personalizado con un cierto código de Java al instanciar un objeto de la clase tag. pageContext. Cuando el tag personalizado <my:greeter/>es encontrado durante la traducción. Para obtener datos de salida en la página. el servidor Tomcat hará un seguimiento del archivo TLD para localizar al archivo Greeter.getOut(): Esta es la manera de como "Hello world!" es producido.Tag Handler Hola mundo Aquí esta mi comprensión de cómo trabaja el tag personalizado usando el tag "Hello world!" como ejemplo: Cuando la página greeter. el servidor Tomcat traducirá la página JSP a una clase de Java. usted puede usar el stream del objeto pageContext proporcionado por la extinción tag JSP.

Ejemplo final de Tag 153 Ejemplo final de Tag 154 .

que puede retornar una bandera a la petición para saltar el cuerpo y realizar una lógica condicional del cuerpo. Llamando a doAfterBody() del objeto tag. que puede retornar una bandera a la petición para procesar el cuerpo otra vez y realizar un ciclo lógico del cuerpo. Ver mis otras notas sobre como los valores de los atributos son pasados al objeto tag. Procesamiento del cuerpo del tag. Llamando a release() del objeto tag. 156 . Llamando a doEndTag() del objeto tag. Llamando a doStartTag() del objeto tag. Llamando a setPageContext() y setParent() del objeto tag. Procesando los atributos del tag.Ejemplo final de Tag 155 Ejemplo final de Tag Los pasos usados por la extensión JSP para facilitar el procesamiento de los tag personalizados pueden ser resumido como sigue: Instanciamiento del objeto tag.

Data/time. Database access. Per regular expressions.apache.Open Source Tag Libraries ver http://jakarta. Sending Mail. Populating/validating fields. And so on… 157 Open Source Tag Libraries 158 . JNDI. Extracting data from other Web pages XSL transformations.org/taglibs: Internationalization.

Beans y tags personalizados. llamar código del Servlet desde expresiones scripting. eso no es suficiente: Para procesamiento complejo.Integrando Servlets y JSPs 159 Porque combinar Servlets y JSPs? Panorama: Se trata de usar JSP para hacer más fácil el desarrollo y mantenimiento de contenido HTML: Para código dinámico simple. utilizar clases personalizadas llamadas expresiones scripting. La asunción detrás es que una página sencilla de una apariencia sencilla. 160 . use Beans y tags personalizados. Para casos mas complicados. Aún con la conveniencia de separar clases. JSP es lento. Pero. Para casos moderadamente complejos.

Algo formalizado lo podemos ver en Apache “struts” framework – http://jakarta.org/structs 161 Apache Struts 162 . El Servlet proceso los datos solicitados.Arquitectura Enfoque: La petición original es contestada por el Servlet.apache. accede a la lógica del negocio. La petición se remite a una página JSP para darle formato a los resultados. Diferentes páginas JSP pueden ser usadas para manejar diferentes tipos de formatos. hace búsquedas en la base de datos. etc. Terminología: A menudo llamada la arquitectura “Model View Controller” es una aproximación a JSP.

163 Enviando peticiones: Código ejemplo. } else if (operation. IOException { String operation = request. response). Llama a include para insertar la salida de la página destino y continuar. RequestDispatcher dispatcher = getServletContent().getRequestDispatcher(url).Enviando peticiones Primero.jsp”. } 164 . if (operation == null) operation = “unknown”. Ejemplo: String url = “/presentations/presentation1. En segundo lugar: Llamar a forward para transferir completamente el control a la página destino – vea el ejemplo siguiente. request.getParameter(“operation”). response).equals(“operation2”)) { gotoPage(“/operations/presentation2. public void doGet(HttpServletRequest req. HttpServletResponse res) throws ServletException. request. response). llamar al método getRequestDispatcher de ServletContext: Proveer un URL relativo a la raíz de las aplicaciones Web.jsp”.jsp”.jsp”. if (operation. } else { gotoPage(“/operations/unknownRequestHandler. request.equals(“operation1”)) { gotoPage(“/operations/presentation1.

response). value). // Use RequestDispatcher to forward to the JSP page. 166 .setAttribute(“key”. } 165 Almacenar datos para uso posterior: El objeto session Propósito: Almacenar los datos que el Servlet buscó y que la página JSP utilizará en esta petición y en las peticiones siguientes del mismo cliente Sintaxis del Servlet para almacenar datos: SomeClass value = new SomeClass(…). Session.(cont. IOException { ReuestDispatcher dispatcher = getServletContext(). dispatcher.Enviando peticiones: Código ejemplo.forward(request. getRequestDispatcher(address).) public void doGet(HttpServletRequest req.. HttpServletResponse res) throws ServletException.

setAttribute(“key”. //Use RequestDispatcher to forward to JSP page 167 On-line Travel Agent 168 .Almacenar datos para uso posterior: : The Servlet Context Propósito: Almacenar los datos que el Servlet buscó y que la página JSP utilizara en esta petición y en las peticiones siguientes del mismo cliente Sintaxis del Servlet para almacenar datos : SomeClass value = new SomeClass(…). Get ServletContext(). value).

170 . Combinar Servlets y JSPs. El saber cuenco los Servlets son mejores que los JSP. Para el cliente es totalmente transparente. Lo que usted necesita entender sobre Servlets: Comprender como trabaja realmente JSP. Las páginas JSPs son traducidas a Servlets: Es el Servlet el que se ejecuta al momento de una petición.Resumen JSP 169 Descripción JSP hace mas fácil el crear y mantener HTML. Otras tecnologías tienen un acercamiento similar pero no son portables y no le permiten usar Java para el código verdadero. El código del Servlet es llamada desde el JSP. mientras que provee un acceso total al código del Servlet.

El tipo de base de datos utilizada es MySQL: Tabla Alumnos: nombre: varchar(30) apellido: varchar(30) direccion: varchar(30) telefono: varchar(30) 172 . Nota: no existe ninguna validación de que el alumno ya exista. y un Java Bean -clase.Ejemplo: Combinando JSP + JavaBeans + JDBC 171 Ejemplos: JSP.java). con un scope a nivel de aplicación.jsp y verificaalumnos. y permite registrar nuevos alumnos. El ejemplo hace uso del JavaBean para manipular la tabla de alumnos.jsp) . JDBC Este ejemplo involucra a dos páginas JSP (alumnos. de hecho ni siquiera existe una llave primaria en la tabla.(alumnos. Lo que hace el ejemplo es mostrar una lista de alumnos que se carga de la base de datos (agendita).

Driver").executeQuery("Select * from alumnos").. top:50px. ResultSet rs. %> <table border="1" cellpadding="0" cellspacing="1" width="100%"> <tr> <td align="center" bgcolor="#0068C0"><font face="Arial" color="#FFFFFF">Nombre</font></td> <td align="center" bgcolor="#0068C0"><font face="Arial" color="#FFFFFF">Apellido</font></td> <td align="center" bgcolor="#0068C0"><font face="Arial" color="#FFFFFF">Direccion</font></td> <td align="center" bgcolor="#0068C0"><font face="Arial" color="#FFFFFF">Telefono</font></td> </tr> 173 <% rs = stmt. height: 518px"> <p align="center"><strong><font face="Georgia. visibility:visible. charset=iso-8859-1"> <%@ page import="java.getString("telefono")%></font></small></td> </tr> <%}%> </table> <% } catch(Exception e) { System. stmt = con.usuario. left:78px. Times.setCn(con).password). Statement stmt. width=570. String password="holahola".*" %> Ejemplos: JSP y Java Beans <jsp:useBean id="alum" class="dcc.getString("apellido")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.sql. Times.jsp"> <p align="center"><strong><font face="Georgia.alumnos" scope="application" /> Alumnos.getString("nomrbe")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.newInstance().createStatement(). overflow = auto.jdbc. serif" color="#000099">Lista de Alumnos</font><font face="Arial" color="#408080" > </font></strong></p> <% Connection con. height=420. try { Class.toString()). Times New Roman. width: 813px. }%> <form name="form1" method="post" action="VerificaAlumnos. Times New Roman.getString("direccion")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs. String usuario= "bingo".getConnection(url.out.next()) {%> <tr> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.println("Error al conectarse: "+e.forName("com. String url= "jdbc:mysql://localhost/agendita". border=solid thin #B8D0F0. while(rs. alum.mysql. con = DriverManager. z-index:2.<html> <head> <title>Alumnos</title> <meta http-equiv="Content-Type" content="text/html. serif" color="#000099">Registro de Alumnos</font><font face="Arial" color="#408080" > </font></strong></p> <table border="1" cellpadding="0" cellspacing="1" width="100%"> <tr> <td bgcolor="#B8D0F0" width="27%"><small><font face="Arial">Nombre</font></small></td> <td width="73%" align="center" bgcolor="#B8D0F0"><small><font face="Arial"> <input type="text" name="nombre" size="80" maxlength="75"> </font></small> </td> </tr> <tr> <td bgcolor="#B8D0F0" width="27%"><small><font face="Arial">Apellido</font></small></td> <td width="73%" align="center" bgcolor="#B8D0F0"><small><font face="Arial"> <input type="text" name="apellido" size="80" maxlength="75"> </font></small> </td> </tr> 174 .jsp </head> <body bgcolor="#FFCCCC"> <div Id="scroll" Style="position:absolute.

<tr> <td bgcolor="#B8D0F0" width="27%"><small><font face="Arial">Direccion</font></small></td> <td width="73%" align="center" bgcolor="#B8D0F0"><small><font face="Arial"> <input type="text" name="direccion" size="80" maxlength="75"> </font></small> </td> </tr> <tr> <td bgcolor="#B8D0F0" width="27%"><small><font face="Arial">Telefono</font></small></td> <td width="73%" align="center" bgcolor="#B8D0F0"><small><font face="Arial"> <input type="text" name="telefono" size="80" maxlength="75"> </font></small> </td> </tr> </table> <br> <center> <input type="submit" name="btnContinuar" value="Registrar"> </center> </form> </div> </body> </html> 175 VerificaAlumnos. width=570. height: 183px"> <br> <table border="0" cellpadding="0" cellspacing="1" width="100%"> <tr> <td width="40%" align="center" bgcolor="#0068C0"><font face="Arial" color="#FFFFFF"><b><font face="Georgia. z-index:2. left:259px. border=solid thin #B8D0F0. charset=iso-8859-1"> </head> <%@ page import="java. Times New Roman.. height=420.*" %> <jsp:useBean id="alum" class="dcc. overflow = auto. visibility:visible. serif">Resultados</font></b></font></td> <tr> </tr> </table> 176 .sql.alumnos" scope="application" /> <body bgcolor="#FFCCCC"> <div Id="scroll" Style="position:absolute. width: 509px. top:122px. Times.jsp <html> <head> <title>Alumnos</title> <meta http-equiv="Content-Type" content="text/html.

} public String getNombre() { return(nombre). Times.<jsp:getProperty name="alum" property="apellido" /> &nbsp. Times New Roman. } 178 .nombre=nombre..jsp"> <center> <input type="submit" name="btnContinuar" value="Continuar"> </center> </form> </div> </body> </html> 177 Bean Alumnos.<br> <jsp:setProperty <jsp:setProperty <jsp:setProperty <jsp:setProperty name="alum" name="alum" name="alum" name="alum" property="nombre" param="nombre"/> property="apellido" param="apellido"/> property="direccion" param="direccion"/> property="telefono" param="telefono"/> <% if (alum. } public void setTelefono(String telefono) { this.sql.direccion=direccion.cn=cn. serif" color="#000099">se registro correctamente!!!</font> </font></strong></p> <% } else { %> <p align="center"><strong><font face="Arial" color="#408080" > <font face="Georgia. import java.. Times New Roman. Times New Roman.NuevoAlumno()) { %> <p align="center"><strong><font face="Georgia. serif" color="#000099">Verifique.<jsp:getProperty name="alum" property="apellido" /> &nbsp. } public Connection getCn() { return(cn).*. } public void setApellido(String apellido) { this. serif" color="#000099">El alumno</font><font face="Arial" color="#408080" > &nbsp. <font face="Georgia.java package dcc.apellido=apellido. } public String getApellido() { return(apellido). private String telefono. public class alumnos { private String nombre. <font face="Georgia. Times. } public void setDireccion(String direccion) { this.<jsp:getProperty name="alum" property="nombre" /> &nbsp. public void setCn(Connection cn) { this. private Connection cn.! </font> </font></strong></p> <% } %> <form name="form1" method="post" action="Alumnos. private String apellido. Times New Roman. private String direccion.<jsp:getProperty name="alum" property="nombre" /> &nbsp. } public String getTelefono() { return(telefono). } public void setNombre(String nombre) { this.telefono=telefono. Times. } public String getDireccion() { return(direccion). serif" color="#000099">Se ha generado un error y no se grabo el alumno</font> &nbsp. Times.

trim()+"'.close().trim() + "'. return(true). if (cn!=null) { try { st= cn. } } 179 //try catch(SQLException e) { this. apellido=rs.executeUpdate(sqlInsert).executeQuery(sqlQuery). } } else return(false). apellido="".getString("apellido"). rs. return (false). direccion="". sqlInsert="INSERT INTO alumnos VALUES('"+ nombre.trim()+"')". return (false).createStatement().nombre="". String sqlInsert.nombre=nombre. apellido="".trim()+"'".createStatement(). sqlQuery="Select * from alumnos where nomrbe='"+nombre. telefono="".'"+ apellido. } catch(SQLException e) { return(false). } } else return(false).getString("direccion").close(). } } 180 .next()) { this.trim()+"'.trim().trim(). } else { this. st.nombre="". direccion="". if (rs.'"+telefono. } public boolean NuevoAlumno() { Statement st. direccion=rs. String sqlQuery.trim().'"+direccion. return(true). telefono=rs. rs. telefono="".getString("telefono"). if (cn!=null) { try { st= cn.public boolean isAlumno(String nombre) { Statement st. ResultSet rs=st.

Sign up to vote on this title
UsefulNot useful