Capítulo 17

Apêndice: Mudando a View Padrão: Velocity

No VRaptor, a view padrão de uma lógica é uma JSP. Mas nem sempre queremos usar JSP para gerar nossas páginas. Veremos então como usar uma outra Template Engine para gerar nossos HTMLs: o Velocity.

17.1 - Exercícios: Configurando o Velocity

  1. Entre no site de downloads do velocity (http://velocity.apache.org/download.cgi) e baixe os zips velocity-x.x.x.zip e velocity-tools-x.x.zip. Copie os seguintes jars para o seu WEB-INF/lib:

    • no velocity-x.x.x.zip copie os jars velocity-x.x.x.jar e velocity-x.x.x-dep.jar
    • no velocity-tools-x.x.zip copie todos os jars da pasta lib
  2. Abra o web.xml e adicione a servlet do Velocity.

    <servlet>
      <servlet-name>velocity</servlet-name>
      <servlet-class>
        org.apache.velocity.tools.view.servlet
          .VelocityViewServlet
      </servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>velocity</servlet-name>
      <url-pattern>*.vm</url-pattern>
    </servlet-mapping>
    

17.2 - Exercícios: Mudando o Template Engine de uma única lógica

  1. Se você quiser usar o Velocity em uma única ou poucas lógicas, você não precisa de muita coisa. Com a Servlet do Velocity configurada, para criar uma página com o velocity basta criar um arquivo com a extensão .vm. Por exemplo, crie o arquivo olamundo.vm na pasta WebContent.

    <html>
      <body>
        Olá mundo.
      </body>
    </html>
    
  2. Acesse a página do Velocity diretamente: http://localhost:8080/goodbuy/olamundo.vm

  3. Crie um controller simples para redirecionar pra esse arquivo. Note que os objetos incluídos no Result ficam acessíveis no template do Velocity.

    public class TesteController {
      private Result result;
      
      public TesteController(Result result) {
        this.result = result;
      }
      
      @Path("/teste")
      public void teste() {
        result.include("mensagem", "Estou usando o Velocity");
        result.forwardTo("/olamundo.vm");
      }
    }
    

    e modifique o olamundo.vm para mostrar a mensagem incluída:

    <html>
      <body>
        Olá mundo. $mensagem.
      </body>
    </html>
    
  4. Acesse a URL que cai nesse método: http://localhost:8080/goodbuy/teste

Saber inglês é muito importante em TI

O Galandra auxilia a prática de inglês através de flash cards e spaced repetition learning. Conheça e aproveite os preços especiais.

Pratique seu inglês no Galandra.

17.3 - Exercícios: Mudando o resultado de todas as lógicas para Velocity

  1. O VRaptor 3 tem uma convenção para chamar a página de resultado de uma lógica: a página em /WEB-INF/jsp/<nomeDoController>/<nomeDoMetodo>.jsp. Mas e se quisermos mudar a convenção para outra coisa? Por exemplo não usar jsp, e sim velocity?

    Para isso precisamos sobrescrever um comportamento do VRaptor. Quase todos os componentes do VRaptor podem ser sobrescritos por componentes da sua aplicação, pois ele utiliza Injeção de Dependência para ligar seus componentes internos. Se você criar uma implementação de uma interface interna do VRaptor, e anotá-la com @Component, o VRaptor vai usar a sua implementação, e não mais a padrão.

    Queremos mudar o padrão da página para usar Velocity, então podemos mudar o padrão para algo do tipo: /WEB-INF/velocity/<nomeDoController>/<nomeDoMetodo>.vm.

    O componente responsável por essa convenção é o PathResolver, que tem uma implementação padrão chamada DefaultPathResolver. Essa implementação padrão contém métodos protected que podem ser sobrescritos, tornando fácil a mudança da convenção. Então para usar a convenção nova basta criar a classe abaixo, que estende de DefaultPathResolver.

    package br.com.caelum.goodbuy.vraptor;
    
    import javax.servlet.http.HttpServletRequest;
    
    import br.com.caelum.vraptor.view.AcceptHeaderToFormat;
    import br.com.caelum.vraptor.view.DefaultPathResolver;
    
    @Component
    public class VelocityPathResolver extends DefaultPathResolver {
    
      public VelocityPathResolver(HttpServletRequest request,
          AcceptHeaderToFormat acceptHeaderToFormat) {
        super(request, acceptHeaderToFormat);
      }
    
      @Override
      protected String getPrefix() {
        // o retorno padrão desse método é /wEB-INF/jsp/, que é a página
        // onde suas views serão procuradas
        return "/WEB-INF/velocity/";
      }
    
      @Override
      protected String getExtension() {
        // o retorno padrão é jsp, que a extensão da página da sua view
        return "vm";
      }
      
    }
    
  2. Crie a pasta /WEB-INF/velocity, e dentro dela a pasta teste. Mova o arquivo olamundo.vm para a pasta teste e o renomeie para teste.vm.

  3. Remova o redirecionamento para a página olamundo.vm de dentro do TesteController:

    public class TesteController {
      private Result result;
      
      public TesteController(Result result) {
        this.result = result;
      }
      
      @Path("/teste")
      public void teste() {
        result.include("mensagem", "Estou usando o Velocity");
      }
    }
    
  4. Acesse a url do método teste (http://localhost:8080/goodbuy/teste), e veja que continua funcionando: ele vai redirecionar automaticamente para a página /WEB-INF/velocity/teste/teste.vm.

  5. Veja que agora nenhuma das outras páginas do sistema estão acessíveis. Agora qualquer chamada vai dar 404, pois ele estará usando a nova convenção. O comportamento do VRaptor agora é o da sua classe, e não mais a padrão dele!