terça-feira, 29 de maio de 2007

Struts 2: Saída de stream com parametros dinâmicos

usando o novo framework Struts 2, depois de um tempo brigando com a falta de conhecimento finalmente consegui montar uma action onde seto dinâmicamente os parametros para a definição do result

observe os respectivos códigos:

java: classe action
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class DynamicStreamAction {
  //--------------------------------------------------------------------------
  // parametros para uso na saída da action
  private String contentType;
  private int contentLength;
  private String contentDisposition;
  // definição da saída do stream
  private InputStream myStream;
  //--------------------------------------------------------------------------
  public String execute() {
    
    // definindo o tipo de conteúdo
    this.setContentType"application/xml" );
    // definindo que será em anexo( solicitará o salvamento do arquivo )
    this.setContentDisposition"attachment; filename=XmlAction.xml" );
    
    
    // definindo o XML de saida
    String xml = "<tag>xml teste de saída áéíóú ç à...</tag>";
        
    // setando o stream para o tributo
    this.setMyStreamnew ByteArrayInputStreamxml.getBytes() ) );

    // definindo o tamanho do contentLength
    this.setContentLengthxml.getBytes().length );    
    return "success";
  }
  //--------------------------------------------------------------------------  
  
  // get´s & set´s

}


respectivo mapeamento da action com definição dos parametros do result, tipo stream dinâmicos
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <package name="stream" namespace="/stream" extends="struts-default">

        <action name="dynamic" class="stream.DynamicStreamAction">
      <result name="success" type="stream">
        <param name="inputName">myStream</param>  
        <param name="contentType">${contentType}</param>  
        <param name="contentDisposition">${contentDisposition}</param>
        <param name="contentLength">${contentLength}</param>
      </result>
        </action>

    </package>
</struts>


* Observe: que os parametros definidos no mapeamento da action são respectivamente os mesmo nomes dos atributos da classe action...