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

<channel>
	<title>Rafael Ponte</title>
	<atom:link href="http://www.rponte.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rponte.com.br</link>
	<description>"TEAM = Together Everyone Achieves More"</description>
	<pubDate>Fri, 26 Sep 2008 02:28:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Desenvolvedores não pensam, desenvolvedores seguem casos de uso</title>
		<link>http://www.rponte.com.br/2008/09/23/desenvolvedores-nao-pensam-desenvolvedores-seguem-casos-de-uso/</link>
		<comments>http://www.rponte.com.br/2008/09/23/desenvolvedores-nao-pensam-desenvolvedores-seguem-casos-de-uso/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 05:19:08 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento de Software]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

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

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

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

		<category><![CDATA[code.monkey]]></category>

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

		<category><![CDATA[digitador.de.luxo]]></category>

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/09/23/desenvolvedores-nao-pensam-desenvolvedores-seguem-casos-de-uso/</guid>
		<description><![CDATA[Há algum tempo atrás eu participei de um projeto que se encontrava dentro de um processo absolutamente waterfall, para falar a verdade, a maioria dos softwares desenvolvidos aqui no mercado local seguem o processo em cascata, em sua grande maioria, através de fábricas de software. Bem, durante um certo dia na fase de codificação eu [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo atrás eu participei de um projeto que se encontrava dentro de um processo absolutamente <a href="http://en.wikipedia.org/wiki/Waterfall_model">waterfall</a>, para falar a verdade, a maioria dos softwares desenvolvidos aqui no mercado local seguem o processo em cascata, em sua <a href="http://gc.blog.br/2007/06/08/como-produzir-software-coxa/">grande maioria</a>, através de <a href="http://tardivo.wordpress.com/2008/01/16/fabricas-de-software/">fábricas de software</a>. Bem, durante um certo dia na fase de codificação eu acabei tendo uma dúvida num <a href="http://pt.wikipedia.org/wiki/Casos_de_Uso">caso de uso</a> que me foi entregue, para ser mais exato a dúvida era em relação ao negócio da aplicação, ótimo, mesmo dentro de um processo em cascata ainda assim o <a href="http://blog.fragmental.com.br/2008/01/15/quando-eu-crescer-quero-ser-analista-de-sistemas/">analista de sistemas</a> (negócios?) estava próximo da equipe de desenvolvedores, fui até ele conversar sobre o que não havia entendido no caso de uso, e ao debater com ele sobre o problema que não estava claro <strong>-pelo simples fato de não haver uma <a href="http://domaindrivendesign.org/discussion/messageboardarchive/UbiquitousLanguage.html">linguagem comum</a> entre a equipe-</strong> eu ouço da boca do analista o seguinte comentário:</p>
<blockquote><p>Para que tu quer entender isso? <strong>Desenvolvedores não pensam, desenvolvedores seguem casos de uso</strong>. Programadores só deveriam pegar o caso de uso, ler e seguir o que ele diz, nada mais. Não há porquê entender as regras de negócio, o caso de uso tem tudo que se precisa saber. Blah blah blah..</p></blockquote>
<p>Wow! Depois de ouvir isso eu me calei por alguns segundos e pensei comigo mesmo, <em>&#8220;Será que ele tem noção do que acabara de me dizer?&#8221;</em>, e o pior é que este analista disse isso com uma certa arrogância, na frente de outros analistas (que calados pareciam concordar), logo começamos a discutir, eu tentando dizer que não havia fundamentos no comentário dele e que eu não entendia como ele acreditava naquilo.. depois de alguns minutos eu resolvi encerrar a discussão para evitar constrangimentos para ambos (pois estávamos no cliente).</p>
<p>Parece brincadeira, mas aquilo aconteceu mesmo (eu deveria estar realmente surpreso?!). Pergunto-me como em pleno ano da graça de 2008 um analista com anos de experiência em diversos projetos, formado em uma das melhores universidades do estado, e com certeza com mais alguns (ou até vários) diplomas e certificados debaixo do braço <strong>consegue verbalizar tamanha asneira</strong>. Mais incrível ainda é como um analista desses consegue acreditar tão fervorosamente que está certo, como ele consegue acreditar que um desenvolvedor é apenas mais um <a href="http://en.wikipedia.org/wiki/Code_monkey">recurso comum para um trabalho manual</a>, e facilmente substituível dentro da famigerada <a href="http://thiagoarrais.wordpress.com/2007/07/25/fabricas-de-software-uma-analogia-levada-longe-demais/">fábrica de software</a> que ele tanto venera, alias, qual é a dificuldade em compreender que um programador não é um <em>&#8220;digitador de luxo&#8221;</em>? Será que depois de tanto tempo de profissão ele ainda não entendeu que desenvolver software é <strong>essencialmente um ato de criação</strong>? É, parece que não.</p>
<p>Um desenvolvedor mais do que ninguém deve entender sobre o negócio do cliente, um desenvolvedor deve estar mergulhado no negócio na qual pretende desenvolver o software ou parte dele, de fato, como será que este analista imagina que um desenvolvedor pode implementar algo minimamente decente sem entender o problema? Através da ajuda de alguma entidade sobrenatural?</p>
<p>No fundo, acho que ouvir isso de qualquer profissional no ramo de desenvolvimento de software é um absurdo, e para mim está óbvio que esta pessoa precisa urgentemente voltar a estudar sobre o assunto (pois ela parou de estudar há muito tempo, 10 anos talvez), e claro, mais do nunca ela precisa de uma &#8220;reciclagem&#8221;.</p>
<p>Engraçado é que este fato me fez lembrar de um acontecimento um tanto quanto <span style="text-decoration: line-through;">embaraçoso</span> interessante que ocorreu no inicio da minha carreira como desenvolvedor, há mais de 3 anos, eu possuía menos que um ano de experiência na época, e havia enviado o currículo a uma empresa que estava ofertando uma oportunidade para desenvolvedor Java, parecia uma boa empresa, depois de enviado o currículo eu recebi uma ligação alguns dias mais tarde para uma entrevista, na época eu fiquei super excitado, e parei para rever meu currículo cuidadosamente, ao reler o currículo vi que não sabia exatamente sobre o que se tratava 2 (dois) projetos na qual havia participado na primeira empresa que trabalhei, eu tinha uma vaga e distante idéia do que havia desenvolvido (em termos do negócio do cliente), mas ainda assim eu não conseguiria explicar a alguém (principalmente a quem fosse me entrevistar) sobre a finalidade dos projetos.</p>
<p>Então durante a semana, eu -na minha mais pura ingenuidade- enviei um e-mail ao meu antigo chefe (que além de ser um empresário, ele também era um talentoso desenvolvedor e amigo) pedindo informações sobre o que se tratavam os projetos que eu havia participado. A resposta dele não foi bem a que eu esperava [<em>rs</em>], porém me abriu os olhos na época. Alguns trechos do e-mail seguem abaixo:</p>
<p>De:<strong>rponte@gmail.com</strong> Para:<strong>boss</strong></p>
<blockquote><p>Fala amegão,</p>
<p>[...] Seguinte, tu pode me passar um resumo pequeno mesmo, porém decente das aplicações que eu participei ai na empresa para que eu possa colocar no currículo, pode? :))) [...]<br />
De ante mão eu te agradeço, abraços.</p></blockquote>
<p>De:<strong>boss </strong>Para:<strong>rponte@gmail.com</strong></p>
<blockquote><p>Você não sabe pra que serviam os projetos que participou? rs Então não vale a pena colocar no currículo né? Você coloca que nesses projetos só fez programação pura.</p></blockquote>
<p>Depois desse e-mail eu fiquei realmente envergonhado, vi que por mais que gostasse de desenvolver software eu não me interessava pelo negócio do cliente, eu não me interessava em entender e aprender sobre ele, o que sempre me interessava eram as tecnologias e os frameworks mais &#8220;<a href="http://pt.wikipedia.org/wiki/Hype">hypes</a>&#8221; do mercado. Entendendo como funcionava o mais novo framework da época já valia a pena estar desenvolvendo algo.</p>
<p>A partir dai, eu resolvi mudar isso, foi um processo lento mas contínuo, graças a certos <a href="http://www.milfont.org/tech/">amigos</a>, blogs (<a href="http://blog.fragmental.com.br/">Shoes</a>, <a href="http://gc.blog.br/">Guilherme</a> etc), discussões em <a href="http://www.cejug.org/">listas</a> e <a href="http://www.guj.com.br/">fóruns</a>, e muitas linhas de código mal implementadas (claro, como eu poderia implementar algo decente sem entender o problema?) eu procurei compreender sobre o problema do cliente e como <a href="http://en.wikipedia.org/wiki/Domain-driven_design">expressa-lo em código</a>, eu procurei ler sobre <a href="http://en.wikipedia.org/wiki/Agile_software_development">metodologias agéis</a>, abordagens e <a href="http://en.wikipedia.org/wiki/Test-driven_development">boas práticas</a> de design de software, maneiras de melhorar a <a href="http://domaindrivendesign.org/discussion/messageboardarchive/UbiquitousLanguage.html">comunicação</a> entre os membros da equipe e várias outras coisas que me ajudaram e me ajudam até hoje.</p>
<p>Depois de tudo que eu estudei e procurei aprender eu ainda tenho que ouvir de um analista que eu não preciso entender sobre o negócio do cliente? Ah, por favor, eu não sou um <em>&#8220;programador&#8221;</em> que não pensa e simplesmente segue algumas folhas de papel com vários diagramas <a href="http://blog.fragmental.com.br/2008/07/25/uh-eme-ele/">UML</a> e fluxos alternativos escritos por analistas de sistemas, eu <strong>-como desenvolvedor-</strong> devo estar tão próximo do negócio quanto for necessário, mas isso é bem complicado quando trabalhamos num modelo em cascata em que a comunicação entre os membros da equipe ocorre através da troca de documentos e diagramas, e pior, quando trabalhamos com &#8220;profissionais&#8221; que acreditam que isso funciona.</p>
<p>Enfim, já basta os softwares <a href="http://www.fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs">bolovos</a> e sem testes que temos que manter, já basta os processos burocráticos que temos que participar, já basta estarmos rodeados de fábricas de software e <a href="http://en.wikipedia.org/wiki/Code_monkey">code-monkeys</a> preguiçosos, já basta a desvalorização e os péssimos salários pagos aos desenvolvedores, e agora me vêm com <a href="http://blog.fragmental.com.br/2008/08/09/analista-pedreiro/">analistas de sistemas retrógrados</a> (oops!, pareço redundante) ? Por favor, me perdoem, mas as vezes acho que o mercado local está caminhando para trás quando se fala em desenvolvimento de software, mesmo conhecendo <a href="http://www.ivia.com.br/">algumas</a> <a href="http://www.fortesinformatica.com.br/">poucas</a> <a href="http://www.triadworks.com.br/">empresas</a>, <a href="http://www.cejug.org/">grupos</a> e <a href="http://www.rafaelcarneiro.org/">bons</a> <a href="http://www.milfont.org/tech/">profissionais</a> <a href="http://www.handersonfrota.com.br/">dispostos</a> a mudarem isso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/09/23/desenvolvedores-nao-pensam-desenvolvedores-seguem-casos-de-uso/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Entity Converters pra dar e vender</title>
		<link>http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/</link>
		<comments>http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 18:16:46 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[entity converter]]></category>

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

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

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

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

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

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/</guid>
		<description><![CDATA[Uma coisa que sempre aconselho aos desenvolvedores é que tentem sempre que possível trabalhar em JSF diretamente com os objetos como se estivessem em um ambiente stateful, pois um dos objetivos da tecnologia é tentar abstrair a natureza stateless do HTTP. Não que seja algo tão simples de se fazer algumas vezes, mas não é [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa que sempre aconselho aos desenvolvedores é que tentem sempre que possível trabalhar em JSF diretamente com os objetos como se estivessem em um ambiente stateful, pois um dos objetivos da tecnologia é tentar abstrair a natureza stateless do <a href="http://pt.wikipedia.org/wiki/HTTP">HTTP</a>. Não que seja algo tão simples de se fazer algumas vezes, mas não é tão complexo ao ponto de abrir mão desta abstração.</p>
<p>Pensando no que eu disse acima, um dos problemas comuns e chatinhos quando se trabalha com SelectOneMenu (ou SelectManyMenu) e entidades em JSF ocorre quando queremos que o value do nosso SelectItem seja a própria entidade, e não o &#8220;id&#8221; da mesma. Bem, o que estou querendo dizer é exatamente isso:</p>
<pre name="code" class="java">
public List&lt;SelectItem&gt; getEmpresas() {
	List&lt;SelectItem&gt; items = new ArrayList&lt;SelectItem&gt;();
	for (Empresa e : this.empresas) {
		// observem que o value do meu SelectItem é a própria entidade
		items.add(new SelectItem(e, e.getNome()));
	}
	return items;
}</pre>
<p>Isso acaba se tornando trabalhoso pois somos obrigados a implementar um converter para cada entidade, o que particularmente eu não gosto. Levando em consideração que não queremos criar um converter para cada entidade, quais outras soluções temos?</p>
<h4>Cenário</h4>
<p>Antes de explicar cada solução, vou demonstrar um cenário qualquer para facilitar o entendimento, ou seja, vou demonstrar os artefatos necessários, eles seguem abaixo:</p>
<p><strong>1)</strong> Nosso managed bean</p>
<pre name="code" class="java">
public class EmpresaBean {

	private Empresa selectedEmpresa;
	private List&lt;Empresa&gt; empresas = new ArrayList&lt;Empresa&gt;();

	public EmpresaBean() {
		empresas.add(new Empresa(7, "Triadworks"));
		empresas.add(new Empresa(88, "Ivia"));
		empresas.add(new Empresa(921, "Thoughtworks"));
		empresas.add(new Empresa(15, "Caelum"));
		empresas.add(new Empresa(2, "ImproveIT"));
	}

	public List&lt;Empresa&gt; getEmpresas() {
		return empresas;
	}
	public Empresa getSelectedEmpresa() {
		return selectedEmpresa;
	}
	public void setSelectedEmpresa(Empresa selectedEmpresa) {
		this.selectedEmpresa = selectedEmpresa;
		System.out.println("Empresa selecionada: " + selectedEmpresa.getNome());
	}
}</pre>
<p><strong>2)</strong> Nossa entidade (já implementando a interface <strong>BaseEntity</strong> para a solução do <strong>SimpleEntityConverter</strong>)</p>
<pre name="code" class="java">
public class Empresa implements BaseEntity, Serializable {

	private static final long serialVersionUID = 1L;

	private Integer codigo;
	private String nome;

	public Empresa(Integer codigo, String nome) {
		this.codigo = codigo;
		this.nome = nome;
	}

	public Long getId() {
		return new Long(codigo);
	}

	// Métodos getters e setters
	// Não esquecer os métodos equals e hashCode
}</pre>
<p>Por favor, não esqueçam de implementar os métodos equals e hashCode, evitemos cair naquele <a href="http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/">velho probleminha</a>, ok?</p>
<p><strong>3)</strong> Nosso formulário</p>
<pre name="code" class="xml">
&lt;h:form id="form"&gt;
	&lt;h:panelGrid columns="2" border="1"&gt;
		&lt;h:outputLabel value="Empresa" for="empresa"/&gt;
		&lt;h:column&gt;
			&lt;h:selectOneMenu id="empresa"
				value="#{empresaBean.selectedEmpresa}"
				converter="simpleEntityConverter" required="true"
				requiredMessage="Valor é obrigatório"&gt;
				&lt;f:selectItem itemValue="" itemLabel="Selecione uma empresa"/&gt;
				&lt;t:selectItems value="#{empresaBean.empresas}" var="o" itemLabel="#{o.nome}" itemValue="#{o}"/&gt;
			&lt;/h:selectOneMenu&gt;
			&lt;br/&gt;
			&lt;h:message for="empresa" errorStyle="color:darkred;font-size:11px;"&gt;&lt;/h:message&gt;
		&lt;/h:column&gt;
		&lt;f:facet name="footer"&gt;
			&lt;h:commandButton value="Submit"/&gt;
		&lt;/f:facet&gt;
	&lt;/h:panelGrid&gt;
