Skip to content

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:

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, suponhamos que seja solicitada a ação URL [ http://machine:port/contexte/actions/Action1]. São então executados os seguintes passos:

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

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

É, 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 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
  1. 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:

Image

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á.