<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2682300885187196546</id><updated>2012-01-19T05:10:05.646-08:00</updated><category term='hibernate'/><category term='componetes'/><category term='Gerência de projetos'/><category term='JavaServer Faces'/><category term='internacionalização mensagens'/><category term='instalação maven'/><category term='teste unitário'/><category term='locale'/><category term='junit'/><category term='gestão do conhecimento'/><category term='reuso de código'/><category term='mapeamento hibernate'/><category term='integração de sistemas'/><category term='business delegate'/><category term='google API'/><category term='grafos'/><category term='modelo relacional'/><category term='ZK Framework'/><category term='computação'/><category term='UFJF'/><category term='Ajax'/><category term='MER'/><category term='spring-test'/><category term='spring web flow'/><category term='test'/><category term='objeto-relacional'/><category term='padrão de projetos'/><category term='Universidade Federal de Juiz de Fora'/><category term='build'/><category term='Maven'/><category term='spring'/><category term='ORM'/><category term='enumeração de caminhos'/><category term='JSF'/><category term='mapeamento objeto-relacional'/><category term='banco de dados'/><category term='instalar'/><category term='rede acíclica'/><category term='Mundo Java'/><category term='google apps'/><category term='ZK'/><category term='humor'/><title type='text'>Blog do Thiago</title><subtitle type='html'>Espaço destinado à computação. &lt;br&gt;
Thiago t = new Thiago();</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-8799977718311998351</id><published>2011-02-10T17:16:00.000-08:00</published><updated>2011-02-10T17:57:40.560-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring web flow'/><title type='text'>Spring Web Flow</title><content type='html'>Olá pessoal.&lt;br /&gt;&lt;br /&gt;Hoje venho apresentar a vocês o spring web flow. Estou trabalhando com ele há um bom tempo e estou gostando muito. Abaixo segue uma apresentação sobre spring web flow que explica por alto o seu funcionamento e faz algumas comparações com alguns frameworks MVC existentes no mercado.&lt;br /&gt;&lt;br /&gt;Essa apresentação mostra também um exemplo prático do uso do web flow, e como fazer testes untários de fluxos.&lt;br /&gt;&lt;br /&gt;Para melhor aprendizado, aconselho fazerem o download da aplicação exemplo e configura-lá.Um vez feito isso comece a acompanhar os slides.&lt;br /&gt;&lt;br /&gt;Segue os passos para configurar a aplicação exemplo no eclipse.&lt;br /&gt;&lt;br /&gt;1) Deve-se ter o maven instalado na máquina. Quem não tiver, &lt;a href="http://thiagoprocaci.blogspot.com/2010/03/instalando-o-maven.html" target="_blank"&gt;clique aqui para aprender a instala-lo. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Faça o download da aplicação exemplo &lt;a href="https://sites.google.com/site/csscode/Home/semanario.zip?attredirects=0&amp;d=1" target="_blank"&gt;aqui&lt;/a&gt; e descompacte-a.&lt;br /&gt;&lt;br /&gt;3) Abra o prompt do comando (cmd) e vá até a pasta do projeto (onde está localizado o pom.xml).&lt;br /&gt;&lt;br /&gt;4) Rode o comando mvn install (na pasta do projeto).&lt;br /&gt;&lt;br /&gt;5) Rode o comando mvn eclipse:eclipse (na pasta do projeto).&lt;br /&gt;&lt;br /&gt;6) Abra o eclipse e importe o projeto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_6887134"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/thiagoprocaci/spring-web-flow" title="Spring Web Flow"&gt;Spring Web Flow&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6887134" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=swf-110210191510-phpapp02&amp;stripped_title=spring-web-flow&amp;userName=thiagoprocaci" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6887134" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=swf-110210191510-phpapp02&amp;stripped_title=spring-web-flow&amp;userName=thiagoprocaci" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/thiagoprocaci"&gt;thiagoprocaci&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tomara que gostem. Abraço.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-8799977718311998351?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/8799977718311998351/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=8799977718311998351' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/8799977718311998351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/8799977718311998351'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2011/02/spring-web-flow.html' title='Spring Web Flow'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-1926726001677395140</id><published>2010-09-26T15:28:00.000-07:00</published><updated>2010-09-26T15:52:14.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gestão do conhecimento'/><category scheme='http://www.blogger.com/atom/ns#' term='computação'/><title type='text'>Gestão do conhecimento no ensino de computação.</title><content type='html'>Um dia desses, eu estava sentado no sofá e fiquei imaginando como o ensino de computação nas organizações ou instituições de ensino poderiam ocorrer de forma mais eficiente.&lt;br /&gt;&lt;br /&gt;O fato é que nosso modelo de ensino de computação atual,  nas faculdades por exemplo, assume um processo de aprendizagem medieval e muito formal. Geralmente os alunos são avaliados através de provas que por sua vez é uma avaliação individual. A colaboração e o trabalho em equipe não são  levados em consideração nesse contexto, distanciando assim os alunos do cotidiano profissional que está por vir. Em minha opinião, este é um processo que deve ser completamente repensado (geralmente o trabalho colaborativo nas instituições de ensino é chamado de “&lt;span&gt;cola&lt;/span&gt;”).&lt;br /&gt;&lt;br /&gt;A evolução da tecnologia e a demanda crescente de conhecimento evolui muito rápido. Os métodos atuais de difusão do conhecimento não acompanham a velocidade dessa evolução.  Minha sugestão para esse problema é a adoção da “&lt;span&gt;dinâmica das comunidades open source&lt;/span&gt;” para o ensino de computação. O mundo open source é composto por comunidades que são auto-organizadas e incentivam a disseminação do conhecimento de maneira informal. Sem dúvidas, elas são um excelente exemplo de como distribuir conhecimento de forma sustentável para produzir um código de qualidade.&lt;br /&gt;&lt;br /&gt;Além da questão da aprendizagem, um outro fator importante é o trabalho de colaboração existente no mundo open source. Trabalhar em grupo significa compartilhar conhecimento. Geralmente, um grupo tem mais capacidade de gerar criativamente alternativas, levantar as vantagens e desvantagens de cada uma, selecionar as viáveis e tomar melhores decisões do que os indivíduos separadamente. Trabalhar em grupo também traz motivação para o membro, pois seu trabalho vai estar sendo observado, comentado e avaliado por pessoas de uma comunidade da qual ele faz parte. Quando um indivíduo expressa ideias para poder se comunicar com outros, ele trabalha ativamente seus conceitos, refletindo sobre os mesmos e refinando-os, trazendo uma melhoria à qualidade do trabalho e do aprendizado.&lt;br /&gt;&lt;br /&gt;A pergunta que sempre fica em minha mente é: o que falta para isso acontecer no ensino de computação?&lt;br /&gt;Sinceramente, eu mesmo não sei a resposta. Mas, com certeza, já deveria está acontecendo na &lt;span style="font-weight: bold;"&gt;velocidade da luz&lt;/span&gt; (&lt;em&gt;Me dê sua&lt;/em&gt; força, &lt;em&gt;Pégasus&lt;/em&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/TJ_LZXZYQhI/AAAAAAAAAUs/PHS_627fEpI/s1600/59_372.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 240px; height: 185px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/TJ_LZXZYQhI/AAAAAAAAAUs/PHS_627fEpI/s400/59_372.jpg" alt="" id="BLOGGER_PHOTO_ID_5521355304817148434" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-1926726001677395140?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/1926726001677395140/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=1926726001677395140' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1926726001677395140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1926726001677395140'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2010/09/gestao-do-conhecimento-no-ensino-de.html' title='Gestão do conhecimento no ensino de computação.'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gvkLbZiZda0/TJ_LZXZYQhI/AAAAAAAAAUs/PHS_627fEpI/s72-c/59_372.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-5072512644355641058</id><published>2010-03-16T18:28:00.000-07:00</published><updated>2010-03-20T09:21:39.873-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='instalar'/><category scheme='http://www.blogger.com/atom/ns#' term='instalação maven'/><title type='text'>Instalando o Maven</title><content type='html'>O post de hoje é um guia prático para instalação do &lt;a href="http://pt.wikipedia.org/wiki/Apache_Maven"&gt;maven&lt;/a&gt;.&lt;br /&gt;Vejam o vídeo que eu preparei!&lt;br /&gt;&lt;br /&gt;Bem simples e fácil fazer sua configuração inicial.&lt;br /&gt;Mais abaixo tem um &lt;a href="http://www.blogger.com/post-edit.g?blogID=2682300885187196546&amp;amp;postID=5072512644355641058#resumoInstalacaoMaven"&gt;resumo da instalação&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rgSESP1V9c4&amp;amp;hl=pt_BR&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/rgSESP1V9c4&amp;amp;hl=pt_BR&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="resumoInstalacaoMaven"&gt;Resumo:&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Baixar o maven: &lt;a href="http://maven.apache.org/download.html" target="_blank"&gt;http://maven.apache.org/download.html&lt;/a&gt;&lt;a href="http://maven.apache.org/download.html" target="_blank"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Descompactar o arquivo.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adicionar as variáveis de ambiente  M2_HOME , M2;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;         M2_HOME = D:\caminho_pasta_maven\apache-maven-x.y.z&lt;/li&gt;&lt;li&gt;         M2 = %M2_HOME%\bin&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Alterar a variável PATH:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PATH = acrescentar %M2%&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Verificar a existência da variável JAVA_HOME e a referência %JAVA_HOME%\bin no PATH.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rodar o comando "mvn -version" no cmd.&lt;/li&gt;&lt;/ol&gt;É só isso. Até&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-5072512644355641058?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/5072512644355641058/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=5072512644355641058' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/5072512644355641058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/5072512644355641058'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2010/03/instalando-o-maven.html' title='Instalando o Maven'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-1058027203960111858</id><published>2010-02-28T16:57:00.001-08:00</published><updated>2010-02-28T20:00:12.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business delegate'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='Gerência de projetos'/><title type='text'>Gerência de projeto de software nos tempos modernos</title><content type='html'>O post de hoje é uma crítica à gerência de projeto de software.&lt;br /&gt;Tenho visto ultimamente que muito se fala de processo, metodologia, cronograma e pouco se é falado de construção de software de qualidade.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://sites.google.com/site/csscode/Home/delegate.png?attredirects=0&amp;amp;d=1" alt="" border="0" width="625px" /&gt;&lt;br /&gt;Um breve comentário para reflexão...&lt;br /&gt;Desenvolvedor faz cronograma? Estimativa? Ou desenvolve?&lt;br /&gt;&lt;br /&gt;Abraço!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-1058027203960111858?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/1058027203960111858/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=1058027203960111858' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1058027203960111858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1058027203960111858'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2010/02/gerencia-de-projeto-de-softtware-nos.html' title='Gerência de projeto de software nos tempos modernos'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-6658481695428881291</id><published>2010-01-26T16:54:00.000-08:00</published><updated>2010-02-06T18:18:45.583-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reuso de código'/><category scheme='http://www.blogger.com/atom/ns#' term='componetes'/><category scheme='http://www.blogger.com/atom/ns#' term='padrão de projetos'/><title type='text'>Obtendo maior reuso de código com o padrão “Application Service”</title><content type='html'>Durante a concepção de um novo software quase sempre nos deparamos com a mesma estrutura clássica de separação de camadas: dao, service, facade e controller.&lt;br /&gt;Em aplicações corporativas, muitas vezes é interessante reutilizar códigos já usados em outras aplicações. Isso porque, nessas aplicações, geralmente as classes que compõem o modelo de dados são as mesma para a corporação.&lt;br /&gt;&lt;br /&gt;O reuso de código é sempre mais eficaz quando temos uma camada de serviço fina, ou seja, com pouca lógica da aplicação em si. Porém, nos casos em que temos uma camada de serviço com muita lógica de negócio específica da aplicação, o reuso destes serviços para outras aplicações torna-se mais difícil.&lt;br /&gt;&lt;br /&gt;Para melhor entender, veja considere a seguinte situação de exemplo:&lt;br /&gt;&lt;br /&gt;Tem-se duas aplicações: uma de cadastro de funcionários e outra premiação de funcionários (aplicações típicas de empresas).  Baseado nisso vamos considerar:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;As aplicações são distintas sendo que, cada uma delas tem a suas lógicas de negócio específicas (serviços);&lt;/li&gt;&lt;li&gt;As aplicações pertencem à mesma corporação portanto,vamos considerar que o modelo de dados (model) e a camada de persistência (dao) são iguais para ambas;&lt;/li&gt;&lt;li&gt;Cada aplicação tem sua fachada (facade) que expõe uma interface que controla o acesso dos diferentes clientes aos serviços.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para maior compreensão veja a figura 1 com projeto das duas aplicações.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;img src="http://sites.google.com/site/csscode/Home/app1.jpg?attredirects=0&amp;amp;d=1" border="0" /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Figura 1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;No exemplo mostrado pela figura 1, vimos que em algumas situações as aplicações podem requerer alguma lógica extra para que executem corretamente suas tarefas (métodos específicos da figura 1). Preferencialmente, os facades não devem conter lógicas de negócios e os services, idealmente, não devem conter lógicas específicas de um caso de uso ou aplicação. Desta maneira há mais reuso e o acoplamento entre os serviços diminui. Assim, pode-se introduzir uma camada que concentra a lógica específica e coordena ações dos services para que essa lógica específica seja corretamente executada. Esses serviços são chamados de application services.&lt;br /&gt;&lt;br /&gt;Voltando ao exemplo, a organização dos serviços ficariam da seguinte forma (figura 2):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://sites.google.com/site/csscode/Home/app2.gif?attredirects=0&amp;amp;d=1" border="0" /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Figura 2&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ou seja, os métodos comuns mostrados na figura 1 ficariam dentro de FuncionarioService e os não comuns ficariam dentro FuncionarioAppService de cada aplicação.&lt;br /&gt;Desta forma o facade de cada aplicação fica encarregado de fazer as devidas chamadas para a camada de negócio (figura 3).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://sites.google.com/site/csscode/Home/app3.gif?attredirects=0&amp;amp;d=1" border="0" /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Figura 3&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Em síntese, isto é o que chama-se de componentização. No momento em que agrupamos coisas comuns e que podem ser reutilizadas em aplicações distintas, pode-se criar um JAR (componente) com esses fontes e usá-lo nas aplicações sem necessidade de replicação de código.&lt;br /&gt;&lt;br /&gt;Até breve!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-6658481695428881291?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/6658481695428881291/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=6658481695428881291' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/6658481695428881291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/6658481695428881291'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2010/01/obtendo-maior-reuso-de-codigo-com-o.html' title='Obtendo maior reuso de código com o padrão “Application Service”'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-1200356165278386713</id><published>2009-10-25T12:34:00.000-07:00</published><updated>2009-10-25T12:59:00.387-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grafos'/><category scheme='http://www.blogger.com/atom/ns#' term='rede acíclica'/><category scheme='http://www.blogger.com/atom/ns#' term='enumeração de caminhos'/><title type='text'>Enumeração de Caminhos - Algoritmo Grafos</title><content type='html'>Olá pessoal!&lt;br /&gt;Na postagem de hoje irei mudar um pouco o foco atual do blog que, desde seu início, tem sido focado mais em tecnologias (spring, hibernate, jsf entre outras).&lt;br /&gt;&lt;br /&gt;Hoje vou comentar um pouco sobre grafos que sempre foi um assunto de meu interesse na época de faculdade. Mais especificamente, através de uma apresentação de slides, vou mostrar dois algoritmos (baseados em rotulação de nós e arcos) para encontrar o número de caminhos entre dois nós de um grafo acíclico. &lt;br /&gt;&lt;br /&gt;Os algoritmos são bem interessantes e tranquilos, visto que podemos usar e abusar da orientação a objetos para implementa-los (os que tornam mais interessante ainda).&lt;br /&gt;&lt;br /&gt;Para melhor entendimento da apresentação, aconselho que o leitor tenha já um certo conhecimento de conceitos básicos de grafos. Dentre eles pode-se citar: matriz de adjacência, nós sucessores, antecessores etc.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_2342971"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/thiagoprocaci/enumeracao-caminhos-algoritmo-grafos" title="Enumeração Caminhos - Algoritmo Grafos"&gt;Enumeração Caminhos - Algoritmo Grafos&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enumeracaocaminhos2-091025142424-phpapp02&amp;stripped_title=enumeracao-caminhos-algoritmo-grafos" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enumeracaocaminhos2-091025142424-phpapp02&amp;stripped_title=enumeracao-caminhos-algoritmo-grafos" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/thiagoprocaci"&gt;thiagoprocaci&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Os fontes da implementação mostrada na apresentação estão disponíveis o link abaixo:&lt;br /&gt;&lt;a href="http://sites.google.com/site/csscode/Home/SimplePaths.zip" target="_blank"&gt;Fontes dos algoritmos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quem desejar somente o executável está disponível em:&lt;br /&gt;&lt;a href="http://sites.google.com/site/csscode/Home/paths.jar" target="_blank"&gt; JAR da implementação&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O implementação foi feita em Java... Só para lembrar!!&lt;br /&gt;&lt;br /&gt;Abraço!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-1200356165278386713?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/1200356165278386713/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=1200356165278386713' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1200356165278386713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1200356165278386713'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/10/enumeracao-de-caminhos-algoritmo-grafos.html' title='Enumeração de Caminhos - Algoritmo Grafos'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-3650965887985189975</id><published>2009-08-27T19:52:00.000-07:00</published><updated>2009-08-27T20:10:33.189-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZK'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>Desvendando o ZK Framework</title><content type='html'>Olá!&lt;br /&gt;Aproveitando o embalo do post anterior, neste vou apresentar conceitos do ZK Framework e um exemplo de implementação (ressaltando os conceitos) através de alguns slides. Esta apresentação trata-se de apenas uma referencia inicial para as pessoas que desejam se aprofundar na tecnologia. &lt;br /&gt;A apresentação está bem interessante! Vale a pena dar uma olhada!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="width: 425px; text-align: center;" id="__ss_1917744"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/thiagoprocaci/zk-framework-1917744" title="Zk Framework"&gt;Zk Framework&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zkframework-090827212234-phpapp01&amp;amp;stripped_title=zk-framework-1917744"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zkframework-090827212234-phpapp01&amp;amp;stripped_title=zk-framework-1917744" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/thiagoprocaci"&gt;thiagoprocaci&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para maiores informações:&lt;a href="http://www.zkoss.org/"&gt; http://www.zkoss.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Até!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-3650965887985189975?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/3650965887985189975/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=3650965887985189975' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/3650965887985189975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/3650965887985189975'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/08/desvendando-o-zk-framework.html' title='Desvendando o ZK Framework'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-117929675254735854</id><published>2009-07-22T17:49:00.000-07:00</published><updated>2009-07-22T18:35:59.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZK Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Mundo Java'/><title type='text'>Mundo Java - número 36</title><content type='html'>O post de hoje será somente para falar um pouco sobre a edição 36 da revista&lt;br /&gt;&lt;a href="http://www.mundojava.com.br/" target="_blank"&gt;Mundo Java&lt;/a&gt;. Na verdade, o motivo disso é a minha presença na edição com o artigo ZK Framework - Utilizando Ajax sem Javascript.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;br /&gt;&lt;div style="float: left;width:300px"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/Sme1Pj8H8lI/AAAAAAAAAHk/zHhl3vukWmI/s1600-h/revistanumero0036.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 148px; height: 190px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/Sme1Pj8H8lI/AAAAAAAAAHk/zHhl3vukWmI/s400/revistanumero0036.jpg" alt="" id="BLOGGER_PHOTO_ID_5361453160357950034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="float: left;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gvkLbZiZda0/Sme65wl3-RI/AAAAAAAAAHs/aN-Qzn4GvZg/s1600-h/zk.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 251px; height: 122px;" src="http://4.bp.blogspot.com/_gvkLbZiZda0/Sme65wl3-RI/AAAAAAAAAHs/aN-Qzn4GvZg/s400/zk.gif" alt="" id="BLOGGER_PHOTO_ID_5361459382866934034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;br /&gt;No artigo procurei ressaltar conceitos referentes os ZK e ainda construir exemplos mostrando seu uso. Segue uma prévia de alguns trechos do artigo publicado..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;" Cada vez mais se faz necessário que as aplicações web sejam intuitivas e fáceis de se usar. Esta necessidade está diretamente ligada à camada de visão de tais aplicações. Porém, a criação de aplicações com interfaces ricas exige esforços cada vez maiores. Essa exigência muitas vezes acaba desviando o foco do desenvolvimento que deveria ser, na maior parte do tempo, nas regras de negócio. Com efeito, surgem diversas ferramentas tentando facilitar essa tarefa, sendo uma delas o ZK Framework. "&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;" ... as tecnologias utilizadas em aplicações web apresentaram uma notável evolução. Inicialmente tinham-se aplicações cujas camadas de visão eram compostas somente por páginas HTML estáticas que, com o decorrer do tempo, foram gradativamente evoluindo para páginas HTML dinâmicas (DHTML), páginas utilizando Flash, Applets e, por fim, para páginas que incorporavam o uso de Ajax ... "&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;" Com a maturação da tecnologia Ajax, surgiram vários frameworks baseados nela, sendo o ZK um deles. A idéia principal do ZK Framework é facilitar a incorporação de Ajax nas aplicações web desenvolvidas em Java, de maneira a dispensar qualquer conhecimento de Javascript. Essa facilidade é oriunda dos mecanismos internos do ZK que geram código Javascript de forma transparente para o desenvolvedor. "&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E por aí vai correndo o assunto..&lt;br /&gt;Além desse artigo, a edição apresenta vários outros assuntos interessantes dos quais cita-se: JRuby, Demoiselle Framework, hábitos eficazes para tratamento de exceções etc.&lt;br /&gt;&lt;br /&gt;Para quem desejar saber mais sobre o ZK Framework segue uma dica quente:&lt;br /&gt;&lt;a href="http://www.zkoss.org/" target="_blank"&gt;http://www.zkoss.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mais adiante vou postar alguns exemplos mostrando o uso do ZK.&lt;br /&gt;&lt;br /&gt;até!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-117929675254735854?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/117929675254735854/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=117929675254735854' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/117929675254735854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/117929675254735854'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/07/mundo-java-numero-36.html' title='Mundo Java - número 36'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gvkLbZiZda0/Sme1Pj8H8lI/AAAAAAAAAHk/zHhl3vukWmI/s72-c/revistanumero0036.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-1602366459549619769</id><published>2009-07-12T07:30:00.000-07:00</published><updated>2009-07-12T08:07:44.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='locale'/><category scheme='http://www.blogger.com/atom/ns#' term='internacionalização mensagens'/><title type='text'>Internacionalização de mensagens com JSF – Exemplo prático.</title><content type='html'>Nesta postagem vamos mostrar como fazer a internacionalização de mensagens utilizando JSF. Internacionalizar mensagens é uma maneira de isolar toda a mensageiria de uma aplicação em arquivos. Desta forma, pode-se definir mensagens em idiomas diferentes em arquivos separados sem que a aplicação sofra nenhum impacto.&lt;br /&gt;&lt;br /&gt;Para exemplificar a internacionalização com JSF, vamos aproveitar a aplicação exemplo mostrada na postagem &lt;a href="http://thiagoprocaci.blogspot.com/2009/06/iniciando-com-jsf-tutorial-com-exemplo.html"&gt;“Iniciando com JSF (Tutorial com exemplo prático)”&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Primeiramente deve-se definir os arquivos com as mensagens. Para isso foi criado um pacote com.sample.messages e lá foram colocados dois arquivos com as mensagens da aplicação (um com mensagens em  inglês e outro em português).&lt;br /&gt;&lt;br /&gt;A listagem 1 e  2 mostram como ficaram os arquivos com as mensagens da aplicação.&lt;br /&gt;&lt;br /&gt;messages_en_US.properties (mensagens em inglês)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;pre name="code" class="java"&gt;portuguese=Portuguese&lt;br /&gt;english=English&lt;br /&gt;save=Save&lt;br /&gt;delete=Delete&lt;br /&gt;name=Name&lt;br /&gt;nationality=Nationality&lt;br /&gt;title=JSF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 1&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;messages_pt_BR.properties (mensagens em português)&lt;br /&gt;&lt;pre name="code" class="java"&gt;portuguese=Portugues&lt;br /&gt;english=Ingles&lt;br /&gt;save=Salvar&lt;br /&gt;delete=Excluir&lt;br /&gt;name=Nome&lt;br /&gt;nationality=Nacionalidade&lt;br /&gt;title=JSF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 2&lt;br /&gt;&lt;br /&gt;O pacote com os arquivos  de mensagens é ilustrado na figura 1:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gvkLbZiZda0/Sln07RZIxdI/AAAAAAAAAHU/JbPU-kwNZ_g/s1600-h/pacote.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 253px; height: 156px;" src="http://1.bp.blogspot.com/_gvkLbZiZda0/Sln07RZIxdI/AAAAAAAAAHU/JbPU-kwNZ_g/s400/pacote.gif" alt="" id="BLOGGER_PHOTO_ID_5357582530852210130" border="0" /&gt;&lt;/a&gt;Figura 1: Pacote mensagens&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora temos que configurar o faces-config.xml para o funcionamento da mensageiria. Para isso basta adicionar o seguinte trecho no faces-config.xml conforme a listagem 3:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt; &amp;lt;application&amp;gt;   &lt;br /&gt;  &amp;lt;resource-bundle&amp;gt;&lt;br /&gt;     &amp;lt;base-name&amp;gt;com.sample.messages.messages&amp;lt;/base-name&amp;gt;&lt;br /&gt;     &amp;lt;var&amp;gt;msgs&amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;/resource-bundle&amp;gt;&lt;br /&gt;  &amp;lt;locale-config&amp;gt;&lt;br /&gt;         &amp;lt;default-locale&amp;gt;pt_BR&amp;lt;/default-locale&amp;gt;&lt;br /&gt;         &amp;lt;supported-locale&amp;gt;en_US&amp;lt;/supported-locale&amp;gt;&lt;br /&gt;  &amp;lt;/locale-config&amp;gt;&lt;br /&gt;  &amp;lt;message-bundle&amp;gt;&lt;br /&gt;       com.sample.messages.messages&lt;br /&gt;  &amp;lt;/message-bundle&amp;gt;      &lt;br /&gt; &amp;lt;/application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 3&lt;br /&gt;&lt;br /&gt;Vamos agora criar um controller para gerenciar qual será o locale (idioma) usado na aplicação. Esse controller chamaremos de LocaleController e ficará dentro do pacote com.sample.controller do exemplo. A listagem 4 mostra a implementação do LocaleController.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.sample.controller;&lt;br /&gt;&lt;br /&gt;import java.util.Locale;&lt;br /&gt;&lt;br /&gt;import javax.faces.component.UIViewRoot;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;&lt;br /&gt;public class LocaleController {&lt;br /&gt; private Locale currentLocale = new Locale("pt", "BR");&lt;br /&gt;&lt;br /&gt; public void englishLocale() {&lt;br /&gt;  UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();&lt;br /&gt;  currentLocale = Locale.US;&lt;br /&gt;  viewRoot.setLocale(currentLocale);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void portugueseLocale() {&lt;br /&gt;  UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();&lt;br /&gt;  currentLocale = new Locale("pt", "BR");&lt;br /&gt;  viewRoot.setLocale(currentLocale);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Locale getCurrentLocale() {&lt;br /&gt;  return currentLocale;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 4&lt;br /&gt;&lt;br /&gt;Vamos também definir um managed-bean no faces-config.xml para o LocaleController (listagem 5).&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;  &amp;lt;managed-bean-name&amp;gt;localeController&amp;lt;/managed-bean-name&amp;gt;&lt;br /&gt;  &amp;lt;managed-bean-class&amp;gt;&lt;br /&gt;  com.sample.controller.LocaleController&lt;br /&gt;  &amp;lt;/managed-bean-class&amp;gt;&lt;br /&gt;  &amp;lt;managed-bean-scope&amp;gt;session&amp;lt;/managed-bean-scope&amp;gt;   &lt;br /&gt;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 5&lt;br /&gt;&lt;br /&gt;Agora vamos definir a página pessoa.jsp para testar a internacionalização (listagem 6).&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;%@ page contentType="text/html; charset=UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;f:view locale="#{localeController.currentLocale}"&amp;gt;&lt;br /&gt; &amp;lt;head&amp;gt; &lt;br /&gt; &amp;lt;title&amp;gt;&amp;lt;h:outputText value="#{msgs.title}" /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;/head&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt; &amp;lt;h:form&amp;gt;&lt;br /&gt;  &amp;lt;table&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;h:commandLink value="#{msgs.portuguese}" action="#{localeController.portugueseLocale}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;h:commandLink value="#{msgs.english}" action="#{localeController.englishLocale}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;/tr&amp;gt;   &lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;h:outputText value="#{msgs.name}" /&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;h:inputText value="#{pessoaController.pessoa.nome}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;h:outputText value="#{msgs.nationality}" /&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;h:inputText value="#{pessoaController.pessoa.nacionalidade}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;h:commandButton value="#{msgs.save}" action="#{pessoaController.save}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/table&amp;gt;&lt;br /&gt;  &amp;lt;h:dataTable value="#{pessoaController.pessoas}" var="p" &lt;br /&gt;rendered="#{not empty pessoaController.pessoas}" border="1"&amp;gt;&lt;br /&gt;   &amp;lt;h:column&amp;gt;&lt;br /&gt;    &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;     &amp;lt;h:outputText value="#{msgs.name}" /&amp;gt;&lt;br /&gt;    &amp;lt;/f:facet&amp;gt;&lt;br /&gt;    &amp;lt;h:commandLink value="#{p.nome}" action="#{pessoaController.edit}"&amp;gt;&lt;br /&gt;     &amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;     &lt;br /&gt;    &amp;lt;/h:commandLink&amp;gt;    &lt;br /&gt;   &amp;lt;/h:column&amp;gt;&lt;br /&gt;   &amp;lt;h:column&amp;gt;&lt;br /&gt;    &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;     &amp;lt;h:outputText value="#{msgs.nationality}" /&amp;gt;&lt;br /&gt;    &amp;lt;/f:facet&amp;gt;&lt;br /&gt;    &amp;lt;h:commandLink value="#{p.nacionalidade}" action="#{pessoaController.edit}"&amp;gt;&lt;br /&gt;     &amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;     &lt;br /&gt;    &amp;lt;/h:commandLink&amp;gt;   &lt;br /&gt;   &amp;lt;/h:column&amp;gt;&lt;br /&gt;   &amp;lt;h:column&amp;gt;&lt;br /&gt;    &amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;     &amp;lt;h:outputText value="#{msgs.delete}" /&amp;gt;&lt;br /&gt;    &amp;lt;/f:facet&amp;gt;    &lt;br /&gt;    &amp;lt;h:commandLink value="#{msgs.delete}" action="#{pessoaController.delete}"&amp;gt;&lt;br /&gt;     &amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;&lt;br /&gt;    &amp;lt;/h:commandLink&amp;gt;   &lt;br /&gt;   &amp;lt;/h:column&amp;gt;&lt;br /&gt;  &amp;lt;/h:dataTable&amp;gt;&lt;br /&gt; &amp;lt;/h:form&amp;gt; &lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Listagem 6&lt;br /&gt;&lt;br /&gt;Com as configurações mostradas acima podemos ver o comportamento da aplicação (figura 2).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/Sln4EdViSfI/AAAAAAAAAHc/l9lk_FSlKlA/s1600-h/internacionalizacaoComportamento.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 221px; height: 400px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/Sln4EdViSfI/AAAAAAAAAHc/l9lk_FSlKlA/s400/internacionalizacaoComportamento.gif" alt="" id="BLOGGER_PHOTO_ID_5357585987212036594" border="0" /&gt;&lt;/a&gt;Figura 2: Comportamento da aplicação&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Em síntese, com a aplicação exemplificamos como internacionalizar mensagens.&lt;br /&gt;Os fontes do exemplo completo estão disponíveis &lt;a href="http://sites.google.com/site/csscode/Home/jsfdemo_.zip?attredirects=0"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Até!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-1602366459549619769?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/1602366459549619769/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=1602366459549619769' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1602366459549619769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/1602366459549619769'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/07/internacionalizacao-de-mensagens-com.html' title='Internacionalização de mensagens com JSF – Exemplo prático.'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gvkLbZiZda0/Sln07RZIxdI/AAAAAAAAAHU/JbPU-kwNZ_g/s72-c/pacote.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-7850392333523199477</id><published>2009-06-11T14:54:00.000-07:00</published><updated>2009-07-12T09:15:24.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaServer Faces'/><title type='text'>Iniciando com JSF  (Tutorial com exemplo prático)</title><content type='html'>Nesta postagem será mostrado um exemplo prático (CRUD de pessoas) para aqueles que desejam iniciar o uso da tecnologia JSF. Para isso, será utilizado o servidor de aplicação Apache Tomcat 6.0 e a IDE Eclipse Ganymede.&lt;br /&gt;&lt;br /&gt;Para começar, é preciso criar um novo projeto. No Eclipse, basta abrir o menu file conforme mostrado na figura 1. Em seguida, será aberta uma tela para escolher o tipo de aplicação que será desenvolvida. No caso do exemplo, selecione Dynamic Web Project (figura 2) e clique no botão Next.&lt;br /&gt;Na seqüência, dê um nome para o projeto (no exemplo será jsfdemo) e selecione a combo Target RunTime para Apache Tomcat v6.0 (figura 3). Depois, clique no botão Finish que o projeto estará criado.&lt;br /&gt;&lt;br /&gt;Um vez criado o projeto, é necessário configurar o ambiente para que a aplicação funcione. Para isso, faça o download da ultima versão do JSF e extraia os jars para a pasta WEB-INF/lib do projeto.  Por fim, é necessário configurar o web.xml do projeto, cuja configuração é mostrada na listagem 1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_gvkLbZiZda0/SjbsTK-w34I/AAAAAAAAAG0/JGDFK5ZlqL0/s1600-h/novoProjeto.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 172px;" src="http://1.bp.blogspot.com/_gvkLbZiZda0/SjbsTK-w34I/AAAAAAAAAG0/JGDFK5ZlqL0/s400/novoProjeto.gif" alt="" id="BLOGGER_PHOTO_ID_5347721421658316674" border="0" /&gt;&lt;/a&gt;Figura 1:Novo projeto&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/Sjbsj8jP3fI/AAAAAAAAAG8/YgnD07jYpEs/s1600-h/dynamicWeb1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 388px; height: 316px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/Sjbsj8jP3fI/AAAAAAAAAG8/YgnD07jYpEs/s400/dynamicWeb1.gif" alt="" id="BLOGGER_PHOTO_ID_5347721709842587122" border="0" /&gt;&lt;/a&gt;Figura 2: Dynamic Web Project&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_gvkLbZiZda0/Sjbs4CMf-uI/AAAAAAAAAHE/HDO_4mCxVQk/s1600-h/configInicial.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 309px;" src="http://4.bp.blogspot.com/_gvkLbZiZda0/Sjbs4CMf-uI/AAAAAAAAAHE/HDO_4mCxVQk/s400/configInicial.gif" alt="" id="BLOGGER_PHOTO_ID_5347722054955170530" border="0" /&gt;&lt;/a&gt;Figura 3: Configuração inicial do projeto&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;javax.faces.STATE_SAVING_METHOD&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;server&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.faces&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 1: web.xml&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A partir deste ponto já podemos começar a efetivamente desenvolver a aplicação de exemplo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Construindo a aplicação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para iniciar, vamos criar os seguintes pacotes na projeto:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;com.sample.controller;&lt;/li&gt;&lt;li&gt;com.sample.dao;&lt;/li&gt;&lt;li&gt;com.sample.model.&lt;/li&gt;&lt;/ul&gt;A figura 4 ilustra a organização dos pacotes no eclipse.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_gvkLbZiZda0/SjbtIgePEmI/AAAAAAAAAHM/FtBwyUaZ0cg/s1600-h/pacotes.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 123px;" src="http://2.bp.blogspot.com/_gvkLbZiZda0/SjbtIgePEmI/AAAAAAAAAHM/FtBwyUaZ0cg/s400/pacotes.gif" alt="" id="BLOGGER_PHOTO_ID_5347722337960530530" border="0" /&gt;&lt;/a&gt;Figura 4: Pacotes&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Dentro do pacote model vamos criar a classe pessoa cujo código é listado na listagem 2.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.sample.model;&lt;br /&gt;&lt;br /&gt;public class Pessoa {&lt;br /&gt;private Integer id;&lt;br /&gt;private String nome;&lt;br /&gt;private String nacionalidade;&lt;br /&gt;&lt;br /&gt;public Integer getId() {&lt;br /&gt;return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(Integer id) {&lt;br /&gt;this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getNome() {&lt;br /&gt;return nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;this.nome = nome;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getNacionalidade() {&lt;br /&gt;return nacionalidade;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setNacionalidade(String nacionalidade) {&lt;br /&gt;this.nacionalidade = nacionalidade;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public int hashCode() {&lt;br /&gt;final int prime = 31;&lt;br /&gt;int result = 1;&lt;br /&gt;result = prime * result + ((id == null) ? 0 : id.hashCode());&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean equals(Object obj) {&lt;br /&gt;if (this == obj)&lt;br /&gt;return true;&lt;br /&gt;if (obj == null)&lt;br /&gt;return false;&lt;br /&gt;if (getClass() != obj.getClass())&lt;br /&gt;return false;&lt;br /&gt;Pessoa other = (Pessoa) obj;&lt;br /&gt;if (id == null) {&lt;br /&gt;if (other.id != null)&lt;br /&gt;return false;&lt;br /&gt;} else if (!id.equals(other.id))&lt;br /&gt;return false;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 2: Pessoa.java&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Dentro do pacote dao vamos definir a interface PessoaDao cujo código é mostrado na listagem 3.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre name="code" class="java"&gt;package com.sample.dao;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import com.sample.model.Pessoa;&lt;br /&gt;&lt;br /&gt;public interface PessoaDao {&lt;br /&gt;void save(Pessoa pessoa);&lt;br /&gt;void delete(Integer id);&lt;br /&gt;Pessoa getById(Integer id);&lt;br /&gt;List&amp;lt;Pessoa&amp;gt; findAll();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 3: PessoaDao.java&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Dentro do pacote dao é necessário criar também a implementação da interface PessoaDao. No caso do exemplo será definido a classe PessoaDaoImpl (listagem 4).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre name="code" class="java"&gt;package com.sample.dao;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import com.sample.model.Pessoa;&lt;br /&gt;&lt;br /&gt;public class PessoaDaoImpl implements PessoaDao {&lt;br /&gt;private static PessoaDaoImpl INSTANCE = new PessoaDaoImpl();&lt;br /&gt;private static Map&amp;lt;Integer, Pessoa&amp;gt; database&lt;br /&gt;= new HashMap&amp;lt;Integer, Pessoa&amp;gt;();&lt;br /&gt;private static Integer nextId = 0;&lt;br /&gt;&lt;br /&gt;private PessoaDaoImpl() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static PessoaDaoImpl getInstance() {&lt;br /&gt;return INSTANCE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void save(Pessoa pessoa) {&lt;br /&gt;if (pessoa != null) {&lt;br /&gt;if (pessoa.getId() == null) {&lt;br /&gt;nextId++;&lt;br /&gt;pessoa.setId(nextId);&lt;br /&gt;}&lt;br /&gt;database.put(pessoa.getId(), pessoa);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void delete(Integer id) {&lt;br /&gt;if (id != null)&lt;br /&gt;database.remove(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Pessoa getById(Integer id) {&lt;br /&gt;return database.get(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public List&amp;lt;Pessoa&amp;gt; findAll() {&lt;br /&gt;return new ArrayList&amp;lt;Pessoa&amp;gt;(database.values());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 4: PessoaDaoImpl.java&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Dentro do pacote controller vamos definir a classe PessoaController que será o nosso managed bean (listagem 5).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre name="code" class="java"&gt;package com.sample.controller;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;&lt;br /&gt;import com.sample.dao.PessoaDao;&lt;br /&gt;import com.sample.dao.PessoaDaoImpl;&lt;br /&gt;import com.sample.model.Pessoa;&lt;br /&gt;&lt;br /&gt;public class PessoaController {&lt;br /&gt;private PessoaDao pessoaDao = PessoaDaoImpl.getInstance();&lt;br /&gt;private Pessoa pessoa;&lt;br /&gt;&lt;br /&gt;public PessoaController() {&lt;br /&gt;pessoa = new Pessoa();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void save() {&lt;br /&gt;pessoaDao.save(pessoa);&lt;br /&gt;pessoa = new Pessoa();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void edit() {&lt;br /&gt;// pega o parametro passado no link&lt;br /&gt;Integer id = Integer.parseInt((String)&lt;br /&gt;FacesContext.getCurrentInstance().getExternalContext()&lt;br /&gt;.getRequestParameterMap().get("id"));&lt;br /&gt;pessoa = pessoaDao.getById(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void delete(){&lt;br /&gt;// pega o parametro passado no link&lt;br /&gt;Integer id = Integer.parseInt((String)&lt;br /&gt;FacesContext.getCurrentInstance().getExternalContext()&lt;br /&gt;.getRequestParameterMap().get("id"));&lt;br /&gt;pessoaDao.delete(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// getters e setters&lt;br /&gt;public Pessoa getPessoa() {&lt;br /&gt;return pessoa;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPessoa(Pessoa pessoa) {&lt;br /&gt;this.pessoa = pessoa;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public List&amp;lt;Pessoa&amp;gt; getPessoas() {&lt;br /&gt;return pessoaDao.findAll();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 5: PessoaController.java&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Vamos agora configurar o faces-config.xml (localizado dentro da pasta WEB-INF) cuja configuração é mostrada na  listagem 6.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;faces-config&amp;gt;&lt;br /&gt;&amp;lt;navigation-rule&amp;gt;&lt;br /&gt;&amp;lt;from-view-id&amp;gt;pessoa.jsp&amp;lt;/from-view-id&amp;gt;&lt;br /&gt;&amp;lt;navigation-case&amp;gt;&lt;br /&gt;&amp;lt;from-outcome&amp;gt;*&amp;lt;/from-outcome&amp;gt;&lt;br /&gt;&amp;lt;to-view-id&amp;gt;pessoa.jsp&amp;lt;/to-view-id&amp;gt;&lt;br /&gt;&amp;lt;/navigation-case&amp;gt;&lt;br /&gt;&amp;lt;/navigation-rule&amp;gt;&lt;br /&gt;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;&amp;lt;managed-bean-name&amp;gt;pessoaController&amp;lt;/managed-bean-name&amp;gt;&lt;br /&gt;&amp;lt;managed-bean-class&amp;gt;&lt;br /&gt;com.sample.controller.PessoaController&lt;br /&gt;&amp;lt;/managed-bean-class&amp;gt;&lt;br /&gt;&amp;lt;managed-bean-scope&amp;gt;session&amp;lt;/managed-bean-scope&amp;gt;&lt;br /&gt;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&amp;lt;/faces-config&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 6: faces-config.xml&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Por fim, vamos criar nossa página pessoa.jsp (listagem 7).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;%@ page contentType="text/html; charset=UTF-8"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;h:outputText value="Desvendando JSF" /&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h:form&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;h:outputText value="Nome" /&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;h:inputText value="#{pessoaController.pessoa.nome}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;h:outputText value="Nacionalidade" /&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;h:inputText value="#{pessoaController.pessoa.nacionalidade}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;h:commandButton value="salvar" action="#{pessoaController.save}" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;h:dataTable value="#{pessoaController.pessoas}"&lt;br /&gt;var="p" rendered="#{not empty pessoaController.pessoas}" border="1"&amp;gt;&lt;br /&gt;&amp;lt;h:column&amp;gt;&lt;br /&gt;&amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Nome" /&amp;gt;&lt;br /&gt;&amp;lt;/f:facet&amp;gt;&lt;br /&gt;&amp;lt;h:commandLink value="#{p.nome}" action="#{pessoaController.edit}"&amp;gt;&lt;br /&gt;&amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;&lt;br /&gt;&amp;lt;/h:commandLink&amp;gt;&lt;br /&gt;&amp;lt;/h:column&amp;gt;&lt;br /&gt;&amp;lt;h:column&amp;gt;&lt;br /&gt;&amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Nacionalidade" /&amp;gt;&lt;br /&gt;&amp;lt;/f:facet&amp;gt;&lt;br /&gt;&amp;lt;h:commandLink value="#{p.nacionalidade}" action="#{pessoaController.edit}"&amp;gt;&lt;br /&gt;&amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;&lt;br /&gt;&amp;lt;/h:commandLink&amp;gt;&lt;br /&gt;&amp;lt;/h:column&amp;gt;&lt;br /&gt;&amp;lt;h:column&amp;gt;&lt;br /&gt;&amp;lt;f:facet name="header"&amp;gt;&lt;br /&gt;&amp;lt;h:outputText value="Excluir" /&amp;gt;&lt;br /&gt;&amp;lt;/f:facet&amp;gt;&lt;br /&gt;&amp;lt;h:commandLink value="excluir" action="#{pessoaController.delete}"&amp;gt;&lt;br /&gt;&amp;lt;f:param name="id" value="#{p.id}" /&amp;gt;&lt;br /&gt;&amp;lt;/h:commandLink&amp;gt;&lt;br /&gt;&amp;lt;/h:column&amp;gt;&lt;br /&gt;&amp;lt;/h:dataTable&amp;gt;&lt;br /&gt;&amp;lt;/h:form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;Listagem 7: pessoa.jsp&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A partir deste ponto, com as definições acima, podemos vizualizar a aplicação através da URL http://localhost:8080/jsfdemo/pessoa.faces .&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Veja uma prévia do funcionamento dela (figura 5). Trata-se de um CRUD básico de pessoa.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/SjbrzaG1VWI/AAAAAAAAAGs/iJ095x-KhAg/s1600-h/app.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 277px; height: 162px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/SjbrzaG1VWI/AAAAAAAAAGs/iJ095x-KhAg/s400/app.gif" alt="" id="BLOGGER_PHOTO_ID_5347720875962881378" border="0" /&gt;&lt;/a&gt;Figura 5: Aplicação JSF&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um excelente referencia para quem deseja aprender conceitos relacionados ao JSF é o livro &lt;a href="http://www.sun.com/books/catalog/core_jsf.xml" target="_blank"&gt;&lt;span style="font-size:100%;"&gt;Core JavaServer Faces.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Os fontes do exemplo (incluindo Jars) estão disponíveis &lt;a href="http://sites.google.com/site/csscode/Home/jsfdemo.zip?attredirects=0" target="_blank"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Até!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Veja também:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://thiagoprocaci.blogspot.com/2009/07/internacionalizacao-de-mensagens-com.html"&gt;Internacionalizando mensagens com JSF&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-7850392333523199477?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/7850392333523199477/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=7850392333523199477' title='17 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/7850392333523199477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/7850392333523199477'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/06/iniciando-com-jsf-tutorial-com-exemplo.html' title='Iniciando com JSF  (Tutorial com exemplo prático)'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_gvkLbZiZda0/SjbsTK-w34I/AAAAAAAAAG0/JGDFK5ZlqL0/s72-c/novoProjeto.gif' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-7167681261224097199</id><published>2009-05-30T18:14:00.000-07:00</published><updated>2009-09-08T18:09:53.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integração de sistemas'/><category scheme='http://www.blogger.com/atom/ns#' term='Universidade Federal de Juiz de Fora'/><category scheme='http://www.blogger.com/atom/ns#' term='google API'/><category scheme='http://www.blogger.com/atom/ns#' term='google apps'/><category scheme='http://www.blogger.com/atom/ns#' term='UFJF'/><title type='text'>Integrando sistemas corporativos ao Google.</title><content type='html'>Ferramentas de comunicação e colaboração cada vez mais estão sendo necessárias nas empresas e instituições. Tais ferramentas buscam prover maior interação entre pessoas visando facilitar a realização de atividades em grupo e agilizar tarefas.&lt;br /&gt;&lt;br /&gt;Como todos já devem saber, quando se fala em ferramentas de comunicação e colaboração logo lembra-se do Google devido a superioridade dos serviços oferecidos. Há pouco tempo atrás, o Google lançou o Google Apps que,  a grosso modo, trata-se de um ponto de acesso aos serviços personalizados de comunicação e colaboração do Google. Em síntese, com Google Apps tornou-se possível que uma instituição tenha acesso a todos os serviços do Google de forma customizada.&lt;br /&gt;&lt;br /&gt;Ano passado (2008), a Universidade Federal de Juiz de Fora (MG) iniciou um processo de integração de seu sistema acadêmico com o Google Apps.  O projeto foi um sucesso e está até hoje em contínuo desenvolvimento.&lt;br /&gt;&lt;br /&gt;Como participante ativo do projeto na época tenho ciência dos benefícios que essa integração trouxe para a universidade.&lt;br /&gt;&lt;br /&gt;Para quem se interessar sobre funcionamento o Google Apps acesse:&lt;br /&gt;&lt;a href="http://www.google.com/a/help/intl/pt-BR/index.html" target="_blank"&gt;http://www.google.com/a/help/intl/pt-BR/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para quem desejar saber como foi a integração do sistema de gestão acadêmica da Universidade Federal de Juiz de Fora com o Google Apps segue uma referência:&lt;br /&gt;&lt;a href="http://sites.google.com/site/csscode/Home/integra.pdf?attredirects=0" target="_blank"&gt;http://sites.google.com/site/csscode/Home/integra.pdf?attredirects=0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Eu recomendo a leitura. O projeto é muito interessante (envolve vários conceitos de ciência da conputação) e ainda não vi nenhuma instituição de ensino fazer algo parecido.&lt;br /&gt;&lt;br /&gt;Até mais!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-7167681261224097199?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/7167681261224097199/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=7167681261224097199' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/7167681261224097199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/7167681261224097199'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/05/integrando-de-sistemas-corporativos-ao.html' title='Integrando sistemas corporativos ao Google.'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-3169852104499793172</id><published>2009-04-25T12:34:00.001-07:00</published><updated>2009-06-29T17:29:46.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='objeto-relacional'/><category scheme='http://www.blogger.com/atom/ns#' term='modelo relacional'/><category scheme='http://www.blogger.com/atom/ns#' term='mapeamento hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='MER'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><category scheme='http://www.blogger.com/atom/ns#' term='mapeamento objeto-relacional'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Mapeamento objeto-relacional (ORM) com Hibernate – Uma abordagem prática</title><content type='html'>Nesta postagem será mostrado como fazer o mapeamento objeto-relacional (ORM) utilizando o hibernate através de um exemplo prático. A idéia principal do exemplo é apenas mostrar como fazer o mapeamento objeto-relacional sem ressaltar conceitos envolvidos. Espera-se que ele sirva como uma referência rápida e objetiva para desenvolvedores.&lt;br /&gt;&lt;br /&gt;Para iniciar, vamos definir o modelo de dados relacional através de um diagrama entidade-relacionamento (figura abaixo).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gvkLbZiZda0/SfNl4PidFBI/AAAAAAAAAFo/uF6_mF86_Zk/s1600-h/teste.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 274px;" src="http://3.bp.blogspot.com/_gvkLbZiZda0/SfNl4PidFBI/AAAAAAAAAFo/uF6_mF86_Zk/s400/teste.png" alt="" id="BLOGGER_PHOTO_ID_5328714801027552274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;        &lt;span style="font-style: italic; color: rgb(255, 0, 0);"&gt;Para melhor visualização clique na imagem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Através do diagrama entidade-relacionamento acima, podemos extrair alguns casos a serem mapeados.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Herança – Entidades envolvidas: aluno, professor, pessoa;&lt;/li&gt;&lt;li&gt;N : M sem atributos intermediários – Entidades envolvidas: disciplina_professor, professor, disciplina;&lt;/li&gt;&lt;li&gt;1 : N – Entidades envolvidas: turma, aluno;&lt;/li&gt;&lt;li&gt;N : M com atributo intermediário – Entidades envolvidas: professor_turma, turma, professor.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Abaixo temos as classes java com o mapeamento objeto-relacional exemplificando os casos citados acima.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de Pessoa:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import static javax.persistence.GenerationType.IDENTITY;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.Inheritance;&lt;br /&gt;import javax.persistence.InheritanceType;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "pessoa", catalog = "mapeamentohibernate")&lt;br /&gt;@Inheritance(strategy = InheritanceType.JOINED)&lt;br /&gt;public class Pessoa implements Serializable {&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = IDENTITY)&lt;br /&gt;@Column(name = "id", unique = true, nullable = false)&lt;br /&gt;private Integer id;&lt;br /&gt;&lt;br /&gt;@Column(name = "nome")&lt;br /&gt;private String nome;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de Aluno:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.FetchType;&lt;br /&gt;import javax.persistence.JoinColumn;&lt;br /&gt;import javax.persistence.ManyToOne;&lt;br /&gt;import javax.persistence.PrimaryKeyJoinColumn;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "aluno", catalog = "mapeamentohibernate")&lt;br /&gt;@PrimaryKeyJoinColumn(name = "id") // id da tabela aluno&lt;br /&gt;public class Aluno extends Pessoa implements Serializable {&lt;br /&gt;&lt;br /&gt;@ManyToOne(fetch = FetchType.LAZY)&lt;br /&gt;@JoinColumn(name = "idturma")&lt;br /&gt;private Turma turma;&lt;br /&gt;&lt;br /&gt;@Column(name = "matricula")&lt;br /&gt;private String matricula;&lt;br /&gt;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de Professor:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.HashSet;&lt;br /&gt;import java.util.Set;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.FetchType;&lt;br /&gt;import javax.persistence.JoinColumn;&lt;br /&gt;import javax.persistence.JoinTable;&lt;br /&gt;import javax.persistence.ManyToMany;&lt;br /&gt;import javax.persistence.OneToMany;&lt;br /&gt;import javax.persistence.PrimaryKeyJoinColumn;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "professor", catalog = "mapeamentohibernate")&lt;br /&gt;@PrimaryKeyJoinColumn(name = "id") // id da tabela professor&lt;br /&gt;public class Professor extends Pessoa implements Serializable {&lt;br /&gt;&lt;br /&gt;@Column(name = "formacao")&lt;br /&gt;private String formacao;&lt;br /&gt;&lt;br /&gt;@OneToMany(fetch = FetchType.LAZY, mappedBy = "professor")&lt;br /&gt;private Set&amp;lt;ProfessorTurma&amp;gt; professorTurma =&lt;br /&gt;new HashSet&amp;lt;ProfessorTurma&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;@ManyToMany(fetch = FetchType.LAZY)&lt;br /&gt;@JoinTable(name = "disciplina_professor", catalog = "mapeamentohibernate",&lt;br /&gt;joinColumns = { @JoinColumn(name = "idprofessor", nullable = false,&lt;br /&gt;updatable =  false) }, inverseJoinColumns = {&lt;br /&gt;@JoinColumn(name = "iddisciplina", nullable = false, updatable = false) })&lt;br /&gt;private Set&amp;lt;Disciplina&amp;gt; disciplinas = new HashSet&amp;lt;Disciplina&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de Disciplina:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import static javax.persistence.GenerationType.IDENTITY;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.HashSet;&lt;br /&gt;import java.util.Set;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.FetchType;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.JoinColumn;&lt;br /&gt;import javax.persistence.JoinTable;&lt;br /&gt;import javax.persistence.ManyToMany;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "disciplina", catalog = "mapeamentohibernate")&lt;br /&gt;public class Disciplina implements Serializable {&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = IDENTITY)&lt;br /&gt;@Column(name = "id", unique = true, nullable = false)&lt;br /&gt;private Integer id;&lt;br /&gt;&lt;br /&gt;@Column(name = "nome")&lt;br /&gt;private String nome;&lt;br /&gt;&lt;br /&gt;@ManyToMany(fetch = FetchType.LAZY)&lt;br /&gt;@JoinTable(name = "disciplina_professor", catalog = "mapeamentohibernate",&lt;br /&gt;joinColumns = { @JoinColumn(name = "iddisciplina", nullable = false,&lt;br /&gt;updatable = false) }, inverseJoinColumns = {&lt;br /&gt;@JoinColumn(name = "idprofessor", nullable = false, updatable = false) })&lt;br /&gt;private Set&amp;lt;Professor&amp;gt; professores = new HashSet&amp;lt;Professor&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de Turma:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import static javax.persistence.GenerationType.IDENTITY;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.HashSet;&lt;br /&gt;import java.util.Set;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.FetchType;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.OneToMany;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "turma", catalog = "mapeamentohibernate")&lt;br /&gt;public class Turma implements Serializable {&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = IDENTITY)&lt;br /&gt;@Column(name = "id", unique = true, nullable = false)&lt;br /&gt;private Integer id;&lt;br /&gt;&lt;br /&gt;@Column(name = "descricao")&lt;br /&gt;private String descricao;&lt;br /&gt;&lt;br /&gt;@OneToMany(fetch = FetchType.LAZY, mappedBy = "turma")&lt;br /&gt;private Set&amp;lt;ProfessorTurma&amp;gt; professorTurma = new&lt;br /&gt;HashSet&amp;lt;ProfessorTurma&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;@OneToMany(fetch = FetchType.LAZY, mappedBy = "turma")&lt;br /&gt;private Set&amp;lt;Aluno&amp;gt; alunos = new HashSet&amp;lt;Aluno&amp;gt;(0);&lt;br /&gt;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mapeamento de ProfessorTurma:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import javax.persistence.AttributeOverride;&lt;br /&gt;import javax.persistence.AttributeOverrides;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Embeddable;&lt;br /&gt;import javax.persistence.EmbeddedId;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.FetchType;&lt;br /&gt;import javax.persistence.JoinColumn;&lt;br /&gt;import javax.persistence.ManyToOne;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;import javax.persistence.Temporal;&lt;br /&gt;import javax.persistence.TemporalType;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "professor_turma", catalog = "mapeamentohibernate")&lt;br /&gt;public class ProfessorTurma implements Serializable {&lt;br /&gt;&lt;br /&gt;@EmbeddedId&lt;br /&gt;@AttributeOverrides( { @AttributeOverride(name = "idturma", column =&lt;br /&gt;@Column(name = "idturma", nullable = false)), @AttributeOverride(name =&lt;br /&gt;"idprofessor", column = @Column(name = "idprofessor", nullable = false)) })&lt;br /&gt;private Id id;&lt;br /&gt;&lt;br /&gt;@ManyToOne(fetch = FetchType.LAZY)&lt;br /&gt;@JoinColumn(name = "idturma", nullable = false, insertable = false,&lt;br /&gt;updatable = false)&lt;br /&gt;private Turma turma;&lt;br /&gt;&lt;br /&gt;@ManyToOne(fetch = FetchType.LAZY)&lt;br /&gt;@JoinColumn(name = "idprofessor", nullable = false, insertable = false,&lt;br /&gt;updatable = false)&lt;br /&gt;private Professor professor;&lt;br /&gt;&lt;br /&gt;@Temporal(TemporalType.TIMESTAMP)&lt;br /&gt;@Column(name = "horario", length = 19)&lt;br /&gt;private Date horario;&lt;br /&gt;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;&lt;br /&gt;//Id da associacao (chave composta no banco)&lt;br /&gt;@Embeddable&lt;br /&gt;public static class Id implements Serializable {&lt;br /&gt;&lt;br /&gt;@Column(name = "idTurma", nullable = false)&lt;br /&gt;private Integer idTurma;&lt;br /&gt;&lt;br /&gt;@Column(name = "idProfessor", nullable = false)&lt;br /&gt;private Integer idProfessor;&lt;br /&gt;&lt;br /&gt;public Integer getIdTurma() {&lt;br /&gt;return this.idTurma;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setIdTurma(Integer idturma) {&lt;br /&gt;this.idTurma = idturma;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Integer getIdProfessor() {&lt;br /&gt;return this.idProfessor;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setIdProfessor(Integer idprofessor) {&lt;br /&gt;this.idProfessor = idprofessor;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public int hashCode() {&lt;br /&gt;final int prime = 31;&lt;br /&gt;int result = 1;&lt;br /&gt;result = prime * result + idProfessor;&lt;br /&gt;result = prime * result + idTurma;&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean equals(Object obj) {&lt;br /&gt;if (this == obj)&lt;br /&gt; return true;&lt;br /&gt;if (obj == null)&lt;br /&gt; return false;&lt;br /&gt;if (getClass() != obj.getClass())&lt;br /&gt; return false;&lt;br /&gt;Id other = (Id) obj;&lt;br /&gt;if (idProfessor != other.idProfessor)&lt;br /&gt; return false;&lt;br /&gt;if (idTurma != other.idTurma)&lt;br /&gt; return false;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note que, no caso N:M que não tem atributo intermediário (tabela disciplina_professor) , não há necessidade de uma classe para representar a associação. No caso em que há atributos intermediários, como o  da tabela professor_turma, temos que criar uma classe para representar a associação (classe ProfessorTurma).&lt;br /&gt;&lt;br /&gt;O banco de dados utilizado no exemplo foi o MySQL. Quem quiser fazer o download do script do banco basta acessar o link:&lt;br /&gt;&lt;a href="http://sites.google.com/site/csscode/Home/mapeamentohibernate.sql" &gt;http://sites.google.com/site/csscode/Home/mapeamentohibernate.sql&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Uma dica para quem não tem muita familiaridade com o mapeamento objeto-relacional é usar o &lt;a href="http://tools.hibernate.org/" target="_blank"&gt;hibernate tools&lt;/a&gt;.  O hibernate tools trata-se de um plugin do eclipse que auxilia na árdua e massante tarefa de mapear. Vale a pena conferir!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thiago Baesso Procaci&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-3169852104499793172?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/3169852104499793172/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=3169852104499793172' title='39 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/3169852104499793172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/3169852104499793172'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/04/mapeamento-objeto-relacional-com.html' title='Mapeamento objeto-relacional (ORM) com Hibernate – Uma abordagem prática'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gvkLbZiZda0/SfNl4PidFBI/AAAAAAAAAFo/uF6_mF86_Zk/s72-c/teste.png' height='72' width='72'/><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2682300885187196546.post-6883674137968025970</id><published>2009-04-23T18:05:00.001-07:00</published><updated>2009-05-30T18:36:54.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='spring-test'/><category scheme='http://www.blogger.com/atom/ns#' term='teste unitário'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Testes Unitários da Camada de Persistência com Spring, Hibernate e JUnit.</title><content type='html'>&lt;div xmlns=""&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;O teste unitário é uma modalidade de teste voltada para a verificação de “pedaços de software” (ou unidades) que funcionam de maneira independente das demais partes de um sistema. Em softwares construídos em linguagens orientadas a objetos, essas unidades podem ser uma classe ou um método. Em linhas gerais, busca-se com testes unitários garantir que uma parte isolada de um sistema funcione corretamente de acordo com o contexto em que ela se encontra.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Atualmente, em projetos de software, muito se tem visto testes unitários para a camada de persistência com objetivo de assegurar que os objetos que representam o domínio de dados serão salvos,  recuperados e excluídos corretamente. Em projetos em que há mudanças consideráveis no modelo de dados (devido a necessidade de adaptações ou mudança de requisitos) os testes unitários da camada de&lt;br /&gt;persistência mostram-se como uma ferramenta poderosa na verificação dos impactos das mudanças na persistência dos dados. Afinal, nada melhor que após mudanças no projeto averiguar que partes isoladas ainda descrevem o comportamento esperado.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Nesta postagem será mostrada uma forma eficiente e prática de testar a camada de persistência de uma aplicação através do uso do spring-test (parte do spring destinada a testes unitários), juntamente com o JUnit. Por questões de praticidade será utilizado o hibernate para o mapeamento objeto-relacional do exemplo.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Para iniciar o exemplo, vamos definir a classe Pessoa que representará a entidade que será persistida no banco de dados.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre name="code" class="java"&gt;import static javax.persistence.GenerationType.IDENTITY;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.GeneratedValue;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;import javax.persistence.Table;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("serial")&lt;br /&gt;@Entity&lt;br /&gt;@Table(name = "pessoa", catalog = "springtest")&lt;br /&gt;public class Pessoa implements Serializable {&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;@GeneratedValue(strategy = IDENTITY)&lt;br /&gt;@Column(name = "id", unique = true, nullable = false)&lt;br /&gt;private Integer id;&lt;br /&gt;@Column(name = "nome")&lt;br /&gt;private String nome;&lt;br /&gt;@Column(name = "idade")&lt;br /&gt;private Integer idade;&lt;br /&gt;// getters e setters omitidos&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Vamos também definir um DAO para pessoa cuja interface será:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre name="code" class="java"&gt;public interface PessoaDao {&lt;br /&gt;void save(Pessoa pessoa);&lt;br /&gt;void delete(Pessoa pessoa);&lt;br /&gt;Pessoa getById(Integer id);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Certamente para a classe que implementará a interface PessoaDao deverá ser definido um bean no contexto do spring.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Agora vamos montar os testes unitários da camada de persistência de pessoa utilizando o spring-test junto com o JUnit.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import static junit.framework.Assert.assertNotNull;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;import org.springframework.test.context.transaction.TransactionConfiguration;&lt;br /&gt;import org.springframework.transaction.annotation.Transactional;&lt;br /&gt;import com.springtest.dao.PessoaDao;&lt;br /&gt;import com.springtest.model.Pessoa;&lt;br /&gt;&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations = {"file:WebContent/WEB-INF/persistencia.xml" })&lt;br /&gt;@Transactional&lt;br /&gt;@TransactionConfiguration(defaultRollback = false)&lt;br /&gt;public class PessoaTest {&lt;br /&gt;@Autowired&lt;br /&gt;private PessoaDao pessoaDao;&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testSave() {&lt;br /&gt;Pessoa pessoa = new Pessoa();&lt;br /&gt;pessoa.setNome("Thiago Baesso Procaci");&lt;br /&gt;pessoa.setIdade(22);&lt;br /&gt;pessoaDao.save(pessoa);&lt;br /&gt;assertNotNull(pessoa.getId());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testDelete(){&lt;br /&gt;// implementacao do teste&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testUpdate(){&lt;br /&gt;// implementacao do teste&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;Através da classe de teste acima pode-se notar algumas facilidades que o spring-test e o JUnit oferecem através de anotações. Segue abaixo uma breve explicação de cada uma delas:&lt;br /&gt;&lt;/span&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;@RunWith(SpringJUnit4ClassRunner.class): anotação responsável por definir “quem” irá rodar os testes. No caso, aclasse SpringJUnit4ClassRunner já provê algumas facilidades para testes&lt;br /&gt;unitários que utilizam o spring;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;@ContextConfiguration: carrega o contexto do spring (beans) para serem utilizados na classe de teste;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span  lang="zxx" style="font-size:100%;"&gt;@Transactional&lt;/span&gt;&lt;span style="font-size:100%;"&gt; / &lt;/span&gt;&lt;span  lang="zxx" style="font-size:100%;"&gt;@TransactionConfiguration:&lt;/span&gt;&lt;span style="font-size:100%;"&gt; definem cada método de teste unitário como uma transação;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;@Autowired: Injeta os beans do spring para serem utilizados nos testes;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;@Test: definem os métodos que serão os testes unitários.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Enfim, testes em geral são fundamentais para a assegurar a qualidade de qualquer sistema. Achei essa abordagem com o spring-test muito interessante e prática para a confecção de testes unitários.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Para quem quiser mais detalhes sobre o funcionamento do spring-test acesse:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/testing.html" target="_blank"&gt;http://static.springframework.org/spring/docs/2.5.x/reference/testing.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Os fontes do exemplo estão disponíveis em:&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://sites.google.com/site/csscode/Home/Exemplo_Teste_Unitario.zip?attredirects=0"&gt;http://sites.google.com/site/csscode/Home/Exemplo_Teste_Unitario.zip?attredirects=0&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Abraço a todos!!!&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: left;" class="western"&gt;&lt;span style="font-size:100%;"&gt;Thiago Baesso Procaci&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2682300885187196546-6883674137968025970?l=thiagoprocaci.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thiagoprocaci.blogspot.com/feeds/6883674137968025970/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2682300885187196546&amp;postID=6883674137968025970' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/6883674137968025970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2682300885187196546/posts/default/6883674137968025970'/><link rel='alternate' type='text/html' href='http://thiagoprocaci.blogspot.com/2009/04/o-teste-unitario-e-uma-modalidade-de.html' title='Testes Unitários da Camada de Persistência com Spring, Hibernate e JUnit.'/><author><name>Thiago</name><uri>http://www.blogger.com/profile/03240600392549612980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_gvkLbZiZda0/Sf4sP92imwI/AAAAAAAAAF0/wZm5K2-7C-s/S220/5vBYeRGSJkJhTwWPFKTFbnwzw15nDXI4GMcZfQ-SxnScItsS95CzbYKoZkvoKKWx.jpg'/></author><thr:total>5</thr:total></entry></feed>