&lt;/h:form&gt;</pre>
<p>Reparem que nosso componente <strong>h:selectOneMenu</strong> possui um converter declarado, ou seja, será necessário alterar o converter de acordo com a solução escolhida.</p>
<p>Nada de complexo, certo? É um básico cenário comum.<br />
Então vamos as possíveis soluções <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>EntityConverter</h4>
<p>O componente/feature <a href="http://wiki.apache.org/myfaces/Entity_Converters">EntityConverter</a> foi desenvolvido pelo <a href="http://faces.eti.br/">Rogério Araújo</a>, que é um dos coordenadores do <a href="http://groups.google.com/group/javasf">JavaServer Faces International Group</a>. O componente em si foi pensado inicialmente para o cenário em que é necessário carregar a entidade de um banco de dados, mas isso não impede que a entidade seja obtida de qualquer outro recurso externo, como um web service ou EJB, por exemplo.</p>
<p>O componente funciona perfeitamente bem e é muito simples de configurar, porém ainda assim eu o acho interessante somente em alguns casos específicos, como no caso em que a entidade precisa ser carregada do banco de dados com todos seus atributos e/ou relacionamentos ao submeter o formulário, evitando-se assim onerar o servidor com grandes entidades em memória.</p>
<p>Alguns desenvolvedores reclamam porque o componente -idealmente- efetua uma requisição ao bando de dados para obter a entidade, mas venhamos e convenhamos, isso não deveria ser uma preocupação, principalmente para quem vem de algum framework &#8220;action-like&#8221; como o <a href="http://struts.apache.org/">Struts</a>. Além do mais, se você possui algum recurso de cache na camada de persistência -como o fornecido pelo <a href="http://www.hibernate.org/hib_docs/reference/en/html/performance.html">Hibernate</a>- não deveria se preocupar tanto com isso.</p>
<p>Eu não pretendo explicar como configurar o componente, pois na <a href="http://wiki.apache.org/myfaces/Entity_Converters">wiki do Myfaces</a> você tem tudo que precisa saber, além do mais o criador do componente é coordenador da <a href="http://groups.google.com/group/javasf">Javasf</a> e é brasileiro <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>SimpleEntityConverter</h4>
<p>Esta solução foi baseada no caso <strong>mais comum</strong> de um converter para cada entidade, a única diferença é que tentei torna-la &#8220;genérica&#8221; para qualquer entidade, evitando-se escrever um converter para cada entidade (é esta nossa intenção, certo?).</p>
<p>Sendo, segue abaixo o código do nosso converter:</p>
<pre name="code" class="java">
public class SimpleEntityConverter implements Converter {

