Вы находитесь на странице: 1из 90

Java Server Pages, Beans y JSP Tag Library

Dr. Vctor J. Sosa Sosa vjsosa@cinvestav.mx


Sintetizado del curso de Mark Baker University of Portsmouth, UK

Introduccin
Introduccin a los JSP. Elementos de JSP Scripting. JSP, directivas de pgina: Estructura y generacin 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 fcil:
Leer datos de un formulario, Leer las cabeceras de las peticiones HTTP. Leer los cdigos 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 difcil:
Usar muchas instrucciones println() para generar HTML, Mantenimiento del HTML.

El Framework de JSP
La idea:
Uso de HTML para la mayora de las pginas Web, Identificar cdigo del Servlet con etiquetas especiales, Toda la pgina JSP es convertida a un Servlet (slo una vez) y el Servlet es el que realmente es invocado (por cada peticin).

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 propsito de JSP es ofrecer una forma ms declarativa y ms guiada por la presentacin que aquella conseguida con los servlets. Las pginas JSP se utilizan en un proceso que involucra dos fases: 1. Una fase de traduccin dinmica a servlets que se
realiza nicamente cuando la pgina JSP se crea o modifica. Una fase de contestacin a peticiones que se consigue cuando las clases de los servlets generados se cargan en el contenedor de servlets.

2.

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 mtodo _jspService(). El mtodo _jspService() no puede reemplazarse por otros mtodos definidos por el programador, pero en cambio puede adecuarse su inicializacin y terminacin con los mtodos jspInit() y jspDestroy().

Java Server Pages (JSP)


Arquitectura de JSP
Servlet

Evento de iniciacin

_jspInit() Peticin Respuesta _jspService()

Evento de terminacin

_jspDestroy()

Contenedor de Servlets
7

Benficos de usar JSP


Ventajas
Independencia del servidor Web. Substitucin del API de los servlets por conjuntos de elementos de marcado (tags) y fragmentos de programacin (scriptlets). Altamente recomendable para conseguir el acceso al servidor Web en arquitecturas de partes mltiples (multi-tier). Separacin del contenido esttico del dinmico. Separacin del contenido dinmico del formato de la presentacin.
8

Ventajas de JSP frente a las tecnologas similares.


Contra Active Server Pages (ASP):
ASP es una tecnologa similar que pertenece a Microsoft La parte dinmica de JSP es escrita en Java, no en Visual Basic u otro lenguaje propietario de Microsoft, esto lo hace un mejor lenguaje. Es portable con otros sistemas operativos y servidores Web que no sean de Microsoft.

Contra Servlets:
JSP no proporciona algo ms que en principio podra hacerse con un Servlet. Pero es mas conveniente para escribir y modificar HTML que tener muchas sentencias println() para generarlo. Adems, haciendo la separacin de vista y contenido, se puede tener diversas personas en diversas tareas: expertos en diseo de pginas Web pueden construir el HTML, dejando lugar para que los programadores de Servlets inserten el contenido dinmico.

Ventajas de JSP frente a las tecnologas similares.


Contra Server-Side Includes (SSI): SSI son tecnologas ampliamente soportadas para incluir, en una pgina Web esttica, partes definidas externamente. JSP es mejor porque le permite utilizar Servlets en lugar de un programa separado para generar la parte dinmica, SSI est pensado para inclusiones simples, no para programas reales que usen informacin de un formulario, conexiones a bases de datos, etc. Contra JavaScript: JavaScript puede generar dinmicamente HTML del lado cliente, Capacidad til, pero slo para manejar situaciones donde la informacin dinmica est basada en el medio ambiente del cliente, Con excepcin de las cookies de HTTP y los formularios, el envo de datos no es posible en JavaScript, Y, puesto que corre del lado cliente, JavaScript no puede tener acceso a los recursos del lado servidor como bases de datos, catlogos, informacin valiosa, entre otros.
10

Ventajas de JSP frente a las tecnologas similares.


Contra HTML esttico:
El HTML normal, no puede contener informacin dinmica. JSP es tan fcil y conveniente que es totalmente factible aumentar las pginas HTML que se vern beneficiadas por la insercin de cantidades pequeas de datos dinmicos.

11

Resumen: JSP vs ASP


Propiedad Servidor Java Server Pages La mayora de los servidores ms Conocidos (Apache, Netscape, MS IIS) Cualquiera que corra una mquina virtual Java Java Beans, Enterprise Java Beans y libreras de elementos Java Active Server Pages Los servidores de Microsoft (IIS y Personal Web Server) Windows

Plataforma

Modelo de componentes Programacin (scripting) Seguridad

COM , DCOM , 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 libreras de elementos

Malentendidos comunes: Recordar que JSP es tecnologa Server-Side


Pregunta muy comn:
No puedo hacer XYZ con el HTML, JSP me dejara hacerlo?

Por qu esta pregunta no tiene sentido?


JSP corre completamente del lado servidor, No cambia el contenido que el visualizador puede manejar.

Preguntas similares:
Cmo pongo un Applet en una pgina JSP? Respuesta: Envi una etiqueta del <APPLET> al cliente. Cmo pongo una imagen en una pgina JSP? Respuesta: Envi una etiqueta de la <IMG> al cliente. Cmo uso un JavaScript/Acrobat/Shockwave/etc? Respuesta: Envi las etiquetas correspondientes del HTML.

13

2do Malentendidos comunes: Tiempo de Traduccin/Peticin


Qu sucede al momento de traduccin de la pgina JSP?
Las JSPs se traducen a cdigo Servlet.

Qu pasa en el momento de la peticin?


El cdigo del Servlet es ejecutado, Ninguna interpretacin del JSP ocurre al momento de la peticin, La pgina JSP original es ignorada al momento de la peticin; solo el Servlet que resulte de la JSP es el que se toma en cuenta.

Cundo ocurre la traduccin de la pgina?


Generalmente la primera vez que la pgina JSP es invocada despus de ser modificada, Esto no debera suceder a usuarios reales los desarrolladores deben probar las pginas que instalan, La traduccin de pginas no ocurre en cada peticin.
14

http://www.delta.com/

15

https://portal.banamex.com.mx/esp/empresarial/monarca/login.jsp

16

http://www.excite.com/

17

Configurando el medio ambiente.


Configurar CLASSPATH. Compilar el cdigo Utilizar los paquetes para evitar conflictos de nombres. Coloque la pgina JSP en el directorio correcto:
<tomcat_home>/Webapps/ROOT.

Use el URL especial para invocar la pgina JSP. Advertencias:


Las reglas utilizadas para el acceso al CLASSPATH, instalacin de directorios, etc., aun se aplican a las clases utilizadas en JSP.

18

Ejemplo.

19

Ejemplo
Con la configuracin por defecto, si la localizacin es:
<tomcat_home>/Webapps/ROOT/Expression.jsp

EL URL debe ser:


http://localhost:8080/Expressions.jsp

20

Ejemplo

21

Elementos del JSP Scripting

22

Uso de las JSPs


Los elementos de Scripting Aplicaciones simples llaman al cdigo del Servlet directamente. Los elementos de Scripting llaman al cdigo del Servlet indirectamente mediante clases de uso general(utilities). Uso de Beans. Etiquetas personalizadas. Servlet/JSP combo. Aplicaciones complejas

23

Tipos de elementos de Scripting


Expresiones:
Formato <%=expression %> Se evalua e inserta en la salida del Servlet, ej., el resultado en algo como: out.println(expression).

Scriptlets:
Formato <%code%> Insertado textualmente dentro del mtodo _jspService en los Servlets (llamada al servicio).

Declaraciones:
Formato <%! code%> Insertado textualmente dentro del cuerpo de la clase del Servlet, fuera de cualquier mtodo existente.

24

Expresiones JSP
Formato:
<%= Expresin Java %>

Resultado:
Expresin evaluada, convertida a cadena, y puesta en la pgina HTML en el lugar donde ocurri en la pgina JSP. Es decir, la expresin se pone en el _jspService dentro de out.print.

Ejemplos:
Tiempo actual: <%=new java.util.Date()%> Tu nombre de maquina: <% request.getRemoteHost()%>

Sintaxis compatible XML :


<jsp:expression> Java Expression </jsp:expression> Versin de XML no suportada por Tomcat 3.1 Hasta la versin JSP 1.2, los servidores no tiene que darle soporte.
25

Correspondencia JSP/Servlet
Original JSP:
<H1> A Random Number </H1> <%= Math.random() %>

Resultado posible del cdigo Servlet:


public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException IOException{ request.setContentType(text/html); HttpSession session = request.get Session(true); JspWriter out = response.getWriter(); out.println(<H1> Random Number</H1>); out.println(Math.randon()); }
26

Ejemplo usando expresiones JSP

27

