Skip to content

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:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.jsp</result>
      <result name="page2">/vues/Page2.jsp</result>
    </action>
</package>

No exemplo anterior, vamos supor que a URL [http://machine:port/contexte/actions/Action1] é solicitada. São então executados os seguintes passos:

  1. 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.
  1. 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&param2=val2&...], então o controlador C atribui esses parâmetros à classe [actions.Action1] da seguinte forma:
[actions.Action1].setParami(valeuri) ;

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
  • ...
  1. 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)

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:

Image

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.