	public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
		if (value != null) {
			return this.getAttributesFrom(component).get(value);
		}
		return null;
	}

	public String getAsString(FacesContext ctx, UIComponent component, Object value) {

		if (value != null
				&amp;&amp; !"".equals(value)) {

			BaseEntity entity = (BaseEntity) value;

			// adiciona item como atributo do componente
			this.addAttribute(component, entity);

			Long codigo = entity.getId();
			if (codigo != null) {
				return String.valueOf(codigo);
			}
		}

		return (String) value;
	}

	protected void addAttribute(UIComponent component, BaseEntity o) {
		String key = o.getId().toString(); // codigo da empresa como chave neste caso
		this.getAttributesFrom(component).put(key, o);
	}

	protected Map&lt;String, Object&gt; getAttributesFrom(UIComponent component) {
		return component.getAttributes();
	}

}</pre>
<p>Como podem ver, o que basicamente ocorre é que armazenamos as entidades como atributos do nosso componente no método getAsString(), e recuperamos a entidade correta através da chave (neste caso o Id) associada a ela, no método getAsObject(). Mas quem é este <strong>BaseEntity</strong>?</p>
<pre name="code" class="java">
public interface BaseEntity {

	public Long getId();

}</pre>
<p>BaseEntity é uma interface com um método em comum entre as entidades, ou seja, nossas entidades precisarão implementar esta interface para que nosso converter funcione de acordo.</p>
<p>A solução é funcional, porém há algumas ressalvas que gostaria de explicitar. <strong>1)</strong> Eu particularmente não gosto da idéia de &#8220;sujar&#8221; minhas entidades estendendo alguma interface ou classe para poupar código ou resolver problemas não-funcionais, mas isso é uma opinião minha. <strong>2)</strong> Outro problema que vejo é que este converter acaba consumindo um pouco mais de memória no servidor por você está alterando o estado do componente, principalmente se sua lista de itens for muito grande, mas não é nada que você deva se preocupar inicialmente, ou seja, somente esquente a cabeça com isso se for realmente necessário.</p>
<h4>SimpleIndexConverter</h4>
<p>Esta solução eu tomei emprestada dos componentes do <a href="http://myfaces.apache.org/trinidad/index.html">Myfaces Trinidad</a>, que por sinal é excelente. A diferença é que eu a simplifiquei um pouco (o código para ser mais exato), logo ela não está tão robusta quanto a original (que se preocupa com casos mais específicos), mas funciona muito bem na maioria dos casos.</p>
<p>Sua idéia principal é utilizar o <em>index</em> da lista de items como chave para cada entidade, assim o que submetemos no formulário é o <em>index</em> da lista, e não um valor (Id?) da entidade como de costume.</p>
<p>O código do converter ficou grandinho, mas é possível enxuga-lo movendo alguns métodos para alguma classe <em>utils</em>. Segue abaixo o código do nosso <strong>SimpleIndexConverter</strong>:</p>
<pre name="code" class="java">
public class SimpleIndexConverter implements Converter {

	private int index = -1;

	/* (non-Javadoc)
	 * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
	 */
	public Object getAsObject(FacesContext ctx, UIComponent component, String value) {

		SelectItem selectedItem = this.getSelectedItemByIndex(component, Integer.parseInt(value));
		if (selectedItem != null)
			return selectedItem.getValue();

		return null;
	}

	/* (non-Javadoc)
	 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
	 */
	public String getAsString(FacesContext ctx, UIComponent component, Object value) {
		index++;
		return String.valueOf(index);
	}

	/**
	 * Obtem o SelecItem de acordo com a opção selecionada pelo usuário
	 */
	protected SelectItem getSelectedItemByIndex(UIComponent component, int index) {

		List&lt;SelectItem&gt; items = this.getSelectItems(component);
		int size = items.size();

		if (index &gt; -1
				&amp;&amp; size &gt; index) {
			return items.get(index);
		}

		return null;
	}

	protected List&lt;SelectItem&gt; getSelectItems(UIComponent component) {

		List&lt;SelectItem&gt; items = new ArrayList&lt;SelectItem&gt;();

		int childCount = component.getChildCount();
	    if (childCount == 0)
	      return items;

	    List&lt;UIComponent&gt; children = component.getChildren();
		for (UIComponent child : children) {
			if (child instanceof UISelectItem) {
				this.addSelectItem((UISelectItem) child, items);
			} else if (child instanceof UISelectItems) {
				this.addSelectItems((UISelectItems) child, items);
			}
		}

		return items;
	}

	protected void addSelectItem(UISelectItem uiItem, List&lt;SelectItem&gt; items) {

		boolean isRendered = uiItem.isRendered();
		if (!isRendered) {
			items.add(null);
			return;
		}

		Object value = uiItem.getValue();
		SelectItem item;

		if (value instanceof SelectItem) {
			item = (SelectItem) value;
		} else {
			Object itemValue = uiItem.getItemValue();
			String itemLabel = uiItem.getItemLabel();
			// JSF throws a null pointer exception for null values and labels,
			// which is a serious problem at design-time.
			item = new SelectItem(itemValue == null ? "" : itemValue,
					itemLabel == null ? "" : itemLabel, uiItem
							.getItemDescription(), uiItem.isItemDisabled());
		}

		items.add(item);
	}

	@SuppressWarnings("unchecked")
	protected void addSelectItems(UISelectItems uiItems, List&lt;SelectItem&gt; items) {

		boolean isRendered = uiItems.isRendered();
		if (!isRendered) {
			items.add(null);
			return;
		}

		Object value = uiItems.getValue();
		if (value instanceof SelectItem) {
			items.add((SelectItem) value);
		} else if (value instanceof Object[]) {
			Object[] array = (Object[]) value;
			for (int i = 0; i &lt; array.length; i++) {
				// TODO test - this section is untested
				if (array[i] instanceof SelectItemGroup) {
					resolveAndAddItems((SelectItemGroup) array[i], items);
				} else {
					items.add((SelectItem) array[i]);
				}
			}
		} else if (value instanceof Collection) {
			Iterator&lt;SelectItem&gt; iter = ((Collection&lt;SelectItem&gt;) value)
					.iterator();
			SelectItem item;
			while (iter.hasNext()) {
				item = iter.next();
				if (item instanceof SelectItemGroup) {
					resolveAndAddItems((SelectItemGroup) item, items);
				} else {
					items.add(item);
				}
			}
		} else if (value instanceof Map) {
			for (Map.Entry&lt;Object, Object&gt; entry : ((Map&lt;Object, Object&gt;) value).entrySet()) {
				Object label = entry.getKey();
				SelectItem item = new SelectItem(entry.getValue(),
						label == null ? (String) null : label.toString());
				// TODO test - this section is untested
				if (item instanceof SelectItemGroup) {
					resolveAndAddItems((SelectItemGroup) item, items);
				} else {
					items.add(item);
				}
			}
		}
	}

