<?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>Refatorando Padrões &#187; Java</title>
	<atom:link href="http://www.refatorandopadroes.com.br/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.refatorandopadroes.com.br</link>
	<description>Programação orientada às melhores práticas</description>
	<lastBuildDate>Mon, 03 Sep 2007 12:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sem reinventar a roda, cache de páginas com EhCache e ServletFilter</title>
		<link>http://www.refatorandopadroes.com.br/2007/05/03/sem-reinventar-a-roda-cache-de-paginas-com-ehcache-e-servletfilter/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/05/03/sem-reinventar-a-roda-cache-de-paginas-com-ehcache-e-servletfilter/#comments</comments>
		<pubDate>Thu, 03 May 2007 16:01:48 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Cache]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=18</guid>
		<description><![CDATA[Não faz muito tempo, surgiu a necessidade de aumentar o desempenho de uma aplicação JEE, e começamos a ver profile daqui, examina relatórios dali, nisso um amigo de projeto, que a pouco tempo havia se enturmado com Rails, teve uma idéia: "Por que não fazemos cache das páginas mais frequentes, podemos criar um pequeno framework, [...]]]></description>
			<content:encoded><![CDATA[<p>Não faz muito tempo, surgiu a necessidade de aumentar o desempenho de uma aplicação JEE, e começamos a ver profile daqui, examina relatórios dali, nisso um amigo de projeto, que a pouco tempo havia se enturmado com Rails, teve uma idéia: "Por que não fazemos cache das páginas mais frequentes, podemos criar um pequeno framework, e fazer como o Rails faz", explicando... em Rails basta colocar no controller as páginas que você deseja que sejam "cacheadas". Ex:</p>
<div class="igBar"><span id="lruby-6"><a href="#" onclick="javascript:showPlainTxt('ruby-6'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-6">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">caches_page :noticias </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Pronto, a primeira chamada à action "noticias" cria o cache, e será usada pelas chamadas subsequentes. Para expirar o cache basta chamar:</p>
<div class="igBar"><span id="lruby-7"><a href="#" onclick="javascript:showPlainTxt('ruby-7'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-7">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">expire_page<span style="color:#006600; font-weight:bold;">&#40;</span>:controller =&gt; 'public', :action =&gt; 'noticias'<span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Mais detalhes e excelente tutorial no <a href="http://www.railsenvy.com/2007/2/28/rails-caching-tutorial">Rails Envy</a>.</p>
<p>Eu gosto muito de criar coisas novas, mas como dito no <a rel="nofollow" href="http://www.refatorandopadroes.com.br/2007/04/25/getting-real-o-principio-kiss-aplicado-em-metodologia/">último post</a>, criar mais um mini-framework para dar manutenção em uma aplicação já não muito pequena... bem, não obrigado. Foi por isso que eu disse: "Cara, dá uma pesquisada, com certeza alguém já fez isso." E pra variar, sim alguém já fez isso.</p>
<p>O excelente e bem conhecido <a href="http://ehcache.sourceforge.net/">EhCache</a> possui <a href="http://ehcache.sourceforge.net/EhcacheUserGuide.html#id.s19.5.4">esta funcionalidade</a> e muitas outras.</p>
<p>Este mini tutorial parte do pressuposto que já se tem conhecimento do EhCache e de <a href="http://java.sun.com/products/servlet/Filters.html">ServletFilter</a>, para quem não conhece qualquer um dos dois, sem pânico, são muito fáceis de serem utilizados, vale uma pesquisada por tutoriais.</p>
<p>Para facilitar a vida, podem baixar este <a href='http://www.refatorandopadroes.com.br/wp-content/uploads/2007/05/cache.zip' title='Aplicação exemplo com EhCache'>anexo com a aplicação-exemplo</a> que fiz, basta colocá-lo em seu container web predileto, no meu caso testei no <a href="http://tomcat.apache.org/">Tomcat</a>, e acessar as URLs de teste:</p>
<p>http://localhost:8080/cache/semcache/teste.jsp</p>
<p>http://localhost:8080/cache/comcache/teste.jsp</p>
<p>O exemplo, mostra a hora atual em milesegundos. A página com cache, após acessada, terá 10 seg de vida.</p>
<p>Para implementar bastou os seguintes passos:</p>
<p>- <a href="http://sourceforge.net/project/showfiles.php?group_id=93232">Baixar</a> e instalar os jars EhCache (ehcache-1.3.0-beta.jar), EhCache Constructors (ehcache-constructs-0.7.3.jar) e <a href="http://jakarta.apache.org/commons/logging/">Commons-logging</a> (dependência requerida) no diretório lib.</p>
<p>- Incluir no arquivo ehcache.xml as configurações para cache de página, as propriedades falam por si, configurem a gosto:</p>
<div class="igBar"><span id="lxml-8"><a href="#" onclick="javascript:showPlainTxt('xml-8'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-8">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;cache</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"SimplePageCachingFilter"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">maxElementsInMemory</span>=<span style="color: #ff0000;">"10000"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">maxElementsOnDisk</span>=<span style="color: #ff0000;">"1000"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">eternal</span>=<span style="color: #ff0000;">"false"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">overflowToDisk</span>=<span style="color: #ff0000;">"true"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">timeToIdleSeconds</span>=<span style="color: #ff0000;">"10"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">timeToLiveSeconds</span>=<span style="color: #ff0000;">"10"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000066;">memoryStoreEvictionPolicy</span>=<span style="color: #ff0000;">"LRU"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="font-weight: bold; color: black;">&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>- Configurar um ServletFilter no web.xml, para a implementação de filtro <a href="<a href="http://ehcache.sourceforge.net/EhcacheUserGuide.html#id.s19.5.4">SimplePageCachingFilter</a></p>
<div class="igBar"><span id="lxml-9"><a href="#" onclick="javascript:showPlainTxt('xml-9'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-9">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filter</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span>-class<span style="font-weight: bold; color: black;">&gt;</span></span>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filter</span>-class<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;init</span>-param<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;param</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span>suppressStackTraces<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/param</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;param</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span>false<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/param</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;description<span style="font-weight: bold; color: black;">&gt;</span></span></span>Whether to suppress stack traces in the filter<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/description<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/init</span>-param<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filter<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>- Indicar para quais páginas fazer cache a partir do ServletFilter definido acima, dentro do web.xml. No exemplo, tudo que estiver abaixo do diretório "comcache".</p>
<div class="igBar"><span id="lxml-10"><a href="#" onclick="javascript:showPlainTxt('xml-10'); return false;">Trocar para texto plano</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-10">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span>SimplePageCachingFilter<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filter</span>-name<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;url</span>-pattern<span style="font-weight: bold; color: black;">&gt;</span></span>/comcache/*<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/url</span>-pattern<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filter</span>-mapping<span style="font-weight: bold; color: black;">&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Pronto, é somente isso, a página será devidamente cacheada, seguindo as configurações do ehcache.xml.</p>
<p>Caso queira fazer cache de apenas uma parte da página, no caso de quem utiliza <a href="http://java.sun.com/products/jsp/syntax/1.2/syntaxref1214.html">jsp:include</a>, basta utilizar a outra implementação <a href="http://ehcache.sourceforge.net/EhcacheUserGuide.html#id.s19.5.5">PageFragmentCachingFilter</a></p>
<p>Essa pequena implementação já garantiu um bom desempenho em várias páginas e sem reinventar a roda criando um mini-framework para esta função.</p>
<p>Se alguém souber de outro meio para fazer cache de página em Java, por favor esteja a vontade para comentar, gostaria muito de conhecer outras implementações.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/05/03/sem-reinventar-a-roda-cache-de-paginas-com-ehcache-e-servletfilter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Real, o princípio K.I.S.S. aplicado em metodologia</title>
		<link>http://www.refatorandopadroes.com.br/2007/04/25/getting-real-o-principio-kiss-aplicado-em-metodologia/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/04/25/getting-real-o-principio-kiss-aplicado-em-metodologia/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 15:23:17 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Metodologias]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=16</guid>
		<description><![CDATA[Faz pouco mais de 4 meses que comecei a utilizar Rails em alguns projetos, mas Java ainda é minha linguagem do coração, e algo que me surpreendeu muito foi a filosofia por trás do Rails, ele não é um framework matador de horda de dragões, e não é pra ser mesmo, seu próprio criador David [...]]]></description>
			<content:encoded><![CDATA[<p>Faz pouco mais de 4 meses que comecei a utilizar Rails em alguns projetos, mas Java ainda é minha linguagem do coração, e algo que me surpreendeu muito foi a filosofia por trás do Rails, ele não é um framework matador de horda de dragões, e não é pra ser mesmo, seu próprio criador <a href="http://www.loudthinking.com/">David Heinemeier Hansson</a> não tem a intenção de adicionar um milhão de funcionalidades, e tem motivo pra isso, trabalha na <a href="http://www.37signals.com/">37signals</a>, prercursora da metodologia <a href="http://gettingreal.37signals.com/GR_por.php">Getting Real</a>, uma verdadeira aula de como evitar a burocracia e extrair muita produtividade, considero o livro radical em alguns pontos, mas isso é questão de opinião, e é claro adequação à realidade do seu projeto.</p>
<p>E aqui cabe a pergunta, você não está fazendo coisas demais no seu projeto ?</p>
<p>Os frameworks hoje em dia parecem querer abraçar o mundo, querem estar em todos os tipos de projetos, seus criadores prometem funcionalidades novas e/ou extravagantes a cada dia, e nessa vontade de fazê-lo crescer, vai tornando-o apenas cada vez mais "gordo", de difícil manutenção, e com isso nenhum projeto é ajudado. Sem contar a ausência de testes em muitos deles. Não quero dizer que Rails é o melhor de todos, estou citando apenas a filosofia por trás dele, há outros frameworks ótimos no mercado, tudo depende de pensar no que essencialmente o projeto precisa e com isso encontrar o framework correto.</p>
<p>Uma resposta para a enorme "gordura" de alguns frameworks é sempre: "Seu projeto tende a crescer, você vai precisar dos demais recursos oferecidos". Sinceramente não gostaria de precisar usar tudo, não quero complexidade demais no projeto só para ganhar mais manutenção. Gosto da filosofia <a href="http://en.wikipedia.org/wiki/KISS_principle">K.I.S.S. (Keep It Simple Stupid)</a>. O que o meu cliente vai ganhar com esta funcionalidade X ? Ela é realmente é necessária ? Quanto mais simples, menos manutenção, mais tempo você tem para funcionalidades novas e simples.</p>
<p>Vocês podem pensar que isso é preguiça mas não é, recentemente houve um caso interessante, eu precisava adicionar um editor de texto na aplicação, escolhi o excelente <a href="http://www.fckeditor.net/">FckEditor</a>, ele possui ótimas funcionalidades para um editor de texto em browser, a primeira coisa que fiz foi reduzir a quantidade de botões. Apresentei ao cliente, ele usou um pouco e disse "acho que o pessoal vai estranhar um pouco a princípio, tem como melhorar o layout ?", mas o problema não era layout, observando como ele usou a ferramenta reduzi novamente a quantidade de botões para ter apenas o que ele realmente precisava e apresentei novamente. O resultado: "Puxa o layout melhorou mesmo, mais intuitivo", ele nem reparou que a quantidade de botões foi diminuída, eu apenas apresentei o que ele precisava, e nem uma linha a mais. Se o seu cliente precisa de uma funcionalidade supérflua, que ele pediu por impulso, convença-o do contrário, ou ambos sofrerão com uma funcionalidade que talvez nem seja usada, está lá apenas para formentar a entropia.</p>
<p>É como o novato que lê um livro sobre padrões de projeto e acha que deve usar todos de uma vez, é necessário pensar no básico. Keep It Simple!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/04/25/getting-real-o-principio-kiss-aplicado-em-metodologia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nem Java suporta métodos gordinhos</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 08:42:35 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[JSP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=11</guid>
		<description><![CDATA[Fato interessante ocorreu com uma amiga que estava trabalhando em um JSP enorme, bem que poderia haver menos dados a serem mostrados, mas não sou eu quem decido... enfim... lá pelas tantas, o compilador começou a reclamar de "code too large", caramba como assim ? Era inserir mais um caracter e dava erro, tirava o [...]]]></description>
			<content:encoded><![CDATA[<p>Fato interessante ocorreu com uma amiga que estava trabalhando em um JSP enorme, bem que poderia haver menos dados a serem mostrados, mas não sou eu quem decido... enfim... lá pelas tantas, o compilador começou a reclamar de "code too large", caramba como assim ? Era inserir mais um caracter e dava erro, tirava o caracter e funcionava...</p>
<p>Bom não tem jeito, Google ao resgate... minutos depois problema  encontrado e resolvido, o que ocorre é um limitação imposta pelo próprio compilador, um método em Java pode ter um tamanho máximo de 65534 bytes, portanto quando o JSP era convertido em Servlet acabava gerando esse método monstrinho gordinho, mais informações sobre este e outros limites você encontra aqui na <a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html" title="Especificação da VM" target="_blank">especificação da Virtual Machine</a>.</p>
<p>Para resolver o problema foi necessário, adivinhem ? Simmmm, REFATORAR..... basta dividir o JSP em arquivos menores que façam mais sentido e uni-los com &lt;jsp:include&gt;. Para ajudar ainda mais não se esqueça de utilizar padrões web para o HTML gerado, mais tableless, o código fica muito mais enxuto, e quando possível, pense bem antes de criar uma tela com tantos dados, para uma melhor usabilidade.</p>
<p>Claro que, embora seja uma limitação imposta pelo compilador, NUNCA crie um método tão grande, isso vale para qualquer linguagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/25/nem-java-suporta-metodos-gordinhos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classloader: como utilizar</title>
		<link>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/</link>
		<comments>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/#comments</comments>
		<pubDate>Sat, 17 Feb 2007 01:46:44 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Boa prática]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.refatorandopadroes.com.br/?p=10</guid>
		<description><![CDATA[É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa... recentemente, em uma empresa onde presto serviços em Java, tivemos um problema com o DWR (tenho enorme paixão por este componente, o modo como fizeram a ponte entre Java e Javascript chega a ser mágico, é o [...]]]></description>
			<content:encoded><![CDATA[<p>É incrível como aprendemos algo novo todo dia, mesma que a lição venha de forma lenta e dolorosa... recentemente, em uma empresa onde presto serviços em Java, tivemos um problema com o <a href="http://getahead.ltd.uk/dwr" title="Componente AJAX" target="_blank">DWR</a> (tenho enorme paixão por este componente, o modo como fizeram a ponte entre Java e Javascript chega a ser mágico, é o estado da arte em uso de Javascript, mas isso fica pra outro 'post'... =D)</p>
<p>Pois bem, o problema foi ocasionado durante testes de migração pra o JBoss 4.x, a inicialização do DWR  estava falhando, não conseguia de forma alguma encontrar as classes informadas em seu arquivo de configuração xml, o famigerado <a href="http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html" title="Exception classe não encontrada" target="_blank">NoClassDefFoundError</a>, algo que não apresentava problemas no JBoss 3.x. Após olhar em empacotamento, meta-infs, jars, configurações do JBoss, nada, nenhuma pista, nem o Google ajudou. O jeito foi descer mais fundo, ler o código fonte do DWR. A linha onde o erro ocorre, executa apenas um carregamento de classe:</p>
<p>this.classDefinition = Class.forName(className) ;</p>
<p>A classe é guardada para que possa ser instanciada por reflexão posteriormente, o interessante é que tudo isso ocorre na inicialização do JBoss, depois que a aplicação levanta, tentamos via debugger, executar o mesmo comando e voilá... funcionava perfeitamente... o que raios estava acontecendo ? Não sabíamos....</p>
<p>Bom, não teve jeito, a classe do DWR  teve de ser alterada para testar outra possibilidade de carregamento. Com isso trocamos a linha para:</p>
<p>this.classDefinition = Thread.currentThread().getContextClassLoader().loadClass(className);</p>
<p>Linha monstruosa.... mas funcionou!</p>
<p>Boa prática aprendida: o Class.forName() não sobe na hierarquia de ClassLoader, fica apenas no ClassLoader local, enquanto o ClassLoader.loadClass() sim, ou seja, por questão de robustez e boa prática, sempre utilize a segunda forma, para não ficar com cara de "ué", quando este tipo de problema surgir.</p>
<p>Mas por que no JBoss 3.x funcionava e no 4.x não ? A resposta é que o ClassLoader o 4.x foi reescrito para ficar mais aderente as especificações, com isso o Class.forName() pegou todo mundo desprevinido, houve claras reclamações da comunidade, mas temos que viver com isso..., existem práticas a serem seguidas.</p>
<p>Ainda bem que não tivemos que usar o código alterado do DWR, estávamos na versão 1.1.3, por curiosidade, baixei a versão estável mais recente (1.1.4) e pra minha grata surpresa essa linha já havia sido alterada do mesmo modo que fizemos <img src='http://www.refatorandopadroes.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , só fiquei chateado por essa alteração não estar presente no release notes, teria me economizado tempo durante busca por pistas...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.refatorandopadroes.com.br/2007/02/16/classloader-como-utilizar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
