JSPs Java Server Pages JSPs Ing. Pablo Díaz, MC 1 Páginas de Web con contenido D I N Á M I C O ! JSPs Separa el contenido (generado por programadores) y la presentación (producida por diseñadores) JSPs Ing. Pablo Díaz, MC 2 1 Desarrollo en Web DH atos D e ET ed Java Bas C. Scrip .... t L TM I sD ts C G ise H S e r v l e . ño E T C .. .. . .... C J a T v Gr a E áf ic J P E o G GIF CS ETC S ..... TM L JSPs Ing. Pablo Díaz, MC 3 Servlets Programa en Java produce una página en HTML Java Página de Web Html JSPs Ing. Pablo Díaz, MC 4 2 JSPs Página en Html con “scripts” de Java Html Página de Web Java JSPs import import import import Ing. Pablo Díaz, MC 5 java.io.*; javax.servlet.*; javax.servlet.http.*; java.util.*; public class Fecha extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ ServletOutputStream out = res.getOutputStream(); res.setContentType("text/html"); out.println("<HTML>"); out.println("<HEAD><TITLE> Servlet de Fecha </TITLE></HEAD>"); out.println("<BODY>"); out.println("<h1> La fecha es: "+ new Date().toString() +"</h1>"); out.println("</BODY>"); out.println("</HTML>"); out.close(); } } JSPs Ing. Pablo Díaz, MC 6 3 <HTML> <%@ page import %> <HEAD><TITLE> <BODY> <H1> La fecha </BODY> </HTML> language = "java" = "java.util.*" JSP de Fecha </TITLE></HEAD> es: <%= new Date().toString() %> </H1> JSPs Ing. Pablo Díaz, MC 7 JSPs Java/Html P R O G R A M A D O R A D I S E Ñ A D O R JSPs Ing. Pablo Díaz, MC 8 4 Páginas de Web HTML (Estáticas) CGI (Perl, C) Php Servlets (java) ASPs (vbscript) JSPs (Java) JSPs Ing. Pablo Díaz, MC 9 JSPs Código de Java embebido en página HTML HTML con etiquetas adicionales especícificas para JSPs Tres tipos de etiquetas – – – Elementos de código (scripting) Elementos de acción Elementos directivos JSPs Ing. Pablo Díaz, MC 10 5 Etiquetas de Scripting Comentarios – – <%-- .... --%> <!–- .... --> Declaraciones – <%! ..... %> Expresiones – <%= ..... %> Scriptles – <% ..... %> JSPs Ing. Pablo Díaz, MC 11 Comentarios <!–- comentario [<%= expresión %>] --> Genera un comentario que se envía al cliente y se puede visualizar en el código fuente de HTML <HTML> <%@ page language = "java“ %> <HEAD><TITLE> Jsp1.jsp </TITLE></HEAD> <BODY> <!-- Este comentario aparecer&aacute; en el fuente de la p&aacute;gina --> <H1> P&aacute;gina generada con JSP</H1> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 12 6 Comentarios <%-- Comentario --> Comentario que no se envía al cliente (escondido) Para documentar la página JSP <HTML> <HEAD><TITLE> Jsp2.jsp </TITLE></HEAD> <BODY> <!-- Este comentario aparecer&aacute; en el fuente de la p&aacute;gina --> <%-- Este comentario no aparecerá en el cliente --%> <H1> P&aacute;gina generada con JSP</H1> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 13 Declaraciones <%! Declaraciones %> Para declarar variables o métodos válidos en el lenguaje, para ser utilizados dentro de la página Debe de contener por lo menos un estatuto de declaración válido Cada estatuto debe terminar con ; Se deben declarar las variables y métodos antes de ser usados en la página Se pueden usar variables y métodos de los paquetes importados con la directiva Page, sin necesidas de declararlos explícitamente <%! Int i, j; String s; Date fecha = new Date(); %> JSPs Ing. Pablo Díaz, MC 14 7 Expresiones <%= expresión %> Expresión válida en el lenguaje de script (Java) La expresión se evalúa, se convierte a String y se inserta en la página, en el lugar donde aparece No debe de terminar con ; <HTML> <%@ page language = "java" import = "java.util.*" %> <%! Date fecha = new Date(); %> <HEAD><TITLE> Jsp3.jsp </TITLE></HEAD> <BODY> <B><FONT COLOR=“blue”> Hoy es <%= fecha.toString() %></FONT></B> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 15 Scriptlets <% estatutos %> Puede contener estatutos, declaración de variables o métodos Se pueden usar los objetos implícitos de JSP – request, response, out, . . . . . Se ejecutan en el momento de la petición de la página, al igual que las expresiones Las declaraciones se ejecutan una sola vez, al momento de cargar la página por primera vez . . . . . . JSPs Ing. Pablo Díaz, MC 16 8 Scriptlets <HTML> <%@ page language = "java" import = "java.util.*" %> <%! int accesos = 0; String tipo; %> <HEAD><TITLE> Jsp4.jsp </TITLE></HEAD> <BODY> <% accesos++; if ((accesos%2) != 0) tipo = "impar"; else tipo = "par"; %> <BR>La p&aacute;gina se ha cargado <%= accesos %> <BR>Que quiere decir un n&uacute;mero <%= tipo %> de veces <BR> <% out.print("<FONT COLOR=\"red\">"); out.print(new Date().toString()); out.println("</FONT>"); %> <BR>Fin de la p&aacute;gina </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 17 Declaración de métodos Los métodos se declaran dentro de una etiqueta de declaración (<%! ...... %>) Se pueden usar en toda la página <HTML> <%@ page language = "java" %> <%! int accesos = 0; String tipo; public String tipo(int n){ if ((n%2) != 0) return "impar"; else return "par"; } %> <HEAD><TITLE> Jsp5.jsp </TITLE></HEAD> <BODY> <% accesos++; %> <BR>La p&aacute;gina se ha cargado <%= accesos %> veces <BR>Que quiere decir un n&uacute;mero <%= tipo(accesos) %> de veces </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 18 9 La directiva Page <%@ page [ language [ extends [ import [ session [ buffer [ autoFlush [ isThreadSafe [ info [ errorPage [ contentType [ isErrorPage = = = = = = = = = = “java” ] “package.clase” ] “{package.class | package.*},...] “true|false” ] “none|8kb|sizeKb” ] “true|false” ] “true|false” ] “text” ] “relativeURL” ] “mimeType [;charset=charSet]”| “text/html ; charset = ISO-8859-1” ] = “true|false” ] %> JSPs Ing. Pablo Díaz, MC 19 Objetos implícitos request response out session application config pageContext page JSPs Ing. Pablo Díaz, MC 20 10 request <HTML> <HEAD> <TITLE>Jsp6.html</TITLE> </HEAD> <BODY BGCOLOR="white" TEXT="black" LINK="blue" VLINK="purple"> <H1>Formulario</H1> <P>Esta forma llamará a una JSP y regreserá el primer dato en minúsculas y el segundo en mayúsculas <BR><FORM ACTION="Jsp6.jsp" METHOD="GET"> <BR> Dato1: <INPUT NAME="caja1"> <BR> Dato2: <INPUT NAME="caja2"> <BR><INPUT TYPE="SUBMIT" VALUE="ENVIA"> </FORM> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC <%@ page language="java" %> <HTML> <HEAD><TITLE>Jsp6.jsp</TITLE></HEAD> <BODY> <% String s1 = request.getParameter("caja1"); String s2 = request.getParameter("caja2"); %> <BR> Dato1: <%= s1.toLowerCase() %> <BR> Dato2: <%= s2.toUpperCase() %> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 21 request 22 11 JDBC con JSPs JSPs Ing. Pablo Díaz, MC 23 JDBC con JSPs <html> <head> <title>Despliega.jsp</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <%@ page languaje = "java" import = "java.sql.*" errorPage = "Error.jsp" %> <%! Connection conexion; Statement estatuto; ResultSet rs; String nombres, apellidos, puesto, correo; int cont; %> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion = DriverManager.getConnection("jdbc:odbc:cursojava"); %> <body bgcolor="#000099"> <h1 align="center"><font color="#FFFF00">Lista de Alumnos</font></h1> JSPs Ing. Pablo Díaz, MC 24 12 <table width="100%" border="1"> <tr> <th width="5%"><font color="#00FF00"><b></b></font></th> <th width="49%"><font color="#00FF00"><b>Nombre</b></font></th> <th width="17%"><font color="#00FF00"><b>Puesto</b></font></th> <th width="29%"><font color="#00FF00"><b>Correo</b></font></th> </tr> <% estatuto = conexion.createStatement(); rs = estatuto.executeQuery("SELECT * FROM alumnos ORDER by apellidos"); cont = 0; while(rs.next()){ cont++; nombres = rs.getString("nombres"); apellidos = rs.getString("apellidos"); puesto = rs.getString("puesto"); correo = rs.getString("correo"); %> <tr> <td width="5%"><b><font color="#FFFFFF"><%= cont %></font></b></td> <td width="49%"><b><font color="#FFFFFF"><%= nombres +" "+ apellidos %> </font></b></td> <td width="17%"><b><font color="#FFFFFF"><%= puesto %></font></b></td> <td width="29%"><b><font color="#FFFFFF"> <A HREF=mailto:<%= correo %> > <font color="#FF0033"><%= correo %></font></A></font></b></td> </tr> <% } rs.close(); estatuto.close(); conexion.close(); %> </table> JSPs Ing. Pablo Díaz, MC 25 <table width="100%" border="1"> <tr> <th width="5%"><font color="#00FF00"><b></b></font></th> <th width="49%"><font color="#00FF00"><b>Nombre</b></font></th> <th width="17%"><font color="#00FF00"><b>Puesto</b></font></th> <th width="29%"><font color="#00FF00"><b>Correo</b></font></th> </tr> <% estatuto = conexion.createStatement(); rs = estatuto.executeQuery("SELECT * FROM alumnos ORDER by apellidos"); cont = 0; while(rs.next()){ cont++; nombres = rs.getString("nombres"); apellidos = rs.getString("apellidos"); puesto = rs.getString("puesto"); correo = rs.getString("correo"); %> <tr> <td width="5%"><b><font color="#FFFFFF"><%= cont %></font></b></td> <td width="49%"><b><font color="#FFFFFF"><%= nombres +" "+ apellidos %> </font></b></td> <td width="17%"><b><font color="#FFFFFF"><%= puesto %></font></b></td> <td width="29%"><b><font color="#FFFFFF"> <A HREF=mailto:<%= correo %> > <font color="#FF0033"><%= correo %></font></A></font></b></td> </tr> <% } rs.close(); estatuto.close(); conexion.close(); %> </table> JSPs Ing. Pablo Díaz, MC 26 13 Una JSP es un Servlet! GET Archivo.jsp Página HTML JSPs Ing. Pablo Díaz, MC 27 Una JSP es un Servlet! Verificar fecha en archivo Archivo.jsp – – Generar código java Compilar y generar .class Ejecutar y generar HTML Página HTML Archivo.class JSPs Ing. Pablo Díaz, MC Archivo.java 28 14 jspInit() y jspDestroy() <%! Connection conexion; Statement estatuto; ResultSet rs; String nombres, apellidos, puesto, correo; int cont; public void jspInit(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conexion = DriverManager.getConnection("jdbc:odbc:cursojava"); }catch(ClassNotFoundException e1){ System.err.println("Error en la clase"); }catch(SQLException e2){ System.err.println("Error en SQL"); } } public void jspDestroy(){ try{ conexion.close(); }catch(SQLException e2){} } %> JSPs Ing. Pablo Díaz, MC 29 Rendimiento Impacto inicial – Generación del .class Servlet en memoria Código generado – – Puede ser más eficiente que el producido por el programador out.print à out.write Producción!!!!!!!!!! – Más rápida y adecuada JSPs Ing. Pablo Díaz, MC 30 15 JavaBeans Son componentes Clases que eventualmente se convertirán en objetos Siguen ciertas reglas un poco más estrictas que las clases normales Nacieron como componentes gráficos para IDEs JSPs Ing. Pablo Díaz, MC 31 JavaBeans Si se usan bien realmente nos dan la separación entre diseño y contenido que tanto se necesita No hay que olvidar que en última instancia un bean es una clase, de la cual se pueden crear objetos JSPs Ing. Pablo Díaz, MC 32 16 JavaBeans, ¿dónde van? Son clases que deben de estar accesibles por medio del classpath del contenedor de JSPs La manera más fácil es ponerlos en el directorio classes, que está en el directorio WEB-INF de la aplicación de Web Los ejemplos que están en la literatura usan paquetes para agrupar los beans, y estos deben de seguir la estructura jerárquica correspondiente JSPs Ing. Pablo Díaz, MC 33 Reglas Debe de tener un constructor sin parámetros No debe de tener variables de ejemplar públicas Las variables (propiedades) del bean se deben de obtener o modificar por medio de métodos llamados getXxx y setXxx JSPs Ing. Pablo Díaz, MC 34 17 Ejemplo import java.util.*; import java.text.*; public class FechasBean{ private Locale local = new Locale("es","MX"); public FechasBean(){} public String getFechaLarga(){ DateFormat f = DateFormat.getDateInstance(DateFormat.FULL, local); return f.format(new Date()); } public String getHoraCorta(){ DateFormat f = DateFormat.getTimeInstance(DateFormat.SHORT, local); return f.format(new Date()); } } JSPs Ing. Pablo Díaz, MC 35 FechaBean.jsp <html> <%@ page language = "java" %> <jsp:useBean id="fecha" scope="page" class="FechasBean" /> <body> <H1> La fecha de es: <jsp:getProperty name="fecha" property="fechaLarga" /> </H1> <H1> La hora es: <jsp:getProperty name="fecha" property="horaCorta" /> </H1> </body> </html> JSPs Ing. Pablo Díaz, MC 36 18 Alcance de un bean “Tiempo” de vida dado por scope page – Se crea cada vez que se carga la página (Fecha2.jsp) session – Dura toda la sesión de peticiones (requests) (Fecha3.jsp) application – Para compartir los beans con otros servlets y jsps con sesiones diferentes (Fecha4.jsp) JSPs Ing. Pablo Díaz, MC 37 Un mejor Despliega <HTML> <HEAD> <TITLE>DespliegaConBean.jsp</title> </HEAD> <%@ page language = "java" errorPage = "Error.jsp" %> <jsp:useBean id="despliega" scope="application" class="DespliegaBean" /> <BODY> <H1 align="center">Lista de Alumnos</H1> <jsp:getProperty name="despliega" property="participantes" /> <H1 align="center">Fin de la lista </H1> </BODY> </HTML> JSPs Ing. Pablo Díaz, MC 38 19 DespliegaBean.java import java.util.*; import java.sql.*; public class DespliegaBean{ private Connection conexion; private String baseDeDatos ="jdbc:odbc:cursojava"; private Statement estatuto; private ResultSet rs; public DespliegaBean(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException e){} } JSPs Ing. Pablo Díaz, MC 39 DespliegaBean.java synchronized public String getParticipantes(){ Alumno inscrito; StringBuffer buffer = new StringBuffer(500); buffer.append("<CENTER><TABLE BORDER WIDTH=100% CELLPADDING=5>\n"); buffer.append("<TR>\n"); buffer.append("<TH></TH>\n"); buffer.append("<TH>Nombre</TH>\n"); buffer.append("<TH>Puesto</TH>\n"); buffer.append("<TH>Correo</TH>\n"); buffer.append("</TR>\n"); JSPs Ing. Pablo Díaz, MC 40 20 DespliegaBean.java try{ conexion = DriverManager.getConnection(baseDeDatos,"",""); estatuto = conexion.createStatement(); rs = estatuto.executeQuery("SELECT * FROM alumnos ORDER BY apellidos"); int cont = 1; while(rs.next()){ inscrito = new Alumno(rs); buffer.append("<TR>\n"); buffer.append("<TD>"+String.valueOf(cont)+"</TD>\n"); buffer.append("<TD>"+inscrito.getApellidos()+", "+ nscrito.getNombres()+"</TD>\n"); buffer.append("<TD>"+inscrito.getPuesto()+"</TD>\n"); buffer.append("<TD><A HREF=mailto:"+inscrito.getCorreo()+ "> "+inscrito.getCorreo()+"</TD>\n"); buffer.append("</TR>\n"); cont++; } rs.close(); estatuto.close(); conexion.close(); }catch(SQLException e){} buffer.append("</TABLE>"); return buffer.toString(); JSPs Ing. Pablo Díaz, MC 41 Manejo de Sesiones A veces el usuario inhibe las cookies Tenemos que tener métodos alternos para manejar estado del cliente Existen métodos ya probados: – URLrewriting y campos escondidos URLrewriting es tremendamente tedioso JSPs Ing. Pablo Díaz, MC 42 21 Manejo de sesiones Java implementó una clase que maneja sesiones Inicialmente trata de usar cookies y si no puede lo hace a través de URLrewriting Pero es completamente transparente Ver ejemplos JSPs Ing. Pablo Díaz, MC 43 Modelos I y II Son modelos para el desarrollo de aplicaciones en Web Inicialmente nos vemos tentados a utilizar solamente JSPs (por su facilidad) Pero acabamos con código muy difícil de mantener, nuestros JSPs se hacen cada vez más complicados JSPs Ing. Pablo Díaz, MC 44 22 Modelo 1 Petición JSP Respuesta Base De Datos JavaBean JSPs Ing. Pablo Díaz, MC 45 Modelo 2 Petición servlet Base De Datos Respuesta JSP JSPs JavaBean Ing. Pablo Díaz, MC 46 23 Todos los derechos reservados © Copyright 2004 Pablo Díaz Prohibida su reproducción parcial o total sin consentimiento por escrito del autor. JSPs Ing. Pablo Díaz, MC 47 24