Tutorial de JSP (22): Altas, Bajas y Modificaciones en una tabla de una base de datos mySQL con JSP.LICENCIA Apache 2 Apache HTTP avi AWTComponentes Conector/J Conector J - MySQL Crystal ReportCurso JSP Ejemplo Ejemplo JSP/NetbeansExpresiones FileZilla FTP Server FormatHM NIS Edit Hola Mundo IDE J2EEJava JButton JCheckBoxJComboBox JDBC JDK 6 update 11 JDK JLabel JPanel JRadioButtonJSP/SERVLETSJTextField JvDBSearchCombo 6 update 14 JDK 6 update 20 JDK 6 update 20 (Linux)jFrame BoxKENAI 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 TComboBoxTDBNavigator TEdit TJvDateEditTPageControl TTabSheet Workbench XAMPP XDEBUG BLOGROLL IES Gonzalo Nazareno DELPHI IDE About.com Club delphi Delphi Resource Center Dr.Bob's Delphi Clinic Eclipse IDE NetBeans IDE JAVA GUJ (Mexico) GUJ (Uruguay) Java Hispano Java User Groups(JUGs) java.net Univ. Navarra – Aprenda Java desde 1º JSP/SERVLETS Eclipse + JSP Recursos JSP Univ. Huelva – JSP v2.0 / Servlets v2.4 Univ. Navarra – Aprenda Servlets de Java PHP Manual PHP PHP Classes Repository Recursos PHP PYTHON Python – Official Website SGBD MySQL Oracle Corporation (Java) PostgreSQL VISITAS: 380,546 hits buscar 1 Votes Realizaremos en esta entrada un ejercicio de utilización de JSP para resolver la creación, modificación y eliminación de registros en una tabla denominada libros de una base de datos denominada biblioteca diseñada en mySQL. El ejemplo es un mero ejercicio didáctico de cómo utilizar JSP, advirtiendo que dicho ejercicio en sentido estricto habría que resolverlo con cierto carácter científico con ayuda de un servlet y respetando el Modelo Vista Controlador (que dejaremos para más adelante). La tabla es la que sigue, con Iniciamos seguidamente una sesión 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 código: <%-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>Título</td> <input type="text" name="titulo" value="" size="50"/> </tr> La ejecución de dicho archivo presenta en el cliente o en el browser la pantalla Si en esta pantalla pulsamos Submit enviaremos una petición al servidor de la página AECTabla. Para ello. titulo y Action. hacemos click con el botón derecho para mostrar el menu contextual . es decir. enviaremos los tres variables implicadas en el formulario. Vista Controlador será la “Vista”.<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 código HTML con JSP que describe un formulario. Tenemos pues que crear en el mismo proyecto otro archivo jsp que resuelva la cuestión del alta. es decir: isbn. la presentación de los datos de los distintos campos de la tabla.jsp. modificación o eliminación de los registros. una vez seleccionado el proyecto. amén de la cabecera de la petición. Esto es lo que más tarde en el Modelo. <%-Document . . . .getParameter("isbn").*" %> <% /* Paso 1) Obtener los datos del formulario */ String ls_isbn = request. . : Jtaguaa --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import = "java. : AECTabla Created on : 25-dic-2012.sql. 10:11:06 Author . .Damos nombre AECTabla al nuevo archivo jsp y sustituimos seguidamente el código de la plantilla por el siguiente. getConnection(ls_dburl. ls_query += "'" + ls_titulo + "')".1:3306/biblioteca". ls_query += " values (". ls_query += "'" + ls_isbn + "'". */ if (ls_action.User.Driver".jdbc.0.0. titulo)".mysql. /* Paso 3) Crear query .". } /* Paso4) Conexión a la base de datos */ Connection l_dbconn = null. } if (ls_action.. String ls_query = "".getParameter("Action"). String ls_dbdriver = "com. String ls_usuario = "root". ls_query += " set titulo= " + "'" + ls_titulo + "'. String ls_action = request.String ls_titulo = request.equals("Crear")) { ls_query = " insert into libros (isbn. ls_query += " where isbn = " + "'" + ls_isbn + "'". String ls_password = "".ls_usuario. /* Paso 2) Inicializar variables */ String ls_result = "Base de datos actualizada.".forName(ls_dbdriver).equals("Eliminar")) { ls_query = " delete from libros where isbn = ".ls_password).equals("Actualizar")) { ls_query = " update libros". . } if (ls_action.getParameter("titulo"). String ls_dburl = "jdbc:mysql://127. ls_query += "'" + ls_isbn + "'. getConnection(URL.. try { Class. /* .Pw) */ l_dbconn = DriverManager.". ls_result += " <br/>" + e. } } %> html> <html> <head><title>Updating a Database</title></head> <body> La siguiente instrucción fue ejecutada: <br/><br/> <%=ls_query%> <br/><br/> El resultado fue: <br/><br/> <%=ls_result%> <br/><br/> .toString(). } catch (ClassNotFoundException e) { ls_result = " Error creando el driver!".toString(). } finally { /* Cerramos */ try { if (l_dbconn != null) { l_dbconn. ls_result += " <br/>" + e.toString(). } } catch (SQLException e) { ls_result = "Error al cerrar la conexión. /* Ejecución de SQL Statement */ l_statement. ls_result += " <br/>" + e.close(). } catch (SQLException e) { ls_result = " Error procesando el SQL!".createStatement()./*Creación de SQL Statement */ Statement l_statement = l_dbconn.execute(ls_query).". <a href="index. De forma similar se resolvería la Actualización o Eliminación del registro.jsp">Entre otro valor</a> </body> </html> Para dar de alta un libro entraremos la información correspondiente al libro cuyo título es Java Servlet Programming (2ed) y el isbn 0596000405. es decir Si pulsamos “Submit”. y vemos con phpAdmin que se ha creado un resgistro. . getErrorCode().*. y a partir de ahí muestre un mensaje más específico. 3.docx <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="java. java. 2.util. Cuaderno 1: Ejercicios Básicos JSP Descargar cuaderno: https://www. de manera razonable. La Baja de un registro inexistente. Como ayuda.text. Se le sugiere al lector que estudie estos casos y modifique convenientemente el archivo AECTabla.dropbox.*"%> <!DOCTYPE html> <html> <head> . intente controlar el objeto e del tipo SQLException a través del método e.com/s/71mmhuk2g6zvqpz/Ejemplos_servlets_jsp_1. La Alta de un registro ya existente.Obsérvese que no se han previsto. La Actualización de un registro no existente. las incidencias correspondientes a 1. getDateInstance(). } %> Ejemplo 1: Hola Mundo.format(d). if(nombre!=null && nombre.length()>0){ out. }else{ out. ").getParameter("NOMBRE"). String hoy = DateFormat. charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Fecha</h1> <% Date d = new Date().println("No tienes acceso. Página HTML .<meta http-equiv="Content-Type" content="text/html.println("Hola " + nombre). %> Hoy es <%=hoy%> </body> </html> <% String nombre = request. out.http.*. import javax.println("<html>").println("</body></html>").*.<html> <head> <title>Primer Servlet</title> </head> <body> <center><h2>Ejemplo de Ejecución 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> Código del Servlet //Primer Servlet.println("<body>"). out. //Muy sencillo.setContentType("text/html").getOutputStream()). out.*.servlet. import java.close(). out. HttpServletResponse res) throws ServletException. PrintWriter out = new PrintWriter(res. out.println("<h1><center>Hola Mundo desde el servidor WEB</center></h1>"). public class PrimerServlet extends HttpServlet { public void doGet (HttpServletRequest req.servlet. IOException { res. import javax. } public String getServletInfo() { .println("<head><title>HolaMundoServlet</title></head>").io. out. n de enviar<BR> <BR><input type=text name=NOMBRE> <BR> <BR><input type=submit value="Enviar Nombre"> <input type=reset value="Borrar"> </center> </form> </body> </html> Código del Servlet // // SegundoServlet. public class SegundoServlet extends HttpServlet { String nombre. HttpServletResponse respuesta ) .java // import javax.servlet. import java.http.servlet.*. Página HTML <html> <head> <title>Segundo Servlet</title> </head> <body> <h2><center>Segundo Servlet</center></h2> <form action=/SegundoServlet/SegundoServlet method=POST> <BR> <BR> <center> Introduzca su nombre y pulse el botó. public void service( HttpServletRequest peticion.io.*. import javax.*. } } Ejemplo 2: Acceso básico a formularios.return "Crea una página HTML que dice HolaMundo". +  . . IOException { nombre = peticion. ServletOutputStream out = respuesta.println("</body></html>"). out.println("<p><h1><center>Su nombre es: <B>"+nombre+"</B></center></h1></p>").close(). heigth:6px. Página HTML <HTML> <HEAD> <TITLE>Calculadora con Servlet</TITLE> </HEAD> <BODY BGCOLOR = "#E0FFE0" TEXT= "green" LINK="blue" VLINK=" <CENTER> <HR style = "color:green. width:500"> <FONT size = 5> CALCULADORA </FONT> <HR style = "color:green. 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 > .throws ServletException. } } Ejemplo 3: Calculadora. out.println("<head><title>HolaTalServlet</title></head>"). out. out.getParameter("NOMBRE").getOutputStream().println("<html>"). .println("<body>").</OPTION> . out. heigth:6px. out.  . . . import javax.  . .<OPTION value= "2" > .servlet."/"}. public class CalculadoraServlet extends HttpServlet { public void service (HttpServletRequest req. . import javax.</OPTION> </SELECT> <TD aling = "rigth"> <INPUT name="operando2" </TD> </TR> </TABLE> <BR> <BR> <input name="Calcular" value="Calcular" type="submit">  .http. * <OPTION value= "4" > .servlet. "-". .</OPTION> <OPTION value= "3" > . result. String simb_op[] = {"+". int operacion. .</OPTION>  . . .io. .*.*. . /  . op2.getOutputStream(). <input name="limpiar" value="Limpiar" type="reset"> </FORM> </CENTER> </BODY> </HTML> type= "tex Código del Servlet // // CalculadoraServlet // import java. IOException { double op1. HttpServletResponse res) throws ServletException.*. ServletOutputStream out = res. "*". out. op2 = Double. out.println("<body BGCOLOR = \"#E0E0FF\" TEXT= \"blu out.close(). int operacion) { double result = 0.op2.println("</html>").println("<head><title>Resultado de calcular con Servlet</title></head>"). op2.getParameter("operacion")). operacion = Integer. out.parseInt(req. switch (operacion) { case 1: return op1 + op2.println("<h1><center>La operacion efectuada es:</center></h1>"). out.parseDouble(req.println("</body>"). } } } return result.parseDouble(req. . out. Ejemplo 4: Primitiva.println("<html>").println("<h2> <b><center>"+ op1+" "+ simb_op[operacio 1] + " "+ op2 + " = "+ result + "</center></b></h2>").op1 = Double. case 3: return op1 * op2. result = calcula(op1. case 2: return op1 . out. out. } public double calcula(double op1.getParameter("operando1")). double op2. operacion).getParameter("operando2")). case 4: return op1 / op2. util. .http. aux.servlet. Random rand = new Random(). combiUsuario[] = new int[6].init(config). int i.java // import javax.*. import java. aciertos=0.io.Página 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 combinación y pulsa el botón 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 Combinación> <input type=reset value=Borrar> </center> </form> </body> </html> Código del Servlet // // PrimitivaServlet. public void init(ServletConfig config) throws ServletException { super. public class PrimitivaServlet extends HttpServlet { int primi[] = new int[6].servlet.*. contador=0. import javax.*. import java.*. i++) { if (primi[i]==num) return true. int num) { for (int i=0.parseInt(peticion. i<=5.nextInt(48) + 1. ServletOutputStream out = respuesta. combiUsuario[2] = Integer.getParameter("NUM6")). HttpServletResponse respuesta ) throws ServletException.getOutputStream(). combiUsuario[0] = Integer. } private boolean comprueba(int array[].getParameter("NUM4")). combiUsuario[5] = Integer.parseInt(peticion.aux)) { primi[contador] = aux.//generamos los números while (contador<6) { aux = rand. .parseInt(peticion. IOException { aciertos=0. combiUsuario[1] = Integer.parseInt(peticion.sort(primi).parseInt(peticion.getParameter("NUM1")). } } //ordenamos el array Arrays.parseInt(peticion. } public void service( HttpServletRequest peticion. contador++. } return false. if (!comprueba(primi. combiUsuario[3] = Integer. combiUsuario[4] = Integer.getParameter("NUM2")).getParameter("NUM3")).getParameter("NUM5")). i++) { out.binarySearch(primi. } } Ejemplo 5: Acceso a Ficheros de Texto Plano. } out. //imprimimos todos los números de la combinación del usuario out. for (i=0. //comprobamos la combinación for (i=0.print("</B>").println("<p>Números acertados: <B>"+aciertos+"</B></p>"). for (i=0.print("<p>Tu combinación es:</p><B>"). } } out.println("<p>Número acertado: <B>"+combiUsuario[i]+"</B></p>").print("<p>La combinación ganadora es:</p><B>").out. Página HTML .print("</B>"). //imprimimos todos los números de la combinación ganadora out. } out. i++) { if (Arrays. i++) { out. i<6.combiUsuario[i])>=0) { out.close(). i<=5.println("<h2><center>Primitiva Servlet</center></h2>").print(" "+primi[i]).print(" "+combiUsuario[i]). i<6. aciertos++. out. <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ó. import javax.*. . try { fis = new FileInputStream("c:\\tmp\\texto. import java.*. String[] strTEXTO.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> Código del Servlet // // FicheroServlet. public void init(ServletConfig config) throws ServletException { super. FileInputStream fis = null. FileOutputStream fos = null.io. public class FicheroServlet extends HttpServlet { StringBuffer mensaje = null.*.servlet.java // import javax.http.txt").servlet.init(config). } fis. try { } catch(java.append((char)caracter). fos = new FileOutputStream("c:\\tmp\\log.close().println("<p>"+mensaje+"</p>").} catch(java.getOutputStream(). IOException { strTEXTO = peticion. out. } . ServletOutputStream out = respuesta.close(). } mensaje = new StringBuffer(). while ( (caracter = fis.io.printStackTrace().printStackTrace().io.io.getParameterValues("TEXTO").IOException e) { e.printStackTrace().read()) != -1 ) { mensaje. out. } catch(java. } try { int caracter.println("<p>Su nombre es: "+strTEXTO[0]+"</p>"). out. } } public void service( HttpServletRequest peticion. HttpServletResponse respuesta ) throws ServletException.txt").FileNotFoundException e) { e. registrar().IOException e) { e. IOException e) { e. } catch(java. } } Ejemplo 6: Ejemplo JSP de uso de la directiva INCLUDE <HTML> <head> <title> Página de prueba de directivas de compilación </title> </head> <body> <h1> Página de prueba de directivas de compilación </h1> <%@ include file=”/fich1.io.jsp” %> </body> </HTML> .printStackTrace().printStackTrace().write(strTEXTO[0]. } } public synchronized void registrar() { try { } catch(java. } fos.html” %> <%@ include file=”/fich2.IOException e) { e.getBytes()).public void destroy() { try { fos.io.close(). jsp <%@ page info="Un ejemplo Hola Mundo" import="java.Date" %> La fecha de hoy es: <%= new Date().html <HTML> <head> <title> Hola.jsp”> <input type=“text” name=“Nombre”> <br> y clave: <input type=“password” name=“password”> </p> <p><input type=“submit” name=“login”> </form> </body> </HTML> Página comprobar.toString() %> · Ejemplo 7: Ejemplo JSP de uso de formularios Página comprobar.jsp”/> .· fich1.equals(“xyzzy”))) { %> <jsp:forward page=“saludoforward.util.equals(“Roberto”)) && (request.jsp. Mundo </title> </head> <body> <h1> ¡Hola. <% if ((request. <HTML> <head> <title> Ejemplo de uso del forward </title> </head> <body> <h1> Ejemplo de uso del forward </h1> <form method=“post” action=“comprobar.html.getParameter(“Nombre”). Mundo! </h1> </body> </HTML> fich2.getParameter(“password”). introduce tu nombre: <input type="text" name="nombre"> </p> <p> <input type="submit" value="enviar información"> </form> </body> </HTML> Página JSP –saludo. %> </body> </HTML> Ejemplo 8: Ejemplo JSP de uso de objetos implícitos Página HTML <HTML> <head> <title> Formulario de petición de nombre </title> </head> <body> <h1> Formulario de petición de nombre </h1> <!-.jsp"> <p> Por favor.jsp.println(“Bienvenido a la nueva aplicación").jsp .jsp” --> <form method="post" action="saludo. <HTML> <head> <title> Saludo al cliente </title> </head> <body> <h1> Saludo al cliente</h1> <% out.Se envía el formulario al JSP “saludo.<% } else { %> <%@ include file=“comprobar.html”%> <% } %> Página saludoforward. Sólo tiene que definir una clase que tiene un campo correspondiente a cada campo en el formulario. Por ejemplo.getParameter(”nombre").Los parámetros que le pasa el cliente en la petición se obtienen del objeto implícito request --%> <% String nombre = request.html recoger también dirección de . %> <%-. Los campos de clase deben tener "setters" que responden a los nombres de los campos del formulario. JSP hace procesamiento de formularios especialmente fácil.<HTML> <head> <title> Saludo al cliente </title> </head> <body> <h1> Saludo al cliente</h1> <%-. “ + nombre).println(”Es un placer conocerte. out. La forma estándar de manejo de formularios en JSP es definir un "grano". Esto no es un grano completo de Java.Al evaluarse el código hay que escribir explícitamente en la salida (objeto implícito out) --%> </body> </HTML> Los frijoles y el procesamiento de formularios Los formularios son un método muy común de las interacciones en los sitios web. vamos a modificar nuestro GetName. } getUsername public String () {return nombre de usuario. se define una clase Java con los campos " nombre de usuario ". con "get" en lugar de "set". Así que si el campo es " email ". int edad. tal como se muestra. Los métodos Getter se definen de manera similar. Email String. El primer carácter del nombre del campo es en mayúscula.correo electrónico y edad." email "y" edad "encontrarás métodos setter"setUsername ".jsp"> ¿Cómo te llamas? <INPUT Type=text NAME=username SIZE=20> <BR> ¿Cuál es su dirección de correo electrónico? <INPUT Type=text NAME=email SIZE=20> <BR> ¿Cuál es su edad? <INPUT Type=text NAME=age size=4> <P> <INPUT Type=submit> </ FORM> </ BODY> </ HTML> Para recopilar estos datos." setEmail "y" setAge ". } void setAge público (int valor) { edad = valor. Clase pública UserData { Cadena nombre de usuario. usuario del paquete. Tenga en cuenta que los setters y getters () deben ser públicos. Un método "setter" es sólo un método que empieza con " set "seguido por el nombre del campo. La nueva versión de GetName.html es <HTML> <BODY> <FORM Method=post ACTION="SaveName.} . setUsername public void (String value) { username = valor. } public void setEmail (valor de cadena) { email = valor. su" setter método "será" setEmail ". } ObtenerLongevidad public int () {edad return. <jsp:useBean id="user" class="user.jsp"> Continuar </ A> </ BODY> </ HTML> Todo lo que necesitamos hacer ahora es añadir el jsp: useBean etiqueta y el jsp: setProperty etiqueta! La etiqueta useBean buscará una instancia de la " user. Una vez definida la clase.UserData" Scope="Session"/> <HTML> . Si la instancia que ya está ahí. se actualizará la instancia anterior. por lo tanto. De lo contrario. tendría que ser detenido y reiniciado si ya se está ejecutando el servidor web. con Blazix puede colocarlos en el " clases carpeta ".UserData "en la sesión.class debe ser colocado en una carpeta con el nombre del usuario en la entrada classpath. consulte las notas sobre el cambio de ruta de clases .jsp para recuperar los datos de frijol .UserData se llama un grano).UserData" Scope="Session"/> <jsp:setProperty name="user" property="*"/> <HTML> <BODY> <A HREF="NextPage. compilarlo y asegúrese de que está disponible en la ruta de clase del servidor Web. Si tiene que cambiar la ruta de clase. (Si usted no está familiarizado con la creación / modificación ruta de clase. se creará una nueva instancia de user..UserData (la instancia del user. El setProperty recogerá automáticamente los datos de entrada. por ejemplo. y colocar los datos en el bean! Vamos a modificar NextPage. Ahora vamos a cambiar " SaveName. <jsp:useBean id="user" class="user.) Tenga en cuenta que estamos usando el nombre del paquete de usuario . el archivo UserData.public String getEmail () {email return. El servidor también puede definir carpetas especiales donde se pueden colocar las clases de frijol. haga coincidir los nombres con los nombres de los métodos de frijol. y lo puso en la sesión.jsp "utilizar un bean para recopilar los datos.} } Los nombres de los métodos deben ser exactamente como se muestra. siempre y cuando añadimos un jsp: setProperty tag.getProperty para ese nombre de propiedad (controlar los errores appripriately) 2) Volver a los ejercicios.UserData" Scope="Session"/> . Para la lógica del controlador más complejo. En lugar de una variable booleana. JSP pueden llamar fácilmente el código Java en otras clases. algunas necesidades de tratamiento previo.jsp .jsp ". muestra el valor devuelto por System. o le pide al usuario que corrija los datos erróneos.getAge ()%> <BR> </ BODY> </ HTML> Tenga en cuenta que la misma etiqueta useBean se repite.jsp como un controlador de errores que automáticamente reenvía la solicitud al NextPage. Dicho código de pre-procesamiento se refiere con frecuencia como un "controlador". Pero en el siguiente tutorial.getEmail ()%> <BR> Edad: <% = user. Un controlador de ejemplo se muestra a continuación: <jsp:useBean id="user" class="user. hacer que estos vienen de un campo de formulario oculto que se puede establecer en true o false. En realidad no necesitamos el " SaveName. Ejercicio: 1) Escriba un conjunto JSP / HTML que permite al usuario introducir el nombre de una propiedad del sistema y.Los datos introducidos por el usuario se recogieron en todo el grano.UserData ". Controladores A veces. El grano está disponible como la variable llamada " usuario "de la clase" user.<BODY> Ha introducido <BR> Nombre: <% = user.html podría haber sido NextPage. El resultado de esta preprocesamiento decide donde el flujo de control debe ir a continuación. que realmente utilizaremosSaveName. el objetivo de GetName. y los datos todavía estaríamos disponibles de la misma manera.getUsername ()%> <BR> Email: <% = user.jsp . JSP son muy muy apropiados para escribir controladores simples. que ha modificado manualmente las variables booleanas. de que hay que hacer después de que el usuario ha enviado un formulario. a continuación. equals ("elección2")) tgtPage = "tgt2. por lo tanto. Algunos marcos utilizan mecanismos mucho más complicadas de hacer algo tan simple como esto. el deseo de utilizar estos mecanismos más complicados se debe a un malentendido . Los grandes proyectos suelen tener ya una gran complejidad.sendRedirect (tgtPage). Esto no es correcto. Eso significa que el uso de JSP como controladores.jsp". mientras que proporcionan el medio más sencillo y más eficaz de hacerlo. tales como escribir controladores simples y directas. response. Sin embargo. Esto es aún más importante para proyectos grandes. tienen muchas ventajas. Usted debe mirar y evaluar cada herramienta de manera objetiva. ya que el navegador se enviará a una ubicación diferente!) Si la lógica fue más complicado.jsp". En última instancia. Simplemente introduce muchos más lugares donde las cosas pueden y llegan a salir mal.choice. pueden prestarse a otros usos. JSP son sólo una herramienta en su caja de herramientas. como la necesidad de una configuración menos (por lo general ninguno).que JSPs son para exhibición. La adición de más . estos mecanismos complicados pueden requerir archivos de configuración que tienen que ser cambiado para cada cambio en el flujo de llamadas. if (user. nunca pueden ser usados cuando su producción no es de interés.<jsp:setProperty name="user" property="*"/> <% Cadena tgtPage = null. y con ellos hará de la mejor manera. una revisión objetiva revela que no hay ninguna ventaja real de estos mecanismos excesivamente complicados.choice. que podría haber sido puesto en una clase de Java y JSP podría haber hecho llamadas a la clase Java. Es cierto que las páginas JSP son principalmente HTML con código incrustado. %> He aquí un fragmento de código muy simple. (Tenga en cuenta que no se utiliza realmente cualquier salida generada por este JSP. y que es fácil de modificar y distribuir. que es determinar la siguiente JSP para transferir el control a. Por ejemplo.jsp". else if (user.equals ("Choice1")) tgtPage = "tgt1. Sin embargo. A veces. más tgtPage = "tgtDefault. y pueden implicar las clases de Java con determinadas reglas complicadas. Por lo tanto. El nuevo GetName. Cada etiqueta-biblioteca tendrá su propia documentación específica tagbiblioteca. Esta directiva está diciendo que vamos a utilizar las etiquetas de esta biblioteca. Estas bibliotecas permiten la adición de etiquetas similares ajsp: include o jsp: forward . la Directiva (recomendado) es el siguiente: <% @ Taglib prefix = uri "BLX" = "/ blx. Para presentarle a bibliotecas de etiquetas.1 introduce un método de extender etiquetas JSP.jsp.tld"%> <jsp:useBean id="user" class="user. Esta biblioteca de etiquetas viene incluido con el servidor Blazix . En nuestro archivo GetName.complejidad a través de marcos complicados no se recomienda. Para la biblioteca de etiquetas Blazix. en este tutorial se utiliza la biblioteca de etiquetas Blazix como ejemplo. ahora vamos a añadir un jsp: useBean y colocar el formulario en BLX: getProperty.UserData" Scope="Session"/> <HTML> <BODY> . se utiliza la directiva "taglib" para especificar donde reside "descripción" de la biblioteca de etiquetas. y continuar a la siguiente página.jsp es <% @ Taglib prefix = uri "BLX" = "/ blx. es posible que sólo desee revisar el material para familiarizarse con la sintaxis. comenzando con BLX: La biblioteca de etiquetas Blazix proporciona una BLX: tag getProperty. Como veteranos experimentados y exitosos de grandes proyectos saben. El "prefijo" es único para la biblioteca de etiquetas. Si no está utilizando el servidor Blazix. pero con diferentes prefijos que no sean jsp: y con características adicionales. es especialmente importante en grandes proyectos para evitar la complejidad y encontrar soluciones simples y elegantes. Para utilizar la biblioteca de etiquetas. Bibliotecas de etiquetas JSP 1. Esta etiqueta se puede utilizar para permitir al usuario editar los datos del formulario.tld"%> El "uri" especifica dónde encontrar la descripción de biblioteca de etiquetas. llamadas "bibliotecas de etiquetas". jsp. más . Trate de poner un enlace a GetName.jsp. if (errores == null) errores = new StringBuffer ().jsp usuario nuevo para el usuario puede introducir los datos correctamente o reenvía automáticamente a NextPage. se puede recoger un mensaje de error al usuario y seguir procesando. El usuario no puede limpiar el campo de nombre. Errores StringBuffer. Usaremos otra etiqueta de la biblioteca de etiquetas Blazix para cuidar de esto. Todavía tenemos un par de problemas. Blazix ofrece una BLX: setProperty que se puede utilizar para hacerse cargo de esos problemas. Exception ex) { haveError = true. 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.tld"%> <%! booleano haveError. o bien muestra la GetName. y. algo que no es un entero válido. Por otra parte. <% @ Taglib prefix = uri "BLX" = "/ blx. Si se produce una excepción.<blx:getProperty name="user" property="*"> <FORM Method=post ACTION="SaveName.jsp que procesa los errores. BLX: setProperty nos permite definir un método de controlador de excepciones. se produce una excepción de Java. Ahora el usuario puede editar los datos.jsp"> ¿Cómo te llamas? <INPUT Type=text NAME=username SIZE=20> <BR> ¿Cuál es su dirección de correo electrónico? <INPUT Type=text NAME=email SIZE=20> <BR> ¿Cuál 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.jsp del NextPage. si el usuario introduce un mal elemento en el campo "edad". errorHandler public void (campo Cadena. y verá que los datos del bean aparece automáticamente en los campos de entrada. Valor de cadena. A continuación se presenta una versión de SaveName. errors. . Esto se puede solucionar mediante la adición de " emptyInt = 0 " tanto a la BLX: getProperty y BLX: setProperty etiquetas (. [Observe también el uso de pageContext. pero es más cómodo de usar desde dentro de los bloques de Java. se transmitirá de oficio al usuario NextPage.UserData" Scope="Session"/> <BLX: Nombre setProperty = "user" propiedad = "*" onError = "errorHandler" /> <% if (haveError) { out.forward ("NextPage. errors = null.toString ()). por lo que se están inicializando fuera de la declaración. pageContext. se muestra el error y.append ("El valor debe ser un número. a continuación incluimos el GetName.include ("GetName. si se produce un error durante el procesamiento de BLX: setProperty .. por lo que podemos utilizar "0" para marcar las cadenas vacías.jsp"). podríamos haber añadido " emptyInt = -1 "(y se aseguró para inicializar los campos de frijol a -1). %> <HTML> <BODY> <jsp:useBean id="user" class="user.jspvez que el usuario pueda corregir el error. Si no se producen errores. } Else pageContext. Si "0" fuera un valor válido para la edad. campos de frijol deben ser inicializados a 0) Sucede que "0" no es un valor válido para la edad. if (java.include y pageContext.NumberFormatException ex instanceof) errors.lang.append ("<P>"). Estos son como jsp: include y jsp: forward .jsp .forward . p ageContext es otra variable predefinida que hace que sea fácil de hacer ciertas operaciones dentro de los bloques de Java.append ("Valor <P> para el campo \" "+ campo + "\" no es válido "). } %> <% / / Las variables se deben inicializar fuera declaración! haveError = false.println (errors.] En este caso. %> </ BODY> </ HTML> Tenga en cuenta que haveError y errores deben ser re-inicializado cada vez.jsp"). Todavía hay un problema con las formas.errors. la "edad" se muestra como cero inicial en lugar de estar vacía."). como se muestra <% if (haveError) { request.setAttribute ("errores". y pasar de nuevo el error. Dentro del JSP serían variables normales de JSP . Page Scope Son variables que solo se ven dentro de nuestro JSP o Servlet mientras se está ejecutando.jsp".forward ("GetName. visualice el error. Su única utilidad es ayudarnos a construir la página que queremos mostrar en el navegador. Page.toString ()). Request. Session y Application scope Veamos aquí cómo pasar datos entre las páginas JSP y los Servlets. Aprovechamos para comentar los cuatro tipos posibles de scope (alcance) de las variables.println. y si el valor devuelto no es nulo.jsp"). Una vez construída y enviada la respusta al navegador.Otro pequeño problema es que la etiqueta "<HTML>" se duplica si se produce un error y terminamos como "GetName. Una solución más elegante es quitar el out. Pasar datos entre JSPs y Servlets. pageContext.forward ("NextPage. errors.jsp .jsp").getAttribute "en el GetName. %> Podemos entonces hacer un " request. } Else pageContext. desaparecen. Dentro del objeto request. él se encargará de rellenar los setParameter() <form action="destino. resp. al pulsar el submit "Enviar". y este segundo JSP/Servlet puede recogerlos para hacer cosas con ellas. %> . Las guardamos en la petición que nuestro JSP/Servlet van a hacer a otro JSP/Servlet de nuestra aplicación.setParameter("variable". automáticamente se hará un request. valor en la caja de texto) que luego podrá leer nuestra página de destino (destino. podríamos fijar estas variables con setParameter() o con setAttribue(). Está reservado para los form de html de nuestras páginas jsp. . <p>La variable vale <%= variable %></p> y dentro de un Servlet no serían más que variables locales de nuestros métodos doGet() o doPost(). Se guardará uno por cada input que tengamos en el form.. En la página jsp de destino podemos recoger los valores del formulario de esta forma .print("<p> La variable vale " + variable + "</p>").... Cuando pulsemos el botón "submit" del formulario. cada uno con el nombre que diga su atributo "name". HttpServletResponse resp) throws ServletException. request : set y get parameter En principio no debemos usar este método. Request Scope Estas variables son más útiles.getWriter().<% int variable = 33. y obtener los valores ocn los getParameter() o getAttribute().jsp"> <input type="text" name="variable" /> <input type="submit value="Enviar" /> </form> En el formulario anterior.jsp en nuestro ejemplo) o el servlet. public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req. IOException { int variable = 33. "variable" es el name del input type="text". %> y en destino.print("<p> La variable vale " + variable + "</p>"). desde un Servlet. Por ejemplo.getParameter("variable"). HttpServletResponse resp) throws ServletException. resp. Un detalle a tener en cuenta es que estos "parameter" sólo pueden guardar valores de tipo "String". HttpServletResponse resp) throws ServletException. %> <p>Me han pasado <%= variable %></p> y en un servlet lo recogeríamos del parámetro HttpRequest que nos pasan public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req. poddríamos hacer la siguiente redirección public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req. el request desaparece en cuanto terminamos de procesar la página/Servlet actual. IOException { req. en una página jsp podemos poner <% request. Podemos guardar y recibir cualquier Object java que queramos sin más que ponerles un nombre. ..jsp").getRequestDispatcher("destino.. resp). .jsp"). request.getRequestDispatcher("destino.forward(request.jsp recibiríamos unEntero de esta forma <p>Me ha llegado <%= request.setAttribute("unEntero"..getWriter(). new Integer(22)). así que la única forma de pasar estos attributes a la siguiente es haciendo un fordward() desde nuestro request. response). Sin embargo.forward(req. IOException { String variable = req.setAttribute("unEntero". resp. .getAttribute("unEntero") %></p> Igualmente.<% String variable = request.. request : set y get Attribute Dentro de request.getParameter("variable"). new Integer(22)). los attribute son lo que nosotros como programadores podemos usar a gusto. Son las variables típicas donde guardar si un usuario ha entrado en sesión. sólo será visible por las páginas que visite ese usuario y mientras el usuario esté activo..getAttribute("variable") %></p> Y en un Servlet. Session scope Las variables Session scope se mantienen durante lo que se conoce como una sesión.print("<p> La variable vale " + variable + "</p>"). . automáticamente se crea una sesión para ese usuario. Cuando un usuario visita nuestra aplicación por primera vez. resp. vengan de un jsp o de otro servlet.getWriter(). cualquier valor que guardemos en la sesión del usuario. su nombre. HttpServletResponse resp) throws ServletException. new Integer(22)). su carrito de la compra si nuestra aplicación es de comercio electrónico. Dicho de otra forma. igual de fácil obteniendo la session del request que nos llega como parámetro public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req. new Integer(22)). . IOException { req. Esta sesión suele estar abierta mientras el usuario va navegando por las páginas de nuestra aplicación y desaparece cuando el usuario deja de navegar por nuestra aplicación durante un tiempo predeterminado. En una página JSP guardaríamos los objetos java que queramos por medio de la variable session ya predefinida <% session. y en otra página JSP lo obtendríamos con <p>Me ha llegado <%= session. HttpServletResponse resp) throws ServletException.setAttribute("variable". así public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req.y en un Servlet recogeríamos estos attribute.setAttribute("variable"..getSession().getAttribute("unEntero"). IOException { Integer variable = (Integer)req. etc. Son compartidas para todos los usuarios que visiten nuestra página web. <% // Para fijar una variable en un jsp application. . usando los conocidos métodos setAttribute() y getAttribute(). IOException { Integer variable = (Integer)req.. resp. %> Y en un Servlet.getAttribute("variable"). Dentro de un JSP podemos fijarlas o leerlas con la variable application que viene predefinida en cualquier JSP.. HttpServletResponse resp) throws ServletException.getAttribute("variable"). new Integer(22)).. ..getSession(). se puede acceder obteniendo el ServletContext y llamando a sus métodos setAttribute() o getAttribute() public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req.1416)).print("<p> La variable vale " + variable + "</p>").getWriter(). Permanecen hasta que repleguemos nuestra aplicación del servidor o echemos el servidor abajo. .. new Double(3.. HttpServletResponse resp) throws ServletException. IOException { // Para fijar la variable getServletContext(). y para leer public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req.. // Para leerla en otro o el mismo JSP Integer valor = (Integer)application.setAttribute("variable". Application scope Estas variables son válidas para la aplicación.setAttribute("PI". HttpServletResponse resp) throws ServletException. teléfono. p.setAttribute("unaPersona". IOException { Persona p = new Persona(). p). Esas personas tienen varios atributos como nombre. public class Persona { private String nombre. p. etc. // 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(). apellido. y en un Servlet de igual manera public class UnServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req. Imagina ahora que estamos haciendo una aplicación que lleva un listado de personas. dirección. para un usuario en cualquier página (session) o para todos los usuarios mientras el servidor siga levantado (application). // y para obtenerla. session. Algo como esto (solo un par de atributos para simplificar) package com. private String apellido.setNombre("Pedro").ejemplos. etc. session. en un jsp <% Persona p = new Persona(). en otro jsp o el mismo Persona q = (Persona)session.chuidiang. .getAttribute("PI"). Por ejemplo. application) que necesitemos. Una solución más elegante es hacer un bean Persona con esos atributos. p. Puede ser un poco tedioso y sobre todo poco elegante tener que meter todos esos atributos uno a uno en los sitios (request.// Y para leerla en otro o el mismo servlet Double pi = (Double)getServletContext(). 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 sólo sea válida durante el paso de una página a otra (request).getAttribute("unaPersona").setApellido("Lopez").setNombre("Pedro"). Si ese bean ya existe lo obtenemos. apellido.getSession().. Dentro del jsp y una vez obtenido el bean. Java es listo y si el atributo de la clase es de tipo boolean. Por ejemplo.jsp"> Nombre : <input type="text" name="nombre"/><br/> Apellido : <input type="text" name="apellido"/><br/> <input type="submit" value="Salvar"/> </form> . "page". en jsp tenemos unos tag especiales que nos permiten trabajar con estos bean más al estilo de una página html.. Imagina el formulario para persona <form action="salva. En el caso concreto de formularios. en nuestro caso "com.Persona"></jsp:useBean> Aquí ponemos en scope dónde queremos guardar o recoger el bean. <jsp:getProperty> y <jsp:setProperty> Para obtener un bean dentro de jsp lo hacemos así <jsp:useBean id="unaPersona" scope="session" class="com. en class debemos indicar la clase del bean con paquete y todo. si nombre fuese booelan. sin meter el código java directamente. "session" o "application". etc. que en jsp:useBean era el id. es decir "unaPersona".setApellido("Lopez"). // y para leer en el mismo Servlet u otro Persona q = (Persona)req.Persona"..setAttribute("unaPersona".. p).ejemplos. podemos meter valores en sus propiedades o acceder a ellas <jsp:setProperty name="unaPersona" property="nombre" value="Pedro"/> . . En property se pone el nombre de la propiedad (nombre. etc) y en value. java convertirá automáticament la cadena de texto al tipo adecuado.p.getSession(). jsp:setProperty nos permite recoger fácilmente en la página jsp de destino los campos del formulario. "request". Finalmente. El id es el nombre que usábamos antes como nombre de atributo. Estos tag son <jsp:useBean>.ejemplos. Sin embargo. si no existe se crea y se guarda ahí.chuidiang.getAttribute("unaPersona"). lo que queremos que valga. podríamos poner value="true" y se haría la conversión automáticamente. en el caso del setProperty. es decir. req. <p>El nombre es <jsp:getProperty name="unaPersona" property="nombre"/></p> Esta vez name es el nombre del bean.chuidiang. entero. podríamos escribir <jsp:useBean id="nuevaPersona" class="com. Podríamos de igual forma haber cogido/creado esa "nuevaPersona" en request. session o application. podemos crear el bean y rellenar sus valores así <jsp:useBean id="nuevaPersona" class="com.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="nombre"/> <jsp:setProperty name="nuevaPersona" property="apellido"/> y existe aun una facilidad más. en vez de value. Si el nombre del param y del property coinciden.chuidiang.chuidiang.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="*"/> En este ejemplo le hemos puesto scope="page". es decir. Al ser el caso anterior. podemos no poner param. . en la página salva. entonces con un property="*" los rellenamos todos de un plumazo.Pues bien.ejemplos. indicamos param. tal que así <jsp:useBean id="nuevaPersona" class="com. Si todos los nombres de los campos coindicen con todos los nombres de los atributos del bean.jsp que recibe este formulario.ejemplos.Persona" scope="page"/> <jsp:setProperty name="nuevaPersona" property="nombre" param="nombre"/> <jsp:setProperty name="nuevaPersona" property="apellido" param="apellido"/> Es decir. que por defecto valdrá lo mismo que property. siendo param el nombre del campo en el formulario.ejemplos. esa "nuevaPersona" sólo existirá en nuestra página jsp y posiblemente la salvemos en base de datos o hagamos cualquier otra cosa con ella.chuidiang.