{"id":2649,"date":"2017-08-28T06:43:59","date_gmt":"2017-08-28T09:43:59","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2649"},"modified":"2017-08-28T06:44:03","modified_gmt":"2017-08-28T09:44:03","slug":"experimentando-o-apache-tapestry","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2649","title":{"rendered":"Experimentando o Apache Tapestry"},"content":{"rendered":"<p>Recentemente come\u00e7amos um projeto de evolu\u00e7\u00e3o de uma aplica\u00e7\u00e3o web escrita em <a href=\"http:\/\/tapestry.apache.org\">Apache Tapestry<\/a>. J\u00e1 fazia um tempo que n\u00e3o ouvia falar a seu respeito (uns seis anos pelo menos), ent\u00e3o esta foi a oportunidade perfeita (e necess\u00e1ria) para que finalmente eu estudasse um pouco a seu respeito, e o que estou aprendendo tenho achado&nbsp;<strong>muito<\/strong> interessante.<\/p>\n<p>Nota importante: este \u00e9 um post escrito por um iniciante no assunto (eu). Sendo assim toda corre\u00e7\u00e3o \u00e9 bem vinda!<\/p>\n<h3>O que \u00e9 o Apache Tapestry e minhas primeiras impress\u00f5es<\/h3>\n<p>Uma defini\u00e7\u00e3o bem vagabunda: &#8220;<em>\u00e9&nbsp;framework para desenvolvimento de aplica\u00e7\u00f5es web, baseado em componentes, voltado para a plataforma Java&#8221;<\/em>. Isto n\u00e3o incita ningu\u00e9m a correr atr\u00e1s da ferramenta, especialmente se levarmos em considera\u00e7\u00e3o que n\u00e3o vemos muitos artigos escritos a seu respeito nos \u00faltimos anos. Sendo assim neste post vou escrever uma aplica\u00e7\u00e3o de exemplo que ilustra seu funcionamento.<\/p>\n<p>Meu primeiro contato com Tapestry foi atrav\u00e9s de artigos na Internet e revistas em 2004\/2005: anos mais tarde, l\u00e1 por 2011, trabalhei em uma empresa que tinha alguns projetos baseados neste framework, mas eu mesmo jamais tive qualquer contato com estes projetos. Como nunca fui f\u00e3 de frameworks que fossem baseados em componentes, torci o nariz para o projeto, at\u00e9 este m\u00eas (agosto\/2017), quando precisei estud\u00e1-lo.<\/p>\n<h4>O que gostei no Tapestry<\/h4>\n<ul>\n<li><strong>Alt\u00edssima produtividade<\/strong> &#8211; o projeto implementa um mecanismo de carregamento autom\u00e1tico de classes que nos possibilita modificar o c\u00f3digo fonte (Java) e ver as mudan\u00e7as imediatamente na aplica\u00e7\u00e3o em execu\u00e7\u00e3o, sem qualquer necessidade de reiniciar a aplica\u00e7\u00e3o.<\/li>\n<li><strong>O modelo de desenvolvimento&nbsp;<\/strong>&#8211; uma aplica\u00e7\u00e3o escrita em Tapestry essencialmente \u00e9 um conjunto de p\u00e1ginas (este n\u00e3o \u00e9 um framework voltado para a escrita de APIs REST). Uma p\u00e1gina \u00e9 basicamente uma classe Java e um arquivo de Template que reflete o estado dos objetos instanciados desta classe.<\/li>\n<li><strong>POJO puro (ou quase)<\/strong> &#8211; voc\u00ea n\u00e3o precisa implementar interfaces neste framework. Classes Java simples (e portanto<strong> f\u00e1ceis de serem testadas<\/strong>) fazem todo o trabalho, e ainda h\u00e1 um container de IoC embutido que cuida de todo o ciclo de vida destes objetos.<\/li>\n<li><strong>\u00c9 muito r\u00e1pido<\/strong> &#8211; o desempenho \u00e9 inacredit\u00e1vel. O carregamento din\u00e2mico de classes que mencionei acima, por exemplo, \u00e9 praticamente instant\u00e2neo.<\/li>\n<li><strong>Gest\u00e3o interessante de sess\u00f5es<\/strong> &#8211; o modo como Tapestry lida com sess\u00f5es do usu\u00e1rio \u00e9 muito bacana. Voc\u00ea n\u00e3o tem um objeto &#8220;session&#8221; ou algo similar: ao inv\u00e9s disto, os atributos das p\u00e1ginas que mencionei acima s\u00e3o tratados como tal de uma forma completamente transparente para o desenvolvedor.<\/li>\n<li><strong>\u00c9 extens\u00edvel<\/strong> &#8211; pelo pouco que pude ver na documenta\u00e7\u00e3o oficial do projeto, \u00e9 poss\u00edvel integr\u00e1-lo com o Spring, o que abre um universo de possibilidades. Este <a href=\"http:\/\/tapestry.apache.org\/modules.html\">link<\/a> mostra algumas extens\u00f5es publicadas al\u00e9m da documenta\u00e7\u00e3o instruindo como aplicar o Spring e Hibernate no projeto.<\/li>\n<li><strong>Baseado em Maven (e Gradle) &#8211;&nbsp;<\/strong>isto \u00e9 \u00f3timo, pois me possibilita abrir o c\u00f3digo fonte em praticamente todas as IDEs Java do mercado hoje.<\/li>\n<li><strong>A documenta\u00e7\u00e3o oficial<\/strong> &#8211; \u00e9 boa, apesar dos problemas que vou citar a seguir (talvez este ponto seja uma contradi\u00e7\u00e3o). Ela quebra o galho, mas n\u00e3o \u00e9 ideal.<\/li>\n<li><strong>Bom suporte no Eclipse<\/strong> &#8211; h\u00e1 bons plugins para o projeto (estou usando o Tapestry Tools). Neste <a href=\"http:\/\/tapestry.apache.org\/community.html\">link<\/a> h\u00e1 algumas op\u00e7\u00f5es, mas voc\u00ea as encontra f\u00e1cil no Eclipse Marketplace.<\/li>\n<li><strong>Conven\u00e7\u00f5es sobre configura\u00e7\u00e3o<\/strong> &#8211; voc\u00ea quase n\u00e3o precisa editar arquivos de configura\u00e7\u00e3o no Tapestry, basta seguir as conven\u00e7\u00f5es que o framework oferece, mas sem te prender a uma forma pr\u00e9-fixada: \u00e9 poss\u00edvel mudar, at\u00e9 onde pude ver, qualquer comportamento do framework.<\/li>\n<li><strong>Desenvolvimento do projeto continua ativo<\/strong> &#8211; apesar de n\u00e3o ouvir falar do Tapestry j\u00e1 faz um bom tempo, fiquei muito feliz ao ver na p\u00e1gina de <a href=\"http:\/\/tapestry.apache.org\/release-notes.html\">release notes<\/a> que sai pelo menos um (no m\u00e1ximo 2) release importante por ano do framework.<br \/>\n(talvez seja um release por ano pelo fato do projeto j\u00e1 estar maduro, o que \u00e9 um ponto bastante positivo)<\/li>\n<\/ul>\n<h4>O que n\u00e3o gostei<\/h4>\n<ul>\n<li><strong>Alguns problemas na documenta\u00e7\u00e3o<\/strong> &#8211; No momento da escrita deste post a documenta\u00e7\u00e3o do framework (especialmente a sess\u00e3o &#8220;<a href=\"http:\/\/tapestry.apache.org\/tapestry-tutorial.html\">Tutorial<\/a>&#8220;) estava quebrada, e os trechos que envolvem o c\u00f3digo fonte n\u00e3o estava muito leg\u00edvel, o que dificulta a vida de quem est\u00e1 dando os primeiros passos.<br \/>\nO <a href=\"http:\/\/tapestry.apache.org\/getting-started.html\">&#8220;Getting Started&#8221;<\/a>, por exemplo, est\u00e1 desatualizado (durante a escrita deste post), e voc\u00ea n\u00e3o conseguir\u00e1 criar o projeto se seguir o passo a passo.<\/li>\n<li><strong>Aus\u00eancia de uma comunidade brasileira<\/strong> &#8211; no site oficial est\u00e3o listadas algumas <a href=\"http:\/\/tapestry.apache.org\/community.html\">mailing lists<\/a>, mas apenas em ingl\u00eas. Infelizmente n\u00e3o encontrei muitos artigos escritos em portugu\u00eas, o que, por mais que muitos n\u00e3o creiam, dificulta a ado\u00e7\u00e3o da ferramenta em territ\u00f3rio nacional.<br \/>\n(sobre a falta de artigos em portugu\u00eas, comecei a fazer minha parte. Conforme vou aprendendo mais sobre o Tapestry posto por aqui).<\/li>\n<li><strong>Comunidade mundial pouco ativa<\/strong> &#8211; ao menos esta foi minha impress\u00e3o. No <a href=\"https:\/\/www.facebook.com\/groups\/32765389972\/\">Facebook<\/a>, por exemplo, s\u00f3 encontrei um grupo contendo seis membros, e na <a href=\"http:\/\/apache-tapestry-mailing-list-archives.1045711.n5.nabble.com\/users-tapestry-apache-org-Mailing-List-Archives-f2375125.html\">mailing list de usu\u00e1rios<\/a>&nbsp;h\u00e1 poucos posts novos por m\u00eas tamb\u00e9m.<\/li>\n<li><strong>Poucas issues no Jira do projeto e aus\u00eancia de um roadmap para as pr\u00f3ximas vers\u00f5es<\/strong> &#8211; este \u00e9 um ponto de aten\u00e7\u00e3o: n\u00e3o vi muitas issues abertas no <a href=\"https:\/\/issues.apache.org\/jira\/projects\/TAP5\/summary\">Jira<\/a> da comunidade que digam respeito a novas funcionalidades, especialmente no que diz respeito \u00e0 pr\u00f3xima vers\u00e3o, que ser\u00e1 a <a href=\"https:\/\/issues.apache.org\/jira\/projects\/TAP5\/versions\/12334597\">5.5.0<\/a>.<br \/>\nTamb\u00e9m n\u00e3o encontrei um roadmap para as pr\u00f3ximas vers\u00f5es: o m\u00e1ximo que encontrei foi um <a href=\"https:\/\/wiki.apache.org\/tapestry\/Tapestry5Roadmap\">antigo documento<\/a> (marcado inclusive como desatualizado) para a vers\u00e3o 5.0 do projeto.<br \/>\nEstes pontos levantam d\u00favidas a respeito da evolu\u00e7\u00e3o do projeto e se ele estar\u00e1 acompanhando as pr\u00f3ximas tend\u00eancias do mercado, o que conta como ponto negativo na sua ado\u00e7\u00e3o para novas aplica\u00e7\u00f5es.<\/li>\n<li><strong>N\u00e3o \u00e9 bom para se escrever uma API REST &#8211;&nbsp;<\/strong>o objetivo do Tapestry claramente \u00e9 a cria\u00e7\u00e3o de aplica\u00e7\u00f5es no sentido &#8220;p\u00e1ginas interativas&#8221;, n\u00e3o para a escrita de APIs. Na <a href=\"http:\/\/tapestry.apache.org\/documentation.html\">documenta\u00e7\u00e3o oficial<\/a>, por exemplo, voc\u00ea n\u00e3o v\u00ea qualquer men\u00e7\u00e3o ao desenvolvimento deste tipo de projeto (ao menos esta foi a impress\u00e3o, enquanto iniciante, que tive do projeto).<\/li>\n<\/ul>\n<h4>Notas sobre a popularidade do framework e se voc\u00ea deve adot\u00e1-lo ou n\u00e3o com base nisto.<\/h4>\n<p>Tapestry, assim como Grails, Wicket, Play e outros n\u00e3o \u00e9 o que podemos chamar de uma op\u00e7\u00e3o &#8220;mainstream&#8221;, tal como o Spring (ali\u00e1s, de todos os frameworks fora do Java EE, talvez o \u00fanico mainstream seja o Spring) ou Java EE (puro,o que inclui o JSF). Sendo assim, quaisquer compara\u00e7\u00f5es em rela\u00e7\u00e3o a estas op\u00e7\u00f5es \u00e9 descabida de fundamenta\u00e7\u00e3o.<\/p>\n<p>No caso do Java EE, ainda mais, especialmente se levar em considera\u00e7\u00e3o o fato de que todos os demais frameworks dependem deste para funcionar (o que consequentemente o tornar\u00e1 sempre o mais popular).<\/p>\n<p>O que levo em considera\u00e7\u00e3o na ado\u00e7\u00e3o destes frameworks (que s\u00e3o verdadeiras<a href=\"https:\/\/devkico.itexto.com.br\/?p=1369\"> armas secretas<\/a>) \u00e9 a atividade da comunidade que possuem e a quantidade de releases anuais. Normalmente quando n\u00e3o ocorrem releases por mais de um ano levanto o sinal amarelo.<\/p>\n<p>A prop\u00f3sito, j\u00e1 escrevi sobre este t\u00f3pico neste <a href=\"https:\/\/devkico.itexto.com.br\/?p=948\">link<\/a>&nbsp;alguns anos atr\u00e1s, mantenho minha opini\u00e3o e j\u00e1 est\u00e1 na hora de escrever outro post a respeito.<\/p>\n<p>(e ei, se voc\u00ea curte uma tecnologia e n\u00e3o escreve sobre ela por n\u00e3o ser t\u00e3o popular, s\u00f3 tenho uma coisa a te dizer: SHAME ON YOU!)<\/p>\n<h2>&#8220;Ol\u00e1 Mundo&#8221; com Tapestry<\/h2>\n<p>O c\u00f3digo fonte pode ser baixado neste <a href=\"https:\/\/github.com\/loboweissmann\/inicio-tapestry\">reposit\u00f3rio<\/a> do GitHub.<\/p>\n<h3>O que voc\u00ea vai precisar<\/h3>\n<ul>\n<li>Maven 3 &#8211; <a href=\"http:\/\/maven.apache.org\">http:\/\/maven.apache.org&nbsp;<\/a><\/li>\n<li>Java (JDK) 1.8 (para a vers\u00e3o 5.3.8 pra frente do framework. As anteriores tem de usar o Java 7 ainda)<\/li>\n<li>Qualquer IDE que ofere\u00e7a suporte a Maven (o projeto vai abrir em qualquer uma, no meu caso estou usando o Eclipse junto com o plug-in Tapestry Tools.<\/li>\n<\/ul>\n<p>\u00c9 uma aplica\u00e7\u00e3o bem simples, s\u00f3 pra mostrar os conceitos de p\u00e1ginas, componentes e o modus operandi do framework, sendo assim n\u00e3o esperem muita coisa daqui.<\/p>\n<h3>Criando o projeto com Maven<\/h3>\n<p>No link &#8220;Getting Started&#8221; do projeto voc\u00ea ler\u00e1 que deve executar o comando a seguir:<\/p>\n<pre>mvn archetype:generate -DarchetypeCatalog=http:\/\/tapestry.apache.org<\/pre>\n<p>N\u00e3o funcionar\u00e1 com o Maven 3: voc\u00ea topar\u00e1 com a seguinte mensagem de erro:<\/p>\n<pre>[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate (default-cli) on project standalone-pom: archetypeCatalog 'http:\/\/tapestry.apache.org' is not supported anymore. Please read the plugin documentation for details. -&gt; [Help 1]<\/pre>\n<p>Isto \u00e9 f\u00e1cil de resolver: basta usar uma vers\u00e3o anterior do plug-in archetype do Maven, tal como a 2.4 no exemplo a seguir:<\/p>\n<pre>mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DarchetypeCatalog=<a href=\"https:\/\/repository.apache.org\/content\/repositories\/staging\">https:\/\/repository.apache.org\/content\/repositories\/staging<\/a> -Dfilter=org.apache.tapestry:quickstart<\/pre>\n<p>Ap\u00f3s metade da Internet ser baixada para seu computador, ser\u00e3o aprsentadas 10 op\u00e7\u00f5es de arqu\u00e9tipos a serem escolhidos. Para o nosso exemplo adotei a op\u00e7\u00e3o &#8220;20&#8221; que equivale \u00e0 \u00faltima vers\u00e3o dispon\u00edvel do Tapestry (5.4.3).<\/p>\n<p>Na sequ\u00eancia voc\u00ea precisar\u00e1 responder algumas perguntas:<\/p>\n<ul>\n<li>O nome do grupo (groupId) &#8211; no exemplo: br.com.itexto<\/li>\n<li>O nome do artefato (artifactId) &#8211; no exemplo: inicio-tapestry<\/li>\n<li>Sua vers\u00e3o<\/li>\n<li>O pacote no qual o c\u00f3digo fonte se encontra (isto \u00e9 importante e veremos mais a respeito mais \u00e0 frente) &#8211; no exemplo: br.com.itexto<\/li>\n<\/ul>\n<p>Respondidas as perguntas, ser\u00e1 criado um diret\u00f3rio cujo nome equivale ao&nbsp;<em>artifactId<\/em> do projeto. Para testar o projeto, mude seu diret\u00f3rio corrente para o criado pelo projeto e execute o comando abaixo:<\/p>\n<pre>mvn jetty:run<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2656\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/saida_jetty.png\" alt=\"\" width=\"674\" height=\"254\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/saida_jetty.png 674w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/saida_jetty-300x113.png 300w\" sizes=\"(max-width: 674px) 100vw, 674px\" \/><\/p>\n<p>Ser\u00e1 iniciado o servidor <a href=\"http:\/\/www.eclipse.org\/jetty\/\">Jetty<\/a>, embarcado no projeto. Sim, seu ambiente de desenvolvimento est\u00e1 pronto. Acessando a URL http:\/\/localhost:8080, exposta na sa\u00edda do prompt, voc\u00ea se deparar\u00e1 com a seguinte p\u00e1gina:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2657\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina404_jetty.png\" alt=\"\" width=\"651\" height=\"386\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina404_jetty.png 651w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina404_jetty-300x178.png 300w\" sizes=\"(max-width: 651px) 100vw, 651px\" \/><\/p>\n<p>clique sobre o link: ele aponta para uma URL similar ao&nbsp;<em>artifactId<\/em> que voc\u00ea forneceu ao criar o projeto. Agora voc\u00ea ver\u00e1 a p\u00e1gina de boas vindas do Tapestry.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2658\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_jetty.png\" alt=\"\" width=\"600\" height=\"462\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_jetty.png 600w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_jetty-300x231.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/p>\n<p><strong>Dica<\/strong>: d\u00e1 pra criar o projeto de uma forma muito mais simples usando o Eclipse, tal como descrito neste <a href=\"http:\/\/tapestry.apache.org\/creating-the-skeleton-application.html\">link<\/a>.<\/p>\n<h3>A estrutura do projeto<\/h3>\n<figure id=\"attachment_2659\" aria-describedby=\"caption-attachment-2659\" style=\"width: 285px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2659 size-full\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/estrutura_diretorios_tapestry.png\" alt=\"\" width=\"285\" height=\"663\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/estrutura_diretorios_tapestry.png 285w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/estrutura_diretorios_tapestry-129x300.png 129w\" sizes=\"(max-width: 285px) 100vw, 285px\" \/><figcaption id=\"caption-attachment-2659\" class=\"wp-caption-text\">A estrutura de diret\u00f3rios criada pelo arqu\u00e9tipo do Maven<\/figcaption><\/figure>\n<p>Importe o projeto Maven para a IDE de sua prefer\u00eancia, pois iremos alterar levemente este c\u00f3digo fonte para expor o funcionamento do Tapestry. O arqu\u00e9tipo do Maven cria alguns sub-pacotes que s\u00e3o importantes: neste post falarei apenas de dois:<\/p>\n<ul>\n<li>br.com.itexto.pages &#8211; cont\u00e9m as p\u00e1ginas do projeto<\/li>\n<li>br.com.itexto.components &#8211; cont\u00e9m os componentes<\/li>\n<\/ul>\n<p>E na pasta &#8220;src\/main\/resources&#8221; tamb\u00e9m s\u00e3o criados alguns diret\u00f3rios interessantes:<\/p>\n<ul>\n<li>src\/main\/resources\/br\/com\/itexto\/pages &#8211; cont\u00e9m os templates das p\u00e1ginas (falaremos mais sobre isto mais a frente)<\/li>\n<li>src\/main\/resources\/br\/com\/itexto\/pages\/components<\/li>\n<\/ul>\n<p>Os mesmos nomes dos pacotes se repetem nas pastas criadas em &#8220;src\/main&#8221;. Como disse no in\u00edcio deste post, uma aplica\u00e7\u00e3o Tapestry \u00e9 composta essencialmente por p\u00e1ginas. Uma p\u00e1gina, por sua vez, tem duas faces:<\/p>\n<ul>\n<li>O c\u00f3digo fonte Java que representa o &#8220;controlador&#8221; do projeto.<\/li>\n<li>Um arquivo de template, que deve ter exatamente o mesmo nome da classe que a representa, na pasta &#8220;src\/main\/resources&#8221;. Estes templates tem a termina\u00e7\u00e3o &#8220;.tml&#8221;<\/li>\n<\/ul>\n<p>Com base no exemplo acima, alterei o c\u00f3digo fonte do arquivo &#8220;Index.java&#8221; para que fique tal como o exposto a seguir:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\npackage br.com.itexto.pages;package br.com.itexto.pages;\n\npublic class Index{\n\npublic String getRandomico() {\nreturn java.util.UUID.randomUUID().toString();\n}\n}\n\n<\/pre>\n<p>Note que \u00e9 uma classe Java simples, sem a necessidade de realizar qualquer implementa\u00e7\u00e3o de interfaces ou uso de anota\u00e7\u00f5es. Alterei tamb\u00e9m levemente o arquivo de template relacionado (src\/main\/resources\/br\/com\/itexto\/pages\/Index.tml) para que fique tal como no exemplo a seguir:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n\n&lt;html t:type=\"layout\" title=\"inicio-tapestry Index\"\nxmlns:t=\"http:\/\/tapestry.apache.org\/schema\/tapestry_5_4.xsd\"\n&gt;\n&lt;p&gt;Randomico como ${randomico}&lt;\/p&gt;\n&lt;\/html&gt;\n\n<\/pre>\n<p>(Quando acessamos a URL do projeto, \u00e9 a p\u00e1gina Index que ser\u00e1 renderizada para o visitante. Se voc\u00ea quiser experimentar, crie p\u00e1ginas com o nome &#8220;Teste&#8221; (contendo o c\u00f3digo Java e o de template) e acesse as URLs diretamente para brincar.)<\/p>\n<p>O template \u00e9 a outra face da p\u00e1gina: \u00e9 o conte\u00fado HTML que ser\u00e1 renderizado. No caso do Tapestry, \u00e9 XHTML que usamos na realidade (HTML formatado como XML). Em seu interior, inclu\u00edmos uma express\u00e3o: ${randomico}, que ir\u00e1 renderizar o valor retornado pela fun\u00e7\u00e3o getRandomico(), definido na classe Index.java. Tapestry usa a especifica\u00e7\u00e3o&nbsp;<em>JavaBeans<\/em> do Java para definir as express\u00f5es que ser\u00e3o usadas na renderiza\u00e7\u00e3o das p\u00e1ginas.<\/p>\n<p>Coloque a aplica\u00e7\u00e3o para executar em sua IDE usando o comando &#8220;mvn jetty:run&#8221; para ver o resultado, que ser\u00e1 similar ao exposto na imagem a seguir:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2660\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_mudada.png\" alt=\"\" width=\"649\" height=\"474\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_mudada.png 649w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/pagina_mudada-300x219.png 300w\" sizes=\"(max-width: 649px) 100vw, 649px\" \/><\/p>\n<h5>Recarregamento din\u00e2mico de classes<\/h5>\n<p>Agora, com a aplica\u00e7\u00e3o ainda em execu\u00e7\u00e3o, fa\u00e7a o seguinte experimento: modifique a fun\u00e7\u00e3o&nbsp;<em>getRandomico()<\/em> da classe&nbsp;<em>Index<\/em> para que retorne diferentes valores, sem parar a aplica\u00e7\u00e3o. Carregue novamente a p\u00e1gina: a mudan\u00e7a \u00e9 instant\u00e2nea.<\/p>\n<p>V\u00e1 al\u00e9m: crie outros &#8220;getters&#8221; para novas propriedades e v\u00e1 incrementando o arquivo de template. Note como mesmo novos m\u00e9todos s\u00e3o detectados instantaneamente na aplica\u00e7\u00e3o sem precisar realizar qualquer tipo de reinicializa\u00e7\u00e3o. Isto d\u00e1&nbsp;<strong>muita<\/strong> produtividade no desenvolvimento. A prop\u00f3sito, observou a&nbsp;<strong>velocidade<\/strong> com que a aplica\u00e7\u00e3o \u00e9 iniciada?<\/p>\n<h5>E os componentes?<\/h5>\n<p>Bom, vendo a \u00faltima imagem voc\u00ea deve ter notado que \u00e9 renderizada uma barra de navega\u00e7\u00e3o, mas n\u00e3o a digitamos no c\u00f3digo fonte do template. Notou? Ent\u00e3o vou repetir o c\u00f3digo aqui:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n\n&lt;html t:type=\"layout\" title=\"inicio-tapestry Index\"\nxmlns:t=\"http:\/\/tapestry.apache.org\/schema\/tapestry_5_4.xsd\"\n&gt;\n\n&lt;p&gt;Randomico como ${randomico}&lt;\/p&gt;\n&lt;\/html&gt;\n\n<\/pre>\n<p>O template define que ele \u00e9 de um dado tipo: &#8220;layout&#8221;. Voc\u00ea notou que existe uma pasta chamada &#8220;components&#8221; em &#8220;src\/main\/resources&#8221; e tamb\u00e9m um pacote chamado &#8220;components&#8221;? Se voc\u00ea abrir o c\u00f3digo fonte do arquivo &#8220;src\/main\/resources\/br\/com\/itexto\/components\/Layout.tml&#8221; ver\u00e1 que a barra de navega\u00e7\u00e3o, assim como o rodap\u00e9 e toda a identidade visual est\u00e1 a\u00ed. E tamb\u00e9m vai achar um trecho similar ao exposto a seguir:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;div class=\"container\"&gt;\n&lt;t:body \/&gt;\n&lt;hr \/&gt;\n&lt;footer&gt;\n&lt;p&gt;&amp;copy; Your Company 2015&lt;\/p&gt;\n&lt;\/footer&gt;\n&lt;\/div&gt; &lt;!-- \/container --&gt;\n<\/pre>\n<p>Sabe esta tag&nbsp;<strong>&lt;t:body\/&gt;? E<\/strong>la inclui o conte\u00fado da p\u00e1gina Index no interior do Template. \u00c9 um mecanismo muito similar ao <a href=\"https:\/\/devkico.itexto.com.br\/?p=661\">Sitemesh<\/a> do Grails! Na realidade \u00e9 um pouco mais que isto, mas para este post inicial, creio que esta defini\u00e7\u00e3o ser\u00e1 o suficiente.<\/p>\n<h3>C\u00f3digo fonte do exemplo<\/h3>\n<p>O c\u00f3digo fonte deste projeto pode ser encontrado neste <a href=\"https:\/\/github.com\/loboweissmann\/inicio-tapestry\">link<\/a>. Talvez eu o evolua no futuro conforme novos posts surjam no blog.<\/p>\n<h2>O que o Tapestry n\u00e3o tem e n\u00e3o \u00e9<\/h2>\n<p>\u00c9 importante salientar que este n\u00e3o \u00e9 um framework full stack tal como o Grails ou Spring Boot (dependendo da configura\u00e7\u00e3o). Quando criamos um novo projeto ele n\u00e3o vem com a camada de persist\u00eancia pr\u00e9-configurada. \u00c9 necess\u00e1rio realizar esta configura\u00e7\u00e3o manualmente, tal como exposto na pr\u00f3pria <a href=\"http:\/\/tapestry.apache.org\/using-tapestry-with-hibernate.html\">documenta\u00e7\u00e3o<\/a>.<\/p>\n<p>O projeto j\u00e1 v\u00eam com algumas configura\u00e7\u00f5es prontas, tal como o mecanismo de logging e algum CSS, baseado no bootstrap, mas n\u00e3o muito mais do que isto.<\/p>\n<p>Tamb\u00e9m \u00e9 importante observar o seu foco: s\u00e3o aplica\u00e7\u00f5es web que contenham p\u00e1ginas interativas, n\u00e3o APIs REST. \u00c9 poss\u00edvel configurar no mesmo projeto um segundo framework para prover estas funcionalidades, tal como o JAX-RS ou mesmo o Spring, mas n\u00e3o recomendo isto.<\/p>\n<p>Sei que n\u00e3o mencionei neste post nada relativo \u00e0 gest\u00e3o de sess\u00f5es, mas este \u00e9 outro aspecto interessant\u00edssimo do Tapestry: n\u00e3o \u00e9 um destes frameworks no qual voc\u00ea tem a sess\u00e3o expl\u00edcita. Lidamos com ela de uma forma indireta atrav\u00e9s de anota\u00e7\u00f5es que inclu\u00edmos em nossas classes (@Persistent). Sendo assim, para projetos que precisem lidar diretamente com sess\u00f5es (cada vez menos o caso), Tapestry tamb\u00e9m n\u00e3o se aplica.<\/p>\n<h2>Conclus\u00f5es finais sobre este contato inicial<\/h2>\n<p>Neste post mostrei apenas o b\u00e1sico do b\u00e1sico do b\u00e1sico do Tapestry (quase nada pra ser sincero). Muita coisa ficou de fora, tal como a forma como \u00e9 realizada a navega\u00e7\u00e3o entre as p\u00e1ginas, gest\u00e3o de sess\u00e3o, formul\u00e1rios, invers\u00e3o de controle, etc.<\/p>\n<p>Meu objetivo foi apenas gerar algum interesse pelo framework e, talvez, criar o post inicial que me permita ir detalhando aos poucos como o Tapestry funciona conforme vou avan\u00e7ando nossos estudos a seu respeito.<\/p>\n<p>Estou achando uma solu\u00e7\u00e3o&nbsp;<strong>muito&nbsp;<\/strong>interessante: mais interessante que o JSF na minha opini\u00e3o, pois \u00e9 mais f\u00e1cil de aprender e oferece uma produtividade muito superior. Isto sem mencionar no desempenho, que foi um dos fatores que mais me surpreendeu.<\/p>\n<p>(tal como mencionado no in\u00edcio deste POST, para implementar APIs REST n\u00e3o \u00e9 uma solu\u00e7\u00e3o interessante. Ali\u00e1s, nem sei se faria sentido, dado ser focado em componentes, e n\u00e3o em a\u00e7\u00f5es, tal como ocorre no Grails e Spring MVC)<\/p>\n<p>Dado o estado atual da comunidade (ao menos minha percep\u00e7\u00e3o inicial), n\u00e3o sei se o recomendaria para iniciar novos projetos, mas em rela\u00e7\u00e3o a este aspecto apenas o tempo me dar\u00e1 uma resposta satisfat\u00f3ria. Entretanto, se o tempo mostrar que ainda h\u00e1 g\u00e1s nesta comunidade, sem sombra de d\u00favidas que o incluirei em nosso radar.<\/p>\n<p>Visto que t\u00e3o pouco se escreve a respeito do Tapestry ultimamente, creio que no m\u00ednimo estes meus posts servir\u00e3o para atrair interessados a seu respeito. Mesmo que voc\u00ea jamais o use, as ideias que ele tr\u00e1s j\u00e1 valem \u00e0 pena conhecer.<\/p>\n<h2>Mais fontes sobre Tapestry<\/h2>\n<p>Talvez voc\u00ea tenha se interessado pelo framework. A documenta\u00e7\u00e3o oficial apesar de boa n\u00e3o \u00e9 suficiente. Sendo assim, seguem alguns links que est\u00e3o me ajudando no aprendizado:<\/p>\n<p><a href=\"http:\/\/jumpstart.doublenegative.com.au\/jumpstart\/\">Tapestry Jumpstart<\/a> &#8211; quase um cookbook de Tapestry<\/p>\n<p><a href=\"https:\/\/wiki.apache.org\/tapestry\/FrontPage\">Wiki do projeto<\/a> &#8211; tem algumas informa\u00e7\u00f5es que n\u00e3o constam na documenta\u00e7\u00e3o oficial<\/p>\n<p><a href=\"https:\/\/www.tutorialspoint.com\/apache_tapestry\/apache_tapestry_tutorial.pdf\">Este tutorial da Tutorials Point<\/a> &#8211; no formato PDF, \u00e9 um complemento bem interessante para o tutorial oficial<\/p>\n<p><a href=\"http:\/\/tapestry.apache.org\/tapestry-tutorial.html\">Tutorial oficial<\/a> &#8211; apesar de estar quebrado o HTML, me ajudou bastante<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Minhas experi\u00eancias com o Apache Tapestry: um framework muito pouco falado hoje em dia mas que tem muito a dizer.<\/p>\n","protected":false},"author":1,"featured_media":2650,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[75],"tags":[76],"class_list":["post-2649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-tapestry","tag-apache-tapestry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Experimentando o Apache Tapestry - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2649\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Experimentando o Apache Tapestry - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Minhas experi\u00eancias com o Apache Tapestry: um framework muito pouco falado hoje em dia mas que tem muito a dizer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2649\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-28T09:43:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-08-28T09:44:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png\" \/>\n\t<meta property=\"og:image:width\" content=\"550\" \/>\n\t<meta property=\"og:image:height\" content=\"230\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2649\",\"name\":\"Experimentando o Apache Tapestry - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png\",\"datePublished\":\"2017-08-28T09:43:59+00:00\",\"dateModified\":\"2017-08-28T09:44:03+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2649\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png\",\"width\":550,\"height\":230},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2649#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Experimentando o Apache Tapestry\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Experimentando o Apache Tapestry - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2649","og_locale":"pt_BR","og_type":"article","og_title":"Experimentando o Apache Tapestry - \/dev\/Kico","og_description":"Minhas experi\u00eancias com o Apache Tapestry: um framework muito pouco falado hoje em dia mas que tem muito a dizer.","og_url":"https:\/\/devkico.itexto.com.br\/?p=2649","og_site_name":"\/dev\/Kico","article_published_time":"2017-08-28T09:43:59+00:00","article_modified_time":"2017-08-28T09:44:03+00:00","og_image":[{"width":550,"height":230,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png","type":"image\/png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"16 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2649","url":"https:\/\/devkico.itexto.com.br\/?p=2649","name":"Experimentando o Apache Tapestry - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png","datePublished":"2017-08-28T09:43:59+00:00","dateModified":"2017-08-28T09:44:03+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2649#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2649"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2649#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png","width":550,"height":230},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2649#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Experimentando o Apache Tapestry"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/tapestry.png","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2649"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2649"}],"version-history":[{"count":10,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2649\/revisions"}],"predecessor-version":[{"id":2666,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2649\/revisions\/2666"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/2650"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}