05 VRaptor e Tiles 2.2

por Rogerio Alcantara no post do GUJ

baixar o tiles-jsp.jar. Como estou utilizando maven2:

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>2.2.2</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

No web.xml:

<!-- tiles configuration -->
<servlet>
    <servlet-name>TilesServlet</servlet-name>
    <servlet-class>org.apache.tiles.web.startup.TilesServlet</servlet-class>
    <init-param>
        <param-name>org.apache.tiles.factory.TilesContainerFactory.MUTABLE</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<!-- /tiles configuration -->

<!-- vraptor configuration -->
<filter>
    <filter-name>vraptor</filter-name>
    <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>

<filter-mapping>
    <filter-name>vraptor</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!-- vraptor configuration -->

Repare que não é declarado o DEFINITIONS_CONFIG, nem registrado o TilesDispatchServlet. Pois não utilizaremos arquivo para guardar as definitions, e quem cuidara dos redirecionamentos continuará sendo o VRaptor, que já faz isso muito bem obrigado! ;D Outro detalhe importante, é deixar o TilesContainerFactory como MUTABLE. ;)

TilesPathResolver?

Nessa abordagem, não é necessário criar implementar esse PathResolver, já que essa responsabilidade continuará sendo do VRaptor. ;D

/WEB-INF/jsp/template.jsp - servirá de base para todas as páginas

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>site</title>
    </head>
    <body>
        <div id="divHeader">
            <tiles:insertTemplate template="/WEB-INF/jsp/header.jsp"/>
        </div>
        <div id="divContent">
            <tiles:insertAttribute name="body"/>
        </div>
        <div id="divFooter">
            <tiles:insertTemplate template="/WEB-INF/jsp/footer.jsp"/>
        </div>
    </body>
</html>

/WEB-INF/jsp/home/index.jsp - exemplo que utilizará o template - repare que o path mantém a convenção do VRaptor3! ^^

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<tiles:insertTemplate template="/WEB-INF/jsp/template.jsp">

    <tiles:putAttribute name="body">
        olá mundo!
    </tiles:putAttribute>

</tiles:insertTemplate>

HomeController.java - e finalmente o controler para redirecionar para index.jsp

@Resource
public class HomeController {

    private Result result;

    public HomeController(final Result result) {

        super();
        this.result = result;
    }

    public void index() { }
}

Prontinho! Estamos utilizando o tiles apenas para montar o template das páginas, o redirecionamento continua sendo cargo do VRaptor! ^^ Só tem um detalhe que eu gostaria de compartilhar, pois me deu muito trabalho de descobrir: suponha que eu queria estender o template.jsp para incluir um outro body. (tive essa necessidade na seção about do site..)

/WEB-INF/jsp/about/about_base.jsp - base que estenderá a template.jsp para alterar o layout

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<tiles:insertTemplate template="/WEB-INF/jsp/template.jsp">

    <tiles:putAttribute name="body">

        <div id="divCenter">
            <tiles:insertAttribute name="content" />
        </div>

        <div id="divRight">
            <p>
            <tiles:insertAttribute name="content_right" />
            </p>
        </div>

    </tiles:putAttribute>

</tiles:insertTemplate>

Pronto, agora a minha página do about, estenderá about_base.jsp e não template.jsp, por exemplo.

/WEB-INF/jsp/about/whyUse.jsp - estenderá o about_base.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<tiles:insertTemplate template="/WEB-INF/jsp/about/about_base.jsp" flush="true">

    <tiles:putAttribute name="content" cascade="true">
        o conteúdo central!
    </tiles:putAttribute>

    <tiles:putAttribute name="content_right" cascade="true">
                o conteúdo da direita!
    </tiles:putAttribute>

</tiles:insertTemplate>

Repare que dessa vez, o insertTemplate possui o atributo flush="true": isso é importante para que a about_base.jsp seja reinderizado primeiro. Note também que os putAttributes possuem o atributo cascade="true": que serve para disponibilizar esses atributos "para os templates de cima".

Bom, isso foi bem chatinho de descobrir, mas agora a aplicação está rodando bunitinha, sem um XML, com o layout definido nas JSPs e com o mínimo de interferência no VRaptor3! ^^