Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutorial de JSP
Tutorial de JSP
LICENCIA
Crystal ReportCurso
JSP Ejemplo Ejemplo JSP/NetbeansExpresiones FileZilla FTP Server FormatHM NIS Edit Hola Mundo IDE
Linux Mercury Mail Transport System MySQL MySQL 5.1 NetbeansNetbeans 6.5 NetBeans 6.7NetBeans 6.8 Netbeans 6.9Netbeans 6.9 (Linux) Netbeans 7.0 NetBenas 6.8 NSIS Palabras reservadas PHP PHP5 phpMYAdminPOO servlet StringToWideCharStrToCrr StrToDate StrToDateTimeStrToInt StrT
oInt64 StrToInt64DefStrToIntDef StrToTime Sun Microsystem
swing TButton
XAMPP XDEBUG
BLOGROLL
DELPHI
IDE
JAVA
GUJ (Mexico) GUJ (Uruguay) Java Hispano Java User Groups(JUGs) java.net
JSP/SERVLETS
Eclipse + JSP Recursos JSP Univ. Huelva JSP v2.0 / Servlets v2.4 Univ. Navarra Aprenda Servlets de Java
PHP
PYTHON
SGBD
VISITAS:
380,546 hits
buscar
1 Votes Realizaremos en esta entrada un ejercicio de utilizacin de JSP para resolver la creacin, modificacin y eliminacin de registros en una tabla denominada libros de una base de datos denominada biblioteca diseada en mySQL. El ejemplo es un mero ejercicio didctico de cmo utilizar JSP, advirtiendo que dicho ejercicio en sentido estricto habra que resolverlo con cierto carcter cientfico con ayuda de un servlet y respetando el Modelo Vista Controlador (que dejaremos para ms adelante). La tabla es la que sigue,
con
Iniciamos seguidamente una sesin de Netbeans y hacemos desde el men principal Archivo, Proyecto nuevo, Java Web, Web Application, llamamos al proyecto GesTablaJSP y sustituimos el archivo index.jsp plantilla por el siguiente cdigo:
<%-Document : index Created on : 25-dic-2012, 10:05:15 Author : Jtaguaa --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Actualizar, Eliminar, Crear registros.</title> </head> <body> <form action="AECTabla.jsp" method="post" name="Actualizar"></form> <table> <tr> <td>ISBN</td> <input type="text" name="isbn" value="" size="40"/> </tr> <tr> <td>Ttulo</td> <input type="text" name="titulo" value="" size="50"/> </tr>
<tr><td> Action </td> <td> <input type="radio" name="Action" value="Actualizar" /> Actualizar <input type="radio" name="Action" value="Eliminar" /> Eliminar <input type="radio" name="Action" value="Crear" checked /> Crear </td> </tr> <input type="SUBMIT" value="Submit" /> </tr> </table> </form> </body> </html> donde puede verse que se trata de cdigo HTML con JSP que describe un formulario. Esto es lo que ms tarde en el Modelo, Vista Controlador ser la Vista, es decir, la presentacin de los datos de los distintos campos de la tabla. La ejecucin de dicho archivo presenta en el cliente o en el browser la pantalla
Si en esta pantalla pulsamos Submit enviaremos una peticin al servidor de la pgina AECTabla.jsp, amn de la cabecera de la peticin, enviaremos los tres variables implicadas en el formulario, es decir: isbn, titulo y Action. Tenemos pues que crear en el mismo proyecto otro archivo jsp que resuelva la cuestin del alta, modificacin o eliminacin de los registros. Para ello, una vez seleccionado el proyecto, hacemos click con el botn derecho para mostrar el menu contextual
Damos nombre AECTabla al nuevo archivo jsp y sustituimos seguidamente el cdigo de la plantilla por el siguiente, <%-Document : AECTabla Created on : 25-dic-2012, 10:11:06 Author : Jtaguaa --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import = "java.sql.*" %> <% /* Paso 1) Obtener los datos del formulario */ String ls_isbn = request.getParameter("isbn");
String ls_titulo = request.getParameter("titulo"); String ls_action = request.getParameter("Action"); /* Paso 2) Inicializar variables */ String ls_result = "Base de datos actualizada..."; String ls_query = ""; String ls_dburl = "jdbc:mysql://127.0.0.1:3306/biblioteca"; String ls_usuario = "root"; String ls_password = ""; String ls_dbdriver = "com.mysql.jdbc.Driver"; /* Paso 3) Crear query */ if (ls_action.equals("Crear")) { ls_query = " insert into libros (isbn, titulo)"; ls_query += " values ("; ls_query += "'" + ls_isbn + "',"; ls_query += "'" + ls_titulo + "')"; } if (ls_action.equals("Eliminar")) { ls_query = " delete from libros where isbn = "; ls_query += "'" + ls_isbn + "'"; } if (ls_action.equals("Actualizar")) { ls_query = " update libros"; ls_query += " set titulo= " + "'" + ls_titulo + "',"; ls_query += " where isbn = " + "'" + ls_isbn + "'"; } /* Paso4) Conexin a la base de datos */ Connection l_dbconn = null; try { Class.forName(ls_dbdriver); /* getConnection(URL,User,Pw) */ l_dbconn = DriverManager.getConnection(ls_dburl,ls_usuario,ls_password);
/*Creacin de SQL Statement */ Statement l_statement = l_dbconn.createStatement(); /* Ejecucin de SQL Statement */ l_statement.execute(ls_query); } catch (ClassNotFoundException e) { ls_result = " Error creando el driver!"; ls_result += " <br/>" + e.toString(); } catch (SQLException e) { ls_result = " Error procesando el SQL!"; ls_result += " <br/>" + e.toString(); } finally { /* Cerramos */ try { if (l_dbconn != null) { l_dbconn.close(); } } catch (SQLException e) { ls_result = "Error al cerrar la conexin."; ls_result += " <br/>" + e.toString(); } } %> html> <html> <head><title>Updating a Database</title></head> <body> La siguiente instruccin fue ejecutada: <br/><br/> <%=ls_query%> <br/><br/> El resultado fue: <br/><br/> <%=ls_result%> <br/><br/>
<a href="index.jsp">Entre otro valor</a> </body> </html> Para dar de alta un libro entraremos la informacin correspondiente al libro cuyo ttulo es Java Servlet Programming (2ed) y el isbn 0596000405, es decir
Si pulsamos Submit,
Obsrvese que no se han previsto, de manera razonable, las incidencias correspondientes a 1. La Alta de un registro ya existente. 2. La Baja de un registro inexistente. 3. La Actualizacin de un registro no existente. Se le sugiere al lector que estudie estos casos y modifique convenientemente el archivo AECTabla. Como ayuda, intente controlar el objeto e del tipo SQLException a travs del mtodo e.getErrorCode(), y a partir de ah muestre un mensaje ms especfico.
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="java.text.*, java.util.*"%> <!DOCTYPE html> <html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Fecha</h1> <% Date d = new Date(); String hoy = DateFormat.getDateInstance().format(d); %> Hoy es <%=hoy%> </body> </html>
<% String nombre = request.getParameter("NOMBRE"); if(nombre!=null && nombre.length()>0){ out.println("Hola " + nombre); }else{ out.println("No tienes acceso. "); }
%>
<html> <head> <title>Primer Servlet</title> </head> <body> <center><h2>Ejemplo de Ejecucin de un Servlet</h2></center><br><br> <form action=/PrimerServlet/PrimerServlet method=GET> <Center> <BR><input type=submit value="Ejecutar el Servlet"></form> </center> </body> </html>
Cdigo del Servlet //Primer Servlet. //Muy sencillo. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class PrimerServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = new PrintWriter(res.getOutputStream()); out.println("<html>"); out.println("<head><title>HolaMundoServlet</title></head>"); out.println("<body>"); out.println("<h1><center>Hola Mundo desde el servidor WEB</center></h1>"); out.println("</body></html>"); out.close(); } public String getServletInfo() {
Cdigo del Servlet // // SegundoServlet.java // import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class SegundoServlet extends HttpServlet { String nombre; public void service( HttpServletRequest peticion, HttpServletResponse respuesta )
Ejemplo 3: Calculadora.
Pgina HTML <HTML> <HEAD> <TITLE>Calculadora con Servlet</TITLE> </HEAD> <BODY BGCOLOR = "#E0FFE0"
<CENTER> <HR style = "color:green; heigth:6px; width:500"> <FONT size = 5> CALCULADORA </FONT> <HR style = "color:green; heigth:6px; width:500"> <BR> <BR> <FORM action=/CalculadoraServlet/CalculadoraServlet method=POST> <TABLE border = "3" WIDTH = "400" > <TR> <TD aling = "rigth"> <INPUT name="operando1" type="text"> </TD> <TD> <SELECT name="operacion"> <OPTION value= "1" selected > + </OPTION>
<OPTION value= "2" > </OPTION> </OPTION> <OPTION value= "3" > * <OPTION value= "4" > /
</OPTION> </SELECT> <TD aling = "rigth"> <INPUT name="operando2" </TD> </TR> </TABLE> <BR> <BR> <input name="Calcular" value="Calcular" type="submit"> <input name="limpiar" value="Limpiar" type="reset"> </FORM> </CENTER> </BODY> </HTML>
type= "tex
Cdigo del Servlet // // CalculadoraServlet // import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class CalculadoraServlet extends HttpServlet { public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { double op1, op2, result; int operacion; String simb_op[] = {"+", "-", "*","/"}; ServletOutputStream out = res.getOutputStream();
op1 = Double.parseDouble(req.getParameter("operando1")); op2 = Double.parseDouble(req.getParameter("operando2")); operacion = Integer.parseInt(req.getParameter("operacion")); result = calcula(op1, op2, operacion);
out.println("<html>"); out.println("<head><title>Resultado de calcular con Servlet</title></head>"); out.println("<body BGCOLOR = \"#E0E0FF\" TEXT= \"blu out.println("<h1><center>La operacion efectuada es:</center></h1>"); out.println("<h2> <b><center>"+ op1+" "+ simb_op[operacio 1] + " "+ op2 + " = "+ result + "</center></b></h2>"); out.println("</body>"); out.println("</html>"); out.close(); } public double calcula(double op1, double op2, int operacion) { double result = 0; switch (operacion) { case 1: return op1 + op2; case 2: return op1 - op2; case 3: return op1 * op2; case 4: return op1 / op2;
} } }
return result;
Ejemplo 4: Primitiva.
Pgina HTML <html> <head> <title>Primitiva Servlet</title> </head> <body> <h2><center>Primitiva Servlet</center></h2> <form action=/PrimitivaServlet/PrimitivaServlet method=POST> <BR> <BR> <center> Introduce tu combinacin y pulsa el botn de enviar<BR> <BR>NUM1:<input type=text name=NUM1> <BR>NUM2:<input type=text name=NUM2> <BR>NUM3:<input type=text name=NUM3> <BR>NUM4:<input type=text name=NUM4> <BR>NUM5:<input type=text name=NUM5> <BR>NUM6:<input type=text name=NUM6> <BR> <BR><input type=submit value=Enviar Combinacin> <input type=reset value=Borrar> </center> </form> </body> </html> Cdigo del Servlet // // PrimitivaServlet.java // import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class PrimitivaServlet extends HttpServlet { int primi[] = new int[6], combiUsuario[] = new int[6]; int i, contador=0, aux, aciertos=0; Random rand = new Random(); public void init(ServletConfig config) throws ServletException { super.init(config);
primi[contador] = aux;
contador++; }
} //ordenamos el array Arrays.sort(primi); } private boolean comprueba(int array[], int num) { for (int i=0; i<=5; i++) { if (primi[i]==num) return true; } return false; } public void service( HttpServletRequest peticion, HttpServletResponse respuesta ) throws ServletException, IOException { aciertos=0; ServletOutputStream out = respuesta.getOutputStream(); combiUsuario[0] = Integer.parseInt(peticion.getParameter("NUM1")); combiUsuario[1] = Integer.parseInt(peticion.getParameter("NUM2")); combiUsuario[2] = Integer.parseInt(peticion.getParameter("NUM3")); combiUsuario[3] = Integer.parseInt(peticion.getParameter("NUM4")); combiUsuario[4] = Integer.parseInt(peticion.getParameter("NUM5")); combiUsuario[5] = Integer.parseInt(peticion.getParameter("NUM6"));
out.println("<h2><center>Primitiva Servlet</center></h2>"); //imprimimos todos los nmeros de la combinacin del usuario out.print("<p>Tu combinacin es:</p><B>"); for (i=0; i<6; i++) { out.print(" "+combiUsuario[i]); } out.print("</B>"); //comprobamos la combinacin for (i=0; i<=5; i++) { if (Arrays.binarySearch(primi,combiUsuario[i])>=0) { out.println("<p>Nmero acertado: <B>"+combiUsuario[i]+"</B></p>"); aciertos++; } } out.println("<p>Nmeros acertados: <B>"+aciertos+"</B></p>"); //imprimimos todos los nmeros de la combinacin ganadora out.print("<p>La combinacin ganadora es:</p><B>"); for (i=0; i<6; i++) { out.print(" "+primi[i]); } out.print("</B>"); out.close(); } }
<html> <head> <title>Segundo Servlet</title> </head> <body> <h2><center>Segundo Servlet</center></h2> <form action=/FicheroServlet/FicheroServlet method=POST> <BR> <BR> <center> Introduzca su nombre y pulse el botón de enviar<BR> <BR><input type=text name=TEXTO> <BR> <BR><input type=submit value=Enviar Nombre> <input type=reset value=Borrar> </center> </form> </body> </html> Cdigo del Servlet // // FicheroServlet.java // import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class FicheroServlet extends HttpServlet { StringBuffer mensaje = null; FileOutputStream fos = null; String[] strTEXTO; public void init(ServletConfig config) throws ServletException { super.init(config); FileInputStream fis = null; try { fis = new FileInputStream("c:\\tmp\\texto.txt");
} catch(java.io.IOException e) { e.printStackTrace(); } } public void service( HttpServletRequest peticion, HttpServletResponse respuesta ) throws ServletException, IOException { strTEXTO = peticion.getParameterValues("TEXTO"); ServletOutputStream out = respuesta.getOutputStream(); out.println("<p>"+mensaje+"</p>"); out.println("<p>Su nombre es: "+strTEXTO[0]+"</p>"); out.close(); registrar(); }
public void destroy() { try { fos.close(); } catch(java.io.IOException e) { e.printStackTrace(); } } public synchronized void registrar() { try { } catch(java.io.IOException e) { e.printStackTrace(); } fos.write(strTEXTO[0].getBytes());
} }
fich1.html <HTML> <head> <title> Hola, Mundo </title> </head> <body> <h1> Hola, Mundo! </h1> </body> </HTML> fich2.jsp <%@ page info="Un ejemplo Hola Mundo" import="java.util.Date" %> La fecha de hoy es: <%= new Date().toString() %>
<% } else { %> <%@ include file=comprobar.html%> <% } %> Pgina saludoforward.jsp. <HTML> <head> <title> Saludo al cliente </title> </head> <body> <h1> Saludo al cliente</h1> <% out.println(Bienvenido a la nueva aplicacin"); %> </body> </HTML>
<HTML> <head> <title> Saludo al cliente </title> </head> <body> <h1> Saludo al cliente</h1> <%-- Los parmetros que le pasa el cliente en la peticin se obtienen del objeto implcito request --%> <% String nombre = request.getParameter(nombre"); out.println(Es un placer conocerte, + nombre); %> <%-- Al evaluarse el cdigo hay que escribir explcitamente en la salida (objeto implcito out) --%> </body> </HTML>
La forma estndar de manejo de formularios en JSP es definir un "grano". Esto no es un grano completo de Java. Slo tiene que definir una clase que tiene un campo correspondiente a cada campo en el formulario. Los campos de clase deben tener "setters" que responden a los nombres de los campos del formulario. Por ejemplo, vamos a modificar nuestro GetName.html recoger tambin direccin de
Para recopilar estos datos, se define una clase Java con los campos " nombre de usuario "," email "y" edad "encontrars mtodos setter"setUsername "," setEmail "y" setAge ", tal como se muestra. Un mtodo "setter" es slo un mtodo que empieza con " set "seguido por el nombre del campo. El primer carcter del nombre del campo es en mayscula. As que si el campo es " email ", su" setter mtodo "ser" setEmail ". Los mtodos Getter se definen de manera similar, con "get" en lugar de "set". Tenga en cuenta que los setters y getters () deben ser pblicos.
usuario del paquete; Clase pblica UserData { Cadena nombre de usuario; Email String; int edad; setUsername public void (String value) { username = valor; } public void setEmail (valor de cadena) { email = valor; } void setAge pblico (int valor) { edad = valor; } getUsername public String () {return nombre de usuario;}
public String getEmail () {email return;} ObtenerLongevidad public int () {edad return;} }
Los nombres de los mtodos deben ser exactamente como se muestra. Una vez definida la clase, compilarlo y asegrese de que est disponible en la ruta de clase del servidor Web. El servidor tambin puede definir carpetas especiales donde se pueden colocar las clases de frijol, por ejemplo, con Blazix puede colocarlos en el " clases carpeta ". Si tiene que cambiar la ruta de clase, tendra que ser detenido y reiniciado si ya se est ejecutando el servidor web. (Si usted no est familiarizado con la creacin / modificacin ruta de clase, consulte las notas sobre el cambio de ruta de clases .)
Tenga en cuenta que estamos usando el nombre del paquete de usuario , por lo tanto, el archivo UserData.class debe ser colocado en una carpeta con el nombre del usuario en la entrada classpath. Ahora vamos a cambiar " SaveName.jsp "utilizar un bean para recopilar los datos.
<jsp:useBean id="user" class="user.UserData" Scope="Session"/> <jsp:setProperty name="user" property="*"/> <HTML> <BODY> <A HREF="NextPage.jsp"> Continuar </ A> </ BODY> </ HTML> Todo lo que necesitamos hacer ahora es aadir el jsp: useBean etiqueta y el jsp: setProperty etiqueta! La etiqueta
useBean buscar una instancia de la " user.UserData "en la sesin. Si la instancia que ya est ah, se actualizar la instancia anterior. De lo contrario, se crear una nueva instancia de user.UserData (la instancia del user.UserData se llama un grano), y lo puso en la sesin.
El setProperty recoger automticamente los datos de entrada, haga coincidir los nombres con los nombres de los mtodos de frijol, y colocar los datos en el bean! Vamos a modificar NextPage.jsp para recuperar los datos de frijol ..
<jsp:useBean id="user" class="user.UserData" Scope="Session"/> <HTML>
<BODY> Ha introducido <BR> Nombre: <% = user.getUsername ()%> <BR> Email: <% = user.getEmail ()%> <BR> Edad: <% = user.getAge ()%> <BR> </ BODY> </ HTML>
Tenga en cuenta que la misma etiqueta useBean se repite. El grano est disponible como la variable llamada " usuario "de la clase" user.UserData ".Los datos introducidos por el usuario se recogieron en todo el grano.
En realidad no necesitamos el " SaveName.jsp ", el objetivo de GetName.html podra haber sido NextPage.jsp , y los datos todava estaramos disponibles de la misma manera, siempre y cuando aadimos un jsp: setProperty tag. Pero en el siguiente tutorial, que realmente utilizaremosSaveName.jsp como un controlador de errores que automticamente reenva la solicitud al NextPage.jsp , o le pide al usuario que corrija los datos errneos. Ejercicio: 1) Escriba un conjunto JSP / HTML que permite al usuario introducir el nombre de una propiedad del sistema y, a continuacin, muestra el valor devuelto por System.getProperty para ese nombre de propiedad (controlar los errores appripriately) 2) Volver a los ejercicios. que ha modificado manualmente las variables booleanas. En lugar de una variable booleana, hacer que estos vienen de un campo de formulario oculto que se puede establecer en true o false.
Controladores
A veces, algunas necesidades de tratamiento previo, de que hay que hacer despus de que el usuario ha enviado un formulario. El resultado de esta preprocesamiento decide donde el flujo de control debe ir a continuacin. Dicho cdigo de pre-procesamiento se refiere con frecuencia como un "controlador".
JSP son muy muy apropiados para escribir controladores simples. Para la lgica del controlador ms complejo, JSP pueden llamar fcilmente el cdigo Java en otras clases. Un controlador de ejemplo se muestra a continuacin:
<jsp:useBean id="user" class="user.UserData" Scope="Session"/>
<jsp:setProperty name="user" property="*"/> <% Cadena tgtPage = null; if (user.choice.equals ("Choice1")) tgtPage = "tgt1.jsp"; else if (user.choice.equals ("eleccin2")) tgtPage = "tgt2.jsp"; ms tgtPage = "tgtDefault.jsp"; response.sendRedirect (tgtPage); %>
He aqu un fragmento de cdigo muy simple, que es determinar la siguiente JSP para transferir el control a. (Tenga en cuenta que no se utiliza realmente cualquier salida generada por este JSP, ya que el navegador se enviar a una ubicacin diferente!)
Si la lgica fue ms complicado, que podra haber sido puesto en una clase de Java y JSP podra haber hecho llamadas a la clase Java. Algunos marcos utilizan mecanismos mucho ms complicadas de hacer algo tan simple como esto. Por ejemplo, estos mecanismos complicados pueden requerir archivos de configuracin que tienen que ser cambiado para cada cambio en el flujo de llamadas, y pueden implicar las clases de Java con determinadas reglas complicadas. Sin embargo, una revisin objetiva revela que no hay ninguna ventaja real de estos mecanismos excesivamente complicados. Simplemente introduce muchos ms lugares donde las cosas pueden y llegan a salir mal. A veces, el deseo de utilizar estos mecanismos ms complicados se debe a un malentendido - que JSPs son para exhibicin, por lo tanto, nunca pueden ser usados cuando su produccin no es de inters. Esto no es correcto. Es cierto que las pginas JSP son principalmente HTML con cdigo incrustado. Sin embargo, tienen muchas ventajas, como la necesidad de una configuracin menos (por lo general ninguno), y que es fcil de modificar y distribuir. Por lo tanto, pueden prestarse a otros usos, tales como escribir controladores simples y directas. En ltima instancia, JSP son slo una herramienta en su caja de herramientas. Usted debe mirar y evaluar cada herramienta de manera objetiva, y con ellos har de la mejor manera. Eso significa que el uso de JSP como controladores, mientras que proporcionan el medio ms sencillo y ms eficaz de hacerlo. Esto es an ms importante para proyectos grandes. Los grandes proyectos suelen tener ya una gran complejidad. La adicin de ms
complejidad a travs de marcos complicados no se recomienda. Como veteranos experimentados y exitosos de grandes proyectos saben, es especialmente importante en grandes proyectos para evitar la complejidad y encontrar soluciones simples y elegantes.
Bibliotecas de etiquetas
JSP 1.1 introduce un mtodo de extender etiquetas JSP, llamadas "bibliotecas de etiquetas". Estas bibliotecas permiten la adicin de etiquetas similares ajsp: include o jsp: forward , pero con diferentes prefijos que no sean jsp: y con caractersticas adicionales.
Para presentarle a bibliotecas de etiquetas, en este tutorial se utiliza la biblioteca de etiquetas Blazix como ejemplo. Esta biblioteca de etiquetas viene incluido con el servidor Blazix . Si no est utilizando el servidor Blazix, es posible que slo desee revisar el material para familiarizarse con la sintaxis, y continuar a la siguiente pgina. Cada etiqueta-biblioteca tendr su propia documentacin especfica tagbiblioteca. Para utilizar la biblioteca de etiquetas, se utiliza la directiva "taglib" para especificar donde reside "descripcin" de la biblioteca de etiquetas. Para la biblioteca de etiquetas Blazix, la Directiva (recomendado) es el siguiente:
<% @ Taglib prefix = uri "BLX" = "/ blx.tld"%>
El "uri" especifica dnde encontrar la descripcin de biblioteca de etiquetas. El "prefijo" es nico para la biblioteca de etiquetas. Esta directiva est diciendo que vamos a utilizar las etiquetas de esta biblioteca, comenzando con BLX:
La biblioteca de etiquetas Blazix proporciona una BLX: tag getProperty. Esta etiqueta se puede utilizar para permitir al usuario editar los datos del formulario. En nuestro archivo GetName.jsp, ahora vamos a aadir un jsp: useBean y colocar el formulario en BLX: getProperty. El nuevo GetName.jsp es
<% @ Taglib prefix = uri "BLX" = "/ blx.tld"%> <jsp:useBean id="user" class="user.UserData" Scope="Session"/> <HTML> <BODY>
<blx:getProperty name="user" property="*"> <FORM Method=post ACTION="SaveName.jsp"> Cmo te llamas? <INPUT Type=text NAME=username SIZE=20> <BR> Cul es su direccin de correo electrnico? <INPUT Type=text NAME=email SIZE=20> <BR> Cul es su edad? <INPUT Type=text NAME=age size=4> <P> <INPUT Type=submit> </ FORM> </ BLX: getProperty> </ BODY> </ HTML>
Tenga en cuenta que la BLX: getProperty no termina con /> sino que se denuncie por uno <separada / BLX: getProperty> line. Esto pone a todos los campos de entrada del formulario dentro del BLX: getProperty para que puedan ser modificados apropiadamente por la biblioteca de etiquetas.
Trate de poner un enlace a GetName.jsp del NextPage.jsp, y ver que los datos del bean aparece automticamente en los campos de entrada. Ahora el usuario puede editar los datos. Todava tenemos un par de problemas. El usuario no puede limpiar el campo de nombre. Por otra parte, si el usuario introduce un mal elemento en el campo "edad", algo que no es un entero vlido, se produce una excepcin de Java. Usaremos otra etiqueta de la biblioteca de etiquetas Blazix para cuidar de esto. Blazix ofrece una BLX: setProperty que se puede utilizar para hacerse cargo de esos problemas. BLX: setProperty nos permite definir un mtodo de controlador de excepciones. Si se produce una excepcin, se puede recoger un mensaje de error al usuario y seguir procesando. A continuacin se presenta una versin de SaveName.jsp que procesa los errores, y, o bien muestra la GetName.jsp usuario nuevo para el usuario puede introducir los datos correctamente o reenva automticamente a NextPage.jsp.
<% @ Taglib prefix = uri "BLX" = "/ blx.tld"%> <%! booleano haveError; Errores StringBuffer; errorHandler public void (campo Cadena, Valor de cadena, Exception ex) { haveError = true; if (errores == null) errores = new StringBuffer (); ms
errors.append ("<P>"); errors.append ("Valor <P> para el campo \" "+ campo + "\" no es vlido ").; if (java.lang.NumberFormatException ex instanceof) errors.append ("El valor debe ser un nmero."); } %> <% / / Las variables se deben inicializar fuera declaracin! haveError = false; errors = null; %> <HTML> <BODY> <jsp:useBean id="user" class="user.UserData" Scope="Session"/> <BLX: Nombre setProperty = "user" propiedad = "*" onError = "errorHandler" /> <% if (haveError) { out.println (errors.toString ()); pageContext.include ("GetName.jsp"); } Else pageContext.forward ("NextPage.jsp"); %> </ BODY> </ HTML> Tenga en cuenta que haveError y errores deben ser re-inicializado cada vez,
[Observe tambin el uso de pageContext.include y pageContext.forward . Estos son como jsp: include y jsp: forward , pero es ms cmodo de usar desde dentro de los bloques de Java. p ageContext es otra variable predefinida que hace que sea fcil de hacer ciertas operaciones dentro de los bloques de Java.] En este caso, si se produce un error durante el procesamiento de BLX: setProperty , se muestra el error y, a continuacin incluimos el GetName.jspvez que el usuario pueda corregir el error. Si no se producen errores, se transmitir de oficio al usuario NextPage.jsp . Todava hay un problema con las formas, la "edad" se muestra como cero inicial en lugar de estar vaca. Esto se puede solucionar mediante la adicin de " emptyInt = 0 " tanto a la BLX: getProperty y BLX: setProperty etiquetas (. campos de frijol deben ser inicializados a 0) Sucede que "0" no es un valor vlido para la edad, por lo que podemos utilizar "0" para marcar las cadenas vacas. Si "0" fuera un valor vlido para la edad, podramos haber aadido " emptyInt = -1 "(y se asegur para inicializar los campos de frijol a -1).
Otro pequeo problema es que la etiqueta "<HTML>" se duplica si se produce un error y terminamos como "GetName.jsp". Una solucin ms elegante es quitar el out.println, y pasar de nuevo el error, como se muestra
<% if (haveError) { request.setAttribute ("errores", errors.toString ()); pageContext.forward ("GetName.jsp"); } Else pageContext.forward ("NextPage.jsp"); %>
Podemos entonces hacer un " request.getAttribute "en el GetName.jsp , y si el valor devuelto no es nulo, visualice el error.
Pasar datos entre JSPs y Servlets. Page, Request, Session y Application scope
Veamos aqu cmo pasar datos entre las pginas JSP y los Servlets. Aprovechamos para comentar los cuatro tipos posibles de scope (alcance) de las variables.
Page Scope
Son variables que solo se ven dentro de nuestro JSP o Servlet mientras se est ejecutando. Una vez construda y enviada la respusta al navegador, desaparecen. Su nica utilidad es ayudarnos a construir la pgina que queremos mostrar en el navegador. Dentro del JSP seran variables normales de JSP
<% int variable = 33; %> ... <p>La variable vale <%= variable %></p> y dentro de un Servlet no seran ms que variables locales de nuestros mtodos doGet() o doPost(). public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int variable = 33; ... resp.getWriter().print("<p> La variable vale " + variable + "</p>");
Request Scope
Estas variables son ms tiles. Las guardamos en la peticin que nuestro JSP/Servlet van a hacer a otro JSP/Servlet de nuestra aplicacin, y este segundo JSP/Servlet puede recogerlos para hacer cosas con ellas. Dentro del objeto request, podramos fijar estas variables con setParameter() o con setAttribue(). y obtener los valores ocn los getParameter() o getAttribute().
<% String variable = request.getParameter("variable"); %> <p>Me han pasado <%= variable %></p> y en un servlet lo recogeramos del parmetro HttpRequest que nos pasan public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String variable = req.getParameter("variable"); ... resp.getWriter().print("<p> La variable vale " + variable + "</p>"); Un detalle a tener en cuenta es que estos "parameter" slo pueden guardar valores de tipo "String".
y en un Servlet recogeramos estos attribute, vengan de un jsp o de otro servlet, as public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Integer variable = (Integer)req.getAttribute("unEntero"); ... resp.getWriter().print("<p> La variable vale " + variable + "</p>");
Session scope
Las variables Session scope se mantienen durante lo que se conoce como una sesin. Cuando un usuario visita nuestra aplicacin por primera vez, automticamente se crea una sesin para ese usuario. Esta sesin suele estar abierta mientras el usuario va navegando por las pginas de nuestra aplicacin y desaparece cuando el usuario deja de navegar por nuestra aplicacin durante un tiempo predeterminado. Dicho de otra forma, cualquier valor que guardemos en la sesin del usuario, slo ser visible por las pginas que visite ese usuario y mientras el usuario est activo. Son las variables tpicas donde guardar si un usuario ha entrado en sesin, su nombre, su carrito de la compra si nuestra aplicacin es de comercio electrnico, etc. En una pgina JSP guardaramos los objetos java que queramos por medio de la variable session ya predefinida <% session.setAttribute("variable", new Integer(22)); y en otra pgina JSP lo obtendramos con <p>Me ha llegado <%= session.getAttribute("variable") %></p> Y en un Servlet, igual de fcil obteniendo la session del request que nos llega como parmetro public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().setAttribute("variable", new Integer(22));
... y para leer public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Integer variable = (Integer)req.getSession().getAttribute("variable"); ... resp.getWriter().print("<p> La variable vale " + variable + "</p>");
Application scope
Estas variables son vlidas para la aplicacin. Permanecen hasta que repleguemos nuestra aplicacin del servidor o echemos el servidor abajo. Son compartidas para todos los usuarios que visiten nuestra pgina web. Dentro de un JSP podemos fijarlas o leerlas con la variable application que viene predefinida en cualquier JSP, usando los conocidos mtodos setAttribute() y getAttribute(). <% // Para fijar una variable en un jsp application.setAttribute("variable", new Integer(22)); // Para leerla en otro o el mismo JSP Integer valor = (Integer)application.getAttribute("variable"); %> Y en un Servlet, se puede acceder obteniendo el ServletContext y llamando a sus mtodos setAttribute() o getAttribute() public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Para fijar la variable getServletContext().setAttribute("PI", new Double(3.1416)); ...
jsp:useBean
Ya hemos visto como guardar variables en distintos sitios para pasarlas de un jsp/servlet a otro jsp/servlet y si queremos que esta variable slo sea vlida durante el paso de una pgina a otra (request), para un usuario en cualquier pgina (session) o para todos los usuarios mientras el servidor siga levantado (application). Imagina ahora que estamos haciendo una aplicacin que lleva un listado de personas. Esas personas tienen varios atributos como nombre, apellido, telfono, direccin, etc, etc. Puede ser un poco tedioso y sobre todo poco elegante tener que meter todos esos atributos uno a uno en los sitios (request, session, application) que necesitemos. Una solucin ms elegante es hacer un bean Persona con esos atributos. Algo como esto (solo un par de atributos para simplificar) package com.chuidiang.ejemplos; public class Persona { private String nombre; private String apellido; // setters y getters } Tanto en el servlet como en un jsp podemos guardar este bean en cualquiera de los sitios indicados con setAttribute() y obtenerlo con getAttribute(). Por ejemplo, en un jsp <% Persona p = new Persona(); p.setNombre("Pedro"); p.setApellido("Lopez"); session.setAttribute("unaPersona", p); // y para obtenerla, en otro jsp o el mismo Persona q = (Persona)session.getAttribute("unaPersona"); y en un Servlet de igual manera public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Persona p = new Persona(); p.setNombre("Pedro");
p.setApellido("Lopez"); req.getSession().setAttribute("unaPersona", p); ... // y para leer en el mismo Servlet u otro Persona q = (Persona)req.getSession().getAttribute("unaPersona"); Sin embargo, en jsp tenemos unos tag especiales que nos permiten trabajar con estos bean ms al estilo de una pgina html, sin meter el cdigo java directamente. Estos tag son <jsp:useBean>, <jsp:getProperty> y <jsp:setProperty> Para obtener un bean dentro de jsp lo hacemos as <jsp:useBean id="unaPersona" scope="session" class="com.chuidiang.ejemplos.Persona"></jsp:useBean> Aqu ponemos en scope dnde queremos guardar o recoger el bean, es decir, "page", "request", "session" o "application". El id es el nombre que usbamos antes como nombre de atributo, es decir "unaPersona". Si ese bean ya existe lo obtenemos, si no existe se crea y se guarda ah. Finalmente, en class debemos indicar la clase del bean con paquete y todo, en nuestro caso "com.chuidiang.ejemplos.Persona". Dentro del jsp y una vez obtenido el bean, podemos meter valores en sus propiedades o acceder a ellas <jsp:setProperty name="unaPersona" property="nombre" value="Pedro"/> ... <p>El nombre es <jsp:getProperty name="unaPersona" property="nombre"/></p> Esta vez name es el nombre del bean, que en jsp:useBean era el id. En property se pone el nombre de la propiedad (nombre, apellido, etc) y en value, en el caso del setProperty, lo que queremos que valga. Java es listo y si el atributo de la clase es de tipo boolean, entero, etc, java convertir automticament la cadena de texto al tipo adecuado. Por ejemplo, si nombre fuese booelan, podramos poner value="true" y se hara la conversin automticamente. En el caso concreto de formularios, jsp:setProperty nos permite recoger fcilmente en la pgina jsp de destino los campos del formulario. Imagina el formulario para persona <form action="salva.jsp"> Nombre : <input type="text" name="nombre"/><br/> Apellido : <input type="text" name="apellido"/><br/> <input type="submit" value="Salvar"/> </form>
Pues bien, en la pgina salva.jsp que recibe este formulario, podemos crear el bean y rellenar sus valores as <jsp:useBean id="nuevaPersona" class="com.chuidiang.ejemplos.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="nombre" param="nombre"/> <jsp:setProperty name="nuevaPersona" property="apellido" param="apellido"/> Es decir, en vez de value, indicamos param, siendo param el nombre del campo en el formulario. Si el nombre del param y del property coinciden, podemos no poner param, que por defecto valdr lo mismo que property. Al ser el caso anterior, podramos escribir <jsp:useBean id="nuevaPersona" class="com.chuidiang.ejemplos.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="nombre"/> <jsp:setProperty name="nuevaPersona" property="apellido"/> y existe aun una facilidad ms. Si todos los nombres de los campos coindicen con todos los nombres de los atributos del bean, entonces con un property="*" los rellenamos todos de un plumazo, tal que as <jsp:useBean id="nuevaPersona" class="com.chuidiang.ejemplos.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="*"/> En este ejemplo le hemos puesto scope="page", es decir, esa "nuevaPersona" slo existir en nuestra pgina jsp y posiblemente la salvemos en base de datos o hagamos cualquier otra cosa con ella. Podramos de igual forma haber cogido/creado esa "nuevaPersona" en request, session o application.