Download MSc. Daniel Alejandro Yucra Sotomayor Pag. - 1
Document related concepts
no text concepts found
Transcript
Ingeniería de Software II Laboratório 3 JSP con Base de Datos 1. Creación de un Módulo de Gestión Para desarrollar esta aplicación es necesario crear una base de datos con al menos una tabla donde se registre los datos. El módulo de gestión 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 versión de phpMyadmin en la carpeta “/var/www/html”, con el nombre “myamin”. a) Ingrese la siguiente dirección URL http://localhost/myadmin, debe mostrar la figura que se muestra a continuación: Figura 01: Acceso a phpmyadmin, cliente gestor de base de datos MySql MSc. Daniel Alejandro Yucra Sotomayor Pag. - 1 - Ingeniería de Software II b) Para estos laboratorios se ha configurado las maquinas el servicio Mysql el usuario “root” y el password “uigv”. c) A continuación, utilizando PhpMyadmin, crear la base de datos “estudiante”: Figura 02: Creando la Base de Datos “estudiante” d) El código SQL que debe generar es la muestra a continuación: --- 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, MSc. Daniel Alejandro Yucra Sotomayor Pag. - 2 - Ingeniería de Software II `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 código en la opción SQL. Figura 03: Ejecutando el código SQL en PhpMyAdmin e) Además debe haber creado las tablas “persona” y “usuario”, tal como se muestra en la figura acontinuación: Figura 04: Verificando la creación de las tablas “persona” y “usuarios” MSc. Daniel Alejandro Yucra Sotomayor Pag. - 3 - Ingeniería de Software II 3. Proyecto Gestión 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 “Java 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 continuación elegimos el servidor y la versión de Java, para este caso “GlassFish Server 3.1” y Java EE version: “Java EE 5”, tal como se muestra a continuación: MSc. Daniel Alejandro Yucra Sotomayor Pag. - 4 - Ingeniería de Software II 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 JSP que tendrán diferentes funcionalidades para el módulo. 4. Lista de resultando en JSP A continuación vamos a adicionar el primer script JSP que listará los datos de la tabla “persona”. a) En el proyecto “GestionEstudiantes”, crear un nuevo archivo “JSP”, 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 continuación copie el siguiente código: <!-- 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> MSc. Daniel Alejandro Yucra Sotomayor Pag. - 5 - Ingeniería de Software II <% 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 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>"); y // 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 conexión permanente entre el proyecto y la base de datos “estudiante”, debe crear una unidad de persistencia. d) A continuación este es el resultado del listado de estudiantes MSc. Daniel Alejandro Yucra Sotomayor Pag. - 6 - Ingeniería de Software II Figura 08: Listado de registros de la tabla “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 conección o enlaze entre el programa jsp y la base de datos en mysql. OBJETO RESULTSET:- Es la representación 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 continuación copiar el siguiente código para este ejemplo: MSc. Daniel Alejandro Yucra Sotomayor Pag. - 7 - Ingeniería de Software II <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>CÓDIGO<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 construcción del script fue el siguiente: - Crear una conexión o enlace a la base de datos. MSc. Daniel Alejandro Yucra Sotomayor Pag. - 8 - Ingeniería de Software II - Abrir la conexión a la base de datos. - Crear el enlace y cargarlo con la instrucción 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 conexión - 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 MSc. Daniel Alejandro Yucra Sotomayor Pag. - 9 - Ingeniería de Software II d) Finalmente el resultado de la ejecución de este script deberá mostrar como aparece en la figura: Figura 11: Ejecutando el script consultaevento.jsp Figura 12: Mostrando resultados de la tabla Persona 6. Adición 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 instrucción sql: INSERT INTO TABLA(CAMPO1,CAMPO2..) VALUES(VALOR1,VALOR2..); MSc. Daniel Alejandro Yucra Sotomayor Pag. - 10 - Ingeniería de Software II Para este caso se crea la string "q" con el formato apropiado sql (query). Es importante destacar que existen dos métodos para el objeto Statement - STATEMENT.EXECUTEQUERY() = Se debería usarlo para la instrucción SQL SELECT - STATEMENT.EXECUTEUPDATE()= Se debería usarlo para la instrucción SQL INSERT, UPDATE, DELETE. etc. b) A continuación copiar el siguiente código: <%@ 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>"); %> MSc. Daniel Alejandro Yucra Sotomayor Pag. - 11 - Ingeniería de Software II c) El resultado de la presentación se muestra a continuación Figura 13: Adicionando un nuevo registro Figura 14: Confirmando registro d) A continuación debe verificar, utilizando el archivo “consultasimple.jsp” o “consultaevento.jsp” Figura 15: Verificando el nuevo registro ingresado MSc. Daniel Alejandro Yucra Sotomayor Pag. - 12 - Ingeniería de Software II 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 informacíón o corregir algun error de captura original. En este caso se utiliza la instrucción sql UPDATE, sin embargo ahora se tendran que construir dos métodos uno de busqueda de algún 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 continuación copiar el siguiente código: <%@ 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) MSc. Daniel Alejandro Yucra Sotomayor Pag. - 13 - Ingeniería de Software II { 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 presentación se muestra a continuación MSc. Daniel Alejandro Yucra Sotomayor Pag. - 14 - Ingeniería de Software II Figura 16: Ingresando código de búsqueda de registro Figura 17: Modificando Datos de un registro Figura 18: Resultado de la confirmación del registro editado MSc. Daniel Alejandro Yucra Sotomayor Pag. - 15 - Ingeniería de Software II 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 instrucción SQL DELETE (DELETE FROM TABLA WHERE CONDICION) y el resultado utilizando RESULTSET.EXECUTEUPDATE() b) A continuación copiar el siguiente código: <%@ 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>"); %> MSc. Daniel Alejandro Yucra Sotomayor Pag. - 16 - Ingeniería de Software II c) Este es el resultado que debe mostrar a continuación: Figura 19: Busca un registro Figura 20: Confirmación de la eliminación FACULTAD DE INGENIERÍA DE COMPUTO Y SISTEMAS Docente: MSc. Daniel Alejandro Yucra Sotomayor Lima, Agosto, del 2011 Consultas: dyucra@gmail.com MSc. Daniel Alejandro Yucra Sotomayor Pag. - 17 -