PQP!* Como não conheci o Struts 2 antes?!*
Autor: Marcos Oliveira | Publicado: 2011-03-10T11:31:00-08:00

Vamos ao nosso artigaço sobre Struts 2, como prometido, mostrando alguns recursos interessantes. Até que enfim saiu!Quem conhece o struts ou outro framework com o mesmo propósito, sabe o quanto ele auxilia em tarefas como: criar ações no controle e submeter formulários para essas ações, associar campos de formulário a campos de objetos, controlar o redirecionamento de páginas e recursos.Porém o que muitos não conhecem, mesmo alguns que o utilizam (e nesse caso não utilizam bem), são alguns recursos fantásticos que podem evitar horas de programação e tediosas consultas na internet a fim de "tirar aquela base". É claro que não vou citar todos esses recursos, apenas os que acho muito relevantes e que frequentemente não são utilizados. Abaixo são mostrados 3 desses recursos:Upload de ArquivosAgora imagine esse outro cenário: Upload de Arquivos. Pois é, o título do tópico já explica nosso cenário :(.Com o Struts 2 precisamos apenas inserir o campo file para submissão na página:"<"s:file name="arquivo" /">"E declará-lo com o tipo java.io.File na Action:private File arquivo;Ah, não esqueça de incluir o atributo enctype no form, informando o tipo de dados transmitidos:"<"s:form id="inicial" enctype="multipart/form-data"">"Se precisar do nome ou do contentType do arquivo, crie os atributos do tipo String ”FileName” e ”ContentType”. Ex:private String arquivoFileName;private String arquivoContentType;O Struts irá atribuir esses valores para você.E é apenas isso que precisa fazer para submeter um arquivo, nada de criar o File no Servidor e gravar esses dados, o Struts já te entregará o arquivo pronto.É, eu sei que está sem palavras para agradecer, eu também.RESULT JSON, JASPER, STREAM...Usar o result para o controle de redirecionamento é legal. Quando precisamos de um retorno que não seja uma página é melhor ainda. Você pode querer clicar em algo e fazer um download, ou gerar um relatório, fazer uma consulta Ajax, e uma infinidade de coisas que não seja processamento e redirecionamento pra outra página.Com os Result Types você pode fazer tudo isso ficar bem simples.Veja como é fácil gerar um relatório PDF utilizando essa técnica:@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 será a apresentação de um relatório PDF, conforme definido no parâmetro “format”, que utiliza Result Type jasper, baseado em relatórios jasper reports que recebe parâmetros definidos em reportParameters para a configuração do relatório, e utiliza dados de objetoDados para atribuir em campos do relatório. O arquivo jasper ficará no diretório definido em “location”.Outro Result Type interessante é o stream. Você pode retornar qualquer informação dessa forma, o cliente tentará fazer o download:@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "stream", params = { "inputName", "inputStream","contentDisposition", "${contentDisposition}" })Nesse exemplo você irá transferir algo que estiver no InputStream chamado inputStream, definido na Action, na disposição definida em contentDisposition que pode ser, por exemplo, “attachment;filename=xxxx”.O JSON é um tipo bastante utilizado, principalmente para respostas de submissões AJAX, que geralmente tratarão a resposta com um script sem recarregar a página. Veja como é simples:@Result(name = com.opensymphony.xwork2.Action.SUCCESS, type = "json", params = { "root", "lista" }),Nesse exemplo, sera retornado o objeto “lista” da action, na notação JSON. E você não terá dificuldades para utilizar essa resposta para as coisas mais variadas, ou achar um framework que trate essa resposta pra você. Já que o JSON é uma notação largamente utilizada e difundida.Manutenção do Estado de Objetos na navegação(através de serialização entre páginas)Imagine se você tiver que manter o estado de um objeto de negócio depois de navegar por diversas páginas. Por exemplo, você tem um atributo na classe Action, chamado objSerial.Esse objeto é um bean que você irá utilizar em uma página lá na frente (a página 5, por exemplo). Então ao submeter um formulário (da página 1) para uma action esse objeto é carregado, e a página 2 é mostrada. Porém ao submeter a página 2, caso você não tenha inserido esse objeto no formulário submetido por essa página, ele foi perdido e não será possível submetê-lo.Para contornar esse problema, freqüentemente utilizamos um campo de formulário do tipo hidden. Porém isso só funciona quando se trata de tipos primitivos, classes Wrapper ou uma String. Porém o que queremos navegar nas páginas é um objeto de negócio, um bean qualquer que definimos.Podemos fazer da seguinte forma:1. Usaremos um campo hidden para inserir o objeto na página 2, e em qualquer página que precise armazenar o estado do objeto a ser usado posteriormente:"<"input type="hidden" name=" objSerial.serializable"  value="${requestScope['objSerial.serializable']}"/">"*O nome não é aleatório, deve ser: “.sufixo”.2. Inserimos um interceptor nas actions que receberão o bean submetido por um formuláriointerceptorRefs = {@InterceptorRef(value = "serializador", params = { "parametros"," objSerial"}),@InterceptorRef("defaultStack") }3. Definimos um atributo do tipo String na action para receber o valor serializado:private String objSerialsufixo;(O "sufixo" serve para diferir esse atributo do atributo verdadeiro, e deve ser tratado no Interceptor.)4. O mais difícil ficará com você, ler o artigo, Escrevendo Interceptors, e criar o Interceptor configurando-o no com o nome serializador no xml de configuração do struts, e escrever o método intercept do Interceptor criado para que o método intercept desserialize o objeto e atribua-o no atributo correto.*Pronto! Basta em cada página inserirmos o campo hidden e configurar as actions com o interceptor de serialização. E seu objeto chegará lá na página 5 intacto.|o| Excelente Recurso!Reparou o quanto tempo você já deve ter perdido por não saber essas coisas? O importante é que a partir de agora sua vida foi dividida em duas. Você será outra pessoa com esses conhecimentos, e irá utilizar o Struts ou outra ferramenta para deixar de amarrar aqueles antigos arames.*PQP significa: Poxa! Que Paia!*Fala verdade, o título ficou excelente.*Eu sei que ficou faltando o principal, mas eu só estou mostrando que isso pode ser feito dessa forma. Caso queira mais detalhes sobre a implementação desse interceptor me pergunte.Referências:http://struts.apache.org/2.2.1/docs/guides.html