ejemplo modelo vista controlador

101
Ejemplo Modelo Vista Controlador En 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.

Upload: wilson-barba

Post on 07-Nov-2015

52 views

Category:

Documents


5 download

DESCRIPTION

modelo

TRANSCRIPT

Ejemplo Modelo Vista ControladorEn la entradasobre patrones de Diseose habla sobre elpatrnMVC, en esta oportunidad vamos explicar un ejemplo practico donde se aplica este modelo mostrando la forma de independizar los componentes de nuestro sistema, adems lo combinaremos con los patronesDAOyVOpara facilitar el manejo de la informacin.

Por cuestiones de tamao no vamos a hacer la aplicacin paso a paso, pero si se explicar lalgicade la misma, al final se presenta una opcin de descarga delcdigofuente donde veremos la aplicacin en funcionamiento.

El problema.

Se solicita desarrollar un sistema de administracin de usuarios con unCRUD(Create, Read, Update, Delete)bsico nos advierten que la aplicacin es un prototipo inicial el cual esta propenso a cambios, pues an no se tienen definidas las ventanas con las que se va a trabajar ni la informacin requerida, por le momento se trabajar con una BDMySql, pero posiblemente se tenga que migrar a otro sistema gestor....

La solucin.Se aplica elMVCpermitiendo independizar lalgicay 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 deconexin con Java, el Scritp es el siguiente.123456789101112131415161718CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET latin1 */;USE `codejavu`;/*Table structure for table `persona` */DROP TABLE IF EXISTS `persona`;CREATE TABLE `persona` (`id` int(10) NOT NULL,`nombre` varchar(30) default NULL,`edad` int(3) default NULL,`profesion` varchar(30) default NULL,`telefono` decimal(10,0) default NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Data for the table `persona` */

De esta forma se crea la Base de Datos a la que se va a apuntar, la cual contiene solo una tablaPersonacon la que se realizan todas las operacionesCRUD.

La agrupacin de clases de nuestro sistema es:

Como vemos tenemos la parte visual compuesta por las clasesVentanaPrincipal,VentanaRegistro,VentanaBuscar, lalgicade negocio se establece en el modelo el cual se compone por la claseLogicayConexiny aplicamos los patronesDAOyVOpor medio de las clasesPersonaDaoyPersonaVoy por ultimo el controlador se define en la claseCoordinador, encargada de establecer todas las relaciones del sistema, la clasePrincipalprepara las instancias iniciales del sistema y posteriormente lo ejecuta.

Veamos como funciona el Patrn:

El Modelo.

Como se mencion, en el modelo tenemos lalgicade negocio, sern todas las clases vinculadas con elCRUDa nivel interno, que en ultimas es en lo que gira nuestro sistema.

Clase Logica.

Esta clase permite realizar las operaciones asociadas a lalgicade negocio como tal, desde ella realizamos las validaciones y llamados a las operacionesCRUDdel sistema.

En caso de que se requieran procesos adicionales asociados a lalgicade negocio,aquser donde se creen losmtodospara dichos procesos, por ejemplo elmtodovalidarRegistrodetermina si los datos son correctos y permite registrar la persona en el Dao.1234567891011public 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 Conexin.

En esta clasetenemos la cadena deconexincon la que trabajar nuestra aplicacin, en ella sedefinela base de datos, el usuario, password y driver de conexin, 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 contrasea)12345678910111213141516171819public Conexion() {try{//obtenemos el driver de para mysqlClass.forName("com.mysql.jdbc.Driver");//obtenemos la conexinconn = DriverManager.getConnection(url,login,password);if (conn!=null){System.out.println("Coneccin a base de datos "+bd+" OK");}}catch(SQLException e){System.out.println(e);}catch(ClassNotFoundException e){System.out.println(e);}catch(Exception e){System.out.println(e);}}

Clase PersonaVo.

Al utilizar este tipo de clases, aplicamos elpatrnValue ObjectoVO(Anteriormente conocidas comoDTO Data Transfer Object) en el que representamos las entidades (Tablas) de la base de datos, la tabla persona tiene los campos id, nombre,edad,profesintelfono 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 mtodossetygetdecada atributo.

Estepatrnnos facilitaenormementeel transporte de la informacin, evitando que seenvengran cantidad deparmetrosa unmtodocuando queremos hacer un registro o actualizacin,tambinen caso de que se modifique la tabla de la BD, nuestra clase deber ser modificadaascomo losmtodosque obtienen la informacin, mas no losmtodosque la transportan.123456789101112/*** @return the idPersona*/public Integer getIdPersona() {return idPersona;}/*** @param idPersona the idPersona to set*/public void setIdPersona(Integer idPersona) {this.idPersona = idPersona;}

Clase PersonaDao.

Cuando utilizamos estas clases, aplicamos elpatrnData Access ObjectoDAO,bsicamenteestepatrnconsisteen centralizar los procesos de acceso a la base de datos evitando inconsistencias y posiblesproblemticascuando esto se realiza a lo largo de la aplicacin.Con estepatrnindependizamos lalgicade negocio de lalgicade acceso a datos obteniendo mayor organizacin y flexibilidad en el sistema.12345678910111213141516public void eliminarPersona(String codigo){Conexion conex= new Conexion();try {Statement estatuto = conex.getConnection().createStatement();estatuto.executeUpdate("DELETE FROM persona WHERE id='"+codigo+"'");JOptionPane.showMessageDialog(null, " Se ha Eliminado" +" Correctamente","Informacin",JOptionPane.INFORMATION_MESSAGE);estatuto.close();conex.desconectar();} catch (SQLException e) {System.out.println(e.getMessage());JOptionPane.showMessageDialog(null, "No se Elimino");}}

La Vista.

Aqu se define la parte visual del sistema, en la vista estableceremos todas las ventanas o interfacesgrficasde usuario, mediante las cuales representamos todo el modelo permitiendo lainteraccinentre la aplicacin y el cliente.

Clase VentanaPrincipal.

Esta clase representa la ventana inicial de la aplicacin, posee unreade texto con una pequea descripcin y 2 botones quedarninicio a los eventos principales del sistema.

se comunica con el modelo mediante la clase coordinador y desde esta se cargan las otras ventanas de la aplicacin.

Clase VentanaRegistro.

Permite el ingreso de informacin a la BD, en ella se evidencian todos los campos de la tabla Persona y presenta un mediogrficopara las clasesPersonaVoyPersonaDao, al ejecutar el evento de registro se establece comunicacin entre el coordinador y la claseLgicadonde se encuentran todas las validaciones y casos para el ingreso de informacin.

Clase VentanaBuscar.

Esta clase permite realizar las operaciones de Consulta, Actualizacin y eliminacin de la tabla Persona, igual que la anterior representa la parte visual del modelo y se ejecutan los eventos para lalgicade los procesos anteriores, la forma deobtenerlos datos y como se leenvanparmetrosde consulta a la BD.

El Controlador.

Esta parte delpatrnes la quedefinelalgicade administracin del sistema, establece laconexinentre la vista y el modelo.

Clase Principal.

Esta clase contiene elmtodomainque ejecuta la aplicacin, elmtodohace un llamado almtodoiniciarel cual crea las instancias de las clases ventanas y la claseLogicaestableciendo las relaciones con la claseCoordinador.

A cada instancia de las clases se lesenvauna instancia de la claseCoordinador, y a la instancia deCoordinadorse leenvacada instancia de las clases, esto por medio de losmtodosset y get estableciendo las relaciones necesarias y por ultimo se usa la instancia de la claseVentanaPrincipalpara cargarla en pantalla.12345678910111213141516171819202122private void iniciar() {/**Se instancian las clases*/miVentanaPrincipal=new VentanaPrincipal();miVentanaRegistro=new VentanaRegistro();miVentanaBuscar= new VentanaBuscar();miLogica=new Logica();miCoordinador= new Coordinador();/**Se establecen las relaciones entre clases*/miVentanaPrincipal.setCoordinador(miCoordinador);miVentanaRegistro.setCoordinador(miCoordinador);miVentanaBuscar.setCoordinador(miCoordinador);miLogica.setCoordinador(miCoordinador);/**Se establecen relaciones con la clase coordinador*/miCoordinador.setMiVentanaPrincipal(miVentanaPrincipal);miCoordinador.setMiVentanaRegistro(miVentanaRegistro);miCoordinador.setMiVentanaBuscar(miVentanaBuscar);miCoordinador.setMiLogica(miLogica);miVentanaPrincipal.setVisible(true);}

Clase Coordinador.

Esta clase contiene toda lalgicade relaciones en el aplicativo, es el puente entre el modelo y las vistas.

Puede contener instancias locales tanto de clases de la vista como de clases del modelo, estas instancias tienen susrespectivosmtodosset y get permitiendo el flujo de llamados del sistema.

Cuando se desea registrar una persona desde la claseVentanaRegistrose hace un llamado almtodoregistrarPersona()de la clase Coordinador, posteriormente esta clase llama almtodoValidarRegistro()de la claseLogicay esta a su vez realiza las validaciones correspondientes para determinar si se llama o no almtodoRegistrarPersona()de la clasePersonaDao.12345678910111213141516171819public Logica getMiLogica() {return miLogica;}public void setMiLogica(Logica miLogica) {this.miLogica = miLogica;}public void mostrarVentanaRegistro() {miVentanaRegistro.setVisible(true);}public void mostrarVentanaConsulta() {miVentanaBuscar.setVisible(true);}public void registrarPersona(PersonaVo miPersona) {miLogica.validarRegistro(miPersona);}

La Aplicacin.El Sistema esta desarrollado como un proyecto Eclipse,En la siguiente imagen vemos que se crearon tres paquetes principales y de esta forma se tiene independiente la parte de la vista, el modelo y el controlador, el paquete modelo posee los paquetesconexin dao y vo ya que aunque pertenecen al modelo y lalgicade negocio debe establecersetambinsu independencia con respecto a las operaciones, es decir, las clases Vo por ejemplo no poseenmtodosde operaciones asociadas a lalgicade negocio, tan solo deben representar las tablas de la BD, entonces en el paquete vo se agruparn todas las clases equivalente a entidades.

El proyecto tiene los directorios db y conector, estos directorios se crearon solamente para agregar el script de creacin de la BD y el mysql connector, este ultimo debe ser agregado al build path para que el sistema pueda funcionar (sobre el proyecto,clic derecho/configure Build path...).

Conclusiones.Como vimos tenemos un proyecto funcional que realiza las operacionesbsicasdel CRUD, y donde todas sus partes se encuentran separadas por funcionalidades, separando la parte visual de lalgicade negocio y estableciendo relaciones entre ellas............ en si se desarroll como ejemplo practico, existen validaciones muybsicasy procesos simples pero pensado en modo de ejemplo sin mayor complejidad,tambinse utilizan algunos conceptos vistos en entradas anteriores como es el caso del manejo de excepciones, patrones entre otros...

Descarga.

En ellink de descargase encuentra el archivo .rar con la aplicacin, solo escuestinde descomprimir yabrirconEclipseperosi usasNetBeanste interesar estaentrada con un vdeo paso a pasode como abrirlo en el............(recuerden que es gratis.....nada cuesta opinar, compartir o agradecer :))

Y Listo, como se mencion es un ejemplo simple, sin mucha lgica para aplicar, pero la intencin es dar a conocer un poquito mas claro como se puede aplicar elMVC, espero que este ejemplo sea de utilidad..... ;)

