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: [email protected]
MSc. Daniel Alejandro Yucra Sotomayor
Pag. - 17 -