Download Principales variantes tecnológicas del entorno Java para el
Document related concepts
no text concepts found
Transcript
Principales variantes tecnológicas del entorno Java para el desarrollo de aplicaciones en la capa Cliente Ing. Daniel Pagés Chacón, Dr. Julio Pablo Martínez Prieto Resumen. La plataforma Java se ha convertido en uno de los principales entornos para la construcción de software en la actualidad. Siendo plataforma libre, brinda un sin número de posibilidades que la ubican en lugares cimeros en cuanto a preferencia de los desarrolladores a nivel mundial. En el ámbito del diseño de software moderno, los sistemas son concebidos generalmente con una estructura dividida en capas. Entre estas capas se encuentra la nombrada capa Cliente o Vista, la cual juega el importante roll de garantizar la interacción con los usuarios. En el presente se muestran las principales variantes tecnológicas brindadas para la construcción de aplicaciones clientes en el entorno de la plataforma Java. Palabras Claves. Java. Capa Cliente. Desarrollo de software. I. INTRODUCCIÓN En la actualidad, existe la necesidad constante de aplicaciones a gran escala que brinden grandes prestaciones a los usuarios finales y capaces de interactuar con otros sistemas. Con esto se está refiriendo a grandes sistemas de software cuyo proceso de desarrollo se convierte en algo realmente complicado donde cada elemento debe ser muy bien concebido por el bien de todo el producto final. Con todo lo anterior puede comprenderse que este proceso no solo no es trivial, sino que además su costo en tiempo es bastante elevado. Por estos motivos en el amplio mundo del desarrollo de software se han creado numerosas técnicas, patrones a seguir, estándares, marcos de trabajo o frameworks y herramientas que buscan, sobre todo, el aumento de la eficiencia y la productividad a la hora de implementar aplicaciones de software. Entre las tendencias más practicadas se encuentra concepción de los sistemas divididos en capas. Normalmente en Capa Cliente, Capa de Lógica de Negocio y Capa de acceso a datos. Esto trae muchos beneficios para los desarrolladores de los sistemas y para el funcionamiento de los mismos. Entre los beneficios más notables se encuentra el hecho de que el trabajo en una de las capas concebidas no afecta a las otras, evitando así que pequeñas variaciones o cambios específicos provoquen modificaciones en toda la aplicación. Para la mayoría de los sistemas de software interactivos la sección más expuesta a cambios es, sin dudas, la interfaz de usurario, en términos más generales, la Capa Cliente. Esto se debe a que es con ella que los usuarios finales interactúan directamente y se comunican con el software. Además de los habituales cambios en cuanto a requerimientos funcionales de las aplicaciones, los desarrolladores a menudo se ven enfrentados a requerimientos no funcionales como el soporte para varios sistemas operativos que exigen diferencias en cuanto a entornos gráficos (look and feel), y soporte para diferentes idiomas por solo citar dos ejemplos. Para aplicaciones de poca envergadura esto no constituye un problema de mayor importancia, pero cuando se trata de grandes sistemas la situación se torna diferente. Para la solución de esta problemática se han creado patrones y se han desarrollado marcos de trabajo que persiguen como objetivo, entre otras cosas, hacer más sencillo el proceso de construcción de software en las capas del lado del cliente. En el mundo del la elaboración de sistemas de software se hace importante la presencia de la plataforma Java. Esta brinda muchas ventajas y elementos que la hacen indiscutiblemente presente a la hora de buscar variantes para los desarrolladores de software. En el entorno de Java se pueden encontrar variantes, como frameworks, librerías y herramientas que están encaminadas a brindar la posibilidad de crear aplicaciones visuales, tanto en ambiente desktop como Web. Estos no solo existen, sino que evolucionan en aras de encontrar soluciones que permitan mejores y más robustas implementaciones para los productos finales. Esta evolución permite crear sistemas empleando de la mejor forma posible determinados patrones y nuevas variantes para hacer los grandes sistemas más sostenibles cada vez. Sin dudas, Java se convierte actualmente en una de las principales variantes para la construcción de software. CCIA’2008 II. PATRONES DE DISEÑO Muchos expertos han definido a un patrón como una solución recurrente a un problema determinado en un contexto particular [1]. Siguiendo este pensamiento, cuando se habla a de patrones de diseño en términos de desarrollo de software, esto se refiere a determinada forma que se ha establecido para abordar problemas conocidos de manera más provechosa. A continuación se exponen algunos de los patrones más importantes que intervienen en el desarrollo de software actual, específicamente en el ámbito de las aplicaciones de presentación. A. Model-View-Controler (MVC) Como se ha mencionado anteriormente, en la mayoría de los sistemas de software interactivos la sección más expuesta a cambios es la interfaz de usuario [4]. “Estudios de analistas han arrojado que las compañías emplean aproximadamente el 33% de sus presupuestos en el desarrollo de interefaces” [7]. En softwares monocapas, la realización de pequeños cambios puede tornarse muy complicada para los desarrolladores, ya que los mismos se propagan a través de todo el sistema. En estos casos, frecuentemente los requerimientos de los usuarios obligan a mantener versiones o variantes separadas de la misma aplicación cuando un grupo de usuarios tiene requerimientos de presentación suficientemente diferentes de otros. Todo esto incrementa considerablemente la complejidad del sistema en su conjunto [4]. Considerando esta problemática, en aras de hacer el desarrollo de los sistemas de software más eficiente, ha surgido un patrón denominado Model View Controller (MVC) que tiene la intención de particionar las aplicaciones interactivas en tres componentes independientes. Tal como su nombre lo indican estos son: Modelo o Model, Vista o View, y Controlador o Controler. El primero de estos elementos representa el modelo de datos de la aplicación, la estructura de los mismos y la lógica de acceso a ellos. El segundo se refiere a la capa de presentación donde serán mostrados los datos de una o varias maneras con sus correspondientes comportamientos visuales, y a través de la cual se interactúa con la aplicación para acceder a la información. Por su parte, el último de estos elementos se encarga de contener y procesar la lógica que debe seguirse en la aplicación. Aquí se procesan los eventos manipulados por los usuarios, los cuales pueden desencadenar actualizaciones de los datos o una manipulación directa de estos en la vista. Controla la interacción entre la Vista y el Modelo y las secuencias de peticiones con sus respectivas respuestas [8] [18] [4] [12]. Este patrón propone una comunicación entre estos tres elementos o partes del sistema a través de interfaces que son brindadas por cada uno, de manera que se mantenga un alto desacoplamiento entre ellos, pudiéndose realizar variaciones en cualquiera, sin que el resto de la aplicación se vea afectada. Esta interacción se produce como se explica a continuación: Cuando un usuario interactúa con los componentes de la interfaz de usuario en la vista, se disparan eventos hacia uno o 2 más controladores para realizar su procesamiento. Si estos eventos requieren cambios en el Modelo, el Controlador invoca estos cambios en el Modelo o invoca operaciones específicas de la aplicación que conducen a dichos cambios. Si los eventos requieren cambios en los componentes de la Vista, el controlador los manipula directamente adicionando o eliminando elementos que luego serán mostrados en la Vista [4]. El manejo de eventos es un elemento de vital importancia para la comunicación entre cada una de las capas. A continuación se muestra la estructura del patrón MVC en la Figura 1. Figura 1. Estructura del patrón MVC. Tomado de [4] Con MVC se hacen palpables beneficios tales como [8] [18] [4] [9]: • Se hace más eficiente la construcción de aplicaciones que requieren diferentes representaciones de una misma información dado que permite simplemente construir vistas distintas que interactúen con el mismo controlador y la misma estructura o modelo de datos. • De la misma forma pueden ser representadas diferentes interfaces condicionadas por distintos look and feel, a su vez establecidos por la necesidad de un desarrollo necesario para diferentes Sistemas Operativos (SO), o sea multiplataforma. • Se hace palpable la reusabilidad de componentes de interfaz ya que estos no se encuentran integrados con ninguna información de lógica de negocio o de acceso a datos. • El desacoplamiento con el modelo y el controlador permite que los cambios realizados en estas capas no afecten a las restantes, lo cual permite mayor eficiencia en el desarrollo y mantenimiento, dado que ya no se emplea tiempo ni esfuerzo en realizar cambios en toda la aplicación por el hecho de que sus partes se encuentren con un alto grado de acoplamiento. B. Model-2 MVC En el caso de las aplicaciones Web, el hecho de que estas dependan del protocolo HyperText Transfer Protocol (HTTP) altera la manera en que implementan el patrón MVC. De esta forma se puede comprender el término Model-2 como una adaptación de MVC para Web [4] [12]. CCIA’2008 Tal como se muestra en la Figura 2, con Model-2 los usuarios interactúan con una interfaz Web a través de un navegador y las peticiones son enviadas al servidor. En dicho servidor se encuentra un servlet controlador que se encuentra a la escucha de peticiones con determinadas direcciones URL. Este servlet, al recibir las peticiones, se encarga de interactuar con el Modelo y luego de esto determinar a cuales componentes de la Vista se le dará el control para generar la respuesta. Como parte del proceso de generación de respuesta, los componentes de la vista pueden realizar consultas al modelo [18] [17] [4]. 3 brindar a los desarrolladores la posibilidad de crear Interfaces gráficas de usuario y pintar gráficos e imágenes. Este conjunto de clases vienen a conformar un paquete de componentes visuales de interfaz de usuario que se puede observar en la Figura 3 [15] [5] [6]. Figura 3. Componentes visuales de AWT. Tomado de [15] Figura 2. Estructura de Model-2. Tomado de [17] C. Composite View En cuanto a concepción de interfaces de usuario gráficas se cuenta con un importante patrón conocido como Composite View [1]. Este patrón permite tratar un conjunto de objetos como un todo único. Consiste en formar interfaces de usuario a partir jerarquías de componentes con complejidad arbitraria, donde existen componentes contenedores y primitivos con comportamientos propios y que son tratados de forma individual, pero que en su conjunto y con la interacción entre ellos forman interfaces uniformes [1] [4] [14]. Este patrón posibilita y promueve la reutilización de componentes y la combinación de ellos para la creación de interfaces de diferentes formas. Posibilita la creación de interfaces a partir de plantillas en las que pueden ubicarse los componentes de distintas maneras [1]. D. Observer Patern Para el manejo de ellos, existe un patrón conocido como Observer Pattern. Este patrón persigue el objetivo de notificar automáticamente a objetos dependientes sobre el estado de aquellos objetos que son de su interés. Esto propicia que, al ser detectadas las variaciones o eventos emitidos por los objetos, estos desencadenen las acciones y procesamientos pertinentes que deben ocurrir en cada uno de los niveles de la aplicación. III. ABSTRACT WINDOWS TOOLKIT (AWT) Y SWING AWT es un paquete brindado por la plataforma Java 2 que está formado por un conjunto de clases diseñadas con el fin de La librería Java Fundation Clases (JFC), creada para Java por Sun Microsystems, Netscape Comunications entre otros integrantes [19], consta de seis partes importantes: AWT, Swing, Accessibility, Java 2D, y Drag and Drop. Java 2D se ha convertido en una parte integral de AWT, Swing toma lugar a partir de AWT y Accessibility se encuentra dentro de Swing. De esta manera puede comprenderse que AWT se encuentra en el centro de JFC y constituye una de las librerías más importantes de Java 2 en general [15]. Los componentes de AWT, original versión de Java para elementos de interfaz de usuario, resultaron insuficientes para la representación del mundo real a través de aplicaciones basadas en formularios. Todos los elementos básicos se encuentran en esta librería pero el conjunto de componentes es muy reducido y estos resultan muy restrictivos. Por ejemplo: no se puede ubicar una imagen dentro de un botón. Es por esto esencialmente que se produce el surgimiento de la librería Swing [19]. Swing consiste en un extenso conjunto de componentes de interfaz que heredan de las clases definidas en AWT. Es por esto que, como se mencionó en la sección de AWT, Swing está concebido a partir de la estructura de esta librería [15] [5] [6]. La gran mayoría de los componentes AWT encuentran su análogo en los de Swing -usualmente nombrados de igual manera pero con el prefijo “J”-, y en este último existe una buena cantidad de componentes nuevos como se muestra en la Figura 4 [15] [19]. Obviamente, de esta manera puede tenerse una idea de cuánto más rico se presenta Swing en cuanto a componentes se refiere. CCIA’2008 Figura 4. Componentes visuales del paquete Swing. Tomado de [15] A continuación, en la Figura 5 se muestra una pequeña representación de la estructura de clases de donde provienen todos los componentes de Swing: Figura 5. Estructura de clases que de donde descienden los componentes de Swing. Tomado de [4]. Todos los componentes provienen primeramente de la clase Component de AWT que posee las propiedades y servicios básicos para cualquier componente como el manejo de eventos y su posicionamiento por ejemplo. La clase Container, también de AWT le da a los componentes la posibilidad de contener otros componentes dentro de sí. En ella se incluye una lista donde se agrupan y ordenan sus componentes hijos. Así mismo posee la posibilidad de establecer un esquema en el componente, conocido como 4 Layout, dentro del cual se ubicarán los componentes hijos para ser mostrados organizadamente dentro de si [4] [19]. Con el uso de esta estructura de componentes de interfaz, Swing implementa típicamente el patrón Composite mencionado anteriormente. Propone interfaces de usuario con una estructura formada por una jerarquía de componentes en la que aparecen contenedores de alto nivel y una serie de componentes hijos asociados a estos. Esta jerarquía permite formar cada interfaz a partir de estos componentes contenidos unos dentro de otros formando un todo único funcional [4]. Los contenedores de alto nivel pueden ser JFrame, JDialogs o JApplets, y son las ventanas dentro de las cuales pueden ser representados el resto de los componentes. Los demás componentes, derivados de JComponent, al provenir de la clase Container, pueden ser a su vez contenedores e incluir dentro e si otros componentes, o simplemente pueden no actuar como contenedores y realizar determinadas funciones útiles para el usuario que interactúa con la aplicación a través de ellos [15] [4]. Un elemento de relevante importancia de Swing es el hecho de que sus componentes están creados 100% en Java. De esta manera, a diferencia de AWT, los mismos no necesitan mostrarse como los componentes análogos presentados por las diferentes plataformas, lo cual le confiere a Swing un marcado carácter multiplataforma ya que sus componentes pueden ser mostrados idénticamente en Macintosh, Solaris, Linux, o Windows [15]. Swing no está estrictamente basado en la forma tradicional propuesta por el patrón MVC. En sus componentes se encuentran unidas las capas Vista y Controlador en lo que se denomina UI Delegate [15] [19]. En las aplicaciones Swing, dada la riqueza de componentes que permite una gran diversidad de formas para mostrar la información y el manejo de la misma, en ocasiones se cuenta con que un mismo componente posee más de un modelo de datos, o por el contrario, un mismo modelo puede ser representado por diferentes componentes con los comportamientos propios de cada uno. Por todo esto se busca una menor complejidad en la interacción entre las capas Vista y Controlador dado que sus funcionalidades ocurren juntas dentro de dichos componentes. De esta forma cada componente, empaqueta su vista y controlador en un único objeto denominado UI Delegate que se encarga de las dos labores, la representación visual y el manejo de eventos provocados por el usuario [15]. En relación con el manejo de eventos, puede decirse que Swing hace uso del patrón Observer descrito anteriormente para dar a sus componentes la posibilidad de dar respuesta a los eventos manejados por los usuarios. Teniendo en cuenta este patrón, a los componentes de Swing se les pueden registrar oyentes, o Listener, de manera que siempre se encuentren detectando la ocurrencia de algún evento esperado en componentes de interés para el correspondiente procesamiento [15] [19]. CCIA’2008 IV. SERVLET Y JAVASERVER PAGES (JSP) Servlet es una de las tecnologías más importantes de la plataforma Java. Ella constituye la fundación del desarrollo de aplicaciones Web utilizando el lenguaje de programación Java y constituye la base sobre la cual se soporta posteriormente JSP. Los Servlet son clases Java que proporcionan comportamiento dinámico a una aplicación Web. Con ellas se construyen páginas Web en respuesta a las peticiones del cliente a partir de código Java. Estas clases son cargadas y ejecutadas por un servidor Web especial que se ha decidido nombrar Servlet Container o Servlet Engine en sus inicios. La interacción entre los servlets y los clientes se produce a través de ciclos petición-respuesta basados en el protocolo HTTP [11]. En su modo de funcionamiento, un Servlet es cargado por el Servlet Container la primera vez que es necesitado para el procesamiento de una petición. Seguidamente el contenedor le reenvía dicha petición, esta es procesada y la respuesta generada es retornada al Servlet Container, quien finalmente se encarga de enviarla al cliente. Luego de terminada esta secuencia el Servlet se mantiene cargado de manera que puede ser utilizado para responder a próximas peticiones. Por otro lado, la clase del Servlet guarda una marca de tiempo que refleja la última vez que fue actualizado. Esta marca es encuestada en todo momento por el contenedor. Cuando se detecta que la misma es más reciente que la última vez de encuesta, el Servlet vuelve a ser cargado en memoria manteniéndose siempre actualizado el Servlet Container [11]. En la programación con Servlet las páginas HTML o XML deben ser generadas a partir de la programación en Java. Un ejemplo se muestra a continuación tomado de [11]. 5 En el momento en que los Servlet fueron ganando popularidad, para dar solución a esta problemática surgió la tecnología JSP. Esta no constituye una sustitución de la tecnología Servlet existente, sino que se convierte en una extensión de la misma [11]. JSP es una tecnología basada en plataforma Java para la construcción de aplicaciones Web. Se basa en incluir tags dentro del código de las páginas html y salvar las mismas con extención .jsp. Dentro de estos tags (<% ... %>) se incluye código Java que es ejecutado del lado del servidor. Esto permite combinar plantillas estáticas con contenido dinámico para la conformación de una respuesta, y así generar dinámicamente solo aquellos elementos que requieren este comportamiento [13]. Un ejemplo de una página jsp tomado de [8] se muestra a continuación. JSP está diseñada sobre la base de la tecnología Servlet y necesita de ella para su funcionamiento. En aplicaciones JSP, el Servlet Container es sustituido por un JSP Container y ambos son referidos como Web Container o Servlet/JSP Container. Dentro del JSP Container se encuentra un servlet especial llamado page compiler. Al recibir peticiones HTTP que coinciden con la extención .jsp, el contenedor las envía a este servlet específicamente. Al recibir estas peticiones el page compiler las traduce en una clase servlet para ser procesadas y emitir la respuesta.Una vez compilado este jsp servlet, el mismo es guardado en memoria para futuras peticiones. JSP finalmente se convierte en un paso de avance para el desarrollo de aplicaciones Web de manera más eficiente. Resuelve el problema fundamental de lo arduo que resulta con Servlet el mantenimiento de grandes volúmenes de código final generado a partir de código Java estructurados en clases. V. STRUTS Struts es un framework creado específicamente para aplicaciones Web. De este modo, su arquitectura se ha diseñado de siguiendo en el patrón Model 2 MVC tal como lo muestra la Figura 6 [8] [18] [4] [9]. Esta tarea, así como el mantenimiento de las aplicaciones, se convierte en algo realmente tedioso si se tiene en cuenta que todo el código HTML o XML será generado dinámicamente a partir de las clases Java. CCIA’2008 6 contener el modelo de datos, usualmente son representados por Java Beans Empresariales o Enterprise Java Beans (EJB), Java Data Objects (JDO o frameworks de persistencia como Hibernate), o Java Beans planos que acceden a bases de datos a través de JDBC [1]. Figura 6. Estrutura de la arquitectura de presentada por Struts. Tomado de [4] A. Controlador (Controller) La esencia del controlador en Struts consiste en un servlet que se denomina ActionServlet [1]. Este es el responsable de recepcionar las peticiones provenientes de un cliente (típicamente un navegador Web), realizar el correspondiente procesamiento para generar y emitir una respuesta. Otros elementos importantes que toman parte en el lado del controlador son los Actions y los ActionsMappings. Los Action son básicamente determinados JavaBeans cuya función radica en analizar la información contenida en la petición, procesar las operaciones requeridas, opcionalmente llenar los datos que serán mostrados en la presentación y notificar cuando el control debe volver a pasar al ActionServlet. Struts posee un importantísimo fichero de configuración Extensible Markup Languaje (XML), normalmente llamado struts_config, en el cual se encuentran contenidas secciones específicas denominadas ActionMappings. Estas se encargan de realizar el mapeo de las peticiones provenientes del cliente con el correspondiente Action. En el momento de iniciar la aplicación, el ActionServlet carga el contenido del struts_config en el cual se encuentran los ActionMappings. Luego, en el momento en que se recibe una petición desde el cliente, utiliza el contenido de estas secciones para determinar que acción debe ser tomada o a que Action debe ser pasado el control en dependencia de la dirección URL de la petición. Finalmente, cuando un Action termina su ejecución, accede al ActionMapping para determinar qué dirección o JSP se enviará como respuesta y pasar el control nuevamente al ActionServlet [8] [18] [4] [9]. B. Modelo (Model) El modelo de dominio de los datos no es exactamente objeto de implementación del espacio de trabajo de Struts. Consiste en objetos de negocio de la aplicación, encargados de C. Vista (View) La capa de la vista en Struts está formada por páginas JSP nutridas de tags personalizados brindados por librerías de tags que el framework provee. La manera de llevar la información a la vista ocurre a través de unos JavaBeans denominados ActionForms. Estos elementos representan la información que se mostrará o provendrá de las paginas JSP a través de sus propiedades que coinciden con los componentes presentados por los tags. El mapeados con cada uno de los JSP se registra en el fichero de configuración struts_config [8] [18] [4] [9]. En el momento en que se reciben las peticiones, el ActionServlet, luego de hacer el mapeo correspondiente, carga en el ActionsForm adecuado todos los parámetros provenientes del cliente y es aquí donde se producen las validaciones pertinentes. Luego de esto es que es invocado el Action respectivo [8] [18] [4] [9]. Tiles Entre las librerías brindadas en el framework de Struts se encuentra una que provee elementos de relevante importancia para la construcción de interfaces. Estos elementos son denominados Tiles y le dan una composición a la Vista siguiendo el patrón Composite. Las construcciones con Tiles en las páginas JSP permiten ensamblar páginas de presentación formadas por partes componentes. Cada parte, o Tile, representa una porción del conjunto total y puede ser rehusado siempre que sea necesario dentro de la aplicación. Esto lógicamente reduce el número de páginas a mantener dentro de los sistemas y facilita los cambios de look and feel [10]. Un componente o Tile consiste en un Definition o una página. Un Definition no es más que un XML que define una plantilla parametrizada que propone una estructura de página. Este permite contener dentro de su esquema a otros Definition o páginas [4] [18]. D. Eventos En cuanto al manejo de eventos, Struts realiza esta tarea a través de lo que se llama Eventos de Aplicación. En esencia esto se trata de realizar submit a los formularios o activar hipervínculos. Puede notarse como estas acciones desencadenan el flujo que se realiza alrededor del ActrionServlet, el cual se encarga de manipular la petición que proviene producto de estos eventos y activar el correspondiente Action. En este sentido, a diferencia de Swing, donde a cada componente se le puede asignar varios Oyentes para monitorizar varios tipos de eventos, cada componente puede ser declarativamente manejador de un solo evento [4]. CCIA’2008 VI. JAVASERVER FACES (JSF) En la medida en que las aplicaciones Web han ganado en complejidad, se ha hecho inminente, en aras de facilitar su concepción y confección, la aparición de variantes que conlleven a una división lógica de los elementos de una página. Por ejemplo ocurre que los sistemas poseen múltiples formularios y diferentes elementos personalizados que confluyen en una misma página, todos los cuales procesan lógicas particulares en su funcionamiento. En este sentido se busca lograr interfaces Web más cercanas a las Desktop en cuanto a riqueza de componentes y posibilidades para la interacción de los usuarios [16]. Para administrar de una mejor manera dicha complejidad, han surgido y se han hecho populares los frameworks basados en componentes. Dichos marcos de trabajo brindan un acercamiento entre los componentes de interfaz y clases que los representan, y además manejan sus propios eventos. Esto proporciona un mayor comportamiento orientado a objeto a las aplicaciones Web que los frameworks basados en acciones como Struts. Por otro lado, los basados en componentes han elevado aun más la reutilización de componentes permitiendo esto incluso a través de múltiples aplicaciones Web [16]. Figura 7. Arquitectura de JSF. Tomado de [4]. JSF, al igual que Struts está concebido para aplicaciones Web en Java, pero se encuentra mucho más cercano a Swing en cuanto a su implementación, estructura de componentes de interfaz y reusabilidad de los mismos [4]. JSF es un framework que trata de proveer componentes similares a los de Swing, es decir, componentes manejados por eventos e interfaces componibles a partir de ellos y que pueden cambiar fácilmente su apariencia para ser ajustados a look and feel 7 determinados, pero para aplicaciones Web. Es un framework que hace uso de la arquitectura Model-2 dado el hecho que está enfocado para aplicaciones de este tipo. A semejanza de Struts, posee una noción bien definida del Modelo, la Vista y el Controlador. Pero como diferencia más sustancial se tiene que la Vista con JSF está compuesta por un árbol de componentes mientras que Struts se encuentra muy centrado en las páginas a mostrar [4] [12]. En la Figura 7 se muestra un esquema de la arquitectura de JSF. A. Controlador (Controller) El Controller está formado primeramente por un Servlet controlador llamado FacesServlet, uno o varios ficheros de configuración y un conjunto de manejadores de acciones. El primero de estos elementos tiene la responsabilidad de recibir las peticiones enviadas desde el cliente Web y, transitando por una serie de pasos, preparar y enviar una respuesta [4] [12] [2]. Los pasos que se siguen en este procedimiento son los siguientes. • Recuperar la Vista (Restore View): Este es en esencia el proceso de creación de un árbol de componentes asociado a la página de la petición enviada. • Aplicar Valores de la Petición (Apply Request Values): Una vez conformado el árbol de componentes, este es actualizado con la información contenida en la petición. Esto incluye no solo los campos establecidos sino también los eventos de los componentes de interfaz que deben ser procesados en próximas etapas. • Procesar Validaciones (Process Validations): En esta etapa se produce el chequeo de las validaciones para los componentes de interfaz. • Actualizar Valores del Modelo (Update Model Values): Aquí se produce la actualización de los elementos del modelo que se refieren en los componentes de interfaz. • Invocar Aplicación (Invoke Aplication): En esta fase son ejecutados todos los eventos (ActionEvents) que ejecutan una funcionalidad dada. Normalmente aquí en estos eventos se interactúa con objetos de negocio. • Emitir Respuesta (Render Response): Una vez realizado el procesamiento de la petición con todo lo anterior, cualquier respuesta se generará a partir del actual árbol de componentes, incluyendo las modificaciones realizadas, o a partir de un nuevo árbol. Siempre que se usen páginas JSP para la Vista, cada árbol de componentes estará asociado a una de estas en particular. B. Modelo (Model) El Modelo, por su concepto, consiste en la parte de la aplicación que se encarga de contener los datos y la lógica de negocio asociada a ellos. En JSF, consiste en JavaBeans o CCIA’2008 clases planas cuyo objetivo es respaldar los datos de los componentes de interfaz y contener la lógica de manipulación y acceso a los mismos. Algo similar a lo que se conoce en Struts como ActionForm [4] [12]. C. Vista (View) En JSF, la Vista está concebida siguiendo el patrón Composite Patern [14] [4]. Teniendo en cuenta este patrón, JSF consiste esencialmente en el árbol de componentes. Lo cual representa la jerarquía de componentes JSF que van a conformar la interfaz de usuario. Esto le confiere la característica de poder representar la información de distintas maneras de acuerdo con la interfaz requerida en un momento dado, ya que los componentes de interfaz pueden ser mostrados de manera diferente para soportar distintos tipos de interfaces. Ellos son llevados a las páginas JSP a partir de etiquetas predefinidas que determinan su representación en la interfaz Web [4] [2] [12]. Otro elemento importante es que los componentes de interfaces confieren a las aplicaciones Web un mayor comportamiento manejado por eventos. En la interacción del usuario con el cliente Web, por ejemplo al marcar un check box, se pueden disparar eventos que se asocian a estos componentes. Estas acciones pueden desencadenar procedimientos o cambios en la apariencia del propio componente o de otros en el árbol [4]. Con esto se amplían las posibilidades de disparar eventos desde las acciones ejecutadas por los usuarios a nivel de interfaz en la Web, semejándose de esta forma un poco más a lo que ocurre en aplicaciones desktop desarrolladas, por ejemplo, con Swing. D. Eventos Como se mencionó anteriormente, los eventos son elementos importantes dentro de una arquitectura MVC. JSF, por su parte, hace uso de Observer Pattern para realizar el manejo de eventos y la comunicación entre Vista, el Controlador y el Modelo. Este framework posee dos tipos de eventos, los conocidos como Value Changed y los Actions. Los primeros son utilizados para observar los cambios ocurridos en las propiedades de de los componentes de interfaz de usuario, por ejemplo la expansión de un nodo en un árbol o el cambio del texto en un campo de texto. Los Actions tienen que ver con la activación de componentes de interfaz de usuario como hipervínculos y botones [4]. JSF provee interfaces oyentes que, al ser implementadas por los componentes donde se desea recibir un evento, les permiten el chequeo automático de la ocurrencia del mismo. Estas interfaces son, en correspondencia con los tipos de eventos antes mencionados, ValueChangeListener y ActionListener. Cuando se implementan estas interfaces deben ser adicionados métodos en los cuales se implementa el código que debe ser ejecutado en dicho evento (processValueChange(…) o processAction(…) ). Lógicamente, estos métodos son invocados por los oyentes cuando estos son notificados de la ocurrencia de un evento [4] [12]. 8 VII. STRUTS 2 Struts 2 no constituye una nueva versión del framework Struts. En realidad se trata de uno completamente nuevo. Struts 2 es un framework destinado a aplicaciones Web que igualmente implementa el patrón MVC en su variante Model 2 o Front Controller. Pero a diferencia de Struts incluye nuevos recursos en su arquitectura que lo hacen más flexible y menos complejo en su accionar. Estos nuevos elementos son los interceptores (interceptors), el uso de configuraciones basadas en anotaciones para disminuir o eliminar las configuraciones por XML, el Object-Graph Navigation Languaje (OGNL) y los ValueStack [3]. Más adelante se mostrará lo que esto significa y cómo se inserta en el flujo de trabajo propuesto por Struts 2. Algo muy importante que se debe destacar en cuanto a Struts 2 es que este sigue siendo un marco de trabajo centrado en ‘acciones’ al igual que Struts. [16]. La Figura 1.9 muestra la implementación del patrón MVC por Struts 2. Figura 8. Implementación de MVC por Struts 2. A. Controlador (Controller) El controlador es presentado por un servlet llamado FilterDispatcher. Este se encarga de realizar, el mapeo de las peticiones provenientes del cliente a las diferentes Acciones que se deben invocar. Su trabajo, al igual que en los frameworks anteriores es meramente administrativo, no encierra en modo alguno lógica de negocio asociada a la aplicación en particular y es manipulado por la implementación del framework. El mapeo necesario entre las URL y las acciones se realiza a través de ficheros de configuración XML o de ‘anotaciones Java’ [3]. B. Modelo-Acción (Model) En Struts 2, el modelo se encuentra implementado por los propios componentes de acciones ‘Actions’. El modelo representa un estado interno de la aplicación. Dicho estado está constituido por dos partes importantes: el modelo de datos y la lógica de negocio asociada a ellos [3]. Luego de recibir las peticiones, el controlador consulta los ficheros de mapeo para encontrar la acción correspondiente CCIA’2008 que debe ser invocada. En este momento se preparan los datos provenientes de la petición y se ejecuta la lógica necesaria por parte del componente de acción. Finalmente el control es pasado a los componentes de la vista, en los cuales se mostrará la información resultante. C. View-Result (Vista) La vista consiste específicamente en páginas JSP u otras tecnologías de presentación. Las paginas resultantes son la expresión al usuario del estado de la aplicación. Al finalizar la ejecución de una acción la vista-resultado es la representación del estado final de la aplicación luego del proceso realizado, y es responsabilidad del Action decidir cual resultado mostrar al finalizar su labor [3]. D. Nuevos elementos en el flujo de trabajo de Struts 2 (Interceptors, OGNL y ValueStack) La Figura 1.10 muestra el ciclo de trabajo que define Struts 2. acción que se invoque, teniendo en cuenta que esto no forma parte del las tareas propias de la acción. El uso de un interceptor permite, definiendo en él proceso de loggeo necesario, que este pueda ser invocado al inicio de la ejecución de cada acción. Otras utilidades muy comunes son la validación de datos, la conversión y la subida de ficheros al servidor. ValueStack: Estos elementos constituyen áreas en donde se almacenan los datos asociados al procesamiento de las peticiones. Dicha información se almacena en los ValueStack en el momento de preparación de los datos para el procesamiento de las peticiones, es utilizada durante la ejecución de las acciones y es leída de dichos elementos para conformar la respuesta. Los ValueStack son manipulados a través del lenguaje de expresiones OGNL. VIII. RESULTADOS La realización de este estudio sobre las principales variantes para el desarrollo de aplicaciones clientes en entorno Java, ha permitido al autor de este trabajo y un conjunto de Ingenieros y profesores del grupo de investigación GISTI de la CUJAE tener una mayor visión en cuanto a tecnologías y opciones para el desarrollo de su trabajo. En este aspecto ha tenido un relevante aporte en las decisiones que se están valorando para la concepción de una nueva versión del Sistema de Gestión de la Nueva Universidad SIGENU. Así mismo ha sido de gran utilidad como parte de la investigación que realiza el autor de este trabajo en aras de buscar variantes para mejorar la eficiencia en el desarrollo de aplicaciones del lado del cliente. A modo de conclusión final, el equipo de desarrollo de SIGENU decidió la utilización de JSF. Esto se debió a que el mismo es un framework que brinda muchas bondades dado su comportamiento mucho más orientado a objeto, a la riqueza de sus componentes y, lógicamente, a que se desea realizar el trabajo en plataforma Web. REFERENCIAS Figura9. Flujo de trabajo de Struts 2. Según lo visto anteriormente puede comprenderse fácilmente el flujo que se ha descrito. En él la petición llega proveniente del cliente, el controlador selecciona la acción correspondiente y le pasa el control. Se guardan los datos que conforman el modelo en el componente de acción y se ejecuta la lógica contenida en el mismo. Finalmente este pasa determina la respuesta que se emitirá y pasa el control a las páginas que serán mostradas. Pero en la arquitectura definida por este framework aparecen nuevos elementos (Interceptors, OGNL y ValueStack) que resultan importantes y le han dado la pincelada característica y novedosa que posee este marco de trabajo. Interceptores: “Son componentes que se ejecutan antes y después del procesamiento de las peticiones y pueden ser reutilizados en diferentes contextos.” [3] Para una mejor comprensión se cita un ejemplo que ilustra muy bien la utilidad de un interceptor: Este es el caso de un proceso de logging que debe ser ejecutado al inicio de cada 9 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] Alur DC, John; Malks. Dan. Core J2EE Patterns: Best Practices and Design Strategies, 2a Edición ed., 2003. Bergsten H. JavaServer Faces O'Reilly Media, Inc, 2004. Brown DD, Chad Michael; Stanlick, Scott. Struts 2 in Action Manning Publications Co, 2008. Dudney B, Lehr J, Willis B, Mattingly L. Mastering JavaServer Faces Willey Publishing Inc, 2004. Eckel B. Thinking in Java, 2a Edición ed., 2000. Eckel B. Thinking in Java, 3a Edición ed., 2002. Erickson R. Service Oriented Architecture. Successful SOA Implementation, 2004. Goodwill J. Mastering Jakarta Struts Wiley Publishing, Inc, 2002. Hightower R. Jakarta Struts Live SourceBeat, LLC, 2004. Husted TB, Ed; McClanahan, Craig R. Struts User Guide, 2003. Kurniawan B. Java for the Web with Servlets, JSP, and EJB: A Developer's Guide to J2EE Solutions New Riders Publishing, 2002. Mann KD. JavaServer Faces In Action Manning Publication Co, 2005. Pekowsky L. JavaServer Pages, 2a Edición ed. Addison Wesley, 2003. Richardson WC, Avondolio D, Schrager S, Mitchell MW, Scanlon J. Professional Java JDK 6 Edition Wiley Publishing, Inc, 2007. Robinson MV, Pavel. Swing, 2a Edición ed. Manning Publications Co, 2003. Roughley I. Starting Struts2 C4Media Inc, 2006. CCIA’2008 10 [17] [18] [19] Shenoy SM, Nithin. Struts Survival Guide-Basics to Best Practices ObjectSource LLC, 2004. Spieldman S. The Struts Framework - Practical Guide for Java Programmers Morgan Kaufmann Publishers, 2003. Zukowski J. The Definitive Guide To Java Swing, 3a Edición ed. Apress, 2005.