<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.:: Seam City ::. &#187; framework</title>
	<atom:link href="http://seamcity.madeinxpain.com/archives/tag/framework/feed" rel="self" type="application/rss+xml" />
	<link>http://seamcity.madeinxpain.com</link>
	<description>Sobre programación en general, y Seam en particular</description>
	<lastBuildDate>Thu, 22 Jan 2009 15:35:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Comparativa de Frameworks: Cocoon 2</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-cocoon-2</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-cocoon-2#comments</comments>
		<pubDate>Mon, 07 Jan 2008 12:40:13 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/10</guid>
		<description><![CDATA[!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	
Apache Cocoon 2  es un framework opensource de publicación basado en XML/XLS y enfocado a la separación entre contenido, presentación y lógica de la aplicación, basándose en los principios de separación de responsabilidades.
La especialidad de Cocoon es la presentación, [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Apache Cocoon 2  es un framework opensource de publicación basado en XML/XLS y enfocado a la separación entre contenido, presentación y lógica de la aplicación, basándose en los principios de separación de responsabilidades.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">La especialidad de Cocoon es la presentación, pudiendo generar vistas con muy diferentes formatos a partir de una sola representación interna.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Está diseñado en distintos bloques y cada uno de ellos tiene una responsabilidad determinada. las aplicaciones desarrolladas con Cocoon son consideradas como bloques del propio framework.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">La arquitectura general del framework encontramos las siguientes capas:</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Core Cocoon</u>: Es el corazón de Cocoon. Encontramos un entorno para el control de sesiones, ficheros para configuración de Cocoon, para hacer manejo de contextos, aplicar mecanismos de caché, Pipeline, generación, compilación, carga y ejecución de programas.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Cocoon Components</u>: En esta capa encontramos los generadores de XML, transformadores de XML, matchers de ficheros y serializadores para formatear los ficheros.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Built-in Logicsheets</u>: Son hojas lógicas que necesita Cocoon para ficheros como sitemap, xsp, esql, request, response.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Site specific configuration, components, logicsheets and content</u>: Es el nivel más externo en el cual un desarrollador puede hacer configuración, creación de componentes, creación de hojas lógicas y contenido definido por el usuario de Cocoon para su aplicación</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.18cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES">  •	<font size="3"></font><font style="font-size: 11pt" size="2"><span><strong>	Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El funcionamiento de Cocoon está basado en el concepto de tubería (pipeline). Cada componente de la tubería acepta una entrada, realiza una operación y devuelve una salida, que es aceptada por otro componente.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La unidad básica de trabajo de Cocoon es el XML procedente de las páginas XSP (eXtensible Server Pages). La Las XSPs manejan la misma idea de las JSPs, es decir, páginas de servidor, con lo cual se tiene dinamismo con posibilidad de conectividad a bases de datos y con las ventajas del XML. Una XSP es simplemente un documento XML en donde se puede incluir contenido tanto estático como dinámico para generar XML de forma dinámica.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El desarrollo consiste prácticamente en escribir los archivos XSP, y solo se emplea Java para cosas puntuales, como el control del flujo del programa.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El framework define una serie de componentes, que pueden ser personalizados por el desarrollador de la aplicación. Los componentes son los siguientes:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Productores</u>: Son los ficheros fuentes de donde proviene el XML. Estos pueden ser estáticos o dinámicos (es decir creados mediante XSP). La operación de un productor se basa en transformar los datos del fichero en eventos SAX.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Procesadores</u>: Atrapan el XML de los productores para aplicarle diversos procesos, como por ejemplo hacer conectividad a una base de datos, aplicar transformaciones XSL a los documentos XML, convertir los XSP en clases Java, etc. Son el proceso principal del Pipeline. El más común es el transformador XSLT.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Formateadores</u>: Son el punto final en un Pipeline. Recogen la representación interna del XML resultante (que está dada en eventos SAX) y la preparan para enviar como respuesta al cliente en el formato adecuado.</p>
<p style="margin-left: 2.12cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El formateador o serializador más común es el serializador XML que simplemente obtiene los eventos SAX y los lleva a un documento XML.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> A nivel de usuario, el funcionamiento sería así:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 1.	El usuario solicita un documento de cualquier tipo al servidor.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 2.	La solicitud se analiza para concluir si se puede atender o no. Si no se puede atender se produce un mensaje de error.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 3.	Si se puede atender se analiza a qué productor XML corresponde se genera un documento XML con el cual se trabajará.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 4.	Se extraen las instrucciones del XML generado en el paso anterior y éstas se le pasan al procesador apropiado para que se le apliquen al XML. Al procesar el XML podría salir un XML con más instrucciones que serán tratadas en algún otro ciclo.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 5.	El XML procesado se le pasa al elemento que aplica el formato. Si el documento es un documento final,XML aplica el formato y le envía el documento formateado al cliente. En el caso que el documento XML procesado, sea código que deba ejecutarse (como en el caso de una XSP ya compilada), éste se pasa como productor de XML y se vuelve a procesar hasta que se llega a un documento XML final.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Presentación, negocio e integración. Además de estar especializado en la presentación, Cocoon permite el acceso a bases de datos desde las XSPs.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Podría decirse que utiliza un sistema pull ya que cada página XSP puede acceder todas las variables que declare, pero al no existir objetos que modelen los datos de la aplicación tampoco tendría mucho sentido.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> La internacionalización en Cocoon está basada en un transformador que usa dicccionarios XML predefinidos en distintos idiomas. El diccionario a usar se selecciona en base al Locale del usuario. Estos transformadores pueden agregarse a la tubería y actuar así sobre el XSP.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Provee de un sistema de autenticación y autorización basado en la especificación Servlet.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> También proporciona un sistema de manejo de errores.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Permite incluir en una página XSP fragmentos de otras páginas, creando la vista general juntando diferentes trozos reutilizables, según dicta el patrón de diseño Composite View .</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Proporciona una serie de validadores estándar y permite escribir tus propios validadores en java o javascript.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Dispone de un sistema de navegación basado el concepto de <em>continuations</em>. Un continuation es un objeto que almacena el estado de la aplicación (variables, pila, contador de programa&#8230;). A partir de ese objeto se puede restaurar la aplicación exactamente en el mismo estado en el que se guardó.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> En un sistema basado en el parseo y transformación de páginas XML necesita imperiosamente un mecanismo de caché. El bloque Core Cocoon proporciona ese mecanismo y almacena en memoria las páginas creadas.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Como el desarrollo se centra en archivos XML asociados a un DTD, es imposible tener errores de sintaxis. Esto compensa el hecho de que es muy dificil testear la aplicación en tiempo de ejecución debido a su naturaleza.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> No proporciona un mecanismo de mapeo O/R.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> No permite AOP.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> No existe la DI.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Cocoon dispone de un bloque para dar soporte a la tecnología Ajax de forma transparente, centrada principalmente en el manejo de formularios (envío, validación, etc).</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> La configuración está basada, obviamente, en archivos XML.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Cocoon cuenta con varios ficheros para hacer la configuración y personalización del mismo. Entre éstos, el más importante a nivel de usuario es el sitemap.xml. En este fichero se declaran los componentes y las pipelines.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Cocoon 2.2 está diseñado para integrarse con Spring a través del bloque Spring Configurator. Esto le permitiría usar las ventajas de Spring como IoC o integración con sistemas ORM.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Cocoon 2 es la nueva versión de Cocoon, totalmente reescrita con un mejor diseño. Podría considerarse el sistema de publicación de contenidos basado en XML/XLS más sólido.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> La última versión estable liberada es Apache Cocoon 2.2</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> El tiempo de aprendizaje se ve modificada por el hecho de que el desarrollo consiste básicamente en escribir los XSP, para lo que hay que estar familiarizado con el lenguaje XSLT (XSL Transformations).</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> La documentación oficial proporciona tutorial, FAQ, How-Tos, wiki, guía de usuario y desarrollador, y más. Sin embargo no profundiza demasiado y se encuentra incompleta para las últimas versiones.</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-cocoon-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Turbine</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-turbine</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-turbine#comments</comments>
		<pubDate>Mon, 24 Dec 2007 07:25:59 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/13</guid>
		<description><![CDATA[Turbine es un framework basado en la especificación Servlet que permite a los desarrolladores crear rápidamente aplicaciones web seguras. Está compuesto por varios módulos que pueden ser usados independientemente. El objetivo de Turbine es recolectar el código repetitivo en una localización y hacerlo más fácil para crear componentes reusables (tales como parsing de parámetros, Pools [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Turbine es un framework basado en la especificación Servlet que permite a los desarrolladores crear rápidamente aplicaciones web seguras. Está compuesto por varios módulos que pueden ser usados independientemente. El objetivo de Turbine es recolectar el código repetitivo en una localización y hacerlo más fácil para crear componentes reusables (tales como parsing de parámetros, Pools de conexiones a bases de datos, programación de tareas, cachés globales, integración con otras herramientas como Castor, Velocity, Webmacro, etc â¦) todas bajo una licencia (Apache) que te permite crear útiles sitios web. Ofrece una serie de servicios cargados al arranque, como logging, localización, pooling, nombramiento JNDI&#8230; Actualmente todos estos servicios se están migrando para que sean independientes del framework y puedan ser cargados a través de Avalon Component Service.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES"> <font size="3"></font><font style="font-size: 9pt"><span><strong>	• Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sigue un modelo basado en el patrón de diseño FrontController y el patrón Command<a href="#sdfootnote1sym" title="sdfootnote1anc" class="sdfootnoteanc" name="sdfootnote1anc"><sup>1</sup></a> . Las clases-acción son usadas para manejar cualquier petición del usuario que requiera interacción con el modelo. Pueden asociarse diferentes acciones para cada elemento de entrada de un formulario html. Las acciones no son asociadas con una única página, si no que puedes reutilizar una acción con varias páginas distintas.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Los módulos que componen Turbine son los siguientes:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Action</u>: Pemite realizar acciones en respuesta a peticiones HTTP del usuario.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Page</u>: Es el primer módulo en la cadena de ejecución de la generación de páginas. Se le considera como una caja que contiene al resto de módulos. Se encarga de comprobar si hay una Action definida en la petición y ejecutarla.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Screen</u>: Es considerado el cuerpo de la página web. En este módulo es donde se genera el HTML. Desde este módulo se puede ejecutar código externo para hacer uso de frameworks de presentación como Cocoon, o importar datos de la capa de integración.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Navigation</u>: Representa los menús de navegación y se encarga de controlar el flujo de páginas.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Layout</u>: Define la estructura física de la página. Define la posición del menú Navigation y del cuerpo (Screen) de la página.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> • <strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El núcleo del framework es capaz de manejar la capa de presentación y negocio.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Es capaz de usar ambos sistemas, Push y Pull.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Puedes asociar una clase-acción con una página y hacer uso de sus variables, pero también puedes invocar una serie de componentes definidos en el API.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Internacionalización (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Turbine cuanta con un sistema de Internacionalización y localización llamado Fulcrum, que se está migrando para ser un servicio independiente. Permite accceder a mensajes multiidioma desde los motores de plantillas.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Dispone de un servicio para manejar Usuarios, Grupos, Roles y Permisos en el sistema, permitiendo que a estos objetos interactuar con bases de datos o LDAP. El servicio además permite que la seguridad sea manejada sin ningún backend.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Turbine viene integrado con velocity como sistema de plantillas. De hecho, originalmente velocity fue diseñado como parte de Turbine. También tiene servicios para integrarse con FreeMarker.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El subsistema Intake se encarga de la validación de las entradas de formularios basándose en las restricciones definidas en un archivo XML.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El módulo Navigation es el encargado de controlar el fujo de navegación de la aplicación.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> A través de los servicios cargados al inicio proporciona un mecanismo de almacenamiento de objetos en memoria.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para las pruebas de unidad no hay problema ya que las calses-acción son POJOs. Para las pruebas de integración se necesita hacer uso de un contenedor de servicios avalon como Phoenix o Excalibur.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Turbine viene integrado con Torque. Torque es un paquete que se encarga de manejar la relación de la aplicación web con la base de datos. Representa la base de datos a través de un esquema XML y genera una serie de objetos que se comunican con la aplicación y el esquema.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Originalmente Torque se desarrolló como parte del framework Turbine en la versión 2.1, pero después pasó a ser una aplicación independiente.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También permite la integración con otros sistemas ORM como OJB o Hibernate.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No soporta Programación Orientada a Aspectos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No soporta Inyección de dependencias.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El soporte para Ajax depende del motor de visualización que se emplee.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se puede especificar la configuración de dos formas, a través de una archivo properties o a través de un archivo XML.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Turbine está diseñado de forma modular con el fin de ser fácilmente extensible y poder hacer uso de tecnologías externas como sistemas ORM o motores de plantillas.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Turbine es un framework maduro y estable con mas de 6 años de experiencia y ha sido usado como base de otros proyectos como Jetspeed.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Páginas como www.netbeans.org o www.openoffice.org hacen uso de Turbine.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La versión recomendada desde la página oficial es Apache Turbine 2.3.2</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El núcleo del framework se basa en un modelo popularmente conocido, y el resto de funcionalidades se ofrecen como servicios, por lo que la curva de aprendizaje es relativamente pequeña para desarrolladores con experiencia.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> • <strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Ofrece una buena visión general del framework pero el tutorial y la guía de usuario apenas están esbozados.</p>
<p id="sdfootnote1">&nbsp;</p>
<p style="margin-bottom: 0cm; font-style: normal"> 	<font face="Times, Times New Roman, serif"></font><font size="2"><a href="#sdfootnote1anc" title="sdfootnote1sym" class="sdfootnotesym" name="sdfootnote1sym">1</a>Ver 	Anexo A</font></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-turbine/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Tapestry</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-tapestry</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-tapestry#comments</comments>
		<pubDate>Sat, 22 Dec 2007 12:34:37 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/14</guid>
		<description><![CDATA[!&#8211; 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A.sdfootnoteanc { font-size: 57% } 	&#8211;&#62;
Tapestry es un framework MVC opensource mantenido por la comunidad apache basado en el Java Servlet API 2.2 y pensado para realizar aplicaciones web en Java que sean dinámicas, robustas y altamente escalables, que funciona en [...]]]></description>
			<content:encoded><![CDATA[<p>!&#8211; 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A.sdfootnoteanc { font-size: 57% } 	&#8211;&gt;</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Tapestry es un framework MVC opensource mantenido por la comunidad apache basado en el Java Servlet API 2.2 y pensado para realizar aplicaciones web en Java que sean dinámicas, robustas y altamente escalables, que funciona en todo contenedor de servlets o servidor de aplicaciones. Su filosofía se basa en lo siguiente:</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<span style="text-decoration: underline;">Simplicidad</span> en la creación de aplicaciones web.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<span style="text-decoration: underline;">Consistencia</span> a la hora de que distintos desarrolladores pueden encontrar soluciones similares a problemas similares.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<span style="text-decoration: underline;">Eficiencia</span>, las aplicaciones deben ser escalables</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<span style="text-decoration: underline;">Reacción ante los errores</span>, aportando modos de diagnósticos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.18cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" lang="es-ES" align="justify">•<span style="font-size: x-small;"><span> </span></span><span style="font-size: x-small;"><span><strong>Modelo de programación</strong></span></span></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Sigue un modelo basado en componentes y en el patrón de diseño FrontController<a class="sdfootnoteanc" title="sdfootnote1anc" name="sdfootnote1anc" href="#sdfootnote1sym"><sup>1</sup></a> .</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Un componente es un objeto reusable que puede ser considerado como una ”caja negra”, que tiene sus responsabilidades definidas por el diseño y la estructura del framework en el cual se encuentra, y sigue una serie de convenciones (nomenclatura, implementación de ciertas interfaces, etc) que le exige el framework. En tapestry todo son componentes. Cada componente tiene tres partes: Una plantilla HTML, una o varias clases java y un archivo XML para unirlos, en el que se especifican las relaciones entre los parámetros formales en la plantilla y los reales en la clase java. La arquitectura sería la siguiente:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">1.	<span style="text-decoration: underline;">Application Engine</span>: Por cada cliente que se conecta a la aplicación se crea una instancia del âœApplication Engineâ que es usado para seguir la actividad del cliente en la aplicación</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">2.	<span style="text-decoration: underline;">Application Servlet</span>: Sirve de puente entre el âœApplication Engineâ y el contenedor de servlet. Su única función es crear el âœApplication Engineâ tras la primera petición de un cliente a la aplicación y de localizarlo en peticiones futuras.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">3.	<span style="text-decoration: underline;">Applicacion Specification</span>: El fichero de especificación de la aplicación es usado para darle a Tapestry una descripción de la aplicación. En él se especifica el nombre de la aplicación, la clase del âœApplication Engineâ, la lista de páginas y nombre de la clase que implementa el Visit Object (si es necesario)</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">4.	<span style="text-decoration: underline;">Visit Object</span>:Será creado uno por cada una de las conexiones de una cliente a la aplicación. Sirve para almacenar información compartida entre varias páginas de la aplicación.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">5.	<span style="text-decoration: underline;">Page Specification</span>: Cada página posee un fichero de especificación en el que se especifica el nombre de la clase que implementa la página y la lista de componentes.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">6.	<span style="text-decoration: underline;">Page Template</span>: Este será el fichero html que dará lugar a la representación visual de la página</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">7.	<span style="text-decoration: underline;">Page implementation</span>: En ella, para cada una los nombres de los parámetros reales, que aparecen en las ligaduras de los parámetros formales a reales en la especificación de los componentes que forman la página, se implementarán métodos get y set</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Cada página contiene HTML puro Los componentes son clases abstractas instanciadas por el contenedor.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Se centra principalmente en la capa de presentación. Ha sido concebido para generar e interactuar con la interfaz de usuario</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Pull. Cualquier componente puede ser referenciado desde una página HTML a través del lenguaje OGNL.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Para la internacionalización Tapestry utiliza lo que denomina catálogos de mensajes que vendrían a ser algo similar a los ResourceBoundles de java donde se guardan pares de cadenas con el formato clave=valor. Cada componente puede tener un set de catálogos de mensajes. Estos catálogos se nombran con el mismo nombre que el componente pero su extensión es .properties. Si una clave no se encuentra en ninguno de los catálogos Tapestry no informa ningún error sino que genera un valor propio.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No proporciona un sistema de seguridad que contemple login, autentificación ni autorización, pero sí uno de manejo de errores</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Su seguridad contra ataques se basa en la del Servlet API y en que todas las peticiones pasan por determinadas clases y métodos, punto en el cual es posoble acoplar mecanismos de seguridad externos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No dispone de un sistema de plantillas global que permita crear vistas por composición con un formato reusable para todas las páginas.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">La validación la realizan los componentes que reciben los datos de entrada del usuario. No permite métodos propios de validación a no ser que desarrolles tu propio componente de validación.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No proporciona un mecanismo de navegación</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No proporciona un sistema de caché.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Las pruebas de unidad son muy laboriosas de realizar, ya que las clases de los componentes son abstractas.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No. Tapestry se centra en la capa de presentación.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No, pero es posible obtenerla integrando el microkernel Hivemind<a class="sdfootnoteanc" title="sdfootnote2anc" name="sdfootnote2anc" href="#sdfootnote2sym"><sup>2</sup></a> , tambien de la Apache Software Foundation.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">No, pero es posible obtenerla integrando el microkernel Hivemind.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Es posible obtenr funcionalidades Ajax con la biblioteca de componentes Tacos<a class="sdfootnoteanc" title="sdfootnote3anc" name="sdfootnote3anc" href="#sdfootnote3sym"></a></p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">La configuración se realiza a través de archivos xml, uno para cada componente.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Tapestry está diseñado para ser un framework de presentación, permitiendo acoplar otro framework por debajo para gestionar la lógica de negocio y la capa de integración.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">El producto es maduro y la solución parece correcta y robusta. Más allá de esto es menos maduro que otros productos, como por ejemplo struts y está evolucionando hacia Java 5.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">La última versión liberada de Tapestry es la 4.1.3, que es sobre la que hemos hecho la comparaciones</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">También existe una muy interesante preview de la version 5.0 que incluye, entre otras cosas, anotaciones en detrimento de los archivos xml</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">La curva de aprendizaje podría considerarse relativamente suave, ya que el modelo de programación basado en componentes es simple.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">Dispone de documentación oficial con tutorial, FAQ, guía de usuario y códigos de ejemplo.</p>
<p id="sdfootnote1">
<p style="margin-bottom: 0cm; font-style: normal"><span style="font-size: x-small;"><a class="sdfootnotesym" title="sdfootnote1sym" name="sdfootnote1sym" href="#sdfootnote1anc"></a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-tapestry/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Stripes</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-stripes</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-stripes#comments</comments>
		<pubDate>Fri, 21 Dec 2007 10:35:01 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/11</guid>
		<description><![CDATA[!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	
Stripes es un framework de presentación opensource cuyo principal objetivo es la creación de aplicaciones web reduciendo la configuración al mínimo. Intenta que el desarrollo sea simple y rápido para los desarrlladores.
&#160;
 •	Modelo de programación
 Stipes sigue un modelo de [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Stripes es un framework de presentación opensource cuyo principal objetivo es la creación de aplicaciones web reduciendo la configuración al mínimo. Intenta que el desarrollo sea simple y rápido para los desarrlladores.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font style="font-size: 11pt" size="2"><span><strong>Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Stipes sigue un modelo de programación basado en acciones. La espina dorsal del framework es el interface ActionBean que deben implementar todas las clases que respondan a eventos de la interfaz de usuario.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Cada ActionBean está asociado a una URL que será invocada desde un formulario y en él se encuentra la lógica de negocio, las reglas de validación y las variable que sirven de backend a las del formulario. Los ActionBean también pueden ser configurados como EventListeners.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> A grandes rasgos, su funcionamiento sería el siguiente:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 1.	En base a la URL de la petición se selecciona un ActionBean y se establece su ActionBeanContext</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 2.	Se determina el método a ejecutar para el evento recibido en la petición</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 3.	Se pone el valor de los elementos del formulario de la petición en las variables del ActionBean, ejecutando la validación si es necesario</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 4.	Se invocan los métodos de validación personalizados</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 5.	Se invoca el método correspondiente en el ActionBean</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 6.	Si el ActionBean devuelve una Resolution no nula, se ejecuta para determinar la vista a mostrar.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se centra en el manejo de las capas de presentación y negocio.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sigue un modelo push. Asocia a cada formulario un ActionBean usando anotaciones.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Stripes proveé de un objeto LocalePicker capaz de reconocer el Locale del cliente y la codificación de caracteres en cada petición y escoger el adecuado de entre los soportados por la aplicación. Permite definir archivos de mensajes propios siguiendo las convenciones de nombrado de los ResourceBundles.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se proporciona un sistema de seguridad llamado stripes-security como extensión al núcleo del framework que proporciona un sistema de autorización basado en roles.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Proporciona etiquetas para crear de una manera simple vistas compuestas a partir de fragmentos reutilizables</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Proporciona una serie de reglas de validación que son establecidas mediante anotaciones desde los ActionBean y se encargan de validar los campos de entrada de los formularios. También permite añadir métodos propios de validación y manejar los errores de validación generados.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona un sistema de navegación.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona un sistema de caché.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Los test de unidad son sencillos usando frameworks de test como JUnit o TestNG, ya que los ActionBeans son POJOs que pueden ser instanciados directamente. además, Stripes proporciona un conjunto de MockObjects que implementan interfaces de la especificación Servlet y pueden ser usados para recrear el entorno en el que se ejecutarán los ActionBean.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No tiene un sistema ORM propio pero se integra con hibernate. Para una integración sencilla conviene el uso de la librería Stripernate.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No dispone de AOP pero puede conseguirse mediante su integración con Spring.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No soporta inyección de dependencias, pero puede conseguirse mediante su integración con Spring.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona soporte nativo para usar Ajax en el lado del cliente y sugiere la utilización de librerías como Prototype o Dojo.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para elaborar las respuestas Ajax en el lado del servidor, proporciona utilidades para transformar objetos java en objetos javascript.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Este es uno de los puntos fuertes de Stripes. Para su puesta en funcionamiento solo requiere configurar el Stripes Filter y el Stripes Dispatcher Servlet en el web.xml.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El resto de configuración se realiza mediante anotaciones y en el caso de no existir estas, se recurre a la configuración por omisión.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Stripes ha sido diseñado para ser facilmente extensible sin necesidad de tener que configurar cada detalle. En la documentación se encuentra cómo hacer que coopere con Spring, Hibernate y FreeMaker entre otros.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> A pesar de ser un framework relativamente nuevo, su sencillez lo hace estable y la retroalimentación por parte de la comunidad lo ha ido perfeccionando desde su primera versión.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La última versión de Stripes es la 1.4.3, liberada el 15 de Mayo del 2007</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La curva de aprendizaje es extremadamente corta. El principal objetivo de Stripes es la simplicidad, y según su documentación oficial, un desarrollador puede poner Stripes en funcionamiento en menos de 30 minutos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La página del proyecto proporciona una documentación bien estructurada con ejemplos, FAQ, How-Tos, una serie de artículos propios y otros añadidos por los usuarios. Es simple, clara y pensada para el usuario.</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-stripes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: WebWork 2</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-webwork-2</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-webwork-2#comments</comments>
		<pubDate>Wed, 19 Dec 2007 09:00:12 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/12</guid>
		<description><![CDATA[WebWork es un framework opensource diseñado para ser conceptualmente simple, interoperable y sencillo de usar, proporcionando un soporte robusto para construir interfaces de usuario reusables.
Intenta reducir al mínimo la cantidad de código necesario para trabajar con el framework, permitiendo a los desarrolladores centrarse en la lógica de negocio y el modelado. En su versión 2.2 [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">WebWork es un framework opensource diseñado para ser conceptualmente simple, interoperable y sencillo de usar, proporcionando un soporte robusto para construir interfaces de usuario reusables.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Intenta reducir al mínimo la cantidad de código necesario para trabajar con el framework, permitiendo a los desarrolladores centrarse en la lógica de negocio y el modelado. En su versión 2.2 (año 2006), WebWork se fusionó con la comunidad Struts dando lugar a Struts Action Framework 2.0. Este framework maniene la filosofía de WebWork y se aprovecha de la gran comunidad de usuarios de Struts y de estar bajo el nombre de la fundación apache.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font style="font-size: 11pt" size="2"><span><strong>Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En el núcleo de WebWork se encuentra el API XWork. XWork es un framework basado en acciones y en los patrones de diseño Front Controller y Comman, centralizado entorno al interface Action, el cual deben implementar en forma de POJO las clases-acción que queramos que respondan a peticiones de la interfaz de usuario y devuelvan un resultado. El framework se encarga de manejar el ciclo de vida de las Actions y de proporcionar un contexto de acción en cada petición, a través del cual acceder a propiedades de la aplicación.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> WebWork posee un fichero en el se mapean vistas y clases-acción. Los campos de las vistas son rellenados desde y hacia los campos de la acción (definidos como propiedades JavaBean) automáticamente. La clase-acción tiene además un método de validación que valida los datos introducidos y devuelve mensajes de error en caso de que los datos no sean correctos. Cuando la acción se ejecuta, devuelve un string indicando si la acción ha tenido éxito y así saber qué vista hay que mostrar. Además, las acciones se pueden encadenar unas detrás de otras, de forma que la primera recoge los valores de entrada, las de la cadena realizan procesamiento y la última decide qué vista mostrar, como una tubería.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se centra en la capa de presentación y negocio</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Permite usar ambos, Push y Pull.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Por un lado permite asociar páginas con clases-acción, pero también proporciona una serie de componentes reusables que pueden ser invocados desde cualquier página.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> WebWork soporta internacionalización en dos lugares: Las etiquetas de la interfaz de usuario y los mensajes de validación, a través de ficheros de recursos (resource bundles). El interceptor i18n de WebWork se encarga de determinar el locale del cliente y elegir el archivo correspondiente.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona un sistema de seguridad.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> A través de las librerías de etiquetas se pueden construir vistas según el patrón Composite View<a href="#sdfootnote2sym" title="sdfootnote2anc" class="sdfootnoteanc" name="sdfootnote2anc"><sup>2</sup></a> .</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También puede configurarse para usar en la capa de presentación tecnologías como FreeMarker o JasperReports.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Proporciona un sistema de validación basado en XWork y dispone de una serie de validadores predefinidos y permite agregar validadores creados por el desarrollador.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Permite la validación en el servidor y/o en cliente usando Ajax o javascript simple.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En el archivo de configuración principal se definen para cada acción una vista de entrada y una vista de salida a la que redirigir en caso de ejecutarse con éxito.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona un sistema de caché.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Al tener un diseño basado en POJOs los test de unidad son muy simples. Para testear interceptores proporciona una serie de Mocks que emulan el entorno.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También ofrece una serie de TestSuites por defecto que pueden ser un buen punto de partida para empezar.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No. Se centra en la capa de persentación-negocio. Sin embargo, se puede acoplar sin problemas con cualquier solución ORM.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona las ventajas de la AOP por sí mismo, pero se detalla como configurar el framework para hacer uso de Spring.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> WebWork viene con un contenedor de Inversion of Control integrado, sin embargo está en vías de desaparecer en futuras versiones y desde la documentación oficial se recomienda usar otros contenedores como Spring.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> WebWork ofrece características Ajax usando las librerías Dojo y DWR. Permite la validación en el cliente, formularios y links remotos entre otros.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La configuración se centra en el archivo xwork.xml. Ahí se definen namespaces, interceptores, y el mapeo de nombre de acciones-clases.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para aplicaciones grandes este archivo puede volverse inmanejable.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sigue un diseño basado en POJOs que le permite acoplar en la capa de negocio casi cualquier otro framework.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> WebWork sigue el mismo diseño base que Struts, pero con una API mucho más simplificada. Este diseño ha sido más que probado y ha demostrado ser robusto y fiable.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La última versión disponible es WebWork 2.2.6 y Struts 2.0.6</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Uno de los objetivos del diseño de WebWork es que su uso sea fácil e intuitivo para el desarrollador. Presenta una curva de aprendizaje muy suave.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La documentación es muy completa y se encuentra bien organizada, cubriendo los tópicos y con ejemplos. También proporciona guía, referencia, FAQ, artículos, varios tutoriales, trozos de código, aportes de usuario&#8230;.</p>
<p id="sdfootnote1">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-webwork-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Seam</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-seam</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-seam#comments</comments>
		<pubDate>Sun, 16 Dec 2007 13:09:34 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[seam]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/9</guid>
		<description><![CDATA[
 	 	
 •	Modelo de programación
 Tiene un diseño 100% basado en componentes.
 •	Capas afectadas
 JBoss Seam ofrece una solución completa para el desarrollo web que abarca todas las capas, desde la de presentación hasta la de integración.
 •	MVC push/pull
 Sigue un modelo Pull en el que desde una página puede referenciarse cualquier componente que [...]]]></description>
			<content:encoded><![CDATA[<p><meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title><meta name="GENERATOR" content="OpenOffice.org 2.3  (Linux)" /></p>
<style type="text/css"> 	<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font style="font-size: 11pt" size="2"><span><strong>Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Tiene un diseño 100% basado en componentes.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> JBoss Seam ofrece una solución completa para el desarrollo web que abarca todas las capas, desde la de presentación hasta la de integración.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sigue un modelo Pull en el que desde una página puede referenciarse cualquier componente que esté asociado a un contexto accesible.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Proporciona varios componentes para manejar los mensajes multidioma.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Determina automática el Locale de cada petición y lo usa si está disponible en la aplicación. También permite sobreescribir el Locale detectado y/o establecer uno por defecto. Se pueden configurar los mensajes en archivos de recursos tipo bundle.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para los mensajes de error o éxito se puede hacer uso de la clase de FacesMessages incluida con JSF.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Dispone de una clase que se encarga de parsear automáticamente los formatos horarios al formato establecido.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El Seam Security API es una parte de Seam que proporciona funcionalidades de autenticación y autorización basado en JAAS (Java Authentication and Authorization Service). Puede usarse el modo sencillo por defecto que se basa en roles o usar el framework JBoss Rules, que ofrece un sistema más poderoso basado en reglas. El sistema se encarga del manejo de errores de autorización o autenticación permitiendo redirigir al usuario a una página determinada.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Las restricciones pueden establecerse mediante el uso de anotaciones. Permite restringir tanto acciones como entidades o páginas o componentes de la página.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Seam viene integrado por defecto con Facelets.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Facelets es un sistema de plantillas para JSF. Permite definir la vista mediante xml en forma de árbol de manera que se pueden definir componentes como composición de otros componentes. Entre sus características destacar que soporta el lenguaje EL, composición a partir de diferentes archivos, decorators y reporte de errores indicando la etiqueta/linea precisa.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Las restricciones se definen en los componentes de entidad mediante las anotaciones de la especificación JPA o haciendo uso de las anotaciones de la extensión Hibernate Validator.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para especificar en la página los componentes que deben ser validados se proporcionan etiquetas para definirlos uno a uno o validar todos los campos del formulario.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La validación puede realizarse en segundo plano mediante Ajax y los mensajes de error pueden leerse de un archivo de recursos tipo bundle o especificarlos en la propia anotación si se usa Hibernate Validator.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Podemos seguir dos modos de navegación, uno que tiene cuenta el estado de la aplicación (stateful) usando el framework jPDL y otro que no (stateless) usando las reglas de navegación JSF Rules o Seam Rules.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para aplicaciones sencillas tan solo necesitaremos el modelo stateless, pero las aplicaciones complejas hacen uso de ambos. jPDL (jBPM Process Definition Languaje) define un sistema de navegación basado en un grafo de nodos y transiciones. La elección del siguiente estado dependerá del valor de ciertas variables. La configuración puede hacerse mediante XML o anotaciones</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Gracias al contexto de conversación capaz de almacenar el estado de los componentes, Seam funciona perfectamente con el botón de navegación &#8220;Atrás&#8221; del explorador.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En total podemos encontrar varios sistemas de caché.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En primer lugar podemos encontrar la importantísima caché de la base de datos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Después existe otra caché en la solución ORM adoptada.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El contexto de persistencia manejado por Seam actúa como caché de los datos leídos en la conversación actual.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También pueden guardarse datos no transaccionales en el contexto de aplicación.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La aplicación puede almacenar datos en memoria utilizando el sistema JBoss Cache, que ofrece una cache estructurada en forma de árbol, con posibilidad de cluster y transaccional.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Al ser POJOs todos los componentes, los test de unidad son triviales. También se proporcionan anotaciones para facilitar la recreación del entorno.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Para los test de integración proporciona un contenedor de EJBs y declaración de objetos mock mediante anotaciones.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La herramienta SeamGen crea automáticamente test de unidad estándar y test TestNG que simulan peticiones y respuestas JSF para cada acción mediante scripting.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Seam proporciona soporte completo para las dos arquitecturas de persistencia más populares: hibernate 3 y el Java Persistence API introducido con EJB 3.0.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> A través de el contexto de conversación y los componentes con estado asociados a él, es capaz de manejar eficientemente las operaciones transaccionales e implementar el patrón de carga perezosa (LazyLoad) sin los errores presentes en otras soluciones ORM.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> JBoss Seam hace uso extensivo de AOP para proporcionar funcionalidades de caché, seguridad, inyección de dependencias, interceptores, pageflow&#8230;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No solo soporta Dependency Injection si no que también permite Dependency Outjection, depositando y obteniendo instancias de un componente de los diferentes contextos, cada una de ellas con su propio estado.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El diseño de JBoss Seam ha sido concebido con Ajax en mente. Es capaz de manejar peticiones simultáneas de distintos usuarios preservando las condiciones de aislamiento e integridad de los datos. El sistema de cache evita la sobrecarga de tráfico con la base de datos que afecta a muchas aplicaciones que usan Ajax.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El soporte en la parte del cliente está a cargo de la implementación de JSF que se elija. En cualquier caso, mediante la librería Ajax4jsf de JBoss se pueden añadir funcionalidades Ajax a los componentes ya existentes.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La configuración puede realizarse en su práctica totalidad mediante anotaciones, lo que ayuda a simplificar esta tediosa tarea. Aún así, hay una pequeña cantidad de configuración que debe hacerse con XML (como la relativa a JSF). Afortunadamente, esta configuración es autogenerada por la herramienta SeamGen. En caso de no hacer uso de ella, la configuración puede copiarse de las aplicaciones de ejemplo. Además, el framework sigue la filosofía de &#8220;configuración por omisión&#8221;: Todos los componentes vienen con un comportamiento por defecto que solo hace falta redefinir si queremos personalizarlos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También permite la configuración de los componentes internos del framework a través del archivo seam.properties.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El diseño basado en componentes le permite integrarse con numerosas tecnologías tan dispares como Google Web Toolkit, Spring, Groovy&#8230; ademas de las propias de JBoss que vienen integradas por defecto.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En el diseño de JBoss Seam han participado pesos pesados del desarrollo de software como Gavi King (creador de Hibernate) y se asienta sobre principios que han popularizado frameworks como RubyOnRails o Spring.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Además, es una de los freameworks que se están tomando como referencia para futuros estándares como WebBeans.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La última versión es JBoss Seam 2.0.0 CR2 y data del 5 de octubre del 2007.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> JBoss Seam sigue un modelo de programación muy sencillo y uniforme, basado en componentes y anotaciones en todas las capas de la aplicación. En ningún momento hace falta extender una clase ni implementar un interfaz, no tienes que aprenderte ningún API, simplemente un par de conceptos. Esto hace que la curva de aprendizaje sea muy muy suave.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En la distribución de Seam se incluyen varias aplicaciones de ejemplo que cubren casi todas las funcionalidades del framework. El tutorial oficial es muy extenso. En él se detallan todos los aspectos del framework con códigos de ejemplo. Explica los conceptos, las diferentes configuraciones posibles, las anotaciones, la integración con otras tecnologías, etc&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-seam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Spring</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-spring</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-spring#comments</comments>
		<pubDate>Sun, 16 Dec 2007 13:09:18 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/8</guid>
		<description><![CDATA[!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A.sdfootnoteanc { font-size: 57% } 	--> 	
Spring Framework está diseñado como una serie de módulos que pueden trabajar independientemente uno de otro, lo que quiere decir que puedes únicamente los módulos que necesites. Además intenta mantener un mínimo acoplamiento entre la [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A.sdfootnoteanc { font-size: 57% } 	--> 	</style>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Spring Framework está diseñado como una serie de módulos que pueden trabajar independientemente uno de otro, lo que quiere decir que puedes únicamente los módulos que necesites. Además intenta mantener un mínimo acoplamiento entre la aplicación y el propio framework de forma que podría ser desvincualda de élsin demasiada dificultad.</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">El sub-framework SpringMVC es solo una parte del diseño global, que va mucho más allá</p>
<ul>
<li><u>Core</u>: Como su nombre indica, es el núcleo de Spring. Permite técnicas de Inversión del Control (IoC) como la inyección de dependencias.</li>
<li><u>Context</u>: Proporciona herramientas para acceder a los beans y da soporte a propagación de eventos, resource bundles, carga de recursos y creación transparente de contextos por parte de los contenedores.</li>
<li><u>DAO</u>: Proporciona una capa de abstracción JDBC y una forma de administrar transacciones.</li>
<li><u>ORM</u>: Provee capas de integración para APIs de mapeo objeto-relacional.</li>
<li><u>AOP</u>: Proporciona una implementación de programación orientada a aspectos, permitiendo definir puntos de corte e interceptores.</li>
<li> <u>Web</u>: Provee de características de integración orienteadas a la web, como funcionalidad multipartes, inicialización de contextos mediante servlet listeners y un contexto de aplicación orientada a la web. También permite integrar de forma sencilla otros frameworks como Struts, JSF o WebWork.</li>
<li><u>Spring MVC</u>: Provee una implementación Modelo-Vista-Controlador que permite el uso del resto de funcionalidades del Spring Framework.<font size="3"></font><font style="font-size: 11pt" size="2"><span></span></font><font size="3"></font><font style="font-size: 11pt" size="2"><span></span></font><font size="3"></font><font style="font-size: 11pt" size="2"><span></span></font></li>
</ul>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><span><strong>        Modelo de programación</strong></span></font><br />
Spring MVC es un framework basado en peticiones (request). Define una serie de interfaces claves para cada una de las responsabilidades que deben ser manejadas durante la petición, que el usuario puede implementar. Los interfaces y su responsabilidad son los siguientes:
</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>HandlerMapping</u>: Selecciona el manejador adecuado de la petición</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>HandlerAdapter</u>: Ejecuta el manejador de la petición.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>Controller</u>: Procesa la petición y redirige a la respuesta correspondiente.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>View</u> Devuelve una vista al cliente.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>ViewResolver</u> Selecciona una vista basada en su nombre lógico.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>HandlerInterceptor</u> Permite interceptar las peticiones, como un filtro.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>LocaleResolver</u>: Determina el locale de el usuario.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<u>MultipartResolver</u>: Facilita el trabajo con peticiones multipart, usadas para la subida de archivos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> El funcionamiento paso a paso sería así:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 1.	El usuario realiza una petición de un recurso en la aplicación web.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 2.	El Spring Front Controller<a href="#sdfootnote1sym" title="sdfootnote1anc" class="sdfootnoteanc" name="sdfootnote1anc"><sup>1</sup></a> , llamado Dispatcher Servlet, intercepta la petición y busca el Handler Mappings adecuado</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 3.	El Handler Mappping se encarga de buscar al Controller correcto de entre una lista definida en un archivo de configuración.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 4.	Conla ayuda de Handler Adapters, el Dispatcher Servlet envía la petición al controller.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 5.	El controller procesa la petición y devuelve el Modelo y la Vista como un objeto ModelAndView al FrontController</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 6.	El Front Controller busca la vista adecuada consultando al ViewResolver.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 7.	La vista seleccionada es renderizada al usuario.</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><strong><font size="3"></font><font style="font-size: 11pt" size="2"><span>        Capas afectadas</span></font></strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Se centra en la capa intermedia y proporciona enganches para manejar la solución elegida para la capa de presentación y de integración.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>MVC push/pull</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Push.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> EL Controller permite asociar un objeto al ModelAndView, que estará disponible en la vista seleccionada.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Internacionalizacion (i18n) y localización (L10n)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Permite acceder a mensajes multiidioma definidos por el usuario a través de un bean MessageSource</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Sistema de seguridad</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Spring viene integrado con un framework de seguridad, acegi security, que gestiona todo el mecanismo de login, autentificación y autorización.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Permite entre otras cosas controlar la seguridad de tu aplicación web de manera declarativa, posee seguridad basada en roles, en listas de control de acceso, Single Sing On. Se integra con JAAS (Java Authentication and Authorization Service) y con LDAPs (Lightweight Directory Access Protocol)</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Sistema de plantillas (templates)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> No proporciona un mecanismo de plantillas propio, ya que permite elegir la tecnología a utilizar para la vista (JSP, JSF, velocity, PDF&#8230;) integrándola con el resto de la aplicación.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Sistema de validación</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Provee un sistema de validación que no está ligado a una capa concreta, si no que puede ser usado en cualquier capa de la aplicación. Provee de un interfaz para escribir tu lógica de validación y se encarga del manejo de errores.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> El sistema de seguridad acegi también ofrece un paquete de validación.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Sistema de navegación (pageflow)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Ofrece el módulo Spring Web Flow. Proporciona un motor capaz de capturar los flujos de páginas de una aplicación e integrarlo con otros frameworks de presentación como JSF. Utiliza estructuras declarativas basadas en máquinas de estados.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Éste es un módulo autónomo que puede reutilizarse en diferentes aplicaciones que sigan una misma lógica de navegación como por ejemplo, carritos de la compra.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Sistema de caché</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> No proporciona un sistema de caché nativo, pero su diseño permite la integración de módulos que se encarguen de ello, como por ejemplo Spring AOP Cache.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Éste utiliza la AOP proporcionada por Spring para interceptar las invocaciones de métodos y almacenar en memoria el resultado de operaciones como una consulta a una base de datos.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Testeabilidad</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Spring proporciona un estupendo marco para el testing. Al estar basado en POJOs, los test de unidad son triviales con su adaptación de JUnit. Para los test de integración provee herramientas basadas en su capacidad de IoC y de transaccionalidad.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Mapeo Objeto-Relacional (ORM)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Proporciona integración con varias implementaciones ORM. Existen dos formas de integración, a través de plantillas predefinidas del módulo SpringDAO o codificando DAOs directamente contra al API del ORM elegido.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Cualquiera de las dos aproximaciones ofrece los beneficios de Spring, como ser configurados a través de IoC, transaccionalidad, wrapping común para excepciones de acceso a datos y manejo de la configuración independiente de la implementación.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Programación Orientada a Aspectos (AOP)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Spring permite el uso de aspectos en tiempo de ejecución mediante proxys dinámicos, por que sólo hace falta la JDK para poder implementar los aspectos. La desventaja es sólo pueden pueden usarse aspectos a nivel de método, no a nivel de clase ni de instancia. Aunque en la gran mayoría de los casos es suficiente, permite la integración de AspectJ que ofrece funcionalidad completa.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Spring usa AOP para proporcionar servicios empresariales de manera declarativa, especialmente como reemplazo para los servicios declarativos de EJB. El más importante de dichos servicios es el manejo declarativo de transacciones, que esta construido sobre la abstracción de transacciones de Spring.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Inyección de dependencias (DI)</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Esta es una de las bases de Spring sobre la que se cimienta el resto de la arquitectura. La DI se encuentra en el corazón de Spring.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> A través de la BeanFactory, el contenedor de IoC instancia los objetos y maneja las relaciones entre ellos, añadiendo funcionalidades como pooling o swapping (intercambio).</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Ajax</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Al permitir la elección de la tecnología de la capa de presentación, el soporte para Ajax dependerá principalmente de la elección.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Configuración</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> La configuración de Spring está basada en XML. Al no tener anotaciones no le hace dependiente de Java EE 5, pero resulta en archivos de configuración inflados o una gran cantidad de archivos de configuración distintos.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Ofrece la ventaja de &#8220;XML extensible&#8221;, que permite a frameworks externos escribir sus propios archivos de configuración que puede ser acoplado a los archivos de configuración de Spring.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Extensibilidad</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> El diseño de Spring está pensado para ofrecer un modelo de como debe trabajar la aplicación y cómo se comunican sus partes. Está expresamente concebido para que deba ser extensible y acoplable con otros frameworks, ya que no ofrece una solución completa que abarque desde la presentación al modelo.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Madurez</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> A pesar de su juventud (Spring 1.0 fue lanzado en el año 2003), Spring ha demostrado tener una arquitectura sólida y, sobre todo, muy flexible, capaz de adaptarse a los requerimientos de proyectos grandes y pequeños.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Última versión</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> La última versión disponible de Spring es la 2.0.7</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Curva de aprendizaje</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> No puede decirse que la curva de aprendizaje sea suave debido a que Spring introduce conceptos relativamente novedosos como son la AOP o la IoC y a la cantidad de configuración que hay que manejar.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Sin embargo para alguien con experiencia en desarrollo J2EE y familiarizado con dichos conceptos no debería resultar muy dificil. Para facilitar el desarrollo existen IDEs opensource como SpringIDE, que ayudan entre otras cosas a lidiar con los archivos de configuración y diseñar el flujo de la aplicación.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font size="3"></font><font style="font-size: 11pt" size="2"><strong>Documentación</strong></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> Cuenta con una buena documentación oficial que cubre todos sus módulos y funcionamiento así como su integración con otros frameworks. También tiene una nutrida comunidad de usuarios que aportan artículos y trabajos.</font></p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p id="sdfootnote1"><font size="3"></font><font style="font-size: 11pt" size="2"> </font></p>
<p style="margin-bottom: 0cm; font-style: normal"><font size="3"></font><font style="font-size: 11pt" size="2"> 	</font><font face="Times, Times New Roman, serif"></font><font size="2"><a href="#sdfootnote1anc" title="sdfootnote1sym" class="sdfootnotesym" name="sdfootnote1sym"></a><br />
</font></p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-spring/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks: Struts</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-struts</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-struts#comments</comments>
		<pubDate>Sun, 16 Dec 2007 13:07:44 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/7</guid>
		<description><![CDATA[El API Struts fue liberado en el año 2001 para proporcionar un marco de trabajo MVC estándard para la comunidad Java en respuesta a los diseños basados en JSPs monolíticos que mezclaban HTML y código java, lo que se conoce como &#8220;Modelo 1&#8243;.
&#160;
 •	Modelo de programación
 Sigue un modelo de programación basado en acciones
 Todas [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">El API Struts fue liberado en el año 2001 para proporcionar un marco de trabajo MVC estándard para la comunidad Java en respuesta a los diseños basados en JSPs monolíticos que mezclaban HTML y código java, lo que se conoce como &#8220;Modelo 1&#8243;.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify" lang="es-ES"> •<font size="3"></font><font style="font-size: 11pt" size="2"><span>	</span></font><font style="font-size: 11pt" size="2"><span><strong>Modelo de programación</strong></span></font></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sigue un modelo de programación basado en acciones</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Todas las peticiones HTTP (request) realizadas por el cliente son dirigidas al controlador principal (ActionServlet) y redirigidas según el mapeo especificado (ActionMapping) en un archivo de configuración (struts-config.xml) a clases-accion (ActionForm) que implementan la lógica de la aplicación y tienen asociado un bean-formulario (FormBean) con los datos enviados. Posteriormente el controlador redirige a la vista adecuada.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Paso a paso, su funcionamiento sería así:</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 1.	El cliente solicita una página que contiene datos a completar.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 2.	El servidor le envía la página.</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 3.	El cliente, con los datos completados envía de regreso la página. El ActionServlet verifica la ruta con la que se lo invocó y extrae el path de esa ruta y busca en los actionMappings cual es la Acción a invocar y que formulario necesita recibir como entrada</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 4.	El controlador crea o reutiliza el Formulario dependiendo el ámbito en que es ejecutada la petición, carga los datos en el formulario, los valida y luego crea la acción y le pasa el formulario como parámetro</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 5.	La acción recibe el formulario y con sus datos invoca a las reglas del negocio (generalmente delegadas en otros objetos)</p>
<p style="margin-left: 2.12cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> 6.	A partir de la respuesta recibida, carga los valores de salida y selecciona la siguiente vista a enviar</p>
<p style="margin-left: 1.06cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Como puede apreciarse, el diseño está basado en el patrón &#8220;Service to Worker&#8221;. Este consiste en Combinar un controlador y un dispacher con vistas y helper (Front Controller + View Helper<a href="#sdfootnote1sym" title="sdfootnote1anc" class="sdfootnoteanc" name="sdfootnote1anc"><sup>1</sup></a> ) para manejar peticiones de clientes y preparar una presentación dinámica como respuesta. Los controladores delegan la recuperación de contenido en los helpers, que manejan el relleno del modelo intermedio para la vista. Un dispatcher es el responsable del control de la vista y la navegación y puede encapsularse dentro de un controlador o de un componente separado.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Presentación y Negocio.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Push.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El FormBean definido en el ActionMapping para la acción que se va a ejecutar está disponible en la página a través de la biblioteca de etiquetas (TAGs) de Struts</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Permite definir archivos de mensajes para diferentes idiomas y seleccionar uno automáticamente dependiendo del idioma por defecto del cliente. No proveé de un mecanismo para elegir el idioma.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Estos archivos tienen una serie de pares clave/valor que son referenciados desde la vista.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se encarga de los mecanismos de control de autenticación y acceso.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Las últimas versiones de Struts vienen con la extensión Struts-Tiles integrada. Este es un sistema de plantillas que sigue el patrón Composite View<a href="#sdfootnote2sym" title="sdfootnote2anc" class="sdfootnoteanc" name="sdfootnote2anc"><sup>2</sup></a> . Esto consiste en utilizar vistas compuestas que se componen de varias subvistas atómicas. Cada componente de la plantilla se podría incluir dinámicamente dentro del total y la distribución de la página se maneja independientemente del contenido.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Define las reglas de validación en un archivo llamado validation-rules.xml. El framework lee las restricciones definidas y agrega validadores a las entradas en el lado del cliente y del servidor.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> También permite Validar los datos desde el FormBean.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Cada accion definida en struts-config.xml puede tener asociado uno o varios forwards que indican a qué página debe redirigirse. La elección del forward se realiza desde el ActionForm</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proporciona un sistema de caché.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No proveé de un mecanismo nativo, pero existen numerosas extensiones para realizar los test.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No. Struts se centra en las capas de negocio y presentación, pero debido a su diseño es fácil hacerlo cooperar con soluciones ORM.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> No viene integrado por defecto, cosa lógica ya que Struts es mucho anterior a Ajax.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Sin embargo es posible su integración, pero es laboriosa, ya que requiere reescribir código en la capa de presentación y negocio.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La configuración está basada 100% en archivos XML y prácticamente centralizada en el fichero de configuración principal: struts-config.xml. Para aplicaciones grandes este fichero suele volverse inmanejable.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Este es uno de los puntos sus fuertes. Struts no fue diseñado para ofrecer una solución web completa, si no como un núcleo que define la comunicación entre la capa de presentación y negocio.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Es fácil añadirle extensiones para manejar la seguridad, el flujo de páginas, plantillas de vistas&#8230; y hacerle cooperar con otros framewoks como hibernate o Spring.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> En cuanto a madurez puede decirse que es el lider indiscutible. Ha sido el estandar de facto durante años, y ha sido usado por grandes y pequeñas empresas en multidud de proyectos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Hemos trabajado con la versión 1.3.8. También existe un Struts 2.0, pero sus características son tan diferentes que puede considerarse un framework completamente distinto a Struts 1.X</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Struts proveé una API con sus métodos y sus clases, las cuales tienes que extender para implementar la lógica de negocio. Esto hace que tengas que tener un conocimiento aceptable de dichas clases, sus responsabilidades y sus interacciones, lo que retrasa la hora de empezar a desarrollar. Sin embargo no presenta un modelo demasiado complicado y gracias a la cantidad de documentación se hace más facil.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Debido a su gran difusión existen inumerables artículos, foros y similar con información sobre su funcionamiento, integración y cualquier problema que pueda surgir durante un desarrollo basado en struts</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-struts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparativa de Frameworks</title>
		<link>http://seamcity.madeinxpain.com/archives/comparativa-de-frameworks</link>
		<comments>http://seamcity.madeinxpain.com/archives/comparativa-de-frameworks#comments</comments>
		<pubDate>Fri, 14 Dec 2007 15:06:34 +0000</pubDate>
		<dc:creator>Tes</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://seamcity.madeinxpain.com/archives/6</guid>
		<description><![CDATA[Este es el pimer artículo de una serie en la que se va a realizar una comparativa entre varios de los frameworks MVC opensource que existen actualmente.
”Framework” es una palabra que se usa (y de la que se abusa) mucho actualmente en el desarrollo de aplicaciones. Sin embargo puede que alguien no tenga claro el [...]]]></description>
			<content:encoded><![CDATA[<p>Este es el pimer artículo de una serie en la que se va a realizar una comparativa entre varios de los frameworks MVC opensource que existen actualmente.</p>
<p style="margin-top: 0.42cm; margin-bottom: 0.11cm; page-break-after: avoid" align="left">”Framework” es una palabra que se usa (y de la que se abusa) mucho actualmente en el desarrollo de aplicaciones. Sin embargo puede que alguien no tenga claro el concepto de los que es un framework para el desarrollo de aplicaciones web. Podría definirse como un conjunto de clases que cooperan y forman un diseño reutilizable formando una infraestructura que facilita y agiliza el desarrollo de aplicaciones web.</p>
<p style="margin-top: 0.42cm; margin-bottom: 0.11cm; page-break-after: avoid" align="left">En este primer artículo, a modo de introducción, voy a describir los puntos en los que basaré la comparativa.</p>
<p style="margin-top: 0.42cm; margin-bottom: 0.11cm; page-break-after: avoid" align="left">&nbsp;</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify"><font face="Times, serif"></font><font style="font-size: 16pt" size="4"><strong>Puntos de comparación</strong></font></p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify">Como funciona</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Modelo de programación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Breve descripción del funcionamiento básico del framework</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Capas afectadas</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Consideraremos una arquitectura multicapa</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La capa del cliente es donde se consumen y presentan los modelos de datos. Para una aplicación Web, la capa cliente normalmente es un navegador web.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La capa de presentación expone los servicios de la capa de negocio a los usuarios. Sabe cómo procesar una petición de cliente, cómo interactuar con la negocio, y cómo seleccionar la siguiente vista a mostrar.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La capa de negocio contiene los objetos y servicios de la lógica de negocio de la aplicación. Recibe peticiones de la capa de presentación, procesa la lógica de negocio basada en las peticiones, y media en los accesos a los recursos de la capa EIS. Los componenes de la capa de negocio se benefician de la mayoría de lo servicios a nivel de sistema como el control de seguridad, de transaciones y de recursos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La capa de integración es el puente entre la capa de lógica-de-negocio y la capa EIS. Encapsula la lógica para interactuar con la capa EIS. Algunas veces a la combinación de las capas de integración y de lógica-de-negocio se le conoce como capa central.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La capa EIs almacena los datos de la aplicación. Contiene bases de datos relacionales, bases de datos orientadas a objetos, y/o sistemas antiguos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>MVC push/pull</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Hace referencia a cómo son accesibles los objetos de la capa de negocio desde la capa de presentación.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> MVC Push indica que un objeto de la capa de negocio está asociado a una página.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> MVC Pull indica que uno o varios objetos están disponibles para todas las páginas.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-top: 0.11cm; margin-bottom: 0cm" align="justify"> Qué ofrece</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Internacionalizacion (i18n) y localización (L10n)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El sistema de internacionalización asegura que una aplicación sea capaz de adaptarse a los requerimientos locales del cliente, por ejemplo asegurar que los caracteres de su idioma puedan ser mostrados.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El sistema Locacalización intenta que la aplicación se adapte a la cultura del cliente, mostrando las fechas en un determinado formato, usando determinados sistemas de medida, etc.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de seguridad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Se encarga de los mecanismos de control de autenticación y acceso.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de plantillas (templates)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Facilita y agiliza el desarrollo de los componentes de la vista a través de esquemas, siguiendo los principios de separación de capas, flexibilidad, reusabilidad.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de validación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El sistema de validación se encarga de comprobar que los datos que el cliente introduce a través de la capa de presentación sean válidos.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Podemos realizar la validación de los datos en el cliente, en el servidor o en ambos.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de navegación (pageflow)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Es el encargado de determinar cuál será la próxima página a mostrar según determinados parámetros como la página actual, la operación realizada, el resultado de dicha operación o el rol del usuario.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Sistema de caché</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Permite almacenar en memoria cualquier información relativa al estado de la aplicación o resultados de una consulta a una base de datos, mejorando el rendimiento.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Testeabilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Las pruebas de software verifican que el software desarrollado o modificado cumple los requerimientos solicitados de forma satisfactoria.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Mapeo Objeto-Relacional (ORM)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> El mapeo objeto-relacional es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Analizaremos si el framework evaluado nos ofrece algún sistema ORM o permite la integración con uno.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Programación Orientada a Aspectos (AOP)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La Programación Orientada a Aspectos, más conocida como AOP por su nombre en inglés Aspect Oriented Programming, es un modelo de programación que aborda un problema específico: capturar las partes de un sistema que los modelos de programación habituales obligan a que estén repartidos a lo largo de distintos módulos del sistema. Estos fragmentos que afectan a distintos módulos son llamados aspectos y los problemas que solucionan, problemas cruzados (crosscutting concerns).</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Usando un lenguaje que soporte AOP, podemos capturar estas dependencias en módulos individuales, obteniendo un sistema independiente de ellos y podemos utilizarlos o no sin tocar el código del sistema básico, preservando la integridad de las operaciones básicas.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Inyección de dependencias (DI)</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Este patrón de diseño consiste en resolver las dependecias de cada clase (atributos) instanciando los objetos cuando se arranca la aplicación e inyectándolos en los objetos que los necesiten. De esta forma liberamos a los objetos de la responsabilidad de instanciar otros objetos y delegamos este trabajo a una factoría que pueda realizar más eficientemente esta tarea, añadiendo funcinalidades como pooling de instancias.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Ajax</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Ajax (Asynchronous JavaScript And XML) es una técnica de desarrollo web para crear aplicaciones interactivas. Se ejecuta en el cliente y mantiene una conversación asíncrona en segundo plano con el servidor, permitiendo realizar acciones sin necesidad de recargar la página, lo que aumenta la interactividad, usabilidad y velocidad. Indicaremos si el framework integra Ajax o es posible su integración.</p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.11cm; margin-bottom: 0cm" align="justify">&nbsp;</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Otros</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify">•	<strong>Configuración</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Indicaremos el tipo de configuración (anotaciones, xml, ficheros properties&#8230;) y si es sencilla, cómoda y manejable.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Extensibilidad</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La facilidad con la que el framework puede ser ampliado integrando nuevos módulos que doten de nuevas funcionalidades o modifiquen las ya existentes.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Madurez</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Indica si el framework está suficientemente probado por los usuarios y ha demostrado ser sólido y efectivo.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Última versión</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La última versión estable del framework, que es sobre la que se ha hecho la comparación</p>
<p>   	<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title> 	 	<meta name="GENERATOR" content="OpenOffice.org 2.3  (Linux)" /></p>
<style type="text/css"> 	<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Curva de aprendizaje</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> La curva de aprendizaje es una gráfica en la que en el eje de abcisas y la producción en el eje de ordenadas y da una idea del tiempo que lleva a los usuarios ser capaces de desarrollar bajo el framework evaluado.</p>
<p style="margin-left: 1.06cm; text-indent: -0.53cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> •	<strong>Documentación</strong></p>
<p style="margin-left: 1.06cm; margin-top: 0.09cm; margin-bottom: 0cm" align="justify"> Indicaremos la cantidad y calidad de documentación existente, ya sea oficial o no.</p>
<p>Los frameworks que se van a evaluar son:</p>
<p><meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title><meta name="GENERATOR" content="OpenOffice.org 2.3  (Linux)" /></p>
<style type="text/css"> 	<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<table border="0" cellpadding="2" cellspacing="0" width="319">
<tr valign="top">
<td width="202">
<p style="margin-top: 0.11cm">Struts</p>
</td>
<td width="202">
<p style="margin-top: 0.11cm">Spring</p>
</td>
<td width="202">
<p style="margin-top: 0.11cm">Tapestry</p>
</td>
</tr>
<tr valign="top">
<td width="202">
<p style="margin-top: 0.11cm">Cocoon2</p>
</td>
<td width="202">
<p style="margin-top: 0.11cm">Stripes</p>
</td>
<td width="202">
<p style="margin-top: 0.11cm">WebWork</p>
</td>
</tr>
<tr valign="top">
<td width="202">
<p style="margin-top: 0.11cm">Turbine</p>
</td>
<td width="202">
<p style="margin-top: 0.11cm">Seam</p>
</td>
</tr>
</table>
<p>Este y los siguientes artículos son fruto del trabajo personal y podrían contener algún error, cualquier corrección será bienvenida.</p>
]]></content:encoded>
			<wfw:commentRss>http://seamcity.madeinxpain.com/archives/comparativa-de-frameworks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

