martes, 24 de abril de 2012

Struts


Realmente son dos frameworks que por el nombre parecen bastante similares, sin embargo hay que decir que existen actualmente muchas diferencias entre ellos. La comparativa oficial está en la página web de apache http://struts.apache.org/2.1.6/docs/comparing-struts-1-and-2.html, sin embargo intentaremos comentarlas un poco para que queden lo suficientemente claro:

Clases Action

Struts1
Se Requiere extender de la una clase Action abstracta, el problema común en Struts1 reside en que se programan clases abstractas en lugar de interfaces.

- Recordamos que los interfaces no se extienden si no que se implementan y las clases abstractas por el contrario sí.
- Las clases abstractas pueden tener métodos concretos y otros abstractos, sin embargo los interfaces solo pueden contener métodos abstractos.



Struts2
Un Action puede implementar una interfaz Action, además de otras interfaces que le permitan integrar mas servicios. Struts2 provee de una clase base ActionSupport que implementa las interfaces comúnmente usadas. Además esta interfaz no es requerida. Cualquier POJO con un método de ejecución puede ser usado como Action en Struts2. 

Modelo de hilos

Struts1
Las Actions implementan el patrón singleton y deben ser thread-safe por lo que puede haber solo una instancia de una clase para manejar todas las peticiones para ese Action. La estrategia singleton pone restricciones sobre lo que podemos hacer con los Actions de Struts1 y se requiere un cuidado extra para desarrollar, a demás, Los recursos usados para los Actions deben ser thread-safe o sincronized. 

- Recordamos que Singleton es un patrón de diseño muy utilizado cuyo objetivo es mantener la instancia de un objeto a lo largo de la ejecución de la aplicación, es decir que asegura una única instancia de un objeto. No es muy bueno abusar de Singleton, es mejor la gestión de Hilos de ejecución o Threads para el tema de la seguridad.

Struts2
Los objetos Action son instanciados por cada petición, por lo que no hay problemas de tipo con la seguridad de hilos. En la práctica, los contenedores de servlets generan muchas instancias, así que un objeto mas no representa problemas de rendimiento y de impacto en el garbage collection.

Dependencia de los Servlets

Struts1
Las Actions tiene dependencias de la API de Servlets dado que HttpServletRequest y HttpServletResponse son pasados al método excecute cuando la Action es invocada.

Struts2
Las Actions no están acopladas al contenedor. A menudo el contexto de los servlets esta representado por simples Maps, permitiendo a las Actions ser probadas de forma aislada. Las Actions de Struts2 puede mantener el uso del request y el response si se requiere. De cualquier forma, otros elementos de la arquitectura reducen o eliminan la necesidad de acceder a HttpServetRequest o a HttpServletResponse directamente.

Manejo de pruebas

Struts1
El principal obstáculo para las Actions de Struts1 es que la ejecución de métodos requiere de la API de Servlets. Una extensión de terceras partes, como Struts TestCase, que ofrece un conjunto de simuladores para objetos de Struts1.

Struts2
Las Actions pueden ser probadas instanciado la Action, estableciendo propiedades e invocando métodos. El soporte a la Inyección de Dependecias permite hacer las pruebas de forma simple.

Recolección de datos de entrada

Struts1
Es necesario el uso de un objeto ActionForm para capturar las entradas. Como las Actions, todos los ActionForm deben extender de una clase. Como algunos JavaBeans no implementan de ActionForm los desarrolladores a menudo crean clases redundantes para capturar a las entradas. Los DynaBeans pueden ser usados de forma alternativa para crear clases ActionForm convencionales, pero, los desarrolladores deben JavaBeans existentes.

Struts2
Usa las propiedades de las Actions para manejar las entradas, elimina la necesidad de un segundo objeto de entrada. las propiedades de entrada pueden ser objetos de una amplia variedad que incluso pueden tener sus propias variables. Las propiedades de las Action pueden usadas por la pagina Web por medio de los TagLibs. Struts2 soporta incluso el patrón de ActionForm, asi como objetos y acciones POJO. Tipos de objetos, incluyendo negocios o objetos de dominio, pueden ser usados como objetos en entrada y salida. La característica ModelDriven simplifica las referencias por taglib a objetos POJO.

Lenguaje de Expresiones

Struts1
Esta integrado con JSTL, así que usa el JSTL EL. El EL tiene una traza grafica de objetos básica y una relativamente pobre colección e indexación de soporte a propiedades.


Struts2
Puede usarse JSTL, pero el marco de trabajo soporta ademas un lenguaje de expresiones mas poderoso y flexible llamado "Object Graph Notation Language" (OGNL)

Vinculación de objetos de la vista

Struts1
Usa el mecanismo estándar de JSPS para el vincular objetos en el contexto de las páginas.

Struts2
Usa una tecnología llamada "ValueStack" donde los taglibs pueden acceder a valores sin estar acoplados a la vista donde el tipo de objeto se renderea. La estrategia del "ValueStack" permite reutilizar vistas gracias al rango de variables que pueden tener el mismo nombre pero tipo diferente tipos de propiedades.

