martes, 16 de octubre de 2012

Modelo Vista Controlador (MVC)

Modelo Vista Controlador (MVC) es un patrón o modelo de abstracción de desarrollo de software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de negocio en tres componentes distintos.


Arquitectura MVC


  • Modelo: Esta es la representación específica de la información con la cual el sistema opera. En resumen, el modelo se limita a lo relativo de la vista y su controlador facilitando las presentaciones visuales complejas. El sistema también puede operar con más datos no relativos a la presentación, haciendo uso integrado de otras lógicas de negocio y de datos afines con el sistema modelado.
  • Vista: Este presenta el modelo en un formato adecuado para interactuar, usualmente la interfaz de usuario.
  • Controlador: Este responde a eventos, usualmente acciones del usuario, e invoca peticiones al modelo y, probablemente, a la vista.

Aunque se pueden encontrar diferentes implementaciones de MVC, el flujo que sigue el control generalmente es el siguiente:
  1. El usuario interactúa con la interfaz de usuario de alguna forma (por ejemplo, el usuario pulsa un botón, enlace, etc.)
  2. El controlador recibe (por parte de los objetos de la interfaz-vista) la notificación de la acción solicitada por el usuario. El controlador gestiona el evento que llega, frecuentemente a través de un gestor de eventos (handler) o callback.
  3. El controlador accede al modelo, actualizándolo, posiblemente modificándolo de forma adecuada a la acción solicitada por el usuario (por ejemplo, el controlador actualiza el carro de la compra del usuario). Los controladores complejos están a menudo estructurados usando un patrón de comando que encapsula las acciones y simplifica su extensión.
  4. El controlador delega a los objetos de la vista la tarea de desplegar la interfaz de usuario. La vista obtiene sus datos del modelo para generar la interfaz apropiada para el usuario donde se reflejan los cambios en el modelo (por ejemplo, produce un listado del contenido del carro de la compra). El modelo no debe tener conocimiento directo sobre la vista. Sin embargo, se podría utilizar el patrón Observador para proveer cierta indirección entre el modelo y la vista, permitiendo al modelo notificar a los interesados de cualquier cambio. Un objeto vista puede registrarse con el modelo y esperar a los cambios, pero aun así el modelo en sí mismo sigue sin saber nada de la vista. Este uso del patrón Observador no es posible en las aplicaciones Web puesto que las clases de la vista están desconectadas del modelo y del controlador. En general el controlador no pasa objetos de dominio (el modelo) a la vista aunque puede dar la orden a la vista para que se actualice. Nota: En algunas implementaciones la vista no tiene acceso directo al modelo, dejando que el controlador envíe los datos del modelo a la vista. Por ejemplo en el MVC usado por Apple en su framework Cocoa. Suele citarse como Modelo-Interface-Control, una variación del MVC más puro
  5. La interfaz de usuario espera nuevas interacciones del usuario, comenzando el ciclo nuevamente....


¿Cómo trabaja el API JMS con la plataforma J2EE?



