Archive for the ‘Struts’ Category

Integrar Spring y Struts

Wednesday, February 27th, 2008

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.

Fichero de la clase ByteStreamInfo de Struts

Saturday, May 5th, 2007

Acabo de subir a este servidor la el fichero ByteStreamInfo.java clase ByteStreamInfo.

Espero que le pueda ser útil a alguien.

Apunte: Recuperar el directorio raíz del servidor en un Servlet y/o en un Action de Struts

Tuesday, March 13th, 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("/");

ByteStreamInfo, implementeción de la interface StreamInfo

Tuesday, March 6th, 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;
}
}

Internacionalización con struts

Monday, February 26th, 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