[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Struts revisitado
- To: mindfood@xxxxxxxxxxxxxxx
- Subject: Struts revisitado
- From: Rafael Luque Leiva <rafael.luque@xxxxxxxxxxxxxxx>
- Date: Fri, 21 Mar 2008 14:30:49 +0100
- Delivered-to: mailing list mindfood@orange-soft.com
- Delivered-to: moderator for mindfood@orange-soft.com
- Mailing-list: contact mindfood-help@orange-soft.com; run by ezmlm
- Organization: Orange Software
- User-agent: KMail/1.9.7
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