Ejemplo Conectando Java con MySql

En esta entrada vamos a tocar uno de los puntos fundamentales en el desarrollo de software, no vamos a entrar en detalles de que es una BD, ni los tipos existentes ni como crearlas entre muchos otros temas en torno a esto, solamente muestro una pequea aplicacin (muy bsica) donde veremos de forma fcil como conectarnos a una BD para consultar y registrar informacin....adems daremos paso a futuras entradas sobre los Patrones de Diseo, ya que en esta aplicaremos los PatronesVO(Value Object) yDAO(DataAccess Objetc).

Requisitos. Ambiente de desarrollo (En este caso Eclipse) JDK instalado. MySql Instalado mysql-connector-java-5.0.8-bin (lo pueden bajar desdeaqu) Conocimientos Basicos de Programacin. Ganas de Continuar.

En Marcha.Bueno, vamos a hacer una aplicacin simple, la idea de este tutorial es ver como conectarnos aMySqldesde Java, por eso no nos preocuparemos tanto en como se presentaran nuestra informacin, ni los tipos de datos, ni que tan ptimo sea nuestro cdigo, simplemente vamos a crear una base desde donde podamos trabajar.

La Aplicacin.

El siguiente diagrama muestra la estructura de nuestra aplicacin (Ojo no es un diagrama de clases completo, es mas usado para dar claridad al sistema, por eso no nos enfocaremos en asociaciones, tipos de datos o etc)

Como vemos la aplicacin es bsica, nos conectaremos a una BD donde tenemos una nica tabla y mediante Java vamos a acceder a dicha BD para poder registrar y consultar informacin, la idea es poder registrar y consultar personas, en la aplicacin tendremos un Men principal con estas opciones.....

La Base de Datos.

