VRaptor

Integrando o VRaptor com Tiles 3

por Otávio Garcia

Apache Tiles é um framework que implementa o design pattern Composite View. Com ele é possível você criar templates para sua aplicação de forma bem simples. Mais informações você encontrará no site do projeto.

O primeiro passo é incluir em seu projeto Maven o artefato abaixo. Se você não usa Maven, você pode ir no site do Tiles e baixar os arquivos manualmente.

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.0</version> <!-- ou a última versão -->
</dependency>

E depois adicionar o listener que informa ao tiles que a aplicação está inicializada:

<listener>
    <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>

E por último o servlet que irá responder às requisições do Tiles. No exemplo abaixo, qualquer requisição para a URL *.tiles será direcionada para os templates do Tiles.

<servlet>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TilesDispatchServlet</servlet-name>
    <url-pattern>*.tiles</url-pattern>
</servlet-mapping>

Desta forma já temos o Tiles atendendo as requisições.

Por padrão o VRaptor faz o forward para JSPs. Então precisaremos sobrescrever o comportamento da classe DefaultPathResolver para fazer o forward para o Tiles, usando o Servlet que criamos anteriormente.

@Specializes
public class TilesPathResolver extends DefaultPathResolver {

    @Inject
    protected TilesPathResolver(FormatResolver resolver) {
        super(resolver);
    }

    @Override
    protected String getPrefix() {
        return "/";
    }

    @Override
    protected String getExtension() {
        return "tiles";
    }
}

Com isso, se você requisitar o método ClienteController.formulario, o VRaptor irá efetuar o forward para o template cliente.formulario. Basta então criarmos o template para atender ao forward no arquivo /WEB-INF/tiles.xml:

<definition name="/cliente/formulario" template="/WEB-INF/jsp/layouts/basic.jsp">
    [...]
</definition>

O Tiles possui uma versão mais antiga do Javassist como dependência, o que pode causar conflitos com a versão utilizada pelo VRaptor. Para resolver, basta excluir essa dependência como no exemplo a seguir:

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.0</version> <!-- ou a última versão -->
        <exclusions>
           <exclusion>
              <artifactId>javassist</artifactId>
              <groupId>jboss</groupId>
           </exclusion>
         </exclusions>
</dependency>