Download Java Server Pages (JSP)

Document related concepts
no text concepts found
Transcript
Java Server Pages
(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.
1
Java Server Pages (JSP)
• 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.
2
Java Server Pages (JSP)
• 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
Propiedad
Java Server Pages
Active Server Pages
Servidor
La mayoría de los servidores más
Conocidos (Apache, Netscape,
MS IIS)
Los servidores de Microsoft (IIS y
Personal Web Server)
Plataforma
Cualquiera que corra una máquina
virtual Java
Windows
Modelo de
componentes
Java Beans, Enterprise Java Beans y
librerías de elementos
COM , DCOM , COM +, .NET
Programación
(scripting)
Java
JavaScript o Visual Basic Script,
c#
Seguridad
Modelo de seguridad de Java
Modelo de seguridad de Windows
NT
Bases de datos
Java Data Base Connectivity
Active Data Objects
Extensibilidad
Abierto a librerías de elementos
Ninguna
3
Java Server Pages (JSP)
•
Arquitectura de JSP
¾ El propósito de JSP es ofrecer una forma
más declarativa y más guiada por la
presentación que aquella conseguida con
los servlets.
¾ Las páginas JSP se utilizan en un proceso
que involucra dos fases:
1. Una fase de traducción dinámica a servlets que se realiza
únicamente cuando la página JSP se crea o modifica.
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().
4
Java Server Pages (JSP)
Arquitectura de JSP
Servlet
Evento de iniciación
_jspInit()
Petición
Respuesta
Evento de terminación
_jspService()
_jspDestroy()
Contenedor de Servlets
Java Server Pages (JSP)
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
bienvenido
helloworld
hellouser
response
NameHandler
5
Java Server Pages (JSP)
Ámbito y Visibilidad de los Objetos JSP
• Los objetos JSP pueden crearse:
¾ implícitamente por directivas JSP
¾ explícitamente a través de acciones
¾ excepcionalmente usando fragmentos de
código
• El ámbito del objeto establece su duración
desde su creación hasta su destrucción; 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.
Ámbito
Categoría
Descripción
4 (mayor)
Aplicación
Pertenecen a la
misma aplicación
3
Sesión
Pertenecen a la
misma sesión
2
Petición
Provienen de la
petición que es
Atendida
1 (menor)
Página
Pertenecen a la
página en que
fueron creados
6
Java Server Pages (JSP)
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
Objeto
Contexto
Descripción
Ámbito
request
HttpServletRequest
Invocación del servicio
Petición
response
HttpServletResponse
Respuesta a la Petición
Página
Características de la página
Dependientes de la
implementación, espacios de
nombres y otras facilidades
Página
http.HttpSession
Conserva el estado de la session
Sesión
application
ServletContext
Contexto del servlet
de configuración
Aplicación
out
jsp.JspWriter
Flujo de salida
Página
config
ServletConfig
Configuración del servlet del JSP
Página
page
Object
Página que procesa
la petición en curso
Página
pageContext jsp.PageContext
session
7
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>
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.
Elemento
Sintaxis
Descripción
Directiva
<%@ . . . . . . . . %>
Importar clases o incluir
archivos HTML
Declaraciones
<%! . . . . . . . . . . %>
Declarar variables o
métodos Java
Expresiones
<%= . . . . . . . . .. %>
Evaluación de expresiones
Java
Scriptlets
<% .. . . . . . . . . .. %>
Ejecución de instrucciones
Java
Comentarios
<%-- .. . . . .. . . -- %>
Texto no procesado
8
Java Server Pages (JSP)
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
Java Server Pages (JSP)
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
9
Java Server Pages (JSP)
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().
Java Server Pages (JSP)
Ejemplo de Declaración
• Código de iniciación para un contador en una
página JSP que declara una variable y los
métodos jspInit() y jspDestroy():
<%! int counter;%>
<%! public void jspInit() {
counter = 0;
}
public void jspDestroy() {
}
%>
10
Java Server Pages (JSP)
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>>
Java Server Pages (JSP)
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>>
<% } %>
11
Java Server Pages (JSP)
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; --%>
Java Server Pages (JSP)
Ejemplo de Contador de Accesos: La siguiente página JSP
muestra un contador de accesos a una página.
<%-- 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>
contadoryfecha
12
Java Server Pages (JSP)
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>
formulario
programa
Java Server Pages (JSP)
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.
<%@page import=”java.util.*”%>
<% synchronized (application)
{
Properties list = application.getAttribute(“users”);
list.add(“ana”,new User(“ana”))
list.setAttribute(“users”,list);
}
%>
13
Java Server Pages (JSP)
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.
Java Server Pages (JSP)
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 .
14
Java Server Pages (JSP)
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.
Java Server Pages (JSP)
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).
15
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>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
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>
16
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
JSP: Uso de Cookies
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.
17
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>
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
JSP: Acciones comunes
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
18
JSP: Usar componentes
JavaBeans
• El modelo de componentes de JSP se basa en la
tecnología JavaBeans que son objetos con un esquema
de nombramiento bien definido.
• 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.
JSP: Usar componentes
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.
19
JSP: Usar componentes
JavaBeans
• El elemento
<jsp:setProperty name=”book” property=”*”/>
• copia los valores pero sólo cuando los nombres en
ambos (los campos de la forma y los atributos del
bean) coinciden.
• Cuando
los
nombres
no
coinciden,
la
correspondencia se debe hacer explícita:
<jsp:setProperty name=”book” property=”propName” parameter=”parmName”/>
JSP: Ejemplo de JavaBeans
•
El siguiente JSP es un juego para adivinar un número.
Copyright (c) 1999 The Apache Software Foundation.
All rights reserved. Number Guess Game
Written by Jason Hunter, CTO, K&A Software http://www.servlets.com
-->
<%@ page import = "num.NumberGuessBean" %>
<jsp:useBean id="numguess“ class="num.NumberGuessBean" scope="session"/>
<jsp:setProperty name="numguess" property="*"/>
<html>
<head><title>Number Guess</title></head>
<body bgcolor="white"> <font size=4>
<% if (numguess.getSuccess()) { %>
Congratulations! You got it.
And after just <%= numguess.getNumGuesses() %>
tries.<p>
<% numguess.reset(); %>
Care to <a href="numguess.jsp">try again</a>?
<% } else if (numguess.getNumGuesses() == 0) { %>
Welcome to the Number Guess game.<p>
numguess
20
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>
JSP: Ejemplo de JavaBeans (Cont…)
•
El siguiente JavaBean se usa en el juego de adivinanza de números.
/* Originally written by Jason Hunter */
package num;
import java.util.*;
public class NumberGuessBean {
int answer;
boolean success;
String hint;
int numGuesses;
public NumberGuessBean() {
reset();
}
public void setGuess(String guess) {
numGuesses++;
int g;
try {
g = Integer.parseInt(guess);
}
catch (NumberFormatException e) {
g = -1;
}
if (g == answer) { success = true; }
else if (g == -1) {hint = "a number next time";
NumberGuessBean
21
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;
}
}
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>
22
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>
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>
23
JSP: Incluir páginas
• El elemento <jsp:include> puede usarse para redirigir una
petición a cualquier página estática o dinámica que esté
en el mismo contexto.
• La llamada también puede incluir los beans como
parámetros de la petición.
• Por
ejemplo,
el
elemento
<jsp:include
permite tener
page=”shopingCart.jsp”
flush=”true”/>
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() %>
24
Ejemplos: JSP y Java Beans
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">
Ejemplos: JSP y Java Beans
<%@ page import="java.sql.*" %>
<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>
25
<%
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>
<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>
26
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>
<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>
27
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);
}
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);
}
}
28
//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);
}
}
29