Spring plugin para Struts 1.3.X

Hace poco me comentaron que existía un plugin para utilizar Struts desde Spring y poder inyectar beans en los Actions. Me puse con ello, y tras varios sinsabores gracias a la no muy extensa documentación conseguí que funcionara. Para explicarlo claramente voy a comentar como lo hacía yo antes y qué nos aporta el plugin de Struts.

Opción 1: Método programático
Al principio lo que hacía era crear un Action base del que extendían todos los demás Actions, en él reimplementaba el método setServlet de esta manera:

public class BaseAction extends Action{

private Facade facade;

public Facade getFacade() {
return facade;
}

public void setFacade(Facade facade) {
this.facade = facade;
}

public void setServlet(ActionServlet arg0) {

super.setServlet(arg0);

if(arg0 !=null){

ServletContext servletContext = arg0.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.facade = (Facade) wac.getBean(“facade”);
}
}

}

Opción 2: Plugin de Spring para Struts

Los cambios a realizar dentro de la aplicación no son muchos, no obstante, me pareció complicado deducirlo de la documentación, aunque con un poco de intuición de programador todo es posible. Veamos lo que hay que hacer.

1) Modificamos el Action para inyectar la lógica de negocio directamente

Ahora ya no hace falta reimplementar el método setServlet, inyectamos la lógica de negocio a través de un método set que facilitamos a nuestro Action sin intermediarios. Por lo demás, quedaría igual que cualquier Action.

public class ListarUsuariosAction extends Action{

private Facade facade;

public Facade getFacade() {
return facade;
}

public void setFacade(Facade facade) {
this.facade = facade;
}

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

List listaUsuarios = this.facade.getUsuarios();

request.setAttribute(“listaUsuarios”,listaUsuarios);

return mapping.findForward(“listar”);
}

}

2) Cambios en el struts-config.xml

En el atributo type del tag action, en vez de poner la clase que implementa el action ponemos la clase org.springframework.web.struts.DelegatingActionProxy, ya que en el punto 3 añadiremos nuestros actions dentro del contexto de Spring para inyectar la lógica de negocio. Para terminar, cargamos el plugin de Struts para Spring y configuramos la localización del fichero de configuración de Spring.

Yo utilizo el plugin tiles, no obstante, si no queréis utilizarlo podéis cambiar el atributo path por path=”/jsp/listarUsuarios.jsp”.

< action-mappings >
< action path=”/listar” type=”org.springframework.web.struts.DelegatingActionProxy” >
< forward name=”listar” path=”lista.usuarios”/ >
< /action >

< /action-mappings >

…….

< plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn” >
< set-property property=”contextConfigLocation” value=”/WEB-INF/applicationContext.xml“/ >
< /plug-in >

3) Añadimos los actions al contextos de Spring (applicationContext.xml)

Añadimos los actions al final del fichero, como si se tratara de beans normales y corrientes. El enlace se hace a través del atributo name y path de ambos ficheros, es decir, que si en el fichero struts-config.xml el atributo path del tag action tiene el valor /listar el atributo name del tag bean del fichero applicationContext.xml tiene que tener ese mismo valor. En los JSPs no hay qu hacer ningún cambio.

<!– Actions –>

< bean name=”/listar” class=”org.cim.core.actions.ListarUsuariosAction” >
< property name=”facade” ref=”facade”/ >
< /bean >

Yo he utilizado la versión 2.5 de Spring y la versión 1.2.9 de Struts. No he probado con la versión 1.3.x ni con Struts 2 no se si esto será tan fácil, lo digo porque en ambas versiones se hicieron cambios importantes, si alguien lo ha hecho, le animo a que comparta esta información con nosotros en nuestra wiki pública para que todos podamos disfrutar de esa información. Su dirección es esta:

http://www.programania.net/contextos/doku.php

Os dejo las URLs de Spring y Struts para que les echéis un vistazo:

4 Comentarios

  • 1. Joserra  |  febrero 25th, 2008 at 5:43 pm

    Con la versión 1.3.8 de Struts funciona perfectamente. Eso sí, convierte en tedioso el proceso de creacion de una nueva acción, o investigación de las clases que lo implementan. La acción desperdigada en dos XML en vesz de en uno… ouchchhhh
    Estoy deseando migrar de Struts 1.X a [todavia_no_lo_se] :)

  • 2. danilat  |  febrero 26th, 2008 at 4:20 pm

    No hace mucho que he empezado a integrar struts y spring, pero hay otras dos formas de hacerlo:

    1- Que tus actions extiendan de la clase ActionSupport de spring, de esta manera hay que crear los contextos a mano.

    2- Añadir el controller DelegatingRequestProcessor al struts-config, que desacopla tus actions(no extiendes de nada y no necesitas crear los contextos)

    La forma menos “intrusiva” de hacerlo respecto a struts es la segunda forma. Con la forma que tú comentas delegas a spring el manejo de los actions y esto te permitie usar interceptores con spring AOP

  • 3. Raúl Vicente  |  febrero 26th, 2008 at 11:16 pm

    Sabía de la primera forma, la segunda no la entendí muy bien. Muchas gracias a los 2 por vuestra colaboración, voy a intentar poner en práctica esta 2ª opción.

  • 4. » Integrar Spring y&hellip  |  febrero 27th, 2008 at 9:56 am

    [...] raíz de un post en programania, en donde explican dos formas de integrar spring con struts, voy a aprovechar para explicar aquí [...]

Comenta el articulo:

Requerido

Requerido,