	protected void resolveAndAddItems(SelectItemGroup group, List&lt;SelectItem&gt; items) {
		for (SelectItem item : group.getSelectItems()) {
			if (item instanceof SelectItemGroup) {
				resolveAndAddItems((SelectItemGroup) item, items);
			} else {
				items.add(item);
			}
		}
	}

}</pre>
<p>Não há muito a se explicar sobre o converter acima, a &#8220;mágica&#8221; toda está nos métodos auxiliares (que por sinal maior parte do código foi retirado do Trinidad, porém enxugado para nossas necessidades).</p>
<p>Este converter diferentemente do <strong>SimpleEntityConverter</strong> não altera o estado do componente, evitando assim a utilização de mais memória, ele busca as entidades -que já existem- dentro do componente (SelectOneMenu?) como estado do mesmo.</p>
<p>Assim como os outros converters, este também possui algumas ressalvas.  O que podemos citar é <strong>1)</strong> Por ele se utilizar do <em>index</em> da lista de items talvez não seja possível trabalhar com o componente no lado cliente (javascript) se você depender dos valores (Id?) de cada item.</p>
<h4>Concluindo</h4>
<p>Dizer que não é possível simplificar a vida com JSF é mentir, a tecnologia te fornece recursos para abstrair a natureza stateless  do <a href="http://pt.wikipedia.org/wiki/HTTP">HTTP</a>, e é interessante que se aproveite destes recursos.</p>
<p>As soluções explanadas acima não são únicas, existem outras com toda certeza, eu tentei demonstrar algumas delas quando não se tem algum framework (<a href="http://seamframework.org/">Seam</a>?) ou conjunto de componentes (<a href="http://myfaces.apache.org/trinidad/index.html">Trinidad</a>?) para nos auxiliar, ou seja, quando contamos apenas com a implementação do JSF, o que -acredito eu- na maioria dos casos é o que ocorre.</p>
<p>É possível estende-las e até melhora-las, você é livre para isso, e dependendo da tua necessidade provavelmente será o melhor caminho, só não deixe de contribuir com o código para a comunidade.</p>
<p>Enfim, todas as soluções são plausíveis e funcionam para a maioria dos cenários, porém em determinados cenários cada uma se adequa melhor, resta a você analisar e ver qual se encaixa nas tuas necessidades. Além do mais, <strong>elas não são mutuamente excludentes</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Repitam comigo: Redirect não é forward</title>
		<link>http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/</link>
		<comments>http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 19:12:56 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[JEE]]></category>

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

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

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

		<category><![CDATA[faces-config.xml]]></category>

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

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

		<category><![CDATA[JavaServer Faces]]></category>

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

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

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

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

		<category><![CDATA[post-redirect-get]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/</guid>
		<description><![CDATA[É engraçado o número de desenvolvedores que se utilizam da tag de navegação &#60;redirect/&#62; quando configuram suas regras de navegação no faces-config.xml sem entender o porquê de sua finalidade, na maioria das vezes a única coisa que eles tem conhecimento  -e acreditam que esta é finalidade da tag-   é que ao utiliza-la [...]]]></description>
			<content:encoded><![CDATA[<p>É engraçado o número de desenvolvedores que se utilizam da tag de navegação <strong>&lt;redirect/&gt;</strong> quando configuram suas regras de navegação no <strong>faces-config.xml</strong> sem entender o porquê de sua finalidade, na maioria das vezes a única coisa que eles tem conhecimento  -e acreditam que esta é finalidade da tag-   é que ao utiliza-la a url na barra de endereços do browser muda.</p>
<p>Depois disso eles não entendem porque os valores não existem mais no managed bean ou porque as mensagens de erro não são mais exibidas ao usuário ou mesmo porque uma nova instância do managed bean foi criada, enfim, eles não entendem porque afinal a aplicação parou de funcionar!</p>
<p>Tentarei com este post esclarer a diferença entre um <em>redirect</em> e um <em>forward</em> e como contornar o problema acima para que novos desenvolvedores não caiam em &#8220;maus lençóis&#8221;.</p>
<h4>Redirect não é forward</h4>
<p>Um servlet (controller) pode executar tanto uma operação de um <em>redirect</em> como de um <em>forward</em> no final do processamento de uma requisição, e isso influencia como as páginas no browser serão recarregadas. É importante que um desenvolvedor entenda os fundamentos por trás de uma aplicação web, e um deles é a <a href="http://www.javapractices.com/topic/TopicAction.do?Id=181">diferença</a> entre <em>redirect</em> e um <em>forward.</em></p>
<p>Segue abaixo a diferença entre eles:</p>
<p><strong>Forward</strong></p>
<ul>
<li>É executado internamente pelo servlet (controller);</li>
<li>O browser não sabe o que está ocorrendo durante o processamento no servidor, ou seja, não sabe por quais servlets ou páginas a requisição está passando;</li>
<li>No final do processamento da requisição a url da barra de endereços do browser não muda;</li>
<li>O reload da página resultante irá executar a requisição original;</li>
</ul>
<p><strong>Redirect</strong></p>
<ul>
<li>É um processo de dois passos, ao receber uma requisição a aplicação web &#8220;pede&#8221; ao browser para acessar uma segunda url, por isso a url muda;</li>
<li>O reload de página não repetirá a requisição original, mas sim a nova url (2ª requisição);</li>
<li>É um processo muito mais lento que um <em>forward</em>, pois são necessárias duas requisições, e não uma;</li>
<li>Objetos colocados no escopo do request original <strong>são perdidos</strong> durante o segundo request;</li>
</ul>
<p>Resumindo, um <em>redirect</em> é uma nova requisição que o cliente (browser) faz a pedido da aplicação web, logo ele fica ciente sobre como está ocorrendo a navegação e para onde ele está sendo redirecionado, enquanto um <em>forward</em> pode executar várias requisições no lado servidor sem o conhecimento do cliente e no final retornar uma página qualquer. Atentem também que <strong>um <em>forward</em> mantém os atributos e parâmetros do request original, já um redirect não</strong>.</p>
<p>Como podem ver, de maneira sútil eles fazem a mesma coisa, mas são bem diferentes.</p>
<h4>O problema</h4>
<p>Vamos observar um caso clássico abaixo:</p>
<p>Imagine que temos um managed bean configurado em  escopo de request e que temos uma regra de navegação no nosso <strong>faces-config.xml </strong>na qual explicitamos o uso de <em>redirect</em> através da tag <strong>&lt;redirect/&gt;</strong>:</p>
<pre name="code" class="xml">
&lt;navigation-rule&gt;
	&lt;from-view-id&gt;/pages/pageX.jsp&lt;/from-view-id&gt;
	&lt;navigation-case&gt;
		&lt;from-outcome&gt;nova_pagina_com_redirect&lt;/from-outcome&gt;
		&lt;to-view-id&gt;/pages/pageY.jsp&lt;/to-view-id&gt;
		&lt;redirect /&gt;
	&lt;/navigation-case&gt;
&lt;/navigation-rule&gt;</pre>
<p>E em uma determinada página X o usuário clica em um botão que executa um método no managed bean e depois disso o usuário é enviado para uma outra página Y com uma mensagem de sucesso (ou erro) e alguns objetos populados no managed bean para serem exibidos, logo teríamos um método no managed bean semelhante a isso:</p>
<pre name="code" class="java">
public String submit() {
	// processa algo
	BacalhauService.processaRequisicao();

	// popula atributo do managed bean
	this.att1 = "A ligeira raposa marrom saltou sobre o cão preguiçoso.";

	// adiciona mensagem de sucesso
	FacesContext ctx = FacesContext.getCurrentInstance();
	ctx.addMessage(null, new FacesMessage("Operação concluída com sucesso."));

	return "nova_pagina_com_redirect";
}</pre>
<p>Imagine que quando o usuário executou a ação o processamento no método do managed bean ocorreu, a navageção para a página Y funcionou perfeitamente e a url na barra de endereços do browser mudou como previsto, mas espere um pouco!    <strike><em>&#8220;What the hell is this?&#8221;</em></strike>    A mensagem de sucesso e os dados contidos no managed bean não foram exibidos, onde elas foram parar afinal de contas?</p>
<p>No caso acima nós navegamos da página X para a página Y através de um <em>redirect</em> (lembram da tag <strong>&lt;redirect/&gt;</strong> na regra de navegação?), e já sabemos que <strong>quando há um <em>redirect</em> todos os dados no escopo de request são perdidos</strong>, logo o nosso managed bean e nossa mensagem de sucesso foram perdidos.</p>
<p>Agora que já entendemos o funcionamento do <em>redirect</em> não foi uma surpresa o managed bean ter sido perdido (reinstanciado) pois sabiamos que ele estava configurado com escopo de request, mas e a mensagem de sucesso? Bem, isso fica óbvio ao saber que <strong>as mensagens do JSF são adicionadas no escopo de request</strong>, mesmo que seu managed bean esteja noutro escopo.</p>
<h4>A solução</h4>
<p>Como resolver isso? Bem, existem algumas soluções, porém a mais simples sem dúvida é remover a tag <strong>&lt;redirect/&gt;</strong> da regra de navegação, assim a navegação entre páginas ocorrerá através de <em>forward </em>(que é o default do framework), e os dados do seu managed bean e mensagens serão exibidos ao usuário como esperado.</p>
<p>Na maioria das aplicações web um dos motivos para se utilizar um <em>redirect</em> é para evitar que no reload/refresh da página ocorra uma resubmissão do form, evitando-se assim resultados inesperados na aplicação, sendo, uma solução para isso seria a utilização do <a href="http://en.wikipedia.org/wiki/Post/Redirect/Get">Post-Redirect-Get Pattern (PRG)</a>. Uma excelente solução é a implementação do padrão PRG através deste <a href="http://balusc.blogspot.com/2007/03/post-redirect-get-pattern.html">Phase Listener</a> implementado pelo <a href="http://balusc.blogspot.com/">BalusC</a>.</p>
<p>Não tenho certeza, mas acho (quase certeza) que o <a href="http://seamframework.org/">JBoss Seam</a> já tem algo implemetado para solucionar o problema.  Se alguém puder confirmar, eu ficaria grato <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Felizmente hoje em dia as aplicações web estão caminhando para uma GUI mais rica e versátil, e ao abrir mão da &#8220;<a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/">velha escola</a>&#8221; conseguimos contornar os problemas citados acima facilmente, como também obter inúmeras outras vantagens.</p>
<h4>Concluindo</h4>
<p>Como podem ver, o problema não era do JavaServer Faces (JSF) ou mesmo de qualquer outro framework MVC, mas certamente da falta de fundamentos sobre a web. Espero sinceramente que os desenvolvedores busquem entender os fundamentos dos frameworks, padrões e da web antes de desenvolver uma aplicação web, pois utilizar algo nas cegas provavelmente trará vários problemas mais cedo ou mais tarde.</p>
<p>Enfim, este é um problema decorrente na <a href="http://groups.google.com/group/javasf">lista de discussão do javasf</a>, e sempre acabamos por explicar a diferença entre as duas operações, que no final resolve-se apenas seguindo o caminho mais simples. Fico aqui e espero que este post tenha servido de ajuda a muitos desenvolvedores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JSF e Naming Container</title>
		<link>http://www.rponte.com.br/2008/07/01/jsf-e-naming-container/</link>
		<comments>http://www.rponte.com.br/2008/07/01/jsf-e-naming-container/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 14:00:29 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[JEE]]></category>

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[h:form]]></category>

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

		<category><![CDATA[JavaServer Faces]]></category>

		<category><![CDATA[JBoss Seam]]></category>

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

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

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

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

		<category><![CDATA[naming container]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/07/01/jsf-e-naming-container/</guid>
		<description><![CDATA[Todo desenvolvedor que se utiliza de JavaServer Faces deveria saber como funciona o mecanismo de geração de identificação (ID) dos componentes, pois uma hora querendo ou não ele precisará deste conhecimento, principalmente se houver a necessidade de se escrever algum código JavaScript.
Enfim, vamos ao que interessa..
Entendendo o mecanismo
Uma das caracteristicas do JSF é que todos [...]]]></description>
			<content:encoded><![CDATA[<p>Todo desenvolvedor que se utiliza de JavaServer Faces deveria saber como funciona o mecanismo de geração de identificação (ID) dos componentes, pois uma hora querendo ou não ele precisará deste conhecimento, principalmente se houver a necessidade de se escrever algum código JavaScript.</p>
<p>Enfim, vamos ao que interessa..</p>
<h4>Entendendo o mecanismo</h4>
<p>Uma das caracteristicas do JSF é que todos os seus componentes possuem um atribudo &#8220;id&#8221; e este atributo <strong>deve conter um valor único</strong>, caso não seja definido um ID pelo desenvolvedor então será gerado automaticamente um ID único para cada componente durante a construção da árvore de componentes.</p>
<p>Sendo, observem o seguinte trecho de código JSF:</p>
<pre name="code" class="xhtml">&lt;h:form&gt;
	&lt;h:inputText id="nome"/&gt;
&lt;/h:form&gt;</pre>
<p>No final será gerado para o cliente (browser) o seguinte código -ou algo parecido- (X)HTML:</p>
<pre name="code" class="xhtml">&lt;form id="j_id_jsp_1761815803_1" name="j_id_jsp_1761815803_1" method="post"&gt;
	&lt;input id="j_id_jsp_1761815803_1:nome" type="text" name="j_id_jsp_1761815803_1:nome" /&gt;
&lt;/form&gt;</pre>
<p><span class="attribute-value"></span>Reparem que o atributo &#8220;id&#8221; do componente <strong>h:form</strong> não foi definido, porém o framework gerou um ID único para o componente, no caso o ID foi &#8220;<em><strong><span class="attribute-value">j_id_jsp_1761815803_1</span></strong></em>&#8220;, que foi renderizado juntamente com a tag <strong>&lt;form/&gt;</strong> do (X)HTML.</p>
<p>Atentem também que o ID (gerado) do componente <strong>h:form</strong> foi concatenado ao ID (que nós definimos) do componente <strong>h:inputText </strong>separados por &#8216;:&#8217; (dois pontos) na tag <strong>&lt;input/&gt;</strong>, logo o ID da nossa tag <strong>&lt;input/&gt;</strong> é  &#8220;<em><strong><span class="attribute-value">j_id_jsp_1761815803_1:nome</span></strong></em>&#8220;.</p>
<p>Infelizmente os IDs gerados pelo framework não são nada legíveis para nós desenvolvedores -e provavelmente não deveriam-, então para consertar isso basta definirmos o ID de cada componente na nossa página, logo nosso código JSF ficará assim:</p>
<pre name="code" class="xhtml">&lt;h:form id="form"&gt;
    &lt;h:inputText id="nome"/&gt;
&lt;/h:form&gt;</pre>
<p>E consequentemente o código (X)HTML gerado será algo semelhante a isto:</p>
<pre name="code" class="xhtml">&lt;form id="form" name="form" method="post"&gt;
	&lt;input id="form:nome" type="text" name="form:nome" /&gt;
&lt;/form&gt;</pre>
<p>Como podem ver,  os IDs na página gerada ficam bem mais legíveis, facilitando assim o trabalho com JavaScript no lado cliente.</p>
<h4>Naming container</h4>
<p>E onde afinal de contas entra essa história de Naming Container?</p>
<p>Se vocês observaram o componente <strong>h:inputText</strong> teve seu ID concatenado ao ID do formulário no cliente, ou seja, na tag <strong>&lt;input/&gt;</strong> (X)HTML, e isso aconteceria com todos os componentes dentro do componente <strong>h:form</strong>. Logo, o componente <strong>h:form</strong> é um componente e ao mesmo tempo um naming container.</p>
<blockquote><p>Basicamente, Naming Container é uma caracteristica que alguns componentes possuem, caracteristica essa que o framework utiliza para garantir que dentro de um naming container (componente) seus componentes filhos possuam IDs  únicos, evitando assim a duplicidade de componentes com o mesmo ID na página (viewroot).</p></blockquote>
<p>Outra caracteristica importante que você deve saber sobre naming containers é que eles podem ser aninhados, logo os componentes mais internos terão seus IDs no cliente concatenados com os IDs dos naming containers mais externos também.</p>
<p>Logo em um caso como:</p>
<pre name="code" class="xhtml">&lt;h:form id="form"&gt;
    &lt;f:subview id="subview"&gt;
        &lt;h:inputText id="nome"/&gt;
    &lt;/f:subview&gt;
&lt;/h:form&gt;</pre>
<p>Teríamos o código (X)HTML abaixo gerado:</p>
<pre name="code" class="xhtml">&lt;form id="form" name="form" method="post"&gt;
	&lt;input id="form:subview:nome" type="text" name="form:subview:nome" /&gt;
&lt;/form&gt;</pre>
<p>O componente <strong>f:subview</strong> também é um naming container, porém ele não gera qualquer output no cliente, ele é utilizado basicamente para servir como naming container, principalmente quando se faz includes de páginas dinâmicas.</p>
<p>Simples até demais, não?</p>
<p>Componentes padrões como <strong>h:form</strong>, <strong>f:subview</strong> e <strong>h:dataTable</strong> são naming containers. A maioria dos conjuntos de componentes possuem alguns naming containers, logo isso depende do conjunto de componentes.</p>
<h4>Evitando naming container no formulário</h4>
<p>As vezes temos páginas simples em que o único naming container é o próprio componente <strong>h:form</strong>, e nestas páginas precisamos manipular alguns dados no formulário através de JavaScript, porém é algo realmente chato ficar concatenando IDs para obter o ID de um input do formulário.</p>
<p>Para resolver isso o componente <strong>h:form</strong> (no JSF1.2) possui o atributo &#8220;prependId&#8221; que define se o componente se comportará <strong>no cliente</strong> como naming container ou não. Para evitar que o <strong>h:form</strong> se comporte como naming container basta setarmos o atributo &#8220;prependId&#8221; para <strong>false</strong>. Assim quando o código (X)HTML for <strong>gerado para o cliente</strong> as tags internas não terão seus IDs modificados.</p>
<pre name="code" class="xhtml">&lt;h:form id="form" prependId="false"&gt;
    &lt;h:inputText id="nome"/&gt;
&lt;/h:form&gt;</pre>
<p>Sem complicações, certo?</p>
<p>Essa caracteristica funciona somente para os componentes filhos do <strong>h:form</strong>, caso haja um naming container dentro do <strong>h:form</strong> então os filhos deste name container terão seus IDs alterados normalmente no cliente.</p>
<h4>Concluindo</h4>
<p>O post ficou até longo para um assunto básico, mas acredito que consegui abordar os fundamentos sobre naming container para quem pretende apenas utilizar os componentes na construção de páginas. Para quem realmente pretende criar (ou estender) seus próprios componentes seria interessante conhecer o conceito <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/component/NamingContainer.html">mais a fundo</a>.</p>
<p>Enfim, o conceito é básico, porém fundamental para desenvolvedores que usam JavaServer Faces. Contudo é incrível como a maioria dos desenvolvedores não se interessam pelos fundamentos do framework, fundamentos estes que evitariam diversas dúvidas e problemas durante o desenvolvimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/07/01/jsf-e-naming-container/feed/</wfw:commentRss>
		</item>
		<item>
		<title>O que esperar do JSF 2.0</title>
		<link>http://www.rponte.com.br/2008/06/30/o-que-esperar-do-jsf-20/</link>
		<comments>http://www.rponte.com.br/2008/06/30/o-que-esperar-do-jsf-20/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 18:41:44 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[JEE]]></category>

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

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

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

		<category><![CDATA[JBoss Seam]]></category>

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

		<category><![CDATA[jsf2.0]]></category>

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/06/30/o-que-esperar-do-jsf-20/</guid>
		<description><![CDATA[O lançamento
Acaba de ser lançado a Reference Implementation (RI) Beta do JSF2.0. Com o nome de Mojarra, continuando com o mesmo nome da versão 1.2 da implementação da Sun,  a nova especificação está trazendo diversas melhorias e acertos em relação as versões anteriores, nesta versão realmente há muitas features interessantes e que alavancará a produtividade [...]]]></description>
			<content:encoded><![CDATA[<h4>O lançamento</h4>
<p>Acaba de ser <a href="http://www.guj.com.br/posts/list/95542.java">lançado</a> a <strong>Reference Implementation (RI) Beta</strong> do JSF2.0. Com o nome de <strong>Mojarra</strong>, continuando com o mesmo nome da versão 1.2 da implementação da Sun,  a nova especificação está trazendo diversas melhorias e acertos em relação as versões anteriores, nesta versão realmente há muitas features interessantes e que alavancará a produtividade no desenvolvimento com JavaServer Faces.</p>
<h4>As features</h4>
<p>Entre as diversas features e melhorias, existem algumas que eu gostaria de destacar:</p>
<ul>
<li>Um <strong>novo ciclo de vidas no lado cliente</strong> (browser), ou seja, agora será bem mais fácil integrar e criar componentes com frameworks e APIs javascript como ExtJS ou Yahoo API, quem sabe em breve não vejamos um <a href="http://www.rponte.com.br/2007/10/26/ext4jsf-por-onde-tu-andas/">Ext4JSF</a> por aí? Além do mais será mais rápido e prático implementar interfaces do tipo &#8220;<a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/"><span class="postbody">on a single page interface web application</span></a>&#8220;, já que todo o processamento da interface gráfica ficará no lado cliente!</li>
<li><strong>Escopos de conversação</strong>, finalmente!! Feature esta que realmente fazia (faz?) falta ao se desenvolver com JSF, atualmente somos obrigados a se utilizar de frameworks ou componentes como <a href="http://myfaces.apache.org/tomahawk/index.html">Myfaces Tomahawk</a>, <a href="http://www.seamframework.org/">JBoss Seam</a>, <a href="http://sannotations.sourceforge.net/">Spring Annotation</a> entre outros.</li>
<li>Agora teremos &#8220;<strong>Zero Configuration</strong>&#8220;, ou seja, esqueça faces-config.xml, esqueça web.xml !! Provavelmente configuraremos tudo por annotations.</li>
<li>Outra feature necessária e que também fazia uma falta em tanto é a<strong> Exception Handler</strong>, agora depois de um erro lançado poderemos encaminhar o usuário para uma página de erro.</li>
<li><strong>Annotations</strong>, e muitas annotations para declarar artefatos como managed bean, componentes, regras de navegação etc.</li>
<li>Suporte a <strong>templating</strong>, algo próximo no estilo do <a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5332">Facelets</a>.</li>
<li>Suporte a<strong> submissão com método HTTP GET</strong>, ou seja, bookmarking.</li>
<li>Agora com <strong>AJAX nativo </strong>no ciclo de vida. <span class="postbody">A incompatibilidade entre os conjuntos de componentes será absurdamente menor, já que a falta de uma especificação AJAX para JSF era um dos maiores causadores de tanta incompatibilidade!</span></li>
<li><span class="postbody">Acessar recursos JSF através de <strong>REST</strong>, wow!</span></li>
<li><span class="postbody">Agora será possível executar uma ação (método?) ao carregar uma página.</span></li>
<li><span class="postbody">Salvar e recuperar parcialmente estados da árvore de componentes (Isso vai trazer uma melhoria significativa à perfomance). </span></li>
</ul>
<p>Como podem ver, são inúmeras melhorias significativas -na minha opiniao- para esta nova versão, e provavelmente surjam outras já que a especificação está ainda em rascunho. No <a href="http://jcp.org/en/jsr/detail?id=314">site</a> da JCP há as demais features e melhorias sobre esta versão.</p>
<h4>Concluindo</h4>
<p>Uma das maiores dúvidas em relação a esta versão é a tal da <strong>retrocompatibilidade</strong>, eu particularmente acredito que a versão 2.0 do JSF será compatível com as versões anteriores (ao menos com a JSF1.2) pois há o envolvimento de Big Players na especificação e encarar as versões anteriores como legados descontinuados é algo radical demais para o mercado, porém é quase que certo que será necessário abrir mão da compatibilidade em algum ponto para aproveitar os recursos da nova versão.</p>
<p>Enfim, <a href="http://jcp.org/en/jsr/detail?id=314">JSF2.0</a> está vindo com tudo. Enquanto aguardamos a versão final já podemos brincar com a <a href="https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=9437&amp;expandFolder=9437&amp;folderID=0">versão beta do Mojarra</a> para JSF2.0.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/06/30/o-que-esperar-do-jsf-20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Volta para o Cejug Milfont !!</title>
		<link>http://www.rponte.com.br/2008/06/27/volta-para-o-cejug-milfont/</link>
		<comments>http://www.rponte.com.br/2008/06/27/volta-para-o-cejug-milfont/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 14:00:16 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/06/27/volta-para-o-cejug-milfont/</guid>
		<description><![CDATA[A campanha &#8220;Volta para o Cejug Milfont&#8221; iniciou há aproximadamente duas semanas e todos estão aderindo.  Muitos membros e principalmente amigos do Christiano Milfont estão aderindo a campanha para que ele volte a lista de discussão do Cejug.
Christiano Milfont é (foi?) um dos membros mais ativos da lista de discussão do Cejug e com toda [...]]]></description>
			<content:encoded><![CDATA[<p>A campanha <strong>&#8220;Volta para o Cejug Milfont&#8221;</strong> iniciou há aproximadamente duas semanas e todos estão aderindo.  Muitos membros e principalmente amigos do <a href="http://www.milfont.org/tech/">Christiano Milfont</a> estão aderindo a campanha para que ele volte a lista de discussão do <a href="http://www.cejug.org">Cejug</a>.</p>
<blockquote><p>Christiano Milfont é (foi?) um dos membros mais ativos da lista de discussão do Cejug e com toda certeza um dos maiores formadores de opinião ali dentro, além de ter participado de várias discussões &#8220;calorosas&#8221; sobre tecnolgias, metodologias, boas práticas, desenvolvimento e design de software ele também ministrou diversas palestras em nome do Cejug, na verdade ele é o membro que mais ministrou palestras pelo Cejug até hoje!</p></blockquote>
<p>Infelizmente depois de algumas discussões na lista do Cejug e em chat privado, o Christiano com toda sua &#8220;grande&#8221; paciência decidiu finalmente abandonar a lista de discussão do Cejug que ele tanto frequentou. Mas seus amigos e fãs estão clamando por sua volta desde o inicio da campanha.</p>
<p>A campanha ainda continua, todos continuam insistindo na sua volta ao Cejug, todos estão escrevendo no status do <a href="http://www.google.com/talk/">Google Talk</a> o texto da campanha, <strong>&#8220;Volta para o Cejug Milfont!!&#8221;</strong><em> </em>e o perturbando em chats privados para que ele volte! Enfim, está havendo uma enorme pressão psicológica sobre o Milfont!</p>
<p>Acreditamos que ele voltará, pois precisamos dos seus comentários rígidos, irônicos e as vezes sarcásticos nas discussões calorosas do Cejug! Além do mais a pressão psicológica não pára!! Volta Milfonntttt..</p>
<p>Juntem-se a campanha, alterem o status do seu Google talk, comentem aqui pedindo a sua volta, abram chats privados com ele e digam com louvor:</p>
<p><strong>&#8220;VOLTA PARA O CEJUG MILFONT !!&#8221;</strong></p>
<p><strong>[UPDATE]</strong><br />
Um dos &#8220;fiéis&#8221; da campanha, Emmanuel Catunda, acaba de criar um cartaz para que todos possam imprimir e colar nas baias de sua empresa com o intuito de forçar a volta do Milfont ao Cejug!!</p>
<p><a href="http://www.rponte.com.br/wp-content/uploads/2008/06/volta_milfont_cejug.pdf">Aqui está o cartaz!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/06/27/volta-para-o-cejug-milfont/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Não era mais uma receita de bolo JSF!</title>
		<link>http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/</link>
		<comments>http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 17:34:49 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Boas Práticas]]></category>

		<category><![CDATA[Desenvolvimento Ágil]]></category>

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

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

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

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

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

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

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

		<category><![CDATA[JBoss Seam]]></category>

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

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

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

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

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/</guid>
		<description><![CDATA[É incrível como depois do post Utilizando AJAX com JSF de maneira eficiente muitos desenvolvedores tem utilizado o exemplo básico do post -que nada mais era do que uma prova de conceito- como receita de bolo para criar aplicações sérias. Talvez eu não tenha sido claro, mas o intuito do post não era demonstrar um [...]]]></description>
			<content:encoded><![CDATA[<p>É incrível como depois do post <a href="http://www.rponte.com.br/2008/04/10/utilizando-ajax-com-jsf-de-maneira-eficiente/">Utilizando AJAX com JSF de maneira eficiente</a> muitos desenvolvedores tem utilizado o <strong>exemplo básico</strong> <strong>do post </strong>-que nada mais era do que uma prova de conceito- <strong>como</strong> <strong>receita de bolo</strong> <strong>para criar aplicações sérias</strong>. Talvez eu não tenha sido claro, mas o intuito do post não era demonstrar um passo-a-passo de como desenvolver uma aplicação com alguns conjuntos de componentes, mas sim passar o conceito de como aproveitar melhor os recursos oferecidos pela tecnologia para criar aplicações mais ricas e leves.</p>
<p>Eu tentei ao máximo deixar claro que não eram os componentes X, Y ou Z que me forneciam recursos para implementar o conceito, como está bem claro nos trechos do post abaixo:</p>
<blockquote><p>Utilizar um conjunto de componentes ricos e um framework AJAX. <em>(Neste caso eu optei pelo <a href="http://labs.jboss.com/jbossrichfaces/">Richfaces/Ajax4jsf</a> por ser bastante simples de usar e integrar, por ser estável e por ser bastante utilizado na comunidade, contudo, <strong>qualquer outro conjunto de componentes AJAX poderia ser utilizado</strong>, como <a href="http://myfaces.apache.org/trinidad/index.html">Trinidad</a> ou mesmo o <a href="http://www.icefaces.org/">IceFaces</a>)</em>;</p></blockquote>
<p>E este,</p>
<blockquote><p>Eu não me prendi a utilização dos frameworks ou conjuntos de componentes utilizados pois este não era o intuito do post, isso é algo simples e acredito que a maioria dos leitores não tenham dificuldades em relação a isso. Além do mais <strong>é possível implementar isso</strong> não somente com o <a href="http://labs.jboss.com/jbossrichfaces/">Richfaces/Ajax4jsf</a>, mas <strong>com qualquer outro framework ou conjuntos de componentes AJAX</strong>, por exemplo, [...]</p></blockquote>
<p>Não é necessário utilizar <a href="http://labs.jboss.com/jbossrichfaces/">Richfaces/Ajax4jsf</a>, <a href="http://myfaces.apache.org/tomahawk/index.html">Tomahawk</a> e <a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5332">Facelets</a> para aproveitar os recursos da tecnologia de forma eficiente, você poderá conseguir isso com qualquer outro framework ou <a href="http://www.jsfmatrix.net/">conjunto de componentes</a> que te permitam unir AJAX e JSF de maneira prática, sejam eles <a href="http://myfaces.apache.org/trinidad/index.html">Trinidad</a>, JBoss Seam, <a href="http://www.icefaces.org/">IceFaces</a>, Ajax4jsf, ADF Faces e/ou <a href="https://jsftemplating.dev.java.net/">JSFTemplating</a>.</p>
<p>Mais claro que isso é impossível.. porém ainda não acabou, um fato engraçado é que alguns desenvolvedores chegaram a se queixar de que eu fui muito radical ao dizer para desenvolverem toda uma aplicação <strong>em uma única página</strong>. Eu em nenhum momento disse ou mesmo insinuei isto, o que eu disse foi:</p>
<blockquote><p>A idéia principal tem por objetivo <strong>evitar escrever muitas páginas para representar cada view (tela),</strong> <strong>diminuindo assim o número de páginas no projeto</strong>, o número de regras de navegação no faces-config.xml, diminuindo o overhead no servidor e no cliente a cada refresh de página, [...]</p></blockquote>
<p>Vocês não precisam e provavelmente não deveriam implementar suas aplicações seguindo o exemplo do post, ele é básico, <strong>ele serve como referência</strong>, possui uma implementação simples e não se preocupa com alguns requisitos não funcionais como a <a href="http://www.urubatan.com.br/problemas-de-performance-na-sua-aplicacao-java-ela-esta-utilizando-memoria-demais-sera-que-nao-e-culpa-sua/">paginação sob demanda</a> ou quais os objetos que deveriam permanecer entre as requisições. Além do mais o exemplo é um CRUD, e não uma interface com o usuário mais complexa no sistema.</p>
<p>Entendam uma vez por todas que não existe uma <a href="http://blog.fragmental.com.br/2007/10/15/arquitetos-mcdonalds/">arquitetura de referência</a> ou <a href="http://www.rafaelcarneiro.org/blog/2008/05/23/frameworks-agindo-com-bom-senso/">receita de bolo</a> para desenvolver sistemas, cada sistema possui suas necessidades e peculiaridades, e estas devem ser estudadas e analisadas para se chegar a uma solução plausível.</p>
<p>O importante é que vocês compreendam o conceito, seus prós e contras e principalmente onde e quando utiliza-lo. Não se prendam ao framework ou conjunto de componentes, a maioria deles hoje em dia te fornecem os recursos necessários para implementar a idéia sem muitas dificuldades.</p>
<p>Enfim, estudem, entendam, aprimorem, façam testes e implementem o conceito onde for necessário, com os componentes e frameworks cabíveis e sempre com bom senso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/06/05/nao-era-mais-uma-receita-de-bolo-jsf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comentários sobre o 1º Juazeiro do Norte JavaDay</title>
		<link>http://www.rponte.com.br/2008/06/04/comentarios-sobre-o-1%c2%ba-juazeiro-do-norte-javaday/</link>
		<comments>http://www.rponte.com.br/2008/06/04/comentarios-sobre-o-1%c2%ba-juazeiro-do-norte-javaday/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 04:25:35 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Eventos]]></category>

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

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

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

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

		<category><![CDATA[adf faces]]></category>

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

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

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

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

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

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

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

		<category><![CDATA[JavaServer Faces]]></category>

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

		<category><![CDATA[juazeiro do norte]]></category>

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/06/04/comentarios-sobre-o-1%c2%ba-juazeiro-do-norte-javaday/</guid>
		<description><![CDATA[No último sábado, 31 de Maio, participei do 1º Juazeiro do Norte JavaDay, evento este que ocorreu na FJN com o apoio do CEJUG. Como eu havia comentado antes, o evento contou com 4 (quatro) palestrantes falando uma manhã inteira sobre tendências e tecnologias Java. O auditório estava lotado e o pessoal estava bem interessado [...]]]></description>
			<content:encoded><![CDATA[<p>No último sábado, 31 de Maio, participei do <strong>1º Juazeiro do Norte JavaDay</strong>, evento este que ocorreu na <a href="http://www.fjn.edu.br/">FJN</a> com o apoio do <a href="http://www.cejug.org/display/cejug/I+Juazeiro+do+Norte+JavaDay+-+%2831.05.08%29">CEJUG</a>. Como eu havia <a href="http://www.rponte.com.br/2008/05/27/1%c2%ba-juazeiro-do-norte-javaday/">comentado antes</a>, o evento contou com 4 (quatro) palestrantes falando uma manhã inteira sobre tendências e tecnologias Java. O auditório estava lotado e o pessoal estava bem interessado nas palestras.</p>
<p>Fora o evento ter sido muito bacana eu também gostei da cidade e da receptividade do povo de lá, como o Sidney, o Leonardo e o Carlos, houveram outros, porém não me recordo dos nomes, no entanto gostaria de agradecê-los pela paciência, apoio e boa vontade oferecidos durante nossa estadia em Juazeiro.</p>
<p>Algumas fotos do evento abaixo para recordar:</p>
<p><img src="http://www.cejug.org/download/attachments/27197445/DSC02644.JPG" height="436" width="583" /></p>
<p>E os slides apresentados no evento,</p>
<div style="width:425px;text-align:left" id="__ss_448208"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=jsfjuazeirojavaday-1212638535685408-9"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=jsfjuazeirojavaday-1212638535685408-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/rponte/javaserver-faces-desenvolvendo-aplicaes-web-com-produtividade?src=embed" title="View JavaServer Faces - Desenvolvendo aplicações web com produtividade on SlideShare">View</a> | <a href="http://www.slideshare.net/upload?src=embed">Upload your own</a></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/06/04/comentarios-sobre-o-1%c2%ba-juazeiro-do-norte-javaday/feed/</wfw:commentRss>
		</item>
		<item>
		<title>1º Juazeiro do Norte JavaDay</title>
		<link>http://www.rponte.com.br/2008/05/27/1%c2%ba-juazeiro-do-norte-javaday/</link>
		<comments>http://www.rponte.com.br/2008/05/27/1%c2%ba-juazeiro-do-norte-javaday/#comments</comments>
		<pubDate>Wed, 28 May 2008 05:07:45 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Eventos]]></category>

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

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

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

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

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

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

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

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

		<guid isPermaLink="false">http://www.rponte.com.br/2008/05/27/1%c2%ba-juazeiro-do-norte-javaday/</guid>
		<description><![CDATA[Próximo final de semana, dia 31 de Maio, vai ocorrer o 1º Juazeiro do Norte JavaDay, o evento ocorrerá na Faculdade de Juazeiro do Norte (FJN). O evento contará com 4 (quatro) integrantes do CEJUG, -é quase uma caravana-, ministrando palestras sobre diversos temas relacionados a tecnologia Java.
Os palestrantes e seus respectivos temas serão:
Rafael Carneiro [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://silveiraneto.net/wp-content/uploads/2008/05/1_javaday_juazeiro_do_norte.png" align="left" height="112" width="211" />Próximo final de semana, dia 31 de Maio, vai ocorrer o 1º Juazeiro do Norte JavaDay, o evento ocorrerá na <a href="http://www.fjn.edu.br/">Faculdade de Juazeiro do Norte</a> (FJN). O evento contará com 4 (quatro) integrantes do <a href="http://www.cejug.org/pages/viewpage.action?pageId=26804246">CEJUG</a>, -é quase uma caravana-, ministrando palestras sobre diversos temas relacionados a tecnologia Java.</p>
<p>Os palestrantes e seus respectivos temas serão:</p>
<p><a href="http://www.rafaelcarneiro.org/blog/2008/05/26/juazeiro-do-norte-x-2/">Rafael Carneiro</a> com o tema <strong>Certificação Java</strong>, Tarso Bessa com <strong>Utilizando o Spring framework em aplicações JEE</strong>, <a href="http://silveiraneto.net/2008/05/25/java-day-em-juazeiro-do-norte/">Silveira Neto</a> com <strong>Conhecendo o NetBeans 6</strong> e por último eu, com o tema <strong>JavaServer Faces, desenvolvendo aplicações web com produtividade</strong>.</p>
<p>Como podem ver o evento contará com assuntos bem diversificados relacionados a tecnologia Java, e acredito que este é o 1º de muitos eventos que ocorrerão em Juazeiro do Norte <img src='http://www.rponte.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ah! Também será a primeira vez  que visito essa terrinha quente, se der tempo vou tentar conhecer alguns pontos turísticos por lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/05/27/1%c2%ba-juazeiro-do-norte-javaday/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comentários sobre o CCT de Maio/2008</title>
		<link>http://www.rponte.com.br/2008/05/20/comentarios-sobre-o-cct-de-maio2008/</link>
		<comments>http://www.rponte.com.br/2008/05/20/comentarios-sobre-o-cct-de-maio2008/#comments</comments>
		<pubDate>Tue, 20 May 2008 14:24:02 +0000</pubDate>
		<dc:creator>Rafael Ponte</dc:creator>
		
		<category><![CDATA[Desenvolvimento Ágil]]></category>

		<category><![CDATA[Engenharia de Software]]></category>

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

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

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

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

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

		<category><![CDATA[domain driven design]]></category>

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

		<category><![CDATA[phillip calcado]]></category>

		<category><![CDATA[shoes is whatching]]></category>

		<guid isPermaLink="false">http://www.rponte.com.br/2008/05/20/comentarios-sobre-o-cct-de-maio2008/</guid>
		<description><![CDATA[Como eu havia falado antes, o CCT de Maio ocorreu no último sábado na Faculdade Lourenço Filho (FLF). Foram três palestras com temas bem distintos e de qualidade. O evento contou com 70 pessoas, em sua grande maioria estudantes. Infelizmente os profissionais do nosso mercado por algum motivo se ausentam de eventos como este, mas [...]]]></description>
			<content:encoded><![CDATA[<p>Como eu havia falado <a href="http://www.rponte.com.br/2008/05/07/cafe-com-tapioca-de-maio-2008/">antes</a>, o <a href="http://www.cejug.org/pages/viewpage.action?pageId=23134225">CCT de Maio</a> ocorreu no último sábado na Faculdade Lourenço Filho (<a href="http://www.flf.edu.br/">FLF</a>). Foram três palestras com temas bem distintos e de qualidade. O evento contou com 70 pessoas, em sua grande maioria estudantes. Infelizmente os profissionais do nosso mercado por algum motivo se ausentam de eventos como este, mas estamos tentando contornar isso.</p>
<p><img src="http://lh4.ggpht.com/cafecomtapioca/SDCXiHLv_2I/AAAAAAAACGc/jkfffiNzgAw/DSC02574.JPG?imgmax=800" height="391" width="522" /></p>
<p>As três palestras foram excelentes, a minha palestra sobre Domain-Driven Design, a de JME ministrada pelo <a href="http://www.vandob.wordpress.com/">Vando Batista</a> e a palestra sobre Integração Contínua ministrada pelo <a href="http://www.luthiano.com/">Luthiano Vasconcelos</a>. Acredito que todos nós conseguimos abordar os temas com objetividade e proficiência. Mas com certeza o Luthiano merece meus parabéns por ter apresentado aproximadamente 25min da sua palestra sem a ajuda dos slides devido a problemas técnicos, ele é o cara!</p>
<p><img src="http://lh3.ggpht.com/cafecomtapioca/SDCSy3Lv-wI/AAAAAAAAB9k/5DDOc5PNsig/DSC02492.JPG?imgmax=800" height="392" width="526" /></p>
<p>Neste evento o Rafael Carneiro reforçou o movimento <a href="http://www.rponte.com.br/2008/05/16/que-dijkstra-que-nada%e2%80%a6-shoes-is-watching/">Shoes is Watching</a>, distribuindo uma cópia do folder aos 20 primeiros que chegassem ao evento, foi bem divertido a repercussão desta brincadeira, algumas pessoas gostaram muito, outras odiaram e outras desconheciam o Shoes, porém depois do evento todos sairam de lá sabendo quem era o <a href="http://blog.fragmental.com.br/">Phillip Calçado</a> (aka <a href="http://fragmental.tw/">Shoes</a>) e o motivo da brincadeira.</p>
<div>
<div style="width:425px;text-align:left" id="__ss_416676"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=cctddd-1211249512176221-9"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=cctddd-1211249512176221-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/rponte/entendendo-domaindriven-design?src=embed" title="View 'Entendendo Domain-Driven Design' on SlideShare">View</a> | <a href="http://www.slideshare.net/upload?src=embed">Upload your own</a></div>
</div>
</div>
<p>Gostaria de agradecer a coordenação do <a href="http://www.cejug.org/">CEJUG</a>, a FLF por ter cedido o local e o excelente coffee-break, e alguns amigos que me ajudaram direta ou indiretamente durante um estudo mais aprofundado sobre o tema como o Alessandro Lazarotti, Rommel Costa, <a href="http://www.milfont.org/tech">Christiano Milfont</a>, <a href="http://www.rafaelcarneiro.org/blog/">Rafael Carneiro</a> e Tarso Bessa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rponte.com.br/2008/05/20/comentarios-sobre-o-cct-de-maio2008/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
