MouseOver Studio

MouseOver Studio header image 2

Desenvolvimento web com VRaptor 2, Freemarker e Sitemesh

June 2nd, 2008 por Diego Carrion · 4 comentários

Um pouco de historia

Faz umas semanas decidi junto a dois amigos meus que moram e trabalham comigo começar um projeto web. Depois de conversar um pouco decidimos que o framework MVC seria o Struts 2. Diariamente quando chegávamos em casa abríamos algo para beber e começávamos a desenvolver um pouco do projeto.

Depois de três dias, uma quarta feira, sugeri trocar o Struts 2 por outro framework. Domingo da semana anterior tinha ido para o Falando em Java 2008 e após a palestra do Paulo Silveira fiquei com muita vontade de experimentar o VRaptor 2.

Meus dois amigos concordaram na hora. O motivo? O motivo era que chegávamos em casa um pouco cansados e não tínhamos muito tempo na noite, sempre havia um programa ou filme legal para assistir, pelo que ficar configurando os arquivos .xml sempre que fossemos fazer alguma coisa com o Struts era muito chato e pouco produtivo.

Ja passaram alguns dias desde que começamos a trabalhar com o VRaptor 2 e a verdade e que estamos surpresos com a produtividade que temos ganhado e a facilidade que o VRaptor 2 nos tem dado para desenvolver algumas coisas. E por tal motivo que decidi criar esse artigo explicando como configurar o VRaptor 2 com o Freemarker e Sitemesh e assim tudo mundo possa começar a desenvolver seu projeto web de forma ágil e sem muitas complicações.

Para os apressadinhos

Criei um projeto blank no Google Code. Para os que não tem muito tempo é somente baixar ele e começar a desenvolver.

Mãos na obra

Antes de começar devemos criar a estrutura de pastas e arquivos de um projeto web. Eu utilizo o Eclipse e consigo isso rapidamente criando um projeto web dinâmico.

Os jars que precisaremos são freemarker-2.x.jar, sitemesh-2.x.jar, vraptor-2.x.jar, log4j-1.x.jar, xstream-1.x.jar e picocontainer-1.x.jar. Os tres últimos jar são utilizados pelo VRaptor 2 e vem junto com ele. O PicoContainer é um container IoC e o XStream é uma biblioteca para trabalhar com arquivos XML.

No arquivo web.xml situado na pasta WEB-INF, dentro do nodo web-app, devemos incluir o seguinte código:

<filter>
<filter-name>sitemesh</filter-name>
<filter-class>
com.opensymphony.module.sitemesh.filter.PageFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>
com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet
</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.dec</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>vraptor2</servlet-name>
<servlet-class>org.vraptor.VRaptorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>vraptor2</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>

Acabamos de configurar nossa aplicação para mapear os recursos .action com o VRaptor e os recursos .dec com o Freemarker, além de indicar que todos os recursos deveram ser filtrados pelo Sitemesh (talvez de para melhorar isso aqui). O url-pattern padrão do VRaptor é .logic mas prefiro chamar minhas actions como XptoAction que como XptoLogic e por isso o .action .

O VRaptor trabalha por padrão com views .jsp pelo que teremos que mudar isso. Criaremos um arquivo chamado vraptor.xml que estará ubicado na pasta raiz do nosso código fonte (src no meu caso). Indicaremos também nesse arquivo que desejamos que todas as views sejam procuradas na pasta views, assim teremos uma melhor organização:

<vraptor>
<regex-view-manager>
/views/$component/$logic.$result.dec
</regex-view-manager>
</vraptor>

Antes de continuar é importante mencionar que se temos uma classe chamada AdminAction e um método chamado login, $component equivale a Admin, $logic a login e $result à string que o método login retornar. Caso login seja um método do tipo void, $result sera equivalente por padrão à ok.

Por ultimo (sim, por ultimo!) devemos criar um arquivo chamado decorators.xml e coloca-lo na pasta WEB-INF. O conteúdo dele sera o seguinte:

<decorators defaultdir="/decorators">
<decorator name="main" page="main.dec">
<pattern>/*</pattern>
</decorator>
</decorators>

Nesse arquivo acabamos de indicar que nossos decoradores do Sitemesh estarão localizados na pasta decorators, que teremos um decorador chamado main que ira ser o arquivo main.dec e estará mapeado a todos os arquivos filtrados pelo Sitemesh.

O teste

Vamos testar se nossa aplicação funciona. Vou fazer o teste no Tomcat 6 mas isso não deveria ter muita diferença.

Começaremos criando uma classe chamada de TestAction com o seguinte conteúdo:

import org.vraptor.annotations.Component;

@Component
public class TestAction {

	private String text;

	public String sayHelloWorld() {
		text = "Hello World!";
		return "ko";
	}

	public String getText() {
		return text;
	}

}

O metodo poderia ser um void mas preferi retornar alguma string somente para demostrar o poder do VRaptor, KO!

Seguidamente criaremos um arquivo chamado sayHelloWorld.ko.dec que ficara na pasta test do nosso conteúdo web:

${text}

Finalmente criaremos uma pasta chamada decorators e nela o arquivo main.dec :

Sitemesh antes do body
${body}
Sitemesh depois do body

Ao subir nosso container web e acessar o recurso test.sayHelloWorld.action deveriamos ter como resultado a mensagem Sitemesh antes do body Hello World! Sitemesh depois do body.

Concluindo

O legal do VRaptor é que exige configuração minima e é fortemente baseado em anotações. Podem aprender mais sobre ele aqui. O Freemarker oferece uma linguagem dinâmica e muito poderosa, mesmo não tinha sido demostrada nesse artigo. Finalmente, o Sitemesh é muito útil porque ele infiltra as views de modo que quem cria elas não precisa ficar sabendo nem se preocupando com os decoradores. Sitemesh é algo similar à inversão de controle na view.

Espero que o artigo seja de utilidade e como sempre qualquer duvida ou critica é bem vinda. Ate a próxima!

Tags: Tutoriales · freemarker · java · programação · sitemesh · vraptor

4 respostas ate agora ↓

  • 1 FredMP // Jun 3, 2008 at 1:14 am

    Muito legal o artigo! Aqui na empresa em que trabalho convenci o pessoal a usar o VRaptor tb e até agora temos gostado muito do resultado.

  • 2 Diego Carrion // Jun 3, 2008 at 9:45 am

    Aqui na empresa onde trabalho o pessoal utiliza o Struts mas espero poder mudar isso com o tempo. Talvez o pessoal da Caeluim deveria por uma lista de empresas que utilizam a tecnologia para assim ela transmitir um pouco mais de confiança para os duvidosos.

  • 3 Rodrigo Alvarez // Nov 27, 2008 at 7:47 pm

    Concordo plenamente! VRaptor é um ótimo framework web e deveria existir uma listinha de empresas que usam… Eu conveceria meu chefinho tb xD

  • 4 Diego Carrion // Nov 28, 2008 at 2:24 pm

    Oi Rodrigo, você que gosta do VRaptor, tenta dar uma olhada no VRaptor Sexy Urls:

    http://github.com/dcrec1/vraptor2_sexy_urls/tree/master

    é um fork que fiz que implementa urls das actions tipo as do Rails, sem um .action ou algo assim. Não tem quase nada de documentação ate agora a não ser a dos testes, mas mais ja ta chegando :P

Deixar um comentário