Ejemplo Modelo Vista Controlador



Comments



Description

Ejemplo Modelo Vista ControladorEn la entrada sobre patrones de Diseño se habla sobre el patrón MVC, en esta oportunidad vamos explicar un ejemplo practico donde se aplica este modelo mostrando la forma de independizar los componentes de nuestro sistema, además lo combinaremos con los patrones DAO y VO para facilitar el manejo de la información. Por cuestiones de tamaño no vamos a hacer la aplicación paso a paso, pero si se explicará la lógica de la misma, al final se presenta una opción de descarga del código fuente donde veremos la aplicación en funcionamiento. El problema. Se solicita desarrollar un sistema de administración de usuarios con un CRUD(Create, Read, Update, Delete) básico nos advierten que la aplicación es un prototipo inicial el cual esta propenso a cambios, pues aún no se tienen definidas las ventanas con las que se va a trabajar ni la información requerida, por le momento se trabajará con una BD MySql, pero posiblemente se tenga que migrar a otro sistema gestor.... La solución. Se aplica el MVC permitiendo independizar la lógica y la parte visual del sistema usando para eso un controlador que administra los procesos sirviendo como puente entre estos. para la BD se usa MySql, reutilizando la BD creada en el ejemplo de conexión con Java, el Scritp es el siguiente. CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET lati 1 2 USE `codejavu`; 3 4 /*Table structure for table `persona` */ 5 6 7 DROP TABLE IF EXISTS `persona`; 8 9 CREATE TABLE `persona` ( 10 `id` int(10) NOT NULL, 11 `nombre` varchar(30) default NULL, `edad` int(3) default NULL, 12 `profesion` varchar(30) default NULL, 13 `telefono` decimal(10,0) default NULL, 14 PRIMARY KEY (`id`) 15 ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 16 17 /*Data for the table `persona` */ 18 De esta forma se crea la Base de Datos a la que se va a apuntar, la cual contiene solo una tabla Persona con la que se realizan todas las operaciones CRUD. La agrupación de clases de nuestro sistema es: Como vemos tenemos la parte visual compuesta por las clasesVentanaPrincipal, VentanaRegistro, VentanaBuscar, la lógica de negocio se establece en el modelo el cual se compone por la clase Logica y Conexión y aplicamos los patrones DAO y VO por medio de las clases PersonaDao yPersonaVo y por ultimo el controlador se define en la clase Coordinador, encargada de establecer todas las relaciones del sistema, la clase Principalprepara las instancias iniciales del sistema y posteriormente lo ejecuta. Veamos como funciona el Patrón: El Modelo. Como se mencionó, en el modelo tenemos la lógica de negocio, serán todas las clases vinculadas con el CRUD a nivel interno, que en ultimas es en lo que gira nuestro sistema. Clase Logica. Esta clase permite realizar las operaciones asociadas a la lógica de negocio como tal, desde ella realizamos las validaciones y llamados a las operaciones CRUD del sistema. En caso de que se requieran procesos adicionales asociados a la lógica de negocio, aquí será donde se creen los métodos para dichos procesos, por ejemplo el método validarRegistrodetermina si los datos son correctos y permite registrar la persona en el Dao. 1 2 3 4 5 6 7 8 9 10 11 public void validarRegistro(PersonaVo miPersona) { PersonaDao miPersonaDao; /*Valida que solo se ingresen id de 3 digitos*/ if (miPersona.getIdPersona() > 99) { miPersonaDao = new PersonaDao(); miPersonaDao.registrarPersona(miPersona); }else { JOptionPane.showMessageDialog(null,"El documento de la persona debe" + " ser mas de 3 digitos","Advertencia",JOptionPane.WARNING_MESSAGE); } } Clase Conexión. En esta clase tenemos la cadena de conexión con la que trabajará nuestra aplicación, en ella se define la base de datos, el usuario, password y driver de conexión, si por ejemplo en un futuro se nos pide conectarnos a una base de datos diferente o establecer un sistema gestor distinto (pero con la misma estructura de tablas y campos), tan solo modificaremos esta clase y dicho cambio sera transparente para el resto del sistema. (Tener en cuenta que los datos de login y password corresponden a los que yo dejé por defecto al instalar MySql, es decir login root y sin contraseña) 1 2 public Conexion() { 3 try{ 4 //obtenemos el driver de para mysql Class.forName("com.mysql.jdbc.Driver"); 5 //obtenemos la conexión 6 conn = DriverManager.getConnection(url,login,password); 7 8 if (conn!=null){ 9 System.out.println("Conección a base de datos "+bd+" OK"); } 10 } 11 catch(SQLException e){ 12 System.out.println(e); 13 }catch(ClassNotFoundException e){ 14 System.out.println(e); }catch(Exception e){ 15 System.out.println(e); 16 } 17 } 18 19 Clase PersonaVo. idPersona = idPersona. mas no los métodos que la transportan. profesión teléfono entonces nuestra clase Vo tendrá estos mismos atributos y de esta manera podremos transportar un objeto persona con todos estos valores por medio de los métodos set y get de cada atributo. Este patrón nos facilita enormemente el transporte de la información. aplicamos el patrón Value Object o VO (Anteriormente conocidas como DTO Data Transfer Object) en el que representamos las entidades (Tablas) de la base de datos. nombre. la tabla persona tiene los campos id. } Clase PersonaDao. nuestra clase deberá ser modificada así como los métodos que obtienen la información. edad. también en caso de que se modifique la tabla de la BD. 1 2 3 4 5 6 7 8 9 10 11 12 /** * @return the idPersona */ public Integer getIdPersona() { return idPersona. .Al utilizar este tipo de clases. evitando que se envíen gran cantidad de parámetros a un método cuando queremos hacer un registro o actualización. } /** * @param idPersona the idPersona to set */ public void setIdPersona(Integer idPersona) { this. " Se ha Eliminado" + " Correctamente".JOptionPane.desconectar(). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public void eliminarPersona(String codigo) { Conexion conex= new Conexion().close(). } } La Vista.out. estatuto. Con este patrón independizamos la lógica de negocio de la lógica de acceso a datos obteniendo mayor organización y flexibilidad en el sistema. JOptionPane. try { Statement estatuto = conex. Clase VentanaPrincipal. aplicamos el patrón Data Access Object o DAO.println(e. mediante las cuales representamos todo el modelo permitiendo la interacción entre la aplicación y el cliente. estatuto. en la vista estableceremos todas las ventanas o interfaces gráficas de usuario. } catch (SQLException e) { System. .executeUpdate("DELETE FROM persona WHERE id='"+codigo+"'").Cuando utilizamos estas clases.showMessageDialog(null.getConnection(). JOptionPane.createStatement(). "No se Elimino").getMessage()).showMessageDialog(null. básicamente este patrón consiste en centralizar los procesos de acceso a la base de datos evitando inconsistencias y posibles problemáticas cuando esto se realiza a lo largo de la aplicación.INFORMATION_MESSAGE). Aquí se define la parte visual del sistema. conex."Información". . Clase VentanaRegistro. Permite el ingreso de información a la BD. posee un área de texto con una pequeña descripción y 2 botones que darán inicio a los eventos principales del sistema.Esta clase representa la ventana inicial de la aplicación. al ejecutar el evento de registro se establece comunicación entre el coordinador y la clase Lógica donde se encuentran todas las validaciones y casos para el ingreso de información. en ella se evidencian todos los campos de la tabla Persona y presenta un medio gráfico para las clases PersonaVo yPersonaDao. Clase VentanaBuscar. se comunica con el modelo mediante la clase coordinador y desde esta se cargan las otras ventanas de la aplicación. establece la conexión entre la vista y el modelo. . esto por medio de los métodos set y get estableciendo las relaciones necesarias y por ultimo se usa la instancia de la clase VentanaPrincipal para cargarla en pantalla. Actualización y eliminación de la tabla Persona.Esta clase permite realizar las operaciones de Consulta. A cada instancia de las clases se les envía una instancia de la clase Coordinador. la forma de obtener los datos y como se le envían parámetros de consulta a la BD. Esta clase contiene el método main que ejecuta la aplicación. Clase Principal. y a la instancia de Coordinador se le envía cada instancia de las clases. el método hace un llamado al método iniciar el cual crea las instancias de las clases ventanas y la clase Logica estableciendo las relaciones con la clase Coordinador. El Controlador. Esta parte del patrón es la que define la lógica de administración del sistema. igual que la anterior representa la parte visual del modelo y se ejecutan los eventos para la lógica de los procesos anteriores. setCoordinador(miCoordinador). miCoordinador= new Coordinador().1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 private void iniciar() { /**Se instancian las clases*/ miVentanaPrincipal=new VentanaPrincipal(). miVentanaRegistro=new VentanaRegistro(). miVentanaBuscar= new VentanaBuscar().setVisible(true). miVentanaPrincipal.setCoordinador(miCoordinador).setMiVentanaPrincipal(miVentanaPrincipal). miLogica.setCoordinador(miCoordinador). miCoordinador. miVentanaBuscar. miVentanaRegistro. miLogica=new Logica(). /**Se establecen las relaciones entre clases*/ miVentanaPrincipal. Esta clase contiene toda la lógica de relaciones en es el puente entre el modelo y las vistas.setMiVentanaRegistro(miVentanaRegistro). Coordinador. miCoordinador.setMiLogica(miLogica). Puede contener instancias locales tanto de clases de la vista como de clases del modelo.setMiVentanaBuscar(miVentanaBuscar). } Clase el aplicativo. miCoordinador.setCoordinador(miCoordinador). /**Se establecen relaciones con la clase coordinador*/ miCoordinador. estas instancias tienen . } public void setMiLogica(Logica miLogica) { this.validarRegistro(miPersona). } public void mostrarVentanaRegistro() { miVentanaRegistro. } La Aplicación. .setVisible(true). Cuando se desea registrar una persona desde la claseVentanaRegistro se hace un llamado al método registrarPersona() de la clase Coordinador.setVisible(true). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public Logica getMiLogica() { return miLogica. } public void registrarPersona(PersonaVo miPersona) { miLogica.miLogica = miLogica.sus respectivos métodos set y get permitiendo el flujo de llamados del sistema. posteriormente esta clase llama al método ValidarRegistro() de la clase Logica y esta a su vez realiza las validaciones correspondientes para determinar si se llama o no al método RegistrarPersona() de la clase PersonaDao. } public void mostrarVentanaConsulta() { miVentanaBuscar. . El proyecto tiene los directorios db y conector. en si se desarrolló como ejemplo practico.. tan solo deben representar las tablas de la BD. entonces en el paquete vo se agruparán todas las clases equivalente a entidades.. también se utilizan algunos conceptos vistos ... ).. separando la parte visual de la lógica de negocio y estableciendo relaciones entre ellas. y donde todas sus partes se encuentran separadas por funcionalidades. existen validaciones muy básicas y procesos simples pero pensado en modo de ejemplo sin mayor complejidad.... este ultimo debe ser agregado al build path para que el sistema pueda funcionar (sobre el proyecto. En la siguiente imagen vemos que se crearon tres paquetes principales y de esta forma se tiene independiente la parte de la vista... estos directorios se crearon solamente para agregar el script de creación de la BD y el mysql connector. es decir. clic derecho/configure Build path. Conclusiones.. el paquete modelo posee los paquetes conexión dao y vo ya que aunque pertenecen al modelo y la lógica de negocio debe establecerse también su independencia con respecto a las operaciones. el modelo y el controlador.El Sistema esta desarrollado como un proyecto Eclipse. Como vimos tenemos un proyecto funcional que realiza las operaciones básicas del CRUD. las clases Vo por ejemplo no poseen métodos de operaciones asociadas a la lógica de negocio.. .. . espero que este ejemplo sea de utilidad... ya que en esta aplicaremos los Patrones VO (Value Object) y DAO (Data Access Objetc).. como se mencionó es un ejemplo simple. Descarga. solamente muestro una pequeña aplicación (muy básica) donde veremos de forma fácil como conectarnos a una BD para consultar y registrar información .... compartir o agradecer :)) Y Listo.. Requisitos. En el link de descarga se encuentra el archivo ...en entradas anteriores como es el caso del manejo de excepciones. . no vamos a entrar en detalles de que es una BD.además daremos paso a futuras entradas sobre los Patrones de Diseño... patrones entre otros. sin mucha lógica para aplicar.rar con la aplicación... solo es cuestión de descomprimir y abrir con Eclipse pero si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el.... pero la intención es dar a conocer un poquito mas claro como se puede aplicar elMVC.nada cuesta opinar. ni los tipos existentes ni como crearlas entre muchos otros temas en torno a esto.) Ejemplo Conectando Java con MySql En esta entrada vamos a tocar uno de los puntos fundamentales en el desarrollo de software... (recuerden que es gratis....  Ambiente de desarrollo (En este caso Eclipse)  JDK instalado.. por eso no nos preocuparemos tanto en como se presentaran nuestra información. la idea de este tutorial es ver como conectarnos a MySql desde Java. En Marcha.8-bin (lo pueden bajar desde aquí)  Conocimientos Basicos de Programación. tipos de datos o etc) . ni que tan óptimo sea nuestro código. es mas usado para dar claridad al sistema. vamos a hacer una aplicación simple. El siguiente diagrama muestra la estructura de nuestra aplicación (Ojo no es un diagrama de clases completo. La Aplicación. MySql Instalado  mysql-connector-java-5.0.  Ganas de Continuar. ni los tipos de datos. por eso no nos enfocaremos en asociaciones. simplemente vamos a crear una base desde donde podamos trabajar. Bueno. . La Base de Datos. 11 `nombre` varchar(30) default NULL. el Script para la creación es el siguiente: 1 CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET lat 2 3 USE `codejavu`. 15 PRIMARY KEY (`id`) 16 ) ENGINE=InnoDB DEFAULT CHARSET=latin1..Como vemos la aplicación es básica.. 4 5 /*Table structure for table `persona` */ 6 7 DROP TABLE IF EXISTS `persona`. 17 18 /*Data for the table `persona` */ .0) default NULL. 13 `profesion` varchar(30) default NULL. 12 `edad` int(3) default NULL. 14 `telefono` decimal(10. nos conectaremos a una BD donde tenemos una única tabla y mediante Java vamos a acceder a dicha BD para poder registrar y consultar información. en la aplicación tendremos un Menú principal con estas opciones. Nuestra base de datos solo tendrá la tabla persona con los datos básicos de registro (si se desea se puede dar otro enfoque a la tabla o trabajar con muchas mas). 8 9 CREATE TABLE `persona` ( 10 `id` int(10) NOT NULL. la idea es poder registrar y consultar personas.. Esta clase será nuestra cadena de conexion. 3 4 5 6 /** * Clase que permite conectar con la base de datos * @author chenao * . en estos momentos la aplicación es pequeña por lo tanto no nos da problemas de organización. sin embargo a medida que vaya creciendo se hace importante tener nuestras clases agrupadas facilitando así el trabajo futuro y la mantenibilidad de nuestro sistema.sql. aquí definiremos los parámetros requeridos para conectarnos a la BD creada anteriormente.*. así. Como vemos tenemos un paquete por cada clase. esto con el fin de tener nuestro proyecto mas estructurado y fácil de entender.Empecemos!!! Para iniciar vamos a crear un proyecto java en Eclipse.connection. 2 import java. 1 package prueba. Clase DbConnection. por cuestiones de organización crearemos las clases de nuestro diagrama separándolas por paquetes. 31 }catch(Exception e){ 32 System.println(e). 25 } 26 } 27 catch(SQLException e){ 28 System.forName("com.jdbc. 23 if (connection!=null){ 24 System.login.Driver"). 29 }catch(ClassNotFoundException e){ 30 System.getConnection(url.password).out. static String password = "".out. /** Constructor de DbConnection */ public DbConnection() { 18 try{ 19 //obtenemos el driver de para mysql 20 Class.out. 21 //obtenemos la conexión 22 connection = DriverManager.println("Conexión a base de datos "+bd+" OK\n"). static String url = "jdbc:mysql://localhost/"+bd.mysql. 33 } 34 } 35 /**Permite retornar la conexión*/ 36 public Connection getConnection(){ . Connection connection = null.println(e).7 8 */ public class DbConnection { 9 /**Parametros de conexion*/ 10 static String bd = "codejavu".out.println(e). 11 12 13 14 15 16 17 static String login = "root". evitando no solo el envió de gran cantidad de parámetros sino también un mayor control..vo. 43 44 } } 45 46 En la clase estamos aplicando el manejo de excepciones.Debemos saber que por cada tabla de nuestra BD se tiene que construir su equivalente clase VO. en ella estamos aplicando el patrón VO (Value Object) con el cual nos aseguramos que los datos viajen en un solo objeto.... 1 package prueba. vemos como se tiene contemplada la jerarquía de excepciones pertinente. 2 3 4 /** 5 * CLase VO con los atributos del campo empleado 6 * @author chenao 7 * */ .. Clase PersonaVO... 39 } 40 41 public void desconectar(){ 42 connection = null.. Esta clase nos permite dar un manejo mucho mas organizado y seguro a nuestra información.37 38 return connection.. tema tratado en el articulo anterior... } /** 33 * @param nombrePersona the nombrePersona to set 34 35 */ public void setNombrePersona(String nombrePersona) { 36 37 this. private Integer telefonoPersona.8 public class PersonaVO{ 9 10 private Integer idPersona. 11 private String nombrePersona. 15 16 /** * @return the idPersona 17 18 */ public Integer getIdPersona() { 19 20 21 return idPersona. } /** 22 * @param idPersona the idPersona to set 23 */ 24 public void setIdPersona(Integer idPersona) { this. } .nombrePersona = nombrePersona. 12 private Integer edadPersona. 25 26 } 27 /** * @return the nombrePersona 28 */ 29 30 31 32 public String getNombrePersona() { return nombrePersona.idPersona = idPersona. 13 14 private String profesionPersona. edadPersona = edadPersona. 53 54 55 } /** * @param profesionPersona the profesionPersona to set 56 57 58 59 60 */ public void setProfesionPersona(String profesionPersona) { this. } /** 61 * @return the telefonoPersona 62 */ 63 public Integer getTelefonoPersona() { 64 return telefonoPersona. 65 } 66 /** 67 * @param telefonoPersona the telefonoPersona to set . 42 43 44 } /** * @param edadPersona the edadPersona to set 45 46 */ public void setEdadPersona(Integer edadPersona) { 47 this.38 /** 39 * @return the edadPersona 40 */ 41 public Integer getEdadPersona() { return edadPersona.profesionPersona = profesionPersona. 48 } 49 /** 50 * @return the profesionPersona 51 */ 52 public String getProfesionPersona() { return profesionPersona. PreparedStatement.SQLException. 73 74 } } 75 76 77 Como vemos cada campo de la tabla persona es reflejado en la Clase PersonaVO. 4 import java.util. . Read.ResultSet. con ella aplicamos un patrón DAO (Data Access Objetc) no entraremos en detalle (mas adelante se presentara una entrada sobre este Patrón) ya que básicamente necesitamos saber que este patrón nos enseña la forma de obtener información de la BD mediantemétodos CRUD (Create. Update y Delete).ArrayList.Statement.sql. 2 3 import java. tambien aplicamos un poco el concepto de Encapsulación tratado en un articuloanterior mediante la creación de metodos setter y getter por cada dato privado.JOptionPane.telefonoPersona = telefonoPersona.swing. 6 7 import java.68 69 70 */ 71 public void setTelefonoPersona(Integer telefonoPersona) { 72 this.sql. import javax. Esta clase sera la encargada de gestionar el acceso a los datos.dao. import java.sql. así que por cada tabla de nuestra BD debemos tener una clase DAO que la represente!!! 1 package prueba. Clase PersonaDAO. 5 import java.sql. 27 estatuto.getEdadPersona()+"'. 9 import prueba.getTelefonoPersona()+"')")."Informaci 31 estatuto.executeUpdate("INSERT INTO persona VALUES ('"+persona. 30 JOptionPane. 26 try { Statement estatuto = conex. 32 conex. "Se ha registrado Exitosamente". '"+persona.connection.showMessageDialog(null.getNombrePersona()+"'. } .getConnection(). 10 11 12 /** * Clase que permite el acceso a la base de datos 13 * @author chenao 14 * 15 16 17 */ public class PersonaDAO { 18 19 /** 20 * Permite registrar un empleado 21 * @param persona 22 */ 23 public void registrarPersona(PersonaVO persona) 24 { 25 DbConnection conex= new DbConnection(). "No se Registro la persona"). '"+persona.desconectar(). 36 37 JOptionPane. '" 29 +persona.showMessageDialog(null.getIdPersona()+ 28 +persona.close().8 import prueba.PersonaVO. 33 34 } catch (SQLException e) { 35 System.out.getMessage()).println(e.DbConnection.vo.getProfesionPersona()+"'.createStatement(). parseInt(res.getString("nombre")).close().add(persona).parseInt(res.setEdadPersona(Integer. 53 54 if(res. 59 60 61 62 63 64 persona.setNombrePersona(res.getString("id"))). 58 persona.getConnection(). documento).prepareStatement("SELECT * 51 consulta.setProfesionPersona(res. 56 persona.38 } 39 40 /** 41 * permite consultar el empleado asociado al documento enviado 42 * como parametro 43 44 45 46 47 * @param documento * @return */ public ArrayList< personavo> consultarPersona(int documento) { ArrayList< personavo> miEmpleado = new ArrayList< personavo>(). 65 66 67 } catch (Exception e) { . 48 49 try { 50 PreparedStatement consulta = conex.desconectar().getString("telefono"))). miEmpleado. consulta. DbConnection conex= new DbConnection().getString("profesion")). 57 persona.parseInt(res.setInt(1.next()){ 55 PersonaVO persona= new PersonaVO().getString("edad"))). } res. 52 ResultSet res = consulta.setTelefonoPersona(Integer.close().executeQuery(). conex.setIdPersona(Integer. persona. 88 persona.executeQuery().getString("profesion")).close(). } .parseInt(res.getString("id"))). persona.setIdPersona(Integer. 68 69 } 70 return miEmpleado. DbConnection conex= new DbConnection().desconectar().close(). "no se pudo consultar la Persona\n"+e). 86 persona.showMessageDialog(null.showMessageDialog(null.getString("nombre")).parseInt(res. 90 } 91 res.setEdadPersona(Integer.setProfesionPersona(res. 85 persona. 71 } 72 73 74 75 76 77 78 /** * permite consultar la lista de empleados * @return */ public ArrayList< personavo> listaDePersonas() { ArrayList< personavo> miEmpleado = new ArrayList< personavo>(). 87 persona.parseInt(res. 92 consulta.next()){ 84 PersonaVO persona= new PersonaVO().getString("edad"))).getString("telefono"))).setTelefonoPersona(Integer. 93 conex. "no se pudo consultar la Persona\n"+e).getConnection().setNombrePersona(res. 83 while(res.prepareStatement("SELECT * 82 ResultSet res = consulta.add(persona). 79 80 try { 81 PreparedStatement consulta = conex. 94 95 } catch (Exception e) { 96 97 JOptionPane. 89 miEmpleado.JOptionPane. así mismo se validaran las entradas del usuario para evitar posibles inconsistencias y posteriormente se hace el llamado a la clase DAO que permite ejecutar los procesos de conexión con la BD.JOptionPane. En esta clase vamos a hacer el llamado a todos los procesos de nuestra aplicación.98 99 100 101 return miEmpleado.PersonaDAO. . mediante el cual asignamos la información de nuestra tablapersona.principal. 4 import javax. tan solo vamos a trabajar con los métodos de registro y consulta (Los métodos de actualización y eliminación serán una buena tarea en casa . 2 3 import java. tendremos un menú en el cual presentamos todas las opciones del sistema.ArrayList.util. 102 } 103 104 } 105 106 107 Por cuestiones de tiempo no realizaremos todo el CRUD. 1 package prueba.) ) Cada método usa la cadena de conexión creada anteriormente y se enfoca en una tarea en especifico. tanto para el registro como para la consulta de información. 5 import prueba.dao.swing. además en cada uno hacemos uso de un objeto de tipoPersonaVO. Clase Principal. textoMenu+="3.\n\n". hace el llamado al menú donde se 14 * presentan todas las opciones del sistema 15 * @param args 16 17 */ public static void main(String[] args) { 18 19 Principal miPrincipal = new Principal(). Salir. Registrar Persona\n".6 import prueba.vo. textoMenu+="4. 20 21 miPrincipal. textoMenu+="2. Ver Lista Personas\n".verMenu().PersonaVO. textoMenu+="Ingrese alguna de las opciones del Menú textoMenu+="1. \n". 12 13 /** * Método principal. 7 8 9 public class Principal { 10 11 PersonaDAO miPersonaDAO. } 22 23 /** 24 * Método que permite presentar las opciones del sistema. . 25 * solicita el ingreso de un numero y se envia a su 26 * correspondiente proceso 27 */ 28 private void verMenu() { 29 30 31 32 33 34 35 String textoMenu="Menú Principal\n\n". Consultar Persona\n". "Error en el ingreso de Datos. 47 48 } } 49 50 /** 51 * Permite determinar que accion ejecutar dependiendo del parametro de 52 * ingreso correspondiente a las opciones del sistema 53 * @param seleccion 54 */ 55 private void defineSeleccion(int seleccion) { 56 57 System.ERROR_MESSAGE). 43 } catch (Exception e) { 44 JOptionPane. case 2: int doc=Integer.showMessageDialog(null. break. 42 verMenu()."Error en el ingreso de Datos.out. 40 } catch (NumberFormatException e) { JOptionPane.ERROR_MESSAGE). 39 defineSeleccion(seleccion)."ERROR".showMessageDialog(null. 46 verMenu(). " + 41 "solo se permiten valores númericos".36 37 try { 38 int seleccion= Integer."ERROR". 58 59 60 61 62 63 64 65 switch (seleccion) { case 1: registrarPersona().showInputDialog("Ingrese el numero" + .JOptionPane.println("Selecciona "+seleccion).parseInt(JOptionPane.JOptionPane. verMenu(). " + 45 "solo se permiten valores númericos".showInputDialog(textoMenu)).parseInt(JOptionPane. 80 break. se solicitan mediante * una ventana de ingreso y se almacenan en un arreglo con toda la informacion u * para esto un ciclo for. 66 67 buscarPersona(doc). 71 verMenu(). 68 verMenu()." de documento de la persona")).WARNING_MESSAGE).JOptionPane. 92 PersonaVO miPersona=new PersonaVO(). case 3: 70 obtenerRegistros(). 76 default: 77 JOptionPane. } 81 82 } 83 84 85 86 87 88 89 /** * Permite solicitar los datos de la persona a registrar. 93 94 95 String mensajeIngreso="Ingrese\n\n". . 72 break.exit(0). 73 case 4: 74 System. 75 break. posteriormente estos datos son almacenados en el * atributo correspondiente del objeto persona para ser enviado al metodo de reg * en la clase DAO */ 90 private void registrarPersona() { 91 miPersonaDAO = new PersonaDAO().showMessageDialog(null."ADVERTENCIA". 79 verMenu(). "Ingrese un " + 78 "numero valido". 69 break. mensajeIngreso+ 101 datosSolicitados[i]. 96 "Edad: "."Nombre : "."Datos Persona". 109 miPersona.registrarPersona(miPersona). 104 } 105 106 miPersona.setTelefonoPersona(Integer.println(datosSolicitados[i]+datosPersona[i]).parseInt(datosPersona[4])).out.setProfesionPersona(datosPersona[3]). . 99 for (int i = 0.setIdPersona(Integer. 102 103 System.setNombrePersona(datosPersona[1]).length.parseInt(datosPersona[2])).showInputDialog(null. i++) { //solicita el ingreso del dato y se almacena en el arreglo de datosPersona 100 datosPersona[i]=JOptionPane. 110 miPersona.parseInt(datosPersona[0])). PersonaVO miPersona. i < datosSolicitados. 108 miPersona."Telefono: "}. sino se imprime la lista de * todas las personas registradas en la BD */ private void obtenerRegistros() { miPersonaDAO = new PersonaDAO().INFORMATION_MESSAGE).setEdadPersona(Integer. 113 114 } 115 116 /** 117 * Permite obtener la lista de personas almacenada en la tabla persona 118 * si la lista se encuentra vacia quiere decir que no hay personas registradas 119 120 121 122 123 124 125 * acto seguido se presenta un mensaje en pantalla."Profesión: ".JOptionPane. 97 98 String datosPersona[] = new String[5]. 107 miPersona. 111 112 miPersonaDAO.String datosSolicitados[] = {"Documento : ". "Actualmente no " + 143 "existen registros de personas".INFORMATION_MESSAG 144 } 145 146 147 148 149 150 } /** * Permite la consulta de una persona en especifico mediante el envio de * su documento de identidad como parametro.println("Nombre Persona: "+miPersona.println("Edad Persona: "+miPersona. 138 System.JOptionPane.out.out.showMessageDialog(null. 140 System.println("****************Persona "+numeroPersona+"**************** 135 System.out. 134 System.listaDePersonas().out.println("Profesión Persona: "+miPersona. 128 //se valida si se obtubo o no informacion 129 if (listaPersonas.getIdPersona()).126 //Se obtiene la lista de personas 127 ArrayList< personavo> listaPersonas = miPersonaDAO.getEdadPersona()).size().out.getProfesionPersona()).println("*************************************************\n"). i < listaPersonas.size()>0) { int numeroPersona=0.out. sino entonces se imprimen los 152 * datos de la persona encontrada 153 * @param documento 154 */ 155 private void buscarPersona(int documento) { . 139 System. 133 miPersona=listaPersonas.out. i++) { 132 numeroPersona++.get(i). } 141 }else{ 142 JOptionPane.println("Id Persona: "+miPersona.getTelefonoPersona()). 130 //se recorre la lista de personas asignandose cada posicion en un objeto perso 131 for (int i = 0.println("Telefono Persona: "+miPersona."INFORMACIÓN".getNombrePersona()). 137 System. 136 System. en caso de que no se retorne 151 * informacion se presenta un mensaje en pantalla. out.println("Nombre Persona: "+miPersona.getIdPersona()).out.println("****************Persona*************************"). 170 System.println("Id Persona: "+miPersona. 167 System.out.size()>0) { 165 //se recorre la lista y se asignan los datos al objeto para imprimir los valor 166 for (int i = 0. 161 PersonaVO miPersona.showMessageDialog(null.getEdadPersona()). 171 System.getProfesionPersona()). i++) { miPersona=personasEncontrada.consultarPersona(docume 163 //se valida que se encuentre la persona 164 if (personasEncontrada. 168 System. 174 } 175 }else{ 176 JOptionPane.getTelefonoPersona())."El documento ingresado " + 177 "no corresponde a ninguna persona". i < personasEncontrada. 172 System.out.println("Profesión Persona: "+miPersona. 162 ArrayList< personavo> personasEncontrada = miPersonaDAO.156 157 158 159 160 miPersonaDAO = new PersonaDAO(). 173 System.INFORMATION_MES } 178 } 179 180 181 182 183 184 } .size().out.get(i).getNombrePersona()).out."INFORMACIÓN".println("Telefono Persona: "+miPersona.println("Edad Persona: "+miPersona. 169 System.out.JOptionPane.println("*************************************************\n"). ... eso hace que podamos darle un tratamiento individual a cada uno. buscamos al jar desde la ruta donde lo descargamos y damos ok .Como se ve. tambien vemos que en el método verMenu() validamos por medio de bloques try ... pero hay que tener presente que previamente debimos haber agregado el mysqlconnector al build path del proyecto. sino nos aparecera algo como esto : Para solucionarlo sobre el proyecto damos clic derecho/configure Build path. Al ejecutar la aplicación se presenta el menú principal donde ingresamos las opciones correspondientes....catchlos posibles errores en el ingreso de datos por parte del usuario. tenemos la clase principal dividida en metodos para cada proceso. asi en caso de algun error facilmente podremos identificar en que metodo sucedio.. Ejecutando la Aplicación. .. es una aplicación básica y no nos enfocamos en muchos detalles. Mas adelante continuaremos con otros temas de interes donde aplicaremos los conceptos vistos en esta entrada!!! ...tan solo en la logica de conexión que nos servira como base para futuros desarrollos...después de esto ya tendremos nuestra aplicación en funcionamiento Como se mencionó al principio...... Primeros Pasos Con Jenkins  Leer Archivo Properties en Java  Tutorial Proyecto Web Con Eclipse  Instalación del servidor de aplicaciones JBoss  Instalación Apache ANT ¿Hay algo que quieras anexar o comentar sobre esta entrada? no dudes en hacerlo... te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ...También te podría Interesar.) Manejo de Excepciones en Java Vamos a hablar un poco sobre las Excepciones en Java... podemos pensar en ellas como una condición excepcional en nuestro sistema el cual altera la correcta ejecución del mismo.Object. por eso de la importancia de conocerlas y saber como tratarlas.. Básicamente una excepcion es un Objeto descendiente de la clasejava. lo cual impide que el sistema .y si te gustó... las excepciones nos indican que hay algo anómalo.. inconsistente o simplemente un Error... de donde vienen? y como evitarlas entre. otras.lang.  Manejo de Excepciones en Java  ¿ String Vrs StringBuffer Vrs StringBuilder ?  Comparando Fechas En Java  Integración Continua. que son?.. debemos tener presente que siempre estamos propensos a encontrarnos con errores o Excepciones cuando estamos desarrollando. . pero esto no es un error ya que nosotros podemos trabajar con objetos null. entonces veamoslo como si la excepcion nos dijera "Es un objeto nulo y no se puede efectuar el proceso". ya que en java una Exception es muy diferente a unError)... ya que lo que vamos a conocer como una excepcion no siempre es un error (hablando como excepcion en general.. podemos encontrarnos con el famoso NullPointerExceptionel cual nos indica que un objeto se encuentra vació. podría ser.... inconsistente o Error no es básicamente lo mismo?..se ejecute como debería de ser. debido a por ejemplo que no encuentra un . pero en este enfoque no necesariamene lo es. A modo de ejemplo. Tal vez se preguntaran si ¿pero Anómalo. pero se contemplan las mas comunes) Jerarquía de excepciones ... mientras que hay errores como NoClassDefFoundError el cual nos indica que la maquina virtual de Java (JVM) no puede encontrar una clase que necesita.class... muchas veces necesitaremos trabajar con excepciones controladas para indicar alguna inconsistencia en nuestro sistema que podría provocar errores. esto si se maneja como un error en java Para hacer mas claridad sobre el tema veamos la Jerarquía de Excepciones de Java (puede que no se encuentren algunas excepciones.. La importancia de Prever!!! Cuando se esta programando debemos tener claro que nuestro código no es perfecto. posibles fallos o lo que pueda afectar el sistema. Veamos un ejemplo Simple: .Vemos que se tiene un claro árbol de herencia mediante el cual se pueden definir las categorías de Excepciones o de Error que se puede dar en el sistema. sea por nuestro código o por otros factores. así tengamos mucha experiencia en desarrollo siempre esta la posibilidad de que algo falle. por eso de la importancia de contemplar todo desde antes. ....finally .. además se muestra cual fue la traza del error pasando por el método main hasta el metodoDividir().catch .. es obvio.out... claro..pues no. Trabajando con try ..println(resultado).1 private void metodoDividir(int dividendo.... pero y si el divisor es 0? pues con ese caso puntual el resultado seria el siguiente.básico.. 4 System.. Vemos que nos indican que se produjo una ArithmeticException debido a una división por cero. La anterior es una Excepcion simple. a simple vista si tenemos : dividendo = 4 y divisor = 2 pues el resultado es 2 . 5 6 } el metodoDividir(int.. int) teóricamente esta bien. en programación no podemos asumir ni pensar así.. el problema es que eso tan obvio puede detener toda la ejecución del programa. no se puede dividir por cero.. o ¿no?. algo que se supone no debería pasar.. int divisor){ 2 3 String resultado+=dividendo/divisor. ya que muchas veces nos olvidamos de las cosas obvias y las pasamos por alto. . evitando que el sistema se detenga sin necesidad cuando el motivo de esto puede ser corregido facilmente. 3 try { 4 resultado+=dividendo/divisor. 11 } 12 13 } Como vimos aplicamos la estructura de los bloques y de esta manera nos aseguramos que la excepción anterior fue controlada evitando que el sistema se detenga. en el catch podemos hacer el proceso que consideremos conveniente. 8 } 9 finally{ 10 System..WARNING_MESSAGE).println("Termino el proceso : el resultado es = "+resultado). ya sea solo informar del error o . 1 try { 2 3 //Bloque de código que vamos a procesar } catch(excepcion) { 4 5 //Tratamiento que se le da a la posible excepción } finally { //Bloque de código que se ejecutará despues del try o del catch 6 7 } Apliquemos esto a nuestro ejemplo anterior. "Advertencia".con los bloques Try . la estructura básica es la siguiente. 7 JOptionPane. 5 }catch (Exception e) { 6 resultado="Se intentó dividir por cero". 1 2 private void metodoDividir(int dividendo."Error: No se puede dividir por cero ".showMessageDialog(null.out. int divisor){ String resultado="".Catch podemos capturar y procesar una posible excepcion.JOptionPane. por ejemplo. En este bloque solo se detectara la primera excepcion lanzada. catch : en caso de que en el try se encuentre alguna excepción. estos deben ser ubicados después del try y antes del finally (en caso de que este ultimo se especifique). aquí va tanto el código como llamados a métodos que puedan arrojar la excepción. } catch(InterruptedException e){ . hay que tener en cuenta que por cada try se debe especificar un catch y/o un finally. se ingresara automaticamente al bloque catch donde se encontrara el código o proceso que queremos realizar para controlar la excepción. Veamos un poco mas lo que debemos tener en cuenta cuando usamos estos bloques: try : Aquí vamos a escribir todo el bloque de código que posiblemente llegue a lanzar unas excepción la cual queremos manejar. 1 2 3 try { //Sentencias con posibles errores. Se pueden especificar cualquier cantidad de catch de ser necesario. cada catch que se ponga debe manejar una excepcion diferente (no se puede repetir) y el orden de estos depende de la jerarquía de herencia que se tenga. ingresando al primer catch que pueda suplir la necesidad a corregir. la salida es la siguiente: Algunas Consideraciones.solicitar nuevos parámetros de entrada. de esta forma nos aseguramos que capture cualquier excepción.. Conclusiones... En general vimos la importancia de controlar excepciones ya que eso hace parte de la seguridad y calidad de nuestros desarrollos. dependiendo si InterruptedException puede controlarlo se ingresa a esa. En el ejemplo que del metodoDividir() trabajamos directamente con Exception e..4 5 //manejo de la exepcion } catch(IOException e){ 6 //manejo de la exepcion 7 } catch(Exception e){ 8 //manejo de la exepcion 9 } Si se genera una excepción en el try. propagación. es decir. quedan pendiente definir aspectos como checked y unchecked (ya que aquí esto se trabajo de forma muy general) o la forma de crear nuestras propias excepciones. clausulas throws entre otras. finally : Este bloque es opcional. siempre se ejecutara sin importar que se encuentre o no una excepción. se valida a cual de los 3 catch se ingresa... ya que un solo post no es suficiente para todo lo que tiene que ver con ellas. mas adelante se irán vinculando en otros post el uso de las mismas. lo podremos si queremos ejecutar otro proceso después del try o el catch. Esta entrada es un abrebocas de lo que son el manejo de excepciones. .. sin embargo se recomienda usar la jerarquía en los catch para poderle dar un mejor manejo.. sino entonces a IOException o si no a la superClase que seria Exception (ver la jerarquía de herencia anterior). ..... herencia....... estados...... encapsulación entre otros.. Vamos a ver algunos conceptos de POO de forma general........ a diferencia de otras formas de programación como por ejemplo la estructurada.. ... objetos.. generando cada vez interrelaciones en nuestro desarrollo en pro del funcionamiento del sistema principal....... definiendo el programa como un conjunto de estos objetos relacionados entre si.......... propiedades. Empecemos!!! Programación OO.Conceptos Básicos de Programación Orientada a Objetos En esta entrada veremos algunos conceptos de la programación orientada a Objetos (POO). Muchas veces cuando empezamos a trabajar con lenguajes de programación nos dicen que son orientados a Objetos y nos dan la teoría del"porqué" pero puede que al trabajar con ellos en la practica no sepamos interpretarlo desconociendo el "como".... mas adelante trabajaremos estos conceptos en casos prácticos para ver su aplicación.. con la POO trabajamos de manera distinta vinculando diferentes conceptos tales como clases.... métodos.... La programación orientada a Objetos básicamente define una serie de conceptos y técnicas de programación para representar acciones o cosas de la vida real basada en objetos. y entonces seguimos desarrollando por simple inercia porque así fue que aprendimos pero tal vez no de la forma mas óptima.. Veamos algunos de los conceptos principales.. . Las clases son uno de los principales componentes de un lenguaje de programación. en si podemos definirlas como estructuras que representan objetos del mundo real. 5 6 7 /**Esto es un método. la forma como interactúa la clase con su entorno. Métodos : Representan el comportamiento u operaciones..Clases. pues en ellas ocurren todos los procesos lógicos requeridos para un sistema. lugares o cosas. Atributos : Representan las propiedades que caracterizan la clase. en general las clases poseen propiedades. (Ver Ejemplo. En java se representa así : 1 /**Principal define el nombre de la Clase*/ 2 public class Principal { 3 4 public String atributo="Esto es un atributo". tomando como objetos a personas. comportamientos y relaciones con otras clases del sistema. donde se definen las operaciones*/ public void metodo(){ /**aqui van las sentencias que definen 8 9 10 * el comportamiento del método*/ } .) una clase se compone por tres partes fundamentales: Nombre : Contiene el Nombre de la Clase. 11 } Objeto. En java se representa creando una instancia de la clase por medio de la palabra new al hacer eso creamos el objeto de la clase y podemos hacer uso de los métodos o atributos de esta (dependiendo de la visibilidad de los mismos ) por medio de un punto (..... en la imagen. Herencia. Los objetos representan una entidad concreta o abstracta del mundo real. en programación básicamente se le conoce como la instancia de una clase en si es lo que da el sentido a estas. los moldes representan las clases. tamaño etc. Comportamiento : Se define por los métodos u operaciones que se pueden realizar con el. mientras que las galletas obtenidas de estos moldes representan los objetos instancias de estas clases. 3 miObjeto. color.atributo="Este es el nuevo valor del atributo para el objeto".. Al igual que las clases se componen de tres partes fundamentales: Estado: Representa los atributos o características con valores concretos del objeto.metodo(). 4 miObjeto.) así: 1 2 /**Creamos el objeto como instancia de la clase Principal*/ Principal miObjeto= new Principal(). . por ejemplo atributos del objeto galleta podría ser sabor. Identidad : Es la propiedad única que representa al objeto y lo diferencia del resto. básicamente mediante esta obtenemos las características o rasgos comunes de nuestros padres o abuelos.. 2 3 public void comer(){ 4 /**Comportamiento. con las cuales podemos obtener las características de las clases padres. En Java solo se puede heredar de una sola clase padre y se representa mediante la palabra extends (Ver Ejemplo.*/ 5 } 6 7 } 8 class Perro extends Animal{ 9 10 public int dientes. métodos o funcionalidades..*/ 14 15 16 } } ..... heredando campos.. 11 12 public void correr(){ 13 /**Comportamiento.. atributos. en java es el mismo enfoque permitiendo la creación de nuevas clases basadas en clases ya existentes...La herencia en java representa lo que conocemos de herencia en el mundo real.) 1 public class Animal{ public String tamaño. Este concepto es uno de los mas importantes en términos de seguridad dentro de nuestra aplicación. Protegido: Se puede acceder a los atributos o métodos solo en la misma jerarquía de herencia.. Privado: Solo se puede acceder a los atributos o métodos de la clase en la que se encuentran...17 class Paloma extends Animal{ 18 19 public int plumas. ya que podemos evitar que por ejemplo se hagan modificaciones al estado o comportamiento de un objeto desde una clase externa. 20 21 public void volar(){ 22 /**Comportamiento..*/ 23 24 } } 25 Encapsulamiento. una buena practica es trabajar con métodos setter y getter que permiten manipular nuestros datos de forma segura. estableciendo básicamente los permisos o niveles de visibilidad o acceso de nuestros datos Se representa por 3 niveles : Público: Se puede acceder a todos los atributos o métodos de la clase. con la Encapsulación mantenemos nuestros datos seguros. la encapsulación es la forma de proteger nuestros datos dentro del sistema. . 4 private String atributo2.en Java lo representamos así: 1 2 public class Principal{ 3 public String atributo1. o la . 11 } 12 13 public void setAtributo2(String atributo2) { this. La abstracción permite resaltar la parte mas representativa de algo. ignorando detalles para centrarse en lo principal. 14 } 15 16 17 } Clases Abstractas. 6 7 /**Métodos Set y Get para trabajar con las variables*/ 8 9 public String getAtributo2() { 10 return atributo2. 5 protected String atributo3. con base a ella podemos crear una clase persona.atributo2 = atributo2. La imagen es muy fácil de identificar. ... la palabra así: . ni dedos. (Ver Ejemplo. pero obviamente vemos que la imagen no tiene elementos como ojos. brazos y pies. nariz.. ya que una clase abstracta posee al menos un método abstracto el cual no tiene implementación... tronco. las clases abstractas no se pueden instanciar). boca.....) En Java representamos reservada abstract...clase hombre... con esto es suficiente para saber que es una persona sin fijarnos en los detalles mencionados anteriormente. rostro en general.mediante el uso de la herencia y componentes abstractos hacemos mas óptima y organizada nuestra aplicación.. 1 2 3 4 5 la abstracción mediante public abstract class Principal{ /**Método Abstracto sin implementación*/ public abstract void metodoAbstracto().. pies. manos o cuello.. La Abstracción en java solo tiene lógica mediante la Herencia....Precisamente aquí estamos aplicando el concepto de abstracción...... en este caso vemos que se tiene una cabeza. (hay que tener en cuenta que a diferencia de las clases concretas.. Las clases abstractas permiten crear métodos generales con un comportamiento común para otras clases concretas sin importar sus características ni el comportamiento que usen para dichos métodos... el comportamiento de estos métodos lo definen las clases concretas que lo hereden. pero entonces porque decimos que es una persona?. ya que nos fijamos en lo mas representativo de algo. Podemos usarlos cuando existan varias clases con características o acciones comunes pero con diferentes comportamientos.. humano entre otras. al igual que las clases abstractas la implementación de los métodos depende de las clases concretas que . así cada clase concreta que implemente una interfaz esta obligada a implementar todos los métodos que la compongan. como mencionamos en Java solo se puede extender de una sola clase. mediante el uso de interfaces esto se puede simular ya que el lenguaje permite implementar el numero de interfaces que necesitemos.6 } 7 8 class subClase extends Principal{ 9 10 @Override 11 public void metodoAbstracto() { /**Implementación definida por la clase concreta*/ 12 } 13 14 15 } Interfaces. es común relacionarlas con un contrato en el que se define que se debe hacer. las interfaces definen lo que la clase que la implemente deberá hacer. básicamente son clases completamente abstractas. Las interfaces son el mecanismo que utiliza Java para simular la herencia múltiple. no requieren el uso de la palabra reservada abstract. ya que al ser completamente abstracta todo dentro de ella lo es. mas no la forma como lo hará. al decir que las interfaces son clases completamente abstractas significa que todos sus métodos lo son y por ende no poseen implementación. 4 5 public String otroMetodoAbstracto().. además tampoco se puede instanciar una interfaz. 6 7 } 8 9 public class Principal implements InterfacePrincipal{ 10 11 public void metodoAbstracto() { 12 /**Implementación definida por la clase concreta*/ 13 } 14 15 public String otroMetodoAbstracto() { 16 /**Implementación definida por la clase concreta*/ 17 return "retorno". ..las usen... (Ver Ejemplo. } 18 19 } Polimorfismo.) En java se representan con la palabra interface y se usan con la palabraimplements así: 1 2 interface InterfacePrincipal { 3 public void metodoAbstracto()... Se debe tener en cuenta que toda variable definida en una interfaz automáticamente se convierte en una constante. .. ... se usa cuando se trabajen con la herencia y objetos de características comunes los cuales comparten la misma superClase y árbol jerárquico... un triángulo.. básicamente podemos definirlo como la capacidad que tienen los objetos de comportarse de múltiples formas sin olvidar que para esto se requiere de la herencia. un cuadrado o cualquier figura que en términos generales sea geométrica.. en otras palabras una figura geométrica puede ser un cuadro.. con el polimorfismo usamos la generalización olvidando los detalles concretos de los objetos para centrarnos en un punto en común mediante una clase padre.. básicamente mediante el polimorfismo programamos de forma general en lugar de hacerlo de forma especifica. al trabajar con este concepto optimizamos y simplificamos en gran medida nuestro trabajo..... (Ejemplo1) (Ejemplo2) Veamos 1 2 3 4 este proceso class FiguraGeometrica{ } como se representa en Java... en si consiste en hacer referencia a objetos de una clase que puedan tomar comportamientos de objetos descendientes de esta.. podemos decir que un objeto de la clase FiguraGeometrica puede usarse para referirse a cualquier objeto de cualquier subClase de FiguraGeometrica.. Tomando como ejemplo la imagen anterior.Este tal vez sea uno de los conceptos de la programación orientada a objetos mas usados pero muchas veces sin saber que se aplica ya que el concepto inicialmente puede ser un poco confuso. /**Objeto Circulo de tipo FiguraGeometrica*/ 29 FiguraGeometrica miCirculo=new Circulo(). 30 /**Objeto Triangulo de tipo FiguraGeometrica*/ 31 FiguraGeometrica miTriangulo=new Triangulo(). 23 24 /**Puedo crear objetos polimorficos*/ 25 miFiguraGeometrica=miCuadro. 26 27 /**Objeto Cuadrado de tipo FiguraGeometrica*/ 28 FiguraGeometrica miCuadrado= new Cuadrado(). 22 Cuadrado miCuadro=new Cuadrado(). 32 33 34 } } .5 6 class Cuadrado extends FiguraGeometrica { 7 8 9 10 11 12 13 } class Triangulo extends FiguraGeometrica { } class Circulo extends FiguraGeometrica{ 14 15 } 16 17 public class Principal{ 18 19 public void metodo(){ 20 /**Puedo crear objetos concretos*/ 21 FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica(). StringBuffer yStringBuilder las cuales permiten el trabajo con cadenas de caracteres.Como vemos en el ejemplo la clase FiguraGeometrica puede convertirse en cualquier figura que se encuentra en su jerarquía de Herencia pudiendo utilizar las propiedades que compartan entre ellas.. hay que tener presente que solo se permite el polimorfismo de clases padre a clases hija mas no al contrario. mas adelante explicaremos este concepto en detalle. en esta ocasión trabajaremos con las Clases String.. es decir que dicho objeto no puede cambiar. Algo que debemos tener claro es que esta clase esta enfocada a trabajar con cadenas de caracteres constantes entonces cuando definimos un objeto String este será inmutable. a continuación veremos algunos ejemplos básicos con estas Clases y sus métodos principales y mas adelante las compararemos a nivel de rendimiento.. ¿ String Vrs StringBuffer Vrs StringBuilder ? Esta entrada hace parte de algunas enfocadas a repasos o conceptos de Java.. en futuras entradas trabajaremos otros ejemplos y aplicaciones. Hasta aquí vimos algunos de los principales conceptos de la programación Orientada a Objetos. en realidad lo que hacemos es crear un nuevo objeto de tipo String... La Clase String.. si modificamos nuestro String inicial... Es común que se confundan los String con tipos de datos primitivos como un int o un double pero eso es incorrecto ya que cuando decimos que trabajamos con una variable String en realidad estamos trabajando con un Objeto y al momento de declararlo lo que hacemos es crear instancias del mismo.. . ya que cada concepto posee sus restricciones con respecto al proceso de desarrollo. concat(String) : Concatena el String enviado como parámetro a la cadena original (este metodo tiene su equivalente al usar el operador +) substring(int) : Elimina la cadena desde la posición 0 hasta la enviada por parámetro -1 substring(int. toLowerCase() : Convierte toda la cadena en minúsculas. mediante su constructor o a partir de cadenas constantes o literales: Ej: String cadena1 = String cadena2 = new String("CoDejaVu").. length() : Retorna el tamaño basado en la cantidad de caracteres que posee la cadena. mientras que en la primera se hace implícito y directo. indexOf(String) : Permite retornar el índice desde donde inicia la cadena enviada como parametro. toUpperCase() : Convierte toda la cadena en mayúsculas.Char) : Busca en la cadena inicial donde se encuentre el carácter o cadena enviada en el segundo parámetro y la reemplaza por el primero...Para crear Objetos de la clase String se puede realizar de 2 formas. sin embargo la primera es mas efectiva en cuestiones de rendimiento (aunque esto con un solo objeto no es tan relevante) ya que en la segunda se hace un doble llamado al constructor de la Clase. equalsIgnoreCase(String) : Indica si dos cadenas son iguales. replace(Char. "CoDejaVu". trim() : Elimina los espacios en blanco al inicio y final de la cadena. . o cualquiera de las 2 formas anteriores es valida. Algunos Métodos de la Clase String charAt(int) : Permite retornar un caracter del String dependiendo del índice enviado como parámetro. sin tener en cuenta las mayúsculas.int) : Elimina la cadena desde la posición del primer parámetro hasta la posición del segundo. 10 /**retorna el tamaño 19 */ 11 12 13 14 15 16 System.println("Usando replace(\"Un\". " /**convierte la cadena en mayusculas*/ System. para esto creamos el siguiente método.substring(6)).out.charAt(2)).println("Usando length() = "+cadena1.println("Usando charAt(2) = "+cadena1.toUpperCase()).out.out. \"xxx\") = "+cadena1.indexOf("Un")).println("Usando substring(6) = "+cadena1.println("Usando substring(4.println("Usando equalsIgnoreCase(cadenaOriginal) = "+cadena1. 14) = "+cadena1.concat("En CoDe 21 /**elimina la cadena de la posicion 0 a la 5*/ 22 System.out. /**indica si dos cadenas son iguales.trim()).substring(4. 23 /**elimina la cadena de la posicion 4 a la 14*/ 24 25 26 System.out. sin embargo estos son algunos a mi parecer mas importantes (Necesitaríamos muchas mas entradas para hablar solo del String :S ). enviamos la misma cadena.Existen muchos mas métodos de la clase String.println("Usando toLowerCase() = "+cadena1.out.out.toLowerCase()). 1 2 private void metodosString() { String cadena1=" Esto Es Un String ".replace("Un"..println("Cadena Original = "+cadena1).length()). 8 /**retorna la posicion 9 (cuenta tomando el primer caracter como 0 )*/ 9 System.out.. 19 /**Concatena al String el valor enviado*/ 20 System.println("Usando trim() = "+cadena1.println("Usando toUpperCase() = "+cadena1. 3 4 /**Imprime la cadena original*/ 5 System. /**convierte en minusculas*/ System. retorna true*/ System. 14)).out. /**reemplaza la cadena "un" por la cadena "xxx"*/ System. ahora veamos como funcionan.println("Usando indexOf(\"Un\") = "+cadena1.println("Usando concat(\" En CoDejaVu\") = "+cadena1. 6 /**retorna la letra s (cuenta tomando el primer caracter como 0 )*/ 7 System.out. 17 /**Elimina los espacios en blanco al principio y final de la cadena*/ 18 System.out.out.equalsI . .. recordemos que si hacemos un cambio en un objeto String en realidad estamos trabajando con un nuevo Objeto (es decir si tenemoscadena=cadena+"hola". ya que en ningún momento le asignamos ningún valor ni creamos otro explicitamente. si imprimimos la cadena original nos arroja " Esto Es Un String ". enviamos otra cadena.. sin embargo hay que tener en cuenta que en el ejemplo anterior trabajamos siempre con el Objeto String inicial.27 /**indica si dos cadenas son iguales. En estas clases a diferencia de la Clase String las cadenas si se pueden modificar trabajando desde el objeto original.. . en realidad lo que hacemos es crear un nuevo objeto String apuntando a la misma referencia del Objeto Cadena.. Podemos ver las funciones de los métodos mencionados. La forma de crear un Objeto de alguna de estas clases es la siguiente. Las Clases StringBuffer y StringBuilder.out.println("Usando equalsIgnoreCase(otroString) = "+cadena1.) mientras que con StringBuffer o StringBuilder siempre trabajamos desde el mismo Objeto aprovechando el mismo espacio de memoria. retorna false*/ 28 29 System..equalsIgnor } 30 Al ejecutar el metodoString() obtenemos los siguientes resultados. . por eso solo mostraremos el ejemplo usando StringBuilder.. appened(String) : Concatena la cadena enviada como parámetro. quiere decir que acepta cualquier tipo de dato.StringBuffer StringBuilder cadena1=new cadena2=new StringBuffer("CoDejaVu"). 3 /**Imprime la cadena original*/ 4 System. int_final) : Elimina la cadena desde la posición inicial hasta la final.. Cuando vamos a utilizar muchas cadenas podemos usar estas clases ya que al trabajar con el mismo objeto original hacen mas optimo el proceso....out. este método es sobrecargado. 5 /**concatena la cadena enviada como parametro*/ 6 System. se recomienda consultar en la API de java sobre estos.veamos un pequeño ejemplo del funcionamiento. quiere decir que acepta cualquier tipo de dato.. es decir... reverse(): imprime la cadena al revés.out. y StringBuilder("CoDejaVu")..out.println("Usando append(\"En CoDejaVu\") = "+cadena1.. sus metodos no se encuentran sincronizados haciéndola un poco mas veloz que su equivalente StringBuffer por eso se recomienda que al trabajar con hilos se use esta ultima en vez de StringBuilder.. este método es sobrecargado. insert(int. delete(int_inicial.. 37) = "+cadena1. Algunos Métodos de StringBuffer y StringBuilder.append("En CoDejaVu 7 /**Elimina la cadena desde la posicion inicial hasta la final*/ 8 System... replace(int_inicial.. int_final. . la diferencia es que StringBuilder no es Multihilo.delete(32.......println("Usando delete(32.. 1 2 private void metodosStringBuilder() { StringBuilder cadena1=new StringBuilder(" Esto Es Un StringBuilder "). Igual que en el ejemplo de la clase String existen muchos mas métodos pero estos son solo algunos.como lo mencionamos anteriormente dichas clases comparten la misma API por lo cual usan los mismos métodos. 37)).println("Cadena Original = "+cadena1)... StringBuffer y StringBuilder son prácticamente iguales (posen la misma API)... String) : Inserta la cadena enviada en la posición definida.. String) : Reemplaza la cadena enviada en las posiciones de la inicial a la final. reverse()). String) = "+cadena1.. 4.out.out. es mas.. o que con el "+" podemos evitar el uso del concat() o con el "+=" podemos realizar la operación y asignarla directamente al objeto String tal como se hace con algunos tipos de datos primitivos entre otras facilidades que nos brinda. "ejaVu Otra V 11 /**Reemplaza la cadena enviada en las posiciones definidas*/ 12 System. String) = "+cadena1..... evidenciando que este cada vez va cambiando dependiendo de los métodos que utilicemos. pues se tendría una gran cantidad de objetos en memoria.out. aquí todas las operaciones se asignan al objeto inicial. "xxx")) 13 /**Imprime la cadena en reversa*/ 14 System.. ya que como dijimos los String son inmutables por ende dependiendo de lo que realicemos cada vez crearíamos objetos de este tipo y dependiendo también de la cantidad de cadenas que usemos esto seria una carga en tiempo de ejecución.println("Usando replace(2..println("Usando insert(32...println("Usando reverse() = "+cadena1.. sin embargo a nivel de rendimiento son mucho mas efectivas las otras clases que estamos evaluando..9 /**Inserta la cadena enviada desde la posicion inicial*/ 10 System. 4...insert(32. y a decir verdad casi todos nos acostumbramos a usar String por estas y otras razones. la Clase String permite un manejo mucho mas simple teniendo en cuenta que podemos omitir crear la instancia de un Objeto simplemente con un " = " que hace ese proceso implícito.. String Vrs StringBuffer Vrs StringBuilder Con lo anterior podemos decir que las 3 clases sirven para lo mismo.replace(2.... 15 } Al ejecutar el método anterior obtenemos el siguiente resultado: a diferencia del ejemplo usando String. . en este ejemplo se solicita el ingreso de un texto y se calcula la velocidad de concatenación para cada uno de los 3 casos. /**determina el tiempo total de concatenacion*/ private long tiempo. StringBuffer y StringBuilder siempre trabajarán con el mismo objeto inicial y de esta manera la carga en el heap sera mucho menor. se evidencia la diferencia de tiempos respectivamente. inicialmente usamos obtejos String pero a medida que crecían los datos este proceso tomaba demasiado tiempo hasta que decidimos usar objetos StringBuffer y de esta manera el tiempo se redujo significativamente. el calculo se realiza en ciclos (for) cada uno con una constante de 100000 iteraciones. 1 2 /** 3 * 4 */ 5 * @author HENAO public class Cadenas { 6 7 /** 8 * constante que determina el numero de repeticiones 9 * en cada uno de los tres metodos de concatenacion 10 */ 11 12 13 14 15 16 17 18 public final long ITERA = 100000. Como experiencia personal. alguna vez un compañero y yo desarrollamos una aplicación en la cual se Debián realizar muchas operaciones con cadenas las cuales se concatenaban y mostraban en consola. /** * @param args */ public static void main(String[] args) { .A diferencia de este. A continuación veremos un ejemplo muy común donde podremos simular lo anterior. out.tiempo. i++) { 40 cadena += valor. i < ITERA . for (int i = 0.calculaTiempoString(valorCadena).calculaTiempoStringBuffer(valorCadena).println("Tiempo Concatenacion String : "+usoString+ 25 "\nTiempo Concatenacion StringBuffer : "+usoStringBuffer+ 26 27 "\nTiempo Concatenacion StringBuilder : "+usoStringBuilder). 22 String usoStringBuffer=objetoCadenas. } 45 46 47 48 /** * Metodo que calcula el tiempo de concatenacion de la cadena . 21 String usoString=objetoCadenas. 20 String valorCadena="CoDejaVu". String usoStringBuilder=objetoCadenas.calculaTiempoStringBuilder(valorCadena). } 28 29 30 /** 31 * Metodo que calcula el tiempo de concatenacion de la cadena 32 * usando la clase String 33 * @param valor dato ingresado por el usuario 34 * @return tiempo en milisegundos 35 */ 36 public String calculaTiempoString(String valor) 37 { 38 String cadena = "".currentTimeMillis() . 43 44 return tiempo + " milisegundos". 41 } 42 tiempo = System. 23 24 System.19 Cadenas objetoCadenas=new Cadenas(). 39 tiempo = System.currentTimeMillis(). 73 } 74 tiempo = System. 75 return tiempo + " milisegundos". 61 } 62 /** 63 * Metodo que calcula el tiempo de concatenacion de la cadena 64 * usando la clase StringBuilder 65 * @param valor dato ingresado por el usuario * @return tiempo en milisegundos 66 */ 67 public String calculaTiempoStringBuilder(String valor) 68 { 69 StringBuilder cadena = new StringBuilder().append(valor). i < ITERA .tiempo.currentTimeMillis().49 * usando la clase StringBuffer 50 * @param valor dato ingresado por el usuario 51 * @return tiempo en milisegundos 52 */ public String calculaTiempoStringBuffer(String valor) 53 { 54 StringBuffer cadena = new StringBuffer(). 55 long tiempo = System.currentTimeMillis(). 71 for (int i = 0. 58 } 59 tiempo = System.tiempo. } 76 77 78 } .append(valor). i++) { 57 cadena.currentTimeMillis() . 56 for (int i = 0. 60 return tiempo + " milisegundos".currentTimeMillis() . i < ITERA . i++) { 72 cadena. 70 tiempo = System. Comparando Fechas En Java En esta entrada veremos uno de los procesos obligados cuando se trabaja en este campo del desarrollo de Software. . Conclusión. se recomienda usar objetos String cuando no tengamos que manipular gran cantidad de cadenas y que estas no vayan a cambiar.79 80 81 De esta manera obtenemos el siguiente resultado: y podemos ver la gran diferencia entre los diferentes tipos de objetos. vimos las diferentes formas que tenemos al momento de trabajar con datos de tipo cadena. sin importar el lenguaje que manejemos en algún momento tendremos que realizar operaciones con fechas. pero siempre se presentará una gran distancia con respecto al String. Como conclusión. usaremos StringBuffer cuando necesitemos trabajar con cadenas cambiantes además de que también trabajemos con varios hilos y StringBuilder cuando no trabajamos con hilos o solo se tiene uno en ejecución. dependiendo de la cantidad de cadenas con las que vamos a trabajar estos resultados varían y en ocasiones el tiempo de concatenación del StringBuffer es igual al del StringBuilder pues como ya mencionamos comparten la misma API. text. 20 String fecha2 = "13/05/2013".ParseException. 21 String fecha3 = "14/05/2013".Date. luego obtendremos la fecha del sistema y la convertiremos a este formato para poder realizar las comparaciones. mayor o igual a otra. veremos una forma fácil para definir si una fecha es menor. 3 import java. para esto almacenaremos la fecha ingresada con un formato "dd/mm/yyyy" . 2 import java.Date En el siguiente ejemplo asumiremos que ingresamos una fecha a nuestra aplicación y vamos a compararla con la fecha actual del sistema. para esto usaremos la clase java.SimpleDateFormat.util. 1 import java. 22 . 4 5 6 7 8 9 10 11 12 13 14 /** * @author HENAO * */ public class Principal { /** * @param args */ public static void main(String[] args) { 15 16 /**Objeto de la clase */ 17 Principal objetoPrincipal=new Principal().En esta Ocasión y gracias a la inquietud de alguien vamos a realizar un pequeño ejemplo de como comparar dos fechas.text.util. 18 19 String fecha1 = "12/05/2013". compararFechasConDate(fecha3.compararFechasConDate(fecha2. 50 51 52 } .println(resultadoMenor+"\n").out.println("*****************************" + "*******************************\n").out.23 /**Obtenemos la fecha del sistema y la convertirmos al String * 24 25 con el formato en el que vamos a trabajar*/ Date fechaActual = new Date().out.println("\n********************************" + 31 "****************************\n").println("******************************" + 37 "******************************\n").out. 26 String fechaSistema=formateador.out. 41 System. System. 47 System. 38 39 40 String resultadoIgual=objetoPrincipal.println("******************************" + 44 "******************************\n"). SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy").compararFechasConDate(fecha1.out. 27 28 /**Realizamos los llamados a los metodos de ejemplo*/ 29 30 System. 45 46 String resultadoMayor=objetoPrincipal.fechaSistema). 32 33 34 String resultadoMenor=objetoPrincipal. 42 43 System.println(resultadoIgual+"\n").fechaSistema).println(resultadoMayor+"\n"). 35 36 System.fechaSistema).format(fechaActual).out. 48 49 System. 73 }else{ 74 if ( fechaDate2.println("Parametro Date Fecha 1 = "+fechaDate1+"\n" + 69 "Parametro Date fechaActual = "+fechaDate2+"\n").println("Se Produjo un Error!!! } "+e. 78 } 79 80 } } catch (ParseException e) { 81 82 System. String fechaActual) { System. .getMessage()).parse(fechaActual). 70 71 if ( fechaDate1. try { 64 /**Obtenemos las fechas enviadas en el formato a comparar*/ 65 SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy"). 66 Date fechaDate1 = formateador. 76 }else{ 77 resultado= "Las Fechas Son iguales ".out.out.53 /** 54 * Comparamos las Fechas 55 * @author CHENAO 56 * @param fecha1 57 58 59 60 * @param fechaActual * @return */ private String compararFechasConDate(String fecha1.out. 67 Date fechaDate2 = formateador.before(fechaDate1) ){ 75 resultado= "La Fecha 1 es Mayor ".before(fechaDate2) ){ 72 resultado= "La Fecha 1 es menor ". String resultado="".println("Parametro String Fecha 1 = "+fecha1+"\n" + 61 62 63 "Parametro String fechaActual = "+fechaActual+"\n").parse(fecha1). 68 System. . algunos complejos otros no tanto... Si verificamos el proceso Obtenemos los siguientes resultados. 86 87 } } 88 89 Y listo.. ..hasta aquí se han publicado cositas no tan complejas pero que pueden llegar a ser enredadas o de cuidado.... mayor o si son iguales. Leer Archivo Properties en Java En el segundo Post de este blog se mencionó la intención de publicar entradas sobre diversos temas.... Podemos evidenciar que la comparación se realizó con las 3 fechas y gracias al métodobefore sabemos cual es menor.83 84 85 return resultado. donde definiremos dos paquetes.Valor" y usar los métodos básicos que esta clase nos proveé.util. Otro ejemplo es que en la empresa donde trabajo nos encontramos desarrollando una aplicación que genera una serie de reportes de Excel y se deben almacenar en unas rutas especificas.properties.Properties donde básicamente necesitamos especificar nuestros parámetros mediante la combinación "Clave . por eso podríamos hacer que esas rutas de directorios se puedan parametrizar en un archivo properties y no quemadas en código. podemos crear archivos properties para definir todos los labels o etiquetas que usaremos en la aplicación para diferentes idiomas y dependiendo del idioma que escogemos buscamos el valor a presentar en pantalla en su archivo correspondiente. establecer mensajes o en general definir parámetros (en tutoriales anteriores hicimos uso de este tipo de archivos para definir rutas de servidores o parametros de configuración). uno para las clases y otro para el archivo. En java trabajaremos con java. Empecemos!!! Para este caso vamos a crear un proyecto Java básico.En esta ocasión veremos una entrada sobre algo simple y fácil de entender pero que nos puede ser de mucha ayuda. estos archivos son simplemente ficheros de texto que podemos usar para almacenar información. Veremos de forma breve como trabajar con un archivo de propiedades desde java. son muchos reportes que se almacenan en rutas diferentes. inicializar variables. . un ejemplo simple puede darse con el tema de la internacionalización. Luego desde el paquete properties damos click derecho y creamos un nuevo archivo de propiedades. . Se carga una ventana donde ingresamos archivo.propierties. siendo este el nombre y la extensión del archivo. Después de esto ya contamos con un panel donde podemos editar el archivo de propiedades.Valor. O desde la vista Source podemos agregarlos directamente. presionando el botón Add podemos empezar a agregar parámetros con la combinación Clave . . io. 4 import java. import java.Para poder acceder a estos datos desde el código fuente.FileInputStream. } .io.FileNotFoundException. 7 8 /** 9 * @author CHENAO 10 * 11 */ 12 public class Principal { 13 14 public static void main(String arg[]) { 15 Principal miPrincipal = new Principal(). En la clase principal de nuestra aplicación creamos un método donde realizaremos el cargue y obtención de datos desde el archivo de propiedades. 1 2 3 package clases.IOException. haremos uso de los métodos load y getProperty que nos provee la clase Properties.io. 5 import java.leerArchivo().util.Properties. 16 17 18 miPrincipal. 6 import java. out. El archivo no exite").19 20 /** 21 * Lee un archivo de propiedades desde una ruta especifica 22 * y se imprime en pantalla. 23 */ private void leerArchivo() { 24 try { 25 26 27 /**Creamos un Objeto de tipo Properties*/ Properties propiedades = new Properties(). 40 41 } catch (FileNotFoundException e) { 42 System. 45 } 46 47 48 } } .propert 33 34 /**Obtenemos los parametros definidos en el archivo*/ 35 String nombre = propiedades.out. 37 38 /**Imprimimos los valores*/ 39 System.getProperty("pagina").println("Error.getProperty("nombre").println("Nombre: "+nombre + "\n" +"Pagina: "+ pagina). No se puede leer el archivo").out.load(new FileInputStream( 32 "D:/HENAO/codejavu/Workspace/PruebaProperties/src/properties/archivo. 28 29 /**Cargamos el archivo desde la ruta especificada*/ 30 propiedades 31 . 43 } catch (IOException e) { 44 System.println("Error. 36 String pagina = propiedades. Instalación Plugin...........3... Instalación Servidor).. IDE Eclipse Plugin JBoss JDK 1....Empecemos....... ha estas alturas ya debemos tener nuestro ambiente de desarrollo listo para trabajar........ En este tutorial vamos a crear un proyecto Web con un pequeño Demo de aplicación funcional...49 Al correr nuestra aplicación podemos ver como se obtienen los datos desde la ruta enviada en el método load... por ejemplo la del servidor de aplicaciones y luego enviarla como parámetro..... al final la salida es Tutorial Proyecto Web Con Eclipse Si se han seguido todos los tutoriales anteriores (Instalación Eclipse. Mediante eclipse crearemos un nuevo proyecto JSF (Java Server Faces) y realizaremos una serie de configuraciones que nos permitirán generar nuestro código fuente Base desde el cual podremos seguir trabajando....GA .6 Variable de Entorno JBOSS_HOME Variable de Entorno JAVA_HOME Creación Del Proyecto..2........ Requisitos.... JBoss Tools 4........ si queremos podemos almacenar el archivo en otra ruta.. de esta forma nos aparece la opción de JSF Project (Recordemos que para que esta opción este disponible. le decimos a Eclipse que vamos a crear un demo de una aplicación web (el demo es muy básico pero cuenta con interfaz gráfica. solo con la estructura y configuración inicial.Desde Eclipse vamos a "File/New/Other. la seleccionamos y damos click en Next Posteriormente ingresamos el nombre del proyecto.. debe estar previamente instalado el plugin JBoss Tools). dejamos el campo por defecto “JSF Environment” y seleccionamos en “Template” la opción “JSFKickStartWithoutLibs”.. sino entonces crearíamos el proyecto en blanco. con esto. . bean y reglas de navegación)." allí se cargará una ventana donde ingresaremos en el campo la palabra jsf. . (eso sucede porque no se asignó previamente el servidor) indicándonos que el server es requerido. presionamos en New… para asociar el servidor. acto seguido se carga una ventana donde debemos configurar el servidor de nuestra aplicación.Presionamos Next. Damos Click en Next y se carga otra ventana indicándonos que se debe asignar la ruta donde se encuentra alojado server. para este caso usaremos JBoss4.Se cargará una ventana donde seleccionaremos el server con el que vamos a trabajar. para esto presionamos en el botón Browse… y buscamos el directorio de instalación del JBoss .GA que instalamos previamente en algún directorio de nuestra máquina.2.3. Después de encontrar el directorio lo seleccionamos y regresamos a la ventana inicial con la configuración deseada. . estaremos en la perspectiva mencionada (Se puede evidenciar en la esquina superior derecha de Eclipse) Esta perspectiva está más orientada al diseño. . ahora solo nos queda dar en Finishpara crear el proyecto.Como vemos ya no tenemos ningún error o advertencia. Como vemos nuestro proyecto fue creado. después de esto se cargara una ventana de dialogo donde nos preguntan si deseamos cambiar a la perspectiva “Web Development perspective” esto es opcional. y en caso de haber seleccionado "Yes" en la ventana de dialogo. más adelante veremos cómo. puesto que simplemente con arrastrar y soltar podemos agregar componentes a nuestras páginas. vamos a hacer un pequeño recorrido por la estructura del mismo. pero a modo personal me gusta trabajar con la vistaNavigator ya que me parece un poquito más ordenada. sin embargo pueden seguir trabajando por el Project Explorer (Es cuestión de gustos…) Para esto seleccionamos “Window/Show View/Navigator” y listo.Si no se definió esta perfectiva igual seguiremos trabajando normalmente (para los que no nos gusta arrastrar y soltar) pero en caso de que queramos acceder a ella. tenemos la nueva opción de navegación. simplemente por"Windows/Open Perspective" la buscamos y listo. veamos la estructura del proyecto. podemos empezar ya. Ya teniendo nuestro proyecto creado. . ahora sí. que tiene los métodos set y get necesarios.jsp.xml con las reglas de navegación entre páginas. el directorio JavaSource que contiene la clase User.jsp vemos que gracias al plugin JBoss Toolspodemos trabajar con las opciones de solo código.Como vemos tenemos nuestro proyecto web funcional. un bean creado por defecto.java. También podemos ver un directorio pages que contiene las pantallas de la aplicación y dentro del WEBINF encontramos por ejemplo el archivo faces-config. . código y pantalla. además de una vista previa de lo que estamos haciendo. Si ingresamos a la página inputUserName. tenemos el archivo index. Tenemos también un archivo de propiedades donde se establecen todos los mensajes o texto que tendrán las etiquetas del aplicativo. Carga del Servidor desde Eclipse Para poder desplegar nuestra aplicación. tenemos que hacer uso del servidor. como se mencionó anteriormente solo sería cuestión de elegir el componente que necesitamos y arrastrarlo al código. se cargará desdeWindows/Show view/Server allí presionamos click derecho y agregamos new server . para eso desde Eclipse. en caso de que no se encuentre la vista de servidores.En la imagen anterior también se puede ver en el panel de la derecha las opciones que brinda la perspectiva recomendada por eclipse. 2 y presionamos finish. nuevamente escogemos JBoss v4.Se cargará nuevamente una ventana donde definiremos el servidor a utilizar. . realizando un proceso similar a los anteriores. Vemos como ha quedado agregado correctamente el servidor. ya que en ocasiones cuando tenemos aplicaciones muy grandes. para esto simplemente damos doble click en el server y aumentamos el tiempo en la opción TimesOuts Ahora para el despliegue de la aplicación desde eclipse podemos pararnos en el servidor y dar click derecho.Ahora aumentaremos el tiempo de espera del servidor. el servidor no permite el despliegue. luego seleccionar la opción Run o simplemente desde este mismo icono en las opciones de la esquina. . pues por defecto el tiempo de espera es muy corto. vemos que todo está correcto y esperamos hasta que nos indique que se ha iniciado. posiblemente se deba a algún error en el plugin) . tendríamos que verificar haciendo lo mismo pero desde la página inputUserName. damos click derecho al index.jsp. haciendo esto no permite la ejecución desde el index. Ahora para ejecutar nuestra aplicación.jsp y seleccionamos run as/run on server (En algunas versiones de Eclipse. por ejemplo desde el cuadrito rojo podemos finalizar el despliegue (Vemos que es igual al despliegue desde el run. también se pueden ver otras opciones.bat del servidor como evidenciamos en el tutorialanterior).Luego de esto se muestra el progreso del despliegue desde la consola de Eclipse. Acto seguido se carga una ventana indicándonos el servidor configurado, presionamos Next. Después se carga otra donde nos da la opción de agregar el proyecto que queremos desplegar, en caso de que no esté agregado previamente, o si queremos agregar otros proyectos asociados al nuestro. Al presionar Finish se abre un navegador propio de eclipse donde podemos ver nuestra aplicación en funcionamiento. La aplicación cuenta con reglas de navegación definidas, también el campo se encuentra validado, por ejemplo, si ingresamos una cadena menor a 3 caracteres, nos informará mediante un error en pantalla. Luego nos devolvemos usando la flecha "atrás" del navegador e ingresamos un nombre valido, presionamos el botón y ahora si nos redirecciona a otra página enviando el nombre ingresado como parámetro. También podemos ver la aplicación desde cualquier navegador, simplemente copiamos la ruta generada y con el servidor arriba la podemos probar. entre muchas otras opciones que esta herramienta nos ofrece. generar documentación. entonces el IDE lo que hace es leer esas configuraciones y almacenar el empaquetado en la carpeta Deploy. definimos cual servidor asociar y dimos Run desde ahí. copiarlo a otro directorio. lo que permite que la aplicación sea desplegada. establecer la ruta del mismo.war el cual es el empaquetado del proyecto.bat como vimos en otro tutorial.Si vamos a la carpeta deploy de nuestro servidor. se realicen una serie de pasos predefinidos como por ejemplo generar el empaquetado del proyecto. para que se puedan evidenciar. las cuales podemos configurar para que al ejecutar una tarea. ya que los cambios que hagamos. Debemos tener en cuenta que este archivo se genera porque desplegamos el proyecto desde Eclipse. En el próximo tutorial. también podemos desplegar la aplicación desde el run. tendríamos que desplegarlos desde el Eclipse. vemos que se ha generado un archivo . veremos una forma de automatizar ese proceso por medio de tareas Ant. pero la aplicación que se desplega es la ultima almacenada en el server. . Nos vemos en una próxima entrada!!! .
Copyright © 2024 DOKUMEN.SITE Inc.