<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>/home/ericogr/blog</title>
	<atom:link href="http://ericogr.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ericogr.wordpress.com</link>
	<description>Experiências no desenvolvimento de aplicações e afins</description>
	<lastBuildDate>Mon, 16 Jan 2012 01:46:43 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='ericogr.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>/home/ericogr/blog</title>
		<link>http://ericogr.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ericogr.wordpress.com/osd.xml" title="/home/ericogr/blog" />
	<atom:link rel='hub' href='http://ericogr.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Recuperando partições danificadas</title>
		<link>http://ericogr.wordpress.com/2009/06/11/recuperando-particoes-danificadas/</link>
		<comments>http://ericogr.wordpress.com/2009/06/11/recuperando-particoes-danificadas/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 04:53:33 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[so]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[hd]]></category>
		<category><![CDATA[ntfs]]></category>
		<category><![CDATA[recuperação]]></category>
		<category><![CDATA[recuperar]]></category>
		<category><![CDATA[sistema]]></category>
		<category><![CDATA[system rescue]]></category>
		<category><![CDATA[testdisk]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=104</guid>
		<description><![CDATA[Recuperar partições com problema<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=104&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Problema:</strong> depois de reparticionar o hd (sdb) utilizando as ferramentas do ubuntu server 9.04 e da instalação do grub, a partição NTFS (sda1) não pode mais ser montada (mount /dev/sdas1 /mnt -t ntfs). Ao tentar montar recebemos a mensagem:</p>
<p>The device &#8216;/dev/sda1&#8242; doesn&#8217;t have a valid NTFS.<br />
Maybe you selected the wrong device? Or the whole disk instead of a<br />
partition (e.g. /dev/hda, not /dev/hda1)? Or the other way around?</p>
<p>Nesta partição (sda1) está instalado o Windows XP e com este erro, não é possível montar e muito menos iniciar o sistema.</p>
<p>Ainda não descobri a causa do problema, na verdade, já realizei o processo de particionamento uma série de vezes e nunca tive problemas. De qualquer forma, eu preciso da minha partição de volta ou, pelo menos, dos dados contidos nela!</p>
<p><span style="color:#ff0000;"><em>A solução proposta aqui não se aplica a todos os casos, mas ela pode servir de base para solucionar outros tipos de problemas ligados a recuperação de partições danificadas. Como dizem por aí: siga os passos por conta e risco! Não venha reclamar que perdeu tudo porque seguiu os passos descritos aqui!<br />
</em></span></p>
<p><strong>Solução adotada:</strong></p>
<p>Depois de pesquisar em vários fóruns, achei um sistema operacional linux chamado System Rescue (http://www.sysresccd.org). Ele possui várias ferramentas interessantes para realizar recuperação de dados e uma delas é a testdisk (http://www.cgsecurity.org/wiki/TestDisk).</p>
<p>No meu caso, instalei a ferramenta no sistema operacional que já estava instalado na máquina em uma outra partição. Se eu não tivesse, uma boa opção seria utilizar o System Rescue mesmo (mais detalhes no site).</p>
<p><strong>Para instalar o testdisk no ubuntu digite: </strong>sudo apt-get install testdisk</p>
<p>O site http://www.cgsecurity.org/wiki/TestDisk traz uma série de informações sobre a ferramenta. Ela possui suporte para os seguintes sistemas de arquivo:</p>
<ul>
<li>BeFS ( BeOS )</li>
<li>BSD disklabel ( FreeBSD/OpenBSD/NetBSD )</li>
<li>CramFS, Compressed File System</li>
<li><em><span style="color:#800000;">DOS/Windows FAT12, FAT16 and FAT32</span></em></li>
<li>Windows exFAT</li>
<li>HFS, HFS+ and HFSX, Hierarchical File System</li>
<li>JFS, IBM&#8217;s Journaled File System</li>
<li><span style="color:#800000;"><em>Linux ext2 and ext3</em></span></li>
<li>Linux LUKS encrypted partition</li>
<li>Linux RAID md 0.9/1.0/1.1/1.2
<ul>
<li>RAID 1: mirroring</li>
<li>RAID 4: striped array with parity device</li>
<li>RAID 5: striped array with distributed parity information</li>
<li>RAID 6: striped array with distributed dual redundancy information</li>
</ul>
</li>
<li>Linux Swap (versions 1 and 2)</li>
<li>LVM and LVM2, Linux Logical Volume Manager</li>
<li>Mac partition map</li>
<li>Novell Storage Services NSS</li>
<li><em><span style="color:#800000;">NTFS ( Windows NT/2000/XP/2003/Vista/2008 )</span></em></li>
<li><span style="color:#800000;"><em>ReiserFS 3.5, 3.6 and 4</em></span></li>
<li>Sun Solaris i386 disklabel</li>
<li>Unix File System UFS and UFS2 (Sun/BSD/&#8230;)</li>
<li>XFS, SGI&#8217;s Journaled File System</li>
</ul>
<p>No meu caso, depois de instalar o testdisk, eu executei:</p>
<p>sudo su<br />
testdisk</p>
<p><strong>1. Selecione Create</strong> (se quiser criar um log)</p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p><strong></strong>TestDisk is a free data recovery software designed to help recover lost<br />
partitions and/or make non-booting disks bootable again when these symptoms<br />
are caused by faulty software, certain types of viruses or human error.<br />
It can also be used to repair some filesystem errors.</p>
<p>Information gathered during TestDisk use can be recorded for later<br />
review. If you choose to create the text file, testdisk.log , it<br />
will contain TestDisk options, technical information and various<br />
outputs; including any folder/file names TestDisk was used to find and<br />
list onscreen.</p>
<p>Use arrow keys to select, then press Enter key:<br />
<strong>[ Create ]  Create a new log file</strong><br />
[ Append ]  Append information to log file<br />
[ No Log ]  Don&#8217;t record anything</p>
<p><strong>2. Selecione o disco que tem as partições que serão recuperadas e selecione proceed. No meu caso foi /dev/sda:</strong></p>
<p><strong></strong>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>TestDisk is free software, and<br />
comes with ABSOLUTELY NO WARRANTY.</p>
<p>Select a media (use Arrow keys, then press Enter):<br />
<strong>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; ATA ST3160827AS</strong><br />
Disk /dev/sdb &#8211; 80 GB / 74 GiB &#8211; ATA ST380011A</p>
<p><strong>[Proceed ]</strong> [  Quit  ]</p>
<p><strong>3. Selecione o tipo de partição. No meu caso (e na maior parte dos outros) é a opção Intel</strong>:</p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; ATA ST3160827AS</p>
<p>Please select the partition table type, press Enter when done.<br />
<strong>[Intel  ]  Intel/PC partition</strong><br />
[EFI GPT]  EFI GPT partition map (Mac i386, some x86_64&#8230;)<br />
[Mac    ]  Apple partition map<br />
[None   ]  Non partitioned media<br />
[Sun    ]  Sun Solaris partition<br />
[XBox   ]  XBox partition<br />
[Return ]  Return to disk selection</p>
<p><strong>4. Selecione a opção advanced:</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63</p>
<p>[ Analyse  ]  Analyse current partition structure and search for lost partitions<br />
<strong>[ Advanced ]  Filesystem Utils</strong><br />
[ Geometry ]  Change disk geometry<br />
[ Options  ]  Modify options<br />
[ MBR Code ]  Write TestDisk MBR code to first sector<br />
[ Delete   ]  Delete all data in the partition table<br />
[ Quit     ]  Return to disk selection</p>
<p><strong>5. Agora selecione boot:</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63</p>
<p>Partition                  Start        End    Size in sectors<br />
1 * HPFS &#8211; NTFS              0   1  1 12157 254 63  195318207<br />
2 P FAT32                12158   0  1 17020 254 63   78124095 [NO NAME]<br />
3 E extended             17021   0  1 19456 254 63   39134340<br />
5 L HPFS &#8211; NTFS          17021   1  1 19456 254 63   39134277 [New Volume]</p>
<p>[  Type  ]  <strong>[  Boot  ]</strong> [Image Creation]  [  Quit  ]<br />
Boot sector recovery</p>
<p><strong>6. Nesta máquina estou com um problema no Boot Sector. Neste caso, selecione Org. BS. Observe a mensagem </strong><span style="color:#ff0000;">Sectors are not identical<span style="color:#000000;">:</span></span></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63<br />
Partition                  Start        End    Size in sectors<br />
1 * HPFS &#8211; NTFS              0   1  1 12157 254 63  195318207</p>
<p>Boot sector<br />
Status: OK</p>
<p>Backup boot sector<br />
Status: OK</p>
<p><span style="color:#ff0000;">Sectors are not identical.</span></p>
<p>A valid NTFS Boot sector must be present in order to access<br />
any data; even if the partition is not bootable.</p>
<p>[  Quit  ]  [  List  ]  <strong>[Org. BS ] </strong> [Backup BS]  [Rebuild BS]  [  Dump  ]</p>
<p><strong>7. Restaurar o backup dos setores de boot. Pressione Y:<br />
</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Copy original NTFS boot sector over backup boot, confirm ? (<strong>Y</strong>/N)</p>
<p><strong>8.Observe que agora não há divergencia no boot sector (Sectors are identical):</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63<br />
Partition                  Start        End    Size in sectors<br />
1 * HPFS &#8211; NTFS              0   1  1 12157 254 63  195318207</p>
<p>Boot sector<br />
Status: OK</p>
<p>Backup boot sector<br />
Status: OK</p>
<p><span style="color:#ff0000;">Sectors are identical.</span></p>
<p>A valid NTFS Boot sector must be present in order to access<br />
any data; even if the partition is not bootable.</p>
<p><strong>9. Agora vamos refazer setor de boot:</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63<br />
Partition                  Start        End    Size in sectors<br />
1 * HPFS &#8211; NTFS              0   1  1 12157 254 63  195318207</p>
<p>Boot sector<br />
Status: OK</p>
<p>Backup boot sector<br />
Status: OK</p>
<p>Sectors are identical.</p>
<p>A valid NTFS Boot sector must be present in order to access<br />
any data; even if the partition is not bootable.</p>
<p>[  Quit  ]  [  List  ]  <strong>[Rebuild BS]</strong> [Repair MFT]  [  Dump  ]</p>
<p><strong>10. Agora clique na opção Write:</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Disk /dev/sda &#8211; 160 GB / 149 GiB &#8211; CHS 19457 255 63<br />
Partition                  Start        End    Size in sectors<br />
1 * HPFS &#8211; NTFS              0   1  1 12157 254 63  195318207</p>
<p>filesystem size           195318207 195318207<br />
sectors_per_cluster       8 8<br />
mft_lcn                   786432 786432<br />
mftmirr_lcn               12207387 144959613018195227<br />
clusters_per_mft_record   -10 -127<br />
clusters_per_index_record 1 114<br />
Extrapolated boot sector and current boot sector are different.</p>
<p>[  Dump  ]  [  List  ]  <strong>[ Write  ]</strong> [  Quit  ]</p>
<p><strong>11. Confirme a gravação do novo boot pressionando Y:</strong></p>
<p>TestDisk 6.10, Data Recovery Utility, July 2008<br />
Christophe GRENIER &lt;grenier@cgsecurity.org&gt;</p>
<p>http://www.cgsecurity.org</p>
<p>Write new NTFS boot sector, confirm ? (<strong>Y</strong>/N)</p>
<p>Pressione q várias vezes até sair do programa.<br />
Neste ponto a partição deve estar pronta para ser utilizada. Você poderá monta-la e copiar seus dados para um local seguro.</p>
<p>Como este é um simples PC doméstico, não é sempre que faço backup dos meus dados e esta ferramenta foi a minha salvação. Quem sabe ela também não pode ser a sua!</p>
<br />Publicado em linux, so  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/104/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=104&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2009/06/11/recuperando-particoes-danificadas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalando o Oracle Database 11g 64bit no Ubuntu Server 9.04 64bit</title>
		<link>http://ericogr.wordpress.com/2009/05/17/instalando-o-oracle-database-11g-64bit-no-ubuntu-server-904-64bi/</link>
		<comments>http://ericogr.wordpress.com/2009/05/17/instalando-o-oracle-database-11g-64bit-no-ubuntu-server-904-64bi/#comments</comments>
		<pubDate>Sun, 17 May 2009 23:28:44 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[64 bit]]></category>
		<category><![CDATA[64 bits]]></category>
		<category><![CDATA[Configuracao]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[instalação]]></category>
		<category><![CDATA[instalar]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=41</guid>
		<description><![CDATA[Este post tem o objetivo de ajudar os iniciantes na instalação do Oracle 11g Database Server 64bit no Ubuntu Server 9.04 64bit.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=41&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		H3 { margin-bottom: 0.21cm } --></p>
<h3 class="western"><strong>Introdução</strong></h3>
<p class="western" align="justify">Neste post vou tentar ajudar os iniciantes, com um pouco de conhecimento em linux, na instalação do Oracle 11g Database Server 64bit no Ubuntu Server 9.04 64bit. Provavelmente os passos descritos aqui poderão ser utilizado com futuras versões do Ubuntu/Oracle.</p>
<p class="western" align="justify"><strong>Hardware:</strong> A máquina servidor utilizada na instalação foi um AMD64 3200 com 1 Gb de memória RAM, HD de 80Gb, placa de rede Wireless 802.11 g, Ubuntu Server 9.04 64bit usando o novo sistema de arquivos EXT4. A máquina cliente é um notebook HP básico com Ubuntu 9.04 Desktop 32bit.</p>
<p class="western" align="justify"><span style="color:#993300;"><span style="text-decoration:underline;">Os procedimentos a seguir foram executados por mim e não necessariamente representam a melhor forma de se fazer a instalação.<br />
</span></span></p>
<p class="western" align="justify"><strong>Resumo:</strong> para instalar o <em>Oracle Database Server</em> na máquina servidor, que NÃO vem com suporte para aplicações gráficas (por padrão), você precisará de uma máquina cliente, que TEM esse suporte. Presumindo que não temos acesso fácil ao servidor, poderemos usar o aplicativo ssh para conectar, executar as configurações necessárias e no final, enviar as telas que o instalador mostraria no servidor para a máquina cliente. Não vou entrar nos detalhes técnicos de como isso funciona, um outro post seria necessário só para este assunto. É importante lembrar que <span style="text-decoration:underline;">durante</span> a instalação do Ubuntu Server, você instale também o OpenSSH para executar os passos aqui descritos remotamente. Não é recomendado instalar o servidor <span style="text-decoration:underline;">gráfico</span> na máquina servidor.</p>
<p class="western" align="justify">O que motivou a criação deste post foi a falta de informações disponíveis em português para alguns problemas encontrados na instalação da versão 64bit, problemas que não ocorrem na versão 32bit do Ubuntu.</p>
<p class="western" align="justify">Não fornecerei detalhes sobre a instalação do Ubuntu (Server/Desktop), você poderá procurar algum tutorial para isso na internet, mas acredito ser bastante simples.</p>
<h3 class="western"><strong>Instalação do Banco de Dados</strong></h3>
<p class="western" align="justify">Depois de instalado o sistema operacional e da rede entre a máquina servidor e a cliente estar configurada, precisamos efetuar algumas alterações recomendadas pela Oracle para que o banco de dados funcione adequadamente. É importante lembrar que o Ubuntu não é homologado para a instalação do Oracle Database Server.</p>
<p class="western"><span style="color:#ff6600;"><strong>Abaixo, colocarei uma longa &#8220;receita de bolo&#8221; que vai facilitar a configuração.</strong></span></p>
<p class="western" align="justify"><strong>Observações:</strong><br />
<span style="color:#000080;">1. O símbolo $ indica que os comandos devem ser executados com o usuário normal<br />
2. O símbolo # indica que os comandos devem ser executados como root ($ sudo su)<br />
3. Onde houver o símbolo S, os comandos devem ser executados no servidor e onde tiver o C, no cliente. Ex 01S indica que os comandos serão executados no servidor (usando o ssh).<br />
4. Para conectar no servidor remoto, utilize o ssh &lt;máquina&gt;. Ex: ssh 192.168.0.100<br />
5. A versão servidor do Ubuntu não vem com o X, portanto a instalação será feita a partir de outra máquina com um servidor X instalado (Ubuntu Desktop por exemplo).</span></p>
<p class="western"><span style="color:#000080;">Vamos lá&#8230;</span></p>
<p class="western"><span style="color:#993300;"><strong>01S. Atualize o sistema</strong></span><br />
# apt-get update<br />
# apt-get dist-upgrade</p>
<p class="western"><span style="color:#993300;"><strong>02S. Baixar pacotes requeridos</strong></span><br />
# apt-get install gcc make binutils gawk x11-utils rpm alien ksh lsb-rpm libaio1 lesstif2 libmotif3 unzip</p>
<p class="western"><span style="color:#993300;"><strong>03S. Alterar link simbólico</strong></span><br />
# ln -sf /bin/bash /bin/sh</p>
<p class="western"><span style="color:#993300;"><strong>04S. Criar links simbólicos para alguns programas</strong></span><br />
# ln -s /usr/bin/awk /bin/awk<br />
# ln -s /usr/bin/rpm /bin/rpm<br />
# ln -s /usr/bin/basename /bin/basename<br />
# ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so</p>
<p class="western"><span style="color:#993300;"><strong>05S. Adicionar o grupo oinstall, dba e nobody</strong></span><br />
# addgroup oinstall<br />
# addgroup dba<br />
# addgroup nobody</p>
<p class="western"><span style="color:#993300;"><strong>06S. Alterar o GID do grupo padrão do usuário para o valor especificado</strong></span><br />
# usermod -g nobody nobody</p>
<p class="western"><span style="color:#993300;"><strong>07S. Criar diretório de usuário Oracle</strong></span><br />
# mkdir /home/oracle</p>
<p class="western"><span style="color:#993300;"><strong>08S. Alterar os donos do diretório de usuário Oracle</strong></span><br />
# chown -R oracle:dba /home/oracle</p>
<p class="western"><span style="color:#993300;"><strong>09S. Adicionar usuário oinstall com senha password</strong></span><br />
# useradd -g oinstall -G dba -p password -d /home/oracle -s /bin/bash oracle</p>
<p class="western"><span style="color:#993300;"><strong>10S. Adicionar comando &#8220;su oracle&#8221; ao visudo para que todos os usuários do grupo admin possam entrar com usuário oracle sem senha (passo opcional)<br />
</strong></span># visudo</p>
<p class="western">Na última linha do arquivo adicionar:<br />
%admin ALL=NOPASSWD:/bin/su oracle</p>
<p class="western">Para testar digite no prompt<br />
$ sudo su oracle</p>
<p class="western"><span style="color:#993300;"><strong>11S. Criar /etc/rc.d e seus links</strong></span><br />
# mkdir /etc/rc.d<br />
# for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done</p>
<p class="western"><span style="color:#993300;"><strong>12S. Criar diretório para a instalação e alterar as permissões</strong></span><br />
# mkdir -p /u01/app/oracle<br />
# chown -R oracle:dba /u01</p>
<p class="western"><span style="color:#993300;"><strong>13S. Criar e alterar o dono da pasta onde estará o instalador</strong></span><br />
# mkdir /home/oracle/inst<br />
# chown -R oracle:oinstall /home/oracle/inst</p>
<p class="western"><span style="color:#993300;"><strong>14S. Alterar os parâmetros de configuração do kernel</strong></span><br />
# cd /etc<br />
# cp sysctl.conf sysctl.conf.original<br />
# pico sysctl.conf</p>
<p class="western">#Linhas para serem adicionadas no final do arquivo<br />
fs.file-max = 65535<br />
kernel.shmall = 2097152<br />
kernel.shmmax = 2147483648<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
net.ipv4.ip_local_port_range = 1024 65535<br />
net.core.rmem_default = 4194304<br />
net.core.rmem_max = 4194304<br />
net.core.wmem_default = 262144<br />
net.core.wmem_max = 262144</p>
<p class="western"><span style="color:#993300;"><strong>15S. Modificar o arquivo /etc/security/limits.conf que impõe limites para usuários</strong></span><br />
# cd /etc/security/<br />
# cp limits.conf limits.conf.original<br />
# pico /etc/security/limits.conf</p>
<p class="western">#estas configurações devem ser adicionadas no final do arquivo<br />
oracle soft nproc 2047<br />
oracle hard nproc 16383<br />
oracle soft nofile 1023<br />
oracle hard nofile 65535</p>
<p class="western"><span style="color:#993300;"><strong>16S. Modificar configurações de segurança</strong></span><br />
# cd /etc/pam.d<br />
# cp login login.original<br />
# pico login</p>
<p class="western">#adicionar as linhas no final do arquivo<br />
session required /lib/security/pam_limits.so<br />
session required pam_limits.so</p>
<p class="western"><span style="color:#993300;"><strong>17S. Reinicie o sistema</strong></span><br />
# reboot</p>
<p class="western"><span style="color:#993300;"><strong>18S. Entre com o usuário Oracle</strong></span><br />
$ sudo su oracle</p>
<p class="western"><span style="color:#993300;"><strong>19C. Desative os efeitos visuais (caso estejam ativados)</strong></span></p>
<p class="western"><span style="color:#000000;">Na máquina onde serão exibidas as telas do instalador as telas podem não ser exibidas corretamente se os efeitos visuais estiverem habilitados.</span></p>
<p class="western" style="border:medium none;padding:0;">- Clique em Sistema&gt;Preferências&gt;Aparência e clique na guia <strong>Efeitos Visuais</strong><br />
- Clique em <strong>Nenhum</strong> e depois em <strong>Fechar</strong></p>
<p class="western"><span style="color:#993300;"><strong>20C. Verifique se a máquina está com as conexões TCP para o servidor X habilitadas</strong></span><br />
- Clique no menu Sistema&gt;Administração&gt;<strong>Janela de inicio de sessão</strong><br />
- Clique na aba <strong>Segurança</strong><br />
- <span style="text-decoration:underline;">Desabilite</span> a opção &#8220;<strong>Negar conexões TCP para o servidor X</strong>&#8221; (caso esteja marcado)</p>
<p class="western"><span style="color:#993300;"><strong>21C. Habilite a conexão TCP do servidor para a máquina cliente indicando o IP do servidor</strong></span><br />
# xhost +192.168.0.100</p>
<p class="western"><span style="color:#993300;"><strong>22S. Montar o dispositivo com os arquivos da instalação do oracle.</strong></span><br />
No meu caso é um drive de dvd que está em /dev/scd0. Substitua o /dev/scd0 de acordo com as configurações do seu sistema.<br />
# if [ ! -e /media/cdrom ]; then mkdir -p /media/cdrom; fi<br />
# mount /dev/scd0 /media/cdrom</p>
<p class="western"><span style="color:#993300;"><strong>23S. Copiar o arquivo de instalação do dispositivo</strong></span><br />
Copiar os arquivos do dvd/pendrive para a pasta /home/oracle/database. No meu caso, os arquivos estão na pasta linux do dvd.<br />
# cp /media/cdrom/linux/linux.x64_11gR1_database_*.zip /home/oracle/inst</p>
<p class="western"><span style="color:#993300;"><strong>24S. Descompactado o arquivo de instalação do oracle.</strong></span><br />
# cd /home/oracle/inst<br />
# unzip *.zip<br />
# chown -R oracle.oinstall /home/oracle/inst</p>
<p class="western"><span style="color:#993300;"><strong>25S. Algum bug ao descompactar alguns arquivos me obrigaram a criar esta gambiarra (isso ocorreu na versão 64bit)</strong></span></p>
<p class="western">#sudo su oracle<span style="color:#993300;"><strong><br />
</strong></span>$ mv /home/oracle/inst/database/install/unzip /home/oracle/inst/database/install/unzip.bak<br />
$ ln -s $(which unzip) /home/oracle/inst/database/install/unzip</p>
<p class="western"><span style="color:#993300;"><strong>26S. Executar a instalação exportando o display para a máquina cliente<br />
</strong></span>* Lembre-se que 192.168.0.105 é a máquina que tem o servidor X instalado (onde as imagens do instalador devem aparecer)<br />
# export DISPLAY=192.168.0.105:0.0<br />
# /home/oracle/inst/database/runInstaller -ignoreSysPrereqs</p>
<p class="western"><span style="color:#ff0000;">* Durante a instalação, pode ocorrer um erro ao executar um determinado processo. Ignore e prossiga com o procedimento.</span></p>
<p class="western">Abaixo coloquei algumas telas do instalador. Você pode observar as opções que eu usei para configurar a sua instalação.</p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela01.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 1" width="642" height="512" align="bottom" /><strong><br />
Tela inicial do instalador</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela02.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 2" width="642" height="512" align="bottom" /><strong><br />
Usar o grupo dba</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela03.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 3" width="642" height="512" align="bottom" /><strong><br />
Marcar a versão Enterprise Edition</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela04.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 4" width="642" height="512" align="bottom" /><strong><br />
Mudar o ORACLE_HOME</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela05.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 5" width="642" height="512" align="bottom" /><strong><br />
Clique nas caixas de seleção de requisitos que estão em branco para que sejam marcadas como &#8220;verificadas pelo usuário&#8221;</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela07.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 7" width="642" height="512" align="bottom" /><strong><br />
Optar por instalar somente o software. O banco de dados poderá ser configurado depois</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela08.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 8" width="642" height="512" align="bottom" /><strong><br />
Mudei os privilégios dos grupos do sistema operacional para dba</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela09.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 9" width="642" height="512" align="bottom" /><strong><br />
Finalmente o sumário</strong></p>
<p class="western" align="center"><strong>A instalação deve demorar alguns minutos&#8230;</strong></p>
<p style="text-align:center;"><img class="aligncenter" style="border:0 none;" src="http://ericogr.files.wordpress.com/2009/05/erro01.png?w=460&#038;h=229" border="0" alt="Instalação do Oracle 11g 64bit - Erro 1" width="460" height="229" align="bottom" /><strong>Devem ocorrer dois erros como este durante a instalação. Estes erros não impedem a utilização do banco de dados</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/listadescripts.png?w=552&#038;h=390" border="0" alt="Instalação do Oracle 11g 64bit - Lista De Scripts" width="552" height="390" align="bottom" /><br />
<strong>Nesta tela são exibidos os scripts que devem ser executados como root</strong></p>
<p class="western" align="center"><img src="http://ericogr.files.wordpress.com/2009/05/tela10.png?w=642&#038;h=512" border="0" alt="Instalação do Oracle 11g 64bit - Tela 10" width="642" height="512" align="bottom" /><strong><br />
Finalizamos a instalação</strong></p>
<p class="western"><span style="color:#993300;"><strong>27S. Editar o arquivo /etc/environment<br />
</strong></span><span style="color:#000000;"><span style="font-weight:normal;"># pico /etc/environment</span></span></p>
<p class="western" style="font-weight:normal;"><span style="color:#000000;">Coloque o seguinte conteúdo:</span></p>
<p class="western" style="font-weight:normal;"><span style="color:#000000;">ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1<br />
PATH=&#8221;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/u01/app/oracle/product/11.1.0/db_1/bin&#8221;</span></p>
<p class="western"><span style="color:#993300;"><strong>28S. Criar o arquivo oracledb</strong></span><br />
Depois de ter instalado o banco de dados, vamos criar o arquivo /etc/init.d/oracledb:</p>
<p class="western"># pico /etc/init.d/oracledb</p>
<p class="western"><strong>Conteúdo do arquivo:</strong></p>
<p class="western">#!/bin/bash<br />
#<br />
# /etc/init.d/oracledb<br />
#<br />
# Run-level Startup script for the Oracle Listener and Instances<br />
# It relies on the information on /etc/oratab<br />
export ORACLE_BASE=/u01/app/oracle<br />
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1<br />
export ORACLE_OWNR=oracle<br />
export PATH=$PATH:$ORACLE_HOME/bin<br />
if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]<br />
then<br />
echo &#8220;Oracle startup: cannot start&#8221;<br />
exit 1<br />
fi<br />
case &#8220;$1&#8243; in<br />
start)<br />
# Oracle listener and instance startup<br />
echo -n &#8220;Starting Oracle: &#8220;<br />
su $ORACLE_OWNR -c &#8220;$ORACLE_HOME/bin/lsnrctl start&#8221;<br />
su $ORACLE_OWNR -c &#8220;$ORACLE_HOME/bin/dbstart $ORACLE_HOME&#8221;<br />
touch /var/lock/oracle<br />
echo &#8220;OK&#8221;<br />
;;<br />
stop)<br />
# Oracle listener and instance shutdown<br />
echo -n &#8220;Shutdown Oracle: &#8220;<br />
su $ORACLE_OWNR -c &#8220;$ORACLE_HOME/bin/lsnrctl stop&#8221;<br />
su $ORACLE_OWNR -c &#8220;$ORACLE_HOME/bin/dbshut $ORACLE_HOME&#8221;<br />
rm -f /var/lock/oracle<br />
echo &#8220;OK&#8221;<br />
;;<br />
reload|restart)<br />
$0 stop<br />
$0 start<br />
;;<br />
*)<br />
echo &#8220;Usage: `basename $0` start|stop|restart|reload&#8221;<br />
exit 1<br />
esac<br />
exit 0</p>
<p class="western"><span style="color:#993300;"><strong>29S. Configurar a execução automática</strong></span><br />
# chmod a+x /etc/init.d/oracledb<br />
# update-rc.d oracledb defaults 99</p>
<p class="western"><span style="color:#993300;"><strong>30S. Crie o banco de dados usando o SID orasrv</strong></span></p>
<p class="western" style="font-weight:normal;"><span style="color:#000000;">Observe que você deve alterar o endereço IP 192.168.0.105 para o da sua máquina cliente!</span></p>
<p class="western">$ sudo su oracle<br />
$ export DISPLAY=192.168.0.105:0.0<br />
$ export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1<br />
$ export PATH=&#8221;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/u01/app/oracle/product/11.1.0/db_1/bin&#8221;<br />
$ dbca</p>
<p class="western"><span style="color:#993300;"><strong>31. Automatizar a execução do Oracle no boot:</strong></span><br />
# pico /etc/oratab</p>
<p class="western" style="font-weight:normal;">Altere o último caractere de N para Y assim (exemplo):</p>
<p class="western"><span style="color:#ff6600;">[original] orasrv:/u01/app/oracle/product/11.1.0/db_1:N</span><br />
<span style="color:#008000;">[alterado] orasrv:/u01/app/oracle/product/11.1.0/db_1:Y</span></p>
<p class="western">* A última linha só existirá depois que o banco de dados for criado.</p>
<p class="western"><span style="color:#800000;"><strong>&#8220;E chegamos ao fim, espero que você tenha conseguido seguir os passos descritos aqui. Se tiver alguma sugestão, por favor, deixe seu comentário</strong></span>&#8220;.</p>
<br />Publicado em banco de dados, oracle  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=41&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2009/05/17/instalando-o-oracle-database-11g-64bit-no-ubuntu-server-904-64bi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela01.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 1</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela02.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 2</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela03.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 3</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela04.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 4</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela05.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 5</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela07.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 7</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela08.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 8</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela09.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 9</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/erro01.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Erro 1</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/listadescripts.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Lista De Scripts</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/05/tela10.png" medium="image">
			<media:title type="html">Instalação do Oracle 11g 64bit - Tela 10</media:title>
		</media:content>
	</item>
		<item>
		<title>Utilizando Bulk Collect no Oracle</title>
		<link>http://ericogr.wordpress.com/2009/05/15/utilizando-bulk-collect-no-oracle/</link>
		<comments>http://ericogr.wordpress.com/2009/05/15/utilizando-bulk-collect-no-oracle/#comments</comments>
		<pubDate>Fri, 15 May 2009 19:30:50 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[bulk collect]]></category>
		<category><![CDATA[coleção]]></category>
		<category><![CDATA[coleções]]></category>
		<category><![CDATA[collect]]></category>
		<category><![CDATA[count]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[limit]]></category>
		<category><![CDATA[memória]]></category>
		<category><![CDATA[PGA]]></category>
		<category><![CDATA[usando]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=72</guid>
		<description><![CDATA[Utilizar Bulk Collect pode aumentar o desempenho de sua aplicação que utiliza o banco de dados Oracle<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=72&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uma forma eficiente para manipularmos grandes quantidades de dados pode ser a utilização de BULK COLLECT. Se utilizarmos corretamente, podemos ter um grande ganho no desempenho das aplicações, pois os dados manipulados pelas coleções ficam armazenados diretamente na memória. Por outro lado, podemos ter problemas se os limites para a quantidade de dados carregados em memória não for dimensionado corretamente. Para cada sessão de usuário, o Oracle alocará espaço em uma área de memória chamada PGA (Program Global Area). Se tivermos 100 usuários conectados simultaneamente utilizando os recursos uma coleção que ocupa 10Mb em memória, teremos um consumo total de 1Gb!</p>
<p>Felizmente podemos limitar os dados que são armazenados nas coleções usando a clausula LIMIT. Desta forma, podemos analisar a relação custo/benefício concedendo limites maiores ou menores para nossa coleção.</p>
<p><span style="color:#ff0000;">É importante lembrar que do Oracle Database 10g em diante os cursores (FOR LOOPS) são automaticamente otimizados para velocidades próximas as do BULK COLLECT.</span></p>
<p>Vamos ver na prática como tudo isso funciona.</p>
<p><strong>Criar tabela teste:</strong></p>
<p>create table tab19x (<br />
id number(5),<br />
nome varchar2(30),<br />
constraint tab19x_pk primary key (id));</p>
<p><strong>Popular a tabela:</strong></p>
<p>begin<br />
insert into tab19x<br />
select level, dbms_random.string(&#8216;a&#8217;, 30) from dual connect by level &lt;= 123;<br />
commit;<br />
end;</p>
<p>Abaixo temos um bloco de código PL/SQL anônimo, onde temos um BULK COLLECT limitando a coleção para 50 registros. Isso significa que cada vez que os dados são lidos do cursor, no máximo 50 registros por vez são alocados na memória. Toda vez que a coleção for carregada, uma mesma quantidade de memória será alocada na PGA, mesmo que a tabela aumente de tamanho em número de linhas.</p>
<p><strong>Utilizando o BULK COLLECT</strong></p>
<p>declare<br />
cursor cur_tab19x is<br />
select id, nome<br />
from tab19x;</p>
<p>&#8211;Abaixo crio o tipo para a coleção<br />
type trow_tab19x is table of cur_tab19x%rowtype<br />
index by pls_integer;</p>
<p>&#8211;Declaro a coleção row_tab19x<br />
row_tab19x trow_tab19x;<br />
begin<br />
open cur_tab19x;<br />
loop<br />
fetch cur_tab19x BULK COLLECT into row_tab19x limit 50;</p>
<p>&#8211;NÃO use: exit when cur_tab19x%notfound;<br />
exit when row_tab19x.count = 0;</p>
<p>for i in 1..row_tab19x.count<br />
loop<br />
dbms_output.put_line(&#8216;Cod: &#8216; || row_tab19x(i).id || &#8216; valor: &#8216; || row_tab19x(i).nome);<br />
end loop;<br />
end loop;<br />
close cur_tab19x;<br />
end;</p>
<p><strong>Quando utilizamos BULK COLLECT precisamos lembrar que:</strong></p>
<ul>
<li>As coleções são preenchidas sequencialmente, iniciando do índice valor 1;</li>
<li>Interagir com a coleção de 1 até <em>coleção</em>.COUNT;</li>
<li>A coleção é vazia quando não tivermos mais linhas depois de um fetch;</li>
<li>Sempre utilize o método <em>coleção</em>.COUNT para ver se existem mais linhas para serem processadas;</li>
<li>Ignore os valores retornados pelos atributos do cursor, especialmente o <em>cursor</em>%NOTFOUND;</li>
</ul>
<p><strong>Fonte:</strong> http://www.oracle.com/technology/oramag/oracle/08-mar/o28plsql.html</p>
<br />Publicado em banco de dados, oracle  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/72/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=72&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2009/05/15/utilizando-bulk-collect-no-oracle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalando Java Sun 6 Update XX no Ubuntu X.XX</title>
		<link>http://ericogr.wordpress.com/2009/02/05/instalando-javasun-ubuntu/</link>
		<comments>http://ericogr.wordpress.com/2009/02/05/instalando-javasun-ubuntu/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 03:03:26 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Configuracao]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[so]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[instalação]]></category>
		<category><![CDATA[instalar]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=29</guid>
		<description><![CDATA[Instalação e configuração manual do kit de desenvolvimento java fornecido pela Sun no sistema Ubuntu 32bit<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=29&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<p>Depois de uma breve busca no google, desisti de procurar e resolvi tentar resolver os problemas que tive por conta própria. Sou desenvolvedor e usuário do Ubuntu há algum tempo e adoro a praticidade do sistema, porém, a versão de alguns programas instalados pelo apt-get nem sempre é a mais recente. Este é o caso da instalação do JDK.</p>
<p>Este documento fornece algumas dicas para instalar a última versão disponível do java Sun no Ubuntu.</p>
<p><strong><span style="color:#ff0000;">Testado com Ubuntu 9.04/8.10 e JDK 1.6.0_13/JDK 1.6.0_12 mas deve funcionar com versões mais recentes do Ubuntu/JDK.</span></strong></p>
<h2><span style="text-decoration:underline;"><strong>Removendo a instalação antiga do JDK</strong></span></h2>
<p>1. Remova todos os pacotes instalados da versão anterior (caso tenha instalado). Acho que a maneira mais fácil é ir até o Gerenciador de pacotes Synaptic, digitar  sun-jdk (se foi instalada a versão da sun) na procura e remover todas os pacotes que fazem referencia a ele.</p>
<div id="attachment_28" class="wp-caption aligncenter" style="width: 547px"><img class="size-full wp-image-28" title="synaptic" src="http://ericogr.files.wordpress.com/2009/02/synaptic.jpg" alt="synaptic" width="537" height="280" /><p class="wp-caption-text">synaptic</p></div>
<h2><span style="text-decoration:underline;"><strong>Download da nova versão</strong></span></h2>
<p>2. Efetuar o download pelo site da Sun: http://java.sun.com/javase/downloads/index.jsp</p>
<p>Na figura abaixo, temos o JDK 6 Update 12 (jdk-6u12-linux-i586.bin) mas você deve fazer download do mais atual</p>
<div id="attachment_30" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-30" title="download-java-site-sun" src="http://ericogr.files.wordpress.com/2009/02/download-java.jpg?w=300&#038;h=178" alt="download-java-site-sun" width="300" height="178" /><p class="wp-caption-text">download-java-site-sun</p></div>
<h2><span style="text-decoration:underline;"><strong>Configuração</strong></span></h2>
<p>3. Os comandos agora devem ser executados como root:</p>
<p><em><strong>sudo su </strong></em></p>
<p>4. Depois que o download terminar, abra o console, entre na pasta onde está o arquivo e digite:</p>
<p><em><strong>chmod 550 jdk-6u12-linux-i586.bin</strong></em></p>
<p><em><strong>./jdk-6u12-linux-i586.bin </strong></em></p>
<p><span style="color:#ff0000;"><em><strong>* </strong></em>lembre-se de mudar o nome do arquivo caso tenha feito download de uma versão mais recente</span></p>
<p>Leia os termos e concorde. Isso irá descompactar os arquivos na pasta atual.</p>
<p>5. Eu gosto de manter os programas instalados manualmente na pasta /opt, então, vou mover o arquivo para lá:</p>
<p><em><strong>mv jdk1.6.0_12 /opt </strong></em></p>
<p><em><strong>cd /opt </strong></em></p>
<p><span style="color:#ff0000;"><em><strong>* </strong></em>lembre-se de mudar o nome da pasta caso tenha feito download de uma versão mais recente.<br />
</span></p>
<p>6. Criar o link simbólico. Este passo não é obrigatório, mas é interessante no caso de uma nova versão do java (1.6.0_13 por exemplo). Será necessário somente recriar o link simbólico sem precisar alterar outros arquivos de configuração:</p>
<p><em><strong>ln -s jdk1.6.0_12 jdk </strong></em></p>
<p><span style="color:#ff0000;"><em><strong>* </strong></em>lembre-se de mudar o nome da pasta caso tenha feito download de uma versão mais recente</span></p>
<p>7. Vamos alterar os parâmetros de ambiente abrindo o arquivo /etc/environment. Eu uso o vi, mas vc pode substitui-lo por gedit por exemplo. Veja:</p>
<p><em><strong>vi /etc/environment </strong></em></p>
<p>ou se preferir, use o gedit:</p>
<p><em><strong>gedit /etc/environment </strong></em></p>
<p>no inicio do arquivo, adicione a linha:</p>
<p><em><strong>JAVA_HOME=&#8221;/opt/jdk&#8221; </strong></em></p>
<p>e onde está PATH=&#8221;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games&#8221; adicione<em>:</em></p>
<p><em>:<strong>/opt/jdk</strong></em><em><strong>/bin </strong></em></p>
<p>deve ficar assim: PATH=&#8221;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games<span style="color:#ff0000;">:/opt/jdk/bin</span>&#8220;</p>
<p>=&gt; Lembre-se que a linha do PATH é somente um exemplo. Ela pode variar de acordo com as suas configurações. O importante é adicionar JAVA_HOME e incluir mais um parâmetro no PATH como foi descrito acima.</p>
<p>8. Instalar o plugin do java no browser firefox. Este foi o mais chato&#8230; eu não conseguia achar uma dica que funcionasse (eu tb não pesquisei muito). Os caminhos apontados pelos tutoriais que achei não resolviam o problema. Eu sabia que tinha que criar um link simbólico para a biblioteca, mas nada dava certo&#8230;  O segredo é criar o link simbólico no lugar certo. Veja:</p>
<p><em><strong>cd /usr/lib/firefox-addons/plugins </strong></em></p>
<p><em><strong>ln -sf /opt/jdk/jre/plugin/i386/ns7/libjavaplugin_oji.so </strong></em></p>
<p>Abra o firefox e veja se o plugin foi instalado corretamente. Digite no endereço:</p>
<p><em><strong>about:plugins</strong></em></p>
<p>Deve aparecer uma página com os plugins instalados. Procure pelo do java conforme a figura abaixo:<em><strong><br />
</strong></em></p>
<div id="attachment_31" class="wp-caption aligncenter" style="width: 284px"><img class="size-medium wp-image-31" title="plugin-java-instalado-firefox" src="http://ericogr.files.wordpress.com/2009/02/javanofirefox.jpg?w=274&#038;h=300" alt="plugin-java-instalado-firefox" width="274" height="300" /><p class="wp-caption-text">plugin-java-instalado-firefox</p></div>
<p>9. Reinicie o computador, entre no console e digite:</p>
<p><em><strong>java -version</strong></em></p>
<p>e depois:</p>
<p><em><strong>javac -version</strong></em></p>
<p>Deve aparecer algo assim:</p>
<p><em>java version &#8220;1.6.0_12&#8243;<br />
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)<br />
Java HotSpot(TM) Server VM (build 11.2-b01, mixed mode)</em></p>
<p><em>javac 1.6.0_12</em></p>
<p>Pronto, você acabou de instalar a versão mais recente do JDK no seu sistema.</p>
<p>Abs!</p>
<br />Publicado em Configuracao, Java, linux, so  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/29/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=29&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2009/02/05/instalando-javasun-ubuntu/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/02/synaptic.jpg" medium="image">
			<media:title type="html">synaptic</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/02/download-java.jpg?w=300" medium="image">
			<media:title type="html">download-java-site-sun</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2009/02/javanofirefox.jpg?w=274" medium="image">
			<media:title type="html">plugin-java-instalado-firefox</media:title>
		</media:content>
	</item>
		<item>
		<title>Controle Remoto Caseiro (4 canais)</title>
		<link>http://ericogr.wordpress.com/2009/01/15/controle-remoto-caseiro-4-canais/</link>
		<comments>http://ericogr.wordpress.com/2009/01/15/controle-remoto-caseiro-4-canais/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 00:24:54 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Eletrônica]]></category>
		<category><![CDATA[controle remoto]]></category>
		<category><![CDATA[L293D]]></category>
		<category><![CDATA[pic]]></category>
		<category><![CDATA[pic16f628]]></category>
		<category><![CDATA[ponte h]]></category>
		<category><![CDATA[rxtx]]></category>
		<category><![CDATA[rxtx 433mhz]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=17</guid>
		<description><![CDATA[Video que demonstra o uso de módulos RXTX 433Mhz e microcontroladores PIC na construção de um controle remoto.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=17&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Criei um vídeo que demonstra a utilização dos módulos de transmissão e recepção de 433mhz encontrados facilmente na internet e na Santa Ifigênia em São Paulo. Neste circuito, utilizei dois micro controladores PIC16F628A (um para o transmissor e outro para o receptor), dois reguladores de tensão LM7805 e um CI L293D para a ponte H. Tudo muito simples, mas interessante. Nos testes, consegui chegar a distâncias superiores a 100 m em campo aberto (o tamanho correto da antena é muito importante). Criei também um protocolo simples para transmissão e validação de dados.Tudo criado com informações que consegui reunir na internet. Viva o google!</p>
<p style="text-align:center;">
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='http://www.youtube.com/embed/Qrfah5dxRxc?version=3&amp;rel=1&amp;fs=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent' frameborder='0'></iframe></span>
<br />Publicado em Eletrônica  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=17&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2009/01/15/controle-remoto-caseiro-4-canais/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Usando Callback Listeners com JPA</title>
		<link>http://ericogr.wordpress.com/2008/04/28/usando-callback-listeners-jpa/</link>
		<comments>http://ericogr.wordpress.com/2008/04/28/usando-callback-listeners-jpa/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 12:29:03 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[callback]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[listeners]]></category>
		<category><![CDATA[ouvinte]]></category>
		<category><![CDATA[persistence]]></category>
		<category><![CDATA[persistencia]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=14</guid>
		<description><![CDATA[Podemos definir &#8220;callback listeners&#8221; como classes cujos métodos, devidamente anotados, são chamados em resposta a eventos ocorridos dentro do ciclo de vida de eventos de uma entidade. Exemplo: temos uma entidade Nota e queremos criar um log para todas as operações em que ela é adicionada, atualizada ou removida. Também podemos comparar com &#8220;triggers&#8221; em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=14&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Podemos definir &#8220;callback listeners&#8221; como classes cujos métodos, devidamente anotados, são chamados em resposta a eventos ocorridos dentro do ciclo de vida de eventos de uma entidade. Exemplo: temos uma entidade Nota e queremos criar um log para todas as operações em que ela é adicionada, atualizada ou removida. Também podemos comparar com &#8220;triggers&#8221; em banco de dados.</p>
<p>As seguintes operações são suportadas:</p>
<ul>
<li>Pré-persistência <em>(@PrePersist)</em></li>
<li>Pré-atualização <em>(@PreUpdate)</em></li>
<li>Pré-remoção <em>(@PreRemove)</em></li>
<li>Pós-persistencia <em>(@PostPersist)</em></li>
<li>Pós-atualização <em>(@PostUpdate)</em></li>
<li>Pós-remoção <em>(@PostRemove)</em></li>
<li>Pós-carregamento <em>(@PostLoad)</em></li>
</ul>
<p>A entidade que queremos monitorar deve conter a anotação @EntityListener. Veja exemplos da anotação:</p>
<ul>
<li>@EntityListeners(ClasseListener.class)</li>
<li>@EntityListeners({ClasseListener1.class, ClasseListener1.class})</li>
</ul>
<p>No exemplo que segue, temos uma entidade chamada Nota que terá seus eventos monitorados pela classe NotaEventListener.</p>
<p><em>Configurações da unidade de persistência em /META-INF<br />
</em></p>
<blockquote><p>[persistence.xml]</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;persistence version=&#8221;1.0&#8243;<br />
xmlns=&#8221;http://java.sun.com/xml/ns/persistence&#8221;&gt;<br />
&lt;persistence-unit name=&#8221;testeJpaPU&#8221; transaction-type=&#8221;RESOURCE_LOCAL&#8221;&gt;<br />
&lt;provider&gt;<br />
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider<br />
&lt;/provider&gt;</p>
<p>&lt;!&#8211; entidades &#8211;&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.Nota&lt;/class&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.ItemNota&lt;/class&gt;</p>
<p>&lt;!&#8211; toplink/hsqldb &#8211;&gt;<br />
&lt;properties&gt;<br />
&lt;property name=&#8221;toplink.jdbc.url&#8221; value=&#8221;jdbc:hsqldb:hsql://localhost/testeJpa&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.user&#8221; value=&#8221;teste&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.driver&#8221; value=&#8221;org.hsqldb.jdbcDriver&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.password&#8221; value=&#8221;123456&#8243; /&gt;<br />
&lt;property name=&#8221;toplink.target-database&#8221; value=&#8221;oracle.toplink.essentials.platform.database.HSQLPlatform&#8221;/&gt;<br />
&lt;property name=&#8221;toplink.ddl-generation&#8221; value=&#8221;drop-and-create-tables&#8221; /&gt;<br />
&lt;!&#8211; &lt;property name=&#8221;toplink.ddl-generation&#8221; value=&#8221;create-tables&#8221; /&gt; &#8211;&gt;<br />
&lt;property name=&#8221;toplink.logging.level&#8221; value=&#8221;FINEST&#8221; /&gt;<br />
&lt;/properties&gt;</p>
<p>&lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</p>
</blockquote>
<p><em>Esta entidade tem a anotação @EntityListeners onde especificamos quais classes irão monitorar os eventos ocorridos.</em></p>
<blockquote><p>[Nota.java]</p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.ArrayList;<br />
import java.util.Collection;<br />
import java.util.Date;</p>
<p>import javax.persistence.CascadeType;<br />
import javax.persistence.Entity;<br />
import javax.persistence.EntityListeners;<br />
import javax.persistence.Id;<br />
import javax.persistence.OneToMany;<br />
import javax.persistence.Table;<br />
import javax.persistence.Temporal;<br />
import javax.persistence.TemporalType;</p>
<p>@Entity<br />
@Table(name = &#8220;nota&#8221;)<br />
@EntityListeners(NotaEventListener.class)<br />
public class Nota implements Serializable {<br />
private static final long serialVersionUID = 1L;</p>
<p>private int id;<br />
private int numero;<br />
private int tipo;<br />
private Date data;<br />
private String descricao;<br />
private Collection&lt;ItemNota&gt; itensNota = new ArrayList&lt;ItemNota&gt;();</p>
<p>public Nota() {<br />
}</p>
<p>public Nota(int id) {<br />
setId(id);<br />
}</p>
<p>@Id<br />
public int getId() {<br />
return id;<br />
}</p>
<p>public void setId(int id) {<br />
this.id = id;<br />
}</p>
<p>public String getDescricao() {<br />
return descricao;<br />
}</p>
<p>public void setDescricao(String descricao) {<br />
this.descricao = descricao;<br />
}</p>
<p>@OneToMany(cascade = CascadeType.ALL)<br />
public Collection&lt;ItemNota&gt; getItensNota() {<br />
return itensNota;<br />
}</p>
<p>public void setItensNota(Collection&lt;ItemNota&gt; itensNota) {<br />
this.itensNota = itensNota;<br />
}</p>
<p>public int getNumero() {<br />
return numero;<br />
}</p>
<p>public void setNumero(int numero) {<br />
this.numero = numero;<br />
}</p>
<p>public int getTipo() {<br />
return tipo;<br />
}</p>
<p>public void setTipo(int tipo) {<br />
this.tipo = tipo;<br />
}</p>
<p>@Temporal(TemporalType.DATE)<br />
public Date getData() {<br />
return data;<br />
}</p>
<p>public void setData(Date data) {<br />
this.data = data;<br />
}</p>
<p>public static long getSerialVersionUID() {<br />
return serialVersionUID;<br />
}<br />
}</p>
</blockquote>
<p><em>Entidade que representa os itens da nota fiscal.</em></p>
<blockquote><p>[ItemNota.java]</p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.Id;<br />
import javax.persistence.ManyToOne;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name = &#8220;item_nota&#8221;)<br />
public class ItemNota implements Serializable {<br />
private int id;<br />
private int quantidade;<br />
private Nota nota;</p>
<p>public ItemNota() {<br />
}</p>
<p>public ItemNota(int id, int quantidade) {<br />
setId(id);<br />
setQuantidade(quantidade);<br />
}</p>
<p>@Id<br />
public int getId() {<br />
return id;<br />
}</p>
<p>public void setId(int id) {<br />
this.id = id;<br />
}</p>
<p>@Column(name = &#8220;quantidade&#8221;)<br />
public int getQuantidade() {<br />
return quantidade;<br />
}</p>
<p>public void setQuantidade(int quantidade) {<br />
this.quantidade = quantidade;<br />
}</p>
<p>@ManyToOne<br />
public Nota getNota() {<br />
return nota;<br />
}</p>
<p>public void setNota(Nota nota) {<br />
this.nota = nota;<br />
}<br />
}</p>
</blockquote>
<p><em>Agora a classe que &#8220;ouve&#8221; os eventos ocorridos na entidade Nota. Para podermos observar o que acontece, coloquei todos os listeners disponíveis nesta classe.</em></p>
<blockquote><p>package com.wordpress.ericogr.entities;</p>
<p>import javax.persistence.PostLoad;<br />
import javax.persistence.PostPersist;<br />
import javax.persistence.PostRemove;<br />
import javax.persistence.PostUpdate;<br />
import javax.persistence.PrePersist;<br />
import javax.persistence.PreRemove;<br />
import javax.persistence.PreUpdate;</p>
<p>public class NotaEventListener {</p>
<p>@PrePersist<br />
public void prePersistNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PrePersist: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PostPersist<br />
public void postPersistEvent(Nota nota) {<br />
System.out.println(&#8220;PostPersist: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PreUpdate<br />
public void preUpdateNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PreUpdate: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PostUpdate<br />
public void postUpdateNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PostUpdate: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PreRemove<br />
public void preRemoveNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PreRemove: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PostRemove<br />
public void postRemoveNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PostRemove: &#8221; + nota.getDescricao());<br />
}</p>
<p>@PostLoad<br />
public void postLoadNotaEvent(Nota nota) {<br />
System.out.println(&#8220;PostLoad: &#8221; + nota.getDescricao());<br />
}<br />
}</p>
</blockquote>
<p><em>A classe Main é o ponto de entrada para o programa. Ela testa a inserção, remoção, atualização e carga de registros que serão monitorados pelo &#8220;listener&#8221;.</em></p>
<blockquote><p>package com.wordpress.ericogr;</p>
<p>import java.util.Date;<br />
import java.util.List;</p>
<p>import javax.persistence.EntityManager;<br />
import javax.persistence.EntityManagerFactory;<br />
import javax.persistence.Persistence;<br />
import javax.persistence.Query;</p>
<p>import com.wordpress.ericogr.entities.ItemNota;<br />
import com.wordpress.ericogr.entities.Nota;</p>
<p>public class Main {</p>
<p>public static void main(String[] args) {<br />
new Main();<br />
}</p>
<p>@SuppressWarnings(&#8220;unchecked&#8221;)<br />
public Main() {<br />
EntityManagerFactory emf;<br />
EntityManager em;</p>
<p>Nota nota1;<br />
ItemNota itemNota1, itemNota2;</p>
<p>Query q;</p>
<p>emf = Persistence.createEntityManagerFactory(&#8220;testeJpaPU&#8221;);<br />
em = emf.createEntityManager();</p>
<p>itemNota1 = new ItemNota(1, 120);<br />
itemNota2 = new ItemNota(2, 151);</p>
<p>//nota<br />
nota1 = new Nota(1);<br />
nota1.setData(new Date());<br />
nota1.setNumero(112412);<br />
nota1.setTipo(512);<br />
nota1.setDescricao(&#8220;teste de nota&#8221;);<br />
nota1.getItensNota().add(itemNota1);<br />
nota1.getItensNota().add(itemNota2);</p>
<p>//@PrePersist/@PostPersist<br />
em.getTransaction().begin();<br />
em.persist(nota1);<br />
em.getTransaction().commit();</p>
<p>//@PreUpdate/PostUpdate<br />
nota1.setDescricao(&#8220;descrição da nota fiscal&#8221;);<br />
em.getTransaction().begin();<br />
em.persist(nota1);<br />
em.getTransaction().commit();</p>
<p>//para remover a entidade do contexto, fazendo com que<br />
//o evento @PostLoad seja disparado.<br />
em.clear();</p>
<p>//@PostLoad<br />
q = em.createQuery(&#8220;select n from Nota n where n.numero = 112412&#8243;);<br />
List&lt;Nota&gt; ns = (List&lt;Nota&gt;)q.getResultList();</p>
<p>System.out.println(&#8220;Nota &#8221; + ns.get(0).getDescricao());</p>
<p>em.close();<br />
}<br />
}</p>
</blockquote>
<p>Executando o exemplo, a saída conterá as seguintes linhas:</p>
<p>PrePersist: teste de nota<br />
PostPersist: teste de nota<br />
PreUpdate: descrição da nota fiscal<br />
PostUpdate: descrição da nota fiscal<br />
PostLoad: descrição da nota fiscal</p>
<p>O restante das linhas eu ocultei para facilitar a visualização dos eventos. Como podemos ver, é bem fácil e intuitivo usar <em>listeners</em>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ericogr.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ericogr.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=14&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2008/04/28/usando-callback-listeners-jpa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Criando relacionamentos com JPA</title>
		<link>http://ericogr.wordpress.com/2008/04/22/criando-relacionamentos-com-jpa/</link>
		<comments>http://ericogr.wordpress.com/2008/04/22/criando-relacionamentos-com-jpa/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 02:19:31 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[ManyToMany]]></category>
		<category><![CDATA[OneToMany ManyToOne]]></category>
		<category><![CDATA[OneToOne]]></category>
		<category><![CDATA[relacionamento]]></category>
		<category><![CDATA[relacionamentos]]></category>
		<category><![CDATA[relationship]]></category>
		<category><![CDATA[relationships]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=12</guid>
		<description><![CDATA[Vamos criar relacionamentos com JPA? Como nos exemplos anteriores, focarei nos aspectos práticos fornecendo exemplos simplificados. Os seguintes relacionamentos podem ser mapeados com JPA: OneToOne OneToMany ManyToOne ManyToMany Também podemos usar genéricos para especificar os tipos de coleções persistidas. Elas podem ser: java.util.Collection java.util.Set java.util.List java.util.Map Vamos ver um exemplo usando as classes Nota, ItemNota, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=12&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vamos criar relacionamentos com JPA? Como nos exemplos anteriores, focarei nos aspectos práticos fornecendo exemplos simplificados.</p>
<p>Os seguintes relacionamentos podem ser mapeados com JPA:</p>
<ul>
<li>OneToOne</li>
<li>OneToMany</li>
<li>ManyToOne</li>
<li>ManyToMany</li>
</ul>
<p>Também podemos usar genéricos para especificar os tipos de coleções persistidas. Elas podem ser:</p>
<ul>
<li>java.util.Collection</li>
<li>java.util.Set</li>
<li>java.util.List</li>
<li>java.util.Map</li>
</ul>
<p>Vamos ver um exemplo usando as classes Nota, ItemNota, Produto e Fornecedor. O objeto nota tem um ou mais objetos itemNota.  O objeto itemNota tem uma instancia da classe Produto e cada instancia de produto tem uma ou mais instancias da classe Fornecedor. A entidade itemNota tem referencia para a classe Nota.</p>
<p>Este exemplo está configurado para apagar e criar as tabelas do banco de dados a cada nova execução, ou seja, cada vez que este exemplo for executado, as informações anteriores serão perdidas. Veja a configuração do arquivo persistence.xml</p>
<blockquote><p><strong>[persistence.xml]</strong></p>
<p>&lt;/persistence&gt;</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;persistence version=&#8221;1.0&#8243;<br />
xmlns=&#8221;http://java.sun.com/xml/ns/persistence&#8221;&gt;<br />
&lt;persistence-unit name=&#8221;testeJpaPU&#8221; transaction-type=&#8221;RESOURCE_LOCAL&#8221;&gt;<br />
&lt;provider&gt;<br />
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider<br />
&lt;/provider&gt;</p>
<p>&lt;!&#8211; entidades &#8211;&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.Nota&lt;/class&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.ItemNota&lt;/class&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.Produto&lt;/class&gt;<br />
&lt;class&gt;com.wordpress.ericogr.entities.Fornecedor&lt;/class&gt;</p>
<p>&lt;!&#8211; toplink/hsqldb &#8211;&gt;<br />
&lt;properties&gt;<br />
&lt;property name=&#8221;toplink.jdbc.url&#8221; value=&#8221;jdbc:hsqldb:hsql://localhost/testeJpa&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.user&#8221; value=&#8221;teste&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.driver&#8221; value=&#8221;org.hsqldb.jdbcDriver&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.password&#8221; value=&#8221;123456&#8243; /&gt;<br />
&lt;property name=&#8221;toplink.target-database&#8221; value=&#8221;oracle.toplink.essentials.platform.database.HSQLPlatform&#8221;/&gt;<br />
&lt;property name=&#8221;toplink.ddl-generation&#8221; value=&#8221;drop-and-create-tables&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.logging.level&#8221; value=&#8221;FINEST&#8221; /&gt;<br />
&lt;/properties&gt;</p>
<p>&lt;/persistence-unit&gt;</p></blockquote>
<p>Em alguns relacionamentos, usamos como parâmetro das anotações o código (cascade = CascadeType.ALL). Isto serve para que as alterações realizadas no objeto que a contém sejam propagadas para os dependentes. Para persistir a coleção de itens da nota, precisamos desta anotação, pois do contrário os itens não seriam persistidos (na prática seria disparada uma exceção).</p>
<p>A entidade Nota tem um relacionamento bidirecional com a entidade ItemNota, onde uma nota pode conter um ou mais itens e um item contém uma única nota.</p>
<p><em>Abaixo está a classe Nota que representa a nota fiscal. Ela tem uma descrição, uma coleção de itens de nota fiscal e uma chave composta, representada pela classe NotaPk. Note que a propriedade getItensNota() foi anotada com @OneToMany(cascade = CascadeType.ALL, mappedBy = &#8220;nota&#8221;) onde mappedBy indica o nome da propriedade (no caso getNota()) da entidade dona do relacionamento (ItemNota). Aqui poderíamos omitir, pois o nome da entidade Nota é identico ao nome da propriedade na classe ItemNota, porém, para deixar mais claro, decidi colocar.</em></p>
<blockquote><p><strong>[Nota.java]</strong></p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.ArrayList;<br />
import java.util.Collection;</p>
<p>import javax.persistence.CascadeType;<br />
import javax.persistence.Column;<br />
import javax.persistence.EmbeddedId;<br />
import javax.persistence.Entity;<br />
import javax.persistence.OneToMany;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name = &#8220;nota&#8221;)<br />
public class Nota implements Serializable {<br />
private String descricao;<br />
private NotaPk notaPk;<br />
private Collection&lt;ItemNota&gt; itensNota = new ArrayList&lt;ItemNota&gt;();</p>
<p>public Nota() {<br />
}</p>
<p>public Nota(NotaPk notaPk) {<br />
setNotaPk(notaPk);<br />
}</p>
<p>@EmbeddedId<br />
public NotaPk getNotaPk() {<br />
return notaPk;<br />
}</p>
<p>public void setNotaPk(NotaPk notaPk) {<br />
this.notaPk = notaPk;<br />
}</p>
<p>@Column(name = &#8220;descricao&#8221;, nullable = true)<br />
public String getDescricao() {<br />
return descricao;<br />
}</p>
<p>public void setDescricao(String descricao) {<br />
this.descricao = descricao;<br />
}</p>
<p>@OneToMany(cascade = CascadeType.ALL, mappedBy = &#8220;nota&#8221;)<br />
public Collection&lt;ItemNota&gt; getItensNota() {<br />
return itensNota;<br />
}</p>
<p>public void setItensNota(Collection&lt;ItemNota&gt; itensNota) {<br />
this.itensNota = itensNota;<br />
}<br />
}</p></blockquote>
<p><em>Em seguida, tempos a classe NotaPk que representa uma chave composta para a entidade Nota.  Precisamos desta classe extra, pois para identificar a entidade nota, temos 3 campos diferentes (número, tipo e data) diferente da classe Produto que tem somente um campo (id).<br />
</em></p>
<blockquote><p><strong>[NotaPk.java]</strong></p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.Date;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Embeddable;<br />
import javax.persistence.Temporal;<br />
import javax.persistence.TemporalType;</p>
<p>@Embeddable<br />
public class NotaPk implements Serializable {<br />
private static final long serialVersionUID = -6450890424150718733L;</p>
<p>private int numero1;<br />
private int tipo;<br />
private Date data;</p>
<p>public NotaPk() {<br />
}</p>
<p>public NotaPk(int numero, int tipo, Date data) {<br />
setNumero(numero);<br />
setTipo(tipo);<br />
setData(data);<br />
}</p>
<p>@Column(name = &#8220;numero&#8221;)<br />
public int getNumero() {<br />
return numero1;<br />
}</p>
<p>public void setNumero(int numero) {<br />
this.numero1 = numero;<br />
}</p>
<p>@Column(name = &#8220;tipo&#8221;)<br />
public int getTipo() {<br />
return tipo;<br />
}</p>
<p>public void setTipo(int tipo) {<br />
this.tipo = tipo;<br />
}</p>
<p>@Temporal(value = TemporalType.DATE)<br />
@Column(name = &#8220;data&#8221;)<br />
public Date getData() {<br />
return data;<br />
}</p>
<p>public void setData(Date data) {<br />
this.data = data;<br />
}</p>
<p>@Override<br />
public boolean equals(Object obj) {<br />
if (obj == null || !(obj instanceof NotaPk)) {<br />
return false;<br />
}</p>
<p>NotaPk pk = (NotaPk)obj;</p>
<p>return (pk.getData().equals(this.getData()) &amp;&amp;<br />
pk.getNumero() == this.getNumero() &amp;&amp;<br />
pk.getTipo() == this.getTipo());<br />
}</p>
<p>@Override<br />
public int hashCode() {<br />
int ret = 0;</p>
<p>ret =<br />
getNumero() ^<br />
getTipo() ^<br />
(getData() != null ? getData().hashCode() : 0);</p>
<p>return ret;<br />
}<br />
}</p></blockquote>
<p><em>Agora os itens da nota fiscal. Os itens são compostos por um id que o identifica unicamente, quantidade, produto e </em><em>nota fiscal a que pertence.<br />
</em></p>
<blockquote><p><strong>[ItemNota.java]</strong></p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;</p>
<p>import javax.persistence.CascadeType;<br />
import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.FetchType;<br />
import javax.persistence.Id;<br />
import javax.persistence.ManyToOne;<br />
import javax.persistence.OneToOne;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name = &#8220;item_nota&#8221;)<br />
public class ItemNota implements Serializable {<br />
private int id;<br />
private int quantidade;<br />
private Produto produto;<br />
private Nota nota;</p>
<p>public ItemNota() {<br />
}</p>
<p>public ItemNota(int id, int quantidade, Produto produto) {<br />
setId(id);<br />
setQuantidade(quantidade);<br />
setProduto(produto);<br />
}</p>
<p>@Id<br />
public int getId() {<br />
return id;<br />
}</p>
<p>public void setId(int id) {<br />
this.id = id;<br />
}</p>
<p>@Column(name = &#8220;quantidade&#8221;)<br />
public int getQuantidade() {<br />
return quantidade;<br />
}</p>
<p>public void setQuantidade(int quantidade) {<br />
this.quantidade = quantidade;<br />
}</p>
<p>@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)<br />
public Produto getProduto() {<br />
return produto;<br />
}</p>
<p>public void setProduto(Produto produto) {<br />
this.produto = produto;<br />
}</p>
<p>@ManyToOne<br />
public Nota getNota() {<br />
return nota;<br />
}</p>
<p>public void setNota(Nota nota) {<br />
this.nota = nota;<br />
}<br />
}</p></blockquote>
<p><em>Produtos da nota fiscal: possui um id que o identifica, nome, peso, imagem (onde podemos gravar a figura do produto) e uma lista de fornecedores.</em></p>
<blockquote><p><strong>[Produto.java]</strong></p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import javax.persistence.CascadeType;<br />
import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.Id;<br />
import javax.persistence.ManyToMany;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name = &#8220;produto&#8221;)<br />
public class Produto implements Serializable {<br />
private int id;<br />
private String nome;<br />
private float peso;<br />
private byte[] imagem;<br />
private List&lt;Fornecedor&gt; fornecedores = new ArrayList&lt;Fornecedor&gt;();</p>
<p>public Produto() {<br />
}</p>
<p>public Produto(int id, String nome, float peso) {<br />
setId(id);<br />
setNome(nome);<br />
setPeso(peso);<br />
}</p>
<p>@Id<br />
@Column(name = &#8220;id&#8221;)<br />
public int getId() {<br />
return id;<br />
}</p>
<p>public void setId(int id) {<br />
this.id = id;<br />
}</p>
<p>@Column(name = &#8220;nome&#8221;)<br />
public String getNome() {<br />
return nome;<br />
}</p>
<p>public void setNome(String nome) {<br />
this.nome = nome;<br />
}</p>
<p>@Column(name = &#8220;peso&#8221;)<br />
public float getPeso() {<br />
return peso;<br />
}</p>
<p>public void setPeso(float peso) {<br />
this.peso = peso;<br />
}</p>
<p>@Column(name = &#8220;imagem&#8221;)<br />
public byte[] getImagem() {<br />
return imagem;<br />
}</p>
<p>public void setImagem(byte[] imagem) {<br />
this.imagem = imagem;<br />
}</p>
<p>@ManyToMany(cascade = CascadeType.ALL)<br />
public List&lt;Fornecedor&gt; getFornecedores() {<br />
return fornecedores;<br />
}</p>
<p>public void setFornecedores(List&lt;Fornecedor&gt; fornecedores) {<br />
this.fornecedores = fornecedores;<br />
}<br />
}</p></blockquote>
<p><em>O Cadastro de fornecedores é composto por um identificador (id), nome, endereço e produtos que fornece. </em></p>
<blockquote><p><strong>[Fornecedor.java]</strong></p>
<p>package com.wordpress.ericogr.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import javax.persistence.CascadeType;<br />
import javax.persistence.Entity;<br />
import javax.persistence.Id;<br />
import javax.persistence.ManyToMany;<br />
import javax.persistence.Table;</p>
<p>@Entity<br />
@Table(name = &#8220;fornecedor&#8221;)<br />
public class Fornecedor implements Serializable {<br />
private int id;<br />
private String nome;<br />
private String endereco;<br />
private List&lt;Produto&gt; produtos = new ArrayList&lt;Produto&gt;();</p>
<p>public Fornecedor() {<br />
}</p>
<p>public Fornecedor(int id, String nome, String endereco) {<br />
setId(id);<br />
setNome(nome);<br />
setEndereco(endereco);<br />
}</p>
<p>@Id<br />
public int getId() {<br />
return id;<br />
}</p>
<p>public void setId(int id) {<br />
this.id = id;<br />
}</p>
<p>public String getNome() {<br />
return nome;<br />
}</p>
<p>public void setNome(String nome) {<br />
this.nome = nome;<br />
}</p>
<p>public String getEndereco() {<br />
return endereco;<br />
}</p>
<p>public void setEndereco(String endereco) {<br />
this.endereco = endereco;<br />
}</p>
<p>@ManyToMany(cascade = CascadeType.ALL)<br />
public List&lt;Produto&gt; getProdutos() {<br />
return produtos;<br />
}</p>
<p>public void setProdutos(List&lt;Produto&gt; produtos) {<br />
this.produtos = produtos;<br />
}<br />
}</p></blockquote>
<p><em>Finalmente a classe principal para testarmos o funcionamento das entidades que mapeamos. Criamos uma nota com itens, produtos e fornecedores e em seguida efetuamos uma consulta.</em></p>
<blockquote><p><strong>[Main.java]</strong></p>
<p>package com.wordpress.ericogr;</p>
<p>import java.util.Date;<br />
import java.util.List;</p>
<p>import javax.persistence.EntityManager;<br />
import javax.persistence.EntityManagerFactory;<br />
import javax.persistence.Persistence;<br />
import javax.persistence.Query;</p>
<p>import com.wordpress.ericogr.entities.Fornecedor;<br />
import com.wordpress.ericogr.entities.ItemNota;<br />
import com.wordpress.ericogr.entities.Nota;<br />
import com.wordpress.ericogr.entities.NotaPk;<br />
import com.wordpress.ericogr.entities.Produto;</p>
<p>public class Main {</p>
<p>public static void main(String[] args) {<br />
new Main();<br />
}</p>
<p>@SuppressWarnings(&#8220;unchecked&#8221;)<br />
public Main() {<br />
EntityManagerFactory emf;<br />
EntityManager em;</p>
<p>Nota nota1;<br />
NotaPk notaPk1;<br />
ItemNota itemNota1, itemNota2;<br />
Produto produto1, produto2;<br />
Fornecedor fornecedor1, fornecedor2;</p>
<p>Query q;</p>
<p>emf = Persistence.createEntityManagerFactory(&#8220;testeJpaPU&#8221;);<br />
em = emf.createEntityManager();</p>
<p>//produto<br />
produto1 = new Produto(1, &#8220;Cimento&#8221;, 5000);<br />
produto2 = new Produto(2, &#8220;Piso 12&#215;10&#8243;, 475.3f);</p>
<p>//fornecedor<br />
fornecedor1 = new Fornecedor(1, &#8220;JaxPCimentos&#8221;, &#8220;Rua Galeteri Blota, 123&#8243;);<br />
fornecedor2 = new Fornecedor(2, &#8220;Kermit Ltda&#8221;, &#8220;Av Blogus, 987&#8243;);</p>
<p>//fornecedor x produto<br />
fornecedor1.getProdutos().add(produto1);<br />
fornecedor2.getProdutos().add(produto1);<br />
fornecedor2.getProdutos().add(produto2);</p>
<p>//produto x fornecedor<br />
produto1.getFornecedores().add(fornecedor1);<br />
produto2.getFornecedores().add(fornecedor1);<br />
produto2.getFornecedores().add(fornecedor2);</p>
<p>//notaPk<br />
notaPk1 = new NotaPk(1, 2, new Date());</p>
<p>//item Nota<br />
itemNota1 = new ItemNota(1, 120, produto1);<br />
itemNota2 = new ItemNota(2, 151, produto2);</p>
<p>//nota<br />
nota1 = new Nota(notaPk1);<br />
nota1.setDescricao(&#8220;teste de nota&#8221;);<br />
nota1.getItensNota().add(itemNota1);<br />
nota1.getItensNota().add(itemNota2);</p>
<p>//item nota x nota<br />
itemNota1.setNota(nota1);<br />
itemNota2.setNota(nota1);</p>
<p>em.getTransaction().begin();<br />
em.persist(nota1);<br />
em.getTransaction().commit();</p>
<p>q = em.createQuery(&#8220;select n from Nota n where n.notaPk.numero = 1&#8243;);<br />
List&lt;Nota&gt; ns = (List&lt;Nota&gt;)q.getResultList();</p>
<p>for (Nota n1 : ns) {<br />
System.out.println(&#8220;[Nota]&#8220;);<br />
System.out.println(&#8220;Nota nr: &#8221; + n1.getNotaPk().getNumero() + &#8220;\n&#8221; +<br />
&#8220;Nota tp: &#8221; + n1.getNotaPk().getTipo() + &#8220;\n&#8221; +<br />
&#8220;Nota dt: &#8221; + n1.getNotaPk().getData() + &#8220;\n&#8221; +<br />
&#8220;Nota ds: &#8221; + n1.getDescricao() + &#8220;\n&#8221;);<br />
for (ItemNota in : n1.getItensNota()) {<br />
System.out.println(&#8220;[Itens]&#8220;);<br />
System.out.println(&#8220;Item&#8230;: &#8221; + in.getId() + &#8220;\n&#8221; +<br />
&#8220;Prod&#8230;: &#8221; + in.getProduto().getNome() + &#8220;\n&#8221; +<br />
&#8220;Quant..: &#8221; + in.getQuantidade() + &#8220;\n&#8221; +<br />
&#8220;Ref Not: &#8221; + in.getNota().getNotaPk().getNumero() + &#8220;\n&#8221;);<br />
for (Fornecedor f : in.getProduto().getFornecedores()) {<br />
System.out.println(&#8220;[Fornecedores]&#8220;);<br />
System.out.println(&#8220;Fornecedor: &#8221; + f.getId() + &#8220;\n&#8221; +<br />
&#8220;Nome&#8230;..: &#8221; + f.getNome() + &#8220;\n&#8221; );<br />
}<br />
}<br />
}</p>
<p>em.close();<br />
}<br />
}</p></blockquote>
<p>Com este exemplo podemos observar como é fácil mapear os objetos para serem persistidos no banco de dados. Observamos o funcionamento das anotações @OneToOne, @OneToMany, @ManyToOne e @ManyToMany através de um exemplo simples que pode ser incrementado para um caso real.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ericogr.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ericogr.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=12&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2008/04/22/criando-relacionamentos-com-jpa/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Usando chaves compostas com JPA</title>
		<link>http://ericogr.wordpress.com/2008/04/15/usando-chaves-compostas-com-jpa/</link>
		<comments>http://ericogr.wordpress.com/2008/04/15/usando-chaves-compostas-com-jpa/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 18:37:26 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[chave]]></category>
		<category><![CDATA[composite]]></category>
		<category><![CDATA[composta]]></category>
		<category><![CDATA[embeddable]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[embeddedid]]></category>
		<category><![CDATA[key]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=5</guid>
		<description><![CDATA[Neste artigo vamos implementar uma entidade com uma chave primária composta de três campo. Tudo que for demonstrado aqui pode ser aplicado em uma aplicação real desktop ou web. Com JPA, mapeamos tabelas e relacionamento de banco de dados através de classes chamadas entidades. Toda entidade deve ter uma chave primaria. Esta chave pode ter [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=5&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Neste artigo vamos implementar uma entidade com uma chave primária composta de três campo. Tudo que for demonstrado aqui pode ser aplicado em uma aplicação real desktop ou web.</p>
<p>Com JPA, mapeamos tabelas e relacionamento de banco de dados através de classes chamadas entidades. Toda entidade deve ter uma chave primaria. Esta chave pode ter um ou mais campos que servem para identifica-la. Para chaves de um único campo, podemos especifica-la na própria entidade com a anotação @Id, mas em casos de mais de um, precisamos de classe que a represente, ou seja, para representar uma chave primária composta de mais de um campo, precisamos de uma classe extra. Os tipos aceitos para campos de chaves são os seguintes:</p>
<ul>
<li>java.lang.String</li>
<li>java.util.Date</li>
<li>java.sql.Date</li>
<li>qualquer wrapper de tipo primitivo (int -&gt; Integer, long -&gt; Long, etc&#8230;) menos (não inteiros como float e double)</li>
</ul>
<p>A classe que representará nossa primary key deve ser:</p>
<ul>
<li>pública</li>
<li>conter um construtor sem argumentos</li>
<li>as propriedades (se você as mapeou com get/set) devem ter acesso público ou protegido</li>
<li>implementar Serializable</li>
<li>sobrescrever equals e hashcode adequadamente</li>
<li>deve ser anotada como @Embeddable</li>
<li>a classe que contiver a classe que representa a primary key deve ser anotada com @EmbaddableClass ou @EmbaddableId</li>
</ul>
<p>Vamos trabalhar sobre um exemplo. Abaixo criei os passos para inserir e consultar dados com uma única entidade chamada Nota. Tentei simplificar ao máximo para podermos entender como tudo funciona. Esta consulta é feita utilizando um campo dentre três da chave primária. Utilizei este critério pois não é tão comum encontrar como fazer isso (queries com campos de chave primária composta), mas é bem simples. As tabelas no banco de dados são geradas automaticamente, graças ao parâmetro [toplink.ddl-generation= create-tables] em nosso persistence.xml.</p>
<p><strong>1. Criar o arquivo de configuração persistence.xml</strong></p>
<p>Para este exemplo, usamos o banco hsqldb. O arquivo abaixo armazena configurações para suas unidades de persistência. Você poderá adaptá-lo para seu banco de dados.</p>
<p><strong>[persistence.xml]</strong></p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;persistence version=&#8221;1.0&#8243;<br />
xmlns=&#8221;http://java.sun.com/xml/ns/persistence&#8221;&gt;<br />
&lt;persistence-unit name=&#8221;testeJpaPU&#8221; transaction-type=&#8221;RESOURCE_LOCAL&#8221;&gt;<br />
&lt;provider&gt;<br />
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider<br />
&lt;/provider&gt;</p>
<p>&lt;!&#8211; entidades &#8211;&gt;<br />
&lt;class&gt;com.wordpress.entities.Nota&lt;/class&gt;</p>
<p>&lt;!&#8211; toplink/hsqldb &#8211;&gt;<br />
&lt;properties&gt;<br />
&lt;property name=&#8221;toplink.jdbc.url&#8221; value=&#8221;jdbc:hsqldb:hsql://localhost/testeJpa&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.user&#8221; value=&#8221;teste&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.driver&#8221; value=&#8221;org.hsqldb.jdbcDriver&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.jdbc.password&#8221; value=&#8221;123456&#8243; /&gt;<br />
&lt;property name=&#8221;toplink.target-database&#8221; value=&#8221;oracle.toplink.essentials.platform.database.HSQLPlatform&#8221;/&gt;<br />
&lt;property name=&#8221;toplink.ddl-generation&#8221; value=&#8221;create-tables&#8221; /&gt;<br />
&lt;property name=&#8221;toplink.logging.level&#8221; value=&#8221;FINE&#8221; /&gt;<br />
&lt;/properties&gt;</p>
<p>&lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</p></blockquote>
<p>Vamos criar um pacote chamado com.wordpress.entities e também a classe entidade Nota:</p>
<p><strong>[Nota.java]</strong></p>
<blockquote><p>package com.wordpress.entities;</p>
<p>import javax.persistence.EmbeddedId;<br />
import javax.persistence.Entity;</p>
<p>@Entity<br />
public class Nota {</p>
<p style="padding-left:30px;">private String descricao;<br />
private NotaPk notaPk;</p>
<p style="padding-left:30px;">public Nota() {<br />
}</p>
<p style="padding-left:30px;">@EmbeddedId<br />
public NotaPk getNotaPk() {<br />
return notaPk;<br />
}</p>
<p style="padding-left:30px;">public void setNotaPk(NotaPk notaPk) {<br />
this.notaPk = notaPk;<br />
}</p>
<p style="padding-left:30px;">public String getDescricao() {<br />
return descricao;<br />
}</p>
<p style="padding-left:30px;">public void setDescricao(String descricao) {<br />
this.descricao = descricao;<br />
}</p>
<p>}</p></blockquote>
<p>Agora a classe que representa a chave no banco de dados. Note que precisamos sobrescrever adequadamente os métodos equals e hashcode.</p>
<blockquote><p><strong>[NotaPk.java]</strong></p></blockquote>
<blockquote><p>package com.wordpress.entities;</p>
<p>import java.io.Serializable;<br />
import java.util.Date;</p>
<p>import javax.persistence.Embeddable;<br />
import javax.persistence.Temporal;<br />
import javax.persistence.TemporalType;</p>
<p>@Embeddable<br />
public class NotaPk implements Serializable {<br />
private static final long serialVersionUID = 433046042456099827L;</p>
<p>private int numero1;<br />
private int tipo;<br />
private Date data;</p>
<p>public NotaPk() {<br />
}</p>
<p>public NotaPk(int numero, int tipo, Date data) {<br />
setNumero(numero);<br />
setTipo(tipo);<br />
setData(data);<br />
}</p>
<p>public int getNumero() {<br />
return numero1;<br />
}</p>
<p>public void setNumero(int numero) {<br />
this.numero1 = numero;<br />
}</p>
<p>public int getTipo() {<br />
return tipo;<br />
}</p>
<p>public void setTipo(int tipo) {<br />
this.tipo = tipo;<br />
}</p>
<p>@Temporal(value = TemporalType.DATE)<br />
public Date getData() {<br />
return data;<br />
}</p>
<p>public void setData(Date data) {<br />
this.data = data;<br />
}</p>
<p>@Override<br />
public boolean equals(Object obj) {<br />
if (obj == null || !(obj instanceof NotaPk)) {<br />
return false;<br />
}</p>
<p>NotaPk pk = (NotaPk)obj;</p>
<p>return (pk.getData().equals(this.getData()) &amp;&amp;<br />
pk.getNumero() == this.getNumero() &amp;&amp;<br />
pk.getTipo() == this.getTipo());<br />
}</p>
<p>@Override<br />
public int hashCode() {<br />
int ret = 0;</p>
<p>ret =<br />
getNumero() ^<br />
getTipo() ^<br />
(getData() != null ? getData().hashCode() : 0);</p>
<p>return ret;<br />
}<br />
}</p></blockquote>
<p>Abaixo a classe principal que irá comprovar o funcionamento. Foi criada também uma query personalizada onde a busca é feita pelo campo número de nota. Veja como é feito o acesso aos campos chaves da entidade Nota.</p>
<p><strong>[Main.java]</strong></p>
<blockquote><p>import java.util.Date;<br />
import java.util.List;</p>
<p>import javax.persistence.EntityManager;<br />
import javax.persistence.EntityManagerFactory;<br />
import javax.persistence.Persistence;<br />
import javax.persistence.Query;</p>
<p>import com.wordpress.entities.Nota;<br />
import com.wordpress.entities.NotaPk;</p>
<p>public class Main {</p>
<p>public static void main(String[] args) {</p>
<p style="padding-left:30px;">new Main();<br />
}</p>
<p style="padding-left:30px;">@SuppressWarnings(&#8220;unchecked&#8221;)<br />
public Main() {<br />
EntityManagerFactory emf = Persistence.createEntityManagerFactory(&#8220;testeJpaPU&#8221;);<br />
EntityManager em = emf.createEntityManager();</p>
<p style="padding-left:30px;">Nota n = new Nota();<br />
n.setNotaPk(new NotaPk(1, 2, new Date()));<br />
n.setDescricao(&#8220;teste de nota&#8221;);</p>
<p style="padding-left:30px;">em.getTransaction().begin();</p>
<p style="padding-left:30px;">if (em.find(Nota.class, n.getNotaPk()) == null) {<br />
em.persist(n);<br />
}</p>
<p style="padding-left:30px;">Query q = em.createQuery(&#8220;<span style="text-decoration:underline;">select n from Nota n where n.notaPk.numero = 1</span>&#8220;);<br />
List&lt;Nota&gt; ns = (List&lt;Nota&gt;)q.getResultList();</p>
<p style="padding-left:30px;">for (Nota n1 : ns) {<br />
System.out.println(&#8220;nota &#8221; + n1.getNotaPk().getNumero());<br />
}</p>
<p style="padding-left:30px;">em.getTransaction().commit();<br />
em.close();<br />
}</p>
<p>}</p></blockquote>
<p>Todos os métodos das classes entidade e embeddable, que estiverem no padrão javabeans, serão associados aos campos do banco de dados. Somente os campos anotados com @Transient não serão persistidos.</p>
<p>Aqui utilizei Toplink e Hsqldb, mas podemos usar qualquer outro provedor e banco de dados. Basta especificar corretamente o arquivo persistence.xml</p>
<p><strong>Bibliotecas utilizadas:</strong></p>
<ul>
<li>toplink-essentials.jar</li>
<li>toplink-essentials-agent.jar</li>
<li>hsqldb.jar</li>
</ul>
<p><strong>Estrutura de diretórios:</strong></p>
<blockquote><p><strong></strong>.<br />
|   hsqldb.jar<br />
|   toplink-essentials-agent.jar<br />
|   toplink-essentials.jar<br />
|<br />
\&#8212;src<br />
|   Main.java<br />
|<br />
+&#8212;com<br />
|   \&#8212;wordpress<br />
|       \&#8212;entities<br />
|               Nota.java<br />
|               NotaPk.java<br />
|<br />
\&#8212;META-INF<br />
persistence.xml</p></blockquote>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ericogr.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ericogr.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=5&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2008/04/15/usando-chaves-compostas-com-jpa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>
	</item>
		<item>
		<title>Criação de componentes Facelets</title>
		<link>http://ericogr.wordpress.com/2008/04/09/criacao-de-componentes-facelets-receita-do-bolo/</link>
		<comments>http://ericogr.wordpress.com/2008/04/09/criacao-de-componentes-facelets-receita-do-bolo/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 15:49:56 +0000</pubDate>
		<dc:creator>ericogr</dc:creator>
				<category><![CDATA[Facelets]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[componente]]></category>
		<category><![CDATA[facelets]]></category>
		<category><![CDATA[jsf]]></category>

		<guid isPermaLink="false">http://ericogr.wordpress.com/?p=3</guid>
		<description><![CDATA[Este artigo tem como objetivo demonstrar como criar um simples componente facelets que “renderiza” uma tag label utilizando recursos deste maravilhoso framework. Depois você poderá criar componentes muito mais complexos. Tentei simplificar ao máximo, criando até um mapa de relacionamento entre os arquivos de configuração e o código Java. Pressuponho que o leitor já tenha [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=3&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="text-align:justify;">Este artigo tem como objetivo demonstrar como criar um simples componente facelets que “renderiza” uma tag <em>label </em>utilizando recursos deste maravilhoso framework. Depois você poderá criar componentes muito mais complexos. Tentei simplificar ao máximo, criando até um mapa de relacionamento entre os arquivos de configuração e o código Java. Pressuponho que o leitor já tenha conhecimento mínimo sobre java, jsf e facelets. Para mais informações, consulte as referências no final deste documento.</p>
<p class="MsoNormal" style="text-align:justify;"><strong>Versão PDF:</strong> <a href="http://ericogr.files.wordpress.com/2008/04/tutorialparacriarcomponentejsffaceletsv3.pdf">Criação de componentes JSF Facelets</a></p>
<p class="MsoNormal">Como exemplo, vamos criar um componente chamado FirstJsfTest que renderiza um simples <em>label</em> .<br />
Exemplo:</p>
<p class="MsoNormal"><span style="font-size:9pt;line-height:115%;"><em>&lt;label&gt;</em>Teste 123<em>&lt;/label&gt;</em></span></p>
<p class="MsoNormal"><strong>Premissas</strong></p>
<ol>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->JDK 1.5 ou superior</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Biblioteca JSF 1.2 (aqui utilizamos JSF1.2_04)</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Seu projeto já deve estar configurado para utilizar a combinação de JSF + Facelets</li>
</ol>
<p class="MsoNormal"><strong>Criação do componente</strong></p>
<ol>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Criar uma classe que estenda UIComponent</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Programar métodos para salvar e restaurar o estado do componente</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Criar método que retorne a família do componente</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Criar uma classe que estenda UIComponentELTag</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Configurar as propriedades que o componente JSF utilizará</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Programar métodos para retornar o tipo de componente e renderizador utilizado</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Programar um renderizador</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Criar um arquivo .tld (Descritor de biblioteca de tags)</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Registre o componente no faces-config.xml</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Criar um arquivo de configuração de biblioteca facelets e registrá-lo</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Usando o componente</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Relacionamento entre código java e os descritivos XML</li>
<li><!--[if !supportLists]--><span style="font-family:Symbol;"><span>·<span> </span></span></span><!--[endif]-->Referências</li>
</ol>
<p class="MsoSubtitle"><strong>1.<span> </span>Crie uma classe que estenda UIComponent</strong></p>
<p class="MsoNormal" style="text-align:justify;">Para começar, vamos criar a classe UIFirstJsfComponent que estende a classe UIOutput (que é subclasse de UIComponent) e criaremos também os atributos do componente.</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">[UIFirstJsfComponent.java]</p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;"> </span></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">package</span></strong><span style="font-size:10pt;"> net.sf.quizOnline.tags;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.component.UIOutput;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.context.FacesContext;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">class</span></strong><span style="font-size:10pt;"> UIFirstJsfComponent </span><strong><span style="font-size:10pt;">extends</span></strong><span style="font-size:10pt;"> UIOutput {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">private</span></strong><span style="font-size:10pt;"> String </span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> UIFirstJsfComponent() {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> String getName() {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> </span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">void</span></strong><span style="font-size:10pt;"> setName(String name) {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;"> = name;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle">
<p class="MsoSubtitle"><strong>2. Programar métodos para salvar e restaurar o estado do componente</strong></p>
<p class="MsoNormal">Abaixo está o trecho de código que fica responsável por salvar e restaurar o estado do componente. <span> </span>Salvamos e restauramos os atributo do nosso componente através dos métodos saveState e restoreState da classe UIOutput.</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[UIFirstJsfComponent.java]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">@Override</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> Object   saveState(FacesContext facesContext) {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>Object[] values = </span><strong><span style="font-size:10pt;">new</span></strong><span style="font-size:10pt;"> Object[2];</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>values[0] = </span><strong><span style="font-size:10pt;">super</span></strong><span style="font-size:10pt;">.saveState(facesContext);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>values[1] =   getName();</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> (Object)values;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">@Override</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">void</span></strong><span style="font-size:10pt;"> restoreState(FacesContext facesContext,</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>Object state)</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>Object[] values =   (Object[])state;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">super</span></strong><span style="font-size:10pt;">.restoreState(facesContext,   values[0]);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>setName((String)values[1]);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>3. Retornar a família do componente</strong></p>
<p class="MsoNormal" style="text-align:justify;">Precisamos do método getFamily() para retornar a família do componente. O retorno deste método será usado posteriormente para registrar o renderizador no arquivo de configuração do Jsf. Podemos retornar <em>COMPONENT_FAMILY</em> que é uma constante com o valor <em>javax.faces.Output</em>.</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[UIFirstJsfComponent.java]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> String getFamily() {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> </span><em><span style="font-size:10pt;">COMPONENT_FAMILY</span></em><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoSubtitle"><strong>4. Criar uma classe que estenda UIComponentELTag</strong></p>
<p class="MsoNormal" style="text-align:justify;">Nos passos anteriores, o componente foi criado. Agora precisamos definir a tag (marcação que ficará na página que estamos criando) que fará uma ponte entre o Jsp e o Jsf. No trecho de código abaixo, está também a propriedade <em>name</em> que será utilizada em nossa tag para passar valor ao componente com propriedade de mesmo nome. Depois mapearemos a tag através do arquivo de configuração de extensão .tld (tag library descriptor).</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">[FirstJsfTag.java]</p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;"> </span></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">package</span></strong><span style="font-size:10pt;"> net.sf.quizOnline.tags;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.webapp.UIComponentELTag;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.component.UIComponent;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">class</span></strong><span style="font-size:10pt;"> FirstJsfTag </span><strong><span style="font-size:10pt;">extends</span></strong><span style="font-size:10pt;"> UIComponentELTag {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">private</span></strong><span style="font-size:10pt;"> String </span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> FirstJsfTag() {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> String getName() {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> </span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">void</span></strong><span style="font-size:10pt;"> setName(String name) {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">this</span></strong><span style="font-size:10pt;">.</span><span style="font-size:10pt;">m_Name</span><span style="font-size:10pt;"> = name;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>5. Configurar as propriedades que o componente JSF utilizará</strong></p>
<p class="MsoNormal" style="text-align:justify;">Vamos armazenar o valor configurado para a tag no componente que criamos como mostra o código abaixo:</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[FirstJsfTag.java]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">@Override</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">protected</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">void</span></strong><span style="font-size:10pt;"> setProperties(UIComponent component) {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">super</span></strong><span style="font-size:10pt;">.setProperties(component);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>((UIFirstJsfComponent)component).setName(getName());</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin-top:6pt;">Como podemos ver, component é uma instância da classe <span style="font-size:10pt;line-height:115%;color:black;">UIFirstJsfComponent </span>onde configuramos seus atributos pelos atributos da tag FirstJsfTag.</p>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>6. Programar métodos para retornar o tipo de componente e renderizador utilizado</strong></p>
<p class="MsoNormal">O retorno deste método será utilizado nos arquivos de configuração do Jsf e Facelets.</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[FirstJsfTag.java]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> String getComponentType()   {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> </span><span style="font-size:10pt;">&#8220;net.sf.quizOnline.HtmlFirstJsfTag&#8221;</span><span style="font-size:10pt;">;<span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> String getRendererType()   {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">return</span></strong><span style="font-size:10pt;"> </span><span style="font-size:10pt;">&#8220;net.sf.quizOnline.FirstJsfTag&#8221;</span><span style="font-size:10pt;">;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8230;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>7. Programar um renderizador</strong></p>
<p class="MsoNormal" style="text-align:justify;">O renderizador escreverá a saída, que no nosso caso será codificação em HTML. Esta classe estende Renderer e provê uma série de métodos interessantes que podem ser explorados pelo programador, mas este não será o foco.</p>
<p class="MsoNormal" style="text-align:justify;">Este renderizador apenas escreve na página um label com o valor definido na propriedade name. A saída é esta: <span>&lt;label&gt;valor qualquer&lt;/label&gt;</span></p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">[FirstJsfRenderer.java]</p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;"> </span></strong></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">package</span></strong><span style="font-size:10pt;"> net.sf.quizOnline.tags;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> java.io.IOException;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.component.UIComponent;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.context.FacesContext;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.context.ResponseWriter;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">import</span></strong><span style="font-size:10pt;"> javax.faces.render.Renderer;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">class</span></strong><span style="font-size:10pt;"> FirstJsfRenderer </span><strong><span style="font-size:10pt;">extends</span></strong><span style="font-size:10pt;"> Renderer {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">@Override</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><strong><span style="font-size:10pt;">public</span></strong><span style="font-size:10pt;"> </span><strong><span style="font-size:10pt;">void</span></strong><span style="font-size:10pt;"> encodeBegin(FacesContext context,</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">UIComponent component)</span><strong><span style="font-size:10pt;">throws</span></strong><span style="font-size:10pt;"> IOException </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>{</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>UIFirstJsfComponent   firstJsfComponent =</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>(UIFirstJsfComponent)   component;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>ResponseWriter writer   = context.getResponseWriter();</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>writer.startElement(</span><span style="font-size:10pt;">&#8220;label&#8221;</span><span style="font-size:10pt;">, component);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>writer.write(firstJsfComponent.getName());</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>writer.endElement(</span><span style="font-size:10pt;">&#8220;label&#8221;</span><span style="font-size:10pt;">);</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>writer.flush();</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>}</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>8. Criar um arquivo .tld</strong></p>
<p class="MsoNormal" style="text-align:justify;">Depois de ter criado o componente, temos que criar seu descritor, o arquivo tld (Tag Library Descriptor) chamado firstJsfTag.tld (para este exemplo). Normalmente este arquivo fica na pasta da sua aplicação web em <span>/WEB-INF/taglib.</span><span> </span></p>
<p class="MsoNormal"><span>Exemplo: </span><span>/WEB-INF/taglib/firstJsfTag.tld</span></p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[firstJsfTag.tld]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;?</span><span style="font-size:10pt;">xml </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;1.0&#8243; </span><span style="font-size:10pt;">encoding</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;ISO-8859-1&#8243; </span><span style="font-size:10pt;">?&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;!</span><span style="font-size:10pt;">DOCTYPE </span><span style="font-size:10pt;">taglib </span><span style="font-size:10pt;">PUBLIC </span><span style="font-size:10pt;">&#8220;-//Sun Microsystems, Inc.//DTD JSP Tag Library   1.2//EN&#8221; </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&#8220;http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd&#8221;</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">taglib</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">tlib-version</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">1.0</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">tlib-version</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">jsp-version</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">2.0</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">jsp-version</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">short-name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">firstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">short-name</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">uri</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">http://net.sf.quizOnline/component/test/tags</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">uri</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">description</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">Teste de taglibs jsf</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">description</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">tag</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">firstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">tag-class</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">net.sf.quizOnline.tags.FirstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">tag-class</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">attribute</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">required</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">true</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">required</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">attribute</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">tag</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">taglib</span><span style="font-size:10pt;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>9. Registre o componente no faces-config.xml</strong></p>
<p class="MsoNormal" style="text-align:justify;">É necessário registrar o componente no arquivo de configuração do Jsf faces-config.xml. Normalmente este arquivo fica na pasta da sua aplicação web em <span>/WEB-INF.</span><span> Exemplo: </span><span>/WEB-INF/faces-config.xml</span></p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[faces-config.xml]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;?</span><span style="font-size:10pt;">xml </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;1.0&#8243; </span><span style="font-size:10pt;">encoding</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;UTF-8&#8243;</span><span style="font-size:10pt;">?&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">faces-config </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;1.2&#8243; </span><span style="font-size:10pt;">xmlns</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/xml/ns/javaee&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:xsi</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://www.w3.org/2001/XMLSchema-instance&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xsi:schemaLocation</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;!&#8211;   Custom Tags &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;!&#8211; Componente de UI do JSF para   teste &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component-type</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">net.sf.quizOnline.HtmlFirstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component-class</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>net.sf.quizOnline.tags.UIFirstJsfComponent</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component-class</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">render-kit</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">renderer</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component-family</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">javax.faces.Output</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component-family</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">renderer-type</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">net.sf.quizOnline.FirstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">renderer-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">renderer-class</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>net.sf.quizOnline.tags.FirstJsfRenderer</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">renderer-class</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">renderer</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">render-kit</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>&lt;!&#8211; IMPORTANTE: foram ocultas outras   configuração não relevantes! &#8211;&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">faces-config</span><span style="font-size:10pt;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>10. Criar um arquivo de configuração de biblioteca facelets e registrá-lo</strong></p>
<p class="MsoNormal" style="text-align:justify;">Agora precisamos configurar o facelets para utilizar o componente Jsf criado. Para criar essa ponte entre os dois, declaramos em um arquivo de configuração o nome do componente, seu tipo e o tipo do renderizador. Normalmente este arquivo fica na pasta da sua aplicação web em <span>/WEB-INF/taglib.</span><span> Exemplo: </span><span>/WEB-INF/taglib/firstJsfTag.taglib.xml</span></p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[firstJsfTag.taglib.xml]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;?</span><span style="font-size:10pt;">xml </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;1.0&#8243; </span><span style="font-size:10pt;">encoding</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;UTF-8&#8243;</span><span style="font-size:10pt;">?&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;!</span><span style="font-size:10pt;">DOCTYPE </span><span style="font-size:10pt;">facelet-taglib </span><span style="font-size:10pt;">PUBLIC </span><span style="font-size:10pt;">&#8220;-//Sun Microsystems, Inc.//DTD Facelet Taglib   1.0//EN&#8221; </span><span style="font-size:10pt;">&#8220;facelet-taglib_1_0.dtd&#8221; </span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">facelet-taglib</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">namespace</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">http://quizOnline.sf.net/firstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">namespace</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">tag</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">tag-name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">firstJsfTag</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">tag-name</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">component-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>net.sf.quizOnline.HtmlFirstJsfTag</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">renderer-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span>net.sf.quizOnline.FirstJsfTag</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">renderer-type</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">component</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">tag</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">facelet-taglib</span><span style="font-size:10pt;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="text-align:justify;">Note que os tipos declarados neste arquivo são os mesmos retornados pelos métodos presentes na classe que estende UIComponentELTag (getComponentType() e getRendererType()).</p>
<p class="MsoNormal" style="text-align:justify;">É preciso também registrar este arquivo como uma biblioteca nos parâmetros de contexto do facelets. Caso exista mais de uma biblioteca, podemos separá-las com “;” ponto e virgula. Normalmente este arquivo fica na pasta da sua aplicação web em <span>/WEB-INF.</span><span> Exemplo: </span><span>/WEB-INF/web.xml</span></p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:498.15pt;padding:0 5.4pt;" width="664" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[web.xml]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;?</span><span style="font-size:10pt;">xml </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;1.0&#8243; </span><span style="font-size:10pt;">encoding</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;UTF-8&#8243;</span><span style="font-size:10pt;">?&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">web-app </span><span style="font-size:10pt;">version</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;2.4&#8243; </span><span style="font-size:10pt;">xmlns</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/xml/ns/j2ee&#8221; </span><span style="font-size:10pt;">xmlns:xsi</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://www.w3.org/2001/XMLSchema-instance&#8221; </span><span style="font-size:10pt;">xsi:schemaLocation</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">context-param</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">param-name</span><span style="font-size:10pt;">&gt;</span><span style="font-size:10pt;">facelets.LIBRARIES</span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">param-name</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">param-value</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">/WEB-INF/taglib/firstJsfTag.taglib.xml</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">param-value</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">context-param</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&#8230;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">web-app</span><span style="font-size:10pt;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<p class="MsoSubtitle"><strong>11. Usando o componente</strong></p>
<p class="MsoNormal">Agora podemos usar o componente nas páginas xhtml. Abaixo segue o exemplo de uma página usando o componente.</p>
<table class="MsoNormalTable" style="border:medium none;border-collapse:collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border:1pt solid #548dd4;background:#dbe5f1 none repeat scroll 0;width:478.8pt;padding:0 5.4pt;" width="638" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span>[teste.xhtml]</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;?<span style="color:#3f7f7f;">xml </span><span style="color:#7f007f;">version</span><span style="color:black;">=</span><span style="color:#2a00ff;">&#8217;1.0&#8242; </span><span style="color:#7f007f;">encoding</span><span style="color:black;">=</span><span style="color:#2a00ff;">&#8216;ISO-8859-1&#8242; </span><span style="color:teal;">?&gt;</span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;!</span><span style="font-size:10pt;">DOCTYPE </span><span style="font-size:10pt;">html </span><span style="font-size:10pt;">PUBLIC </span><span style="font-size:10pt;">&#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; </span><span style="font-size:10pt;">&#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">html </span><span style="font-size:10pt;">xmlns</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://www.w3.org/1999/xhtml&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:ui</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/jsf/facelets&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:h</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/jsf/html&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:f</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/jsf/core&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:c</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://java.sun.com/jstl/core&#8221;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">xmlns:fjt</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;http://quizOnline.sf.net/firstJsfTag&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">ui:composition </span><span style="font-size:10pt;">template</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;/pages/public/template/default.xhtml&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">ui:define </span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;pageTitle&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">h:outputText </span><span style="font-size:10pt;">value</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;Pagina   de teste 3&#8243; </span><span style="font-size:10pt;">/&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">ui:define</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">ui:define </span><span style="font-size:10pt;">name</span><span style="font-size:10pt;">=</span><span style="font-size:10pt;">&#8220;corpo&#8221;</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;</span><span style="font-size:10pt;">f:view</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="background:yellow none repeat scroll 0;font-size:10pt;">&lt;</span><span style="background:yellow none repeat scroll 0;font-size:10pt;">fjt:firstJsfTag </span><span style="background:yellow none repeat scroll 0;font-size:10pt;">name</span><span style="background:yellow none repeat scroll 0;font-size:10pt;">=</span><span style="background:yellow none repeat scroll 0;font-size:10pt;">&#8220;teste123&#8243;</span><span style="background:yellow none repeat scroll 0;font-size:10pt;">/&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">f:view</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">ui:define</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;"><span> </span></span><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">ui:composition</span><span style="font-size:10pt;">&gt;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><span style="font-size:10pt;">&lt;/</span><span style="font-size:10pt;">html</span><span style="font-size:10pt;">&gt;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle"><span> </span></p>
<p class="MsoSubtitle"><strong>12. Relacionamento entre código Java e os descritivos XML</strong></p>
<p class="MsoNormal">Abaixo temos uma figura que exibe trechos de código e de arquivos XML e como eles se relacionam para a composição do componente desenvolvido. Podemos acompanhar se esquecemos de criar algum arquivo ou configuração.</p>
<p class="MsoNormal" style="text-align:center;" align="center"><span><!--[if gte vml 1]&amp;gt;                     &amp;lt;![endif]--><!--[if !vml]--><!--[endif]--></span><em></em></p>
<p class="MsoNormal" style="text-align:center;" align="center"><a href="http://ericogr.files.wordpress.com/2008/04/relacionamentoarquivoscompfaceletsv2.gif"><img class="aligncenter size-medium wp-image-11" src="http://ericogr.files.wordpress.com/2008/04/relacionamentoarquivoscompfaceletsv2.gif?w=400&#038;h=303" alt="Arquivos, configuração xml e código java" width="400" height="303" /></a></p>
<p class="MsoNormal" style="text-align:center;" align="center"><em><span style="font-size:9pt;line-height:115%;">Mapa de referência de arquivos de configuração</span></em></p>
<p class="MsoNormal" style="text-align:justify;">Note que a maioria dos arquivos não estão completos, deixei somente a parte interessante para visualizarmos o relacionamento entre eles. Por exemplo, o arquivo FirstJsfTag.java não tem a definição de pacotes, as importações, a declaração de classes, etc.</p>
<p class="MsoSubtitle"><strong>13. Referências</strong></p>
<p class="MsoNormal">Abaixo estão alguns sites que serviram de referência para montar este documento.</p>
<table class="MsoNormalTable" style="border-collapse:collapse;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">Jdk</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="http://www.sun.com/java">http://www.sun.com/java</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">facelets</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="http://facelets.java.net/">http://facelets.java.net</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">Tomcat</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="http://tomcat.apache.org/">http://tomcat.apache.org</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">JSF 1.2 (Sun)</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="https://glassfish.java.net/">https://glassfish.java.net</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">JSF Central</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="http://www.jsfcentral.com/">http://www.jsfcentral.com/</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">Introdução ao facelets</p>
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"><a href="http://www.jsfcentral.com/articles/facelets_1.html">http://www.jsfcentral.com/articles/facelets_1.html</a></p>
</td>
</tr>
<tr>
<td style="width:117.9pt;padding:0 5.4pt;" width="157" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">
</td>
<td style="width:318.15pt;padding:0 5.4pt;" width="424" valign="top">
<p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;">
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ericogr.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ericogr.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ericogr.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ericogr.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ericogr.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ericogr.wordpress.com&amp;blog=3419087&amp;post=3&amp;subd=ericogr&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://ericogr.wordpress.com/2008/04/09/criacao-de-componentes-facelets-receita-do-bolo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ee9555afe707fd6766b60dd278325861?s=96&#38;d=identicon" medium="image">
			<media:title type="html">EricoGR</media:title>
		</media:content>

		<media:content url="http://ericogr.files.wordpress.com/2008/04/relacionamentoarquivoscompfaceletsv2.gif?w=400" medium="image">
			<media:title type="html">Arquivos, configuração xml e código java</media:title>
		</media:content>
	</item>
	</channel>
</rss>
