<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lucas Teixeira &#187; render</title>
	<atom:link href="http://lucastex.com.br/tag/render/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Mon, 19 Jul 2010 11:39:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Devolvendo um texto como attachment no response</title>
		<link>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/</link>
		<comments>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 12:48:52 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[attachment]]></category>
		<category><![CDATA[content disposition]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[response]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=271</guid>
		<description><![CDATA[

Me deparei com a seguinte situação em uma aplicação construída usando Grails.
O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:
def arquivo = Arquivo.get(params.id) [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2010%252F01%252F27%252Fdevolvendo-um-texto-como-attachment-no-response%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FdDzmT5%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Devolvendo%20um%20texto%20como%20attachment%20no%20response%22%20%7D);"></div>
<p>Me deparei com a seguinte situação em uma aplicação construída usando Grails.</p>
<p>O sistema gravaria o conteúdo de um arquivo (plain xml mesmo) dentro do banco de dados, para evitar dependências com filesystem. Mas este arquivo também precisaria ser lido posteriormente. A solução que estava disponível, era alguma coisa mais ou menos assim:</p>
<pre class="brush: groovy;">def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
render arquivo.texto</pre>
<p>Legal, desta maneira (bem simples até), o conteúdo deste texto seria renderizado na página para o usuário poder salvá-la.</p>
<p>Imaginei que isto pudesse ser incrementado um pouco, e percebi que fazer com que o usuário tivesse que salvar a página (que continha apenas o XML) poderia se tornar um tanto chato com o passar do tempo. Resolvi alterar a action para devolver o texto em anexo ao response. Isso mesmo, com a caixinha para poder salvá-lo.</p>
<p>Olha que simples:</p>
<pre class="brush: groovy;">def arquivo = Arquivo.get(params.id) //recupera o arquivo da base
response.setContentType &quot;text/xml&quot;
response.setHeader &quot;Content-Disposition&quot;, &quot;attachment;filename=\&quot;${arquivo.nome}.xml\&quot;&quot;
response &lt;&lt; arquivo.texto</pre>
<p>Simples, colocando a instrução no header para que a &#8220;disposição&#8221; da resposta seja &#8220;attachment&#8221; (anexo), o browser ao invés de renderizar apenas o conteudo, retorna um arquivo com este texto.</p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2010/01/27/devolvendo-um-texto-como-attachment-no-response/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Renderizando um XML como resposta em grails</title>
		<link>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/</link>
		<comments>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:45:04 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=126</guid>
		<description><![CDATA[

Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.
No exemplo abaixo, um parâmetro nome é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.
def busca = [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F11%252F03%252Frenderizando-um-xml-como-resposta-em-grails%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Renderizando%20um%20XML%20como%20resposta%20em%20grails%22%20%7D);"></div>
<p>Se em grails você precisar renderizar um XML como resposta de uma action, use o método render junto com o builder de XML que temos disponível. Muito fácil, rápido e objetivo.</p>
<p>No exemplo abaixo, um parâmetro <em>nome</em> é passado para a action, que faz uma consulta baseado neste parâmetro e nos nomes dos clientes.</p>
<pre class="brush: groovy;">def busca = {
   def clientes = Cliente.findAllByNomeIlike(&quot;%${params.nome}%&quot;)

   render(contentType: &quot;text/xml&quot;) {
      results() {
         clientes.each {
            cliente -&gt; result() {
               id(cliente.id)
               nome(cliente.nome)
            }
         }
      }
   }
}</pre>
<p>Explicando o auto-explicativo:</p>
<p>Linha 2: Usamos um método dinâmico do grails (não, este método não existe na classe) que permite que eu localize todos os clientes (findAll) por seus nomes (byNome) Ilike (case insensitive) usando o parâmetro <em>nome</em> que veio no request. Esta lista é armazenada na referência clientes.</p>
<p>Linha 4: Pela funcão <em>render</em> deixamos claro que iremos renderizar um conteúdo <em>text/xml</em></p>
<p>Linha 5: Esta será a nossa tag root do xml: <strong>results</strong>. A <a href="http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/" target="_blank">closure</a> que se abre definirá os filhos deste nó.</p>
<p>Linha 6: Cada cliente na lista retornada&#8230;</p>
<p>Linha 7: Será um novo nó <strong>result</strong> do XML de resposta</p>
<p>Linhas 8 e 9: Os fois filhos de <strong>result</strong>, teremos o <strong>id</strong> do cliente e seu <strong>nome</strong>, suficiente para uma combo com auto-complete!<br />
O resultado foi como esperado, e o tempo de fazer o exemplo funcionar foi definitivamente menor que o de escrever este post!</p>
<pre class="brush: xml;">&lt;results&gt;
   &lt;result&gt;
      &lt;id&gt;313&lt;/id&gt;
      &lt;nome&gt;JOSE DA SILVA&lt;/nome&gt;
   &lt;/result&gt;
   &lt;result&gt;
      &lt;id&gt;817&lt;/id&gt;
      &lt;nome&gt;PATRICIA MARIA SILVA E SILVA&lt;/nome&gt;
   &lt;/result&gt;
   &lt;result&gt;
      &lt;id&gt;91&lt;/id&gt;
      &lt;nome&gt;MARCOS SILVINO&lt;/nome&gt;
   &lt;/result&gt;
&lt;/results&gt;</pre>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/11/03/renderizando-um-xml-como-resposta-em-grails/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
