Story Transcript
LABORATORIO ARQUITECTURAS SOFTWARE DE VARIOS NIVELES EN JAVA (I) SEPARACIÓN DEL NIVEL DE PRESENTACIÓN Y LÓGICA DE NEGOCIO MEDIANTE EL USO DE INTERFACES JAVA 1. OBJETIVO Los objetivos de este laboratorio son: ● ●
●
Comprender cómo se puede separar en clases diferentes el nivel de presentación y el nivel de lógico de negocio. Mostrar la utilidad de las interfaces Java, las cuales permiten que un objeto de una clase solicite, en tiempo de compilación, a un objeto de otra clase NO CONOCIDA la ejecución de un método concreto (el nombre de este método sí será conocido porque estará definido en la interfaz Java). Comprender también que es posible independizar el nivel de presentación y el nivel de la lógica de negocio, de forma tal que no haga falta recompilar el nivel de presentación cuando se cambie la lógica del negocio, e incluso que sea posible hacerlo incluso en TIEMPO DE EJECUCIÓN.
2. TAREAS A REALIZAR Crear una carpeta de trabajo donde almacenar el proyecto, los fuentes .java, las clases .class, el workspace y los ficheros .html. Nota: Si teneis algun problema recordad el punto 1 al 2.2 del laboratorio 1. 1.- Crear un proyecto con una clase asociada (nombre de la clase: Lanzador). Asociaremos también a ese proyecto un frame (la clase LanzadorFrame). Diseñar este último frame para que tenga esta forma:
Nota: Si teneis algún problema recordad el punto 4 y 4.1 del laboratorio 1. Para la caja de texto de la parte inferior del frame, es conveniente no usar el componente JTextField (en su lugar, JTextPane o JTextArea) y añadirle unas barras de desplazamiento (o scroll) mediante el contenedor JScrollPane. 2.- Crear un nuevo frame (nombre de la clase Presentacion) que tenga la siguente forma:
Añadir también un label (inicialmente sin texto) para que se pueda escribir mensajes informativo al usuario (del tipo, si se le permite entrar en el sistema o si se ha producido algún error). Añadir un método main a la clase, para que cuando se ejecute la clase Presentacion, se cree una instancia de presentación y se haga visible. Probad a ejecutar la presentación e intentad acceder al sistema. ¿Qué sucede? ¿Por qué?. Al no haber asociado ningun evento la presentación sólo se visualiza; no reacciona. 3.- Crear la lógica del negocio, la cual consiste en una unica operación que permite o no ingresar al sistema según un nombre de usuario y un password. Para ello haced lo siguiente: a) Crear una interface Java (de nombre InterfaceLogicaNegocio) que contenga un método llamado hacerLogin que acepte como parámetros 2 strings (nombre de usuario y password) y que devuelva un valor booleano (true si permite hacer login y false si no).
Nota: En Java no existe el tipo string. Es la clase String java.lang.String)
(y más concretamente
b) Escribir al menos dos clases (EntradaSistemaXXX y EntradaSistemaYYY) que proporcionen implementaciones distintas a la interfaz InterfaceLogicaNegocio, esto es, al método hacerLogin.
Posibles implementaciones (por si no se os ocurren): ● que deje solamente entrar al sistema a un usuario con el nombre “invitado” y password “hola”; ● que no deje entrar a ningún usuario; ● que deje entrar a cualquier usuario. Nota: En Java, para comparar si dos objetos de la clase String son iguales hay que hacerlo con el método equals: s.equals(“invitado”). Así no funciona: s == “invitado”. 4.- Eliminar el método main de la clase Presentacion y crear un método main en la clase Lanzador que cree una instancia de LanzadorFrame. Añadir un atributo al frame Presentacion para que permita almacenar el objeto con la lógica del negocio y un método público setLogicaNegocio que permita asignar un objeto del tipo InterfaceLogicaNegocio.
5.- Programar los eventos correspondientes al frame Presentacion, para que cuando se pulse el botón “Acceder al sistema” se pida al objeto con la lógica del negocio que ejecute el método hacerLogin con los valores actuales que se encuentran en las dos cajas de texto y que escriba en la interfaz gráfica (en concreto, en el objeto Label) si nos han dado permiso para acceder al sistema, si no nos lo han dado, o si todavía no se ha asignado el objeto con la lógica del negocio. Si teneis algun problema recurrid al punto 4.2. del lab 1. Probad a ejecutar la presentación e intentad acceder al sistema. ¿Qué sucede? ¿Por qué? Nos da error porque la logica de negocio no esta asociada, solucionad esto, prestando atencion a la primera línea de excepcion. 6.- Modificar el método main da la clase Lanzador, para que cuando se ejecute la clase Presentacion, se le asigne al objeto de presentación la lógica del negocio; habrá que crear una instancia de la clase con la lógica del negocio que se quiera utilizar (EntradaSistemaXXX o EntradaSistemaYYY). Probad a ejecutar la presentación e intentad acceder al sistema. ¿Qué habría que hacer para cambiar la lógica del negocio a ejecutar? ¿Habría que recompilar la
clase de presentación y la lógica del negocio?. A continuación, se va a mostrar cómo es posible modificar la lógica del negocio que el objeto de presentación está ejecutando, sin tener que recompilar la clase Presentacion, ni siquiera relanzar el objeto de presentación. Esto es, cómo es posible cambiar la lógica del negocio en tiempo de ejecución. 7.- Programar el evento correspondiente al frame LanzadorFrame para que cuando se pulse el botón “Ejecutar Presentación” se cree y se muestre el objeto de presentación (de la clase Presentacion). 8.- Programar el evento correspondiente al frame LanzadorFrame para que cuando se pulse el botón “Asignar Lógica del Negocio” se le asigne al objeto de presentación el objeto con la lógica del negocio, para ello: a) Crear una instancia de una clase cuyo nombre es el que aparece en la caja de texto del frame LanzadorFrame. El objeto de esta clase (conocida en tiempo de ejecución) es el que se asignará al objeto presentación utilizando el método setLogicaNegocio. Para crear un objeto de una clase de manera dinámica (sin conocer su nombre en tiempo de compilación) se puede usar el método forName de java.lang.Class: InterfaceLogicaNegocio intLN = (InterfaceLogicaNegocio)Class.forName(jTextField1.getText()).newInstance(); // para crear una instancia de la clase cuyo nombre está en “jTextField1”
Si compilais vereis que esta sentencia produce excepciones, atrapadlas. b) Y asignarle dicha lógica del negocio al objeto de presentación utilizando el método setLogicaNegocio de la clase Presentacion. 9.- Ejecutar la aplicación y probar cómo se puede cambiar la lógica del negocio del objeto presentación EN TIEMPO DE EJECUCIÓN. Si lanzais el nivel de presentación (al pulsar “Ejecutar Presentación”) pero no le asignais la lógica del negocio, en la ventana de presentación aparece el texto “PROBLEMAS CON LA LÓGICA DEL NEGOCIO” al intentar acceder al sistema.
En cambio, si se le asigna una lógica del negocio concreta: la definida en la clase
EntradaSistemaXXX que permite entrar al usuario “invitado” con password “hola”... NOTA: El nombre de la clase con la lógica del negocio hay que ponerlo completo. Esto es: NombrePaquete.NombreClase
Entonces sí permitirá el paso a dicho usuario con ese password. Pero no a otros usuarios...
Probar a asignar otra lógica del negocio concreta: la definida en la clase EntradaSistemaYYY que permite entrar a cualquiera… Nótese que SE ESTÁ EJECUTANDO LA MISMA PRESENTACIÓN, ya que no hemos vuelto a pulsar el botón “Ejecutar Presentación”, y sin embargo, ahora sí deja entrar a cualquiera… En concreto al mismo usuario “invitadooo” anterior.
En este enlace se encuentra la solución del laboratorio 2: Solución laboratorio 2. En este enlace se allá una descripcion más detallada de cada uno de los pasos llevados a cabo en este laboratorio: Laboratorio_Detallado (PDF) Una vez que acabemos el laboratorio hay que eliminar del disco duro la carpeta de trabajo con los proyectos, los fuentes .java, las clases .class, y el workspace.