Laboratrio 3 JSP con Base de Datos 1. Creacin de un Mdulo de Gestin Para desarrollar esta aplicacin es necesario crear una base de datos con al menos una tabla donde se registre los datos. El mdulo de gestin de personas por lo menos debe tener las siguientes funcionales: Adicionar un registro Modificar registros Eliminar registros Mostrar los registros 2. Creando la Base de Datos Para realizar este laboratorio es importante primero correr los servicios Apache HTTPD httpd, el gestor MYSQL Mysqld y debe haber descomprimido una versin de phpMyadmin en la carpeta /var/www/html, con el nombre myamin. a) Ingrese la siguiente direccin URL http://localhost/myadmin, debe mostrar la figura que se muestra a continuacin: Figura 01: Acceso a phpmyadmin, cliente gestor de base de datos MySql Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 2- b) Para estos laboratorios se ha configurado las maquinas el servicio Mysql el usuario root y el password uigv. c) A continuacin, utilizando PhpMyadmin, crear la base de datos estudiante: Figura 02: Creando la Base de Datos estudi ante d) El cdigo SQL que debe generar es la muestra a continuacin: -- -- Estructura de tabla para la tabla `persona` -- CREATE TABLE IF NOT EXISTS `persona` ( `clave` mediumint(9) NOT NULL AUTO_INCREMENT, `nombre` varchar(70) DEFAULT NULL, `edad` int(11) DEFAULT NULL, `estatura` int(11) DEFAULT NULL, PRIMARY KEY (`clave`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; -- -- Volcado de datos para la tabla `persona` -- INSERT INTO `persona` (`clave`, `nombre`, `edad`, `estatura`) VALUES (1, 'Daniel Torres', 34, 110), (3, 'Fabrizio Aguilar', 22, 180); -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `usuarios` -- CREATE TABLE IF NOT EXISTS `usuarios` ( `usuario` varchar(16) NOT NULL, Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 3- `contrasena` varchar(16) NOT NULL, PRIMARY KEY (`usuario`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Volcado de datos para la tabla `usuarios` -- INSERT INTO `usuarios` (`usuario`, `contrasena`) VALUES ('daniel', 'fedora14'), ('pedro', 'fedora14'); Solo debe copiar y ejecutar el cdigo en la opcin SQL. Figura 03: Ejecutando el cdigo SQL en PhpMyAdmin e) Adems debe haber creado las tablas persona y usuario, tal como se muestra en la figura acontinuacin: Figura 04: Verificando la creacin de las tablas persona y usuarios Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 4- 3. Proyecto Gestin de Estudiantes en Netbeans Antes de crear los scripts para este sistema, vamos a crear el proyecto GestionEstudiantes a) En Netbeans, elegir nuevo proyecto del tipo J ava Web, proyecto Web Applications Figura 05: Seleccionando la Categor{ia Java Web y el tipo de Proyecto Web Application b) El nombre de este proyecto ser: GestionEstudiantes Figura 06: Asignando el nombre del proyecto GestionEstudiantes c) A continuacin elegimos el servidor y la versin de J ava, para este caso GlassFish Server 3.1 y J ava EE version: J ava EE 5, tal como se muestra a continuacin: Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 5- Figura 07: Asignando el Server y una versi n de Java EE No se olvide ah debe seleccionar el boton finish A partir de este proyecto se va adicionar diferentes scripts J SP que tendrn diferentes funcionalidades para el mdulo. 4. Lista de resultando en JSP A continuacin vamos a adicionar el primer script J SP que listar los datos de la tabla persona. a) En el proyecto GestionEstudiantes, crear un nuevo archivo J SP, con el nombre de consultasimple, tal como se muestra en la figura de abajo: Figura 07: Asignando el nombre para el script consultasimple b) A continuacin copie el siguiente cdigo: <!-- Los import --> <%@ page language="java" %> <%@ page import ="java.sql.Connection"%> <%@ page import ="java.sql.DriverManager"%> <%@ page import ="java.sql.ResultSet"%> <%@ page import ="java.sql.Statement"%> <html> <body> <h1>Consulta a la Tabla Persona</h1> Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 6- <% try { // Conexion con bd Class.forName("org.gjt.mm.mysql.Driver"); Connection conexion =DriverManager.getConnection("jdbc:mysql://localhost/estudiante", "root", "uigv"); if (!conexion.isClosed()) { // La consulta Statement st =conexion.createStatement(); ResultSet rs =st.executeQuery("select * from persona" ); // Ponemos los resultados en un table de html out.println("<table border=\"1\"><tr><td>Id</td><td>Nombre y Apellido</td><td>Edad</td><td>Estatura</td></tr>"); while (rs.next()) { out.println("<tr>"); out.println("<td>"+rs.getObject("clave")+"</td>"); out.println("<td>"+rs.getObject("nombre")+"</td>"); out.println("<td>"+rs.getObject("edad")+"</td>"); out.println("<td>"+rs.getObject("estatura")+"</td>"); out.println("</tr>"); } out.println("</table>"); // cierre de la conexion conexion.close(); } else // Error en la conexion out.println("fallo"); } catch (Exception e) { // Error en algun momento. out.println("Excepcion "+e); e.printStackTrace(); } %> </body> </html> c) Para asegurar una conexin permanente entre el proyecto y la base de datos estudiante, debe crear una unidad de persistencia. d) A continuacin este es el resultado del listado de estudiantes Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 7- Figura 08: Listado de registros de la tabl a persona 5. Una consulta con un evento a) Para este ejemplo debe crear un nuevo archivo con el nombre consultaevento.jsp Es importante tener en cuenta lo siguiente: OBJETO CONNECTION:- Objeto que se utiliza para establecer la coneccin o enlaze entre el programa jsp y la base de datos en mysql. OBJETO RESULTSET:- Es la representacin en memoria de las tablas de la base de datos en disco, se puede entender como una tabla virtual, recordar que generalmente todos los procesos que se realizen con la tabla (insertar registros, eliminar registros, etc) se realizaran realmente contra un resulset y no provocaran ningun cambio en la tabla fisica en disco, resulset tiene un conjunto de metodos muy utiles y muy usados para el proceso de los renglones de la tabla virtual. OBJETO STATEMENT:- Este objeto y sus dos metodos executequery(solo para select de sql) y executeupdate( solo para insert, update y delete de sql) son los metodos que se utilizaran para comunicarse con la tabla fisica en disco. Para nuestro caso definiremos de la siguiente manera de la siguiente manera: // declarando y creando objetos globales Connection canal = null; ResultSet tabla= null; Statement instruccion=null; String strcon = "jdbc:mysql://localhost/estudiante?user=root&password=uigv"; // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion = canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } catch(java.lang.ClassNotFoundException e){} catch(SQLException e) {}; b) A continuacin copiar el siguiente cdigo para este ejemplo: Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 8- <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Consulta Evento</title> </head> <body> <%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% // declarando y creando objetos globales Connection canal =null; ResultSet tabla=null; Statement instruccion=null; String strcon ="jdbc:mysql://localhost/estudiante?user=root&password=uigv"; if(request.getParameter("OK") !=null) { // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion =canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); }catch(java.lang.ClassNotFoundException e){}catch(SQLException e) {}; //leyendo tabla en disco y pasandola al resultset try {tabla =instruccion.executeQuery("select * from persona"); // mandando resultset a una tabla html out.println("<H3>Consulta de la Tabla Persona</H3>"); out.println("<TABLE Border=10 CellPadding=5><TR>"); out.println("<TH bgcolor=#525666><FONT COLOR=WHITE>CDIGO<font></TH><TH bgcolor=#525666><FONT COLOR=WHITE>NOMBRE Y APELLIDO</FONT></TH><TH bgcolor=#525666><FONT COLOR=WHITE>EDAD</FONT></TH><TH bgcolor=#525666><FONT COLOR=WHITE>ESTATURA</FONT></TH</TR>"); // ciclo de lectura del resultset while(tabla.next()) { out.println("<TR>"); out.println("<TD>"+tabla.getString(1)+"</TD>"); out.println("<TD>"+tabla.getString(2)+"</TD>"); out.println("<TD>"+tabla.getString(3)+"</TD>"); out.println("<TD>"+tabla.getString(4)+"</TD>"); out.println("</TR>"); }; // fin while out.println("</TABLE></CENTER></DIV></HTML>"); // cerrando resultset tabla.close(); instruccion.close();canal.close();}//fin try no usar ; al final de dos o mas catchs catch(SQLException e) {}; }; //construyendo forma dinamica out.println("<FORM ACTION=consultaevento.jsp METHOD=post>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=CONSULTA><BR>"); out.println("</FORM>"); %> </body> </html> c) El procedimiento que de la construccin del script fue el siguiente: - Crear una conexin o enlace a la base de datos. Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 9- - Abrir la conexin a la base de datos. - Crear el enlace y cargarlo con la instruccin sql - Crear el RESULTSET y cargarlo - Cargar un objeto table de html con el RESULTSET - Procesar el table de html - Cerrar resultset, statement, driver y la conexin - En caso de que salga error verifique que haya creado la unidad de persistencia para este proyecto, en todo caso tiene que crear la unidad de persistencia. Figura 09: Integrando la Base de Datos con el proyecto en Netbeans d) Para este ejemplo el nombre de la unidad de persistencia ser: GestionEstudiantePU (es un archivo xml que se guardar en la carpeta Configuration Files del proyecto). Figura 10: Generando la unidad de persistencia Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 10- d) Finalmente el resultado de la ejecucin de este script deber mostrar como aparece en la figura: Figura 11: Ejecutando el script consultaevento.jsp Figura 12: Mostrando resultados de la tabl a Persona 6. Adicin de Registros en la tabla persona a) Para crear el script que permita adicionar nuevos registros debe crear el archivo adicion.jsp, Basicamente se destaca la siguiente instruccin sql: INSERT INTO TABLA(CAMPO1,CAMPO2..) VALUES(VALOR1,VALOR2..); Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 11- Para este caso se crea la string "q" con el formato apropiado sql (query). Es importante destacar que existen dos mtodos para el objeto Statement - STATEMENT.EXECUTEQUERY() =Se debera usarlo para la instruccin SQL SELECT - STATEMENT.EXECUTEUPDATE()=Se debera usarlo para la instruccin SQL INSERT, UPDATE, DELETE. etc. b) A continuacin copiar el siguiente cdigo: <%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% if(request.getParameter("GRABAR") !=null) { // objetos de enlace Connection canal =null; ResultSet tabla=null; Statement instruccion=null; String strcon ="jdbc:mysql://localhost/estudiante?user=root&password=uigv"; // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion =canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); }catch(java.lang.ClassNotFoundException e){}catch(SQLException e) {}; //cargando los campos a grabar // excepto clave porque en mysql es de tipo auto-increment String nombre =request.getParameter("NOMBRE"); int edad =Integer.parseInt(request.getParameter("EDAD")); int estatura =Integer.parseInt(request.getParameter("ESTATURA")); // insert into tabla(nombre,edad,estatura) values('juan', 15, 188); String q="insert into persona(nombre,edad,estatura) values(\"" +nombre+"\","+edad+","+estatura+"); "; try { // agregando renglon (insert) int n=instruccion.executeUpdate(q); //avisando que se hizo la instruccion out.println("REGISTRO INSERTADO"); }catch(SQLException e) {out.println(e);}; try{ // tabla.close(); instruccion.close(); canal.close(); }catch(SQLException e) {out.println(e);}; }; // construyendo forma dinamica out.println("<FORM ACTION=adicion.jsp METHOD=post>"); out.println("NOMBRE :<INPUT TYPE=TEXT NAME=NOMBRE><BR>"); out.println("EDAD :<INPUT TYPE=TEXT NAME=EDAD><BR>"); out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=GRABAR VALUE=INSERTAR ><BR>"); out.println("</FORM>"); %> Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 12- c) El resultado de la presentacin se muestra a continuacin Figura 13: Adicionando un nuevo registro Figura 14: Confirmando registro d) A continuacin debe verificar, utilizando el archivo consultasimple.jsp o consultaevento.jsp Figura 15: Verificando el nuevo registro ingresado Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 13- 7. Modificar Registros a) Para crear el script que permita modificar registros adicionados debe crear el archivo modifica.jsp, Editar significa cambiar el contenido de algunos de los campos por nueva informacn o corregir algun error de captura original. En este caso se utiliza la instruccin sql UPDATE, sin embargo ahora se tendran que construir dos mtodos uno de busqueda de algn registro y otro de actualizacion estos metodos son: - BUSQUEDA: programa normal de busqueda por clave, pero ahora debera construir una formulario html dinamica, que contendra un form action apuntando o ejecutandose a si mismo es decir modifica.jsp, ademas tendra todos los "input text" cajas de texto necesarios para cargar cada celda del renglon de busqueda. - EDICION: recoje los datos ya modificados del formulario html dinamica y realiza directamente cambios utilizando el comando sql update en la base de datos. b) A continuacin copiar el siguiente cdigo: <%@ page import="java.io.*, java.util.*, java.net.*, java.sql.*" %> <%! int clave=0; %> <% // codigo del evento BUSQUEDA y recordar construir una nueva forma dinamica if(request.getParameter("BUSCAR") !=null) { Connection canal =null; ResultSet tabla=null; Statement instruccion=null; String strcon ="jdbc:mysql://localhost/estudiante?user=root&password=uigv"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion =canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); }catch(java.lang.ClassNotFoundException e){}catch(SQLException e) {}; clave =Integer.parseInt(request.getParameter("CLAVEB")); String q="select * from persona where clave="+clave; try {tabla =instruccion.executeQuery(q); tabla.next(); out.println("<FORM ACTION=modifica.jsp METHOD=POST>"); out.println("NOMBRE:<INPUT TYPE=TEXT NAME=NOMBRE VALUE="+tabla.getString(2)+"><BR>"); out.println("EDAD:<INPUT TYPE=TEXT NAME=EDAD VALUE="+tabla.getString(3)+"><BR>"); out.println("ESTATURA:<INPUT TYPE=TEXT NAME=ESTATURA VALUE="+tabla.getString(4)+"><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=EDITAR VALUE=EDITAR><BR>"); tabla.close();instruccion.close();canal.close(); }catch(SQLException e) {}catch(Exception ex){}; }; // fin evento buscar // codigo de evento EDICION String temp2=request.getParameter("EDITAR"); if(temp2==null)temp2=" "; if(temp2.compareTo("EDITAR")==0) Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 14- { String nombre,q ; int edad; float estatura; Connection canal =null; ResultSet tabla=null; Statement instruccion=null; String strcon ="jdbc:mysql://localhost/estudiante?user=root&password=uigv"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion =canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); }catch(java.lang.ClassNotFoundException e){}catch(SQLException e) {}; try { tabla =instruccion.executeQuery("select * from persona"); }catch(SQLException e) {}; nombre =request.getParameter("NOMBRE"); edad =Integer.parseInt(request.getParameter("EDAD")); estatura =Integer.parseInt(request.getParameter("ESTATURA")); q ="UPDATE persona SET "+"NOMBRE='"+nombre+"', EDAD="+edad+",estatura="+estatura+" WHERE clave=" +clave+";"; try{instruccion.executeUpdate(q); }catch(SQLException e) {}; try {tabla.close();instruccion.close();canal.close();}catch(SQLException e) {}; out.println("REGISTRO EDITADO"); }; // fin evento editar // construyendo forma dinamica out.println("<FORM ACTION=modifica.jsp METHOD=post>"); out.println("CLAVE EDITAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=BUSCAR VALUE=BUSCAR ><BR>"); out.println("</FORM>"); %> c) El resultado de la presentacin se muestra a continuacin Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 15- Figura 16: Ingresando cdigo de bsqueda de registro Figura 17: Modificando Datos de un registro Figura 18: Resultado de la confirmacin del registro editado Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 16- 7. Eliminar Registro a) Para crear el script que permita eliminar registros debe crear el archivo eliminar.jsp, Para este ejemplo para eliminar se debe buscar el registro, el modelo que estamos usando es la instruccin SQL DELETE (DELETE FROM TABLA WHERE CONDICION) y el resultado utilizando RESULTSET.EXECUTEUPDATE() b) A continuacin copiar el siguiente cdigo: <%@ page import="java.io.*,java.util.*,java.net.*,java.sql.*" %> <% // declarando y creando objetos globales Connection canal =null; ResultSet tabla=null; Statement instruccion=null; String strcon ="jdbc:mysql://localhost/estudiante?user=root&password=uigv"; if(request.getParameter("OK") !=null) { // abriendo canal o enlace en su propio try-catch try { Class.forName("com.mysql.jdbc.Driver").newInstance(); canal=DriverManager.getConnection(strcon); instruccion =canal.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); }catch(java.lang.ClassNotFoundException e){}catch(SQLException e) {}; // preparando condicion de eliminacion int clave =Integer.parseInt(request.getParameter("CLAVEB")); // construyendo select con condicion eliminacion SQL DELETE String q="delete from persona where clave ="+clave; // mandando SQL a tabla en disco try {instruccion.executeUpdate(q); // avisando out.println("registro eliminado"); }//fin try no usar ; al final de dos o mas catchs catch(SQLException e) {} catch(java.lang.NullPointerException e){}; try { // no ocupa cerrar tabla(), no se leyo (select) un resultset // la eliminacion fue directa en disco instruccion.close();canal.close();}catch(SQLException e) {}; }; // construyendo forma dinamica out.println("<FORM ACTION=eliminar.jsp METHOD=post>"); out.println("CLAVE ELIMINAR:<INPUT TYPE=TEXT NAME=CLAVEB><BR>"); out.println("<INPUT TYPE=SUBMIT NAME=OK VALUE=ELIMINAR><BR>"); out.println("</FORM>"); %> Ingeniera de Software II MSc. Daniel Alejandro Yucra Sotomayor Pag. - 17- c) Este es el resultado que debe mostrar a continuacin: Figura 19: Busca un registro Figura 20: Confirmacin de la eli minacin FACULTAD DE INGENIERA DE COMPUTO Y SISTEMAS Docente: MSc. Daniel Al ejandro Yucra Sotomayor Lima, Agosto, del 2011 Consultas: dyucra@gmail.com