Variables predefinidas
Request:
El HttpServletRequest 1er argumento para doGet();

Response:
El HttpSerlvetResponse 2do argumento para doGet();

Session:
El HttpSession asociada a la peticin (al menos que fuera deshabilitada con el atributo de la directiva de sesin).

Out:
El flujo de datos (de tipo JspWriter) usado para enviar la salida al cliente.

Application:
El ServletContext (para compartir datos) como fue obtenido va getServletConfig().getContext().

28

Java Server Pages (JSP)


Objetos Implcitos
Objeto
request response pageContext

Contexto
HttpServletRequest HttpServletResponse jsp.PageContext

Descripcin
Invocacin del servicio Respuesta a la Peticin Caractersticas de la pgina Dependientes de la implementacin, espacios de nombres y otras facilidades Conserva el estado de la session Contexto del servlet de configuracin Flujo de salida Configuracin del servlet del JSP Pgina que procesa la peticin en curso

mbito
Peticin Pgina Pgina

session application out config page

http.HttpSession ServletContext jsp.JspWriter ServletConfig Object

Sesin Aplicacin Pgina Pgina Pgina


29

JSP Scriptlets
Formato:
<% Cdigo Java %>

Resultado:
El cdigo insertado textualmente en el _jspService del Servlet.

Ejemplo:
<%String queryData = request.getQueryString(); out.println(Attached GET data: + queryData);%> <%response.setContentType(text/plain); %>

Sintaxis compatible XML:


<%jsp:scriptlet> Cdigo Java </jsp:scriptlet>%>
30

Correspondencia JSP/Servlet
Original JSP:
<%= foo() %> <%= bar() %>

Posible resultado del cdigo Servlet:


public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException IOException{ request.setContentType(text/html); HttpSession session = request.get Session(true); JspWriter out = response.getWriter(); out.println(foo()); out.println(bar()); }

31

Ejemplo usando JSP Scriptlets

32

Ejemplo usando JSP Scriptlets

33

Declaraciones JSP
Formato:
<%! Cdigo Java %>

Resultado:
El cdigo se inserta textualmente en la definicin de la clase del Servlet, fuera de cualquier mtodo existente.

Ejemplos:
<%! private int algunCampo=5;%> <%! private void AlgunMetodo() {} %>

Sintaxis compatible XML :


<jsp:declaration> Cdigo Java </jsp:declaration>
34

Declaraciones JSP
JSP:
<H!>Someheading</H1> <%! private String randomHeading(){ return(<H2> + Math.random() + </H2>); } %> <%= randomHeading()%>

35

Ejemplo usando declaraciones JSP


<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>JSP Declaraciones</TITLE> </HEAD> <BODY> <H1>JSP Declaraciones</H1> <%! private int accessCount = 0; %> <H2>Accesses to page since server reboot: <%= ++accessCount %></H2> </BODY> </HTML>

36

Java Server Pages (JSP)


