Struts: Dominando Tiles e DynaForms – Parte 02

por Juliano D. Carniel

O Struts é um framework open-source hospedado no domínio Apache (antigo sub-projeto do Jakarta), utilizado para o desenvolvimento de aplicações web. Utiliza-se de tecnologias como XML, Java Servlets, JavaBeans e ResourceBundles e ainda alguns design patterns como o Model-View-Controller, ou simplesmente MVC, como é mais conhecido (ver Nota 1).


Utilizando tiles

Para que os tiles possam funcionar em sua aplicação, será preciso que um plug-in seja acoplado ao struts. Vá até o arquivo struts-config.xml (leia a definição deste arquivo em Nota 3), e procure pelo código da Listagem 2, se ele não existir, inclua-o no final do arquivo, antes da marcação </struts-config>. É importante ressaltar que o caminho (value) colocado na primeira propriedade (definitions-config) do plug-in deve ser estritamente seguido para o correto funcionamento dos tiles. O caminho deve apontar para onde o arquivo está na sua estrutura de diretórios, lembrando que só precisamos colocar o caminho a partir da raiz de nossa aplicação.

 

Nota 3. Arquivo struts-config.xml

Este arquivo é o sistema nervoso do struts. É nele que encontramos todas as configurações de plug-ins, resources, data sources, forms, links lógicos, etc. Este arquivo é lido quando o struts é iniciado e ele cria vários objetos e carrega várias definições através das descrições contidas nele.

 

<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

 

<plug-in className="org.apache.struts.tiles.TilesPlugin" >

      <!-- Path to XML definition file -->

      <set-property property="definitions-config"

                       value="/WEB-INF/tiles-defs.xml" />

      <!-- Set Module-awareness to true -->

      <set-property property="moduleAware" value="true" />

</plug-in>

Listagem 2. Declaração do uso do plug-in de tiles.

 

Os tiles são configurados dentro de um arquivo chamado tiles-defs.xml. Caso ele não exista, crie-o no caminho definido acima, que em nosso caso é “/WEB-INF/tiles-defs.xml”. O conteúdo desse arquivo pode ser visto na Listagem 3.

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"

  "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

 

<tiles-definitions>  

<definition name="tile.mainLayout" path="/pages/mainLayout.jsp">

    <put name="header" value="/pages/menu.jsp"></put>

    <put name="application" value="/pages/welcome.jsp"></put>

    <put name="footer" value="/pages/footer.jsp"></put>

  </definition>

</tiles-definitions>

Listagem 3. Declaração de nosso arquivo tiles-defs.xml.

 

Vamos agora compreender cada parte desse arquivo. Todo e qualquer tile, ou template que tivermos, será definido dentro das marcações <tiles-definitions>...</tiles-definitions>. Elas delimitam o arquivo assim como as outras marcações conhecidas do struts.

A marcação <definition... é usada para definir um novo tile. O nome pelo qual o tile será reconhecido nos outros lugares é definido pelo valor do parâmetro name="tile.mainLayout" e o arquivo JSP correspondente deste tile é definido pelo parâmetro path="/jsp/mainLayout.jsp". Cada parte do arquivo é definida pela marcação <put... que contém um nome de referência e um valor inicial, o qual é opcional.

Como vimos na definição do nosso tile.mainLayout, ele faz referência a um arquivo JSP que conterá a estrutura de nossa aplicação como um todo. Lembre-se que este arquivo conterá a formatação de nossas páginas e servirá como base para as outras. Ele pode ser visto na Listagem 4.

 

<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<html:html>

<BODY>

<table width="100%" cellspacing="0" cellpadding="0" border="0" align="center">

  <tr>

<td valign="top">

             <tiles:insert attribute="header"/>

         </td>

  </tr>

  <tr>

         <td valign="top">

                   <tiles:insert attribute="application" />

         </td>

  </tr>

  <tr>

         <td valign="bottom">

                   <tiles:insert attribute="footer" />

         </td>

  </tr>

</table>

</body>

</html:html>

Listagem 4. Definição de nossa página modelo.

 

A página html apresentada na Listagem 4 não contém nada de muito diferente do que estamos acostumados a ver em aplicações Web. As únicas diferenças que encontramos são as declarações das taglibs (ler Nota 4), e o insert dos tiles. E é apenas essa página que conterá todo o layout de nossa aplicação, ou seja, você cria esse arquivo com uma estrutura simples e entrega-o para seu webdesigner. Mas, lembre-o de incluir as tags <tiles... onde ele quer que fique cada seção da página. Por exemplo, na tag <tiles:insert attribute='header'/> dizemos que a página definida dentro de nosso tile com o atributo chamado header será inserida naquela posição da página. O que literalmente o struts faz é dar um include do valor da propriedade definida, que nesse caso é o header e seu valor é a página welcome.jsp.

 

Nota 4. Definição de TagLibs.

JSP Tag Libraries, ou simplesmente TagLibs, é um conjunto de tag’s definidas que contêm códigos para serem usados na confecção de páginas JSP utilizando o padrão JSTL do Java. Elas basicamente são usadas para que páginas JSP sejam escritas de uma maneira que procedimentos comuns não precisem ser escritos em scriplets, como: iterar coleções, verificar atributos nulos, igualdade e desigualdade de atributos, manusear FormBeans e várias outras. Isso provê uma grande facilidade no desenvolvimento, uma melhor organização de páginas o que reflete em uma posterior manutenção sem muitas dores de cabeça.

 

Um aspecto importante de ressaltar é que se mudarmos apenas a estrutura dessa página, toda a nossa aplicação será modificada, sem requerer qualquer outra configuração. Exemplificando, você deixa seu webdesigner fazendo experiências sobre os possíveis tipos de abordagens gráficas que exista, enquanto você se preocupa com as regras de negócio da aplicação.

Porém, se as páginas JSP’s foram construídas de uma forma que ficassem muito acopladas ao layout já definido, você poderá ter problemas com a migração da aplicação para um novo layout. Assim sendo, seu webdesigner tem alguma liberdade para trabalhar, porém é preciso ser definido os espaços para cada seção da aplicação (Figura 1). Tendo definido os espaços de cada seção, evitamos ter posteriores problemas com o espaço suficiente dentro de nosso Template para a seção de body, por exemplo, que possivelmente conterá tabelas de resultados obtidas do banco de dados.