1. Introdução
O PDF do documento está disponível |AQUI|.
Estão disponíveis exemplos retirados do documento |AQUI|.
Aqui, pretendemos apresentar os conceitos-chave do Struts 2 através de exemplos. O Struts 2 é uma estrutura web que fornece:
- uma série de bibliotecas na forma de ficheiros JAR
- uma estrutura de desenvolvimento: o Struts 2 influencia a forma como uma aplicação web é desenvolvida.
Os pré-requisitos para compreender os exemplos são os seguintes:
- conhecimentos básicos da linguagem Java
- conhecimentos básicos de desenvolvimento web, em particular HTML.
Todos os recursos necessários para cumprir estes pré-requisitos podem ser encontrados no site [https://developpez.com]. Escrevi alguns deles, que podem ser encontrados no site [https://stahe.github.io].
Os exemplos neste documento estão disponíveis no URL [https://stahe.github.io/pt-struts2-janv-2012/].
Para saber mais sobre o Struts 2, pode utilizar as seguintes referências:
- [ref1]: a documentação do Struts 2, disponível no site do Struts
- [ref2]: o livro «Struts 2 in Action», de Donald Brown, Chad Michael Davis e Scott Stanlick, publicado pela Manning. Este livro é particularmente instrutivo.
Iremos ocasionalmente fazer referência a [ref2] para informar o leitor de que pode explorar um tópico com maior profundidade utilizando este livro.
Este documento foi escrito de forma a poder ser lido sem um computador à mão. Por isso, incluímos muitas capturas de ecrã.
1.1. O papel do Struts 2 numa aplicação Web
Primeiro, vamos situar o Struts 2 no contexto do desenvolvimento de uma aplicação web. Na maioria das vezes, esta será construída com base numa arquitetura multicamadas, como a seguinte:
![]() |
- A camada [web] é a camada em contacto com o utilizador da aplicação web. O utilizador interage com a aplicação web através de páginas web apresentadas por um navegador. É nesta camada que o Struts 2 reside, e apenas nesta camada.
- A camada [de negócios] implementa a lógica de negócios da aplicação, como o cálculo de um salário ou de uma fatura. Esta camada utiliza dados do utilizador através da camada [web] e do SGBD através da camada [DAO].
- A camada [DAO] (Data Access Objects), a camada [JPA] (Java Persistence API) e o controlador JDBC gerem o acesso aos dados do SGBD. A camada [JPA] funciona como um ORM (Object-Relational Mapper). Atua como uma ponte entre os objetos tratados pela camada [DAO] e as linhas e colunas de dados numa base de dados relacional.
- A integração das camadas pode ser alcançada utilizando um contentor Spring ou EJB3 (Enterprise JavaBeans).
A maioria dos exemplos apresentados abaixo utilizará apenas uma única camada, a camada [web]:
![]() |
No entanto, este documento terminará com a construção de uma aplicação web multicamadas:
![]() |
As camadas [business], [DAO] e [JPA/Hibernate] serão-nos fornecidas como um arquivo JAR, de modo que, mais uma vez, só precisamos de construir a camada [web].
1.2. O modelo de desenvolvimento MVC do Struts 2
O Struts 2 implementa o padrão arquitetónico MVC (Modelo–Visão–Controlador) da seguinte forma:
![]() |
O processamento de um pedido do cliente decorre da seguinte forma:
Os URLs solicitados têm o formato http://machine:port/contexte/rep1/rep2/.../Action. O caminho [/rep1/rep2/.../Action] deve corresponder a uma ação definida num ficheiro de configuração do Struts 2; caso contrário, é rejeitado. Uma ação é definida num ficheiro XML com o seguinte formato:
No exemplo anterior, vamos supor que a URL [http://machine:port/contexte/actions/Action1] é solicitada. São então executados os seguintes passos:
- solicitação - o cliente do navegador faz uma solicitação ao controlador [FilterDispatcher]. O controlador lida com todas as solicitações do cliente. É o ponto de entrada da aplicação. É o C em MVC.
- processamento
- O controlador C consulta o seu ficheiro de configuração e descobre que a ação actions/Action1 existe. O namespace (linha 1) concatenado com o nome da ação (atributo name na linha 2) define a ação actions/Action1.
- O controlador C instancia [2a] uma classe do tipo [actions.Action1] (atributo class na linha 2). O nome e o pacote desta classe podem ser quaisquer.
- Se o URL solicitado incluir parâmetros da forma [param1=val1¶m2=val2&...], então o controlador C atribui esses parâmetros à classe [actions.Action1] da seguinte forma:
Portanto, a classe [actions.Action1] deve ter métodos setParami para cada um dos parâmetros parami esperados.
- O controlador C chama o método com a assinatura [String execute()] da classe [actions.Action1] para executar. Este método pode então utilizar os parâmetros parami que a classe recuperou. Ao processar o pedido do utilizador, pode ser necessária a camada [business] [2b]. Uma vez processado o pedido do cliente, pode gerar várias respostas. Um exemplo clássico é:
- uma página de erro, caso a solicitação não tenha sido processada corretamente
- uma página de confirmação, caso contrário
O método execute devolve um resultado do tipo string ao controlador C, conhecido como chave de navegação. No exemplo acima, [*actions.Action1*].*execute pode produzir duas chaves de navegação: "page1" (linha 3) e "page2" (linha 4). O método [actions.Action1].execute também atualizará o modelo M* [2c] que será utilizado pela página JSP enviada em resposta ao utilizador. Este modelo pode conter elementos de:
- a classe [actions.Action1] instanciada
- a sessão do utilizador
- dados do âmbito da aplicação
- ...
- resposta - o controlador C instrui a página JSP correspondente à chave de navegação a apresentar [3]. Esta é a vista, o V em MVC. A página JSP utiliza um modelo M para inicializar as partes dinâmicas da resposta que deve enviar ao cliente.
Agora, vamos esclarecer a relação entre a arquitetura web MVC e a arquitetura em camadas. Na verdade, estes são dois conceitos diferentes que por vezes são confundidos. Tomemos como exemplo uma aplicação web Struts 2 de camada única:
![]() |
Se implementarmos a camada [web] com o Struts 2, teremos de facto uma arquitetura web MVC, mas não uma arquitetura em camadas. Aqui, a camada [web] irá tratar de tudo: apresentação, lógica de negócio e acesso aos dados. Com o Struts 2, são as classes [Action] que irão realizar este trabalho.
Agora, vamos considerar uma arquitetura web multicamadas:
![]() |
A camada [web] pode ser implementada sem um framework e sem seguir o modelo MVC. Temos, então, uma arquitetura multicamadas, mas a camada web não implementa o modelo MVC.
No MVC, dissemos que o modelo M é o da vista V, ou seja, o conjunto de dados exibidos pela vista V. Por vezes (frequentemente), é dada outra definição do modelo M no MVC:
![]() |
Muitos autores consideram que o que se encontra à direita da camada [web] constitui o modelo M do MVC. Para evitar ambiguidades, podemos referir-nos a:
- o modelo de domínio quando nos referimos a tudo à direita da camada [de apresentação]
- o modelo de vista quando nos referimos aos dados apresentados por uma vista V
Daqui em diante, o termo «modelo M» referir-se-á exclusivamente ao modelo de uma vista V.
1.3. As ferramentas utilizadas
De agora em diante, estamos a utilizar (dezembro de 2011)
- o IDE NetBeans 7.01, disponível em [http://www.netbeans.org]
- o plugin Struts 2 para o NetBeans 7.01, disponível em [http://plugins.netbeans.org/plugin/39218]
- o Struts 2 versão 2.2.3, disponível em [http://struts.apache.org/]
Note que apenas as bibliotecas Struts 2 disponíveis em [http://struts.apache.org/] são necessárias para desenvolver os exemplos que se seguem. O NetBeans pode ser substituído por outro IDE (Eclipse, JDeveloper, IntelliJ, etc.), e o plugin Struts 2 existe apenas para facilitar a vida do programador. Também não é essencial.
1.3.1. IDE NetBeans
No site de downloads do NetBeans, selecionamos a versão Java EE:

1.3.2. Plugin Struts 2
Dependendo da versão do NetBeans, este plugin nem sempre esteve disponível. A partir de dezembro de 2011, pode ser encontrado no URL [http://plugins.netbeans.org]. Este URL lista os vários plugins disponíveis para o NetBeans. Pode filtrar a sua pesquisa. Em [1], procuramos plugins que contenham a palavra «struts» no nome.
![]() |
- Siga o link [2]
![]() |
Descarregue o plugin e descompacte-o [2]. Para o integrar no NetBeans, proceda da seguinte forma:
- Inicie o NetBeans
![]() |
- Em [1], selecione o menu Ferramentas/Plug-ins
- No separador [2], clique no botão [3]
- Em [4], selecione os ficheiros .nbm dos plug-ins descarregados. Aqui, escolhemos as bibliotecas do Struts 2.2.3 em vez das do Struts 2.0.14
- De volta ao separador [2], instale os plugins selecionados utilizando o botão [5].
A instalação de plug-ins requer frequentemente o reinício do NetBeans.
1.3.3. As bibliotecas do Struts 2
Se descarregou o plugin Struts 2 para o NetBeans, tem as principais bibliotecas Struts, mas não todas. Mais tarde, vamos precisar de determinadas bibliotecas disponíveis no site do Struts 2 [http://struts.apache.org/].
![]() |
Siga o link [1] e, em seguida, o link [2] para descarregar o ficheiro zip da versão 2.2.3.1. Depois de descompactada a distribuição, as bibliotecas necessárias ao Struts podem ser encontradas na pasta [lib] [3] da distribuição. Existem dezenas delas, pelo que surge a questão de saber quais são essenciais. É aqui que o plugin do Struts nos vai ajudar.










