1. Introdução
O PDF do documento está disponível |AQUI|.
Os exemplos do documento estão disponíveis |AQUI|.
Propomos aqui apresentar, com a ajuda de exemplos, os conceitos importantes do Struts 2. O Struts 2 é um framework web que fornece:
- um conjunto de bibliotecas na forma de ficheiros JAR
- um quadro de desenvolvimento: o Struts 2 influencia a forma como se desenvolve uma aplicação web.
Os pré-requisitos necessários para a compreensão dos exemplos são os seguintes:
- conhecimentos básicos da linguagem Java
- conhecimentos básicos de desenvolvimento web, em particular da linguagem HTML.
No site [http://developpez.com] encontram-se todos os recursos necessários para cumprir estes pré-requisitos. Escrevi alguns deles, que podem ser consultados no site [https://stahe.github.io].
Para aprofundar os conhecimentos sobre o Struts 2, podem ser utilizadas as seguintes referências:
- [ref1]: a documentação do Struts 2, disponível no site do Struts
- [ref2]: o livro «Struts 2 in Action», escrito por Donald Brown, Chad Michael Davis e Scott Stanlick, publicado pela editora Manning. Este livro é particularmente didático.
Por vezes, faremos referência a [ref2] para indicar ao leitor que pode aprofundar um tema com este livro.
O documento foi escrito de forma a poder ser lido sem necessidade de ter um computador à mão. Por isso, incluímos muitas capturas de ecrã.
1.1. O papel do Struts 2 numa aplicação web
Em primeiro lugar, 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, tal como a seguinte:
![]() |
- a camada [web] é a camada em contacto com o utilizador da aplicação web. Este interage com a aplicação web através de páginas web visualizadas por um navegador. É nesta camada que se situa o Struts 2 e apenas nesta camada.
- A camada [metier] implementa as regras de gestão da aplicação, tais como o cálculo de um salário ou de uma fatura. Esta camada utiliza dados provenientes 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 ORM (Object Relational Mapper). Estabelece uma ponte entre os objetos manipulados pela camada [dao] e as linhas e colunas dos dados de uma base de dados relacional.
- A integração das camadas pode ser realizada por um contentor Spring ou EJB3 (Enterprise Java Bean).
A maioria dos exemplos apresentados a seguir utilizará apenas uma camada, a camada [web]:
![]() |
No entanto, este documento terminará com a construção de uma aplicação web multicamadas:
![]() |
O conjunto de camadas [metier], [dao] e [jpa/hibernate] será-nos fornecido sob a forma de um arquivo jar, para que, mais uma vez, tenhamos apenas a camada [web] para construir.
1.2. O modelo de desenvolvimento MVC do Struts 2
O Struts 2 implementa o modelo de arquitetura denominado MVC (Modelo – Vista – Controlador) da seguinte forma:
![]() |
O processamento de um pedido de um cliente decorre da seguinte forma:
Os URL 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, suponhamos que seja solicitada a ação URL [ http://machine:port/contexte/actions/Action1]. São então executados os seguintes passos:
-
pedido — o navegador do cliente faz um pedido ao controlador [FilterDispatcher]. Este recebe todos os pedidos dos clientes. É a porta de entrada da aplicação. É o C de 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 da linha 2), define a ação actions/Action1.
- O controlador C instancia [2a], uma classe do tipo [actions.Action1] (atributo class da linha 2). O nome e o pacote desta classe podem ser quaisquer.
- Se a URL solicitada for acompanhada de parâmetros do tipo [param1=val1¶m2=val2&...], então o controlador C atribui esses parâmetros à classe [actions.Action1] da seguinte forma:
É, portanto, necessário que a classe [actions.Action1] possua estes métodos setParami para cada um dos parâmetros parami esperados.
- (continuação)
- o controlador C solicita que o método de assinatura [String execute()] da classe [actions.Action1] seja executado. Este pode então utilizar os parâmetros parami que a classe recuperou. No processamento do pedido do utilizador, pode ser necessária a camada [metier] [2b]. Uma vez processado o pedido do cliente, este pode gerar várias respostas. Um exemplo clássico é:
- uma página de erros, caso a solicitação não tenha podido ser processada corretamente
- uma página de confirmação, caso contrário
- o controlador C solicita que o método de assinatura [String execute()] da classe [actions.Action1] seja executado. Este pode então utilizar os parâmetros parami que a classe recuperou. No processamento do pedido do utilizador, pode ser necessária a camada [metier] [2b]. Uma vez processado o pedido do cliente, este pode gerar várias respostas. Um exemplo clássico é:
O método execute devolve ao controlador C um resultado do tipo cadeia de caracteres, denominado 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 irá também atualizar o modelo M [2c], que será utilizado pela página JSP, a ser enviada como resposta ao utilizador. Este modelo pode incluir elementos de:
- (continuação)
- da classe [actions.Action1] instanciada
- da sessão do utilizador
- dados de âmbito Application
- …
- resposta — o controlador C solicita que a página JSP, correspondente à chave de navegação [3], seja apresentada. Esta é a vista, o V de 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, trata-se de dois conceitos diferentes que, por vezes, são confundidos. Tomemos como exemplo uma aplicação web Struts 2 de uma camada:
![]() |
Se implementarmos a camada [web] com o Struts 2, teremos, de facto, uma arquitetura web MVC, mas não uma arquitetura multicamadas. Aqui, a camada [web] encarregar-se-á de tudo: apresentação, lógica de negócio e acesso aos dados. Com o Struts 2, são as classes do tipo [Action] que realizarão esse trabalho.
Agora, consideremos uma arquitetura web multicamadas:
![]() |
A camada [web] pode ser implementada sem framework e sem seguir o modelo MVC. Temos, então, uma arquitetura multicamadas, mas a camada web não implementa o modelo MVC.
Em MVC, referimos que o modelo M era o da vista V, c.a.d, ou seja, o conjunto de dados apresentados pela vista V. Por vezes (frequentemente), é fornecida outra definição do modelo M de MVC:
![]() |
Muitos autores consideram que o que se encontra à direita da camada [web] constitui o modelo M do MVC. Para evitar ambiguidades, pode-se referir-se:
- do modelo do domínio quando nos referimos a tudo o que está à direita da camada [présentation]
- do modelo da vista, quando se designam os dados apresentados por uma vista V
Daqui em diante, o termo «modelo M» designará exclusivamente o modelo de uma vista V.
1.3. As ferramentas utilizadas
Daqui em diante, utilizamos (dezembro de 2011)
- o NetBeans 7.01, disponível em URL [http://www.netbeans.org]
- o plugin Struts 2 para o NetBeans 7.01, disponível em URL [http://plugins.netbeans.org/plugin/39218]
- a versão 2.2.3 do Struts 2 está disponível em URL [http://struts.apache.org/]
Note-se que apenas as bibliotecas do Struts 2 obtidas em URL [http://struts.apache.org/] são indispensáveis para desenvolver os exemplos que se seguem. O NetBeans pode ser substituído por outro IDE (Eclipse, JDeveloper, IntelliJ, etc.) e o plugin do Struts 2 serve apenas para facilitar a vida do programador. Também não é indispensável.
1.3.1. IDE NetBeans
No site de downloads do NetBeans, escolhemos a versão Java EE:

1.3.2. Plugin Struts 2
Dependendo das versões do NetBeans, este plugin nem sempre esteve disponível. Em dezembro de 2011, encontra-se em URL [http://plugins.netbeans.org]. Este URL permite conhecer os diferentes plugins disponíveis para o NetBeans. É possível filtrar a pesquisa. No [1], pode-se procurar os plug-ins que contenham a palavra «struts» no nome.
![]() |
- seguimos o link [2]
![]() |
Descarregamos o plugin e descompactamo-lo [2]. Para o integrar no NetBeans, podemos proceder da seguinte forma:
- inicie o NetBeans
![]() |
- no [1], selecione o menu Tools/Plugins
- no separador [2], utilize o botão [3]
- em [4], selecionar os ficheiros .nbm dos plug-ins descarregados. Aqui, escolhemos as bibliotecas do Struts versão 2.2.3 em vez das do Struts 2.0.14
- De volta ao separador [2], instalamos os plugins selecionados com o botão [5].
A instalação dos plug-ins requer frequentemente o reinício do NetBeans.
1.3.3. As bibliotecas do Struts 2
Se tiver descarregado o plugin Struts 2 para o NetBeans, dispõe das principais bibliotecas do Struts, mas não de todas. A seguir, vamos precisar de algumas bibliotecas disponíveis no site do Struts 2 [http://struts.apache.org/].
![]() |
Seguimos o link [1] e, em seguida, o link [2] para descarregar o ficheiro zip da distribuição 2.2.3.1. Depois de descompactada a distribuição, as bibliotecas necessárias ao Struts encontram-se na pasta [lib] [3] da distribuição. Existem várias dezenas delas, o que levanta a questão de saber quais são indispensáveis. É aqui que o plugin do Struts nos ajudará.










