<?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>Fabio Brandão - Blog &#187; Java EE</title>
	<atom:link href="http://www.fnbrandao.com.br/blog/category/programacao/java-ee-programacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fnbrandao.com.br/blog</link>
	<description></description>
	<lastBuildDate>Tue, 24 Aug 2010 01:33:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>As coisas estúpidas feitas quando se trabalha com programação</title>
		<link>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/</link>
		<comments>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 13:35:04 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[erros]]></category>
		<category><![CDATA[estupidez]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=37</guid>
		<description><![CDATA[Este post foi traduzido e alterado deste link:
http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/
Observação: Não fui eu quem escreveu este post. Apenas fiz a tradução e alteração pois achei muito interessante.
As coisas estúpidas feitas quando se trabalho com programação

ORM

Estupidez
Construir um framework próprio de ORM.
Consequências
O projeto vira uma bagunça depois de 2 anos de manutenção com gambiarras para passar pelo meu framework [...]]]></description>
			<content:encoded><![CDATA[<p>Este post foi traduzido e alterado deste link:<br />
<a href="http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/" target="_blank">http://blog.cherouvim.com/the-stupidest-things-ive-done-in-my-programming-job/</a></p>
<p>Observação: Não fui eu quem escreveu este post. Apenas fiz a tradução e alteração pois achei muito interessante.</p>
<p>As coisas estúpidas feitas quando se trabalho com programação</p>
<ol>
<li><a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a>
<ul>
<li>Estupidez<br />
Construir um framework próprio de ORM.</li>
<li>Consequências<br />
O projeto vira uma bagunça depois de 2 anos de manutenção com gambiarras para passar pelo meu framework ORM desenvolvido e chamar comandos SQL&#8217;s customizados.</li>
<li>O que deveria ter sido feito?<br />
Usar <a href="https://www.hibernate.org/" target="_blank">hibernate</a>, <a href="http://ibatis.apache.org/" target="_blank">iBATIS</a>, <a href="http://cayenne.apache.org/" target="_blank">Cayenne</a> ou outros parecidos.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Entity-attribute-value_model" target="_blank">EAV</a>
<ul>
<li>Estupidez<br />
Usar uma modelagem de banco de dados do tipo Entity-Attribute-Value model.</li>
<li>Consequências<br />
Solução não escalável e impossibilidade de rodar queries úteis no banco de dados.</li>
<li>O que deveria ter sido feito?<br />
Usar uma modelagem de banco de dados normalizada.</li>
</ul>
</li>
<li>Acesso ao Banco de dados
<ul>
<li>Estupidez<br />
Sincronizar o acesso ao banco de dados com uma conexão compartilhada.</li>
<li>Consequências<br />
Escalabilidade zero. Tempos de respostas muito lentos quando mais de 10 usuários estavam utilizando a aplicação.</li>
<li>O que deveria ter sido feito?<br />
Não fazer isto e utilizar um <a href="http://en.wikipedia.org/wiki/Connection_pool" target="_blank">pool de conexões</a> como <a href="http://sourceforge.net/projects/c3p0/" target="_blank">c3p0</a> e usar uma &#8220;nova&#8221; (reutilizada) conexão retornada do pool para cada ciclo de request / response.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a>
<ul>
<li>Estupidez<br />
Evitar aprender e utilizar uma IDE.</li>
<li>Consequências<br />
Falta de habilidade de compilar, testar e fazer o deploy da aplicação rapidamente e / ou geralmente fazer qualquer coisa útil.</li>
<li>O que deveria ter sido feito?<br />
Familiarizar-me com uma IDE. Ex.: <a href="http://www.netbeans.org/" target="_blank">NetBeans</a>, <a href="http://www.eclipse.org/" target="_blank">eclipse</a>, etc.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Database_transaction" target="_blank">Transações</a>
<ul>
<li>Estupidez<br />
Não usá-las.</li>
<li>Consequências<br />
Corromper os dados da aplicação.</li>
<li>O que deveria ter sido feito?<br />
Usar transações do banco de dados. No <a href="http://www.mysql.com/" target="_blank">MySQL</a> usar <a href="http://en.wikipedia.org/wiki/Innodb" target="_blank">InnoDB</a>.</li>
</ul>
</li>
<li><a href="http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements" target="_blank">Prepared Statements</a>
<ul>
<li>Estupidez<br />
Usar Statements, concatenação de strings e escapar caracteres para montar queries &#8220;seguras&#8221;.</li>
<li>Consequências<br />
Possibilidade de <a href="http://en.wikipedia.org/wiki/Sql_injection" target="_blank">SQL Injections</a> na aplicação. É possível logar utilizando por exemplo &#8220;or 1=1;delete from users;&#8221; e alterar o estado do banco de dados de uma forma muito desagradável.</li>
<li>O que deveria ter sido feito?<br />
Usar Prepared Statements que montam e escapam corretamente as queries dependendo do driver JDBC utilizado.</li>
</ul>
</li>
<li>Lógica de Negócios
<ul>
<li>Estupidez<br />
Fazer isto nos templates (<a href="http://en.wikipedia.org/wiki/JavaServer_Pages" target="_blank">JSP</a>).</li>
<li>Consequências<br />
Aplicação de manutenção difícil.</li>
<li>O que deveria ter sido feito?<br />
Fazer isto utilizando o padrão <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank">MVC</a> com servlets ou com um Front Controller. Melhor se utilizar um framework MVC open source como <a href="http://struts.apache.org/" target="_blank">Struts</a>, <a href="http://www.springsource.org/" target="_blank">Spring MVC</a>, etc.</li>
</ul>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2009/09/as-coisas-estupidas-feitas-quando-se-trabalha-com-programacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freemarker + Sitemesh + Spring</title>
		<link>http://www.fnbrandao.com.br/blog/2009/07/freemarker-sitemesh-spring/</link>
		<comments>http://www.fnbrandao.com.br/blog/2009/07/freemarker-sitemesh-spring/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 22:00:52 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[freemarker]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sitemesh]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=34</guid>
		<description><![CDATA[Depois de muito tempo consegui fazer minha aplicação utilizando Freemarker (template engine) + Sitemesh (web page layout framework) + Spring (IOC, etc) funcionar.
Basicamente, basta configurar no web.xml o filtro do Sitemesh (com.opensymphony.sitemesh.webapp.SiteMeshFilter), a servlet do Freemarker que vem com o Sitemesh (com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet) e a servlet do Spring MVC (org.springframework.web.servlet.DispatcherServlet).
O filtro do Sitemesh é aplicado a [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de muito tempo consegui fazer minha aplicação utilizando Freemarker (template engine) + Sitemesh (web page layout framework) + Spring (IOC, etc) funcionar.</p>
<p>Basicamente, basta configurar no web.xml o filtro do Sitemesh (com.opensymphony.sitemesh.webapp.SiteMeshFilter), a servlet do Freemarker que vem com o Sitemesh (com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet) e a servlet do Spring MVC (org.springframework.web.servlet.DispatcherServlet).</p>
<p>O filtro do Sitemesh é aplicado a todas as requisições, a servlet do freemarker às urls *.ftl e a servlet do Spring às urls *.html.</p>
<p>O problema que eu tive foi que os templates do Freemarker e do Sitemesh não eram encontrados. No web.xml, um dos parâmetros iniciais da servlet do Freemarker é o diretório dos templates (TemplatePath). Configurei este parâmetro para &#8220;/WEB-INF/templates/&#8221;. E no arquivo decorators.xml configurei que os templates do Sitemesh ficavam no diretório &#8220;/decorators&#8221;. O que acontecia é que o diretório dos templates do Sitemesh deveriam ficar dentro do diretório dos templates do Freemarker. Logo a estrutura de diretórios é dessa maneira: /WEB-INF/templates/decorators.</p>
<p>Segue abaixo o link com a aplicação de exemplo desta integração:<br />
<a href="http://www.fnbrandao.com.br/blog/files/freemarker.tar.gz">http://www.fnbrandao.com.br/blog/files/freemarker.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2009/07/freemarker-sitemesh-spring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostBack no JSF</title>
		<link>http://www.fnbrandao.com.br/blog/2008/06/postback-no-jsf/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/06/postback-no-jsf/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 12:06:32 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[postback]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=7</guid>
		<description><![CDATA[Um grande problema com o JSF é que na especificação 1.1 não existe algum método para saber se a página está sendo executada no postback (quando você reenvia os dados para ela mesma). Mas existe o seguinte workaround:

package web.jsf.vh;

import java.io.IOException;
import java.util.Locale;
import java.util.Map;

import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

public class PostBackViewHandler extends ViewHandler {

  protected ViewHandler baseViewHandler;

 [...]]]></description>
			<content:encoded><![CDATA[<p>Um grande problema com o JSF é que na especificação 1.1 não existe algum método para saber se a página está sendo executada no postback (quando você reenvia os dados para ela mesma). Mas existe o seguinte workaround:</p>
<p><code>
<pre>package web.jsf.vh;

import java.io.IOException;
import java.util.Locale;
import java.util.Map;

import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

public class PostBackViewHandler extends ViewHandler {

  protected ViewHandler baseViewHandler;

  public CustomViewHandler(ViewHandler viewHandler) {
    super();
    this.baseViewHandler = viewHandler;
  }

  public Locale calculateLocale(FacesContext facesContext) {
    return baseViewHandler.calculateLocale(facesContext);
  }

  public String calculateRenderKitId(FacesContext facesContext) {
    return baseViewHandler.calculateRenderKitId(facesContext);
  }

  public UIViewRoot createView(FacesContext facesContext, String arg1) {
    setPostback(facesContext, false);
    return baseViewHandler.createView(facesContext, arg1);
  }

  public String getActionURL(FacesContext facesContext, String arg1) {
    return baseViewHandler.getActionURL(facesContext, arg1);
  }

  public String getResourceURL(FacesContext facesContext, String arg1) {
    return baseViewHandler.getResourceURL(facesContext, arg1);
  }

  public void renderView(FacesContext facesContext, UIViewRoot arg1) throws IOException, FacesException {
    baseViewHandler.renderView(facesContext, arg1);

  }

  public UIViewRoot restoreView(FacesContext facesContext, String arg1) {
    setPostback(facesContext, true);
    return baseViewHandler.restoreView(facesContext, arg1);
  }

  public void writeState(FacesContext facesContext) throws IOException {
    baseViewHandler.writeState(facesContext);
  }

  public Map getRequestScope(FacesContext facesContext) {
    return (Map)facesContext.getApplication().createValueBinding(“#{requestScope}”).getValue(facesContext);
  }

  public void setPostback(FacesContext facesContext, boolean value) {
    getRequestScope(facesContext).put(“ispostback”, new Boolean(value));
  }

}</pre>
<p></code></p>
<p>O código acima é um View Handler do JSF, agora basta registrá-lo no <i>&#8220;facesconfig.xml&#8221;</i>:</p>
<p><code>
<pre>&lt;application&gt;
   &lt;view-handler&gt;web.jsf.vh.PostBackViewHandler&lt;/view-handler&gt;
&lt;/application&gt;</pre>
<p></code></p>
<p>E para saber em sua página se é um postback:</p>
<p><code>
<pre>public boolean isPostback() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    Map requestScope = (Map)facesContext.getApplication().createValueBinding(“#{requestScope}”).getValue(facesContext);
    boolean ispostback = ((Boolean)requestScope.get(“ispostback”)).booleanValue();
    return ispostback;
}</pre>
<p></code></p>
<p>Obs.: Esse workaround só funciona se o estado da view não é salva no servidor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/06/postback-no-jsf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JSF &#8211; Duplicate componentID</title>
		<link>http://www.fnbrandao.com.br/blog/2008/05/jsf-duplicate-componentid/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/05/jsf-duplicate-componentid/#comments</comments>
		<pubDate>Fri, 23 May 2008 18:07:28 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[RichFaces]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=11</guid>
		<description><![CDATA[Utilizando o DataTable do RichFaces em uma simples página, após um reload na página sempre era retornado o seguinte erro:
Duplicate component ID '_id0:_dataTable:_id1' found in view.
Segue abaixo o código da página que causava o erro:

&#60;ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
	xmlns:rich="http://richfaces.ajax4jsf.org/rich"&#62;

	&#60;h:form binding="#{UserConsultPage.component}"&#62;
		&#60;rich:dataTable id="dataTable"
			binding="#{UserConsultPage.dataTable}" var="item"&#62;
			&#60;rich:column&#62;
				&#60;f:facet name="header"&#62;
					&#60;h:outputText value="Name" /&#62;
				&#60;/f:facet&#62;
				&#60;h:outputText value="#{item.name}" /&#62;
			&#60;/rich:column&#62;
			&#60;rich:column&#62;
				&#60;f:facet name="header"&#62;
					&#60;h:outputText value="Email" /&#62;
				&#60;/f:facet&#62;
				&#60;h:outputText value="#{item.email}" /&#62;
			&#60;/rich:column&#62;
		&#60;/rich:dataTable&#62;

		&#60;h:commandButton id="btnLoad" actionListener="#{UserConsultPage.load}" /&#62;
	&#60;/h:form&#62;

&#60;/ui:composition&#62;

A solução foi colocar [...]]]></description>
			<content:encoded><![CDATA[<p>Utilizando o DataTable do RichFaces em uma simples página, após um reload na página sempre era retornado o seguinte erro:</p>
<p><code>Duplicate component ID '_id0:_dataTable:_id1' found in view.</code></p>
<p>Segue abaixo o código da página que causava o erro:</p>
<p><code>
<pre>&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
	xmlns:rich="http://richfaces.ajax4jsf.org/rich"&gt;

	&lt;h:form binding="#{UserConsultPage.component}"&gt;
		&lt;rich:dataTable id="dataTable"
			binding="#{UserConsultPage.dataTable}" var="item"&gt;
			&lt;rich:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Name" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{item.name}" /&gt;
			&lt;/rich:column&gt;
			&lt;rich:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText value="Email" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText value="#{item.email}" /&gt;
			&lt;/rich:column&gt;
		&lt;/rich:dataTable&gt;

		&lt;h:commandButton id="btnLoad" actionListener="#{UserConsultPage.load}" /&gt;
	&lt;/h:form&gt;

&lt;/ui:composition&gt;</pre>
<p></code></p>
<p>A solução foi colocar id&#8217;s em todos os componentes <em>&#8220;outputText&#8221;</em>. Segue abaixo a página modificada:</p>
<p><code>
<pre>&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
	xmlns:rich="http://richfaces.ajax4jsf.org/rich"&gt;

	&lt;h:form binding="#{UserConsultPage.component}"&gt;
		&lt;rich:dataTable id="dataTable"
			binding="#{UserConsultPage.dataTable}" var="item"&gt;
			&lt;rich:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText <strong>id="headerNameValue"</strong> value="Name" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText <strong>id="nameValue"</strong> value="#{item.name}" /&gt;
			&lt;/rich:column&gt;
			&lt;rich:column&gt;
				&lt;f:facet name="header"&gt;
					&lt;h:outputText <strong>id="headerEmailValue"</strong> value="Email" /&gt;
				&lt;/f:facet&gt;
				&lt;h:outputText <strong>id="emailValue"</strong> value="#{item.email}" /&gt;
			&lt;/rich:column&gt;
		&lt;/rich:dataTable&gt;

		&lt;h:commandButton id="btnLoad" actionListener="#{UserConsultPage.load}" /&gt;
	&lt;/h:form&gt;

&lt;/ui:composition&gt;</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/05/jsf-duplicate-componentid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSF + Spring + JPA + Hibernate</title>
		<link>http://www.fnbrandao.com.br/blog/2008/05/jsf-spring-jpa-hibernate/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/05/jsf-spring-jpa-hibernate/#comments</comments>
		<pubDate>Thu, 22 May 2008 01:20:41 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[session closed]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=10</guid>
		<description><![CDATA[Ao tentar fazer o deploy de uma aplicação utilizando JSF, Spring e JPA (com implementação do hibernate) é recebida a seguinte exception:
javax.persistence.PersistenceException: org.hibernate.SessionException: Session is closed!
Para resolver este problema, basta apenas adicionar o seguinte filtro no &#8220;web.xml&#8221;:

&#60;filter&#62;
	&#60;filter-name&#62;Spring OpenEntityManagerInViewFilter&#60;/filter-name&#62;
	&#60;filter-class&#62;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter&#60;/filter-class&#62;
&#60;/filter&#62;

&#60;filter-mapping&#62;
	&#60;filter-name&#62;Spring OpenEntityManagerInViewFilter&#60;/filter-name&#62;
	&#60;url-pattern&#62;/*&#60;/url-pattern&#62;
&#60;/filter-mapping&#62;


]]></description>
			<content:encoded><![CDATA[<p>Ao tentar fazer o deploy de uma aplicação utilizando JSF, Spring e JPA (com implementação do hibernate) é recebida a seguinte exception:</p>
<p><code>javax.persistence.PersistenceException: org.hibernate.SessionException: Session is closed!</code></p>
<p>Para resolver este problema, basta apenas adicionar o seguinte filtro no <em>&#8220;web.xml&#8221;</em>:<br />
<code>
<pre>&lt;filter&gt;
	&lt;filter-name&gt;Spring OpenEntityManagerInViewFilter&lt;/filter-name&gt;
	&lt;filter-class&gt;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
	&lt;filter-name&gt;Spring OpenEntityManagerInViewFilter&lt;/filter-name&gt;
	&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/05/jsf-spring-jpa-hibernate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debug no Tomcat 5.5</title>
		<link>http://www.fnbrandao.com.br/blog/2008/05/debug-no-tomcat-55/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/05/debug-no-tomcat-55/#comments</comments>
		<pubDate>Thu, 15 May 2008 00:25:45 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=9</guid>
		<description><![CDATA[Para rodar um debug remoto no tomcat 5.5 no Ubuntu, basta editar o arquivo &#8220;/etc/init.d/tomcat5.5&#8243; e colocar a seguinte linha:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

antes das linhas:

# Define other required variables
CATALINA_PID="/var/run/$NAME.pid"
BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap
JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar"

]]></description>
			<content:encoded><![CDATA[<p>Para rodar um debug remoto no tomcat 5.5 no Ubuntu, basta editar o arquivo <em>&#8220;/etc/init.d/tomcat5.5&#8243;</em> e colocar a seguinte linha:</p>
<p><code><br />
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n<br />
</code></p>
<p>antes das linhas:</p>
<p><code><br />
# Define other required variables<br />
CATALINA_PID="/var/run/$NAME.pid"<br />
BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap<br />
JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar"<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/05/debug-no-tomcat-55/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problema no botão back do navegador</title>
		<link>http://www.fnbrandao.com.br/blog/2008/05/problema-no-botao-back-do-navegador/</link>
		<comments>http://www.fnbrandao.com.br/blog/2008/05/problema-no-botao-back-do-navegador/#comments</comments>
		<pubDate>Tue, 13 May 2008 12:46:16 +0000</pubDate>
		<dc:creator>fabio</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Back Button]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Filtro]]></category>
		<category><![CDATA[JEE]]></category>

		<guid isPermaLink="false">http://www.fnbrandao.com.br/blog/?p=8</guid>
		<description><![CDATA[O botão back do navegador é muito útil ao usuário para ele conseguir navegar entre diferentes páginas e websites. Entretanto, o botão back pode trazer diversos problemas aos sites. Uma maneira de &#8220;travar&#8221; o botão é desabilitar completamente o cache das páginas que não devem permitir que sejam acessadas através do botão back.
Para se fazer [...]]]></description>
			<content:encoded><![CDATA[<p>O botão back do navegador é muito útil ao usuário para ele conseguir navegar entre diferentes páginas e websites. Entretanto, o botão back pode trazer diversos problemas aos sites. Uma maneira de <em>&#8220;travar&#8221;</em> o botão é desabilitar completamente o cache das páginas que não devem permitir que sejam acessadas através do botão back.<br />
Para se fazer isso no Java EE basta apenas criar um filtro e mapeá-lo para as url&#8217;s necessárias.<br />
Segue abaixo o código do filtro:</p>
<p><code>
<pre>
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class ClearCacheFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        httpResponse.setHeader("Expires", "Sat, 1 Jan 1990 12:00:00 GMT");
        httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        httpResponse.addHeader("Cache-Control", "post-check=0, pre-check=0");
        httpResponse.setHeader("Pragma", "no-cache");

        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

}
</pre>
<p></code></p>
<p>Basicamente o que o filtro faz é setar as diretivas de cache para o navegador. Primeiro ele seta a data de expiração da página para uma data passada. Depois, o código seta 3 diretivas para desabilitar o cache:</p>
<ul>
<li><strong>no-store:</strong> não armazena o conteúdo no cache</li>
<li><strong>no-cache:</strong> o browser deve enviar o request para o servidor mesmo se ele possuir uma cópia do que será enviado</li>
<li><strong>must-revalidate:</strong> revalida o cache em outro request, se estiver expirado</li>
</ul>
<p>Depois, são setadas duas diretivas específicas do Internet Explorer. Estas diretivas indicam que o conteúdo sempre deve ser atualizado. E por último, é desabilitado o cache para o protocolo HTTP/1.0 (já que as outras 3 são específicas do HTTP/1.1).</p>
<p>Por último é preciso configurar o filtro na aplicação web. Segue abaixo o trecho de código referente à configuração para o filtro, bem como para ele ser aplicado a todas as páginas da aplicação:<br />
<code>
<pre>
&lt;filter&gt;
	&lt;filter-name&gt;ClearCacheFilter&lt;/filter-name&gt;
	&lt;filter-class&gt;br.com.uol.ps.common.web.ClearCacheFilter&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
	&lt;filter-name&gt;ClearCacheFilter&lt;/filter-name&gt;
	&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fnbrandao.com.br/blog/2008/05/problema-no-botao-back-do-navegador/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
