Para crear Servicios Web necesitamos tener unas nociones básicas del lenguaje Java a partir de las que accederemos a los elementos que vamos a construir en nuestros ejemplos.
Lanzamos NetBeans, vamos a crear, a partir del proyecto de la lección anterior,
Lo primero es construir el Elemento:
// Web 2.0: Arquitectura Orientada a Servicios en Java. // Introducción a JAVA // CLASE DEL MODELO Elemento package es.ugr.battlegalactica.modelo; // Clase Elemento // @author Juan Belón Pérez public class Elemento { // Siguiente elemento private static long nextId = 0; // ID del Elemento protected long id = 0; // Constructor de Elemento sin argumentos // @return Elemento public Elemento() { this.id = ++Elemento.nextId; } //Devuelve el Id de la clase // @return long public long getId() { return id; } // Devuelve el contador actual de ID's de Elementos // @return long public long getNextId(){ return Elemento.nextId; } }
Ahora, podemos ,a partir de este elemento construir Pilotos que hereden de este:
// Web 2.0: Arquitectura Orientada a Servicios en Java. // Introducción a JAVA // CLASE DEL MODELO Piloto que hereda del Modelo Elemento package es.ugr.battlegalactica.modelo; // Clase Piloto, hereda de Elemento // @author Juan Belón Pérez public class Piloto extends Elemento { // Nombre del piloto private String nombre; // Destreza del piloto private int destreza; // Constructor de Piloto //@param nombre // @param destreza public Piloto(String nombre, int destreza) { this.nombre = nombre; this.destreza = destreza; } // // Devuelve el valor de destreza de un piloto // @return int public int getDestreza() { return destreza; } // Devuelve el nombre de un piloto // @return String public String getNombre() { return nombre; } }
y lo mismo que para Piloto pero con Viper (que son naves):
// Web 2.0: Arquitectura Orientada a Servicios en Java. // Introducción a JAVA // CLASE DEL MODELO Viper que hereda del Modelo Elemento package es.ugr.battlegalactica.modelo; import es.ugr.battlegalactica.modelo.excepciones.NoHayArmamentoException; // Clase Viper (naves) // @author Juan Belón Pérez public class Viper extends Elemento { // Nombre del Viper private String nombre; // Cantidad de armamento (nºde proyectiles) private int armamento; // Constructor de Vipers //@param nombre String public Viper(String nombre) { this.nombre = nombre; this.armamento = 0; } // Devuelve la cantidad de munición del Viper // @return int public int getArmamento() { return armamento; } // Devuelve el nombre del Viper // @return String public String getNombre() { return nombre; } // Pone munición al Viper en la cantidad dada // @param armamento public void setArmamento(int armamento) { this.armamento = Math.abs(armamento); } // Dispara con la munición disponible, decrementa el armamento // @throws NoHayArmamentoException public void disparar() throws NoHayArmamentoException{ --this.armamento; // = (this.armamento==0)?0:(--this.armamento); if (this.armamento<0){ this.armamento = 0; throw new NoHayArmamentoException("No queda munición en este viper ("+ this.getId()+")"); } } }
Ahora repasaremos lo que es una interfaz o clase abstracta (no se puede instanciar sino que sirve como modelo para tener varias implementaciones distintas, por ejemplo, una clase base de datos con distintas tecnologías: mysql, oracle,etc). Construimos la clase Computador para realizar una implementación más tarde llamada Nexus
// Web 2.0: Arquitectura Orientada a Servicios en Java. // Introducción a JAVA // CLASE DEL MODELO Computador para el // computador de la estrella de combate package es.ugr.battlegalactica.modelo; import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException; import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException; import java.util.Iterator; // Clase Computador // @author Juan Belón Pérez // public interface Computador { // //Registra un Viper en el Computador //@param v Viper // void guardarViper(Viper v); /// //Registra un Piloto en el Computador //@param p // void guardarPiloto(Piloto p); //////Devuelve el Viper asociado al id especificado //@param id //@return Viper // Viper obtenerViper(long id) throws ViperNoEncontradoException; //////Devuelve el Piloto asociado al id especificado //@param id //@return Piloto // Piloto obtenerPiloto(long id) throws PilotoNoEncontradoException; //////Devuelve un iterador de los Vipers registrados en el Computador //@return Iterator // Iterator listarVipers(); //////Devuelve un iterador de los Pilotos registrados en el Computador //@return Iterator // Iterator listarPilotos(); }
Recordar también lo que son los iteradores…ahora vamos a dar el código para implementar la interfaz Computador con la clase Nexus:
// //Web 2.0: Arquitectura Orientada a Servicios en Java. //Introducción a JAVA //CLASE DEL MODELO Nexus que implementa el Computador para el // computador de la estrella de combate // package es.ugr.battlegalactica.modelo; import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException; import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException; import java.util.ArrayList; import java.util.Iterator; //////Clase Nexus - un Computador de la estrella de combate //@author Juan Belón Pérez // public class Nexus implements Computador { //////Pilotos registrados en el Computador Nexus // private static ArrayList pilotos_nexus; //////Vipers registrados en el Computador Nexus // private static ArrayList vipers_nexus; //////Constructor del Computador Nexus // public Nexus() { init_Nexus(); } //////Inicializador del Computador Nexus // private void init_Nexus(){ pilotos_nexus = new ArrayList (); vipers_nexus = new ArrayList(); } public void guardarViper(Viper v) { vipers_nexus.add(v); } public void guardarPiloto(Piloto p) { pilotos_nexus.add(p); } public Viper obtenerViper(long id) throws ViperNoEncontradoException { for (Viper v: vipers_nexus) if (v.getId()==id) return v; throw new ViperNoEncontradoException("Viper no encontrado: "+id); // return null; } public Piloto obtenerPiloto(long id) throws PilotoNoEncontradoException { for (Piloto p: pilotos_nexus) if (p.getId()==id) return p; throw new PilotoNoEncontradoException("No se ha encontrado el piloto:" + id); // return null; } public Iterator listarVipers() { return Nexus.vipers_nexus.iterator(); } public Iterator listarPilotos() { return Nexus.pilotos_nexus.iterator(); } }
Para probar las excepciones haremos que cuando se dispare una viper ,si la cantidad de armamento es 0 lance una excepción de tipo «NoHayArmamentoException»:
// //Web 2.0: Arquitectura Orientada a Servicios en Java. //Introducción a JAVA //CLASE PARA EXCEPCIONES DEL MODELO VIPER -> Disparo // package es.ugr.battlegalactica.modelo.excepciones; //////Clase para lanzar excepciones cuando se intenta disparar sin munición //desde un Viper //@author Juan Belón Pérez // public class NoHayArmamentoException extends Exception { //////Constructor de Excepción con mensaje //@param message // public NoHayArmamentoException(String message) { super(message); } //////Constructor // public NoHayArmamentoException() { } }
Creamos una clase de excepciones para la clase Piloto, en este caso para cuando se intenta encontrar un Piloto que no existe:
// //Web 2.0: Arquitectura Orientada a Servicios en Java. //Introducción a JAVA //CLASE PARA EXCEPCIONES DEL MODELO Piloto -> busquedas // package es.ugr.battlegalactica.modelo.excepciones; ////////@author Juan Belón Pérez // public class PilotoNoEncontradoException extends Exception { //////Constructor con mensaje //@param message // public PilotoNoEncontradoException(String message) { super(message); } //////Constructor // public PilotoNoEncontradoException() { } }
Lo mismo que antes, para Vipers:
// //Web 2.0: Arquitectura Orientada a Servicios en Java. //Introducción a JAVA //CLASE PARA EXCEPCIONES DEL MODELO Viper -> busquedas // package es.ugr.battlegalactica.modelo.excepciones; ////////@author Juan Belón Pérez // public class ViperNoEncontradoException extends Exception { //////Constructor con mensaje //@param message // public ViperNoEncontradoException(String message) { super(message); } public ViperNoEncontradoException() { } }
Por último la clase Prueba para probar todo lo que hemos construido:
// //Web 2.0: Arquitectura Orientada a Servicios en Java //Primer Modelo: BSGModelo con la clase Prueba //@author Juan Belón Pérez // package es.ugr.battlegalactica; import es.ugr.battlegalactica.modelo.Elemento; import es.ugr.battlegalactica.modelo.Nexus; import es.ugr.battlegalactica.modelo.Piloto; import es.ugr.battlegalactica.modelo.Viper; import es.ugr.battlegalactica.modelo.excepciones.NoHayArmamentoException; import es.ugr.battlegalactica.modelo.excepciones.PilotoNoEncontradoException; import es.ugr.battlegalactica.modelo.excepciones.ViperNoEncontradoException; import java.util.ArrayList; import java.util.Iterator; //////Clase con los 3 primeros ejercicios propuestos //@author Juan Belón Pérez // public class Prueba { private static ArrayList elementos; private static ArrayList pilotos; private static ArrayList vipers; private static Nexus nexus; //////Función principal. //Imprime por pantalla un mensaje fijo. ////@param args la linea de argumentos del programa // public static void main(String[] args) throws NoHayArmamentoException, PilotoNoEncontradoException, ViperNoEncontradoException { System.out.println("Prueba del modelo de datos BattleStarGallactica"); //crear dos elementos e imprimir sus identificadores en la consola. //Si todo ha ido bien se deberían escribir los identificadores 1 y 2 init(); System.out.println("Prueba de creación de elementos:"); for (Elemento e: elementos){ System.out.printf("%d,",e.getId()); } System.out.println("\nPrueba de creación de pilotos:\n"); for (Piloto p: pilotos){ System.out.printf("ID:%d,Nombre:%s,Destreza:%d\n",p.getId(),p.getNombre(), p.getDestreza()); } System.out.println("\nPrueba de creación de vipers:\n"); for (int i=0; i<4; i++){ //Disparar 4 veces con todos los vipers: for (Viper v: vipers){ System.out.printf("#%d# Disparando con el viper ID:%d,Nombre:%s," + "Armamento:%d\n",(i+1),v.getId(),v.getNombre(),v.getArmamento()); try { v.disparar(); } catch (NoHayArmamentoException e){ System.err.println("\n\tError al disparar:"+e.getMessage()+"\n"); } System.out.printf("\tEl nuevo armamento del viper con ID:%d y Nombre: %s"+ " ahora tiene %d unidad/es\n", v.getId(),v.getNombre(),v.getArmamento()); } } System.out.println("\nPrueba de creación de Nexus con Pilotos:\n"); Iterator iter_piloto = nexus.listarPilotos(); Piloto aux_piloto = null; while (iter_piloto.hasNext()){ aux_piloto = iter_piloto.next(); System.out.printf("Piloto %s, ID:%d\n", aux_piloto.getNombre(), aux_piloto.getId()); } System.out.println("\nPrueba de creación de Nexus con Vipers:\n"); Iterator iter_viper = nexus.listarVipers(); Viper aux_viper = null; while (iter_viper.hasNext()){ aux_viper = iter_viper.next(); System.out.printf("Viper %s, ID:%d\n", aux_viper.getNombre(), aux_viper.getId()); } if (aux_piloto!=null) System.out.println("\nPrueba de búsqueda (el último:" + aux_piloto.getId()+") de Pilotos en Nexus:\n" + nexus.obtenerPiloto(aux_piloto.getId()).getNombre()); if (aux_viper!=null) System.out.println("\nPrueba de búsqueda de Vipers (el último:"+ aux_viper.getId()+") en Nexus:\n" + nexus.obtenerViper(aux_viper.getId()).getNombre() ); System.out.println("\nComprobar que se generan las excepciones "+ "buscando un Piloto falso:23\n"); try { aux_piloto = nexus.obtenerPiloto(23); } catch (PilotoNoEncontradoException ex){ System.err.println("\n\t"+ex.getMessage()); } System.out.println("\nComprobar que se generan las excepciones "+ "buscando un Viper falso:23"); try { aux_viper = nexus.obtenerViper(23); } catch (ViperNoEncontradoException ex){ System.err.println("\n\t"+ex.getMessage()); } } //Inicializador de elementos, pilotos, vipers y Nexus (vipers y pilotos) private static void init(){ Viper v_aux; elementos = new ArrayList(); elementos.add(new Elemento()); elementos.add(new Elemento()); pilotos = new ArrayList (); pilotos.add(new Piloto("Juax",120)); pilotos.add(new Piloto("Sara",110)); vipers = new ArrayList(); v_aux = new Viper("Trueno"); v_aux.setArmamento(3); vipers.add(v_aux); v_aux = new Viper("Rayo"); v_aux.setArmamento(4); vipers.add(v_aux); nexus = new Nexus(); nexus.guardarPiloto(new Piloto("Migue",130)); nexus.guardarPiloto(new Piloto("Jesús",130)); v_aux = new Viper("Trueno"); v_aux.setArmamento(4); nexus.guardarViper(v_aux); v_aux = new Viper("Fuego"); v_aux.setArmamento(5); nexus.guardarViper(v_aux); } }
La salida que debe mostrar es la siguiente:
Prueba del modelo de datos BattleStarGallactica
Prueba de creación de elementos:
1,2,
Prueba de creación de pilotos:ID:3,Nombre:Juax,Destreza:120
ID:4,Nombre:Sara,Destreza:110Prueba de creación de vipers:
#1# Disparando con el viper ID:5,Nombre:Trueno,Armamento:3
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 2 unidad/es
#1# Disparando con el viper ID:6,Nombre:Rayo,Armamento:4
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 3 unidad/es
#2# Disparando con el viper ID:5,Nombre:Trueno,Armamento:2
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 1 unidad/es
#2# Disparando con el viper ID:6,Nombre:Rayo,Armamento:3
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 2 unidad/es
#3# Disparando con el viper ID:5,Nombre:Trueno,Armamento:1
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 0 unidad/es
#3# Disparando con el viper ID:6,Nombre:Rayo,Armamento:2
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 1 unidad/es
#4# Disparando con el viper ID:5,Nombre:Trueno,Armamento:0Error al disparar:No queda munición en este viper (5)
El nuevo armamento del viper con ID:5 y Nombre: Trueno ahora tiene 0 unidad/es
#4# Disparando con el viper ID:6,Nombre:Rayo,Armamento:1
El nuevo armamento del viper con ID:6 y Nombre: Rayo ahora tiene 0 unidad/esPrueba de creación de Nexus con Pilotos:
Piloto Migue, ID:7
Piloto Jesús, ID:8Prueba de creación de Nexus con Vipers:
Viper Trueno, ID:9
Viper Fuego, ID:10Prueba de búsqueda (el último:8) de Pilotos en Nexus:
JesúsPrueba de búsqueda de Vipers (el último:10) en Nexus:
FuegoComprobar que se generan las excepciones buscando un Piloto falso:23
Comprobar que se generan las excepciones buscando un Viper falso:23
No se ha encontrado el piloto:23
Viper no encontrado: 23
BUILD SUCCESSFUL (total time: 0 seconds)
Para descargar el código y probar, hay un comprimido aquí.
« Volver al Curso de Arquitectura de Servicios Java para PHP ó ver más cursos »
sería bueno que documentes un poco más y específiques lo que quieres hacer, y el objetivo principal que quieres llegar, pero referente al ejemplo
a qué te refieres?…has seguido todo el curso?, has leído los apuntes y hecho los ejercicios?