Categorías: Struts, Spring
Hace ya algún tiempo que ando tocando algunas cosas de Spring framework. Un framework que simplifica el desarrollo de aplicaciones J2EE, que entre otras cosas nos permite desacoplar partes de nuestro código gracias a Spring IoC.
A raíz de un post en programania, en donde explican dos formas de integrar spring con struts, voy a aprovechar para explicar aquí las otras dos alternativas para hacerlo.
-
Nuestros Actions deben extender de ActionSupport: de esta forma se facilita la obtención del contexto de spring manualmente, que es la forma más sencilla de hacerlo. El problema, evidentemente que de esta forma las Actions de struts quedan muy aclopadas a spring.
-
Usando DelegatingRequestProcessor (o en el caso de usar Tiles DelegatingTilesRequestProcessor): le pasamos el manejo de las acciones a spring sobre-escribiendo el RequestProcessor de struts. De esta forma desacomplamos los Actions de spring, aunque nos puede surgir el problema que vayamos a usar un RequestProcessor propio, por lo que deberíamos usar el DelegatingActionProxy, que es la forma que explican en programania.
La pega que surge al delegar el manejo de los Actions a Spring con DelegatingRequestProcessor y DelegatingActionProxy, es que hay que definir en el beans.xml nuestros actions de struts. En el primer caso, en el struts-config definiremos (como siempre) nuestros actions, por lo que deberemos mantener las mismas actions en dos XML diferentes, sólo cambia que definimos:
controller processorClass = “org.springframework.web.struts.DelegatingRequestProcessor”
mientras que en el segundo, para cada action de struts-config le pondremos el type DelegatingActionProxy:
type = “org.springframework.web.struts.DelegatingActionProxy”
En conclusión, es recomendable delegar el manejo de las acciones a spring aunque tengamos que mantener dos XML diferentes, ya que la integración es más transparente y además tendremos la opción de utilizar Spring AOP. Mientras que extender de ActionSupport resultaría útil para utilizar varios contextos de spring distintos.
Para encontrar una explicación mucho más detallada y con ejemplos, en developerWorks hay un artículo disponible.
Posted by Dani on Wednesday, February 27th, 2008
Acabo de subir a este servidor la el fichero ByteStreamInfo.java clase ByteStreamInfo.
Espero que le pueda ser útil a alguien.
Posted by Dani on Saturday, May 5th, 2007
Código para recuperar el directorio raíz de un servidor, en el contexto del Servlet:
this.getServletContext().getRealPath("/")
En un Action de Struts, simplemente debemos recuperar el servlet que se ejecuta:
this.getServlet().getServletContext().getRealPath("/");
Posted by Dani on Tuesday, March 13th, 2007
La semana pasada, me encontré con que tenía que descargar un array de bytes con Struts 1.2.9, como las implementaciones de la interface StreamInfo para los DownloadAction, no me valían, piqué mi propia implementación, por si alguien la necesita, la copio aquí:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.struts.actions.DownloadAction.StreamInfo;
/**
* Implementacion completa de la interfaz StreamInfo, para la descarga de bytes desde el servidor
* @author dlatorre
*
*/
public class ByteStreamInfo implements StreamInfo{
private String contentType;
private byte[] data;
public ByteStreamInfo(String contentType,byte[] data){
this.contentType=contentType;
this.data=data;
}
/**
* Retorna el content type del stream a descargar
*/
public String getContentType() {
return contentType;
}
/**
* Retorna un input stream del array de bytes a descargar
*/
public InputStream getInputStream() throws IOException {
InputStream inpt=new ByteArrayInputStream(data);
return inpt;
}
}
Posted by Dani on Tuesday, March 6th, 2007
Existen dos formas de configurar los .properties para la internacionalización en struts:
en struts-config.xml:
null(opcional[true]),si null=true da una excepcion si no encuentra la clave, si null=false muestra “???nombreclave???”
key(opcional)clave para guardar el bundle como un atributo del ServletContext.
en web.xml:
action
org.apache.struts.action.ActionServlet
application
paquete1.paquete2.ApplicationResources
Ejemplo de ApplicationResources.properties:
prueba.titulo= Bienvenido a la web
prueba.fecha=Fecha
En las jsp la directiva:
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
Para mostrar el mensaje internacionalizado:
> recupera el bundle del atributo del ServletContext
Posted by Dani on Monday, February 26th, 2007