Atenção: esse artigo tem um vídeo complementar. Clique e assista!

Artigo no estilo: Curso

De que se trata o artigo:

O artigo continua a apresentar o Struts2, um framework que facilita o desenvolvimento de aplicações web ao aplicar o padrão MVC à arquitetura da aplicação. Na primeira parte foram apresentadas funcionalidades básicas do framework com o desenvolvimento de um projeto simples, porém útil. Nesta parte continuamos o desenvolvimento desta aplicação e apresentamos novas funcionalidades como a injeção de dependência e o upload de arquivos.


Para que serve:

O Struts2 serve para aumentar a produtividade das equipes de desenvolvimento web, propondo, ao mesmo tempo, uma organização maior dos artefatos de código a partir da separação das responsabilidades de apresentação, controle e negócio e da existência de diversas funcionalidades prontas, comumente utilizadas em aplicações deste tipo.

Em que situação o tema é útil:

Quando devemos construir aplicações web de médio a grande porte e o tempo investido no aprendizado do framework é justificado por uma maior produtividade no desenvolvimento e na manutenção.

Aplicações Web com Struts2 – Parte 2:

O Struts2 é um dos frameworks web mais conhecidos e utilizados atualmente. Ele provê uma série de facilidades para a construção de aplicações web, melhorando a produtividade da equipe e diminuindo custos de manutenção devido a uma melhor organização do código. Na segunda parte desta série de artigos, continuamos o desenvolvimento de nossa aplicação de exemplo para apresentar novas funcionalidades. Apresentamos primeiro o container interno de injeção de dependências do Struts2 (Listagens 1 a 3) e, em seguida, sua integração com o Spring Framework (Listagens 4 e 5) para alcançar o mesmo objetivo. Em seguida, mostramos que é possível criar beans para injeção de dependências no contexto de sessão (Listagens 6 a 8). Tal componente armazena informações do usuário atual da aplicação e, com ele, é possível implementar funcionalidades de login/logout (Listagens 9 a 13). A próxima funcionalidade desenvolvida é o cadastro de membros: primeiro criamos a base e mostramos a integração com o FreeMarker (Listagens 14 a 18) e depois implementamos um cadastro quase completo (Listagens 19 a 27). Deixamos como exercício para o leitor implementar o cadastro de livros e, em cima deste cadastro, implementamos o upload de arquivo para armazenar a capa do livro no sistema (Listagens 28 a 30). Para finalizar, mostramos como exibir a capa do livro armazenada por meio do resultado stream, que permite retornar resultados binários como imagens, arquivos PDF e outros (Listagens 31 a 33).

Esta é a segunda parte de uma série de artigos sobre o Struts2, iniciada na Edição 74 da Java Magazine. Naquela edição, começamos com o básico, como a instalação do framework e a criação de um “Hello, World!”. Iniciamos também o desenvolvimento de uma aplicação web (WebApp) simples, mas com utilidade real: uma aplicação para gerência de pequenas bibliotecas chamada Bookshelf. Por meio deste exemplo, mostramos diversas funcionalidades do Struts2, como a abordagem dirigida ao modelo, uso de interceptadores, definição de resultados, validação de formulários, internacionalização de mensagens e integração com o framework SiteMesh para aplicação de leiaute gráfico a todas as páginas.

Nesta edição, continuaremos a desenvolver o Bookshelf (se você não seguiu a primeira parte, pode obter o código-fonte no site da Java Magazine) e mostraremos outras características do Struts2, como a injeção de dependências, upload de arquivo e resultados binários, e sua integração com outros frameworks como FreeMarker e Spring.

Atualização de versão

Depois do fechamento da primeira parte desta série de artigos, foram lançadas novas versões estáveis (GA, ou General Availability) do Struts2. A versão estável mais recente no momento da escrita deste artigo é a 2.1.8.1, que pode ser obtida no site do Struts2 (veja Links).

Para este artigo faremos uma atualização de versão e usaremos a versão 2.1.8.1 do framework. Para atualizar seu projeto, localize a pasta do projeto Bookshelf na qual se encontram os arquivos JAR, exclua as versões antigas dos JARs do Struts2 e suas dependências e copie as versões novas da pasta lib da distribuição do struts-2.1.8.1. A Tabela 1 lista os arquivos que devem ser atualizados e suas novas versões.

JAR

Versão Antiga

Versão Nova

commons-collection

3.1

3.2

Freemarker

2.3.13

2.3.15

Ognl

2.6.11

2.7.3

Sitemesh

2.3

2.4.2

struts2-core

2.1.6

2.1.8.1

struts2-dojo-plugin

2.1.6

2.1.8.1

struts2-sitemesh-plugin

2.1.6

2.1.8.1

xwork(-core)

2.1.2

2.1.6

Tabela 1. Atualização dos JARs do Struts2 e suas dependências.

Na distribuição struts-2.1.8.1, o JAR xwork alterou seu nome para xwork-core.

A pasta que contém os JARs depende da utilização ou não de uma IDE que gerencie as dependências do projeto web para você. Se você utiliza o Eclipse, uma solução comumente adotada consiste em criar uma pasta lib na raiz do projeto, copiar os arquivos JAR para esta pasta e depois adicioná-los como Java EE Module Dependencies nas propriedades do seu projeto. Caso você tenha usado o Eclipse para desenvolver o Bookshelf até o momento, lembre-se de efetuar o refresh do projeto e atualizar as dependências nas propriedades do mesmo depois da cópia das novas versões dos JARs.

Após a atualização, implante novamente sua aplicação no seu container web Java e teste novamente as funcionalidades desenvolvidas até o momento. Sua aplicação deve funcionar sem demais alterações.

Injeção de dependências

Segundo a própria documentação do Struts2, a injeção de dependências (ou DI, de dependency injection) “transfere a responsabilidade de criação e ligação de objetos dos próprios objetos para uma fábrica” (tradução nossa). Em termos práticos, ao utilizar DI, nossas classes de ação não precisarão mais se preocupar em criar instâncias dos serviços dos quais dependem, pois eles serão criados por um container externo, no caso, o Struts2. Para mais informações sobre DI, veja na seção Links um artigo de Martin Fowler sobre o assunto.

O Struts2 traz um container nativo de DI baseado no Google Guice, porém é possível integrar o Struts2 com diversos containers externos de DI como o próprio Guice ou o Spring Framework (veja Links), o que veremos mais adiante. Vejamos, primeiro, como utilizar o container nativo. A Listagem 1 mostra um trecho da classe de ação InstalarSistemaAction (desenvolvida na primeira parte desta série de artigos), que não utiliza DI, ou seja, cria a instância de MembroDAO explicitamente.

MembroDAO é o DAO responsável pela persistência de objetos da classe Membro, que representam os membros do departamento, laboratório ou grupo de pesquisa que utilizará o Bookshelf para gerenciar sua pequena biblioteca.

Listagem 1. Trecho da classe InstalarSistemaAction que mostra a criação explícita de uma dependência.


  public class InstalarSistemaAction extends ActionSupport {
    private MembroDAO membroDAO = new HibernateMembroDAO();
   
    // ... 

Com injeção de dependência, basta especificar para o container o que pode ser injetável (comumente chamado de bean) e onde injetá-lo. Ao criar as classes de ação, o Struts2 se encarrega de criar e associar todas as instâncias necessárias para satisfazer as dependências. As Listagens 2 e 3 mostram as alterações necessárias no código-fonte do Bookshelf para injetar o DAO na ação de instalação do sistema.

...

Quer ler esse conteúdo completo? Tenha acesso completo