• No se han encontrado resultados

Java Server Pages (JSP)

N/A
N/A
Protected

Academic year: 2022

Share "Java Server Pages (JSP)"

Copied!
29
0
0

Texto completo

(1)

(JSP)

Dr. Víctor J. Sosa S.

Java Server Pages (JSP)

• Características

¾ El Servidor Java de Páginas (Java Server Pages, JSP) ofrece no sólo la independencia de operar en diferentes plataformas y servidores de páginas Web, sino que además combina el poder de la tecnología Java en el servidor con la facilidad de visualizar el contenido de las páginas HTML.

• JSP es una tecnología que generalmente incluye:

¾ Componentes estáticos HTML/XML

¾ Elementos JSP especiales

¾ Fragmentos especiales de código escritos en

lenguaje Java llamados scriptlets.

(2)

• Características

¾La especificación JSP extiende la tecnología de servlets para reducir la programación requerida en el desarrollo de páginas Web dinámicas.

¾ JSP permite apreciar mejor la distinción entre el contenido de la información y su presentación.

Java Server Pages (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.

(3)

• Comparación entre JSP y ASP

¾ ASP (Active Server Pages) es una tecnología similar a JSP pero que difiere también en varios aspectos como se indica en la siguiente tabla.

JSP vs. ASP

Active Data Objects Java Data Base Connectivity

Bases de datos

Ninguna Abierto a librerías de elementos

Extensibilidad

COM , DCOM , COM +, .NET Java Beans, Enterprise Java Beans y

librerías de elementos Modelo de

componentes

JavaScript o Visual Basic Script, c#

Java Programación

(scripting)

Modelo de seguridad de Windows NT

Modelo de seguridad de Java Seguridad

Windows Cualquiera que corra una máquina

virtual Java Plataforma

Los servidores de Microsoft (IIS y Personal Web Server)

La mayoría de los servidores más Conocidos (Apache, Netscape, MS IIS)

Servidor

Active Server Pages Java Server Pages

Propiedad

(4)

• 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.

2. Una fase de contestación a peticiones que se consigue cuando las clases de los servlets generados se cargan en el contenedor de servlets.

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().

(5)

Arquitectura de JSP

_jspInit()

_jspService()

_jspDestroy() Evento de iniciación

Petición Respuesta

Evento de terminación

Contenedor de Servlets Servlet

Ejemplo de una Página JSP:

• La siguiente página JSP presenta un saludo.

<%-- Esta página da un saludo y despedida --%>

<HTML>

<BODY>

<H1>Bienvenido a JSP!</H1>

<% out.println("Regrese pronto”); %>

</BODY>

</HTML>

N

Java Server Pages (JSP)

bienvenido helloworld hellouser response NameHandler

(6)

Á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; su visibilidad indica los lugares de la página donde puede usarse el objeto.

Java Server Pages (JSP)

Ámbito y Visibilidad de Objetos

• La siguiente tabla muestra los ámbitos que pueden asociarse a los objetos recién creados.

Pertenecen a la página en que fueron creados Página

1 (menor)

Provienen de la petición que es Atendida Petición

2

Pertenecen a la misma sesión Sesión

3

Pertenecen a la misma aplicación Aplicación

4 (mayor)

Descripción Categoría

Ámbito

(7)

Objetos Implícitos

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

Java Server Pages (JSP)

• Objetos Implícitos

Página Página que procesa

la petición en curso Object

page

Página Configuración del servlet del JSP

ServletConfig

config

Página Flujo de salida

jsp.JspWriter

out

Aplicación Contexto del servlet

de configuración ServletContext

application

Sesión Conserva el estado de la session

http.HttpSession

session

Página Características de la página

Dependientes de la implementación, espacios de

nombres y otras facilidades jsp.PageContext

pageContext

Página Respuesta a la Petición

HttpServletResponse

response

Petición Invocación del servicio

HttpServletRequest

request

Ámbito Descripción

Contexto

Objeto

(8)

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>

ambitos

Java Server Pages (JSP)

Elementos Básicos de JSP

• La sintaxis de JSP consiste de un conjunto de elementos que se intercalan entre aquellos de HTML o XML.

Texto no procesado

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

Comentarios

Ejecución de instrucciones Java

<% .. . . .. %>

Scriptlets

Evaluación de expresiones Java

<%= . . . .. %>

Expresiones

Declarar variables o métodos Java

<%! . . . %>

Declaraciones

Importar clases o incluir archivos HTML

<%@ . . . %>

Directiva

Descripción Sintaxis

Elemento

(9)

Directivas

Las directivas son instrucciones dirigidas al contenedor de servlets JSP, no al flujo de salida.

• Las directivas determinan los atributos de la página y las dependencias con el contenedor.

• 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,

¾ 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, 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, se tienen múltiples procesos concurrentes)

¾ errorPage que permite indicar si la página se usa para anunciar un error

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 están guardados en el archivo sty.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

Java Server Pages (JSP)

(10)

Declaraciones

• La sintaxis de una declaración es <%! declaración %> o, alternativamente, 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.

• Las variables declaradas pueden inicializarse y deben estar terminadas por punto y coma.

• Las declaraciones de métodos, además de aquellos usados en la aplicación, pueden también incluir a

jspInit() y jspDestroy().

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():

Java Server Pages (JSP)

<%! int counter;%>

<%! public void jspInit() { counter = 0;

}

public void jspDestroy() { }

%>

(11)

Expresiones

La sintaxis de una expresión es <%= expresión %> o, alternativamente, 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.

• Las expresiones pueden incluirse en gran variedad de contextos y no deben terminarse por puntos y comas.

• Ejemplo de Expresiones

¾ La siguiente expresión produce un elemento H1 usado para escribir el texto de un encabezado

:

<%! int i = 1; %>

<H<%=i%>>Java Server Pages</H<%=i>>

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 código Java, extendido por elementos HTML y no limitado a una línea.

• Ejemplo de Scriptlets: El siguiente scriptlet produce una secuencia de encabezados con tamaño decreciente:

<% for (int i=1; i<5; i++) { %>

<H<%=i%>>Java Server Pages</H<%=i>>

<% } %>

Java Server Pages (JSP)

(12)

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 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)