Ejemplo de una Pgina JSP: La siguiente pgina JSP presenta un saludo.
<%-- Esta pgina da un saludo y despedida --%> <HTML> <BODY> <H1>Bienvenido a JSP!</H1> <% out.println("Regrese pronto); %> </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:
implcitamente por directivas JSP explcitamente a travs de acciones excepcionalmente usando fragmentos de cdigo

El mbito del objeto establece su duracin desde su creacin hasta su destruccin; su visibilidad indica los lugares de la pgina donde puede usarse el objeto.

38

Java Server Pages (JSP)


mbito y Visibilidad de Objetos
La siguiente tabla muestra los mbitos que pueden asociarse a los objetos recin creados.

mbito
4 (mayor) 3 2

Categora
Aplicacin Sesin Peticin

Descripcin
Pertenecen a la misma aplicacin Pertenecen a la misma sesin Provienen de la peticin que es Atendida Pertenecen a la pgina en que fueron creados
39

1 (menor)

Pgina

Java Server Pages (JSP)


Objetos Implcitos Debido a que la tecnologa JSP se basa en aquella de los servlets, existe un conjunto de objetos predefinidos cuyos nombres pueden usarse inmediatamente en JSP.

40

Java Server Pages (JSP)


Ejemplo Este ejemplo muestra los cuatro mbitos de los objetos JSP.
<%@page import=java.util.*%> <HTML> <BODY> Servlet <%= config.getServletName() %><br> <% for (int scope = 1; scope <= 4; scope++) { out.println("<H2>Ambito "+scope+"</H2>"); Enumeration e = pageContext.getAttributeNamesInScope(scope); while (e.hasMoreElements()) { out.println(e.nextElement()+<br>); } } %> </BODY> </HTML>
41

ambitos

Java Server Pages (JSP)


Resumen de Elementos Bsicos de JSP
Elementos que se intercalan entre aquellos de HTML o XML.

Elemento
Directiva Declaraciones Expresiones Scriptlets

Sintaxis <%@ . . . . . . . . %> <%! . . . . . . . . . . %> <%= . . . . . . . . .. %> <% .. . . . . . . . . .. %>

Descripcin
Importar clases o incluir archivos HTML Declarar variables o mtodos Java Evaluacin de expresiones Java Ejecucin de instrucciones Java Texto no procesado
42

Comentarios

<%-- .. . . . .. . . -- %>

JSP: Resumen Elementos Bsicos


Directivas Las directivas son instrucciones dirigidas al contenedor de servlets JSP, no al flujo de salida. Las directivas determinan los atributos de la pgina y las dependencias con el contenedor. La directiva de pgina tiene la forma: <%@ page atributos %> donde los atributos pueden ser:
language que indica el lenguaje usado en la pgina JSP, import que establece las clases que se van usar extends que indica las clases que sern extendidas include que inserta un archivo HTML session que cuando toma el valor true, permite usar la variable predefinida session en la pgina JSP buffer que establece el tamao del rea temporal de la pgina autoflush que indica si el envo al flujo de salida es inmediato isThreadSafe que establece que a lo ms un proceso est activo a la vez (por omisin, se tienen mltiples procesos concurrentes) errorPage que permite indicar si la pgina se usa para anunciar un error
43

JSP: Resumen Elementos Bsicos


Ejemplos de Directivas Las directivas:
<%@ page import=java.sql.*,java.util.* %> importa los paquetes java.sql y java.util <%@ page include=sty.css %> inserta los estilos para el documento que estn guardados en el archivo sty.css <%@ page buffer=16k %> establece el tamao del buffer a 16k <%@ page isThreadSafe=true %> establece que hay slo un proceso activo a la vez

44

JSP: Resumen Elementos Bsicos


Declaraciones La sintaxis de una declaracin es <%! declaracin %> o, alternativamente, usando los espacios de nombres de XML <jsp:declaration> declaracin
</jsp:declaration>

Las declaraciones permiten introducir variables y mtodos a nivel de pgina y deben seguir la sintaxis de Java. Las variables declaradas pueden inicializarse y deben estar terminadas por punto y coma. Las declaraciones de mtodos, adems de aquellos usados en la aplicacin, pueden tambin incluir a jspInit() y jspDestroy().
45

JSP: Resumen Elementos Bsicos


Ejemplo de Declaracin Cdigo de iniciacin para un contador en una pgina JSP que declara una variable y los mtodos jspInit() y jspDestroy():
<%! int counter;%> <%! public void jspInit() { counter = 0; } public void jspDestroy() { } %>

46

JSP: Resumen Elementos Bsicos


Expresiones
La sintaxis de una expresin es <%= expresin %> o, alternativamente, usando los espacios de nombres de XML <jsp:expression> expresin </jsp:expression> Las expresiones en JSP permiten que el resultado de la evaluacin de una expresin Java se convierta a una cadena de caracteres que ser incluida en la pgina generada. Las expresiones pueden incluirse en gran variedad de contextos y no deben terminarse por puntos y comas. Ejemplo de Expresiones
La siguiente expresin produce un elemento H1 usado para escribir el texto de un encabezado: <%! int i = 1; %> <H<%=i%>>Java Server Pages</H<%=i>>

47

JSP: Resumen Elementos Bsicos


Scriptlets La sintaxis de un scriptlet es <% scriptlet %> o, alternativamente, usando los espacios de nombres de XML <jsp:scriptlet> scriptlet </jsp:scriptlet> Se puede escribir cualquier fragmento de cdigo Java, extendido por elementos HTML y no limitado a una lnea. Ejemplo de Scriptlets: El siguiente scriptlet produce una secuencia de encabezados con tamao decreciente:
<% for (int i=1; i<5; i++) { %> <H<%=i%>>Java Server Pages</H<%=i>> <% } %>

48

JSP: Resumen Elementos Bsicos


Comentarios Los comentarios JSP usan elementos especiales, distintos de los comentarios de HTML, para que no puedan verse en los documentos enviados al cliente. Los comentarios pueden usarse tambin para bloquear la ejecucin de ciertos fragmentos de la pgina JSP. Ejemplo: La siguiente instruccin no ser ejecutada (ni siquiera ser visible en la pgina enviada al cliente)
<%-- int i = 1; --%>

49

JSP: Ejemplo (contador de accesos)


Ejemplo de Contador de Accesos: La siguiente pgina JSP muestra un contador de accesos a una pgina.
<%-- Esta pgina da la fecha y hora cuando fue soliciatada as como el nmero de accesos --%> <%@ page import="java.util.*"%> <%! Date loadDate = new Date(); int loadCounter = 1; %> <HTML> <BODY> <H1>Bienvenido!</H1> <H2>Desde <%=loadDate%>, sta pgina ha sido accesada <%=loadCounter%> <% if (loadCounter++ == 1) out.println("vez.<BR>"); else out.println("veces.<BR>"); %> <% out.println("Regrese pronto"); %> </H2> </BODY> </HTML>

contadoryfecha

50

JSP: Ejemplo (uso de formularios)


Ejemplo con Formas: El siguiente ejemplo demuestra como obtener los valores de un formulario.
<%@page import="java.util.*"%> <HTML> <BODY> <%Enumeration fields = request.getParameterNames();%> <TABLE border="1" > <TR><TH>Nombre</TH><TH>Valor</TH></TR> <% while (fields.hasMoreElements()) { %> <TR> <%String field = (String)fields.nextElement();%> <TD align=center><%=field%></TD> <TD align=center> <%=request.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. El problema con este enfoque es que no es escalable, reduciendo considerablemente el desempeo de sistemas con muchos procesos. Una alternativa es usar regiones crticas en scriptlets para sincronizar el acceso a objetos compartidos.
<%@page import=java.util.*%> <% synchronized (application) { Properties list = application.getAttribute(users); list.add(ana,new User(ana)) list.setAttribute(users,list); } %>
52

JSP: Manejo de Excepciones


Manejo de Excepciones JSP posee un mecanismo apropiado para el manejo de errores que ocurren a tiempo de ejecucin. El atributo errorPage de la directiva page se usa para indicar que la pgina recibe las excepciones lanzadas por algn scriptlet. Adems, el atributo errorPage de la misma directiva indica la pgina JSP a la cual se redirigir el objeto implcito exception (de tipo Throwable) que describe el problema.

53

JSP: Manejo de Excepciones


Ejemplo de manejo de excepciones Para manejar errores a tiempo de ejecucin, se puede usar una pgina que indique la naturaleza del error. Dicha pgina debe incluir entre sus directivas la siguiente:
<%@page isErrorPage=false errorPage=Error.jsp%> la pgina redirige a su vez el objeto exception a la pgina Error.jsp . La pgina Error.jsp debe contener a su vez, la

directiva:

<%@page isErrorPage=true %>

Esta indicacin permite acceder al objeto exception en la pgina Error.jsp .


54

JSP: Manejo de Sesiones


Manejo de Sesiones Por omisin todas las pginas JSP participan en una sesin HTTP. El objeto session (de tipo HttpSession) est disponible para almacenar objetos que persistan a lo largo de la vida de la aplicacin. El atributo session de la directiva page se usa para permitir o negar el acceso al objeto session en la pgina; por omisin, el objeto session es accesible. La directiva <%page session=false%> indica que en la pgina no se usarn sesiones. Una sesin se identifica por un nombre nico de sesin y se almacena en el browser del cliente en forma de cookie; si el browser no maneja cookies, la sesin se mantiene por reescritura del URL. La sesin mantiene referencias a todos los objetos almacenados pero tan pronto como la sesin es invalidada o el plazo de los objetos expira, los objetos se marcan para su recoleccin como basura.
55

JSP: Manejo de Sesiones.


Manejo de Sesiones No se pueden guardar tipos simples en una sesin, pero se puede guardar cualquier tipo de objeto identificado por una cadena nica de caracteres. El siguiente scriptlet hace al objeto Book pblicamente disponible para todas las pginas y servlets JSP que compartan la misma sesin: <% Book book = new Book(); session.putValue(book,book); %> El objeto book puede recuperarse realizando una coercin para convertirlo al tipo apropiado: <% Book book = (Book)session.getValue(book); %> No hay lmite en el nmero de objetos que se pueden manejar en una sesin, aunque un gran nmero de ellos reducir el rendimiento del sistema. Generalmente, la duracin de una sesin est limitada a 30 minutos, aunque la duracin puede ampliarse regularmente usando el mtodo setMaxIntactiveInterval(int secs).
56

JSP: Ejemplo de Sesiones


<%--session.jsp: Ejemplo de una sesion--%> <HTML> <BODY> <H1>Sesion <%=session.getId()%></H1> <P>La session fue creada el <%=session.getCreationTime()%> <P>Duracion usual de la session:<%=session.getMaxInactiveInterval()%> <P>Reduccin de la duracion de la session a 5 segundos <%session.setMaxInactiveInterval(5);%> <P>Nueva duracion de la session:<%=session.getMaxInactiveInterval()%> <P>Depositar un objeto nuevo <%session.setAttribute("bible",new String("Sacred Bible"));%> <P>Mostrar el objeto depositado:<%=session.getAttribute("bible")%> </BODY> <HTML>

session
57

JSP: Ejemplo de Sesiones


<%--session1.jsp: Ejemplo de una sesion con invalidacion--%> <HTML> <BODY> Sesion <%= session.getId() %> <% if (session.getAttribute("bible")==null) { session.setAttribute("bible",new String("Sacred Bible")); out.println("<P>Depositar un nuevo libro:" +session.getAttribute("bible")); } else { out.println("<P>Recuperar el libro:" +session.getAttribute("bible")); } %> <FORM TYPE="post" ACTION="session2.jsp"> <INPUT TYPE="submit" NAME="invalidar VALUE="invalidar"> </FORM> <FORM TYPE="post" ACTION="session3.jsp"> <INPUT TYPE="submit" NAME="conservar VALUE="conservar"> </FORM> </BODY> session1 </HTML>
58

JSP: Ejemplo de Sesiones (Cont..)


Los archivos session2.jsp y session3.jsp son llamados por session1.jsp.
<%--session2.jsp: Ejemplo de una sesion con invalidacion--%> <%@page isErrorPage="false errorPage="ErrorPage.jsp"%> <HTML> <BODY> Sesion <%=session.getId()%> <P>Recuperar al libro: <%= session.getValue("bible") %> <P>Invalidar la session <% session.invalidate(); %> <P>Recuperar de nuevo al libro: <%= session.getValue("bible") %> <FORM TYPE="post" ACTION="session1.jsp"> <INPUT TYPE="submit" NAME="submit VALUE="regresar"> </FORM> </BODY> </HTML> <%--session3.jsp--%> <HTML> <BODY> Sesion <%=session.getId()%> <P>Recuperar el libro: <%= 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 programacin con servlets; en JSP es igual de simple su programacin. Las cookie se obtienen de la peticin HTTP (objeto request) y se mandan a la respuesta HTTP (objeto response) siempre que el cliente acepte las cookies. Una vez obtenida una cookie de la peticin, sta se puede leer, modificar y alterar su fecha de expiracin (cambiando su edad mxima). Adems, en cualquier momento se puede agregar nuevas cookies a las ya existentes.

60

JSP: Ejemplo de Cookies


<%--Cookies.jsp: Este programa puede comportarse distinto en diferentes browsers--%> <HTML> <BODY> Session <%= session.getId() %> <% Cookie[] cookies = request.getCookies(); for(int i = 0; i < cookies.length; i++) { %> Cookie con nombre: <%= cookies[i].getName() %> <br> Valor: <%= cookies[i].getValue() %><br> Duracin mxima en segundos: <%= cookies[i].getMaxAge() %><br> <% cookies[i].setMaxAge(5); %> Nueva duracin en segundos: <%= cookies[i].getMaxAge() %><br> <% } %> <%! int count = 0; int dcount = 0; %> <% response.addCookie(new Cookie("Bob" + count++,"Dog" + dcount++)); %> </BODY> </HTML>

Cookies

61

JSP: Acciones comunes


Acciones Comunes Las acciones permiten realizar tareas sofisticadas reduciendo considerablemente la codificacin requerida en Java. Las acciones se manifiestan usando elementos especiales (tags) los cuales promueven la reutilizacin de componentes mejorando el mantenimiento de la aplicacin. Algunas acciones ms populares son:
usar componentes JavaBeans redirigir mensajes encadenar peticiones incluir peticiones

62

JSP: Usar componentes JavaBeans


El modelo de componentes de JSP se basa en la tecnologa JavaBeans que son objetos con un esquema de nombramiento bien definido. Un bean encapsula sus propiedades, como variables privadas, las cuales se pueden leer o modificar usando mtodos pblicos apropiados. Un bean debe identificarse con un nombre con mbito de sesin antes de que pueda usarse; el elemento XML
<jsp:useBean id=bookBean class=com.beans.books scope=session/>

crea una instancia del Bean y lo agrega a la sesin; si se encuentra este elemento en otra pgina, el objeto se recuperar entonces de la sesin.
63

JSP: Usar componentes JavaBeans


El elemento jsp:useBean tambin puede tener estructura, la cual consiste de un scriptlet que realiza la iniciacin de las propiedades del bean cuando ste se crea.
<jsp:useBean id=bookBean class=com.beans.books scope=session> <% iniciacin 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, 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.
64

JSP: Usar componentes JavaBeans


El elemento
<jsp:setProperty name=book property=*/>

copia los valores pero slo 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 explcita:
<jsp:setProperty name=book property=propName parameter=parmName/>

65

JSP: Ejemplo de JavaBeans


El siguiente JSP es un juego para adivinar un nmero.
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 nmeros.
/* 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 peticin se puede redirigir hacia otra pgina JSP, servlet o pgina HTML esttica pasndole el contexto de la pgina que hace la invocacin. El procesamiento contina hasta el punto en el que ocurre la redireccin para entonces detenerse por completo en esa pgina. El elemento <jsp:forward page=anotherPage.jsp/> redirige el procesamiento a la pgina anotherPage.jsp conservando todo el procesamiento realizado en la pgina actual. Un elemento <jsp:forward> tambin puede tener parmetros para proporcionar valores a la pgina 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 pginas


El elemento <jsp:include> puede usarse para redirigir una peticin a cualquier pgina esttica o dinmica que est en el mismo contexto. La llamada tambin puede incluir los beans como parmetros de la peticin. Por ejemplo, el elemento <jsp:include page=shopingCart.jsp flush=true/> permite tener acceso a cualquier bean y al contexto dinmico generado por la pgina invocante; finalmente, el contenido generado se inserta en el lugar del elemento <jsp:include>. La pgina incluida no puede hacer algunas cosas como encabezados HTTP o hacer galletas.
73

JSP: Ejemplo de incluir pginas


La siguiente pgina 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

Repaso a la directiva page de JSP :


Usada como forma para estructurar los Servlets generados

75

Propsito de la directiva page


Dar informacin de alto nivel a cerca del Servlet que resulte del JSP. Puede controlar:
Qu clases son importadas, Qu clases el Servlet extiende o hereda, Qu tipo MIME se genera, Cmo se maneja el multi-threading. Si el Servlet participa en sesiones, El tamao y compartimiento del buffer de salida, Qu pgina maneja los errores inesperados.
76

El atributo Import
Formato:
<%@ page import=package.class %> <%@ page import=paqckage1,, package.classN%>

Propsito:
Generar las declaraciones para importar clases en la parte superior del Servlet.

Notas:
Aunque las pginas JSP pueden estar casi en cualquier parte del servidor, las clases usadas por JSP deben estar en directorios comunes del Servlet. Por ejemplo, con Tomcat esto es: $CATALINA_HOME/Webapps/ROOT/Web-INF/classes

77

Ejemplo del atributo import

mab.*

78

Ejemplo del atributo import


Primer Acceso

Acceso Posterior

79

El atributo contentType
Formato:
<%@ page contentType=MIME-Type%> <%@ page contentType=MIME-Type; charset=Character-Set%>

Proposito:
Especifica el tipo MIME de la pgina generada por el Servlet que resulta de la pgina JSP .

80

El atributo contentType
First Last Email Address Mark Baker mark.baker@computer.org Larry Brown brown@coreWebprogramming.com Bill Gates gates@sun.com Larry Ellison ellison@microsoft.com <%@ page contentType="application/vnd.ms-excel" %> <%-- Son tabs en lugar de espacios entre las columnas --%>

81

El atributo isThreadSafe
Formato:
<%@ page isThreadSafe=true%> <%-- Default--%> <%@ page isThreadSafe=false%>

Propsito:
Le dice al sistema cuando el cdigo no es threadsafe, de modo que el sistema pueda prevenir accesos concurrentes instruye al Servlet a implementar un SingleThreadModel.

Notas:
Por defecto es true El sistema asume que se tienen actualizaciones a campos y otros datos compartidos sincronizadamente. Proporcionando el valor false se puede afectar el buen desempeo.

82

Cdigo Non-threadsafe
Cul es el problema con este cdigo?
<%! private int idNum = 0;%> <% String UserID = userID + idNum; out.println(Your ID is + userID + .); idNum = idNum + 1; %>

83

Cdigo Threadsafe
<%! private int idNum = 0;%> <% synchronized(this) { String UserID = userID + idNum; out.println(Your ID is + userID + .); idNum = idNum + 1; } %>

acceso seguro a una variable compartida usando la declaracin de sincronizacin normal.


84

Otros atributos de la directiva de page


Session:
Permite Elegir no participar en sesiones.

Buffer:
Cambia el tamao minimo del buffer usado por el JspWriter.

Autoflush:
Requiere al desarrollador explcitamente vaciar el buffer.

Extends:
Cambia la clase padre del Servlet generado.

Error:
Indica una pgina para manejar los errores inesperados.

isErrorPage:
Indica que la pgina se puede utilizar como pgina del error.
85

Incluyendo archivos en documentos JSP

86

Incluyendo pginas al momento de la peticin


Formato:
<%jsp:include page=URL relativo flush=true%>

Propsito:
Reutilizar contenido JSP, HTML o texto plano. El contenido JSP no puede afectar la pgina principal Solamente es utilizada la salida de JSP incluido. Permitir actualizaciones al contenido incluido sin cambiar la pgina principal.

87

Ejemplo de inclusin de pginas

88

Ejemplo de inclusin de pginas

89

Incluyendo archivos al momento de la traduccin de la pgina.


Formato:
<%@include file=Relative URL%>

Propsito:
Reutilizar contenido JSP en mltiples pginas, donde el contenido JSP afecta la pgina principal.

Notas:
Los servidores no tiene que detectar cambios en los archivos incluidos, y en la prctica muchos no lo hacen de otra manera se necesita cambiar los archivos JSP cuando los archivos incluidos cambian. Puede utilizar mecanismos especficos del sistema operativo tal como el comando touch de UNIX:

<%-- Navbar.jsp modified 27/01/03--%> <%@include file=Navbar.jsp%>


90

Contenido JSP reutilizable: Ejemplo: ContactSection.jsp


<%@ page import="Java.util.Date" %> <%-- Los siguientes viene a ser campos en cada Servlet que resulta de una pgina JSP que incluye este archivo. --%> <%! private int accessCount = 0; private Date accessDate = new Date(); private String accessHost = "<I>No previous access</I>"; %> <P> <HR> This page &copy; 2000 <A HREF="http//www.my-company.com/">my-company.com</A>. This page has been accessed <%= ++accessCount %> times since server reboot. It was last accessed from <%= accessHost %> at <%= accessDate %>. <% accessHost = request.getRemoteHost(); %> <% accessDate = new Date(); %>
91

Usando el ContactSection
Embebido en la pgina Web:
<HTML> <BODY> <HR> <H1> My Page</H!> <HR> <%@ include file=contactSection.jsp %> </BODY> </HTML>
92

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 tpicas en los lenguajes de programacin.

93

Bibliotecas de etiquetas JSP


La introduccin de los Servlets en 1996 hizo a Java una opcin razonable para el desarrollo de pginas Web dinmicas. El debut de JavaServer Pages (JSP) seguido por la inclusin del soporte para etiquetas JSP, fueron pasos lgicos en la evolucin hacia una rpida y mantenible implementacin de pginas Web en Java. Pero la liberacin de JSTL (JSP Standard Tag Library) hecha a mediados del 2002 representa tal vez el paso ms grande en cuanto a velocidad y simplificacin del proceso de desarrollo. JSP 2.0 fue liberado en el 2004 y trajo nuevas mejoras y ayudas adicionales, Tomcat 5.5 comenz a darle soporte a esta versin en el 2004.
94

La biblioteca de etiquetas JSP


Las pginas JSTL son tambin pginas JSP:
JSTL es justamente un sper conjunto de la funcionalidad del JSP.

Tambin, todas las etiquetas JSTL es XML vlido:


Eso significa que si trata el contexto de una pgina fuera de las etiquetas JSTL como una plantilla de texto (el cual normalmente ser HTML), las etiquetas JSTL restantes deben ser tratadas como XML vlido.

JSTL proporciona un conjunto de cuatro bibliotecas estndares (core, internationalization/format, XML y SQL) y soporte para un lenguaje de expresiones (EL: Expression Language).
Un objetivo primario del diseo para JSTL y de EL fue simplificar el desarrollo e implementacin de las pginas Web.

Una etiqueta JSTL corresponde a alguna accin; llamndolas acciones, nos recuerdan explcitamente que estn agregando comportamiento dinmico a una pgina que de otra manera sera esttica. Puede usarse tanto expresiones JSP como JSTL EL.

95

Cmo obtener la Librera de Etiquetas?


El proyecto Apache Taglibs es un repositorio opensource para las bibliotecas de etiquetas personalizadas JSP y proyectos asociados, tales como las clases TagLibraryValidator y extensiones a herramientas para creacin de pginas que soportan biblioteca de etiquetas. Jakarta Taglibs http://jakarta.apache.org/taglibs/ Para utilizar el estndar Taglib de la distribucin Jakarta Taglibs, simplemente copie los archivos JAR que estn en el directorio lib de la distribucin al directorio de la aplicacin Web-INF/lib.
JSTL 1.0 API classes: jstl.jar, Standard Taglib JSTL implementation classes: standard.jar.

96

Instalando JSTL
Para utilizar el JSTL, se debe tener un contenedor JSP 1.2 (o superior) instalado.
Uno de los contenedores JSP mas comnmente utilizados es el servidor Web Apache Tomcat .

Usando slo Tomcat podr usar cdigo JSP normal. Para utilizar JSTL, se deber instalar JSTL en Tomcat. JSTL se puede obtener del mismo lugar que el Tomcat.
El URL principal para el JSTL es http://Java.sun.com/products/jsp/jstl/ Para usar JSTL, se deber descomprimir los archivos de la distribucin e instalarlos en el lugar correcto dentro de Tomcat.
97

Instalando el JSTL
Copie el archivo JAR del JSTL al directorio lib de Tomcat:
Si usas Windows la localizacin del directorio lib normalmente es $CATALINA_HOME\Webapps\ROOT\WEB-INF\lib.

Copie los archivos JSTL TLD al directorio WEB-INF de Tomcat:


El directorio Web-INF normalmente es: $CATALINA_HOME\ROOT\WEB-INF\tags\. Si tu examinas los archivos de la distribucin JSTL, notars que hay ocho con la extensin TLD que debern ser copiados al directorio WEB-INF.

Modificar el archivo Web.xml para incluir los archivos .tld:


Finalmente se deber modificar el archivo Web.xml y agregar una entrada para los archivos tag libraries que usted agregue. Esto consiste en agregar directivas <taglib> dentro de la directiva principal <Web-app>.

98

Instalando JSTL Web.xml

99

Instalando JSTL
Despus de completar los tres pasos anteriores, esta listo para probar la instalacin del JSTL. Esto puede ser hecho creando una pgina JSP que utilice JSTL. Se debe de colocar el archivo JSP dentro del directorio raz del Web. ($CATALINA_HOME\Webapps\ROOT). Una vez que el servidor Tomcat es iniciado, se debe ahora poder visualizar http://localhost:8080/XXXX.jsp para ver su pgina.

100

Instalando JSTL
Si no se tiene instalado correctamente el JSTL, normalmente no habr mensaje de error. Si JSTL no esta interpretando sus etiquetas, stas sern pasadas directamente al visualizador Web. El Visualizador Web interpretara estas etiquetas como etiquetas desconocidas del HTML. La mayora de los visualizadores Web normalmente ignoran estas etiquetas desconocidas.

101

Bibliotecas de etiquetas JSTL


Se habla comnmente de JSTL como una biblioteca de etiquetas simple. JSTL son en realidad cuatro bibliotecas de etiquetas. Estos bibliotecas son:
Core Tag Library etiquetas que son esenciales para cualquier aplicacin Web. Ejemplos de esta biblioteca de etiquetas incluyen ciclos, evaluacion de expresiones, entradas y salidas basicas. Formatting/Internationalization Tag Library etiquetas que se utilizan para analizar datos. Algunas de estas etiquetas analizarn datos, tales como fechas basadas en forma diferente dependiendo de la localizacion. Database Tag Library etiquetas que pueden ser utilizar para tener acceso a las bases de datos con SQL. XML Tag Library etiquetas que se pueden utilizar para tener acceso a elementos XML. Debido a que XML es utilizado en muchas aplicaciones Web, el procesamiento de XML es una caracterstica importante de JSTL.
102

Lenguaje de expresiones (EL)


(EL) define un lenguaje para expresar expresiones simples en una sintaxis que sea fcil de aprender. (EL) fue inspirado en JavaScript y en cierto grado en XPath, pero EL es mucho ms flexible con variables sin valor (null) y realiza ms conversiones de tipos en forma automtica. Estas caractersticas son importantes para aplicaciones en el Web, donde la entrada esta principalmente en forma de parmetros de peticin:
Los cuales pueden estar presentes en algunas peticiones pero en otras no, y el visualizador siempre enva los parmetros de peticin como valores de texto, mientras que la aplicacin a menudo necesita usarlos como nmeros o valores booleanos (falso o verdadero). De la manera como EL est diseado, rara vez necesitamos preocuparnos por ausencia de valores o conversin de tipos.
103

Lenguaje de expresiones (EL)


Una expresin EL contiene variables y operadores. Cualquier Bean contenido en uno de los mbitos del JSP (pgina, peticin, sesin o aplicacin) puede ser utilizada como una variable EL. Las expreesiones del EL combinadas con etiquetas JSTL tomadas de las cuatro bibliotecas estndares, provee un conjunto amplio y flexible de caractersticas. Todas las expresiones EL estn encerradas en ${ }. 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. Los atributos de JSTL pueden tambin contener simples literales de cadenas.
104

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, se utiliza el operador que accede a la propiedad: ${order.amount + 5} EL operador de acceso (punto) le dice a EL que busque por la propiedad indicada (amount, en este caso) en el Bean o coleccin especifica (order, en este caso, el cual puede ser un Bean o Java.util.Map).
105

Lenguaje de expresiones (EL)


Como alternativa, 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-expresin EL completa ) que mantiene el nombre de la propiedad. Las expresiones EL pueden ser utilizadas para asignar valores a cualquier atributo de accin estndar o personalizado de JSP que acepte un valor dinmico (o valores de atributo request-time, como se llaman formalmente): <c:out value="${order.amount + 5}"/>
106

Lenguaje de expresiones (EL)


EL proporciona soporte para acceder propiedades de objetos y elementos de colecciones, un conjunto de objetos implcitos y utilizar operadores relacionales lgicos y aritmticos. Para las propiedades indizadas, incluyendo arreglos y clases Java.util.List, 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.util.Map (los cuales representan un conjunto de pares nombre/valor) pueden ser accedidos usando unas de la siguientes maneras:
En las primeras dos expresiones, podemos acceder a una propiedad llamada aProperty en un JavaBean o una entrada a Map con la clave aProperty. En la tercera expresin (note que no hay comillas), tenemos acceso a un elemento de anObject con un nombre contenido en la variable aVariableContainingPropertyName:

${anObject.aProperty} ${anObject["aPropertyName"]} ${anObject[aVariableContainingPropertyName]}


108

Lenguaje de expresiones (EL)


Existe un numero de variables implcitas de EL:
Variable name
pageScope requestScope sessionScope applicationScope param paramValues header headerValues cookie initParam pageContext

Description
A collection (a Java.util.Map) of all page scope variables. A collection (a Java.util.Map) of all request scope variables. A collection (a Java.util.Map) of all session scope variables. A collection (a Java.util.Map) of all application scope variables. A collection (a Java.util.Map) of all request parameter values as a single String value per parameter. A collection (a Java.util.Map) of all request parameter values as a String array per parameter. A collection (a Java.util.Map) of all request header values as a single String value per header. A collection (a Java.util.Map) of all request header values as a String array per header. A collection (a Java.util.Map) of all request cookie values as a single Javax.Servlet.http.Cookie value per cookie. A collection (a Java.util.Map) of all application initialization parameter values as a single String value per parameter. An instance of the Javax.Servlet.jsp.PageContext class, providing access to various request data.

109

Lenguaje de expresiones (EL)


Los operadores describen lo que se desea hacer con las variables. Los operadores que se pueden usar en una expresin EL parecern familiar si ya se ha utilizado algn lenguaje de programacin antes, porque son parecidos a los utilizados por la mayora de los lenguajes:

110

Lenguaje de expresiones (EL)


Operator
. [] () ?: + * / 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. Access an array or List element. Group a subexpression to change the evaluation order. Conditional test: condition ? ifTrue : ifFalse. Addition. Subtraction or negation of a value. Multiplication. Division. Modulo (remainder). Test for equality. Test for inequality. Test for less than. Test for greater than. Test for less than or equal. Test for greater than or equal. Test for logical AND. Test for logical OR. Unary Boolean complement. Test for an empty variable value: null, an empty String, or an array, Map, or Collection without entries). A function call, where func is the function name and args is zero, one or more comma-separated function arguments.

func(args)

111

Bibliotecas de etiquetas JSTL


JSTL 1.1 fue pensado para acoplar JSTL con JSP 2.0. El cambio ms visible es que el JSTL 1.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. Cuando se importa cualquier biblioteca de etiquetas dentro de una pgina JSP, se define un prefijo que seala un espacio de nombres que corresponde a las etiquetas en esa biblioteca. Note que se podra definir sus propios prefijos, pero no existe una buena razn para esto. Las cuatro bibliotecas de etiquetas estndar, con sus convenciones de prefijos definidos JSTL, se enumeran en la diapositiva siguiente.

112

Bibliotecas de etiquetas JSTL

biblioteca
Core XML processing I18N formatting Database access Functions

URI
http://Java.sun.com/jstl/core-rt http://Java.sun.com/jstl/xml http://Java.sun.com/jstl/fmt http://Java.sun.com/jstl/sql
http://Java.sun.com/jstl/functions

Prefijo

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 mayora de las etiquetas. Un conjunto toma ventaja del nuevo lenguaje de expresiones y el otro no;
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 estndares pero no queremos utilizar el lenguaje de expresiones soportado aun,
Para tener acceso a estas bibliotecas, simplemente aada -rt al final del URI que seala a la biblioteca: <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core-rt" %>
114

Biblioteca de etiquetas JSTL


Para usar la biblioteca de etiquetas core del EL en una pgina, incluya la directiva del siguiente ejemplo en la parte superior de su pgina: <%@ taglib prefix="c" uri=http://java.sun.com/jstl/core-rt %> Para usar las etiquetas que estn en esa librera core, aada un prefijo a cada etiqueta en la pgina con el prefijo que se ha sealado en la declaracin que se incluy: <c:out value="${anExpression}"/>
115

Reglas ms flexibles del formato de documentos JSP


La especificacin JSP soporta dos tipos de pginas JSP:
pginas JSP regulares conteniendo cualquier tipo de texto o marcado y, Documentos JSP los cuales son documentos XML bien formados; es decir, documentos con elementos del XHTML y de JSP,

Para satisfacer los requerimientos de bien formado, las directivas JSP y los elementos scripting en un documento JSP deben estar escritos con una sintaxis diferente a la de una pgina regular JSP.
116

Reglas ms flexibles del formato de documentos JSP


Pgina 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

Ejemplo (a)
Como ejemplo simple considere el siguiente fragmento de cdigo que utiliza JSTL. La accin set crea una variable llamada browser y le asigna el valor de la propiedad User-Agent. La accin out imprime entonces el valor de la variable browser.
<%@ taglib prefix="c" uri="http://java.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

Ejemplo (b)
<%@ taglib prefix="c" uri="http://Java.sun.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.key}"/><br> values: <c:forEach var="val" items="${head.value}"> <c:out value="${val}"/> </c:forEach> <p> </c:forEach> </body> </html>
121

Ejemplo (b)

122

Etiquetas XML
XML esta siendo cada vez mas importante para los creadores de pginas y JSTL proporciona acciones XML que conducen las necesidades bsicas de estos desarrolladores. Las acciones XML pueden ser divididas en core (ncleo), control de flujo (control flow) y acciones de transformacin. Las acciones XML core son parecidas a las acciones proporcionadas por core discutidas anteriormente, e incluyen <x:out>, <x:set>, and <x:parse>. La principal diferencia entre las acciones core discutidas antes y las acciones XML core es que las acciones XML soportan expresiones XPath, mientras las acciones core no.
De hecho, las acciones XML estn basan en expresiones XPath.

Xpath es un lenguaje para definir partes de un documento XML; XPath utiliza expresiones del tipo path para identificar nodos en un documento XML.
123

Etiquetas XML
Las acciones del flujo de control XML son las mismas que las acciones del core discutidas anteriormente. Estas incluyen: <x:if>, <x:choose>, <x:when>, <x:otherwise>, and <x:forEach>. La principal diferencia es que utilizan el atributo select para especificar expresiones XPath. ejemplo: <x:forEach select="$output/portfolio/stock"> <x:out select="price"/> </x:forEach> En la diapositiva siguiente xml-ex1.jsp utiliza las bibliotecas de etiquetas core y XML para procesar un documento XML.
En este ejemplo, el documento XML es incrustado dentro de la pgina y la etiqueta <x:parse> es utilizada para analizar el documento. Entonces una expresin XPath se utiliza para seleccionar artculos dentro del documento.
124

xml-ex1.jsp - i
<%@ taglib prefix="c" uri="http://Java.sun.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. B. C.</author> <price>17.95</price> </book> <book> <title>Book Title B</title> <author>X. Y. Z.</author> <price>24.99</price> </book> </books> </c:set>
125

xml-ex1.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

xml-ex2.jsp
<%@ taglib prefix="c" uri="http://Java.sun.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>Portfolio</h3> <c:import url="http://www.Javacourses.com/stocks.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.jsp

128

Extendiendo el JSTL
Tambin es posible que se pueda utilizar JSTL como base para desarrollar sus propias etiquetas. Algunas clases abstractas son proporcionadas de tal manera que asisten en el desarrollo rpido de etiquetas y promueven la integracin de sus propios etiquetas personalizados con el conjunto de etiquetas JSTL. Por ejemplo, se puede construir sus propias etiquetas personalizados que hagan uso de los mecanismo EL de JSTL.
Mediante extender: Javax.Servlet.jsp.jstl.core.ConditionalTagSupport, se podra escribir una etiqueta condicional simplemente implementado un mtodo que regrese un valor booleado correspondiente con el comportamiento condicional deseado de la etiqueta. o, Javax.Servlet.jsp.jstl.core.IteratorTagSupport, Le permite a implementar fcilmente etiquetas de iteracin.

129

Desarrollando bibliotecas de etiquetas personalizadas como archivos de etiquetas Comenzando con la versin 2.0 de la especificacin JSP, las acciones personalizadas de la biblioteca de etiquetas pueden ser implementadas de dos maneras:
Como clases de java o, Como archivos de texto regular conteniendo elementos de JSP.

En versiones anteriores, las acciones personalizadas podan solamente ser implementadas como clases de java, dejndolas con esto fuera del alcance de los no programadores. Otro problema con la implementacin en java de las acciones personalizadas es que era forzado a imprimir cdigo HTML con llamadas a println() para producir contenido complejo El mismo problema que JSP se supone que resuelve.
130

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. Se debe utilizar un archivo con extension .tag* para identificar este tipo de archivo en el contenedor Web. Todos los elementos JSP que se pueden utilizar en un archivo JSP tambin pueden ser utilizados como un archivo de etiqueta, con excepcin a la directiva page (un archivo de etiqueta no es una pgina). Tambin hay algunas directivas JSP que pueden ser permitidas en un archivo de etiquetas, como lo veremos mas adelante. Aparte de esto, crear un archivo de etiquetas no es diferente de crear una pgina JSP. Una vez creado e instalado, el archivo de etiquetas se utiliza igual que las acciones personalizadas implementadas en java que se han visto anteriormente. 131

Invocacin 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

Un archivo de etiquetas sencillo


copyright.tag
<%@ tag body-content="empty" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <jsp:useBean id="now" scope="application" class="Java.util.Date" /> Copyright &copy; ${now.year + 1900} My Company Este archivo de etiquetas inserta una declaracin de copyright con el ao actual en la pgina que se llama. La primera lnea es una directiva de etiqueta. Se puede utilizar atributos de esta directiva para especificar una descripcin, un icono o un ejemplo, que una herramienta de desarrollo de pginas puede mostrar al diseador. Otros atributos le permiten especificar si las expresiones EL deben ser procesadas, as como informacin relacionada al cdigo del scripting, ejemplo: el mismo tipo de informacin que se especifico con la directiva page en las pgina JSP.

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, queremos decir que el manejador de etiqueta lee o modifica los contenidos del cuerpo o causa evaluacin interactiva del cuerpo.

134

Un archivo de etiquetas sencillo


En la mayora de los casos, los autores de archivos de etiquetas slo se preocupan del atributo que define el contenido del cuerpo (body-content):
Este atributo dice cmo el cuerpo de la accin personalizada debe manejarse, y debe tener uno de los siguientes valores:

empty, scriptless (por defecto), o tagdependent.


Si es empty (vaci), el intentar usar el cuerpo de la accin personalizada da como resultado un error de sintaxis. El valor scriptless significa que el cuerpo puede contener algunos elementos JSP :

En otras palabras, el texto de plantilla, las expresiones EL, las acciones estndares y las acciones personalizadas, todas son permitidas.
Si el atributo se establece a tagdependent el cuerpo del elemento de la accin es tratado como un texto de plantilla (ejemplo, los elementos de la accin y las expresiones EL en el cuerpo no son procesadas, son manejados como texto plano).
135

Un archivo de etiquetas sencillo


El resto del archivo de etiquetas luce como una pgina ordinaria JSP. Declara que utiliza la biblioteca JSTL core, una accin estndar <jsp:useBean> para crear una instancia de la clase Java.util.Date que representa la hora actual y finalmente hace salir el texto esttico mezclado con un valor dinmico (el ao actual) generado por la expresin EL: ${now.year + 1900}.*

136

Notas
Los archivos Tag pueden ser colocados directamente en la aplicacin Web bajo la estructura del directorio o subdirectorio Web-INF/tags. Cada directorio que contiene archivos tag files representa un tag library separado:
Web-INF/tags/ mytags/ copyright.tag forEvenAndOdd.tag htmlFormat.tag motd.tag myothertags/ foo.tag bar.tag
Aqu tenemos dos carpetas de tag: mytags y myothertags. La carpeta mytags contiene el archivo copyright.tag mas otros tres archivos tag. Por defecto, el nombre de las acciones implementadas personalizadas por el archivo tag es el nombre de archivo menos la extensin .tag, as que el archivo copyright.tag representa el nombre de la accin personalizada llamada copyright en la librera mytags.
137

Mas ejemplos
Una pgina JSP debe declarar que utiliza un tag library representada por los archivos tag en la estructura de la aplicacin 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"> ... <my:copyright/> </body> </html>
138

Mas ejemplos
Note que el atributo tagdir es utilizado en lugar que el atributo del URI. El valor del atributo tagdir es la trayectoria relativa del contexto al directorio que contiene los archivos tag para la biblioteca. Puede parecer redundante tener que especificar la parte del path /Web-INF/tags, puesto que todos los directorios tag de la biblioteca deben comenzar con este path. Aunque es costoso, el grupo que cre la especificacin JSP decidi requerir esto para tener consistencia con otros atributos que toman valores del path. Los archivos tag pueden ser empaquetados en archivos JAR.
Esto requiere un poco mas de trabajo y es sobre todo de inters para los archivos tag prever ser reutilizado en muchas aplicaciones.

139

El Tag Handler
Hay dos interfases que describen al tag handler:
Tag usado por los manejadores de etiquetas simples no interesados en la manipulacin del contenido del cuerpo. BodyTag una extensin del tag dando acceso al manejador al cuerpo.

El Tag Handler tiene dos mtodos de accin principales:


doStartTag() procesa el comienzo del tag de esta accin. doEndTag() procesa el final del tag de esta accin. Llamado despus de retornar de doStartTag. release() libera recursos

140

Otros ejemplos
Tags personalizados

141

Tag Handler Hola mundo


Las subclases simples de tag handler soportan la llamada a las clases SimpleTagSupport. Esta clase es una muy buena implementacin de la interfase SimpleTag. Proporciona implementacion de los cinco mtodos de esta interfaz, el ms importante es el mtodo doTag(). El mtodo doTag() en SimpleTagSupport realmente no hace nada hasta que el desarrollador sobreescribe este metodo y codifica la funcionalidad de su tag. El cdigo en la diapositiva siguiente muestran este mtodo en accin.
142

Tag Handler Hola mundo


// Greeter.Java package mab; import Javax.Servlet.jsp.JspException; import Javax.Servlet.jsp.tagext.SimpleTagSupport; import Java.io.IOException; public class Greeter extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().write( "Hello, world!" ); }

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. Las dos declaraciones de importacin nos dan acceso a todas las clases requeridas:
Usted necesitara el Servlet y las clases JSP API en su classpath para que este cdigo compile: Los usuario de Tomcat encontrarn estos en common/lib como jasper-api.jar and Servlet-api.jar.

Por estas razones, esta clase extiende la clase SimpleTagSupport y espera que usted sobrescriba el mtodo doTag().
144

Tag Handler Hola mundo


Otra consecuencia de extender la clase es que un mtodo llamado setJspContext() fue llamado por el contenedor antes del doTag(), que hizo la informacin actual del contexto del JSP disponible va getJspContext(). Utilizamos este mtodo 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, el siguiente paso debera escribir el archivo TLD. El TLD (Tag Library Descriptor) es un archivo XML que el contenedor utiliza para trazar los tags personalizados de sus JSPs a su correspondiente implementacin de clases simples del tag handler. En la siguiente presentacin veremos un demo.tld, un archivo simple del TLD, que cuando esta instalado en el directorio /WebINF/tags/mytags, traza una un tag llamado 'greeter' a la clase 'demo.mytags.tags.Greeter'.
146

Tag Handler Hola mundo


<! demo.tld --> <?xml version="1.0"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://Java.sun.com/j2ee/dtds/Web-jsptaglibrary_1_2.dtd"> <!-- demo.tld --> <taglib> <tlib-version>1</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Demo Tag Library</short-name> <tag> <name>greeter</name> <tag-class>mab.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 versin del tag library y con el prefijo por defecto del tag respectivamente. El elemento de uri, sin embargo vale la pena discutirlo: Cuando se inicializa, el contenedor usa una caracterstica de auto-discovery para trazar todos los elementos de uri a TLD correspondiente; Por lo tanto esta cadena debe ser nica dentro de la aplicacin. As of JSP 1.2, nosotros no tenemos ninguna necesidad de editar el archivo Web.xml para desplegar un tag personalizado la caracteristica del auto-discovery nos ahorra esta inconvenienza. La parte interesante es el contenido del elemento del <tag>. Es donde, entre otras cosas, nosotros podemos dar a nuestro tag un nombre, definir la clase asociado con el tag handler, y determinar si nuestro tag se le debe o no permitir acceso al contenido del cuerpo.

148

Tag Handler Hola mundo


Cortesa de las directivas taglib el atributo uri, tenemos dicho que el JSP esta donde esta nuestro archivo TDL y, por tanto, donde se localiza nuestra clase simple de la implementacin del tag handler. El atributo uri traza directamente a uno de los mappings del contenedor creado cuando se inicializo; El contenedor traza alternadamente puntos a la informacin del TLD. Generalmente, esto se toma con cuidado, si el atributo uri no resuelve la traza al contenedor, se asume el path del archivo:
Esto es til solo cuando los valores idnticos del uri se encuentran en diferentes archivos TLD.
149

Hello World Tag Handler


Este cdigo muestra como podemos utilizar nuestra etiqueta greeter en un JSP:
<!-- greeter.jsp --> <?xml version="1.0"?> <jsp:root xmlns:jsp="http://Java.sun.com/JSP/Page" xmlns:c="http://Java.sun.com/jstl/core" xmlns:my="urn:jsptld:/Web-INF/tags/mytags/demo.tld" version="1.2"> <jsp:directive.page contentType="text/html"/> <html> <head><title>JSP Page</title></head> <body> <!-- prints Hello World. --> <my:greeter /> </body> </html> </jsp:root>
150

Tag Handler Hola mundo


Aqu esta mi comprensin de cmo trabaja el tag personalizado usando el tag "Hello world!" como ejemplo:
Cuando la pgina greeter.jsp es solicitada por primera vez, el servidor Tomcat traducir la pgina JSP a una clase de Java, Cuando el tag personalizado <my:greeter/>es encontrado durante la traduccin, el servidor Tomcat har un seguimiento del archivo TLD para localizar al archivo Greeter.class : Observe que el archivo TLD es proporcionado en el elemento jsp:root. Despus el servidor Tomcat sustituir el tag personalizado con un cierto cdigo de Java al instanciar un objeto de la clase tag, inicializara el objeto y llamara al mtodo doTag() . Para obtener datos de salida en la pgina, usted puede usar el stream del objeto pageContext proporcionado por la extincin tag JSP, pageContext.getOut(): Esta es la manera de como "Hello world!" es producido. 151

Ejemplo final de Tag

152

Ejemplo final de Tag

153

Ejemplo final de Tag

154

Ejemplo final de Tag

155

Ejemplo final de Tag


Los pasos usados por la extensin JSP para facilitar el procesamiento de los tag personalizados pueden ser resumido como sigue:
Instanciamiento del objeto tag, Llamando a setPageContext() y setParent() del objeto tag, Procesando los atributos del tag. Ver mis otras notas sobre como los valores de los atributos son pasados al objeto tag, Llamando a doStartTag() del objeto tag, que puede retornar una bandera a la peticin para saltar el cuerpo y realizar una lgica condicional del cuerpo, Procesamiento del cuerpo del tag, Llamando a doAfterBody() del objeto tag, que puede retornar una bandera a la peticin para procesar el cuerpo otra vez y realizar un ciclo lgico del cuerpo, Llamando a doEndTag() del objeto tag, Llamando a release() del objeto tag.

156

Open Source Tag Libraries


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

Open Source Tag Libraries

158

Integrando Servlets y JSPs

159

Porque combinar Servlets y JSPs?


Panorama: Se trata de usar JSP para hacer ms fcil el desarrollo y mantenimiento de contenido HTML:
Para cdigo dinmico simple, llamar cdigo del Servlet desde expresiones scripting, Para casos moderadamente complejos, utilizar clases personalizadas llamadas expresiones scripting, Para casos mas complicados, use Beans y tags personalizados.

Pero, eso no es suficiente:


Para procesamiento complejo, JSP es lento, An con la conveniencia de separar clases, Beans y tags personalizados. La asuncin detrs es que una pgina sencilla de una apariencia sencilla.

160

Arquitectura
Enfoque:
La peticin original es contestada por el Servlet, El Servlet proceso los datos solicitados, hace bsquedas en la base de datos, accede a la lgica del negocio, etc. La peticin se remite a una pgina JSP para darle formato a los resultados, Diferentes pginas JSP pueden ser usadas para manejar diferentes tipos de formatos.

Terminologa:
A menudo llamada la arquitectura Model View Controller es una aproximacin a JSP. Algo formalizado lo podemos ver en Apache struts framework http://jakarta.apache.org/structs

161

Apache Struts

162

Enviando peticiones
Primero, llamar al mtodo getRequestDispatcher de ServletContext:
Proveer un URL relativo a la raz de las aplicaciones Web. Ejemplo: String url = /presentations/presentation1.jsp; RequestDispatcher dispatcher = getServletContent().getRequestDispatcher(url);

En segundo lugar:
Llamar a forward para transferir completamente el control a la pgina destino vea el ejemplo siguiente. Llama a include para insertar la salida de la pgina destino y continuar.

163

Enviando peticiones: Cdigo ejemplo.


public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String operation = request.getParameter(operation); if (operation == null) operation = unknown; if (operation.equals(operation1)) { gotoPage(/operations/presentation1.jsp, request, response); } else if (operation.equals(operation2)) { gotoPage(/operations/presentation2.jsp, request, response); } else { gotoPage(/operations/unknownRequestHandler.jsp, request, response); }

164

Enviando peticiones: Cdigo ejemplo.(cont..)

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ReuestDispatcher dispatcher = getServletContext(). getRequestDispatcher(address); dispatcher.forward(request, response); }

165

Almacenar datos para uso posterior: El objeto session


Propsito:
Almacenar los datos que el Servlet busc y que la pgina JSP utilizar en esta peticin y en las peticiones siguientes del mismo cliente

Sintaxis del Servlet para almacenar datos:


SomeClass value = new SomeClass(); Session.setAttribute(key, value); // Use RequestDispatcher to forward to the JSP page.

166

Almacenar datos para uso posterior: : The Servlet Context


Propsito:
Almacenar los datos que el Servlet busc y que la pgina JSP utilizara en esta peticin y en las peticiones siguientes del mismo cliente Sintaxis del Servlet para almacenar datos : SomeClass value = new SomeClass(); Get ServletContext().setAttribute(key, value); //Use RequestDispatcher to forward to JSP page

167

On-line Travel Agent

168

Resumen JSP

169

Descripcin
JSP hace mas fcil el crear y mantener HTML, mientras que provee un acceso total al cdigo del Servlet. Las pginas JSPs son traducidas a Servlets:
Es el Servlet el que se ejecuta al momento de una peticin. Para el cliente es totalmente transparente.

Lo que usted necesita entender sobre Servlets:


Comprender como trabaja realmente JSP. El cdigo del Servlet es llamada desde el JSP. El saber cuenco los Servlets son mejores que los JSP. Combinar Servlets y JSPs.

Otras tecnologas tienen un acercamiento similar pero no son portables y no le permiten usar Java para el cdigo verdadero.
170

Ejemplo: Combinando JSP + JavaBeans + JDBC

171

Ejemplos: JSP, JDBC


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

<html> <head> <title>Alumnos</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@ page import="java.sql.*" %>

Ejemplos: JSP y Java Beans

<jsp:useBean id="alum" class="dcc.alumnos" scope="application" />

Alumnos.jsp

</head> <body bgcolor="#FFCCCC"> <div Id="scroll" Style="position:absolute; left:78px; top:50px; width=570; height=420; overflow = auto; border=solid thin #B8D0F0; visibility:visible; z-index:2;; width: 813px; height: 518px"> <p align="center"><strong><font face="Georgia, Times New Roman, Times, serif" color="#000099">Lista de Alumnos</font><font face="Arial" color="#408080" > </font></strong></p> <%

Connection con; String url= "jdbc:mysql://localhost/agendita";


String usuario= "bingo"; String password="holahola"; Statement stmt; ResultSet rs; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); con = DriverManager.getConnection(url,usuario,password); alum.setCn(con); stmt = con.createStatement(); %> <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.executeQuery("Select * from alumnos"); while(rs.next()) {%> <tr> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.getString("nomrbe")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.getString("apellido")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.getString("direccion")%></font></small></td> <td bgcolor="#B8D0F0"><small><font face="Arial"><%=rs.getString("telefono")%></font></small></td> </tr> <%}%> </table> <% } catch(Exception e) { System.out.println("Error al conectarse: "+e.toString()); }%> <form name="form1" method="post" action="VerificaAlumnos.jsp"> <p align="center"><strong><font face="Georgia, Times New Roman, Times, 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

<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.jsp
<html> <head> <title>Alumnos</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <%@ page import="java.sql.*" %> <jsp:useBean id="alum" class="dcc.alumnos" scope="application" />

<body bgcolor="#FFCCCC"> <div Id="scroll" Style="position:absolute; left:259px; top:122px; width=570; height=420; overflow = auto; border=solid thin #B8D0F0; visibility:visible; z-index:2;; width: 509px; 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, Times New Roman, Times, serif">Resultados</font></b></font></td> <tr> </tr> </table>

176

<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.NuevoAlumno()) { %> <p align="center"><strong><font face="Georgia, Times New Roman, Times, serif" color="#000099">El alumno</font><font face="Arial" color="#408080" > &nbsp;<jsp:getProperty name="alum" property="nombre" /> &nbsp;<jsp:getProperty name="alum" property="apellido" /> &nbsp; <font face="Georgia, Times New Roman, Times, serif" color="#000099">se registro correctamente!!!</font> </font></strong></p> <% } else { %> <p align="center"><strong><font face="Arial" color="#408080" > <font face="Georgia, Times New Roman, Times, serif" color="#000099">Se ha generado un error y no se grabo el alumno</font> &nbsp;<jsp:getProperty name="alum" property="nombre" /> &nbsp;<jsp:getProperty name="alum" property="apellido" /> &nbsp; <font face="Georgia, Times New Roman, Times, serif" color="#000099">Verifique...! </font> </font></strong></p> <% } %> <form name="form1" method="post" action="Alumnos.jsp"> <center> <input type="submit" name="btnContinuar" value="Continuar"> </center> </form> </div> </body> </html>

177

Bean Alumnos.java
package dcc; import java.sql.*; public class alumnos { private String nombre; private String apellido; private String direccion; private String telefono; private Connection cn; public void setCn(Connection cn) { this.cn=cn; } public Connection getCn() { return(cn); } public void setNombre(String nombre) { this.nombre=nombre; } public String getNombre() { return(nombre); } public void setApellido(String apellido) { this.apellido=apellido; } public String getApellido() { return(apellido); } public void setDireccion(String direccion) { this.direccion=direccion; } public String getDireccion() { return(direccion); } public void setTelefono(String telefono) { this.telefono=telefono; } public String getTelefono() { return(telefono); }

178

public boolean isAlumno(String nombre) { Statement st; String sqlQuery; if (cn!=null) { try { st= cn.createStatement(); sqlQuery="Select * from alumnos where nomrbe='"+nombre.trim()+"'"; ResultSet rs=st.executeQuery(sqlQuery); if (rs.next()) { this.nombre=nombre; apellido=rs.getString("apellido").trim(); direccion=rs.getString("direccion").trim(); telefono=rs.getString("telefono").trim(); rs.close(); return(true); } else { this.nombre=""; apellido=""; direccion=""; telefono=""; rs.close(); return (false); } }

179

//try catch(SQLException e) { this.nombre=""; apellido=""; direccion=""; telefono=""; return (false); } } else return(false); } public boolean NuevoAlumno() { Statement st; String sqlInsert; if (cn!=null) { try { st= cn.createStatement(); sqlInsert="INSERT INTO alumnos VALUES('"+ nombre.trim() + "','"+ apellido.trim()+"','"+direccion.trim()+"','"+telefono.trim()+"')"; st.executeUpdate(sqlInsert); return(true); } catch(SQLException e) { return(false); } } else return(false); } }

180

Вам также может понравиться