arquivo, nada de criar o File no Servidor e gravar esses dados, o Struts ja te entregara o arquivo pronto.E, eu sei que esta sem palavras para agradecer, eu tambem.RESULT JSON, JASPER, STREAM...Usar o result para o controle de redirecionamento e legal. Quando precisamos de um retorno que nao seja uma pagina e melhor ainda. Voce pode querer clicar em algo e fazer um download, ou gerar um relatorio, fazer uma consulta Ajax, e uma infinidade de coisas que nao seja processamento e redirecionamento pra outra pagina.Com os Result Types voce pode fazer tudo isso ficar bem simples.Veja como e facil gerar um relatorio PDF utilizando essa tecnica:@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "jasper", location = "/WEB-INF/classes/jasper/relatorio.jasper", params = {"dataSource", "objetoDados", "format", "PDF", "documentName", "Exemplo", "contentDisposition ", "exemplo.pdf","reportParameters", "parametros" })O resultado da chamada a essa action sera a apresentacao de um relatorio PDF, conforme definido no parametro format, que utiliza Result Type jasper, baseado em relatorios jasper reports que recebe parametros definidos em reportParameters para a configuracao do relatorio, e utiliza dados de objetoDados para atribuir em campos do relatorio. O arquivo jasper ficara no diretorio definido em location.Outro Result Type interessante e o stream. Voce pode retornar qualquer informacao dessa forma, o cliente tentara fazer o download:@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "stream", params = { "inputName", "inputStream","contentDisposition", "${contentDisposition}" })Nesse exemplo voce ira transferir algo que estiver no InputStream chamado inputStream, definido na Action, na disposicao definida em contentDisposition que pode ser, por exemplo, attachment;filename=xxxx.O JSON e um tipo bastante utilizado, principalmente para respostas de submissoes AJAX, que geralmente tratarao a resposta com um script sem recarregar a pagina. Veja como e simples:@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "json", params = { "root", "lista" }),Nesse exemplo, sera retornado o objeto lista da action, na notacao JSON. E voce nao tera dificuldades para utilizar essa resposta para as coisas mais variadas, ou achar um framework que trate essa resposta pra voce. Ja que o JSON e uma notacao largamente utilizada e difundida.Manutencao do Estado de Objetos na navegacao(atraves de serializacao entre paginas)Imagine se voce tiver que manter o estado de um objeto de negocio depois de navegar por diversas paginas. Por exemplo, voce tem um atributo na classe Action, chamado objSerial.Esse objeto e um bean que voce ira utilizar em uma pagina la na frente (a pagina 5, por exemplo). Entao ao submeter um formulario (da pagina 1) para uma action esse objeto e carregado, e a pagina 2 e mostrada. Porem ao submeter a pagina 2, caso voce nao tenha inserido esse objeto no formulario submetido por essa pagina, ele foi perdido e nao sera possivel submete-lo.Para contornar esse problema, frequentemente utilizamos um campo de formulario do tipo hidden. Porem isso so funciona quando se trata de tipos primitivos, classes Wrapper ou uma String. Porem o que queremos navegar nas paginas e um objeto de negocio, um bean qualquer que definimos.Podemos fazer da seguinte forma:1. Usaremos um campo hidden para inserir o objeto na pagina 2, e em qualquer pagina que precise armazenar o estado do objeto a ser usado posteriormente:"<"input type="hidden" name=" objSerial.serializable"