Conversion de tipo

Struts1
Las propiedades de los ActionForm son usualmente Strings. Struts1 usa comúnmente Commons-Beanutils para la conversión de tipos. Las conversiones son configurables por clase y no por instancia.

Struts2
Usa OGNL para la conversión de tipos. El marco de trabajo incluye convertidores para objetos básicos y tipos primitivos.

Validación

Struts1
Soporta validación manual por medio de métodos en el ActionForm, o a través de una extensión de los Commons Validator. Las clases pueden tener diferentes contextos de validación para la misma clase, pero no pueden encadenar validaciones en sub objetos.

Struts2
Soporta validación manual por medio de métodos y por el marco de trabajo XWork Validation. El XWork soporta encadenamiento de validaciones en las subpropiedades usando las validaciones definidas para las propiedades de la clase y el contexto de validación.

Control de la ejecución del Action

Struts1
Soporta Request Porcessors (Ciclos de vida) separados por cada módulo, pero todas las Actions en el módulo deben compartir el mismo ciclo de vida.


Struts2
Soporta ciclos de vida diferentes, uno por Action por medio de la pila de interceptores. Pilas configurables pueden ser creadas y usadas con diferentes Actions si es necesario.

Fichero de configuración


Struts1
El fichero de configuración de struts se llama struts-config.xml.


Struts2 
En este caso se llama struts.xml.

Maven


Pintando la Mona Lisa


Realmente me peleo todos los días con Maven en el trabajo, y siempre he querido meterme de lleno en el mundo de la programación Java. sin embargo hasta que no te lanzas a crear un proyecto por tu cuenta, no te surgen cosas como ... ¿Qué se supone que pinta Maven en todo esto?

Yo pensaba que era como una especie de herramienta para desplegar .wars (y para crearlos claro está), sin embargo, mi sorpresa ha llegado esta tarde, cuando me he decidido a intentar montar un proyecto web con java. Mi pasión siempre ha sido desarrollar con PHP y avanzar sobre este lenguaje de programación ... pero ya que utilizo Java en el trabajo, ¿por qué no empezarlo a utilizar para mis proyectos personales?, tiene la ventaja de complementar lo que aprenda en un sitio y en otro.

Me ha llevado varias semanas decidirme si desarrollar en una tecnología o en otra ... y no me ha costado poco ... Utilizar PHP cuando lo dominas es fácil, sencillo y para toda la familia. El ser humano es reacio al cambio, no nos gusta cambiar viejos hábitos, tenemos miedo a lo desconocido. Java es ese cabrón que te obligar a aprender mil cosas y a cambiar el "chip", por lo tanto y como bien ha dicho un reciente amigo mío ...

¿Tú te crees que la Mona Lisa se pintó en 3 minutos ... ?

Me imagino que hacer un proyecto personal, cuesta mucho esfuerzo y muchas veces lo que estás haciendo no te reporta un beneficio a corto plazo (por ejemplo estudiar una tecnología nueva en el caso de programación, investigación, etc.)

Para conocer por encima que es Maven y para que sirve, tenemos nuestra amada Wikipedia

http://es.wikipedia.org/wiki/Maven

Montarlo sin embargo, es otra cosa ... vamos a configur maven 3 en la distribución Ubuntu 10.04:

1. Nos descargamos maven de: http://maven.apache.org/download.html

2. Desempaquetamos la descarga en nuestro escritorio, en mi caso:

$ tar -xvcf apache-maven-3.0.4.tar.gz

3. Nos creamos una carpeta en esta dirección.

$ sudo mkdir /usr/local/apache-maven

4. Copiamos de nuestro el archivo que hemos descomprimido en nuestro escritorio (/home/Mist/Escritorio/maven...) a esta ruta /usr/local/apache-maven

5. Añadimos al PATH del sistema a Maven:

$ gedit ~/.bash_profile

JAVA_HOME=”/usr/lib/jvm/java-6-openjdk”

M2_HOME=”/usr/local/apache-maven/apache-maven-3.0.2″

MAVEN_HOME=”/usr/local/apache-maven/apache-maven-3.0.2″

M2=”/usr/local/apache-maven/apache-maven-3.0.2/bin”

Y luego nuestro PATH debería quedar tal que así:
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games”

A la ruta ->

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/apache-maven/apache-maven-3.0.2/bin”

Ya tenemos instalado el condenado MAVEN, por supuesto, tenemos que reiniciar el equipo para que las variables de entorno tomen posesión y para probar si hemos hecho bien los deberemos ejecutamos el siguiente código:

$ mvn --version

Si nos aparece la versión de Maven es un logro ... si no nos aparece repasamos los pasos anteriores. De todos modos, si existe alguna pregunta, dejadla por aquí y me ocuparé de solucionarla.

Mistmoore.