<%-- int i = 1; --%>

Ejemplo de Contador de Accesos: La siguiente página JSP muestra un contador de accesos a una página.

Java Server Pages (JSP)

<%-- Esta página da la fecha y hora cuando fue soliciatada así como el número de accesos --%>

<%@ page import="java.util.*"%>

<%! Date loadDate = new Date();

int loadCounter = 1;

%>

<HTML>

<BODY>

<H1>Bienvenido!</H1>

<H2>Desde <%=loadDate%>,

ésta página ha sido accesada <%=loadCounter%>

<% if (loadCounter++ == 1) out.println("vez.<BR>");

else

out.println("veces.<BR>");

%>

<% out.println("Regrese pronto"); %>

</H2>

</BODY>

</HTML>

(13)

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>

programa formulario

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 desempeño de sistemas con muchos procesos.

Una alternativa es usar regiones críticas en scriptlets para sincronizar el acceso a objetos compartidos.

Java Server Pages (JSP)

<%@page import=”java.util.*”%>

<% synchronized (application) {

Properties list = application.getAttribute(“users”);

list.add(“ana”,new User(“ana”)) list.setAttribute(“users”,list);

}

%>

(14)

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 directiva page se usa para indicar que la página recibe las excepciones lanzadas por algún scriptlet.

• Además, 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.

Ejemplo de manejo de excepciones

• Para manejar errores a tiempo de ejecución, se puede usar una página que indique la naturaleza del error.

• Dicha página debe incluir entre sus directivas la siguiente:

<%@page isErrorPage=”false” errorPage=”Error.jsp”%>

• la página redirige a su vez el objeto exception a la página Error.jsp .

• La página Error.jsp debe contener a su vez, la directiva:

<%@page isErrorPage=”true” %>

• Esta indicación permite acceder al objeto exception en la página Error.jsp .

Java Server Pages (JSP)

(15)

Manejo de Sesiones

• Por omisión todas las páginas JSP participan en una sesión HTTP.

• El objeto session (de tipo HttpSession ) está disponible para almacenar objetos que persistan a lo largo de la vida de la aplicación.

• El atributo session de la directiva page se usa para permitir o negar el acceso al objeto session en la página; por omisión, el objeto session es accesible.

• La directiva <%page session=”false”%> indica que en la página no se usarán 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; si el browser no maneja cookies, la sesión se mantiene por reescritura del URL.

• 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, los objetos se marcan para su recolección como basura.

Manejo de Sesiones

• No se pueden guardar tipos simples en una sesión, pero se puede guardar cualquier tipo de objeto identificado por una cadena única de caracteres.

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();

session.putValue(“book”,book);

%>

• El objeto book puede recuperarse realizando una coerción para convertirlo al tipo apropiado:

<% Book book = (Book)session.getValue(“book”); %>

• 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.

• Generalmente, 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).

Java Server Pages (JSP)

(16)

<%--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>Reducción 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

<%--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>

</HTML>

JSP: Ejemplo de Sesiones

session1