Nuestra base de datos solo tendr la tabla persona con los datos bsicos de registro (si se desea se puede dar otro enfoque a la tabla o trabajar con muchas mas), el Script para la creacin es el siguiente:123456789101112131415161718CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET latin1 */;USE `codejavu`;/*Table structure for table `persona` */DROP TABLE IF EXISTS `persona`;CREATE TABLE `persona` (`id` int(10) NOT NULL,`nombre` varchar(30) default NULL,`edad` int(3) default NULL,`profesion` varchar(30) default NULL,`telefono` decimal(10,0) default NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;/*Data for the table `persona` */

Empecemos!!!

Para iniciar vamos a crear un proyecto java en Eclipse, por cuestiones de organizacin crearemos las clases de nuestro diagrama separndolas por paquetes, esto con el fin de tener nuestro proyecto mas estructurado y fcil de entender, as.

Como vemos tenemos un paquete por cada clase, en estos momentos la aplicacin es pequea por lo tanto no nos da problemas de organizacin, 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.

Clase DbConnection.

Esta clase ser nuestra cadena de conexion, aqu definiremos los parmetros requeridos para conectarnos a la BD creada anteriormente.12345678910111213141516171819202122232425262728293031323334353637383940414243444546package prueba.connection;import java.sql.*;/*** Clase que permite conectar con la base de datos* @author chenao**/public class DbConnection {/**Parametros de conexion*/static String bd = "codejavu";static String login = "root";static String password = "";static String url = "jdbc:mysql://localhost/"+bd;Connection connection = null;/** Constructor de DbConnection */public DbConnection() {try{//obtenemos el driver de para mysqlClass.forName("com.mysql.jdbc.Driver");//obtenemos la conexinconnection = DriverManager.getConnection(url,login,password);if (connection!=null){System.out.println("Conexin a base de datos "+bd+" OK\n");}}catch(SQLException e){System.out.println(e);}catch(ClassNotFoundException e){System.out.println(e);}catch(Exception e){System.out.println(e);}}/**Permite retornar la conexin*/public Connection getConnection(){return connection;}public void desconectar(){connection = null;}}

En la clase estamos aplicando el manejo de excepciones, tema tratado en el articuloanterior, vemos como se tiene contemplada la jerarqua de excepciones pertinente.

Clase PersonaVO.

Esta clase nos permite dar un manejo mucho mas organizado y seguro a nuestra informacin, en ella estamos aplicando el patrnVO(Value Object) con el cual nos aseguramos que los datos viajen en un solo objeto,evitando no solo el envi de gran cantidad de parmetros sino tambin un mayor control............Debemos saber que por cada tabla de nuestra BD se tiene que construir su equivalente claseVO.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677package prueba.vo;/*** CLase VO con los atributos del campo empleado* @author chenao**/public class PersonaVO{private Integer idPersona;private String nombrePersona;private Integer edadPersona;private String profesionPersona;private Integer telefonoPersona;/*** @return the idPersona*/public Integer getIdPersona() {return idPersona;}/*** @param idPersona the idPersona to set*/public void setIdPersona(Integer idPersona) {this.idPersona = idPersona;}/*** @return the nombrePersona*/public String getNombrePersona() {return nombrePersona;}/*** @param nombrePersona the nombrePersona to set*/public void setNombrePersona(String nombrePersona) {this.nombrePersona = nombrePersona;}/*** @return the edadPersona*/public Integer getEdadPersona() {return edadPersona;}/*** @param edadPersona the edadPersona to set*/public void setEdadPersona(Integer edadPersona) {this.edadPersona = edadPersona;}/*** @return the profesionPersona*/public String getProfesionPersona() {return profesionPersona;}/*** @param profesionPersona the profesionPersona to set*/public void setProfesionPersona(String profesionPersona) {this.profesionPersona = profesionPersona;}/*** @return the telefonoPersona*/public Integer getTelefonoPersona() {return telefonoPersona;}/*** @param telefonoPersona the telefonoPersona to set*/public void setTelefonoPersona(Integer telefonoPersona) {this.telefonoPersona = telefonoPersona;}}

Como vemos cada campo de la tabla persona es reflejado en la Clase PersonaVO, tambien aplicamos un poco el concepto deEncapsulacintratado en un articuloanteriormediante la creacin de metodos setter y getter por cada dato privado.

Clase PersonaDAO.

Esta clase sera la encargada de gestionar el acceso a los datos, con ella aplicamos un patrn DAO (DataAccess Objetc) no entraremos en detalle (mas adelante se presentara una entrada sobre este Patrn) ya que bsicamente necesitamos saber que este patrn nos ensea la forma de obtener informacin de la BD mediantemtodos CRUD (Create, Read, Update y Delete), as que por cada tabla de nuestra BD debemos tener una clase DAO que la represente!!!123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107package prueba.dao;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import javax.swing.JOptionPane;import prueba.connection.DbConnection;import prueba.vo.PersonaVO;/*** Clase que permite el acceso a la base de datos* @author chenao**/public class PersonaDAO {/*** Permite registrar un empleado* @param persona*/public void registrarPersona(PersonaVO persona) {DbConnection conex= new DbConnection();try {Statement estatuto = conex.getConnection().createStatement();estatuto.executeUpdate("INSERT INTO persona VALUES ('"+persona.getIdPersona()+"', '"+persona.getNombrePersona()+"', '"+persona.getEdadPersona()+"', '"+persona.getProfesionPersona()+"', '"+persona.getTelefonoPersona()+"')");JOptionPane.showMessageDialog(null, "Se ha registrado Exitosamente","Informacin",JOptionPane.INFORMATION_MESSAGE);estatuto.close();conex.desconectar();} catch (SQLException e) {System.out.println(e.getMessage());JOptionPane.showMessageDialog(null, "No se Registro la persona");}}/*** permite consultar el empleado asociado al documento enviado* como parametro * @param documento * @return*/public ArrayList< personavo> consultarPersona(int documento) {ArrayList< personavo> miEmpleado = new ArrayList< personavo>();DbConnection conex= new DbConnection();try {PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona where id = ? ");consulta.setInt(1, documento);ResultSet res = consulta.executeQuery();if(res.next()){PersonaVO persona= new PersonaVO();persona.setIdPersona(Integer.parseInt(res.getString("id")));persona.setNombrePersona(res.getString("nombre"));persona.setEdadPersona(Integer.parseInt(res.getString("edad")));persona.setProfesionPersona(res.getString("profesion"));persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));miEmpleado.add(persona);}res.close();consulta.close();conex.desconectar();} catch (Exception e) {JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);}return miEmpleado;}/*** permite consultar la lista de empleados* @return*/public ArrayList< personavo> listaDePersonas() {ArrayList< personavo> miEmpleado = new ArrayList< personavo>();DbConnection conex= new DbConnection();try {PreparedStatement consulta = conex.getConnection().prepareStatement("SELECT * FROM persona");ResultSet res = consulta.executeQuery();while(res.next()){PersonaVO persona= new PersonaVO();persona.setIdPersona(Integer.parseInt(res.getString("id")));persona.setNombrePersona(res.getString("nombre"));persona.setEdadPersona(Integer.parseInt(res.getString("edad")));persona.setProfesionPersona(res.getString("profesion"));persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));miEmpleado.add(persona);}res.close();consulta.close();conex.desconectar();} catch (Exception e) {JOptionPane.showMessageDialog(null, "no se pudo consultar la Persona\n"+e);}return miEmpleado;}}

Por cuestiones de tiempo no realizaremos todo el CRUD, tan solo vamos a trabajar con los mtodos de registro y consulta (Los mtodos de actualizacin y eliminacin sern una buena tarea en casa ;) )

Cada mtodo usa la cadena de conexin creada anteriormente y se enfoca en una tarea en especifico, adems en cada uno hacemos uso de un objeto de tipoPersonaVO, mediante el cual asignamos la informacin de nuestra tablapersona,tanto para el registro como para la consulta de informacin.

Clase Principal.

En esta clase vamos a hacer el llamado a todos los procesos de nuestra aplicacin, tendremos un men en el cual presentamos todas las opciones del sistema, 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 conexin con la BD.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184package prueba.principal;import java.util.ArrayList;import javax.swing.JOptionPane;import prueba.dao.PersonaDAO;import prueba.vo.PersonaVO;public class Principal {PersonaDAO miPersonaDAO;/*** Mtodo principal, hace el llamado al men donde se* presentan todas las opciones del sistema* @param args*/public static void main(String[] args) {Principal miPrincipal = new Principal();miPrincipal.verMenu();}/*** Mtodo que permite presentar las opciones del sistema.* solicita el ingreso de un numero y se envia a su * correspondiente proceso*/private void verMenu() {String textoMenu="Men Principal\n\n";textoMenu+="Ingrese alguna de las opciones del Men \n";textoMenu+="1. Registrar Persona\n";textoMenu+="2. Consultar Persona\n";textoMenu+="3. Ver Lista Personas\n";textoMenu+="4. Salir.\n\n";try {int seleccion= Integer.parseInt(JOptionPane.showInputDialog(textoMenu));defineSeleccion(seleccion);} catch (NumberFormatException e) {JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +"solo se permiten valores nmericos","ERROR",JOptionPane.ERROR_MESSAGE);verMenu();} catch (Exception e) {JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +"solo se permiten valores nmericos","ERROR",JOptionPane.ERROR_MESSAGE);verMenu();}}/*** Permite determinar que accion ejecutar dependiendo del parametro de * ingreso correspondiente a las opciones del sistema* @param seleccion*/private void defineSeleccion(int seleccion) {System.out.println("Selecciona "+seleccion);switch (seleccion) {case 1:registrarPersona();verMenu();break;case 2:int doc=Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero" +" de documento de la persona"));buscarPersona(doc);verMenu();break;case 3:obtenerRegistros();verMenu();break;case 4:System.exit(0);break;default:JOptionPane.showMessageDialog(null, "Ingrese un " +"numero valido","ADVERTENCIA",JOptionPane.WARNING_MESSAGE);verMenu();break;}}/*** Permite solicitar los datos de la persona a registrar, se solicitan mediante* una ventana de ingreso y se almacenan en un arreglo con toda la informacion usando* para esto un ciclo for, posteriormente estos datos son almacenados en el* atributo correspondiente del objeto persona para ser enviado al metodo de registro* en la clase DAO*/private void registrarPersona() {miPersonaDAO = new PersonaDAO();PersonaVO miPersona=new PersonaVO();String mensajeIngreso="Ingrese\n\n";String datosSolicitados[] = {"Documento : ","Nombre : ","Edad: ","Profesin: ","Telefono: "};String datosPersona[] = new String[5];for (int i = 0; i < datosSolicitados.length; i++) {//solicita el ingreso del dato y se almacena en el arreglo de datosPersonadatosPersona[i]=JOptionPane.showInputDialog(null, mensajeIngreso+datosSolicitados[i],"Datos Persona",JOptionPane.INFORMATION_MESSAGE);System.out.println(datosSolicitados[i]+datosPersona[i]);}miPersona.setIdPersona(Integer.parseInt(datosPersona[0]));miPersona.setNombrePersona(datosPersona[1]);miPersona.setEdadPersona(Integer.parseInt(datosPersona[2]));miPersona.setProfesionPersona(datosPersona[3]);miPersona.setTelefonoPersona(Integer.parseInt(datosPersona[4]));miPersonaDAO.registrarPersona(miPersona);}/*** Permite obtener la lista de personas almacenada en la tabla persona* si la lista se encuentra vacia quiere decir que no hay personas registradas* acto seguido se presenta un mensaje en pantalla, sino se imprime la lista de * todas las personas registradas en la BD*/private void obtenerRegistros() {miPersonaDAO = new PersonaDAO();PersonaVO miPersona;//Se obtiene la lista de personasArrayList< personavo> listaPersonas = miPersonaDAO.listaDePersonas();//se valida si se obtubo o no informacionif (listaPersonas.size()>0) {int numeroPersona=0;//se recorre la lista de personas asignandose cada posicion en un objeto personafor (int i = 0; i < listaPersonas.size(); i++) {numeroPersona++;miPersona=listaPersonas.get(i);System.out.println("****************Persona "+numeroPersona+"**********************");System.out.println("Id Persona: "+miPersona.getIdPersona());System.out.println("Nombre Persona: "+miPersona.getNombrePersona());System.out.println("Edad Persona: "+miPersona.getEdadPersona());System.out.println("Profesin Persona: "+miPersona.getProfesionPersona());System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());System.out.println("*************************************************\n");}}else{JOptionPane.showMessageDialog(null,"Actualmente no " +"existen registros de personas","INFORMACIN",JOptionPane.INFORMATION_MESSAGE);}}/*** Permite la consulta de una persona en especifico mediante el envio de* su documento de identidad como parametro, en caso de que no se retorne* informacion se presenta un mensaje en pantalla, sino entonces se imprimen los* datos de la persona encontrada* @param documento*/private void buscarPersona(int documento) {miPersonaDAO = new PersonaDAO();PersonaVO miPersona;ArrayList< personavo> personasEncontrada = miPersonaDAO.consultarPersona(documento);//se valida que se encuentre la personaif (personasEncontrada.size()>0) {//se recorre la lista y se asignan los datos al objeto para imprimir los valoresfor (int i = 0; i < personasEncontrada.size(); i++) {miPersona=personasEncontrada.get(i);System.out.println("****************Persona*************************");System.out.println("Id Persona: "+miPersona.getIdPersona());System.out.println("Nombre Persona: "+miPersona.getNombrePersona());System.out.println("Edad Persona: "+miPersona.getEdadPersona());System.out.println("Profesin Persona: "+miPersona.getProfesionPersona());System.out.println("Telefono Persona: "+miPersona.getTelefonoPersona());System.out.println("*************************************************\n");}}else{JOptionPane.showMessageDialog(null,"El documento ingresado " +"no corresponde a ninguna persona","INFORMACIN",JOptionPane.INFORMATION_MESSAGE);}}}

Como se ve, tenemos la clase principal dividida en metodos para cada proceso, eso hace que podamos darle un tratamiento individual a cada uno, asi en caso de algun error facilmente podremos identificar en que metodo sucedio....... tambien vemos que en el mtodoverMenu()validamos por medio de bloquestry - catchlos posibles errores en el ingreso de datos por parte del usuario.

Ejecutando la Aplicacin.

Al ejecutar la aplicacin se presenta el men principal donde ingresamos las opciones correspondientes, pero hay que tener presente que previamente debimos haber agregado elmysql-connectoral build path del proyecto, sino nos aparecera algo como esto :

Para solucionarlo sobre el proyecto damosclic derecho/configure Build path..., buscamos al jar desde la ruta donde lo descargamos y damos ok

despus de esto ya tendremos nuestra aplicacin en funcionamiento

Como se mencion al principio, es una aplicacin bsica y no nos enfocamos en muchos detalles.........tan solo en la logica de conexin que nos servira como base para futuros desarrollos....

Mas adelante continuaremos con otros temas de interes donde aplicaremos los conceptos vistos en esta entrada!!!

Tambin te podra Interesar. Manejo de Excepciones en Java String Vrs StringBuffer Vrs StringBuilder ? Comparando Fechas En Java Integracin Continua, Primeros Pasos Con Jenkins Leer Archivo Properties en Java Tutorial Proyecto Web Con Eclipse Instalacin del servidor de aplicaciones JBoss Instalacin Apache ANT

Hay algo que quieras anexar o comentar sobre esta entrada? no dudes en hacerlo.....y si te gust, te invito a compartirySuscribirte ingresando albotn"Participar en este sitio" para darte cuenta de mas entradas como esta;)Manejo de Excepciones en JavaVamos a hablar un poco sobre las Excepciones en Java, que son?, de donde vienen? y como evitarlas entre, otras....... debemos tener presente que siempre estamos propensos a encontrarnos con errores o Excepciones cuando estamos desarrollando, por eso de la importancia de conocerlas y saber como tratarlas....

Bsicamente una excepcion es un Objeto descendiente de la clasejava.lang.Object, podemos pensar en ellas como una condicin excepcional en nuestro sistema el cual altera la correcta ejecucin del mismo, las excepciones nos indican que hay algo anmalo, inconsistente o simplemente un Error, lo cual impide que el sistema se ejecute como debera de ser...

Tal vez se preguntaran si pero Anmalo, inconsistente o Error no es bsicamente lo mismo?...... podra ser, pero en este enfoque no necesariamene lo es, ya que lo que vamos a conocer como una excepcion no siempre es un error (hablando como excepcion en general, ya que en java unaExceptiones muy diferente a unError), muchas veces necesitaremos trabajar con excepciones controladas para indicar alguna inconsistencia en nuestro sistema que podra provocar errores.......

A modo de ejemplo, podemos encontrarnos con el famosoNullPointerExceptionel cual nos indica que un objeto se encuentra vaci, pero esto no es un error ya que nosotros podemos trabajar con objetosnull, entonces veamoslo como si la excepcion nos dijera "Es un objeto nulo y no se puede efectuar el proceso", mientras que hay errores comoNoClassDefFoundErrorel cual nos indica que la maquina virtual de Java (JVM) no puede encontrar una clase que necesita, debido a por ejemplo que no encuentra un .class, esto si se maneja como un error en java

Para hacer mas claridad sobre el tema veamos la Jerarqua de Excepciones de Java (puede que no se encuentren algunas excepciones, pero se contemplan las mas comunes)

Jerarqua de excepciones

Vemos que se tiene un claro rbol de herencia mediante el cual se pueden definir las categoras de Excepciones o de Error que se puede dar en el sistema.

La importancia de Prever!!!

Cuando se esta programando debemos tener claro que nuestro cdigo no es perfecto, as tengamos mucha experiencia en desarrollo siempre esta la posibilidad de que algo falle, sea por nuestro cdigo o por otros factores, por eso de la importancia de contemplar todo desde antes, posibles fallos o lo que pueda afectar el sistema.

Veamos un ejemplo Simple:123456private void metodoDividir(int dividendo, int divisor){String resultado+=dividendo/divisor;System.out.println(resultado);}

elmetodoDividir(int, int)tericamente esta bien, claro, a simple vista si tenemos :dividendo = 4ydivisor = 2pues el resultado es2......bsico....... pero y si eldivisor es 0? pues con ese caso puntual el resultado seria el siguiente.

Vemos que nos indican que se produjo unaArithmeticExceptiondebido a una divisin por cero, adems se muestra cual fue la traza del error pasando por el mtodo main hasta elmetodoDividir().

La anterior es una Excepcion simple, algo que se supone no debera pasar, es obvio, no se puede dividir por cero, o no?.........pues no,en programacin no podemos asumir ni pensar as, ya que muchas veces nos olvidamos de las cosas obvias y las pasamos por alto, el problema es que eso tan obvio puede detener toda la ejecucin del programa.

Trabajando con try - catch - finally

con los bloquesTry - Catchpodemos capturar y procesar una posible excepcion, evitando que el sistema se detenga sin necesidad cuando el motivo de esto puede ser corregido facilmente, la estructura bsica es la siguiente.1234567try {//Bloque de cdigo que vamos a procesar} catch(excepcion) {//Tratamiento que se le da a la posible excepcin} finally {//Bloque de cdigo que se ejecutar despues del try o del catch}

Apliquemos esto a nuestro ejemplo anterior...12345678910111213private void metodoDividir(int dividendo, int divisor){String resultado="";try {resultado+=dividendo/divisor;}catch (Exception e) {resultado="Se intent dividir por cero";JOptionPane.showMessageDialog(null,"Error: No se puede dividir por cero ","Advertencia",JOptionPane.WARNING_MESSAGE);}finally{System.out.println("Termino el proceso : el resultado es = "+resultado);}}

Como vimos aplicamos la estructura de los bloques y de esta manera nos aseguramos que la excepcin anterior fue controlada evitando que el sistema se detenga, en elcatchpodemos hacer el proceso que consideremos conveniente, ya sea solo informar del error o solicitar nuevos parmetros de entrada.

la salida es la siguiente:

Algunas Consideraciones.

Veamos un poco mas lo que debemos tener en cuenta cuando usamos estos bloques:

try: Aqu vamos a escribir todo el bloque de cdigo que posiblemente llegue a lanzar unas excepcin la cual queremos manejar, aqu va tanto el cdigo como llamados a mtodos que puedan arrojar la excepcin.

En este bloque solo se detectara la primera excepcion lanzada, hay que tener en cuenta que por cada try se debe especificar un catch y/o un finally.

catch: en caso de que en el try se encuentre alguna excepcin, se ingresara automaticamente al bloque catch donde se encontrara el cdigo o proceso que queremos realizar para controlar la excepcin.

Se pueden especificar cualquier cantidad de catch de ser necesario, estos deben ser ubicados despus del try y antes del finally (en caso de que este ultimo se especifique), cada catch que se ponga debe manejar una excepcion diferente (no se puede repetir) y el orden de estos depende de la jerarqua de herencia que se tenga, ingresando al primer catch que pueda suplir la necesidad a corregir, por ejemplo.123456789try {//Sentencias con posibles errores;} catch(InterruptedException e){//manejo de la exepcion} catch(IOException e){//manejo de la exepcion} catch(Exception e){//manejo de la exepcion}

Si se genera una excepcin en el try, se valida a cual de los 3 catch se ingresa, dependiendo si InterruptedException puede controlarlo se ingresa a esa, sino entonces a IOException o si no a la superClase que seria Exception (ver la jerarqua de herencia anterior).

En el ejemplo que del metodoDividir() trabajamos directamente con Exception e, de esta forma nos aseguramos que capture cualquier excepcin, sin embargo se recomienda usar la jerarqua en los catch para poderle dar un mejor manejo.

finally: Este bloque es opcional, lo podremos si queremos ejecutar otro proceso despus del try o el catch, es decir, siempre se ejecutara sin importar que se encuentre o no una excepcin.

Conclusiones.Esta entrada es un abrebocas de lo que son el manejo de excepciones, ya que un solo post no es suficiente para todo lo que tiene que ver con ellas, quedan pendiente definir aspectos comocheckedyunchecked(ya que aqu esto se trabajo de forma muy general) o la forma de crear nuestras propias excepciones, propagacin, clausulas throws entre otras.

En general vimos la importancia de controlar excepciones ya que eso hace parte de la seguridad y calidad de nuestros desarrollos, mas adelante se irn vinculando en otros post el uso de las mismas.........Conceptos Bsicos de Programacin Orientada a ObjetosEn esta entrada veremos algunos conceptos de la programacin orientada a Objetos (POO)...............................................Muchas veces cuando empezamos a trabajar con lenguajes de programacin nos dicen que son orientados a Objetos y nos dan la teora del"porqu"pero puede que al trabajar con ellos en la practica no sepamos interpretarlo desconociendo el"como", y entonces seguimos desarrollando por simple inercia porque as fue que aprendimos pero tal vez no de la forma mas ptima.

Vamos a ver algunos conceptos de POO de forma general, mas adelante trabajaremos estos conceptos en casos prcticos para ver su aplicacin...... Empecemos!!!

Programacin OO.

La programacin orientada a Objetos bsicamente define una serie de conceptos y tcnicas de programacin para representar acciones o cosas de la vida real basada en objetos, a diferencia de otras formas de programacin como por ejemplo la estructurada, con la POO trabajamos de manera distinta vinculando diferentes conceptos tales como clases, objetos, mtodos, propiedades, estados, herencia, encapsulacin entre otros, 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.

Veamos algunos de los conceptos principales.....

Clases.

Las clases son uno de los principales componentes de un lenguaje de programacin, pues en ellas ocurren todos los procesos lgicos requeridos para un sistema, en si podemos definirlas como estructuras que representan objetos del mundo real, tomando como objetos a personas, lugares o cosas, en general las clases poseen propiedades, comportamientos y relaciones con otras clases del sistema. (Ver Ejemplo...)

una clase se compone por tres partes fundamentales:

Nombre: Contiene el Nombre de la Clase.Atributos: Representan las propiedades que caracterizan la clase.Mtodos: Representan el comportamiento u operaciones, la forma como interacta la clase con su entorno.

En java se representa as :

1234567891011/**Principal define el nombre de la Clase*/public class Principal {public String atributo="Esto es un atributo";/**Esto es un mtodo, donde se definen las operaciones*/public void metodo(){/**aqui van las sentencias que definen* el comportamiento del mtodo*/}}

Objeto.Los objetos representan una entidad concreta o abstracta del mundo real, en programacin bsicamente se le conoce como la instancia de una clase en si es lo que da el sentido a estas.

Al igual que las clases se componen de tres partes fundamentales:

Estado: Representa los atributos o caractersticas con valores concretos del objeto.Comportamiento: Se define por los mtodos u operaciones que se pueden realizar con el.Identidad: Es la propiedad nica que representa al objeto y lo diferencia del resto.

en la imagen, los moldes representan las clases, mientras que las galletas obtenidas de estos moldes representan los objetos instancias de estas clases, por ejemplo atributos del objeto galleta podra ser sabor, color, tamao etc......

En java se representa creando una instancia de la clase por medio de la palabranewal hacer eso creamos el objeto de la clase y podemos hacer uso de los mtodos o atributos de esta (dependiendo de la visibilidad de los mismos ) por medio de un punto (.) as:1234/**Creamos el objeto como instancia de la clase Principal*/Principal miObjeto= new Principal();miObjeto.atributo="Este es el nuevo valor del atributo para el objeto";miObjeto.metodo();

Herencia.La herencia en javarepresentalo que conocemos de herencia en el mundo real, bsicamente mediante esta obtenemos las caractersticas o rasgos comunes de nuestros padres o abuelos, en java es el mismo enfoque permitiendo la creacin de nuevas clases basadas en clases ya existentes, con las cuales podemos obtener las caractersticas de las clases padres, heredando campos, atributos, mtodos o funcionalidades.

En Java solo se puede heredar de una sola clase padre y se representa mediante la palabraextends (Ver Ejemplo...)

12345678910111213141516171819202122232425public class Animal{public String tamao;public void comer(){/**Comportamiento.....*/}}class Perro extends Animal{public int dientes;public void correr(){/**Comportamiento.....*/}}class Paloma extends Animal{public int plumas;public void volar(){/**Comportamiento.....*/}}

Encapsulamiento.Este concepto es uno de los mas importantes en trminos de seguridad dentro de nuestra aplicacin, la encapsulacin es la forma de proteger nuestros datos dentro del sistema, estableciendo bsicamente los permisos o niveles de visibilidad o acceso de nuestros datos

Se representa por 3 niveles :

Pblico: Se puede acceder a todos los atributos o mtodos de la clase.Protegido: Se puede acceder a los atributos o mtodos solo en la misma jerarqua de herencia.Privado: Solo se puede acceder a los atributos o mtodos de la clase en la que se encuentran.

con la Encapsulacin mantenemos nuestros datos seguros, ya que podemos evitar que por ejemplo se hagan modificaciones al estado o comportamiento de un objeto desde una clase externa, una buena practica es trabajar conmtodossetterygetterque permiten manipular nuestros datos de forma segura.

en Java lo representamosas:1234567891011121314151617public class Principal{public String atributo1;private String atributo2;protected String atributo3;/**Mtodos Set y Get para trabajar con las variables*/public String getAtributo2() {return atributo2;}public void setAtributo2(String atributo2) {this.atributo2 = atributo2;}}

Clases Abstractas.La abstraccin permite resaltar la parte mas representativa de algo, ignorando detalles para centrarse en lo principal.

La imagen es muy fcil de identificar, con base a ella podemos crear una clase persona, o laclase hombre, humano entre otras, pero obviamente vemos que la imagen no tiene elementos como ojos, nariz, boca, rostro en general, ni dedos, pies, manos o cuello....... pero entonces porque decimos que es una persona?.........Precisamente aqu estamos aplicando el concepto de abstraccin, ya que nos fijamos en lo mas representativo de algo, en este caso vemos que se tiene una cabeza, tronco, brazos y pies, con esto es suficiente para saber que es una persona sin fijarnos en los detalles mencionados anteriormente.Las clases abstractas permiten crear mtodos generales con un comportamiento comn para otras clases concretas sin importar sus caractersticas ni el comportamiento que usen para dichos mtodos.

La Abstraccin en java solo tiene lgica mediante la Herencia, ya que una clase abstracta posee al menos un mtodo abstracto el cual no tiene implementacin, el comportamiento de estos mtodos lo definen las clases concretas que lo hereden.Podemos usarlos cuando existan varias clases con caractersticas o acciones comunes pero con diferentes comportamientos..............mediante el uso de la herencia y componentes abstractos hacemos mas ptima y organizada nuestra aplicacin. (hay que tener en cuenta que a diferencia de las clases concretas, las clases abstractas no se pueden instanciar). (Ver Ejemplo...)

En Java representamos la abstraccin mediante la palabra reservadaabstract, as:

123456789101112131415public abstract class Principal{/**Mtodo Abstracto sin implementacin*/public abstract void metodoAbstracto();}class subClase extends Principal{@Overridepublic void metodoAbstracto() {/**Implementacin definida por la clase concreta*/}}

Interfaces.

Las interfaces son el mecanismo que utiliza Java para simular la herencia mltiple, 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, bsicamente son clases completamente abstractas, es comn relacionarlas con un contrato en el que se define que se debe hacer, as cada clase concreta que implemente una interfaz esta obligada a implementar todos los mtodos que la compongan.

las interfaces definen lo que la clase que la implemente deber hacer, mas no la forma como lo har.

al decir que las interfaces son clases completamente abstractas significa que todos sus mtodos lo son y por ende no poseen implementacin, no requieren el uso de la palabra reservadaabstract, ya que al ser completamente abstracta todo dentro de ella lo es, al igual que las clases abstractas la implementacin de losmtodosdepende de las clases concretas que las usen.

Se debe tener en cuenta que toda variable definida en una interfazautomticamentese convierte en una constante, adems tampoco se puede instanciar una interfaz..... (Ver Ejemplo...)

En java se representan con la palabrainterfacey se usan con la palabraimplementsas:12345678910111213141516171819interface InterfacePrincipal {public void metodoAbstracto();public String otroMetodoAbstracto();}public class Principal implements InterfacePrincipal{public void metodoAbstracto() {/**Implementacin definida por la clase concreta*/}public String otroMetodoAbstracto() {/**Implementacin definida por la clase concreta*/return "retorno";}}

Polimorfismo.

Este tal vez sea uno de los conceptos de la programacin orientada a objetos mas usados pero muchas veces sin saber que se aplica ya que el concepto inicialmente puede ser un poco confuso, bsicamente mediante el polimorfismo programamos de forma general en lugar de hacerlo de forma especifica, se usa cuando se trabajen con la herencia y objetos de caractersticas comunes los cuales comparten la misma superClase y rbol jerrquico, al trabajar con este concepto optimizamos y simplificamos en gran medida nuestro trabajo.

bsicamente podemos definirlo como la capacidad que tienen los objetos de comportarse de mltiples formas sin olvidar que para esto se requiere de la herencia, en si consiste en hacer referencia a objetos de una clase que puedan tomar comportamientos de objetos descendientes de esta.

con el polimorfismo usamos la generalizacin olvidando los detalles concretos de los objetos para centrarnos en un punto en comn mediante una clase padre.

Tomando como ejemplo la imagen anterior, podemos decir que un objeto de la claseFiguraGeometricapuede usarse para referirse a cualquier objeto de cualquiersubClasedeFiguraGeometrica.............. en otras palabras una figura geomtrica puede ser un cuadro, un tringulo, un cuadrado o cualquier figura que en trminos generales sea geomtrica...... (Ejemplo1) (Ejemplo2)

Veamos este proceso como se representa en Java.

12345678910111213141516171819202122232425262728293031323334class FiguraGeometrica{}class Cuadrado extends FiguraGeometrica {}class Triangulo extends FiguraGeometrica {}class Circulo extends FiguraGeometrica{}public class Principal{public void metodo(){/**Puedo crear objetos concretos*/FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();Cuadrado miCuadro=new Cuadrado();/**Puedo crear objetos polimorficos*/miFiguraGeometrica=miCuadro;/**Objeto Cuadrado de tipo FiguraGeometrica*/FiguraGeometrica miCuadrado= new Cuadrado();/**Objeto Circulo de tipo FiguraGeometrica*/FiguraGeometrica miCirculo=new Circulo();/**Objeto Triangulo de tipo FiguraGeometrica*/FiguraGeometrica miTriangulo=new Triangulo();}}

Como vemos en el ejemplo la clase FiguraGeometrica puede convertirse en cualquier figura que se encuentra en su jerarqua de Herencia pudiendo utilizar las propiedades que compartan entre ellas, hay que tener presente que solo se permite elpolimorfismode clases padre a clases hija mas no al contrario, mas adelante explicaremos este concepto en detalle...

Hasta aqu vimos algunos de los principales conceptos de la programacin Orientada a Objetos, en futuras entradas trabajaremos otros ejemplos y aplicaciones, ya que cada concepto posee sus restricciones con respecto al proceso de desarrollo. String Vrs StringBuffer Vrs StringBuilder ?Esta entrada hace parte de algunas enfocadas a repasos o conceptos de Java, en esta ocasin trabajaremos con las ClasesString,StringBufferyStringBuilderlas cuales permiten el trabajo con cadenas de caracteres, a continuacin veremos algunos ejemplosbsicoscon estas Clases y sus mtodos principales y mas adelante las compararemos a nivel de rendimiento....

La Clase String.Es comn 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.

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, es decir que dicho objeto no puede cambiar, si modificamos nuestro String inicial, en realidad lo que hacemos es crear un nuevo objeto de tipo String......Para crear Objetos de la clase String se puede realizar de 2 formas, mediante su constructor o a partir de cadenas constantes o literales:Ej:

String cadena1 = "CoDejaVu"; oString cadena2 = new String("CoDejaVu");

cualquiera de las 2 formas anteriores es valida, 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, mientras que en la primera se haceimplcitoy directo....

AlgunosMtodosde la Clase String

charAt(int): Permite retornar uncaracterdel String dependiendo del ndice enviado comoparmetro.indexOf(String): Permite retornar el ndice desde donde inicia la cadena enviada como parametro.length(): Retorna el tamao basado en la cantidad de caracteres que posee la cadena.replace(Char,Char): Busca en la cadena inicial donde se encuentre el carcter o cadena enviada en el segundo parmetro y la reemplaza por el primero.toUpperCase(): Convierte toda la cadena en maysculas.toLowerCase(): Convierte toda la cadena en minsculas.trim(): Elimina los espacios en blanco al inicio y final de la cadena.concat(String): Concatena el String enviado como parmetro a la cadena original (este metodo tiene su equivalente al usar el operador +)substring(int): Elimina la cadena desde la posicin 0 hasta la enviada por parmetro -1substring(int,int):Elimina la cadena desde la posicin del primer parmetro hasta la posicin del segundo.equalsIgnoreCase(String): Indica si dos cadenas son iguales, sin tener en cuenta lasmaysculas.

Existen muchos mas mtodos de la clase String, sin embargo estos son algunos a mi parecer mas importantes (Necesitaramosmuchas mas entradas para hablar solo del String :S ), ahora veamos como funcionan, para esto creamos el siguiente mtodo...123456789101112131415161718192021222324252627282930private void metodosString() {String cadena1=" Esto Es Un String ";/**Imprime la cadena original*/System.out.println("Cadena Original = "+cadena1);/**retorna la letra s (cuenta tomando el primer caracter como 0 )*/System.out.println("Usando charAt(2) = "+cadena1.charAt(2));/**retorna la posicion 9 (cuenta tomando el primer caracter como 0 )*/System.out.println("Usando indexOf(\"Un\") = "+cadena1.indexOf("Un"));/**retorna el tamao 19 */System.out.println("Usando length() = "+cadena1.length());/**reemplaza la cadena "un" por la cadena "xxx"*/System.out.println("Usando replace(\"Un\", \"xxx\") = "+cadena1.replace("Un", "xxx"));/**convierte la cadena en mayusculas*/System.out.println("Usando toUpperCase() = "+cadena1.toUpperCase());/**convierte en minusculas*/System.out.println("Usando toLowerCase() = "+cadena1.toLowerCase());/**Elimina los espacios en blanco al principio y final de la cadena*/System.out.println("Usando trim() = "+cadena1.trim());/**Concatena al String el valor enviado*/System.out.println("Usando concat(\" En CoDejaVu\") = "+cadena1.concat("En CoDejaVu"));/**elimina la cadena de la posicion 0 a la 5*/System.out.println("Usando substring(6) = "+cadena1.substring(6));/**elimina la cadena de la posicion 4 a la 14*/System.out.println("Usando substring(4, 14) = "+cadena1.substring(4, 14));/**indica si dos cadenas son iguales, enviamos la misma cadena, retorna true*/System.out.println("Usando equalsIgnoreCase(cadenaOriginal) = "+cadena1.equalsIgnoreCase(cadena1));/**indica si dos cadenas son iguales, enviamos otra cadena, retorna false*/System.out.println("Usando equalsIgnoreCase(otroString) = "+cadena1.equalsIgnoreCase("Otro String")); }

Al ejecutar el metodoString() obtenemos los siguientes resultados.

Podemos ver las funciones de los mtodos mencionados, sin embargo hay que tener en cuenta que en el ejemplo anterior trabajamos siempre con el Objeto String inicial, ya que en ningn momento le asignamos ningn valor ni creamos otro explicitamente, si imprimimos la cadena original nos arroja " Esto Es Un String ".....

Las Clases StringBuffer y StringBuilder.

En estas clases a diferencia de la Clase String las cadenas si se pueden modificar trabajando desde el objeto original, recordemos que si hacemos un cambio en un objeto String en realidad estamos trabajando con un nuevo Objeto (es decir si tenemoscadena=cadena+"hola";en realidad lo que hacemos es crear un nuevo objeto String apuntando a la misma referencia del Objeto Cadena...)mientras que con StringBuffer o StringBuilder siempre trabajamos desde el mismo Objeto aprovechando el mismo espacio de memoria.

La forma de crear un Objeto de alguna de estas clases es la siguiente.

StringBuffer cadena1=new StringBuffer("CoDejaVu"); yStringBuilder cadena2=new StringBuilder("CoDejaVu");

Cuando vamos a utilizar muchas cadenas podemos usar estas clases ya que al trabajar con el mismo objeto original hacen mas optimo el proceso, StringBuffer y StringBuilder sonprcticamenteiguales (posenla misma API), la diferencia es que StringBuilder no es Multihilo, es decir, sus metodos no se encuentran sincronizadoshacindolaun poco mas veloz que su equivalente StringBuffer por eso se recomienda que al trabajar con hilos se use esta ultima en vez de StringBuilder....

AlgunosMtodosdeStringBuffer y StringBuilder.

appened(String): Concatena la cadena enviada comoparmetro, estemtodoes sobrecargado, quiere decir que acepta cualquier tipo de dato.delete(int_inicial, int_final): Elimina la cadena desde la posicin inicial hasta la final.insert(int, String): Inserta la cadena enviada en la posicin definida, estemtodoes sobrecargado, quiere decir que acepta cualquier tipo de dato.replace(int_inicial, int_final, String): Reemplaza la cadena enviada en las posiciones de la inicial a la final.reverse():imprime la cadena alrevs.

Igual que en el ejemplo de la clase Stringexistenmuchos masmtodos pero estos son solo algunos, se recomienda consultar en la API de java sobre estos.......veamos un pequeo ejemplo del funcionamiento.................como lo mencionamos anteriormente dichas clases comparten la misma API por lo cual usan los mismosmtodos, por eso solo mostraremos el ejemplo usando StringBuilder....123456789101112131415private void metodosStringBuilder() {StringBuilder cadena1=new StringBuilder(" Esto Es Un StringBuilder ");/**Imprime la cadena original*/System.out.println("Cadena Original = "+cadena1);/**concatena la cadena enviada como parametro*/System.out.println("Usando append(\"En CoDejaVu\") = "+cadena1.append("En CoDejaVu"));/**Elimina la cadena desde la posicion inicial hasta la final*/System.out.println("Usando delete(32, 37) = "+cadena1.delete(32, 37));/**Inserta la cadena enviada desde la posicion inicial*/System.out.println("Usando insert(32, String) = "+cadena1.insert(32, "ejaVu Otra Vez"));/**Reemplaza la cadena enviada en las posiciones definidas*/System.out.println("Usando replace(2, 4, String) = "+cadena1.replace(2, 4, "xxx"));/**Imprime la cadena en reversa*/System.out.println("Usando reverse() = "+cadena1.reverse());}

Al ejecutar elmtodoanterior obtenemos el siguiente resultado:

a diferencia del ejemplo usando String,aqutodas las operaciones se asignan al objeto inicial, evidenciando que este cada vez va cambiando dependiendo de losmtodosque utilicemos.

String Vrs StringBuffer Vrs StringBuilder

Con lo anterior podemos decir que las 3 clases sirven para lo mismo, es mas, 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 procesoimplcito, o que con el "+" podemos evitar el uso del concat() o con el "+=" podemos realizar la operacin y asignarla directamente al objeto String tal como se hace con algunos tipos de datos primitivos entre otras facilidades que nos brinda................ y a decir verdad casi todos nos acostumbramos a usar String por estas y otras razones, sin embargo a nivel de rendimiento son mucho mas efectivas las otras clases que estamos evaluando, ya que como dijimos los String son inmutables por ende dependiendo de lo que realicemos cada vezcrearamosobjetos de este tipo y dependiendotambinde la cantidad de cadenas que usemos esto seria una carga en tiempo de ejecucin, puessetendrauna gran cantidad de objetos en memoria....

A diferencia de este, StringBuffer y StringBuilder siempre trabajarn con el mismo objeto inicial y de esta manera la carga en el heap sera mucho menor.

Como experiencia personal, alguna vez un compaero y yo desarrollamos una aplicacin en la cual se Debin realizar muchas operaciones con cadenas las cuales se concatenaban y mostraban en consola, inicialmente usamos obtejos String pero a medida que crecan los datos este proceso tomaba demasiado tiempo hasta que decidimos usar objetos StringBuffer y de esta manera el tiempo se redujo significativamente.

A continuacin veremos un ejemplo muy comn donde podremos simular lo anterior, en este ejemplo se solicita el ingreso de un texto y se calcula la velocidad de concatenacin para cada uno de los 3 casos, el calculo se realiza en ciclos (for) cada uno con una constante de 100000 iteraciones, se evidencia la diferencia de tiempos respectivamente.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081/*** @author HENAO**/public class Cadenas {/*** constante que determina el numero de repeticiones * en cada uno de los tres metodos de concatenacion*/public final long ITERA = 100000;/**determina el tiempo total de concatenacion*/private long tiempo;/*** @param args*/public static void main(String[] args) {Cadenas objetoCadenas=new Cadenas();String valorCadena="CoDejaVu";String usoString=objetoCadenas.calculaTiempoString(valorCadena);String usoStringBuffer=objetoCadenas.calculaTiempoStringBuffer(valorCadena);String usoStringBuilder=objetoCadenas.calculaTiempoStringBuilder(valorCadena);System.out.println("Tiempo Concatenacion String : "+usoString+"\nTiempo Concatenacion StringBuffer : "+usoStringBuffer+"\nTiempo Concatenacion StringBuilder : "+usoStringBuilder); }/*** Metodo que calcula el tiempo de concatenacion de la cadena* usando la clase String* @param valor dato ingresado por el usuario* @return tiempo en milisegundos*/public String calculaTiempoString(String valor) {String cadena = "";tiempo = System.currentTimeMillis();for (int i = 0; i < ITERA ; i++) {cadena += valor;}tiempo = System.currentTimeMillis() - tiempo;return tiempo + " milisegundos";}/*** Metodo que calcula el tiempo de concatenacion de la cadena* usando la clase StringBuffer* @param valor dato ingresado por el usuario* @return tiempo en milisegundos*/public String calculaTiempoStringBuffer(String valor) {StringBuffer cadena = new StringBuffer();long tiempo = System.currentTimeMillis();for (int i = 0; i < ITERA ; i++) {cadena.append(valor);}tiempo = System.currentTimeMillis() - tiempo;return tiempo + " milisegundos";}/*** Metodo que calcula el tiempo de concatenacion de la cadena* usando la clase StringBuilder* @param valor dato ingresado por el usuario* @return tiempo en milisegundos*/public String calculaTiempoStringBuilder(String valor){StringBuilder cadena = new StringBuilder();tiempo = System.currentTimeMillis();for (int i = 0; i < ITERA ; i++) {cadena.append(valor);}tiempo = System.currentTimeMillis() - tiempo;return tiempo + " milisegundos";}}

De esta manera obtenemos el siguiente resultado:

y podemos ver la gran diferencia entre los diferentes tipos de objetos, dependiendo de la cantidad de cadenas con las que vamos a trabajar estos resultados varan y en ocasiones el tiempo de concatenacin del StringBuffer es igual al del StringBuilder pues como ya mencionamos comparten la misma API, pero siempre se presentar una gran distancia con respecto al String.

Conclusin.

Como conclusin, vimos las diferentes formas que tenemos al momento de trabajar con datos de tipo cadena, se recomienda usar objetos String cuando no tengamos que manipular gran cantidad de cadenas y que estas no vayan a cambiar, usaremos StringBuffer cuando necesitemos trabajar con cadenas cambiantes adems de que tambin trabajemos con varios hilos y StringBuilder cuando no trabajamos con hilos o solo se tiene uno en ejecucin.Comparando Fechas En JavaEn esta entrada veremos uno de los procesos obligados cuando se trabaja en este campo del desarrollo de Software, sin importar el lenguaje que manejemos en algn momento tendremos que realizar operaciones con fechas.

En esta Ocasin y gracias a la inquietud de alguien vamos a realizar un pequeo ejemplo de como comparar dos fechas, veremos una forma fcil para definir si una fecha es menor, mayor o igual a otra, para esto usaremos la clasejava.util.DateEn el siguiente ejemplo asumiremos que ingresamos una fecha a nuestra aplicacin y vamos a compararla con la fecha actual del sistema, para esto almacenaremos la fecha ingresada con un formato "dd/mm/yyyy" , luego obtendremos la fecha del sistema y la convertiremos a este formato para poder realizar las comparaciones.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/*** @author HENAO**/public class Principal {/*** @param args*/public static void main(String[] args) {/**Objeto de la clase */Principal objetoPrincipal=new Principal();String fecha1 = "12/05/2013"; String fecha2 = "13/05/2013"; String fecha3 = "14/05/2013"; /**Obtenemos la fecha del sistema y la convertirmos al String* con el formato en el que vamos a trabajar*/Date fechaActual = new Date();SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");String fechaSistema=formateador.format(fechaActual);/**Realizamos los llamados a los metodos de ejemplo*/System.out.println("\n********************************" +"****************************\n");String resultadoMenor=objetoPrincipal.compararFechasConDate(fecha1,fechaSistema);System.out.println(resultadoMenor+"\n");System.out.println("******************************" +"******************************\n");String resultadoIgual=objetoPrincipal.compararFechasConDate(fecha2,fechaSistema);System.out.println(resultadoIgual+"\n");System.out.println("******************************" +"******************************\n");String resultadoMayor=objetoPrincipal.compararFechasConDate(fecha3,fechaSistema);System.out.println(resultadoMayor+"\n");System.out.println("*****************************" +"*******************************\n");}/*** Comparamos las Fechas* @author CHENAO* @param fecha1* @param fechaActual* @return*/private String compararFechasConDate(String fecha1, String fechaActual) { System.out.println("Parametro String Fecha 1 = "+fecha1+"\n" +"Parametro String fechaActual = "+fechaActual+"\n"); String resultado="";try {/**Obtenemos las fechas enviadas en el formato a comparar*/SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy"); Date fechaDate1 = formateador.parse(fecha1);Date fechaDate2 = formateador.parse(fechaActual);System.out.println("Parametro Date Fecha 1 = "+fechaDate1+"\n" +"Parametro Date fechaActual = "+fechaDate2+"\n");if ( fechaDate1.before(fechaDate2) ){resultado= "La Fecha 1 es menor ";}else{if ( fechaDate2.before(fechaDate1) ){resultado= "La Fecha 1 es Mayor ";}else{resultado= "Las Fechas Son iguales ";} }} catch (ParseException e) {System.out.println("Se Produjo un Error!!! "+e.getMessage());} return resultado;}}

Y listo, Si verificamos el proceso Obtenemos los siguientes resultados.

Podemos evidenciar que la comparacin se realiz con las 3 fechas y gracias al mtodobeforesabemos cual es menor, mayor o si son iguales....Leer Archivo Properties en JavaEn el segundo Post de este blog se mencion la intencin de publicar entradas sobre diversos temas, algunos complejos otros no tanto.........hasta aqu se han publicado cositas no tan complejas pero que pueden llegar a ser enredadas o de cuidado.

En esta ocasin veremos una entrada sobre algo simple y fcil de entender pero que nos puede ser de mucha ayuda.

Veremos de forma breve como trabajar con un archivo de propiedades desde java, estos archivos son simplemente ficheros de texto que podemos usar para almacenar informacin, inicializar variables, establecer mensajes o en general definir parmetros (en tutoriales anteriores hicimos uso de este tipo de archivos para definir rutas de servidores o parametros de configuracin).

En java trabajaremos conjava.util.Propertiesdonde bsicamente necesitamos especificar nuestros parmetros mediante la combinacin "Clave - Valor" y usar los mtodos bsicos que esta clase nos prove, un ejemplo simple puede darse con el tema de la internacionalizacin, podemos crear archivos properties para definir todos los labels o etiquetas que usaremos en la aplicacin para diferentes idiomas y dependiendo del idioma que escogemos buscamos el valor a presentar en pantalla en su archivo correspondiente.

Otro ejemplo es que en la empresa donde trabajo nos encontramos desarrollando una aplicacin que genera una serie de reportes de Excel y se deben almacenar en unas rutas especificas, son muchos reportes que se almacenan en rutas diferentes, por eso podramos hacer que esas rutas de directorios se puedan parametrizar en un archivo properties y no quemadas en cdigo.

Empecemos!!!

Para este caso vamos a crear un proyecto Java bsico, donde definiremos dos paquetes, uno para las clases y otro para elarchivo.properties.

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 extensin del archivo.

Despus de esto ya contamos con un panel donde podemos editar el archivo de propiedades, presionando el botnAddpodemos empezar a agregar parmetros con la combinacinClave - Valor.

O desde la vista Source podemos agregarlos directamente.

Para poder acceder a estos datos desde el cdigo fuente, haremos uso de los mtodos load y getProperty que nos provee la clase Properties.

En la clase principal de nuestra aplicacin creamos un mtodo donde realizaremos el cargue y obtencin de datos desde el archivo de propiedades.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package clases;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.Properties;/*** @author CHENAO* */public class Principal {public static void main(String arg[]) {Principal miPrincipal = new Principal();miPrincipal.leerArchivo();}/*** Lee un archivo de propiedades desde una ruta especifica* y se imprime en pantalla.*/private void leerArchivo() {try {/**Creamos un Objeto de tipo Properties*/Properties propiedades = new Properties();/**Cargamos el archivo desde la ruta especificada*/propiedades.load(new FileInputStream("D:/HENAO/codejavu/Workspace/PruebaProperties/src/properties/archivo.properties"));/**Obtenemos los parametros definidos en el archivo*/String nombre = propiedades.getProperty("nombre");String pagina = propiedades.getProperty("pagina");/**Imprimimos los valores*/System.out.println("Nombre: "+nombre + "\n" +"Pagina: "+ pagina);} catch (FileNotFoundException e) {System.out.println("Error, El archivo no exite");} catch (IOException e) {System.out.println("Error, No se puede leer el archivo");}}}

Al correr nuestra aplicacin podemos ver como se obtienen los datos desde la ruta enviada en el mtodo load.

si queremos podemos almacenar el archivo en otra ruta, por ejemplo la del servidor de aplicaciones y luego enviarla como parmetro...................................... al final la salida esTutorial Proyecto Web Con Eclipse

Si se han seguido todos los tutoriales anteriores (Instalacin Eclipse,Instalacin Plugin,Instalacin Servidor), ha estas alturas ya debemos tener nuestro ambiente de desarrollo listo para trabajar.En este tutorial vamos a crear un proyecto Web con un pequeo Demo de aplicacin funcional, Mediante eclipse crearemos un nuevo proyecto JSF (Java Server Faces) y realizaremos una serie de configuraciones que nos permitirn generar nuestro cdigo fuente Base desde el cual podremos seguir trabajando.......................Empecemos.

Requisitos.

IDE EclipsePlugin JBoss ToolsJBoss 4.2.3.GAJDK 1.6Variable de Entorno JBOSS_HOMEVariable de Entorno JAVA_HOME

Creacin Del Proyecto.

Desde Eclipse vamos a"File/New/Other..."all se cargar una ventana donde ingresaremos en el campo la palabra jsf, de esta forma nos aparece la opcin de JSF Project (Recordemos que para que esta opcin este disponible, debe estar previamente instalado el plugin JBoss Tools), la seleccionamos y damos click enNext

Posteriormente ingresamos el nombre del proyecto, dejamos el campo por defecto JSF Environmenty seleccionamos en Template la opcinJSFKickStartWithoutLibs, con esto,le decimos a Eclipse que vamos a crear un demo de una aplicacin web (el demo es muy bsico pero cuenta con interfaz grfica, bean y reglas de navegacin), sino entonces crearamos el proyecto en blanco, solo con la estructura y configuracin inicial.

PresionamosNext,acto seguido se carga una ventana donde debemos configurar el servidor de nuestra aplicacin, (eso sucede porque no se asign previamente el servidor) indicndonos que el server es requerido, presionamos enNewpara asociar el servidor.

Se cargar una ventana donde seleccionaremos el server con el que vamos a trabajar, para este caso usaremosJBoss4.2.3.GAque instalamos previamente en algn directorio de nuestra mquina.

Damos Click enNexty se carga otra ventana indicndonos que se debe asignar la ruta donde se encuentra alojado server, para esto presionamos en el botnBrowse y buscamos el directorio de instalacin del JBoss

Despus de encontrar el directorio lo seleccionamos y regresamos a la ventana inicial con la configuracin deseada.

Como vemos ya no tenemos ningn error o advertencia, ahora solo nos queda dar enFinishpara crear el proyecto, despus de esto se cargara una ventana de dialogo donde nos preguntan si deseamos cambiar a la perspectivaWeb Development perspectiveesto es opcional.

Como vemos nuestro proyecto fue creado, y en caso de haber seleccionado "Yes"en la ventana de dialogo, estaremos en la perspectiva mencionada(Se puede evidenciar en la esquina superior derecha de Eclipse)

Esta perspectiva est ms orientada al diseo, puesto que simplemente con arrastrar y soltar podemos agregar componentes a nuestras pginas, ms adelante veremos cmo.

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, simplemente por"Windows/Open Perspective"la buscamos y listo.

Ya teniendo nuestro proyecto creado, vamos a hacer un pequeo recorrido por la estructura del mismo, podemos empezar ya, pero a modo personal me gusta trabajar con la vistaNavigatorya que me parece un poquito ms ordenada, sin embargo pueden seguir trabajando por elProject Explorer(Es cuestin de gustos)Para esto seleccionamos Window/Show View/Navigator

y listo, tenemos la nueva opcin de navegacin, ahora s, veamos la estructura del proyecto.

Como vemos tenemos nuestro proyecto web funcional, tenemos el archivo index.jsp, el directorioJavaSourceque contiene la clase User.java, un bean creado por defecto, que tiene los mtodos set y get necesarios, Tenemos tambin un archivo de propiedades donde se establecen todos los mensajes o texto que tendrn las etiquetas del aplicativo. Tambin podemos ver un directoriopagesque contiene las pantallas de la aplicacin y dentro del WEB-INF encontramos por ejemplo el archivofaces-config.xmlcon las reglas de navegacin entre pginas.

Si ingresamos a la pginainputUserName.jspvemos que gracias al pluginJBoss Toolspodemos trabajar con las opciones de solo cdigo, cdigo y pantalla, adems de una vista previa de lo que estamos haciendo.

En la imagen anterior tambin se puede ver en el panel de la derecha las opciones que brinda la perspectiva recomendada por eclipse, como se mencion anteriormente solo sera cuestin de elegir el componente que necesitamos y arrastrarlo al cdigo.

Carga del Servidor desde Eclipse

Para poder desplegar nuestra aplicacin, tenemos que hacer uso del servidor, para eso desde Eclipse, en caso de que no se encuentre la vista de servidores, se cargar desdeWindows/Show view/Serverall presionamos click derecho y agregamos new server

Se cargar nuevamente una ventana donde definiremos el servidor a utilizar, realizando un proceso similar a los anteriores, nuevamente escogemos JBoss v4.2 y presionamosfinish.

Vemos como ha quedado agregado correctamente el servidor.

Ahora aumentaremos el tiempo de espera del servidor, ya que en ocasiones cuando tenemos aplicaciones muy grandes, el servidor no permite el despliegue, pues por defecto el tiempo de espera es muy corto,para esto simplemente damos doble click en el server y aumentamos el tiempo en la opcinTimesOuts

Ahora para el despliegue de la aplicacin desde eclipse podemos pararnos en el servidor y dar click derecho, luego seleccionar la opcinRuno simplemente desde este mismo icono en las opciones de la esquina.

Luego de esto se muestra el progreso del despliegue desde la consola de Eclipse, vemos que todo est correcto y esperamos hasta que nos indique que se ha iniciado, tambin se pueden ver otras opciones, por ejemplo desde el cuadrito rojo podemos finalizar el despliegue (Vemos que es igual al despliegue desde el run.bat del servidor como evidenciamos en el tutorialanterior).

Ahora para ejecutar nuestra aplicacin, damos click derecho al index.jsp y seleccionamosrun as/run on server(En algunas versiones de Eclipse, haciendo esto no permite la ejecucin desde el index, tendramos que verificar haciendo lo mismo pero desde la pgina inputUserName.jsp, posiblemente se deba a algn error en el plugin)

Acto seguido se carga una ventana indicndonos el servidor configurado, presionamosNext.

Despus se carga otra donde nos da la opcin 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 presionarFinishse abre un navegador propio de eclipse donde podemos ver nuestra aplicacin en funcionamiento.

La aplicacin cuenta con reglas de navegacin definidas, tambin 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"atrs"del navegador e ingresamos un nombre valido, presionamos el botn y ahora si nos redirecciona a otra pgina enviando el nombre ingresado como parmetro.

Tambin podemos ver la aplicacin desde cualquier navegador, simplemente copiamos la ruta generada y con el servidor arriba la podemos probar.

Si vamos a la carpeta deploy de nuestro servidor, vemos que se ha generado un archivo .war el cual es el empaquetado del proyecto, lo que permite que la aplicacin sea desplegada.

Debemos tener en cuenta que este archivo se genera porque desplegamos el proyecto desde Eclipse, definimos cual servidor asociar y dimos Run desde ah, entonces el IDE lo que hace es leer esas configuraciones y almacenar el empaquetado en la carpeta Deploy.

tambin podemos desplegar la aplicacin desde el run.bat como vimos en otro tutorial, pero la aplicacin que se desplega es la ultima almacenada en el server, ya que los cambios que hagamos, para que se puedan evidenciar, tendramos que desplegarlos desde el Eclipse.

En el prximo tutorial, veremos una forma de automatizar ese proceso por medio de tareas Ant, las cuales podemos configurar para que al ejecutar una tarea, se realicen una serie de pasos predefinidos como por ejemplo generar el empaquetado del proyecto, establecer la ruta del mismo, copiarlo a otro directorio, generar documentacin, entre muchas otras opciones que esta herramienta nos ofrece.

Nos vemos en una prxima entrada!!!