[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Struts revisitado




Hola a todos,

En nuestro último proyecto de desarrollo web, debido a los condicionantes 
tecnológicos de nuestro cliente, hemos tenido que renunciar al stack de 
tecnologías Java EE 5 que veníamos empleando últimamente, consistente 
básicamente en JSF + JPA + Facelets, para retornar al viejo y glorioso 
Struts.

En Orange Software procuramos afrontar cada proyecto como una excusa para 
experimentar y aprender algonuevo, así que en este caso decidimos 
probar con Struts 2 [1] (anteriormente conocido como WebWork 2). A 
continuación os describo algunas impresiones de nuestra evaluación, por si 
sirven a alguien más.

La primera conclusión importante es que la curva de aprendizaje para 
desarrolladores con experiencia previa con Struts 1.x es bastante suave. A 
nosotros nos ha bastado con la propia documentación que existe en su sitio 
web, si bien en InfoQ se puede descargar gratuitamente el libro "Starting 
Struts 2" [2]. El motivo de la suave transición es que la filosofía del 
framework es básicamente la misma que en su versión inicial; es decir, es un 
framework MVC basado en Actions. En este sentido, es un framework de 
concepción tradicional, alejado de las nuevas tendencias que se observan 
últimamente en el diseño de los frameworks web, a saber: frameworks basados 
en componentes (Tapestry, Wicket, RIFE o el mismo JSF) y frameworks basados 
en lenguajes dinámicos (Ruby on Rails, Grails).

Aunque la idea básica sigue siendo la misma que en Struts 1.x, también es 
cierto que su diseño y arquitectura nos ha sorprendido gratamente, incluyendo 
muchas mejoras respecto de la primera versión y corrigiendo los puntos 
débiles que más se han criticado de Struts 1.x. Paso a enumeraros algunas de 
las nuevas características que más nos han gustado:

* Las clases Action son clases POJO, es decir ni siquiera es obligatorio 
implementar la interfaz Action, ni mucho menos extender de una clase 
abstracta como ocurría en Struts 1.x. Esto corrige una de las mayores 
debilidades de Struts 1.x, que se ha criticado por ser demasiado intrusivo.

* A diferencia de Struts 1.x, las clases Action tampoco dependen 
necesariamente del API de Servlet. En caso de que nuestro Action requiera 
acceder a algún contexto de Servlet, estos se representan como mapas, con lo 
que prácticamente se elimina la necesidad de acceder directamente a clases 
como HttpServletRequest, HttpServletResponse o HttpSession.

* El desacoplamiento de nuestro código respecto del framework y del Servlet 
API, entre otros beneficios, mejora mucho la "testeabilidad".

* También se ha eliminado la necesidad de crear clases ActionForm. Este era 
otro punto negro en el diseño de Struts. Por un lado, la separación en clases 
distintas de las acciones y los datos era bastante discutible desde el punto 
de vista de la orientación a objetos. Por otro lado, obligaba a crear toda 
una serie de clases redundantes, en lugar de reutilizar las clases del modelo 
de dominio para capturar los datos de entrada del usuario. En Struts2 se 
utilizan las propiedades del Action, que a su vez pueden ser objetos 
complejos, por ejemplo, instancias del modelo de dominio.

* Ya no es necesario escribir clases Action thread-safe, ya que a diferencia 
de lo que ocurría en Struts 1, se crea una instancia distinta de nuestros 
Action para procesar cada petición.

* La arquitectura de Struts 2 [3] es muy modular y extensible. Incluye algunos 
nuevos elementos como los interceptores (Interceptor e InterceptorStack) y 
mapeadores (ActionMapper), que permiten controlar con precisión el ciclo de 
vida de la petición a nivel de Action. En Struts 1.x el ciclo de vida era 
compartido por todos los Action de un módulo.

* Es fácil extender el framework con interceptores y mapeadores propios. En 
cualquier caso, Struts 2 incluye un conjunto bastante amplio de 
implementaciones disponibles para ser utilizadas y que nos pueden ahorrar 
bastante trabajo. Por ejemplo, entre los ActionMapper disponibles, destacaría 
el Restful2ActionMapper que permite crear fácilmente aplicaciones REST. Algo 
para lo que nosotros veníamos empleando UrlRewriteFilter [4]. Entre los 
muchos interceptores disponibles [5], sólo a modo de muestra tenemos los 
siguientes:

    - checkbox: maneja automáticamente la desactivación de estado de los 
checkbox.
    - execAnWait: ejecuta una acción de larga duración de fondo mientras 
se muestra al usuario una página de espera.
    - prepare: típica lógica de precarga de información que en Struts 1.x 
solía obligarnos a crear un SetupXXXAction.
    - i18n: internacionalización y selección de idioma por parte del usuario.

* Respecto al acceso a valores desde las vistas, destaca el nuevo lenguaje de 
expresiones OGNL (Object-Graph Navigation Language) [6], aparentemente más 
potente que el JSTL-EL usado en Struts 1.x. Por otro lado, el acceso a las 
propiedades no está limitado a los 4 ámbitos clásicos (página, petición, 
sesión y aplicación), sino que se incorpora el nuevo concepto de "ValueStack", 
que permite a las vistas acceder a propiedades de manera desacoplada de los 
objetos que las contienen.

* Respecto a las vistas, también hay mejora, se incluye una librería de tags 
que permite ser empleada tanto desde plantillas JSP, Velocity o Freemarker. 
La librería es completísima, incluyendo algunas etiquetas avanzadas 
como "doubleselect" para representar 2 menús con los elementos del segundo 
cambiando en función de la selección del primero, u "optiontransferselect" 
para transferir elementos entre dos listas. También se incluyen algunas 
etiquetas AJAX, aunque en nuestro caso, para las características AJAX hemos 
empleado AjaxTags [7]

* Una de las características que más nos ha gustado de los tags de Struts 2, 
es que por fin se establece una separación entre la lógica de las etiquetas y 
las plantillas de texto que generan en la vista. Struts 2 define esta 
separación mediante el concepto de temas. El framework incluye 4 temas 
predefinidos (simple, xhtml, css-xhtml y ajax) que pueden seleccionarse a 
nivel global o incluso a nivel de cada tag individual. Las plantillas están 
se escriben en FreeMarker [8], aunque sin conocer este lenguaje, nos ha 
resultado realmente sencillo crear un tema propio partiendo de los 
existentes. Esta es una característica que realmente echábamos de menos, ya 
que permite generar (x)HTML estándar y orientado a CSS con mucho menos código 
en las vistas. Para los que pretendemos generar HTML estándar y accesible, 
esta posibilidad de control es realmente importante.

Estas son sólo algunas de las novedades que más nos han llamado la atención. 
Sin duda habrá muchas más que iremos descubriendo en el futuro. Aunque en el 
futuro pretendemos evaluar otros frameworks más innovadores como Grails o 
Seaside, nuestra impresión de Struts 2 ha sido muy positiva y probablemente 
seguiremos utilizándolo en el futuro en cierto tipo de proyectos.

Un saludo,
Rafa

Referencias:

[1] http://struts.apache.org/2.x/
[2] http://www.infoq.com/minibooks/starting-struts2
[3] http://struts.apache.org/2.x/docs/big-picture.html
[4] http://tuckey.org/urlrewrite/
[5] http://struts.apache.org/2.x/docs/interceptors.html
[6] http://www.ognl.org/
[7] http://ajaxtags.sourceforge.net/
[8] http://freemarker.org/

-- 
Rafael Luque Leiva

Orange Software - http://www.orange-soft.com
Creando software para las personas

Urbanización Las Castañeras
Arroyo de los Combos, 26 bis
Arroyomolinos, E28939 Madrid
Tel: +34 692 613 639
Fax: +34 916 091 075

GnuPG Key ID: 0x4B9238A2