Download Actividades
Document related concepts
no text concepts found
Transcript
11.1.1. Cuadro sinóptico de objetivos e indicadores del módulo Indicadores de evaluación Se espera que los estudiantes sean capaces de: Se espera que los estudiantes sean capaces de: Los estudiantes que han alcanzado este aprendizaje: Construir aplicaciones computacionales basadas en programación orientada a objetos, de manera de cumplir con las exigencias técnicas y de los usuarios Construye las unidades de prueba en JAVA para verificar el correcto funcionamiento de la codificación realizada Analiza el código de programación JAVA para verificar su correcto comportamiento y detectar errores. Reconoce las clases predefinidas en el lenguaje JAVA para resolver un problema dado Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Diseña componentes reutilizables en el lenguaje JAVA de manera de dar solución a problemas frecuentes Utiliza el framework JUnit para construir casos de prueba. Revisa la codificación de clases programadas en Java utilizando la herramienta de debugging del entorno de desarrollo Identifica clases asociadas al framework asociado a la capa de acceso a datos Identifica clases asociadas a Hibernate para implementar la capa de acceso a datos Identifica clases asociadas a la presentación y a la lógica de la aplicación 11.2.1. Actividades de Aprendizajes APRENDIZAJE ESPERADO: Construye las unidades de prueba en JAVA para verificar el correcto funcionamiento de la codificación realizada Analiza el código de programación JAVA para verificar su correcto comportamiento y detectar errores. Reconoce las clases predefinidas en el lenguaje JAVA para resolver un problema dado Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Diseña componentes reutilizables en el lenguaje JAVA de manera de dar solución a problemas frecuentes APRENDIZAJE ESPERADO: Construye las unidades de prueba en JAVA para verificar el correcto funcionamiento de la codificación realizada Actividad 1: JUnit El docente hace una presentación que expone la importancia de las pruebas de caja negra sobre una aplicación o los componentes de la aplicación ya sea de escritorio o web, mostrando los criterios para crear un plan de pruebas, entendiendo la importancia que se desprende en la planificación del proyecto sobre los requisitos funcionales y no funcionales, como también la calidad esperada de la solución. El docente propone un ejercicio para realizar pruebas con JUnit a partir de un plan de pruebas, en donde se ilustra cada una de las alternativas y casos en donde una aplicación puede generar errores, excepciones o situaciones de borde, aplicando la orientación objeto obtenidas por el estándar O.R.M. (Mapeo Objeto-Relacional) Caso: Prueba Unitaria Ref# R.1.1 Función Informac ión del Cliente Cat. evidente R.1.2 Promedi o de Ventas evidente Entrada rut=1 nombre=”Pedro” apPaterno=”Astorga” apMaterno=”Berrios” Cliente rut=1 nombre=”Pedro” apPaterno=”Astorga” apMaterno=”Berrios” Venta id=1 fecha=”21/02/2013” Productos Producto1 Codigo=1 Nombre=”Tuerca” Valor=50 Cantidad=20 Producto2 Codigo=2 Nombre=”Clavo” Valor=10 Cantidad=100 Venta id=2 fecha=”23/02/2013” Productos Producto1 Codigo=1 Nombre=”Tuerca” Valor=50 Cantidad=40 Producto2 Proceso Muestra los atributos de la clase de la forma Cliente{rut,nombre,apPaterno, apMaterno} Calcula el promedio de ventas de un cliente. Resultado Cliente{rut=1, nombre=Pedro, apPaterno=Astorga, apMaterno=Berrios} 1500 Codigo=2 Nombre=”Clavo” Valor=10 Cantidad=200 R.1.3 Calcula total de la venta evidente Venta id=1 fecha=”21/02/2013” Productos Calcula el total de la venta a partir de los productos que contiene sumando el subtotal de cada producto valor*cantidad 2000 Calcula la cantidad de los productos que tienen en la venta sumando la cantidad de cada producto 120 Calcula el subtotal a partir de multiplicar el valor por la cantidad 1000 Producto1 Codigo=1 Nombre=”Tuerca” Valor=50 Cantidad=20 Producto2 Codigo=2 Nombre=”Clavo” Valor=10 Cantidad=100 R.1.4 Calcula Cantidad de producto s de la Venta evidente Venta id=1 fecha=”21/02/2013” Productos Producto1 Codigo=1 Nombre=”Tuerca” Valor=50 Cantidad=20 Producto2 Codigo=2 Nombre=”Clavo” Valor=10 Cantidad=100 R.1.5 Calcula el subtotal del producto Solución R.1.1 evidente Producto1 Codigo=1 Nombre=”Tuerca” Valor=50 Cantidad=20 Solución R.1.2 Solución R.1.3. Solución R.1.4. Solución R.1.5. Observaciones para el docente El docente aclara el funcionamiento de los assert y los fail que ocurren dentro de una prueba unitaria, teniendo en cuenta como se compara la orientación a objetos con un resultado esperado. APRENDIZAJE ESPERADO Analiza el código de programación JAVA para verificar su correcto comportamiento y detectar errores. Actividad 2: Debug El docente hace una presentación para profundizar las pruebas de caja blanca, explicando como ocupar y conocer los diferentes comportamientos del código, analizando variables, instrucciones paso a paso y saltos de instrucciones. El docente propone un ejercicio práctico en donde se analiza un método de una clase en un debug, creando un plan de resultados parciales para la prueba de caja blanca. Caso: Prueba Caja Blanca Cantidad Total A partir de la actividad anterior se requiere analizar desde la instrucción int result = v1.cantidadTotal(); los resultados parciales del método cantidadTotal() Solución Detener con un breakpoint en la instrucción señalada y seleccionar paso a paso en el método cantidadTotal() Al ingresar al método se posiciona en la clase Venta y en el método cantidadTotal() Notar que por cada iteración cada objeto producto es extraído de la lista productos, en la primera iteración debe obtener del método getCantidad() el valor 20, la última o segunda iteración debe obtener del método getCantidad() el valor 100. Obteniendo finalmente la suma de ambos que es 120 Notar que vuelve de la clase Venta a su unidad de Test de JUnit con el resultado esperado. Observaciones para el docente El docente aclara el funcionamiento de la prueba de caja blanca y la importancia de probar cada uno de los métodos desarrollados, incentivando al alumno que justifique el desarrollo de su código con ejemplos descriptivos. APRENDIZAJE ESPERADO Reconoce las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 3: ORM El docente hace una presentación para describir la transformación desde un modelo de base de datos a un diagrama de clases, detallando los estándares de nombres de tablas respecto a clases de acuerdo a la certificación SCJP, adicionalmente se explica la relación entre los campos y atributos, por último se traduce la relación de foreign keys con las colecciones de objetos. El docente propone un ejercicio práctico de mapeo a partir de un modelo de base de datos a orientación a objetos Caso: Base de datos de Seguro CREATE DATABASE BDSEGURO; USE BDSEGURO; CREATE TABLE POLIZA ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), DESCRIPCION VARCHAR(250) ); CREATE TABLE CLIENTE ( RUT INT NOT NULL PRIMARY KEY, NOMBRE VARCHAR(30), ); AP_PATERNO VARCHAR(30), AP_MATERNO VARCHAR(30) CREATE TABLE SEGURO ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, FECHA_INICIO DATE, FECHA_FIN DATE, CLIENTE_RUT INT NOT NULL, POLIZA_ID INT NOT NULL, CONSTRAINT CLIENTE_FK FOREIGN KEY (CLIENTE_RUT) REFERENCES CLIENTE(RUT), CONSTRAINT POLIZA_FK FOREIGN KEY (POLIZA_ID) REFERENCES POLIZA(ID) ); Convertir el modelo de datos a orientación a objetos bajo el estándar O.R.M. Manualmente. Solución package entidad; import java.util.HashSet; import java.util.Set; public class Cliente implements java.io.Serializable { private int rut; private String nombre; private String apPaterno; private String apMaterno; private Set seguros = new HashSet(0); public Cliente() { } public Cliente(int rut) { this.rut = rut; } public Cliente(int rut, String nombre, String apPaterno, String apMaterno, Set seguros) { this.rut = rut; this.nombre = nombre; this.apPaterno = apPaterno; this.apMaterno = apMaterno; this.seguros = seguros; } public int getRut() { return this.rut; } public void setRut(int rut) { this.rut = rut; } public String getNombre() { return this.nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApPaterno() { return this.apPaterno; } } public void setApPaterno(String apPaterno) { this.apPaterno = apPaterno; } public String getApMaterno() { return this.apMaterno; } public void setApMaterno(String apMaterno) { this.apMaterno = apMaterno; } public Set getSeguros() { return this.seguros; } public void setSeguros(Set seguros) { this.seguros = seguros; } package entidad; import java.util.HashSet; import java.util.Set; public class Poliza implements java.io.Serializable { private Integer id; private String nombre; private String descripcion; private Set seguros = new HashSet(0); public Poliza() { } public Poliza(String nombre, String descripcion, Set seguros) { this.nombre = nombre; this.descripcion = descripcion; this.seguros = seguros; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getNombre() { return this.nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getDescripcion() { return this.descripcion; } public void setDescripcion(String descripcion) { this.descripcion = descripcion; } public Set getSeguros() { return this.seguros; } public void setSeguros(Set seguros) { this.seguros = seguros; } } package entidad; import java.util.Date; public class Seguro implements java.io.Serializable { private Integer id; private Poliza poliza; private Cliente cliente; private Date fechaInicio; private Date fechaFin; public Seguro() { } public Seguro(Poliza poliza, Cliente cliente) { this.poliza = poliza; this.cliente = cliente; } public Seguro(Poliza poliza, Cliente cliente, Date fechaInicio, Date fechaFin) { this.poliza = poliza; this.cliente = cliente; this.fechaInicio = fechaInicio; this.fechaFin = fechaFin; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public Poliza getPoliza() { return this.poliza; } public void setPoliza(Poliza poliza) { this.poliza = poliza; } public Cliente getCliente() { return this.cliente; } public void setCliente(Cliente cliente) { this.cliente = cliente; } public Date getFechaInicio() { return this.fechaInicio; } public void setFechaInicio(Date fechaInicio) { this.fechaInicio = fechaInicio; } public Date getFechaFin() { return this.fechaFin; } public void setFechaFin(Date fechaFin) { this.fechaFin = fechaFin; } } Observaciones para el docente El docente aclara el proceso de crear objetos de acuerdo a sus relaciones de atributos y cardinalidad convertida en Colecciones de objetos. APRENDIZAJES ESPERADOS: Reconoce las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 4: Persistencia El docente hace una presentación para describir las diferentes clases de datos presentes en JAVA, desde sus comienzos con el JDBC pasando por iBATIS, EJB, Hibernate, JPA en donde se detalla las conexiones y transacciones que ocurren con el lenguaje SQL, HQL, JPQL. El docente propone un ejercicio práctico en donde se detalla la persistencia con las transacciones clásicas con statement, resultset y Connection de la librería java.sql. Caso: Métodos de datos SCRIPT MYSQL CREATE DATABASE BDSEGURO; USE BDSEGURO; CREATE TABLE POLIZA ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), DESCRIPCION VARCHAR(250) ); CREATE TABLE CLIENTE ( RUT INT NOT NULL PRIMARY KEY, NOMBRE VARCHAR(30), AP_PATERNO VARCHAR(30), AP_MATERNO VARCHAR(30) ); CREATE TABLE SEGURO ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, FECHA_INICIO DATE, FECHA_FIN DATE, CLIENTE_RUT INT NOT NULL, POLIZA_ID INT NOT NULL, CONSTRAINT CLIENTE_FK FOREIGN KEY (CLIENTE_RUT) REFERENCES CLIENTE(RUT), CONSTRAINT POLIZA_FK FOREIGN KEY (POLIZA_ID) REFERENCES POLIZA(ID) ); Crear método de dato para agregar un cliente Crear método de dato para agregar una poliza Crear método de dato para agregar un seguro Crear método para obtener todos los seguros asociados a una poliza Solución Agregar cliente modalidad String public void agregarCliente(Cliente p) throws Exception { Connection con; Statement st; con = DriverManager.getConnection("jdbc:mysql://localhost:3306/BDSEGURO"); st = con.createStatement(); String sql = "INSERT INTO CLIENTE(RUT,NOMBRE,AP_PATERNO,AP_MATERNO) VALUES (%s,’%s’,’%s’,’%s’);"; sql = String.format(sql,p.getRut(),p.getNombre(),p.getApPaterno(),p.getApMaterno()); st.executeUpdate(sql); } Agregar poliza modalidad PreparedStatement public void agregarPoliza(Poliza p) throws Exception { Connection con; con = DriverManager.getConnection("jdbc:mysql://localhost:3306/BDSEGURO"); PreparedStatement pSt = con.prepareStatement(‘INSERT INTO POLIZA(NOMBRE,DESCRIPCION) VALUES (?,?)”); pSt.setString(1,p.getNombre()); pSt.setString(2,p.getDescripcion()); pSt.execute(); } Agregar un seguro modalidad PreparedStatement en adelante public void agregarSeguro(Seguro s) throws Exception { Connection con; con = DriverManager.getConnection("jdbc:mysql://localhost:3306/BDSEGURO"); PreparedStatement pSt = con.prepareStatement(‘INSERT INTO SEGURO(FECHA_INICIO,FECHA_FIN,CLIENTE_RUT, POLIZA_ID) VALUES (?,?,?,?)”); pSt.setDate(1,s.getFechaInicio()); pSt.setDate(2,s.getFechaFin()); pSt.setInt(3,s.getCliente().getRut()); pSt.setInt(4,s.getPoliza().getId()); pSt.execute(); } Obtener todos los seguros asociados a una poliza public List<Perro> obtenerSeguroPorPoliza(int poliza) throws Exception { Connection con; Statement st; ResultSet rs; con = DriverManager.getConnection("jdbc:mysql://localhost:3306/BDSEGURO"); st = con.createStatement(); String sql = "SELECT ID,FECHA_INICIO, FECHA_FIN, CLIENTE_RUT,POLIZA_ID FROM SEGURO INNER JOIN POLIZA ON SEGURO.POLIZA_ID = POLIZA.ID WHERE POLIZA.ID = " + poliza + “;”; rs = st.executeQuery(sql); List<Seguro> seguros = new ArrayList(); while(rs.next()) { Seguro s = new Seguro(); s.setId(rs.getInt("ID")); s.setFechaInicio(rs.getDate("FECHA_INICIO")); s.setFechaFin(rs.getDate("FECHA_FIN")); s.setCliente(obtenerClientePorRut(rs.getInt("CLIENTE_RUT"))); s.setPoliza(obtenerPolizaPorId(rs.getInt(“POLIZA_ID”))); seguros.add(s); } return seguros; } Observaciones para el docente El docente aclara las ventajas de la utilización nativa con Connection, Statement, PreparedStatement, ResultSet, en donde se detalla el uso y omisión de ciertas funcionalidades para obtener mejor rendimiento en las aplicaciones que usen métodos de datos. APRENDIZAJES ESPERADOS: Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 5: Hibernate El docente hace una presentación que ilustra las diferentes funcionalidades de hibernate para la creación de conexiones a través del XML (hibernate.cfg), y extraer la definición de las tablas a través de la Ingenieria Inversa (hibernate.reveng), además de crear la orientación a objetos con la norma O.R.M. con los POJOS (Plain ordinary Object) que provee hibernate. El docente propone una experiencia para la creación del hibernate.cfg, hibernate.reveng y posteriormente la creación de la orientación a objetos. Experiencia configuración de hibernate En esta experiencia se detalla de manera simple la configuración de hibernate con los pasos - Hibernate Configuration Wizard - Hibernate Reverse Engineering Wizard - Hibernate Mapping Files and POJOs from Database Observaciones para el docente El docente aclara los diferentes producto resultado obtenidos de cada uno de los pasos, entendiendo que el hibernate configuration wizard y su establecimiento de una conexión con la base datos, Hibernate reverse engineering wizard para la producción de las tablas candidatas a conversión bajo O.R.M., hibernate mapping files and POJOs from Database como se mescla la conexión con las tablas candidatas para crear las clases java y el mapeo relacional con la base de datos. APRENDIZAJES ESPERADOS: Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 6: Hibernate business El docente hace una presentación del uso de la librería org.hibernate destacando el uso de las clases Transaction con los diferentes usos bajo D.M.L. insert, update, delete y la diferenciación que tiene el insert cuando la base de datos en su clave primaria posee un identity. El docente propone un ejercicio práctico para la creación de métodos de negocio utilizando HibernateUtil Caso: Mantenedor de clientes en hibernate SCRIPT MYSQL CREATE DATABASE BDCLIENTE; USE BDCLIENTE; CREATE TABLE CLIENTE( RUT INT NOT NULL PRIMARY KEY, NOMBRE VARCHAR(30), AP_PATERNO VARCHAR(30), AP_MATERNO VARCHAR(30) ); CREATE TABLE PRODUCTO( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), VALOR INT ); A partir de la base de datos cliente crear los métodos de negocio para agregar, modificar y eliminar un cliente y producto. Solución Crear el HibernateUtil en la capa de negocio Crear la clase de negocio Cliente Crear la clase de negocio Producto que tiene la diferencia que el primary key id de la tabla producto es un campo auto-incremental, por lo tanto la base de datos asigna un número correlativo cuando es ingresado. Observaciones para el docente El docente aclara el uso de la clase Transaction y como interviene el compromiso de datos con commit, adicionalmente aclara la diferencia del ingreso de objetos a la base de datos dependiendo de su primary key, destacando si es auto-incremental o no. APRENDIZAJES ESPERADOS: Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 7: Hibernate Query El docente hace una presentación que ilustra el funcionamiento de las consultas a la base de datos a través del HQL, destacando el uso de la orientación a objetos como guía para crear consultas más robustas. El docente propone un ejercicio práctico para la creación de filtros de búsqueda sobre una tabla en particular. Caso: Filtro de Productos Script MYSQL CREATE DATABASE BDPRODUCTO; USE BDPRODUCTO; CREATE TABLE PRODUCTO( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), VALOR INT ); Crear filtros de búsqueda para producto por Id, Nombre, Valor, Nombre-Valor Solución Observaciones para el docente El docente aclara la relación que existe entre las clases creadas en la creación de orientación a objetos por POJO, y como se filtran a través de la cláusula “where” APRENDIZAJES ESPERADOS: Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Actividad 8: HQL Inner Join El docente hace una presentación que ilustra la importancia de las consultas que involucran tablas que poseen relaciones de cardinalidad por llaves foráneas, proponiendo consultas más avanzadas entre 2 o más entidades. El docente propone un ejercicio práctico para el uso de inner join explicando el uso de los alias para cumplir la relación entre varias entidades. Caso: Filtro de búsqueda geográfica. CREATE DATABASE BDGEOGRAFICA; USE BDGEOGRAFICA; CREATE TABLE REGION( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50) ); CREATE TABLE CIUDAD( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), REGION_ID INT NOT NULL, CONSTRAINT REGION_FK FOREIGN KEY (REGION_ID) REFERENCES REGION(ID) ); CREATE TABLE COMUNA( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, NOMBRE VARCHAR(50), CIUDAD_ID INT NOT NULL, CONSTRAINT CIUDAD_FK FOREIGN KEY (CIUDAD_ID) REFERENCES CIUDAD(ID) ); Crear un buscador de: - Ciudades por id Region - Ciudades por nombre Region - Comunas por id Ciudad - Comunas por nombre Ciudad - Comunas por id Region - Comunas por nombre Region Solución Observaciones para el docente El docente aclara el uso inner join con hql teniendo en cuenta la colección dentro de cada clase, entendiendo como se unen cada entidad con los alias declarados. APRENDIZAJES ESPERADOS: Diseña componentes reutilizables en el lenguaje JAVA de manera de dar solución a problemas frecuentes Actividad 9: JSP + Servlets En docente hacer una presentación que ilustra los elementos básicos para la creación de páginas web, adicionalmente se hace mención a los componentes web, identificando como se unen los formularios web con la capa de negocio. El docente propone un ejercicio práctico en donde se crea una página web de ingreso de clientes. Caso: Ingreso de Cliente Prototipo Código HTML A partir de la página web del prototipo relacionar el servlet AddCliente, la finalidad es ocupar a una entidad de negocio NegCliente para lograr ingresar el cliente a la base de datos. Solución Observaciones para el docente El docente aclara el uso de la capa de presentación de interfaz web, en donde se relaciona un servlet para el ingreso de un objeto cliente a la base de datos. APRENDIZAJES ESPERADOS: Diseña componentes reutilizables en el lenguaje JAVA de manera de dar solución a problemas frecuentes Actividad 10: JSP + Servlets + Session El docente hace una presentación que ilustra el uso de sesiones como transporte de datos entre componentes web para la creación de páginas dinámicas. El docente propone un ejercicio práctico para creación de un informe de todos los clientes de una base de datos. Caso: Informe de Clientes Primero se crea el servlet para ocupar una variable de sesión. Pagina web Observaciones para el docente El docente aclara el uso iteraciones de colecciones de objetos que provienen de una sesión para convertirlos en html. 11.2.2. Sugerencias evaluación APRENDIZAJES ESPERADOS Identifica las principales entidades, procesos y sus interrelaciones para poder diseñar un modelo que permita la interacción de los elementos Construye el modelo de datos que responda a las necesidades de información transaccional del negocio Implementa el modelo en la BBDD que da solución a la problemática expuesta Actividad de evaluación Criterios de evaluación Como actividades de evaluación en lo que respecta al aprendizaje se sugiere: Construye las unidades de prueba en JAVA para verificar el correcto funcionamiento de la codificación realizada El docente entrega a los estudiantes un problema sobre la plataforma web, en Analiza el código de programación JAVA para verificar su donde realizará la capa de negocios, correcto comportamiento y detectar errores. presentación y servlets. Reconoce las clases predefinidas en el lenguaje JAVA para resolver un problema dado Utiliza las clases predefinidas en el lenguaje JAVA para resolver un problema dado Diseña componentes reutilizables en el lenguaje JAVA de manera de dar solución a problemas frecuentes 11.2.3. Recursos : Materiales y equipamiento Laboratorio apropiado: Amplia y con buena visibilidad de la pizarra, Computadores con los programas de entorno de desarrollo para cada alumno (Mysql, NetBeans). Una red en buenas condiciones para el traspaso de archivos, Guía para los ejercicios y evaluaciones teórico-prácticas. 11.2.4. Perfil Docente Técnico de Nivel Superior en programación con formación pedagógica. El docente debe tener conocimientos y habilidades manejo de soluciones informáticas: J2SE, J2EE, Modelos de datos, Programación SQL. Además de conocer distintos modelos de negocio de diferentes empresas y/o rubros. 11.2.5. Bibliografía y Sitios recomendados Bibliografía para el docente Luque Ruiz, Irene; Bases de datos : desde Chen hasta Codd con Oracle; México, D. F. : Alfaomega, 2002 -- 422p Programacion Java Autor: Herbert Schilt Título: La Biblia de java 2 v5.0 N ° Edición: 1° Lugar de Publicación: España Editorial: Anaya Multimedia Año de Publicación: 2005 Código Biblioteca Duoc: 005.133LJ S334b Java Servlets (Tata McGraw-Hill Second Edition) w/CD-Rom [Paperback] Karl Moss (Author) Paperback: 514 pages Publisher: McGraw-Hill (1999) Language: English ISBN-10: 0074637398 ISBN-13: 978-0074637395 Deitel, Harvey M., 1945-. Cómo programar en Java. México, D. F.: Pearson Educación, 1998, 2004, 2008. 1325 p. http://books.google.cl/books?id=is2J44U4DpsC&printsec=frontcover&hl=es#v=onepage&q&f=false Eckel, Bruce. Piensa en Java. Madrid : Pearson, 2002, 2006. viii-xiix, 906 p. Froufe Quintas, Agustín. Java 2 : manual de usuario y tutorial. México, D. F. : Alfaomega, 2000, 2003, 2006, 2008, 2009. 832 p. Gamma, Erich. Patrones de diseño. Madrid: Addison-Wesley, 2003. 364 p. Houlette, Forrest. Fundamentos de SQL. México, D. F. : McGraw-Hill, 2003. 422 p. Bibliografía para el estudiante Programacion Java Autor: Herbert Schilt Título: La Biblia de java 2 v5.0 N ° Edición: 1° Lugar de Publicación: España Editorial: Anaya Multimedia Año de Publicación: 2005 Código Biblioteca Duoc: 005.133LJ S334b Sitios web recomendados Mysql http://dev.mysql.com/doc/ Java http://www,java.com/es/download