¿Cómo trabaja el API JMS con la plataforma J2EE?
Cuando el API JMS fue introducida en 1998, el propósito más importante era permitir a aplicaciones JAVA el acceso a sistemas middleware orientados a mensajes (MOM) como MQSeries de IBM. Desde esto muchos vendedores han adoptado e implementado el API JMS, hasta que en la actualidad un producto JMS puede aportar una completa capacidad de sistemas de mensajes para una empresa.
En la versión 1.2 de la plataforma J2EE, era necesario un proveedor del servicio, basado en
Tecnología J2EE, para aportar las interfaces de el API JMS, pero no era necesario para
implementarlas. Ahora, con la versión 1.3 (“the J2EE 1.3 platform”), el API JMS es una parte integrada de la plataforma, y desarrolladores de aplicaciones pueden usar el sistema de mensajes entre componentes usando las APIs de J2EE.
El API JMS en la plataforma J2EE 1.3 tiene las siguientes características.
- Aplicaciones cliente, componentes JavaBeans™ empresariales (EJB™) y componentes Web pueden enviar y recibir síncronamente mensajes JMS. Las aplicaciones cliente pueden recibir mensajes JMS de manera asíncrona. (No son necesarios Applets para soportar el API JMS).
- Una nueva clase de bean, el Message-Driven bean, permite la consumición asíncrona de mensajes. El proveedor JMS puede opcionalmente implementar procesos de mensajes concurrentes con message-driven beans.
- Mensajes recibidos y enviados pueden participar en transacciones distribuidas.
La unión del API JMS a la plataforma J2EE permite una simplificación de desarrollo empresarial, permitiendo interacciones escasamente acopladas, seguras y asíncronas entre componentes J2EE y sistemas con capacidad de mensajería. Un desarrollador puede fácilmente añadir nuevos comportamientos a una aplicación basada en tecnología J2EE mediante la creación de un nuevo message-driven bean para operar con eventos empresariales específicos.
La arquitectura de contenedor de los EJB, mejora el API JMS mediante la aportación de soporte para transacciones distribuidas y permitiendo la consumición concurrente de mensajes.
2. CONCEPTOS BÁSICOS DE JMS
Una aplicación JMS, está compuesta por las siguientes partes:
♦ Un proveedor JMS es un sistema de mensajes que implementa las interfaces de JMS y proporciona características administrativas y de control. Las implementaciones de la plataforma J2EE 1.3 incluyen un proveedor JMS.
♦ Clientes JMS son los programas o componentes escritos en Java™ que producen y consumen mensajes.
♦ Mensajes son los objetos que trasladan información entre clientes.
♦ Objetos Administrados que son objetos JMS preconfigurados, creados por el administrador para el uso de los clientes. Los 2 tipos de son connection factories destinations, explicados más adelante.
♦ Clientes Nativos que son programas que usan los productos de la API de clientes nativos en vez de el API JMS.

REST


REST

Los 4 principios de REST


Una implementación concreta de un servicio web REST sigue cuatro principios de diseño fundamentales:

  • Utiliza los métodos HTTP de manera explícita
  • No mantiene estado
  • Expone URIs con forma de directorios
  • Transfiere XML, JavaScript Object Notation (JSON), o ambos

A continuación vamos a ver en detalle los dos últimos principios de REST, y explicaremos porqué son importantes a la hora de diseñar un servicio web REST.

REST expone URIs con forma de directorios


Desde el punto de vista del cliente de la aplicación que accede a un recurso, la URI determina qué tan intuitivo va a ser el web service REST, y si el servicio va a ser utilizado tal como fue pensado al momento de diseñarlo. La tercera característica de los servicios web REST es justamente sobre las URIs.

Las URI de los servicios web REST deben ser intuitivas, hasta el punto de que sea facil adivinarlas. Pensemos en las URI como una interfaz auto-documentada que necesita de muy poca o ninguna explicación o referencia para que un desarrollador pueda comprender a lo que apunta, y a los recursos derivados relacionados.

Una forma de lograr este nivel de usabilidad es definir URIs con una estructura al estilo de los directorios. Este tipo de URIs es jerárquica, con una única ruta raíz, y va abriendo ramas a través de las subrutas para exponer las áreas principales del servicio. De acuerdo a esta definición, una URI no es solamente una cadena de caracteres delimitada por barras, sino más bien un árbol con subordinados y padres organizados como nodos. Por ejemplo, en un servicio de hilos de discusiones que tiene temas varios, se podría definir una estructura de

La raíz, /discusión, tiene un nodo /temas como hijo. Bajo este nodo hay un conjunto de nombres de temas (como ser tecnología, actualidad, y más), cada uno de los cuales apunta a un hilo de discusión. Dentro de esta estructura, resulta fácil recuperar hilos de discusión al tipear algo después de /temas/.