(17)

• 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>

</HTML>

session2 session3 ErrorPage

Uso de cookies

• Las cookies ya fueron introducidas en la programación con servlets; en JSP es igual de simple su programación.

• 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.

• Una vez obtenida una cookie de la petición, ésta se puede leer, modificar y alterar su fecha de expiración (cambiando su edad máxima).

• Además, en cualquier momento se puede agregar nuevas cookies a las ya existentes.

JSP: Uso de Cookies

(18)

<%--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>

Duración máxima en segundos: <%= cookies[i].getMaxAge() %><br>

<% cookies[i].setMaxAge(5); %>

Nueva duración en segundos: <%= cookies[i].getMaxAge() %><br>

<% } %>

<%! int count = 0; int dcount = 0; %>

<% response.addCookie(new Cookie("Bob" + count++,"Dog" + dcount++)); %>

</BODY>

</HTML>

Cookies

Acciones Comunes

• Las acciones permiten realizar tareas sofisticadas reduciendo considerablemente la codificación requerida en Java.

• Las acciones se manifiestan usando elementos especiales (tags) los cuales promueven la reutilización de componentes mejorando el mantenimiento de la aplicación.

• Las acciones que se van a analizar son:

¾ usar componentes JavaBeans

¾ redirigir mensajes

¾ encadenar peticiones

¾ incluir peticiones

JSP: Acciones comunes

(19)

• El modelo de componentes de JSP se basa en la tecnología 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 métodos públicos apropiados.

• Un bean debe identificarse con un nombre con ámbito de sesión 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 sesión;

• si se encuentra este elemento en otra página, el objeto se recuperará entonces de la sesión.

JavaBeans

• El elemento

jsp:useBean

también puede tener estructura, la cual consiste de un scriptlet que realiza la iniciación de las propiedades del bean cuando éste se crea.

<jsp:useBean id=”bookBean” class=”com.beans.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, 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.

JSP: Usar componentes

JavaBeans

(20)

• 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”/>

JavaBeans

• El siguiente JSP es un juego para adivinar un número.

JSP: Ejemplo de JavaBeans

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

(21)

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>

• El siguiente JavaBean se usa en el juego de adivinanza de números.

JSP: Ejemplo de JavaBeans (Cont…)

/* 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

(22)

}

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;

} }

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>

(23)

<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>

<!--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>

JSP: Ejemplo, redirigir mensajes (Cont….)

(24)

• 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.

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() %>

(25)

Este ejemplo involucra a dos páginas 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 validación 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 aplicación. El tipo de base de datos utilizada es MySQL:

Tabla Alumnos:

nombre: varchar(30) apellido: varchar(30) direccion: varchar(30) telefono: varchar(30)

<html> <head>

<title>Alumnos</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<%@ page import="java.sql.*" %>

<jsp:useBean id="alum"

class="dcc.alumnos"

scope="application"

/>

</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>

Ejemplos: JSP y Java Beans

Alumnos.jsp

(26)

{%>

<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>

<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>

(27)

<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>

<br>

<jsp:setProperty name="alum" property="nombre" param="nombre"/>

<jsp:setProperty name="alum" property="apellido" param="apellido"/>

<jsp:setProperty name="alum" property="direccion" param="direccion"/>

<jsp:setProperty name="alum" 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>

(28)

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);

}

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);

} }

(29)

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);

} }

Referencias

Documento similar

el ser cuna de nuevo dios portador de bienes innúmeros para campos y ciudades, y ha es- cogido entre todas las mujeres a esta hija de Cadmo y Harmonía, para ser la madre de su

The twelve chapters of Structural Biology of Bacterial Pathogenesis review current knowledge on the structure of proteins involved in bacterial pathogenesis, either directly (such

In Microbial Genomes, an introductory chapter (History of microbial genomics) describes the pathway that has led from those first labor-intensive, time-consuming sequencing

Of the different ways to convey scientific knowledge, Ramon Parés, Microbiology Professor Emeritus of the University of Barcelona, Spain, has chosen the form of letters addressed to

The other ten chapters of Part II describe the organization of viral genomes, provide an over- view of viral strategies for genome replication and mRNA synthesis, discuss the

During the research process, a toolkit to support manufacturers in servitization was developed, evaluated and fine- tuned through individual expert discussions with five

FR Libro est une bibliothèque modulaire qui joue sur des modules carrés ou rectangulaires, avec tablet tes, suppor ts et caissons de rangement, pour résoudre les plus

Más allá de su caracterización tradicional (p. ej., Gutiérrez, 2008), el manual académico podría pensarse, a su vez, como un género que media entre el texto de