Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón Desarrollo rápido de Aplicaciones Empresariales con Java EE y NetBeans 1 ¿Qué es Java EE? Java EE o Java Enterprise Edition (Java Edición Empresarial) es una plataforma de desarrollo basada en el lenguaje de programación Java, que nos permite desarrollar aplicaciones empresariales basadas en un arquitectura de N capas distribuidas. Las aplicaciones a gran escala, de varios niveles, escalables, confiables y seguras son llamadas “Aplicaciones Empresariales”, debido a que estas solucionan la problemática de grandes empresas. Tenemos que tomar en cuenta que una aplicación empresarial no solo beneficiara a grandes organizaciones, sino también a organizaciones más pequeñas e incluso individuales debido a la dinámica de información actual. Desde un punto de vista más técnico podemos decir que la plataforma Java EE nos provee de un conjunto de API's que nos facilitan la creación y desarrollo de una aplicación que contenga todos los estándares necesarios en la industria. 2 Modelo de una Aplicación Java EE Como mencionamos con anterioridad Java EE nos propone el desarrollo de aplicaciones de N capas, este modelo de desarrollo nos permite dividir el trabajo de la implementación en dos partes: La implementación de la lógica del negocio y la presentación de la aplicación que debe ser realizada por los desarrolladores. Los servicios estándar del sistema que serán proveídos por Java EE, entre estos servicios estándar podemos incluir a todas las funciones que normalmente posee una aplicación como por ejemplo el almacenamiento en la base de datos, el manejo de transacciones, la concurrencia, etc. 2.1 Aplicaciones de N capas distribuidas Una aplicación Java EE está compuesta por capas, esta a su vez se divide en componentes de acuerdo a su función, estos componentes pueden estar distribuidos en distintas maquinas dependiendo de la capa a la cual pertenezcan dentro de una aplicación de N capas. Una aplicación Java EE puede consistir en 3 o 4 capas, aunque generalmente son consideradas de 3 capas debido a que están distribuidas en tres lugares diferentes que son: la maquina cliente, un servidor de aplicaciones Java EE y una base de datos. 1 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón A continuación describiremos cuales son estas capas: 1. 2. 3. 4. Capa del Cliente: sus componentes corren en la máquina del cliente. Capa Web: sus componentes corren sobre el servidor Java EE. Capa de Negocio: sus componentes también corren sobre el servidor Java EE. Capa de sistemas de información empresarial (EIS por sus siglas en inglés): que es el software que corre sobre un servidor EIS (Bases de Datos, Data Center, ERP, Sistemas Antiguos, etc.). Ilustración 1: Modelo de Aplicación Java EE 2 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón 3 Componentes Java EE Como habíamos mencionado una aplicación Java EE está dividida en componentes. Un componente es una unidad de software funcional e independiente que ha sido ensamblada dentro de una aplicación Java EE. Los componentes que se definen en la especificación de Java EE son los siguientes: Las aplicaciones del cliente y los Applets que corren del lado del cliente. Java Servlet, JavaServer Faces y JavaServer Pages que son componentes de la capa web y se ejecutan del lado del servidor. Enterprise JavaBeans que son componentes de la lógica de negocio que también se ejecutan del lado del servidor. Todos los componentes son escritos en Java y son compilados de la misma forma que cualquier otro programa escrito en Java con la diferencia de que los componentes Java EE son ensamblados dentro de una aplicación, además estos son compilados y verificados según la especificación de Java EE. 3.1 Clientes Cuando hablamos de un cliente nos referimos a una aplicación que se ejecuta en el equipo del usuario, estos por lo general suelen ser navegadores web, aplicaciones que se ejecutan locamente o bien plugin's o mini aplicaciones en el navegador. 3.1.1 Clientes Web Cuando hablamos de un cliente web tenemos que tener en consideración que estos están conformados por las páginas web escritas en cualquier lenguaje de marcado como HTML y XML por ejemplo, todas estas son generadas por los componentes que corren en la capa web del servidor; y el navegador web propiamente dicho, que es el encargado de interpretarlas y mostrarlas al usuario. A veces a estos clientes se les suele llamar “thin clients” o clientes ligeros, debido a que no ejecutan consultas SQL o alguna función de la lógica del negocio. 3.1.2 Applets Un Applet es una pequeña aplicación cliente escrita en Java que se ejecuta en el navegador a través de una máquina virtual instalada en el navegador (por lo general es un plugin). 3.1.3 Aplicaciones Cliente Una aplicación cliente se ejecuta en el ordenador del usuario, estas proveen una interfaz más rica para realizar las tareas de los usuarios que la que nos podría brindar un lenguaje de marcado. Generalmente estas aplicaciones acceden directamente a la capa de negocio de la aplicación Java EE. También si es necesario estas pueden abrir una conexión HTTP e interactuar con los servlet de la capa web. Cabe destacar que una aplicación escrita en otro lenguaje también puede interactuar con un servidor Java EE. 3 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón 3.2 Componentes Web Los componentes web en Java EE son los Servlets o paginas creadas usando las tecnologías JavaServer Pages (JSP) y/o JavaServer Faces (JSF). Los Servlets son clases escritas en lenguaje Java que dinámicamente procesan solicitudes y generan respuestas. Las paginas JSP son documentos de texto que se ejecutan como Servlets pero permiten aproximarse a una forma más natural para crear contenido estático. La tecnología JavaServer Faces se construye en base a Servlets y JSP, y provee un framework de componentes para interfaces de usuario dentro de una aplicación web. Opcionalmente en esta capa también podemos incluir ciertos JavaBeans como los ManagedBeans que nos van a permitir pre-procesar, post-procesar y validar las solicitudes y respuestas del cliente antes de enviarlas. Las paginas HTML estáticas y los applets son construidos durante el ensamblaje de la aplicación, pero estos no son considerados componentes por la especificación Java EE. 3.3 Componentes de Negocios Son todos aquellos que conforman la lógica que soluciona las necesidades de un negocio en particular como operaciones bancarias, ventas o finanzas, estos son manejados por Enterprise Beans, ejecutándose en la capa de negocio. 3.4 Capa de Sistemas de Información Empresarial Esta capa administra el software EIS, como ERPs, mainframes de procesamiento de transacciones, sistemas de Bases de Datos, y otros sistemas de información heredados. También incluye la infraestructura sobre la cual están montados dichos sistemas. 4 Como desarrollar una aplicación Java EE Una vez que comprendemos como está conformada una aplicación Java EE, vamos a explicar de forma sencilla el proceso para construir una aplicación de tal forma que sea fácil de comprender. 4.1 MVC Modelo Vista Controlador es un patrón o modelo de abstracción de desarrollo de software que consiste en dividir una aplicación clásica en la cual diferenciamos la interfaz de usuario y la lógica del negocio en tres partes distintas. Una breve descripción de estas partes seria: Modelo: Es la representación de la información del sistema. Vista: Es la presentación del modelo en un formato adecuado para que el usuario interactúe con la misma. Controlador: Recibe datos e instrucciones de la Vista o de la misma aplicación, se encarga de procesar dichos datos y responder las peticiones que se le hacen. 4 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón Resulta básico comprender este patrón para facilitar la construcción una aplicación en Java EE. Desarrollar una aplicación bajo el patrón MVC consiste básicamente en realizar una serie de pasos que nos facilitaran su construcción, estos pasos generalmente son: 1. Realizar un mapeo objeto-relacional, que consiste en a partir de una base de datos crear los modelos necesarios que representen las tablas o unidades de información que utilizaremos en la aplicación. 2. Desarrollar la lógica del negocio, en este paso vamos a crear todas los métodos y funciones que nos permitirán procesar de una forma adecuada las solicitudes del usuario, y hacer que las entidades persistan en la BD también cuando se solicite. 3. Diseñar las Vistas, en este paso vamos a crear una interfaz que permita al usuario interactuar con la aplicación ya sea mostrando la información solicitada o permitiendo al usuario solicitar nueva información. 4.2 Crear una Entidad y Java Persistence API (El Modelo) Una Entidad es un tipo especial de objeto, a diferencia de los objetos que solamente viven un corto periodo de tiempo en la memoria, las entidades además poseen la capacidad para persistir dentro de una Base de Datos. Las entidades tienen la capacidad de poder ser mapeadas a una BD, pueden ser concretas o abstractas, soportar herencia, relaciones, etc. Una vez mapeada una entidad puede ser manejada por medio de las API que nos provee Java EE. Cuando hablamos de entidades en Java EE tenemos que hablar de la Java Persistence API (JPA), esta API nos permite borrar, persistir, consultar entidades por medio de JPQl (Java Persistence Query Language). 4.2.1 Mapeo Objeto-Relacional: El principio de ORM es delegar a herramientas externas o frameworks (en el caso de Java EE a JPA) la tarea de crear una correspondencia entre objetos y tablas. La ventaja de mapear tablas en objetos es facilitar a los desarrolladores el trabajo con objetos y no con datos planos manejados en filas y columnas. Toda entidad tiene asociados ciertos metadatos que describen el mapeo. Estos metadatos permiten que un proveedor de persistencia reconozca una entidad y la interpreta el mapeo. Estos metadatos pueden ser escritos de dos formas: Anotaciones: Consiste en escribir ciertas palabras claves definidas en el paquete java.persistence directamente sobre el código de la entidad para describir el mapeo. Descriptores XML: Consiste en describir el mapeo en un archivo XML independiente. Para facilitar el mapeo, JPA usa el concepto de configuración por excepción. La configuración por excepción consiste en definir reglas de mapeo por defecto (por ejemplo el nombre de la tabla es el mismo que el de la entidad). Con esto solo tendremos que modificar o realizar las anotaciones con las que no estemos satisfechos y dejar al proveedor de persistencia (puede ser otra API como JDBC) el resto. A continuación presentamos un código de ejemplo: 5 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón @Entity @Table(name="usuario") public class Usuario implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Basic(optional=false) @Column(name="id") private Integer id; @Basic(optional=false) @Column(name="nick", length=45) private String nombre; //Constructores, métodos get y set } Toda entidad debe de tener la anotación @Entity para considerarse una, también debe implementar la interfaz Serializable y por ultimo tener al menos un atributo con la anotación @Id. Las etiqueta @Table personaliza el nombre de la tabla si este no es igual al de la entidad, @GeneratedValue especifica cómo se generara el Id, @Basic y @Column nos sirve para personalizar los atributos como podemos observar. 4.3 Crear un Enterprise JavaBean y los ManagedBean (El Controlador) 4.3.1 Enterprise JavaBean Los Enterprise JavaBean (EJB) son componentes del lado del servidor que encapsulan la lógica del negocio, además manejan las transacciones y la seguridad. Cabe destacar que un EJB consiste en un POJO (Plain Old Java Object, que es un archivo simple con código Java) con las anotaciones necesarias, este luego es desarrollado dentro de un contenedor. Un contenedor EJB es un entorno en tiempo de ejecución que provee servicios como: manejo de transacciones, control de concurrencia, pooling de objetos y autorizaciones de seguridad. Existen tres tipos de EJB Stateless: El Bean de sesión no contiene estados conversacionales entre métodos, y cualquier instancia puede ser usada por cualquier cliente. Stateful: El Bean de sesión contiene estados conversacionales, que deben ser retenidos entre métodos para un solo usuario. Singleton: Un bean de sesión único es compartido entre los clientes y permite el acceso concurrente. Para crear un EJB necesitamos dos cosas bastante simples, primero una clase Java y segundo una anotación, como en el siguiente ejemplo: 6 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón @Stateless public class Usuario { @PersistenceContext(unitName = "aplicacionPU") private EntityManager em; public Usuario findUsuarioById(int id) { return em.find(Book.class, id); } public Usuario createUsuario(Usuario usuario) { em.persist(usuario); return usuario; } } Observamos primero la anotación @Stateless que nos define dos cosas, la primera que es un EJB y la segunda que es un Bean de tipo Stateless. Luego declaramos un contexto de persistencia @PersistenceContext con el nombre de la unidad de persistencia, esta unidad la podemos crear con un archivo XML manualmente o bien en el caso de NetBeans la creara por medio de un asistente; también tenemos que declarar un EntityManager (variable em) que nos servirá para manipular la entidad. Por ultimo observamos dos métodos, uno que nos permitirá buscar una entidad a partir de un id y el segundo que persistirá al usuario que le proporcionemos al EJB. 4.3.2 ManagedBeans Un ManagedBean es una clase Java especializada que sincroniza valores con componentes, procesos de la lógica de negocios y administra la navegación entre páginas. Un ManagedBean también puede manejar eventos como creación de entidades, consultas, etc. Un ejemplo de un ManagedBean podría ser el siguiente: @ManagedBean public class UsuarioController { @EJB private UsuarioEJB usuarioEJB; private Usuario usuario = new Usuario(); public String crearUsuario() { usuario = usuarioEJB.createUsuario(usuario); return "listUsuario.xhtml"; } // Getters, setters } Una vez más nos topamos ante un POJO con una anotación, en este caso la anotación @ManagedBean. Luego si observamos también posee una anotación @EJB que hace referencia al Bean que se desea controlar. Por ultimo tenemos a una Entidad del tipo de Usuario y su respectivo método para hacerla persistir por medio del EJB, este método nos dirigirá a una vista en este caso listUsuario.xhtml. 7 Universidad Mariano Gálvez de Guatemala Centro Universitario de Quetzaltenango Seminario de Tecnologías de la Información Cristian Calderón 4.4 Crear una interfaz con JSF (La Vista) La arquitectura JSF es bastante sencilla de entender, ya que son aplicaciones web estándar que interceptan mensajes HTTP a través de un Faces Servlet que genera código HTML. Una vista en JSF consiste en un archivo XHTML en el cual incluimos componentes que se mostraran al usuario y las propiedades de los mismos como conversores y validadores. Estos componentes deben ser enlazados a un ManagedBean que posteriormente enlazara la vista con la capa de negocio y presentara los resultados en la misma vista u otra. Una interfaz creada con JSF sería como la siguiente: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Crear Nuevo usuario</title> </h:head> <h:body> <h1>Crear Nuevo usuario</h1> <hr/> <h:form> <h:panelGrid columns="2"> <h:outputLabel value="Codigo" for="id" /> <h:inputText id="id" value="#{usuarioController.selected.id}" /> <h:outputLabel value="Nick" for="nick" /> <h:inputText id="nick" value="#{usuarioController.selected.nick}" /> </h:panelGrid> <br /> <h:commandLink action="#{usuarioController.create}" value="Guardar" /> <br /> <h:link outcome="/index" value="#{bundle.CreateUsuarioIndexLink}"/> </h:form> </h:body> </html> Como podemos notar no hay mucha diferencia con un archivo html a diferencia de las etiquetas que ahora son precedidas por una letra por ejemplo <h:body> que representa al grupo de componentes que pertenece, y los componentes propiamente como <h:inputText> que enlazan a un ManagedBean (usuarioController) ya sea una entidad o una acción del mismo. Por ultimo solo restaría ensamblar los archivos por medio de alguna herramienta adecuada como NetBeans o algún otro IDE y subirlo al servidor de aplicaciones Java EE como GlassFish o Tomcat. 8