En algunos casos, la ruta a un recurso encaja muy bien dentro de la idea de estructura de directorios. Por ejemplo, tomemos algunos recursos organizados por fecha, que son muy prácticos de organizar usando una sintaxis jerárquica.

El primer fragmento de la ruta es un año de cuatro dígitos, el segundo fragmento es el mes de dos dígitos, y el tercer fragmento es el día de dos dígitos. Puede resultar un poco tonto explicarlo de esta manera, pero es justamente el nivel de simpleza que buscamos. Tanto humanos como máquinas pueden generar estas estructuras de URI porque están basadas en reglas. Como vemos, es fácil llenar las partes de esta URI, ya que existe un patrón para crearlas:

Podemos también enumerar algunas guías generales más al momento de crear URIs para un servicio web REST:

  • ocultar la tecnología usada en el servidor que aparecería como extensión de archivos (.jsp, .php, .asp), de manera de poder portar la solución a otra tecnología sin cambiar las URI.
  • mantener todo en minúsculas.
  • sustituir los espacios con guiones o guiones bajos (uno u otro).
  • evitar el uso de strings de consulta.
  • en vez de usar un 404 Not Found si la petición es una URI parcial, devolver una página o un recurso predeterminado como respuesta.

Las URI deberían ser estáticas de manera que cuando cambie el recurso o cambie la implementación del servicio, el enlace se mantenga igual. Esto permite que el cliente pueda generar "favoritos" o bookmarks. También es importante que la relación entre los recursos que está explícita en las URI se mantenga independiente de las relaciones que existen en el medio de almacenamiento del recurso.

REST transfiere XML, JSON, o ambos


La representación de un recurso en general refleja el estado actual del mismo y sus atributos al momento en que el cliente de la aplicación realiza la petición. La representación del recurso son simples "fotos" en el tiempo. Esto podría ser una representación de un registro de la base de datos que consiste en la asociación entre columnas y tags XML, donde los valores de los elementos en el XML contienen los valores de las filas. O, si el sistema tiene un modelo de datos, la representación de un recurso es una fotografía de los atributos de una de las cosas en el modelo de datos del sistema. Estas son las cosas que serviciamos con servicios web REST.

La última restricción al momento de diseñar un servicio web REST tiene que ver con el formato de los datos que la aplicación y el servicio intercambian en las peticiones/respuestas. Acá es donde realmente vale la pena mantener las cosas simples, legibles por humanos, y conectadas.

Los objetos del modelo de datos generalmente se relacionan de alguna manera, y las relaciones entre los objetos del modelo de datos (los recursos) deben reflejarse en la forma en la que se representan al momento de transferir los datos al cliente. En el servicio de hilos de discusión anterior, un ejemplo de una representación de un recurso conectado podría ser un tema de discusión raiz con todos sus atributos, y links embebidos a las respuetas al tema.

Conclusión


No siempre REST es la mejor opción. Está surgiendo como una alternativa para diseñar servicios web con menos dependencia en middleware propietario (por ejemplo, un servidor de aplicaciones), que su contraparte SOAP y los servicios basados en WSDL. De algún modo, REST es la vuelta a la Web antes de la aparición de los grandes servidores de aplicaciones, ya que hace énfasis en los primeros estándares de Internet, URI y HTTP. Como examinamos en este artículo, XML sobre HTTP es una interfaz muy poderosa que permite que aplicaciones internas, como interfaces basadas en JavaScript Asincrónico + XML (AJAX) puedan conectarse, ubicar y consumir recursos. De hecho, es justamente esta gran combinación con AJAX que generó esta gran atención que tiene REST hoy en día.


SOAP

