<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>MouseOver Studio &#187; freemarker</title>
	<atom:link href="http://www.mouseoverstudio.com/blog/category/freemarker/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.mouseoverstudio.com/blog</link>
	<description></description>
	<pubDate>Wed, 25 Aug 2010 02:03:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Desenvolvimento web com VRaptor 2, Freemarker e Sitemesh</title>
		<link>http://www.mouseoverstudio.com/blog/2008/06/02/desenvolvimento-web-com-vraptor-2-fremarker-e-sitemesh/</link>
		<comments>http://www.mouseoverstudio.com/blog/2008/06/02/desenvolvimento-web-com-vraptor-2-fremarker-e-sitemesh/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 01:55:53 +0000</pubDate>
		<dc:creator>Diego Carrion</dc:creator>
		
		<category><![CDATA[Tutoriales]]></category>

		<category><![CDATA[freemarker]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[programação]]></category>

		<category><![CDATA[sitemesh]]></category>

		<category><![CDATA[vraptor]]></category>

		<category><![CDATA[desenvolvimento]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.mouseoverstudio.com/blog/?p=81</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Um pouco de historia</strong></p>
<p>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. </p>
<p>Depois de três dias, uma quarta feira, sugeri trocar o Struts 2 por outro framework. Domingo da semana anterior tinha ido para o <a href="http://www.caelum.com.br/falando-em-java/">Falando em Java 2008</a> e após a palestra do Paulo Silveira fiquei com muita vontade de experimentar o VRaptor 2.</p>
<p>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.</p>
<p>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 <a href="http://freemarker.sourceforge.net/">Freemarker</a> e <a href="http://www.opensymphony.com/sitemesh/">Sitemesh</a> e assim tudo mundo possa começar a desenvolver seu projeto web de forma ágil e sem muitas complicações.</p>
<p><strong>Para os apressadinhos</strong></p>
<p>Criei um <a href="http://code.google.com/p/vraptor-freemarker-sitemesh--blank/">projeto blank</a> no Google Code. Para os que não tem muito tempo é somente baixar ele e começar a desenvolver. </p>
<p><strong>Mãos na obra</strong></p>
<p>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. </p>
<p>Os jars que precisaremos são <a href="http://freemarker.sourceforge.net/freemarkerdownload.html">freemarker-2.x.jar</a>, <a href="http://www.opensymphony.com/sitemesh/download.action">sitemesh-2.x.jar</a>, <a href="http://sourceforge.net/project/showfiles.php?group_id=158027">vraptor-2.x.jar</a>, 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 <a href="http://www.picocontainer.org/">PicoContainer</a> é um container IoC e o <a href="http://xstream.codehaus.org/">XStream</a> é uma biblioteca para trabalhar com arquivos XML.</p>
<p>No arquivo web.xml situado na pasta WEB-INF, dentro do nodo web-app, devemos incluir o seguinte código:</p>
<p><code class="prettyprint">&lt;filter&gt;<br />
    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />
    &lt;filter-class&gt;<br />
        com.opensymphony.module.sitemesh.filter.PageFilter<br />
    &lt;/filter-class&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
&lt;servlet&gt;<br />
    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;<br />
    &lt;servlet-class&gt;<br />
        com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet<br />
    &lt;/servlet-class&gt;<br />
    &lt;init-param&gt;<br />
	&lt;param-name&gt;TemplatePath&lt;/param-name&gt;<br />
	&lt;param-value&gt;/&lt;/param-value&gt;<br />
    &lt;/init-param&gt;<br />
    &lt;init-param&gt;<br />
	&lt;param-name&gt;default_encoding&lt;/param-name&gt;<br />
	&lt;param-value&gt;ISO-8859-1&lt;/param-value&gt;<br />
    &lt;/init-param&gt;<br />
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;<br />
    &lt;url-pattern&gt;*.dec&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
&lt;servlet&gt;<br />
    &lt;servlet-name&gt;vraptor2&lt;/servlet-name&gt;<br />
    &lt;servlet-class&gt;org.vraptor.VRaptorServlet&lt;/servlet-class&gt;<br />
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
        &lt;servlet-name&gt;vraptor2&lt;/servlet-name&gt;<br />
        &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</code></p>
<p>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 .</p>
<p>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:</p>
<p><code class="prettyprint">&lt;vraptor&gt;<br />
	&lt;regex-view-manager&gt;<br />
		/views/$component/$logic.$result.dec<br />
	&lt;/regex-view-manager&gt;<br />
&lt;/vraptor&gt;</code></p>
<p>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. </p>
<p>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: </p>
<p><code class="prettyprint">&lt;decorators defaultdir=&quot;/decorators&quot;&gt;<br />
    &lt;decorator name=&quot;main&quot; page=&quot;main.dec&quot;&gt;<br />
          &lt;pattern&gt;/*&lt;/pattern&gt;<br />
    &lt;/decorator&gt;<br />
&lt;/decorators&gt;</code></p>
<p>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.</p>
<p><strong>O teste</strong></p>
<p>Vamos testar se nossa aplicação funciona. Vou fazer o teste no Tomcat 6 mas isso não deveria ter muita diferença. </p>
<p>Começaremos criando uma classe chamada de TestAction com o seguinte conteúdo:</p>
<pre class="prettyprint">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;
	}

}</pre>
<p>O metodo poderia ser um void mas preferi retornar alguma string somente para demostrar o poder do VRaptor, KO!</p>
<p>Seguidamente criaremos um arquivo chamado sayHelloWorld.ko.dec que ficara na pasta test do nosso conteúdo web:</p>
<pre class="prettyprint">${text}</pre>
<p>Finalmente criaremos uma pasta chamada decorators e nela o arquivo main.dec :</p>
<pre claass="prettyprint">Sitemesh antes do body
${body}
Sitemesh depois do body</pre>
<p>Ao subir nosso container web e acessar o recurso test.sayHelloWorld.action deveriamos ter como resultado a mensagem <em>Sitemesh antes do body Hello World! Sitemesh depois do body</em>.</p>
<p><strong>Concluindo</strong></p>
<p>O legal do VRaptor é que exige configuração minima e é fortemente baseado em anotações. Podem aprender mais sobre ele <a href="http://www.vraptor.com.br/tutoriais.jsp">aqui</a>. 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.</p>
<p>Espero que o artigo seja de utilidade e como sempre qualquer duvida ou critica é bem vinda. Ate a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mouseoverstudio.com/blog/2008/06/02/desenvolvimento-web-com-vraptor-2-fremarker-e-sitemesh/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
