Академический Документы
Профессиональный Документы
Культура Документы
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
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
2.
Evento de iniciacin
Evento de terminacin
_jspDestroy()
Contenedor de Servlets
7
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.
11
Plataforma
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
http://www.delta.com/
15
https://portal.banamex.com.mx/esp/empresarial/monarca/login.jsp
16
http://www.excite.com/
17
18
Ejemplo.
19
Ejemplo
Con la configuracin por defecto, si la localizacin es:
<tomcat_home>/Webapps/ROOT/Expression.jsp
20
Ejemplo
21
22
23
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()%>
Correspondencia JSP/Servlet
Original JSP:
<H1> A Random Number </H1> <%= Math.random() %>
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
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
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); %>
Correspondencia JSP/Servlet
Original JSP:
<%= foo() %> <%= bar() %>
31
32
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() {} %>
Declaraciones JSP
JSP:
<H!>Someheading</H1> <%! private String randomHeading(){ return(<H2> + Math.random() + </H2>); } %> <%= randomHeading()%>
35
36
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
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
40
ambitos
Elemento
Directiva Declaraciones Expresiones Scriptlets
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
<%-- .. . . . .. . . -- %>
44
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
46
47
48
49
contadoryfecha
50
formulario
programa
53
directiva:
session
57
ErrorPage
59
60
Cookies
61
62
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
Una vez declarados los beans, sus propiedades pueden accederse usando el elemento
<jsp:getProperty name=book property=name/>
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
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
numguess
66
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
NumberGuessBean
68
71
72
75
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
mab.*
78
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; } %>
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
86
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
88
89
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:
Usando el ContactSection
Embebido en la pgina Web:
<HTML> <BODY> <HR> <H1> My Page</H!> <HR> <%@ include file=contactSection.jsp %> </BODY> </HTML>
92
93
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
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.
98
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
107
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
110
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
112
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
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
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
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
SKIP_BODY
Process body
release()
release()
Stop
Continue
132
133
134
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
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.
140
Otros ejemplos
Tags personalizados
141
Por estas razones, esta clase extiende la clase SimpleTagSupport y espera que usted sobrescriba el mtodo doTag().
144
145
148
152
153
154
155
156
158
159
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
164
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ReuestDispatcher dispatcher = getServletContext(). getRequestDispatcher(address); dispatcher.forward(request, response); }
165
166
167
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.
Otras tecnologas tienen un acercamiento similar pero no son portables y no le permiten usar Java para el cdigo verdadero.
170
171
<html> <head> <title>Alumnos</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@ page import="java.sql.*" %>
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> <%
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" > <jsp:getProperty name="alum" property="nombre" /> <jsp:getProperty name="alum" property="apellido" /> <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> <jsp:getProperty name="alum" property="nombre" /> <jsp:getProperty name="alum" property="apellido" /> <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