Existe una tendencia muy marcada en las empresas por el desarrollo de aplicaciones que puedan trabajar sobre Internet, principalmente por la ventaja de la distribución global de la información. Las tecnologías más usadas para el desarrollo de estas aplicaciones, han sido CORBA , COM (Microsoft) y EJB. Cada una proporciona un marco de trabajo para la activación de objetos remotos, mediante la solicitud a un servidor de aplicaciones (o mediante un servidor Web) para la ejecución de servicios de aplicación. Estas tecnologías han probado ser efectivas para el establecimiento de sitios Web corporativos; sin embargo, presentan algunas desventajas como la falta de interoperabilidad (es posible, pero complejo, hacer interoperar COM y CORBA), la dependencia a la arquitectura de trabajo (COM está muy ligado a Windows, mientras que CORBA tiene muchas implementaciones de diversos fabricantes), así como el lenguaje de programación (COM usa primordialmente C++ y Visual Basic, mientras que EJB usa Java).

Esto ha llevado a la industria a considerar un nuevo modelo de computación distribuida de objetos, sin tener la dependencia de plataformas, modelos de desarrollo y lenguajes de programación usados. Inicialmente Microsoft, Userland Software y DeveloperMentor trabajaron para desarrollar este esquema. Surge entonces el primer borrador de la especificación SOAP en 1999. La versión 1.1 es la actualmente empleada por las compañías para sus desarrollos. Es apoyada abiertamente por SUN, IBM y Apache Org., entre otras empresas y desarrolladores independientes.

Los objetivos primordiales de SOAP, son:

a) Establecer un protocolo estándar de invocación de servicios remotos, basado en protocolos estándares de Internet: HTTP (Hiper Text Transport Protocol) para la transmisión y XML (eXtensible Markup Language) para la codificación de datos.

b) Independencia de plataforma, lenguaje de desarrollo e implementación (modelo de objetos).

El protocolo de comunicación HTTP es el empleado intrínsecamente para la conexión sobre Internet. Garantiza que cualquier cliente con un navegador estándar pueda conectarse con un servidor remoto. La transmisión de datos se empaqueta (serializa) con XML, que se ha convertido en el "parteaguas" del intercambio de datos, salvando las incompatibilidades entre otros protocolos, tales como el NDR (Network Data Representation) o el CDR (Common Data Representation). Por otra parte, los servidores Web pueden procesar las peticiones de usuario, empleando las tecnologías de servlets, paginas ASP (Active Server Pages) o JSP (Java Server Pages), o un servidor de aplicaciones, invocando objetos de los tipos CORBA, COM o EJB.

La especificación SOAP menciona que las aplicaciones deben ser independientes del lenguaje de desarrollo, por lo que las aplicaciones cliente y servidor pueden estar escritas con HTML, DHTML, Java, Visual Basic u otras herramientas y lenguajes disponibles. Lo importante es tener alguna implementación de SOAP (dependiendo de la herramienta de desarrollo elegida) y enlazar sus librerías con la aplicación. Aunque esto no es estrictamente necesario, es preferible trabajar usando dichas librerías, con el fin de no reescribir un código ya probado.

Las peticiones con el uso del protocolo HTTP emplean el comando POST para transmitir información entre el cliente y el servidor. Por ejemplo, una petición de servicio con HTTP sería:

POST /soap/services.asp HTTP/1.1

Host:148.204.20.10

Content-Type: text/plain

Content-Length: 11

Proyecto prueba!

La primera línea indica el método HTTP usado, el URI y la versión del protocolo. Para este ejemplo el método empleado es POST, la ruta de ejecución del servicio es /soap/services.asp y la versión de HTTP usada es la 1.1.

En las líneas siguientes se indica la dirección Internet de la máquina de servidor Web donde se enviará la petición, el tipo de contenido del mensaje (texto plano) y su longitud. Para indicar la terminación de la cabecera, se agrega un retorno de carro/línea siguiente. Finalmente, la última línea (Proyecto prueba!) es el contenido de la petición, que bajo SOAP, debe ser un texto XML.