Você está na página 1de 203

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

22
Contedo
TRABALHANDO COM TOMCAT 5.5 .......................................................................................... 9
Adicionando na IDE o Tomcat 5.5 ............................................................................................... 9
Acessando o administrador na IDE ........................................................................................ 10
Configurando Pool de Conexes no Tomcat 5.5 pelo Admin ............................................... 14
Utilizando JNDI no arquivo persistence.xml ......................................................................... 15
Listagem 1. Alterao do arquivo persistence.xml ............................................................... 15
Listagem 2. A classe JPAToplinkSessionCustomizationUtil ............................................... 16
APLICAES WEB COM ACESSO A DADOS SEM PADRO ............................................. 17
Desenvolvendo via JDBC sem padres ...................................................................................... 17
Criando o projeto ..................................................................................................................... 17
Conectando sua pgina JSP ao banco de dados .................................................................... 20
Listagem 1. Alteraes na pgina index.jsp ........................................................................... 20
Listagem 2. Alteraes na pgina formInserindoDados.jsp ................................................ 22
Listagem 3. Alteraes na pgina inserindoDados.jsp ......................................................... 23
Entendendo os principais Statements .................................................................................... 25
Explorando a interface PreparedStatement .......................................................................... 25
A biblioteca de tags SQL do JSTL ......................................................................................... 25
Listagem 4. Alteraes na pgina inserindoDados.jsp ......................................................... 27
STRUTS FRAMEWORK ............................................................................................................... 29
A origem do Struts Framework .................................................................................................. 29
Seu primeiro projeto com Struts ............................................................................................ 29
As camadas de Struts ............................................................................................................... 31
Listagem 1. Alteraes na classe NomeForm ........................................................................ 33
Listagem 2. Alteraes na classe ControleAction ................................................................. 37
Listagem 3. Alteraes na classe MeuBeanModelo............................................................... 40
Listagem 4. Alteraes na classe Constante ........................................................................... 41
Listagem 5. Alteraes na pgina welcomeStruts ................................................................. 41
Listagem 6. Alteraes na pgina sucesso.jsp........................................................................ 42
As tags do Struts ....................................................................................................................... 43
Utilizando Struts para acessar banco de dados ..................................................................... 48
Listagem 7. O JavaBean Autor ............................................................................................... 48
Listagem 8. A classe ConnectionFactory ............................................................................... 49
Listagem 9. A interface DAO .................................................................................................. 50
Listagem 10. A classe implementada AutorDAOImp .......................................................... 50
Listagem 11. A classe AutoresActionForm ............................................................................ 54
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

33
Listagem 12. A classe AutoresAction ..................................................................................... 55
Listagem 13. O resultado final configurado em struts-config.xml ...................................... 56
Listagem 14. A pgina welcomeStruts.jsp ............................................................................. 57
Listagem 15. A pgina index.jsp ............................................................................................. 58
Listagem 16. A classe EditarAutoresForm ............................................................................ 58
Listagem 17. A classe EditarAutoresAction .......................................................................... 59
Listagem 18. Alteraes no arquivo struts-config.xml ......................................................... 63
Listagem 19. Alteraes no arquivo struts-config.xml ......................................................... 64
Listagem 20. Alteraes no arquivo struts-config.xml ......................................................... 65
Listagem 21. A pgina welcomeStruts.jsp ............................................................................. 66
DESENVOLVENDO RELATRIOS COM NETBEANS IDE .................................................. 68
O JasperReports ........................................................................................................................... 68
O iReport para o NetBeans ......................................................................................................... 68
Desenvolvendo relatrios com NetBeans ............................................................................... 68
Listagem 1 Trecho do Servlet Relatorio contendo a chamada ao arquivo JasperReports
.................................................................................................................................................... 86
Listagem 2 Alterao do arquivo index.jsp ........................................................................ 88
Listagem 3 Alterao da query usada no relatrio ............................................................ 90
Listagem 4 O Servlet Relatorio ............................................................................................ 91
Listagem 5 Chamando o Servlet por mostrarAutoresCads.jsp ........................................ 92
ESTUDO DE CASO COMPLETO COM VISUAL WEB JSF ................................................... 94
Adicionando novas caractersticas ao administrador ............................................................... 94
As entidades e seus relacionamentos ...................................................................................... 94
Listagem 1. Script para criao das tabelas do projeto....................................................... 95
Adicionando novas pginas do administrador ...................................................................... 96
Listagem 2. O bean Editora .................................................................................................... 97
Listagem 3. O cdigo do link Excluir do componente Table da pgina .............................. 98
Listagem 4. O cdigo do link Atualizar do componente Table da pgina .......................... 98
Listagem 5. O cdigo do boto Salvar do formulrio da pgina ......................................... 99
Listagem 6. O cdigo do mtodo Callback prerender() da pgina ...................................... 99
A pgina de criar publicaes ............................................................................................... 100
Listagem 7. O cdigo do boto btPublicar do formulrio da pgina ................................ 102
Listagem 8. Alteraes do cdigo da pgina ........................................................................ 103
Listagem 9. Alterao em faces-config.xml para a pgina Publicar ................................. 107
A pgina de publicaes ........................................................................................................ 108
Vinculando o livro a seus autores ......................................................................................... 109
Listagem 10. Alterao na classe RequestBean1 ................................................................. 109
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

44
Listagem 11. Cdigo do link Adicionar ................................................................................ 110
Listagem 12. Cdigo do boto Adicionar ao Livro ............................................................. 112
A pgina de autores publicados ............................................................................................ 113
Listagem 13. Navegao da pgina LivroAutor para AutoresPublicados ........................ 114
Alterando o menu ................................................................................................................... 115
Criando o relacionamento entre as pginas ........................................................................ 115
Listagem 13. Arquivo faces-config.xml ................................................................................ 115
ESTUDO DE CASO COMPLETO COM VISUAL WEB JSF, SPRING E HIBERNATE
UTILIZANDO JPA ....................................................................................................................... 121
As caractersticas da aplicao ................................................................................................. 121
O Projeto ................................................................................................................................. 121
As entidades e seus relacionamentos .................................................................................... 121
As entidades POJO ................................................................................................................ 122
Listagem 1. O cdigo da entidade Usuario .......................................................................... 124
Listagem 2. O cdigo da entidade Livro .............................................................................. 125
Listagem 3. O cdigo da entidade Autor.............................................................................. 125
Listagem 4. O cdigo da entidade Editora ........................................................................... 126
Listagem 5. O cdigo da entidade Publicacao ..................................................................... 126
Utilizando o DAO genrico para criar outros ..................................................................... 128
Listagem 6. A interface BaseDao alterada ........................................................................... 128
Listagem 7. A classe BaseDaoImp alterada ......................................................................... 128
Listagem 8. A interface EditoraDao ..................................................................................... 128
Listagem 9. A classe EditoraDaoImp ................................................................................... 128
Listagem 10. A interface LivroDao ...................................................................................... 129
Listagem 11. A classe LivroDaoImp ..................................................................................... 129
Listagem 12. A interface PublicacaoDao ............................................................................. 129
Listagem 13. A classe PublicacaoDaoImp............................................................................ 129
Listagem 14. A interface UsuarioDao .................................................................................. 129
Listagem 15. A classe UsuarioDaoImp ................................................................................. 129
Listagem 16. A classe AutorDao ........................................................................................... 129
Listagem 17. A classe AutorDaoImp .................................................................................... 130
Configurando o Spring .......................................................................................................... 130
Listagem 18. Configurao do arquivo applicationContext.xml. ...................................... 131
Listagem 19. Configurando o Spring Framework em web.xml. ........................................ 132
Criando um teste unitrio ..................................................................................................... 132
Listagem 20. Teste unitrio usando o Spring Framework ................................................. 133
Controlando o acesso ............................................................................................................. 134
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

55
Listagem 21. Mtodos adicionais da classe AutorController ............................................ 135
Listagem 22. O cdigo da classe UsuarioController .......................................................... 135
Listagem 23. O cdigo da classe EditoraController ............................................................ 136
Listagem 24. O cdigo da classe LivroController ............................................................... 136
Listagem 25. O cdigo da classe PublicacaoController ...................................................... 137
Integrando o Visual Web JSF ao Spring ............................................................................. 138
Listagem 26. Alteraes no arquivo faces-config.xml ......................................................... 138
Acessando o Facade pelo Visual Web JSF ........................................................................... 139
Listagem 27. Alteraes na classe SessionBean1 ................................................................. 139
Os arquivos persistence.xml e log4j.properties ................................................................... 140
As pginas da aplicao ......................................................................................................... 140
Montando sua aplicao para utilizar Spring e Hibernate com JPA................................ 140
A criao do cadastro de livros ............................................................................................. 142
Listagem 28. Criao do mtodo getLivroController() ...................................................... 143
Listagem 29. Alteraes no mtodo prerender() ................................................................. 143
Listagem 30. Alteraes no mtodo do link Excluir ........................................................... 144
Listagem 31. Alteraes no mtodo do link Editar ............................................................. 144
Listagem 32. Alteraes no mtodo do boto Salvar .......................................................... 144
As demais pginas administrativas de cadastro simples .................................................... 146
Acessando a rea administrativa .......................................................................................... 147
Listagem 33. Criao do mtodo getUsuarioController() .................................................. 148
Listagem 34. Alteraes no mtodo prerender() ................................................................. 148
Listagem 35. Alteraes no mtodo do boto Logar ........................................................... 149
A pgina de publicao .......................................................................................................... 150
Listagem 36. Alteraes no mtodo init() da classe SessionBean1 .................................... 150
Listagem 37. O cdigo do boto btPublicar do formulrio da pgina .............................. 153
Listagem 38. Alteraes do cdigo da pgina ...................................................................... 153
Listagem 39. Alterao em faces-config.xml para a pgina Publicar ............................... 155
A pgina de publicaes ........................................................................................................ 155
Listagem 40. O bean PublicacoesBean ................................................................................. 156
Listagem 41. Alteraes na classe SessionBean1 ................................................................. 157
Listagem 42. Alteraes do mtodo prerender() ................................................................. 158
Listagem 43. Alteraes em Publicacoes.java ..................................................................... 159
Adicionando autores a livros ................................................................................................. 160
Listagem 44. Alterao na classe SessionBean1 .................................................................. 161
Listagem 45. Alteraes no mtodo prerender() ................................................................. 161
Listagem 46. Declarao do atributo autorOptions ............................................................ 161
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

66
Listagem 47. Chamando a classe AutorController ............................................................. 161
Listagem 48. Cdigo do link Adicionar ............................................................................... 163
Listagem 49. Cdigo do boto Adicionar ao Livro ............................................................. 164
Listagem 50. Cdigo de getLivroController() .................................................................... 164
A pgina de autores publicados ............................................................................................ 165
Listagem 51. Cdigo de AutoresLivroBean ......................................................................... 166
Listagem 52. Trecho do cdigo de SessionBean1 ................................................................ 167
Listagem 53. Alteraes do mtodo prerender() ................................................................. 168
Pesquisando livros na pgina principal ............................................................................... 169
Listagem 54. Alteraes na classe SessionBean1 ................................................................. 169
Listagem 55. Cdigo no boto Buscar de topo.jspf ............................................................. 169
Listagem 56 Chamada de LivroController na classe Pesquisado .................................. 170
Listagem 57 Cdigo do mtodo prerender() na classe Pesquisado ................................. 170
Listagem 58 Criao do array livros na classe Pesquisado ............................................ 170
Listagem 59 Criao do array livros na classe Pesquisado ............................................ 171
A pgina de contato................................................................................................................ 171
A navegao de pginas ......................................................................................................... 172
Listagem 60 Navegao das pginas em faces-config.xml ............................................... 174
Alterando os menus ................................................................................................................ 177
Listagem 61. Os mtodos dos links do menu Principal ...................................................... 177
Listagem 62. Os mtodos dos links do menu Administrativo ............................................ 177
Configurando um Pool para a conexo ................................................................................ 178
Trabalhando com cache de objetos ...................................................................................... 179
Listagem 63. O arquivo persistence.xml .............................................................................. 179
Listagem 64. O arquivo persistence.xml completo.............................................................. 180
Listagem 65. O arquivo ehcache.xml completo ................................................................... 182
Listagem 66. A entidade Autor ............................................................................................. 183
Listagem 67. A entidade Livro .............................................................................................. 184
Listagem 68. A entidade Editora .......................................................................................... 184
Listagem 69. A entidade Publicacao ..................................................................................... 184
Listagem 70. A entidade Usuario .......................................................................................... 185
O MYSQL ....................................................................................................................................... 186
O que um banco de dados relacional? ................................................................................... 186
Instalando o banco de dados ................................................................................................. 186
Instalando no Windows ......................................................................................................... 186
Instalando o MySQL no Linux ............................................................................................. 187
Acessando o banco de dados MySQL ................................................................................... 187
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

77
Comandos essenciais para o uso do MySQL ....................................................................... 188
Alterando tabelas existentes .................................................................................................. 189
Utilizando ndices ....................................................................................................................... 190
Tipos de tabelas .......................................................................................................................... 191
Tipo de dados .............................................................................................................................. 193
Modificadores AUTO_INCREMENT, UNSIGNED e ZEROFILL ...................................... 194
Tipos de caractere ou de dados de string ................................................................................. 195
Tipos variados ............................................................................................................................ 195
Tipos de data e hora (DATE/TIME) ........................................................................................ 196
Modificadores adicionais de coluna ......................................................................................... 196
Sintaxe bsica da SQL ............................................................................................................... 197
Funes que trabalham com a instruo SELECT................................................................. 198
Comando UPDATE ..................................................................................................................... 200
Comando DELETE ..................................................................................................................... 200
Trabalhando com Junes ........................................................................................................ 200
Criando uma juno com INNER JOIN ................................................................................... 200
Chaves variadas do MySQL ..................................................................................................... 200
O que uma chave? .................................................................................................................... 200
Como as chaves funcionam ........................................................................................................ 200
Benefcios de usar uma chave .................................................................................................... 201
Suporte de chaves do MySQL ..................................................................................................... 201
Chaves primrias (Primary Key) ................................................................................................ 201
Chaves estrangeiras (Foreign Key) ............................................................................................ 202
Excluindo uma chave estrangeira .............................................................................................. 202
Administrando o MySQL .......................................................................................................... 202
Entendendo o sistema de privilgios do MySQL ........................................................................ 202
Configurando usurios ............................................................................................................... 202
Confirmando o novo usurio ...................................................................................................... 203
Revogando privilgios ................................................................................................................. 203
Obtendo informaes com SHOW ............................................................................................. 203

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

88
SobreocontedodestesCaptulos
Embora o livro aborde uma boa parte da tcnica necessria para o desenvolvimento com aplicaes
Web envolvendo o NetBeans IDE, alguns iniciantes sentiro necessidade de um contedo mais
aprofundado, com exemplos mais complexos e completos, finalizando assim seus estudos.
Esta a idia destes captulos extras, que juntos formam um novo livro, mas com seu contedo
atrelado ao livro impresso. Isso significa, em prtica, que parte do abordado aqui, possui suas
explicaes tcnicas no livro impresso. Em outras partes, cdigos so apresentados apenas com
pequenos trechos, necessitando do livro para complet-los e conseqentemente entend-los.
Com tudo isso, quem ganha voc, caro leitor, que possui em suas mos um poderoso brinde, que
est sendo dado para melhorar e ampliar seus exemplos, sem custo a mais por isso.
Espero que goste deste brinde e que seja muito til no seu desenvolvimento sobre aplicaes
escritas em Java para a Web.

Bons cdigos,

Edson Gonalves
Autor do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

99
CaptuloExtra1
TrabalhandocomTomcat5.5
Este captulo foi escrito para os usurios que utilizam o Tomcat na verso 5.5. Ser detalhado desde
como inserir o servidor at como utilizar o Administration Tool.

AdicionandonaIDEoTomcat5.5
Para adicionar o Tomcat 5.5 no NetBeans IDE, clique com o direito do mouse sobre o item Servers
na janela Services. Selecione no menu de contexto o item Add Server.
Na caixa de dilogo Add Server Instance selecione em Server o Tomcat 5.5. Se preferir alterar o
nome contido no campo Name, basta digitar. Clique no boto Next para prosseguir.


Figura 1 Adio do Servlet Container Tomcat 5.5

Na segunda etapa, no campo Catalina Home, clique no boto Browse e selecione o local de
instalao do Tomcat 5.5.
Digite o nome de usurio no campo Username e a senha em Password. Confirme no boto Finish.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

10 10

Figura 2 Configurao do local de instalao e informaes da conta administradora

Ateno: Uma adio como esta no habilita automaticamente a opo do Monitor HTTP. Ser
necessrio ir at as propriedades e marcar Enable HTTP Monitor.



Figura 3 Tomcat 5.5 adicionado no NetBeans

Acessando o administrador na IDE
Para acessar o administrador do Tomcat, a aplicao batizada de Admin, clique novamente com o
direito do mouse sobre o servidor e selecione no menu de contexto o item View Admin Console.
Uma janela do browser se abrir e voc ter uma tela similar a Figura 4:

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

11 11
Observao: O Administration Tool no vem instalado por padro no Tomcat 5.5. Ser necessrio
baix-lo e instal-lo para ento utilizar.
1



Figura 4 Tela inicial de login do Tomcat Web Server Administration Tool

O login e a senha desta aplicao esto em um arquivo chamado de tomcat-users.xml. Este arquivo
est no diretrio da sua instalao, em: conf.
Ao abrir o arquivo, um simples XML, voc encontrar a seguinte linha:

<user username="admin" password="admin" roles="manager,admin"/>


Caso desejar, pode alterar a senha, que est no atributo password. O usurio se encontra em
username.
Aps alterar, voc precisar informar a IDE o novo login e senha. Para isso, clique com o direito do
mouse novamente sobre o Tomcat, na janela Services. Selecione no menu de contexto o item
Properties.
Na caixa de dilogo Servers voc seleciona o Tomcat 5.5, caso no esteja selecionado em Servers
e em Username voc adiciona o novo usurio e a senha em Password. Perceba tambm que
neste local em que voc pode alterar as portas do Tomcat. O padro de uma instalao do Tomcat,
fora da IDE 8080. Aps alterar basta clicar no boto Close para confirmar a caixa de dilogo.


1
Recomendo a leitura do livro Tomcat Guia Rpido do Administrador Cincia Moderna - 2006
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

12 12

Figura 5 Caixa de dilogo Servers com o Tomcat 5.5 selecionado

Existem casos em que voc precisar fazer o undeploy diretamente pelo administrador. Isso
geralmente ocorre quando a IDE no consegue faz-lo. Para fazer no Tomcat, na aplicao Admin,
expanda o n de Service e clique em Host (localhost).


Figura 6 Selecionando Host
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

13 13

No Frame direito, voc ver uma caixa de seleo em Host Actions. Clique em Available Actions
e selecione Delete Existing Contexts.


Figura 7 Excluindo um contexto existente

O frame exibir Delete This Context. Selecione o contexto que deseja excluir, em Delete,
simplesmente checando o item e clique no boto Save.


Figura 8 Selecionando o contexto que ser removido

Para refletir as alteraes feitas no Tomcat, atravs do NetBeans, volte a janela Services e com o
direito do mouse sobre o Tomcat 5.5 selecione o item Refresh no menu de contexto.
Voc tambm pode clicar com o direito do mouse sobre Web Applications onde apenas um item, o
Refresh, aparecer.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

14 14

Figura 9 Refletindo as alteraes no NetBeans

Configurando Pool de Conexes no Tomcat 5.5 pelo Admin
Na janela Services, com o Container Servlet Tomcat 5.5 em execuo, clique com o direito do
mouse e selecione o item View Admin Console. Entre com seu login e senha na rea
administrativa.
Dentro do administrador, no frame esquerdo, expanda o n Resources e clique em Data Sources.
Em Data Source Actions, no menu drop down, selecione Create New Data Source.


Figura 10 Criando um novo Data Source pelo Admin do Tomcat 5.5

Preencha os campos de Data Source como mostrado na Figura 11 a seguir e salve as alteraes
clicando no boto Save.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

15 15

Figura 11 Data Source configurado

Utilizando JNDI no arquivo persistence.xml
Para trabalhar com JPA, aqui h os passos de como utilizar o JNDI em seu arquivo de persistncia.
No NetBeans abra o arquivo persistence.xml, no seu projeto que utiliza o Tomcat, e coloque em
XML.
Altere o XML do arquivo para o mostrado na Listagem 1 a seguir:


Listagem1. Alterao do arquivo persistence.xml
...
<persistence-unit name="livraria">
<non-jta-data-source>
java:comp/env/jdbc/livraria
</non-jta-data-source>

<class>br.com.integrator.Autor</class>
<class>br.com.integrator.Livro</class>
<properties>
<property name="toplink.session.customizer"
value="br.com.integrator.util.JPAToplinkSessionCustomizationUtil"/>
<property name="toplink.logging.level" value="INFO"/>
</properties>

</persistence-unit>
...

Um tpico caso de uma transao JTA, utilize um elemento chamado de <jta-data-source/>no qual
voc especifica o JNDI do acesso ao banco de dados. Similarmente em uma transao do tipo
resource-local, na unidade de persistncia o elemento <non-jta-data-source /> usado.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

16 16

<non-jta-data-source>
java:comp/env/jdbc/livraria
</non-jta-data-source>

Nos elemento <properties/>voc tem dois elementos <property/>, onde um contm uma chamada a
uma classe que persistir a sesso.
Dentro do pacote br.com.integrator.util, crie uma classe, que se chamar de
JPAToplinkSessionCustomizationUtil.
Adicione o cdigo da Listagem 2 a seguir nesta classe:


Listagem2. A classe JPAToplinkSessionCustomizationUtil
...
public class JPAToplinkSessionCustomizationUtil implements SessionCustomizer {

public void customize(Session session) throws Exception{
JNDIConnector connector = (JNDIConnector)session.getLogin( ).getConnector( );
connector.setLookupType(JNDIConnector.STRING_LOOKUP);
}


}

Fixe as importaes com Ctrl + Shift + I. No se esquea de adicionar o Resource References do
seu JNDI no deployment descriptor.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

17 17
CaptuloExtra2
AplicaesWebcomacessoadadossempadro
Este captulo foi escrito para desenvolvedores iniciantes que esto comeando com aplicaes Web
em Java e desejam aprender o bsico antes de iniciar o trabalho com padres de desenvolvimento
como MVC e DAO.

DesenvolvendoviaJDBCsempadres
Para comear, uma breve reviso de como adicionar uma biblioteca JDBC, caso voc no tenha a
do banco de dados que vai utilizar. Para o exemplo, ser utilizado o MySQL, por estar sendo
abordado ao longo do livro.

Criando o projeto
Crie um novo projeto no NetBeans e o chame de TrabComJDBCeMySQL. No seu projeto gerado,
clique com o direito do mouse sobre o item Libraries. No menu de contexto, voc possui as opes
para escolher:
1. Add Library - Adiciona uma biblioteca configurada no NetBeans IDE.
2. Add JAR/Folder - Adicione um JAR ou Diretrio em apenas um projeto da IDE.
3. Add Project Adiciona um projeto e conseqentemente suas dependncias.



Figura 1 Adicionando uma nova biblioteca

Selecione a opo Add Library no menu de contexto. Na caixa de dilogo Add Library clique no
boto Manage Libraries.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

18 18

Figura 2 Adicionando uma nova biblioteca

Na caixa de dilogo Library Manager clique no boto New Library. Digite MySQL em Library
Name, na caixa de dilogo New Library. Selecione Class Libraries, em Library Type, caso no
esteja selecionado e clique no boto OK para confirmar.


Figura 3 Criando uma nova biblioteca no NetBeans



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

19 19
Voltando a caixa de dilogo Library Manager, com a biblioteca MySQL criada, selecionada em
Libraries, clique no boto Add JAR/Folder e selecione a biblioteca JDBC do MySQL e depois
confirme a caixa de dilogo.


Figura 4 Adio do arquivo JAR

Selecione em Add Library a biblioteca MySQL adicionada e clique no boto Add Library.


Figura 5 Adicionando a biblioteca ao projeto

Voltando em seu projeto, voc dever ver a biblioteca MySQL adicionada em seu projeto.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

20 20

Figura 6 Biblioteca JDBC do MySQL adicionada ao projeto

Conectando sua pgina JSP ao banco de dados
Para que voc entenda como funciona a conexo e a leitura de dados de um banco de dados, altere a
pgina index.jsp adicionando os cdigos da Listagem 1 a seguir, para trabalhar com o MySQL.


Listagem1. Alteraes na pgina index.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"
import="java.sql.*"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Conectando sua aplicao JSP ao MySQL via JDBC</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>ID</th><th>Ttulo</th>
</tr>
</thead>
<tbody>
<%
Connection conn = null;
Statement st = null;
ResultSet rs = null;

try {
Class.forName("com.mysql.jdbc.Driver").newInstance( );

conn =
DriverManager.getConnection(
"jdbc:mysql://localhost/livraria",
"edson","integrator");

st = conn.createStatement( );
rs = st.executeQuery("select id, titulo from livros");

while(rs.next( )) {
%>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

21 21

<tr>
<td><%= rs.getString("id") %></td>
<td><%= rs.getString("titulo") %></td>
</tr>
<%
} //end while

} catch (Exception ex) {
ex.printStackTrace( );
} finally {
if (rs != null) rs.close( );
if (st != null) st.close( );
if (conn != null) conn.close( );
}
%>
</tbody>
</table>

</body>
</html>


Dentro do bloco try...catch voc define o trabalho com o banco de dados para se conectar e
executar a instruo SQL.
Ao importar o pacote java.sql.*, atravs da diretiva page, voc tem acesso s classes e interfaces
para manipular os bancos de dados relacionais em Java.
O driver de banco de dados deve ser empregado antes do programa se conectar ao banco de dados.
A linha anterior utiliza o mtodo static forName da classe Class (pacote java.lang) para carregar a
definio de classe para o driver de banco de dados.
Se a classe no for localizada, ele dispara uma exceo: java.lang.ClassNotFoundException.
Um objeto Connection gerencia a conexo entre o programa Java e o banco de dados. Ele tambm
fornece suporte ao programa para executar instrues SQL.
Atravs do mtodo static getConnection, a classe DriverManager tenta uma conexo com o banco
de dados especificado pela string: jdbc:mysql://localhost/livraria. Os argumentos seguintes so o
nome de usurio e a senha, demonstrados pela String edson e integrator respectivamente.
Caso a classe DriverManager no conseguir se conectar ao banco de dados, o mtodo
getConnection dispara uma exceo:
A responsabilidade principal da interface Statement executar sentenas SQL no banco de dados.
Com o mtodo pblico createStatement voc cria um objeto Statement para enviar declaraes
SQL ao banco de dados. Se houver um erro, dispara tambm a exceo java.sql.SQLException.
Com o mtodo executeQuery, voc tem o retorno de um objeto que implementa ResultSet e que
contm os resultados da consulta.
Atravs de um loop while voc varre os resultados encontrados, onde o mtodo next( ), de
ResultSet, retorna um valor booleano true, quando o resultado das linhas pesquisadas na query
forem exauridas.
O mtodo getString( ), de ResultSet, traz o valor da coluna designada na fila atual deste ResultSet
como uma String na linguagem Java.
Depois de consumidos, os recursos devem ser retornados ao servidor, utilizando o mtodo close( ).
Nesse caso a clusula usada finally, que liberar os recursos, caso os resultados sejam bem
sucedidos ou no.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

22 22

Figura 7 Exibio dos livros cadastrados

Inserindodados
O exemplo que ser feito ir ilustrar a insero de dados no banco de dados. Voc ter em uma
pgina JSP, um formulrio HTML comum, sem cdigo dinmico, contendo os campos necessrios
para inserir. Esse formulrio ir enviar os dados, via mtodo POST, para outra pgina JSP, que
recuperar essas informaes e as enviar para o banco de dados MySQL.
Crie uma nova pgina JSP e a chame de formInserindoDados.jsp. Altere-a como mostra a
Listagem 2 a seguir.


Listagem2. Alteraes na pgina formInserindoDados.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Inserindo Dados</title>
</head>
<body>
<form action="inserindoDados.jsp" method="post">
<table>
<tr>
<td>Ttulo:</td>
<td><input type="text" name="titulo" /></td>
</tr>
<tr>
<td>Edio:</td>
<td><input type="text" name="edicao" /></td>
</tr>
<tr>
<td>Publicao:</td>
<td><input type="text" name="publicacao" /></td>
</tr>
<tr>
<td>Descrio:</td>
<td>
<textarea name="descricao" rows="5" cols="25"></textarea>
</td>
</tr>
<tr>
<td colspan="2">
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

23 23
<input type="submit" name="btCadastrar" value="Enviar" />
</td>
</tr>
</table>
</form>
</body>
</html>


Como essa uma pgina simples com um formulrio bsico contendo apenas contedo HTML, no
haver comentrios sobre o mesmo.



Figura 8 Formulrio de cadastro


A pgina JSP que ir receber esses valores ser chamada de inserindoDados.jsp e mostrada a na
Listagem 3 a seguir:


Listagem3. Alteraes na pgina inserindoDados.jsp
<%@page language="java"
contentType="text/html;"
pageEncoding="ISO-8859-1"
import="java.sql.*"
%>
<%
String titulo = request.getParameter("titulo");
String edicao = request.getParameter("edicao");
String publicacao = request.getParameter("publicacao");
String descricao = request.getParameter("descricao");

Connection conn = null;
PreparedStatement pst = null;

try {
Class.forName("com.mysql.jdbc.Driver").newInstance( );
conn =
DriverManager.getConnection("jdbc:mysql://localhost/livraria",
"edson","integrator");

String SQL = "INSERT INTO livros (titulo, edicao, " +
"publicacao, descricao) " +
"values (?, ?, ?, ?)";


pst = conn.prepareStatement(SQL);

pst.setString(1, titulo);
pst.setInt(2, Integer.parseInt(edicao));
pst.setString(3, publicacao);
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

24 24
pst.setString(4, descricao);

pst.executeUpdate( );
pst.clearParameters( );

} catch (Exception ex) {
ex.printStackTrace( );

} finally {

if (pst != null) pst.close( );
if (conn != null) conn.close( );

}
%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Inserindo Dados</title>
</head>
<body>

<h3>O Livro <%=titulo %> foi inserido com sucesso!</h3>

</body>
</html>



Figura 9 Cadastro inserido


A interface PreparedStatement tem um papel semelhante interface Statement, o que nos permite
executar sentenas SQL sobre uma conexo estabelecida com um banco de dados. Porm, neste
caso, voc utiliza sentenas mais especializadas, como a de inserir dados, onde voc pode receber
vrios parmetros como entrada.
Um parmetro de entrada aquele cujo valor no se especifica quando a sentena criada. No seu
lugar a sentena recebe um sinal de interrogao (?) para cada parmetro de entrada. Antes de
executar a sentena, voc deve especificar um valor para cada parmetro, atravs dos mtodos set
apropriados.
Para criar um objeto PreparedStatement voc deve lanar um mtodo prepareStatement(String s)
da interface Connection sobre o objeto que representa a conexo estabelecida com o banco de
dados.
Atravs do mtodo setString(int i, String s) , voc prepara os dados que esto vindo dos campos
do seu aplicativo para inserir no banco de dados. Como voc mesmo j concluiu, o tipo string foi
utilizado graas ao tipo existente no banco de dados.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

25 25
O mtodo setInt(int i, int i) faz o mesmo que o anterior, mas exige um valor inteiro. Com o mtodo
executeUpdate( ) voc executa a sentena SQL para o tipo, que no caso de insero (INSERT).
Esse mtodo tambm serve para os atualizaes (UPDATE) e excluses (DELETE).
Aps utilizar os mtodos setter, voc pode limp-los usando o mtodo clearParameters( ) .

Entendendo os principais Statements
Como voc viu, Statements so essenciais para se comunicar com uma base de dados que usa a
linguagem SQL. H trs principais tipos de Statements. O primeiro a interface Statement. Quando
so criados objetos pela implementao da interface Statements , estes so geralmente usados para
executar declaraes SQL genricas que no levam qualquer parmetro. O segundo tipo o
PreparedStatement que herda da interface Statement. Objetos PreparedStatement so teis quando
voc precisar criar e compilar declaraes SQL antes do tempo. Objetos PreparedStatement tambm
aceitam parmetros IN.
O tipo final de statement o CallableStatement. O CallableStatement herda de PreparedStatement e
aceita parmetros IN e OUT. Seu propsito principal executar procedimentos armazenados de
banco de dados.

Explorando a interface PreparedStatement
Se voc precisar executar declaraes SQL muitas vezes, o PreparedStatement a escolha perfeita
para essa tarefa, isso porque aumenta a eficincia e desempenho do programa. O PreparedStatement
a escolha lgica do nome para a interface porque contm uma declarao SQL que previamente
foi compilada e enviada ao DBMS de sua escolha, por isso o termo prepared.
O PreparedStatement d o desenvolvedor que a habilidade de embutir parmetros na declarao
SQL contidos no objeto PreparedStatement. Estes parmetros IN (de entrada) so denotados na
declarao SQL pelo smbolo de interrogao (?).
A Tabela 1 mostra os mtodos setters que indicam os tipos para PreparedStatement:


Tabela 1 Mtodos setters para PreparedStatement
Mtodo void Descrio
setBoolean(int paramIndex, boolean b) Parmetro de entrada com valor booleano.
setDate(int paramIndex, Date d) Parmetro de data de entrada. Deve ser um valor
java.sql.Date.
setDouble(int paramIndex, double d) Parmetro de entrada com valor double.
setFloat(int paramIndex, float f) Parmetro de entrada com valor float.
setInt(int paramIndex, int i) Parmetro de entrada com valor int.
setLong(int paramIndex, long l) Parmetro de entrada com valor long.
setString(int paramIndex, String s) Parmetro de entrada com valor String.
clearParameters( ) Limpa os parmetros enviados pelos mtodos setters.

A biblioteca de tags SQL do JSTL
Embora seja desencorajado o uso de tags SQL da biblioteca JSTL em aplicaes de pginas JSP,
voc apenas conhecer um exemplo de seu uso.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

26 26
Crie um novo projeto e adicione a biblioteca JSTL junto a biblioteca MySQL.

Aaction<sql:setDataSource/>
As aes fornecidas pela tag da biblioteca SQL operam em uma fonte de dados definida pela classe
java.sql.DataSource. A action <sql:setDataSource /> configura uma fonte de dados e transmite essa
informao atravs do atributo var, em uma fonte de dados criada no escopo da pgina ou em
dataSource para uma fonte de dados fsica.
A fonte de dados configurada usada pelas actions restantes da biblioteca SQL que pode executar
as instrues j conhecidas. Voc pode configurar o data source da seguinte forma:

<sql:setDataSource var="dataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/livraria" user="edson"
password="integrator"/>


Tabela 2 Atributos e descrio da action <sql:setDataSource/>
Atributo Descrio
driver O nome da classe JDBC que ser usada.
scope A varivel de escopo definida pelo atributo var. Por padro esse atributo
page.
url O URL do data source.
user O usurio para acessar o banco de dados configurado no atributo url.
password A senha para acessar o banco de dados configurado no atributo url.
var A varivel de escopo criada para acessar o data source em outras actions.

O data source tambm pode ser definido como:

<sql:setDataSource dataSource="jdbc/LivrariaDB"/>

Como voc pode ver, possvel fornecer um caminho relativo a um recurso Java Naming and
Directory Interface (JNDI) pelo atributo opcional dataSource. Se voc tiver um nome JNDI para
o dataSource, ento o atributo dataSource acessar pela pgina JSP a fonte de dados JNDI. Neste
caso, voc no precisa fornecer quaisquer um dos demais atributos, porque eles j so fornecidos
como parte do recurso acessado pelo JNDI.

Aaction<sql:query/>
A action <sql:query /> fornece a funcionalidade de executar queries do tipo SELECT:

<sql:query var="livros" dataSource="${dataSource}" >
SELECT * FROM livros
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

27 27
</sql:query>

O exemplo da Listagem 4 demonstra o uso da conexo e da execuo de uma query com as tags
SQL do JSTL:


Listagem4. Alteraes na pgina inserindoDados.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Usando instrues SQL com JSTL</title>
</head>
<body>
<sql:setDataSource var="dataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/livraria"
user="edson" password="integrator" />

<sql:query var="livros" dataSource="${dataSource}">
SELECT * FROM livros
</sql:query>

<table border="1">
<tr>
<th>ID</th>
<th>Ttulo</th>
</tr>
<c:forEach var="row" items="${livros.rows}">
<tr>
<td><c:out value="${row.id}" /></td>
<td><c:out value="${row.titulo}" /></td>
</tr>
</c:forEach>
</table>


</body>
</html>

Os cabealhos so definidos na diretiva taglib, como j vista anteriormente. A URI do primeiro
cabealho chama as tags CORE e o segundo cabealho so as tags de SQL. O prefixo usado a
letra "sql", que um padro definido pela Sun.

<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

O data source definido nesse caso com a conexo feita diretamente na pgina. No se esquea de
que necessrio colocar o .jar da ponte JDBC do MySQL no diretrio lib de WEB-INF.

<sql:setDataSource var="dataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/livraria"
user="edson" password="integrator" />


A query criada, nesse caso selecionando todos os registros encontrados na tabela livros.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

28 28

<sql:query var="livros" dataSource="${dataSource}">
SELECT * FROM livros
</sql:query>


Com a action <c:forEach /> voc tem uma varredura dos resultados encontrados dentro da tabela
livros, resultantes da SELECT. Dentro do atributo items voc determina a varivel livros usando a
EL e separando por um "." ponto seguido da palavra rows.

<c:forEach var="row" items="${livros.rows}">

Os resultados so exibidos utilizando-se a EL contendo a varivel determinada no atributo var
existente na action <c:forEach />, separado por ponto . e o nome da coluna a ser exibida.

<td><c:out value="${row.isbn}" /></td>

O resultado similar ao exibido no exemplo dado com a pgina JSP.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

29 29
CaptuloExtra3
StrutsFramework
Este captulo extra o instruir no desenvolvimento com Struts Framework utilizando o NetBeans
IDE 6. O Struts se encontra atualmente na verso 2, que at o momento em que este livro escrito,
no h um suporte direto pela IDE. A verso que suportada pelo NetBeans, do Struts, 1.2.9, a que
ser tratada neste captulo.
AorigemdoStrutsFramework
Jakarta Struts um framework open source, escrito em Java, de desenvolvimento Web, mantido
pela Apache Software Foundation (ASF).
O framework Struts foi criado por Craig R. McClanaham e doado para a ASF no ano 2000.
Como implementao do paradigma MVC (Model-View-Controller), utilizando um padro similar
ao Model 2, esse framework um dos mais populares entre os desenvolvedores.
Seu primeiro projeto com Struts
Seguindo um padro tradicional da IDE, o suporte a Struts pouco visual, ou seja, existem poucos
assistentes que o auxiliaro no trabalho com este Framework. Partindo deste princpio, o primeiro
exemplo ser pequeno para que voc compreenda as principais caractersticas do desenvolvimento
de Struts com o NetBeans IDE.
Comece criando uma aplicao Web comum. Digite o nome do seu projeto, que no caso do livro
ser PrimProjStruts e selecione como Server o Tomcat. Clique no boto Next.


Figura 1 Criando um projeto com Struts

Na ltima etapa do assistente, no utilizada at o momento no livro, no desenvolvimento de
aplicaes web, voc encontra os dois frameworks padro existentes no NetBeans IDE. Selecione o
Framework Struts, marcando a opo Struts 1.2.9.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

30 30
Observe que o campo Action Servlet Name j contm uma configurao que no pode ser alterada.
Em Action URL Pattern voc percebe a extenso criada, que no caso seguiremos o padro *.do.
Altere o pacote j preenchido no campo Application Resource para
br.com.integrator.struts.ApplicationResource (ou o nome do pacote que
desejar.struts.ApplicationResource) e clique no boto Finish.


Figura 2 Seleo e configurao em web.xml do framework Struts na terceira etapa

Ao concluir o projeto, voc perceber que o NetBeans IDE criou em Web Pages duas pginas:
index.jsp (o padro at o momento) e welcomeStruts.jsp. Ao expandir o n de Libraries, voc
notar que existem as bibliotecas necessrias para o desenvolvimento de Struts em suas pginas.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

31 31

Figura 3 Bibliotecas do Struts sendo exibida em Libraries

Para uma aplicao que utilize o framework Struts, o NetBeans IDE adiciona oito arquivos do tipo
JAR:

1. commons-beanutils.jar
2. commons-fileupload.jar
3. commons-digester.jar
4. commons-logging.jar
5. commons-validator.jar
6. antlr.jar
7. jakarta-oro.jar
8. struts.jar

Em um ambiente de produo, estas bibliotecas devem estar disponveis em sua aplicao no
diretrio lib, encontrado em WEB-INF.

As camadas de Struts
Uma vez que o Struts trabalha dentro do paradigma MVC, voc vai analisar cada camada em um
pequeno exemplo para entend-lo melhor. Esta aplicao ser uma classe que receber um nome
vindo de um formulrio.

AcamadaModelo
Crie um novo arquivo no NetBeans IDE, selecione na caixa de dilogo em Categories o item
Struts e em File Types o item Struts ActionForm Bean. Clique no boto Next para prosseguir.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

32 32

Figura 4 Seleo do tipo de arquivo Struts ActionForm Bean

Na segunda e ltima etapa, coloque NomeForm em Class Name e em Package escreva o nome do
seu pacote (seguindo o livro: br.com.integrator). Clique no boto Finish para concluir.


Figura 5 Nome da classe ActionForm e do pacote

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

33 33
A classe gerada pelo NetBeans IDE contm uma pr-configurao que o ajudar a desenvolver o
exemplo. Nesta classe, altere o atributo name criado, utilizando refactor. Clique com o direito do
mouse sobre este atributo e selecione no menu de contexto o item Refactor e clique em Rename.
Na caixa de dilogo Rename Field digite nome em New Name. Desmarque a opo Preview All
Changes (caso esteja marcada) e clique no boto Next para concluir.



Figura 6 Refatorando o atributo name

Apague os mtodos acessores do anterior e refaa novamente (get e set do atributo nome). Altere o
mtodo validate(), como mostrado a seguir, em destaque, na Listagem 1 do cdigo da classe
NomeForm:


Listagem1. Alteraes na classe NomeForm
package br.com.integrator;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

public class NomeForm extends org.apache.struts.action.ActionForm {

private String nome;

public String getNome() {
return nome;
}

public void setNome(String string) {
nome = string;
}


public NomeForm() {
super();
}

//mtodo que retorna um erro de validao caso nome no seja preenchido no formulrio
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (getNome() == null || getNome().length() < 1) {
errors.add("nome", new ActionMessage("errors.required"));
}
return errors;
}
}


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

34 34
A classe NomeForm estende org.apache.struts.action.ActionForm, no qual trata eventos de
formulrio.
Para cada campo em um formulrio HTML, h uma varivel com mtodos getters e setters no bean
Form para captur-lo. O controller Struts popula o formulrio HTML chamando os mtodos getters
no bean Form. Quando o usurio submete o formulrio, o controller Struts injeta informaes no
bean Form com dados vindos deste formulrio HTML, chamando mtodos setters na instncia do
bean Form.
Com o mtodo validate( )voc retorna um objeto ActionErrors. A classe ActionErrors encapsula um
ou mais erros que so encontrados pela aplicao. Os problemas encontrados so representados pela
instncia de org.apache.struts.action.ActionError.
Para mostrar a mensagem ao usurio, uma classe chamada para isso. A classe
org.apache.struts.action.ActionMessage opera da mesma maneira que a classe ActionError. Na
realidade, a classe ActionMessagefoi acrescida como superclasse ActionError.

Asmensagensenviadasaousurio
Na janela Projects expandas os ns de Source Packages e do pacote br.com.integrator.struts. No
arquivo ApplicationResource.properties clique com o direito do mouse e selecione o item Open no
menu de contexto.
Remova os key-values existentes mantendo apenas os mostrados na Figura 7 a seguir:


Figura 7 Alteraes no arquivo ApplicationResource.properties


Em Value da Key errors.requiredaltere para O Campo Nome obrigatrio. Salve e feche o
arquivo.
Estes textos alterados, encontrados no arquivo ApplicationResource.properties, so usados pela tag
Struts <html:errors />, na pgina que ainda ser desenvolvida. So textos que podem ser
personalizados e, portanto, poder conter as informaes que desejar. Voc tambm pode adicionar
tags HTML se preferir dar um formato melhor nos textos de sada gerados pelas pginas Struts,
como feito em errors.header, errors.prefix, errors.suffixe errors.footer.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

35 35
CriandoaaoemStruts
A ao em Struts ser a responsvel pela recuperao do nome digitado pelo usurio e a interao
com a camada Modelo. Sua responsabilidade dar navegao e Controle para a camada
Apresentao.
Crie um novo arquivo onde, na caixa de dilogo, em Struts, selecione Struts Action em File Types
e prossiga.


Figura 8 Criando um novo arquivo do tipo Struts Action

Na segunda etapa, digite ControleActionno campo Class Name. O pacote ser br.com.integrator(ou
o que est usando). Em Action Path digite /NomeForm e clique no boto Next.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

36 36

Figura 9 Criando a classe ControleAction

Na ltima etapa defina no campo Input Resource, clicando no boto Browse, a seleo da pgina
welcomeStruts.jsp. Em Scope selecione o boto de rdio Request. Termine o assistente clicando no
boto Finish.


Figura 10 Configurao para o bean ActionForm

Na classe ControleActiongerada, e deixe seu cdigo similar ao mostrado na Listagem 2 a seguir.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

37 37
Listagem2. Alteraes na classe ControleAction
package br.com.integrator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

public class ControleAction extends org.apache.struts.action.Action {

/* forward name="success" path="" */
private final static String SUCCESS = "success";

/**
* This is the action called from the Struts framework.
* @param mapping The ActionMapping used to select this instance.
* @param form The optional ActionForm bean for this request.
* @param request The HTTP Request we are processing.
* @param response The HTTP Response we are processing.
* @throws java.lang.Exception
* @return
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

String nome =
(String) PropertyUtils.getSimpleProperty(form, "nome");


MeuBeanModelo mb = new MeuBeanModelo();
mb.setNome(nome);

request.setAttribute(Constante.NOME_KEY, mb);

return mapping.findForward(SUCCESS);


}
}


Fixe as importaes. Existem dois pontos nesta classe que no podero ser fixados: uma o
MeuBeanModelo, um Bean que ainda no foi feito e o outro a constante Constante.NOME_KEY, que
est na mesma situao. No se preocupe que voc os far logo a seguir.
Uma classe org.apache.struts.action.Actionno framework Struts uma extenso do componente
controller.
A classe Actionpega o pedido do cliente para o modelo de negcios. Esta mesma classe tambm
pode executar outras funes, como autorizao, login e validao de sesso antes de invocar a
operao de negcios.
A Action Struts contm diversos mtodos, mas o mais importante o execute(). Esse mtodo
contm a seguinte assinatura:


public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception


O mtodo execute() chamado pelo controlador quando um pedido recebido de um cliente. O
controlador cria uma instncia da classe Actionse ainda no existir.
O framework Struts cria somente uma instncia de cada classe Actionem sua aplicao. Como pode
haver muitos usurios, voc tem que assegurar que todas suas classes Actionoperem corretamente
em um ambiente de multithreaded, da mesma maneira que faria ao desenvolver um Servlet.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

38 38
O mapeamento Action parte da informao da configurao do Struts, encontrado em um arquivo
XML especial. Esta informao configurada carregada na memria, durante a inicializao, e
disponibilizada para o framework em tempo de execuo. Este elemento representado na memria
por uma instncia da classe org.apache.struts.action.ActionMapping. O objeto ActionMapping
contm o atributo path, que encontrado no arquivo XML da configurao do framework, em
contraste a uma poro de URI de pedido entrante.
Observe a seguir o trecho listado do arquivo de configurao struts-config.xml da sua aplicao:

<action-mappings>

<action input="/welcomeStruts.jsp"
name="NomeForm"
path="/NomeForm"
scope="request"
type="br.com.integrator.ControleAction"/>

<action path="/Welcome" forward="/welcomeStruts.jsp"/>

</action-mappings>

Para que seja determinada para onde sero enviados os dados, voc precisa utilizar o mtodo
findForward().
Na assinatura do mtodo execute()da classe Action, voc deve ter notado que o tipo de retorno para
o mtodo uma classe org.apache.struts.action.ActionForward.
A classe ActionForwardrepresenta um destino para o qual o controlador pode retornar uma vez que
a Action foi completa.
A action forward especificada no arquivo de configurao XML do framework Struts (struts-
config.xml), similar a action mapping.
Embora o NetBeans IDE j tenha configurado boa parte das informaes contidas no arquivo struts-
config.xml, voc precisar mapear para onde ser enviado os dados preenchidos no formulrio caso
seja bem sucedido.
Com o direito do mouse sobre o trecho mostrado anteriormente, em detalhes na Figura 11, entre os
elementos <action />, de struts-config.xml, selecione Struts e clique no item Add Forward.



Figura 11 Adicionando o elemento <forward /> ao arquivo struts-config.xml

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

39 39
Na caixa de dilogo Add Forward digite, no campo Forward Name, a palavra success, que como
voc deve lembrar, retornado pelo mtodo findForward() da classe ControleAction. No campo
Resource File, ser colocada a pgina que receber os dados enviados pela Action, no qual ser
chamada de sucesso.jsp. Esta pgina ainda no foi criada, portanto no ser possvel selecion-la
(apenas digite seu nome neste campo). A Figura 12 a seguir demonstra o resultado final de sua
caixa de dilogo.


Figura 12 Configurao do elemento <forward /> atravs do dilogo Add Forward


Ao clicar no boto Add para confirmar, perceba que o elemento <forward /> adicionado ao
arquivo struts-config.xml. Os atributos name e path foram adicionados com as informaes
transmitidas pela caixa de dilogo.



Figura 13 Situao final dos elementos encontrados em <action-mappings/>


Para transmitir o nome digitado para a outra pgina, o mtodo getSimpleProperty() da classe
PropertyUtils recebe do formulrio o contedo do campo nome, como voc o adicionou na classe
ControleAction:

String nome = (String) PropertyUtils.getSimpleProperty(form, "nome");

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

40 40
Para que se possa recuperar a informao enviada pelo formulrio, um bean ser criado para
persistir a informao passada para outra pgina.
O bean ser chamado de MeuBeanModeloe conter apenas a possibilidade de captar e transmitir o
nome digitado no formulrio que ser criado na pgina JSP utilizando Struts.
Crie uma classe chamada de MeuBeanModeloe a coloque dentro do pacote br.com.integrator (ou o
principal que estiver utilizando em seu projeto).



Figura 14 Criao do bean MeuBeanModelo


O bean que criado apenas para dar o acesso ao atributo nome, no qual ser enviado pela Action e
recuperada pela pgina sucesso.jsp, exibindo assim os dados encontrados.
Altere a classe MeuBeanModelocomo mostrado na Listagem 3 a seguir:


Listagem3. Alteraes na classe MeuBeanModelo
package br.com.integrator;

public class MeuBeanModelo {
private String nome;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public MeuBeanModelo() {
}

}

Passandodadosparaacamadadeapresentao
Como j dito, a classe ControleActionpassa o valor recebido pelo campo nome, do formulrio, para
a prxima pgina, que ainda ser criada, atravs do mtodo setAttribute().

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

41 41
request.setAttribute(Constante.NOME_KEY, mb);


Quando se passa um objeto de ActionClass para o componente encontrado na View (uma pgina
JSP) usando request.setAttribute(), voc precisa fornecer um nome, ou identificador String que o
arquivo JSP possa usar para recuperar o objeto. Para isso, crie uma classe Java, chamada de
Constante, coloque-a no pacote principal (br.com.integrator) e a transforme em uma constante como
mostrado na Listagem 4 a seguir:


Listagem4. Alteraes na classe Constante
package br.com.integrator;

public final class Constante {

public static final String NOME_KEY = "integrator";

}


Oformulrioqueenviaronome
Como o NetBeans IDE tem o costume de iniciar um projeto com arquivos j pr-configurados, entre
no arquivo welcomeStruts.jspe altere o contedo como mostrado na Listagem 5 a seguir:


Listagem5. Alteraes na pgina welcomeStruts
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>

<html:html locale="true">
<head>
<title>Minha primeira pgina usando Struts</title>
<html:base />
</head>
<body>

<html:form action="/NomeForm.do" >

Nome: <html:text property="nome" size="16" maxlength="16"/>

<br />

<html:submit property="submit" value="Enviar"/>

</html:form>

<p>
<html:errors/>
</p>

</body>

</html:html>


Assim como ocorre com outras bibliotecas de tags, o Struts configurado em sua pgina atravs da
diretiva taglib, onde existem as bibliotecas que manipulam o HTML e outras. No caso, apenas a
biblioteca de HTML ser necessria.

<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

42 42

Dentre as tags Struts adicionadas na pgina, uma em especial, a tag <html:form/>, cria um
formulrio para envio de dados pelo framework. No atributo action voc configura para onde o
formulrio ser enviado, que no caso ser NomeForm.do. Lembre-se de que o elemento <action-
mappings />, em struts-config.xml, no sub-elemento <action />, foi configurado esse caminho para o
envio de dados (veja Figura 13).
A tag Struts <html:text /> a responsvel pela gerao da caixa de texto que receber o nome a ser
digitado. Atravs do atributo property voc determina o nome da caixa de texto.
Com a tag Struts <html:submit />voc cria o boto de envio e seu tipo determinado pelo atributo
property. O atributo value indica o rtulo do boto, como ocorre no HTML comum.
Por fim, a tag Struts <html:errors />que resulta na mensagem de erro trazida pela classe NomeForm.


Apginaqueresultanosucessodoenvio
Para finalizar, crie uma nova pgina JSP chamada de sucesso. Altere-a como mostra a Listagem 6 a
seguir:


Listagem6. Alteraes na pgina sucesso.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html:html>
<head>
<title>Seja bem vindo</title>
</head>
<body>

<logic:present name="integrator" scope="request">

<h2>
<bean:write name="integrator" property="nome" />
</h2>
</logic:present>

</body>
</html:html>


Na pgina que receber o resultado enviado pelo formulrio, voc determina se existe uma
informao enviada atravs da tag <logic:present/>, que utiliza seu atributo name para verificar se
h a chave integrator. Caso no se lembre, a palavra integrator a chave transmitida pela
constante.

public static final String NOME_KEY = "integrator";

Utilizando request.setAttribute( Constante.NOME_KEY, mb) da classe ControleAction.

Caso exista, a tag <bean:write />recupera o valor enviado e o imprime na tela. O resultado de todos
esses passos um pequeno formulrio contendo um campo e um boto. Caso no seja digitado nada
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

43 43
e enviado, o erro aparece logo abaixo do boto, devido ao posicionamento da tag Struts
<html:errors/>. Caso contrrio, seu nome ser enviado com sucesso e exibido na pgina sucesso.jsp.



Figura 15 Resultado da pgina sem o campo preenchido

As tags do Struts
As tags do Struts so divididas em cinco bibliotecas:
html: permite a criao e manipulao de tags HTML com o Struts, principalmente
formulrios;
logic: permite a criao de estruturas de condio e repetio, alm da administrao do
fluxo da aplicao;
bean: permite a criao e manipulao de JavaBeans dentro da pgina;
nested: permite a definio de modelos de objetos aninhados e a capacidade de represent-
los e administr-los;
template: permite a criao de modelos dinmicos de pginas JSP que compartilham de um
formato comum.

Destas cinco bibliotecas, aqui voc aprender mais detalhadamente as trs primeiras.

AstagsHTMLdoStruts
A biblioteca de tags HTML do Struts contm tags para renderizar o HTML, como o conhecemos.
Algumas tags foram apresentadas nas pginas mostradas com exemplo anterior, mas com pouca
informao tcnica. Agora, para uma melhor compreenso das tags Struts, voc ter uma descrio
mais detalhada. Estas tags so personalizadas pela biblioteca e facilitam a comunicao com as
configuraes geradas pelas classes desenvolvidas para esse fim.
Essas tags podem ser chamadas atravs da diretiva taglibexistente em uma pgina JSP:

<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

Como pode notar, a biblioteca HTML do Struts chamada pela URI:

http://jakarta.apache.org/struts/tags-html

E que contm o prefixo padro html.

A Tabela 1 a seguir demonstra as tags HTML do Struts framework:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

44 44



Tabela 1 - Tags HTML do Struts
Nome da Tag Descrio
base Cria um elemento HTML base
button Cria um boto com a tag input
cancel Cria um boto cancel
checkbox Cria uma caixa de checagem (input checkbox)
errors Renderiza mensagens de erros enviados
file Cria um campo HTML file
form Define um elemento (tag) HTML form
frame Cria um elemento HTML frame
hidden Cria um campo HTML hidden
html Cria um elemento HTML html
image Renderiza uma tag input do tipo "image"
img Cria uma tag HTML img
javascript
Renderiza uma validao JavaScript baseada na validao carregada pelo
ValidatorPlugIn
link Cria uma tag HTML anchor ou hyperlink
messages Condicionalmente mostra as mensagens transmitidas pela classe
multibox Cria mltiplos campos caixa de checagem (input checkbox)
option Cria a tag select option
options Cria uma coleo de tags select options
optionsCollection Cria uma coleo de tags select options
password Cria um campo input password
radio Cria um boto de radio (input radio)
reset Cria um boto reset
rewrite Renderiza uma URI
select Renderiza uma tag select
submit Renderiza um boto submit
text Cria uma tag input field do tipo "text"
textarea Cria uma tag textarea


A tag form
A tag Struts form uma das mais importantes tags encontradas na biblioteca de tags HTML. com
esta tag que renderizado a tag padro form do HTML e, em conjunto, criado um direcionamento
com a ActionFormconfigurada para a aplicao.
Como a tag <html:form/>, o Struts controla aspectos importantes de uma pgina. A Tabela 2, a
seguir, contm os elementos nela existentes:

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

45 45
Tabela 2 - Os atributos da tag Struts <html:form />
Nome do atributo Descrio
action A URL para o qual o formulrio ser submetido
enctype O content encoding para o qual ser usado na submisso do formulrio.
focus O nome do campo no qual haver um foco inicial.
method O mtodo HTTP no qual ser usado para submeter os dados.
name
O nome da ActionForm do qual as propriedades sero usadas para popular
os valores dos campos input.
onreset Tratador de evento JavaScript executado se o formulrio reiniciado.
onsubmit Tratador de evento JavaScript executado se o formulrio for submetido.
scope O escopo da ActionForm para este formulrio.
style Os estilos CSS para ser aplicado nas tags HTML desse elemento.
styleClass Classe CSS para ser aplicado neste elemento HTML.
styleId O identificados para a assinatura deste elemento HTML.
target
O alvo para acessar um determinado frame quando o formulrio for
submetido.
type
O nome de classe completamente qualificado de ActionForm para esta
pgina.

Detalhandoumpoucodoatributoaction
O valor para o atributo action da tag Struts <html:form/> usado para selecionar ActionMapping,
onde assumido o nome suposto da pgina que processar o pedido, do qual voc pode identificar o
ActionFormapropriado e a extenso.
Se a extenso mapeada em uso for *.do (padro do Struts), o valor do atributo action dever ser
igual ao valor do atributo path correspondente para esse elemento, opcionalmente seguido pelo
sufixo de extenso correto:

<html:form action="NomeForm.do" focus="nome">

Ou:

<html:form action="NomeForm" focus="nome">

AsTagsLogicdeStruts
A biblioteca de tags Logic contm tags utilizadas para o gerenciamento condicional, resultando na
sada de texto, loop sobre colees de objetos ( gerao repetitiva de sada de texto) e administrao
de fluxo da aplicao.
Estas tags podem ser chamadas atravs da diretiva taglibexistente em uma pgina JSP:

<%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>

Como pode notar, a biblioteca Logic do Struts chamada pela URI:

http://jakarta.apache.org/struts/tags-logic

E que contm o prefixo padro logic.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

46 46
A Tabela 3 a seguir demonstra as tags Logic do Struts:

Tabela 3 - Tags Logic do Struts
Nome da Tag Descrio
empty
Avalia o contedo do corpo aninhado desta tag e se a varivel pedida for
um null ou uma string vazia.
equal
Avalia se o contedo existente no corpo aninhado desta tag uma varivel
igual ao valor especificado.
forward
Despacha o controle para a pgina especificada pela entrada
ActionForward.
greaterEqual
Avalia o contedo no corpo desta tag no qual a varivel pedida contm um
valor maior que ou igual ao valor especificado.
greaterThan
Avalie o contedo do corpo desta tag se a varivel pedida for maior que o
valor especificado.
iterate Repita o contedo de corpo desta tag sobre uma coleo especificada.
lessEqual
Avalia o contedo de corpo desta tag se a varivel pedida for menor que
ou igual ao valor especificado.
lessThan
Avalia o contedo de corpo desta tag se a varivel pedida for menor que o
valor especificado.
match
Avalia o contedo de corpo desta tag se o valor especificado for uma
substring apropriada para a varivel pedida.
messagesNotPresent
Gera o contedo do corpo desta tag se a mensagem especificada no
estiver presente neste pedido.
messagesPresent
Gera o contedo do corpo desta tag se a mensagem especificada estiver
presente neste pedido.
notEmpty
Avalia o contedo do corpo desta tag se a varivel pedida no for null
nem uma String vazia.
notEqual
Avalia o contedo do corpo desta tag se a varivel pedida no for igual ao
valor especificado.
notMatch
Avalia o contedo do corpo desta tag se o valor especificado no for uma
substring apropriada para a varivel pedida.
notPresent
Gera o contedo do corpo desta tag se o valor especificado no estiver
presente neste pedido.
present
Gera o contedo do corpo desta tag se o valor especificado estiver
presente neste pedido.
redirect Renderiza um redirecionamento HTTP.

Seu uso pode ser visto na pgina sucesso.jsp, visto na Listagem 6:

<logic:present name="integrator" scope="request">

<h2>
<bean:write name="integrator" property="nome" />
</h2>

</logic:present>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

47 47
ASTagsBeandeStruts
As tags que fazem parte da biblioteca de tags Bean so usadas para acessar JavaBeans, e outras
propriedades associadas, como tambm definir novos beans que sero acessveis para o resto da
pgina, atravs de variveis scripting e atributos de escopo de pgina. Estas tags possuem os
mecanismos necessrios para criar um novo bean, baseado nos valores de pedidos atravs de
cookies, cabealhos e parmetros que so fornecidos.
Essas tags podem ser chamadas atravs da diretiva taglibexistente em uma pgina JSP:

<%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>

Como pode notar, a biblioteca Bean do Struts chamada pela URI:

http://jakarta.apache.org/struts/tags-bean

E que contm o prefixo padro bean.

A Tabela 4 a seguir demonstra as tags Bean do Struts:

Tabela 4 - As tags Bean do Struts
Nome da tag Descrio
cookie Define uma varivel baseada no(s) valore(s) especificados no cookie pedido.
define Define uma varivel baseada no(s) valore(s) especificados na propriedade bean.
header Define uma varivel baseada no(s) valore(s) especificados no pedido header.
include
Carrega a resposta para uma aplicao dinmica pedida e a torna disponvel
como um bean.
message Renderiza uma mensagem string internacionalizada para a resposta.
page Expe um item especificado do contexto da pgina como um bean.
parameter Define uma varivel baseada no(s) valore(s) especificados no parmetro pedido.
resource Carrega um recurso da aplicao web e a torna disponvel como um bean.
size Define um bean contendo o nmero de elementos em um Collection ou Map.
struts
Expe para um Struts nomeado um objeto de configurao interno como um
bean.
write Renderiza o valor de uma propriedade bean especfica.


Voc utilizou a tag Struts <bean:write />para imprimir o nome transmitido pelo formulrio na
pgina sucesso.jsp:

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

48 48
<bean:write name="integrator" property="nome" />

Utilizando Struts para acessar banco de dados
Para compreender um pouco mais sobre Struts, voc vai criar um CRUD de exemplo, utilizando
banco de dados e o padro DAO.
Crie um novo projeto utilizando o framework Struts. Se desejar, chame-o de UtilStrutsComDAO.
Adicione a biblioteca JDBC do MySQL ao projeto.

CriandooJavaBeanAutor
Para o exemplo, ser utilizado a manipulao da tabela autores no banco de dados. Para iniciar, crie
uma classe chamada Autor, que ser nosso JavaBean. Altere-a como na Listagem 7 a seguir.


Listagem7. O JavaBean Autor
package br.com.integrator;

import java.util.Date;

public class Autor {

private Integer id;

private String nome;

private String email;

private Date nascimento;

public Autor() {
}

public Autor(Integer id, String nome, String email, Date nascimento) {
this.id = id;
this.nome = nome;
this.email = email;
this.nascimento = nascimento;

}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Date getNascimento() {
return nascimento;
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

49 49
public void setNascimento(Date nascimento) {
this.nascimento = nascimento;
}

}

Afbricadeconexo
No pacote br.com.integrator.util, ser criada a classe ConnectionFactory, que ser sua fbrica de
conexes. A Listagem 8 exibe a classe.


Listagem8. A classe ConnectionFactory
package br.com.integrator.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class ConnectionFactory {

public static Connection getConnection() throws Exception {
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(
"jdbc:mysql://localhost/livraria", "edson", "integrator");
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}

public static void closeConnection(Connection conn,
Statement stmt, ResultSet rs) throws Exception {
close(conn, stmt, rs);
}

public static void closeConnection(Connection conn, Statement stmt)
throws Exception {
close(conn, stmt, null);
}

public static void closeConnection(Connection conn)
throws Exception {
close(conn, null, null);
}

private static void close(Connection conn,
Statement stmt, ResultSet rs)
throws Exception {
try {
if (rs != null) rs.close();
if (stmt != null)stmt.close();
if (conn != null)conn.close();
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}

}

CriandooDAO
Como agora possumos a fbrica de conexes, que servir o acesso ao banco de dados e nosso
JavaBean, ser criada a camada de manipulao ao banco de dados. No pacote
br.com.integrator.dao, ser criada a interface DAOe sua implementao AutorDAOImp. As Listagens
9 e 10 exibe DAOe AutorDAOImprespectivamente.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

50 50
Listagem9. A interface DAO
package br.com.integrator.dao;

import br.com.integrator.Autor;
import java.util.List;

public interface DAO {
void atualizar(Autor autor) throws Exception;

void excluir(Autor autor) throws Exception;

Autor procurarAutor(Integer id) throws Exception;

void salvar(Autor autor) throws Exception;

List todosAutores() throws Exception;

}


Listagem10. A classe implementada AutorDAOImp
package br.com.integrator.dao;

import br.com.integrator.Autor;
import br.com.integrator.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
* A classe <B>AutorDAOImp</B> cria o CRUD necessrio para
* manipular a tabela <B>autores</B> e implementa <I>DAO</I>
* @author Edson Gonalves
* @since 22-12-2007
* @version 1.0
*/
public class AutorDAOImp implements DAO {

private Connection conn;

/**
* Mtodo construtor que se conecta ao banco de dados
* @throws java.lang.Exception se no houver conexo
*/
public AutorDAOImp( ) throws Exception{
try {
this.conn = ConnectionFactory.getConnection( );


} catch( Exception e ) {
throw new Exception( "Erro: " + e.getMessage( ) );
}
}

/**
* Mtodo que insere dados na tabela Autores
* @param autor - recebe o objeto Autor
* @throws java.lang.Exception se no conseguir inserir
*/

@Override
public void salvar(Autor autor) throws Exception{
PreparedStatement ps = null;
Connection conn = null;
if (autor == null)
throw new
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

51 51
Exception("O valor passado no pode ser nulo");

try {
String SQL = "INSERT INTO autores (nome, email, nascimento) "+
"values (?, ?, ?)";
conn = this.conn;
ps = conn.prepareStatement(SQL);
ps.setString(1, autor.getNome( ));
ps.setString(2, autor.getEmail( ));
ps.setDate(3, new java.sql.Date(autor.getNascimento( ).getTime()));

ps.executeUpdate( );

} catch (SQLException sqle) {
throw new
Exception("Erro ao inserir dados " + sqle);
} finally {
ConnectionFactory.closeConnection(conn, ps);

}
}

/**
* Mtodo que exclui uma linha na tabela aAutores
* @param autor - recebe o objeto Autor
* @throws se no for possvel excluir o autor
*/
@Override
public void excluir(Autor autor) throws Exception {
PreparedStatement ps = null;
Connection conn = null;

if (autor == null)
throw new
Exception("O valor passado no pode ser nulo");

try {
conn = this.conn;
ps = conn.prepareStatement("delete from autores where id=?");
ps.setInt(1, autor.getId( ));
ps.executeUpdate( );


} catch (SQLException sqle) {
throw new
Exception("Erro ao excluir dados:" + sqle);

} finally {
ConnectionFactory.closeConnection(conn, ps);
}

}

/**
* Mtodo que atualiza os dados na tabela autores
* @param autor - recebe o objeto Autor
* @throws java.lang.Exception se no for possvel atualizar
*/
public void atualizar(Autor autor) throws Exception {
PreparedStatement ps = null;
Connection conn = null;

if (autor == null)
throw new
Exception("O valor passado no pode ser nulo");

try {
String SQL = "UPDATE autores SET nome=?, " +
" email=?, " +
"nascimento=? " +
"where id=?";
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

52 52
conn = this.conn;
ps = conn.prepareStatement(SQL);
ps.setString(1, autor.getNome( ));
ps.setString(2, autor.getEmail( ));
ps.setDate(3, new java.sql.Date(autor.getNascimento( ).getTime()) );
ps.setInt(4, autor.getId( ));

ps.executeUpdate( );

} catch (SQLException sqle) {
throw new
Exception("Erro ao atualizar dados: " + sqle);
} finally {
ConnectionFactory.closeConnection(conn, ps);

}
}


/**
* Mtodo que retorna todos os autores
* @return objeto List
* @throws java.lang.Exception se no for possvel retornar o objeto List
*/
public List todosAutores() throws Exception{
PreparedStatement ps = null;
Connection conn = null;
ResultSet rs = null;

try {
conn = this.conn;
ps = conn.prepareStatement("select * from autores");
rs = ps.executeQuery( );
List<Autor> list = new ArrayList<Autor>( );
while( rs.next( ) ) {
Integer autorId = rs.getInt( 1 );
String nome = rs.getString( 2 );
String email = rs.getString( 3 );
Date nascimento = rs.getDate( 4 );

list.add( new Autor(autorId,nome,email,nascimento) );

}
return list;

} catch (SQLException sqle) {
throw new Exception(sqle);
} finally {
ConnectionFactory.closeConnection(conn, ps, rs);
}
}


/**
* Mtodo responsvel por pesquisar um autor
* @param id - recebe um Inteiro como parmetro para pesquisar
* pelo campo id
* @return objeto Autor
* @throws java.lang.Exception se no for possvel retornar o objeto Autor
*/
public Autor procurarAutor(Integer id) throws Exception {

PreparedStatement ps = null;
Connection conn = null;
ResultSet rs = null;

try {
conn = this.conn;
ps = conn.prepareStatement("select * from autores where id=?");
ps.setInt(1, id);
rs = ps.executeQuery( );
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

53 53
if( !rs.next( ) ) {
throw new
Exception( "No foi encontrado nenhum registro com o ID: " + id );
}

String nome = rs.getString( 2 );
String email = rs.getString( 3 );
Date nascimento = rs.getDate( 4 );



return new Autor(id, nome, email, nascimento) ;

} catch (SQLException sqle) {
throw new Exception(sqle);
} finally {
ConnectionFactory.closeConnection(conn, ps, rs);

}
}

}


O DAO criado similar ao do livro, no Captulo 4. Caso tenha alguma dvida, recorra a ele para
obter detalhes com explicaes para sua maior compreenso.

GerandoasclassesStruts
Crie um novo arquivo. Selecione em Categories o item Struts e clique em Struts ActionForm
Bean em File Types. D o nome de AutoresActionFormem Class Name e selecione em Package o
pacote br.com.integrator.struts. Clique no boto Finish para confirmar.


Figura 16 Criao do ActionForm AutoresActionForm


Na Listagem 11 a seguir h a classe para que voc a altere.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

54 54
Listagem11. A classe AutoresActionForm
package br.com.integrator.struts;

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionMapping;


public class AutoresActionForm extends org.apache.struts.action.ActionForm {

private ArrayList autor = new ArrayList();

public ArrayList getAutor() {
return autor;
}

public void setAutor(ArrayList autor) {
this.autor = autor;
}

public AutoresActionForm() {
super();
}

public void reset(ActionMapping mapping, HttpServletRequest request) {
autor = new ArrayList();
}


}

Neste ActionFormfoi criado um java.util.ArrayList que trar os dados encontrados na tabela para
serem acessveis pela pgina na camada apresentao (View), que exibir uma tabela de dados.
O prximo passo desenvolver a action que se responsabilizar pela comunicao com os dados.
Crie um novo arquivo do tipo Struts Action na categoria Struts. Chame de AutoresAction e
coloque no pacote br.com.integrator.struts. No campo Action Path digite /AutoresActionForm.
Clique no boto Next para prosseguir.


Figura 17 Gerao do Struts Action AutoresAction

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

55 55

Na terceira e ltima etapa do assistente, em Input Resource selecione o arquivo
welcomeStruts.jsp clicando no boto Browse. Marque a opo Request e clique no boto Finish
para completar.


Figura 18 Configurando o ActionForm

Altere seu cdigo como o mostrado na Listagem 12 a seguir.


Listagem12. A classe AutoresAction
package br.com.integrator.struts;

import br.com.integrator.dao.AutorDAOImp;
import br.com.integrator.dao.DAO;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

public class AutoresAction extends Action {

/* forward name="success" path="" */
private final static String SUCCESS = "success";

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

AutoresActionForm autoresForm = (AutoresActionForm) form;

DAO dao = new AutorDAOImp();

autoresForm.setAutor((ArrayList) dao.todosAutores());

return mapping.findForward(SUCCESS);

}
}
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

56 56
Perceba que voc ir chamar AutoresActionForme o DAO para trazer os autores. Atravs do
mtodo setAutor(), criado na classe AutoresActionForm, voc ir recuperar todos os dados existentes
na tabela do MySQL autores, encontrada no banco de dados livraria, atravs do mtodo gerado na
classe AutorDAOImp, chamado de todosAutores(). Como o mtodo todosAutores() retorna um
java.util.List, uma coero para java.util.ArrayList necessria, uma vez que o mtodo setAutor()
utiliza este objeto como tipo.

Configurandooarquivostrutsconfig.xml
No arquivo struts-config.xml, v por entre os elementos <action /> e clique com o direito do mouse.
Selecione no menu de contexto o item Add Forward em Struts.
Na caixa de dilogo, digite success em Forward Name e selecione em Resource File
welcomeStruts.jsp. Clique no boto Add para confirmar.


Figura 19 Gerao do elemento <forward/> em struts-config.xml

Seu arquivo struts-config.xml dever estar com o trecho semelhante ao mostrado na Listagem 13
seguir:

Listagem13. O resultado final configurado em struts-config.xml
<!--... omitido por no haver alteraes -->

<action-mappings>
<action input="/welcomeStruts.jsp"
name="AutoresActionForm"
path="/AutoresActionForm"
scope="request"
type="br.com.integrator.struts.AutoresAction">

<forward name="success" path="/welcomeStruts.jsp"/>

</action>

<action path="/Welcome" forward="/welcomeStruts.jsp"/>
</action-mappings>

<!--... omitido por no haver alteraes -->

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

57 57
Exibindoosdadosdatabela
A pgina welcomeStruts.jsp ser utilizada para a exibio dos autores cadastrados em formato
tabular, encontrado na tabela autores do banco de dados livraria. A pgina welcomeStruts.jsp
mostrada na ntegra na Listagem 14 a seguir.

Listagem14. A pgina welcomeStruts.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html>
<head>
<title>Autores Cadastrados</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>ID</td>
<td>Nome</td>
<td>E-mail</td>
<td>Nascimento</td>
</tr>
</thead>
<tbody>
<logic:iterate name="AutoresActionForm" property="autor" id="autor">
<tr>
<td><bean:write name="autor" property="id" /></td>
<td><bean:write name="autor" property="nome" /></td>
<td><bean:write name="autor" property="email" /></td>
<td>
<bean:write name="autor"
property="nascimento" format="dd/MM/yyyy"/>
</td>

</tr>
</logic:iterate>

<logic:notPresent name="autor">
<tr>
<td colspan="3">Nenhum autor encontrado.</td>
</tr>
</logic:notPresent>

</tbody>
</table>

</body>
</html:html>


A criao desta pgina bem simples, o Struts ir gerar uma tabela atravs de um loop, utilizando a
tag <logic:iterate />, que percorrer os dados encontrados na propriedade autor, do ArrayList
existente na classe AutoresActionForm. Depois transmitir pelo id os resultados, que sero, um a
um, impressos pela tag <bean:write />, atravs do atributo property. Observe que para a data de
nascimento do autor, existe o atributo format que define o padro a ser usado neste caso.Se no
houver dados, a tag <logic:notPresent />apresentar uma mensagem ao usurio.
Por fim, para chamar esta pgina, altere a pgina index.jsp. O link desta pgina dever chamar
AutoresActionForm, para que todo o processo seja iniciado. A Listagem 15 exibe as alteraes
propostas para a pgina.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

58 58

Listagem15. A pgina index.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Pagina Inicial</title>
</head>
<body>

<h1>Autores Cadastrados</h1>
<br/>
<html:link action="AutoresActionForm">Mostrar Autores</html:link>
</body>
</html>


O link criado pela tag Struts <html:link />, chamando pelo atributo action a pgina mapeada por
AutoresActionForm.


Figura 20 Resultado da pgina que ser exibida

Adicionando,EditandoeExcluindoautores
Crie um novo arquivo. Selecione em Categories o item Struts e clique em Struts ActionForm
Bean em File Types. D o nome de EditarAutoresFormem Class Name e selecione em Package o
pacote br.com.integrator.struts. Clique no boto Finish para confirmar.


Listagem16. A classe EditarAutoresForm
package br.com.integrator.struts;

public class EditarAutoresForm extends org.apache.struts.action.ActionForm {

private Integer id;
private String nome;
private String email;
private String nascimento;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

59 59
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getNascimento() {
return nascimento;
}

public void setNascimento(String nascimento) {
this.nascimento = nascimento;
}

}

Neste ActionFormfoi criado os campos que iro compor os formulrios de inserir e atualizar. Crie
um novo arquivo do tipo Struts Action na categoria Struts. Chame de EditarAutoresAction e
coloque no pacote br.com.integrator.struts. No campo Action Path digite /Operacao. Clique no
boto Next para prosseguir. Na terceira e ltima etapa do assistente, em Input Resource selecione
o arquivo welcomeStruts.jsp clicando no boto Browse. Marque a opo Request e clique no
boto Finish para completar.
Altere seu cdigo como o mostrado na Listagem 17 a seguir.


Listagem17. A classe EditarAutoresAction
package br.com.integrator.struts;

import br.com.integrator.Autor;
import br.com.integrator.dao.AutorDAOImp;
import br.com.integrator.dao.DAO;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

public class EditarAutoresAction extends DispatchAction {

public ActionForward editAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

Integer id = Integer.parseInt(request.getParameter("id"));
DAO dao = new AutorDAOImp();

Autor autor = dao.procurarAutor(id);

editarAutoresForm.setId(autor.getId());
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

60 60
editarAutoresForm.setNome(autor.getNome());
editarAutoresForm.setEmail(autor.getEmail());
editarAutoresForm.setNascimento(dateToString(autor.getNascimento()));



return mapping.findForward("showEdit");

}

public ActionForward deleteAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

Integer id = Integer.parseInt(request.getParameter("id"));

DAO dao = new AutorDAOImp();
Autor autor = new Autor();
autor.setId(id);
dao.excluir(autor);

return mapping.findForward("success");

}

public ActionForward addAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

return mapping.findForward("showAdd");

}

public ActionForward saveAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

DAO dao = new AutorDAOImp();

Autor autor = new Autor();
autor.setId(editarAutoresForm.getId());
autor.setNome(editarAutoresForm.getNome());
autor.setEmail(editarAutoresForm.getEmail());
autor.setNascimento(strToDate(editarAutoresForm.getNascimento()));

if(autor.getId()==null)
dao.salvar(autor);
else
dao.atualizar(autor);

return mapping.findForward("success");

}


private Date strToDate(String data) throws Exception {
if (data == null)
return null;

Date dataF = null;
try {
DateFormat dateFormat =
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

61 61
new SimpleDateFormat("dd/MM/yyyy");
long timestamp = dateFormat.parse(data).getTime( );
dataF = new Date(timestamp);
} catch (Exception e) { }
return dataF;
}

public static String dateToString(Date data) throws Exception {
if (data == null || data.equals(""))
return null;

String dataF = null;
try {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
dataF = df.format(data);
} catch (Exception e) { }

return dataF;
}


}


Perceba que voc ir chamar EditarAutoresActionForme o DAO para trabalhar com os autores.
Cada um dos mtodos cria uma ao para atualizar, excluir ou inserir novos autores. Para editar um
autor, por exemplo, chamamos o mtodo editAutor(). Cada campo do formulrio alimentado com
os dados encontrados na tabela, pesquisado atravs do parmetro id transmitido com o nmero do
autor que ser atualizado. Para alimentar os campos, no DAO, chamamos o mtodo procurarAutor().
A string retornada para redirecionar a pgina showEdit.


public ActionForward editAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

Integer id = Integer.parseInt(request.getParameter("id"));
DAO dao = new AutorDAOImp();

Autor autor = dao.procurarAutor(id);

editarAutoresForm.setId(autor.getId());
editarAutoresForm.setNome(autor.getNome());
editarAutoresForm.setEmail(autor.getEmail());
editarAutoresForm.setNascimento(dateToString(autor.getNascimento()));


return mapping.findForward("showEdit");

}


O mtodo de excluso segue a mesma lgica, capturando o id do autor e removendo-o atravs do
mtodo excluir()de DAO. O resultado desta ao uma string success.

public ActionForward deleteAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

62 62

Integer id = Integer.parseInt(request.getParameter("id"));

DAO dao = new AutorDAOImp();
Autor autor = new Autor();
autor.setId(id);
dao.excluir(autor);

return mapping.findForward("success");

}


Para adicionar um novo autor, o mtodo addAutor() chamado, onde retorna a string mapeada
showAdd para redirecionar o usurio.


public ActionForward addAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

return mapping.findForward("showAdd");

}


Na hora de salvar o autor, seja aps uma atualizao ou insero de dados, ser chamado o mtodo
saveAutor(). Neste caso, os dados recuperados do formulrio so transmitidos para o objeto Autor.
Para salvar, se o id de autor for null, significa que um novo cadastro, chamando o mtodo DAO
salvar(). Do contrrio, uma atualizao, chamando atualizar().


public ActionForward saveAutor(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {


EditarAutoresForm editarAutoresForm = (EditarAutoresForm) form;

DAO dao = new AutorDAOImp();

Autor autor = new Autor();
autor.setId(editarAutoresForm.getId());
autor.setNome(editarAutoresForm.getNome());
autor.setEmail(editarAutoresForm.getEmail());
autor.setNascimento(strToDate(editarAutoresForm.getNascimento()));

if(autor.getId()==null)
dao.salvar(autor);
else
dao.atualizar(autor);

return mapping.findForward("success");

}




Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

63 63
Configurandooarquivostrutsconfig.xml
No arquivo struts-config.xml, v por entre os elementos <action /> de editarAutoresForm e altere
como na Listagem 18.


Listagem18. Alteraes no arquivo struts-config.xml
<!-- ...omitido por no haver alteraes -->
<action
attribute="editarAutoresForm"
name="editarAutoresForm"
parameter="acao"
path="/Operacao"
scope="request"
type="br.com.integrator.struts.EditarAutoresAction">

<forward
name="showEdit"
path="/jsp/editAutor.jsp" />

<forward
name="showAdd"
path="/jsp/addAutor.jsp" />

<forward
name="success"
path="/AutoresActionForm.do"
redirect="true" />

</action>
<!-- ...omitido por no haver alteraes -->

Observe que temos os casos retornados pela classe EditarAutoresActionFormdefinindo suas
respectivas pginas.

Aspginasparaeditareinserirdados
Para editar os dados, haver uma chamada a pgina editAutor.jsp. Para adicionar os dados, uma
pgina chamada addAutor.jsp. Estas pginas sero criadas dentro do diretrio jsp. Veja na Figura
21 as duas pginas JSP que sero criadas no seu projeto.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

64 64

Figura 21 - Os arquivos encontrados dentro do diretrio jsp


Crie a pgina addAutor.jsp, em jsp, e altere como na Listagem 19 exibida a seguir:


Listagem19. Alteraes no arquivo struts-config.xml
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Adicionar Autor</title>
</head>
<body>
<%-- cria um form html --%>
<html:form action="Operacao">
<%-- cria a tabela com os campos --%>
<table border="1">
<tbody>
<tr>
<td>Nome:</td>
<td><html:text property="nome" /></td>
</tr>
<tr>
<td>E-mail:</td>
<td><html:text property="email" /></td>
</tr>
<tr>
<td>Nascimento:</td>
<td><html:text property="nascimento" /></td>
</tr>
<tr>
<td colspan="2">
<html:submit>Cadastrar</html:submit>
</td>
</tr>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

65 65
</tbody>
</table>
<%-- o parametro necessario para chamar o metodo saveAutor() --%>
<html:hidden property="acao" value="saveAutor" />
</html:form>
</body>
</html>



Figura 22 A pgina de insero de autores em ao


A pgina addAutor.jsputiliza a tag Struts <html:text />para criar os campos <input />do HTML do
tipo text. Cada campo amarrado a classe EditarAutoresForm atravs do atributo property. Para
criar o boto de envio, foi utilizada a tag Struts <html:submit/>. Observe que no fim da pgina, h
um campo oculto do Struts, <html:hidden />, ao qual possui dois atributos:
property o parmetro a ser transmitido
value o nome do mtodo que sera chamado

Crie a pgina editAutor.jsp, em jsp, e altere como na Listagem 20 exibida a seguir:


Listagem20. Alteraes no arquivo struts-config.xml
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Editar Autor</title>
</head>
<body>
<%-- cria o formulario html --%>
<html:form action="Operacao">
<%-- imprime os dados encontrados do autor nos campos --%>
<table border="1">
<tbody>
<tr>
<td>Nome:</td>
<td><html:text property="nome" /></td>
</tr>
<tr>
<td>E-mail:</td>
<td><html:text property="email" /></td>
</tr>
<tr>
<td>Nascimento:</td>
<td><html:text property="nascimento" /></td>
</tr>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

66 66
<tr>
<td colspan="2">
<html:submit>Atualizar</html:submit>
</td>
</tr>
</tbody>
</table>
<%-- cria um campo oculto contendo o ID do autor --%>
<html:hidden property="id" />
<%-- envia para o metodo saveAutor() --%>
<html:hidden property="acao" value="saveAutor" />
</html:form>
</body>
</html>


A pgina para editar autores similar a de cadastro, com a diferena de ter um campo oculto que
receber o id do autor que ser atualizado.



Figura 23 A pgina de edio de autores em ao

Alterandoapginaqueexibetodososautores
Para finalizar, iremos alterar a pgina welcomeStruts.jsp para executarmos as aes de inserir,
atualizar e excluir o autor. A Listagem 21 mostra na ntegra as alteraes criadas na pgina.

Listagem21. A pgina welcomeStruts.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html>
<head>
<title>Autores Cadastrados</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>ID</td>
<td>Nome</td>
<td>E-mail</td>
<td>Nascimento</td>
<td colspan="2" align="center">Aes</td>
</tr>
</thead>
<tbody>
<logic:iterate name="AutoresActionForm" property="autor" id="autor">
<tr>
<td><bean:write name="autor" property="id" /></td>
<td><bean:write name="autor" property="nome" /></td>
<td><bean:write name="autor" property="email" /></td>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

67 67
<td>
<bean:write name="autor"
property="nascimento" format="dd/MM/yyyy"/>
</td>
<td>
<html:link action="Operacao.do?acao=editAutor"
paramName="autor"
paramProperty="id" paramId="id">Editar</html:link>
</td>
<td>
<html:link action="Operacao.do?acao=deleteAutor"
paramName="autor"
paramProperty="id" paramId="id">Excluir</html:link>
</td>
</tr>
</logic:iterate>

<logic:notPresent name="autor">
<tr>
<td colspan="3">Nenhum autor encontrado.</td>
</tr>
</logic:notPresent>

</tbody>
</table>
<html:link action="Operacao.do?acao=addAutor">Adicionar novo Autor</html:link>

</body>
</html:html>



Figura 24 A pgina que exibe todos os autores com as alteraes

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

68 68
CaptuloExtra4
DesenvolvendoRelatrioscomNetBeansIDE
Este captulo extra o instruir no desenvolvimento de relatrios JasperReports bsicos utilizando o
novo plugin iReport for NetBeans, que o NetBeans IDE 6 agora possui. No momento em que este
livro escrito, sua verso ainda no final.

OJasperReports
O JasperReports nasceu em 2001, criado por Teodor Danciu, quando este teve a tarefa de avaliar
ferramentas de relatrios para um projeto em que estava trabalhando. As solues existentes eram
muito caras para o oramento do projeto e, em uma situao comum no mundo do
desenvolvimento, ele decidiu escrever sua prpria ferramenta de relatrios, que ao liber-la para a
comunidade, ficou imensamente popular em pouco tempo.
JasperReports uma biblioteca escrita em Java, de cdigo fonte open source, projetada para ajudar
o desenvolvedor com a tarefa de criar relatrios para aplicaes, tanto Desktop como Web,
fornecendo uma API que facilita sua gerao. Embora seja simples, ainda exige que o
desenvolvedor conhea seu formato XML utilizado para criar os relatrios, o que torna dispendioso
o tempo de um iniciante.

OiReportparaoNetBeans
O iReport um programa Open Source, criado em 2002 por Giulio Toffoli, capaz de criar
visualmente os mais complexos relatrios para aplicaes Java no formato da biblioteca
JasperReports. Sua verso atual escrito em 100% Java, e seus cdigos fontes so distribudos
gratuitamente de acordo com a GNU (General Public License).
Em 2005, com a popularidade do iReport, a JasperSoft (mantenedora do JasperReports) tornou esta
ferramenta oficial na construo de relatrios para o JasperReports.
Recentemente seu criador comeou a portar a ferramenta para a plataforma do NetBeans, criando
duas verses: um plugin que pode ser instalado na IDE ou standalone.
Atravs de uma interface grfica intuitiva, o desenvolvedor capaz de criar qualquer tipo de
relatrio de forma simples e rpida. Mesmo sabendo que o iReport desenvolve um formato XML
usado pelo JasperReports, o que no difcil de manipular, h uma vantagem em usar esta
ferramenta. Se o desenvolvedor um usurio iniciante no formato XML do JasperReports, o
iReport supre suas necessidades evitando que seja necessrio fazer modificaes no cdigo fonte.
Caso seja experiente neste formato, o iReport minimiza o tempo na criao dos mais complexos
relatrios.

Desenvolvendo relatrios com NetBeans
O iReport um bem-sucedido programa Open Source, capaz de criar visualmente os mais
complexos relatrios para aplicaes Java no formato da biblioteca JasperReports.
Atualmente, alm de ser um programa grfico independente, h tambm uma verso disponvel que
se integra ao NetBeans IDE 6.0.
Atravs de uma interface grfica e intuitiva, o desenvolvedor capaz de criar qualquer tipo de
relatrio de forma simples e rpida. O iReport para NetBeans desenvolve um formato XML usado
pelo JasperReports, evitando naturalmente a edio no cdigo.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

69 69
Neste captulo voc aprender onde obter, como instalar, criar seu relatrio e integr-lo a suas
aplicaes Web conhecendo algumas caractersticas do iReport.

ObtendoeinstalandooiReportparaNetBeans
Para obter o iReport para NetBeans, primeiramente voc precisar baixar o plugin. Para isso, o
endereo oficial para baix-lo :
http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=4424. Clique no
boto Download. Voc obter o arquivo .nbm para instalao.

Ateno: No momento em que este livro est sendo escrito, este plugin ainda se encontra em verso
BETA, sem algumas funcionalidades encontradas no iReport.


V ao menu Tools e clique no item Plugins. Na caixa de dilogo Plugins, v guia Downloaded e
clique no boto Add Plugins, selecionando, atravs da caixa de dilogo o arquivo de extenso .nbm
pertencente ao iReport para NetBeans. Ao faz-lo, clique no boto Install.



Figura 1 Adio do plugin ireport-designer


Ao clicar no boto Install, a caixa de dilogo NetBeans IDE Installer surgir. Clique no boto
Next para prosseguir com a instalao.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

70 70

Figura 2 Incio da instalao do plugin ireport-designer

Na etapa seguinte, voc dever aceitar os termos de licena. Clique na opo I accept the terms in
all of the license agreements e clique no boto Install.
A caixa de dilogo Validation Waring surgir, dizendo que o plugin a ser instalado no foi
assinado e que potencialmente inseguro. Clique em Continue.


Figura 3 Validao do plugin


Ao terminar a instalao, clique no boto Finish. Retornando a caixa de dilogo Plugins, observe,
na guia Installed, que o plugin ireport-designer est instalado. Clique no boto Close para fechar a
janela.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

71 71

Figura 4 Plugin instalado

CriandoumrelatrioparatrabalharcomServlets
Crie um projeto Web chamado de RelatoriosComServlet. Em Web Pages crie um diretrio
chamado relatorios. Clique com o direito neste diretrio e no menu de contexto selecione New e
clique em Other. Na caixa de dilogo New File selecione JrxmlTemplate.jrxml, em Reports. Em
alternativa, caso esteja aparecendo a opo JrxmlTemplate.jrxml no menu New, selecione-a. Na
segunda etapa, digite o nome do seu relatrio. Se preferir seguir o livro, chame-o de relatrio e
conclua o assistente.


Figura 5 Criando um documento JasperReports
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

72 72
AestruturaepropriedadesdeumrelatrioJasperReports
Ao finalizar o assistente, o Designer do iReport para NetBeans surgir. Alm do Design, voc
possui a possibilidade de visualizar em formato XML e fazer um Preview.
Um relatrio no JasperReports possui diversas sees, separadas por linhas horizontais ao qual so
chamadas de Bands (bandas).
O comportamento de cada Band depende da funcionalidade para a qual est preparada. Quando o
relatrio junta aos dados para fazer a impresso, estas sees so impressas na tela de diferentes
maneiras com diferentes tempos. Por exemplo, o cabealho da pgina (pageHeader) repetido em
todas as pginas, uma vez em cada pgina, enquanto que os detalhes onde sero exibidos os dados
(detail) gerado em uma seqncia elaborada de acordo com os dados existentes (query ou
datasource), repetindo-se uma vez para cada registro, incorporando-se ao desenho do relatrio.
As bands de um relatrio JasperReports dividido em dez sees pr-definidas para que novos
grupos possam ser adicionados.
Embora as bands j estejam adicionadas e com espaamentos pr-definidos inicialmente, voc pode
com o cursor, entre cada uma delas, nas linhas horizontais que as separam, e mov-las.
Ao arrastar, voc percebe que a altura de cada band se expande, empurrando as demais, aps a
alterada, para baixo ou vice-versa. Embora o desenvolvedor possa alterar a sua altura, em casos
como a band detail, sua alterao implica na visibilidade e espaamento dos elementos impressos
na gerao do relatrio. Porm, nem todas as bands so organizadas dinamicamente pelo contedo,
como o caso de Column Footer, Page Footer e Last Page Footer.



Figura 6 Estrutura do relatrio JasperReports

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

73 73
Na janela Outline Window, voc encontra os parmetros (Parameters), campos da tabela da sua
query (Fields), variveis pr-definidas e criadas (Variables) e as bands do relatrio. Por padro,
algumas bands esto desativadas ou com sua altura no valor zero, o que a torna invisvel no design
(como a band background).


Figura 7 A janela Outline e os componentes do relatrio

Na janela Palette voc encontra os elementos de um relatrio.



Figura 8 A janela Palette e os ReportElements


Seguindo a imagem da Figura 8 voc tem as seguintes ferramentas:
Chart Gera um grfico atravs de valores determinados transmitidos. Mais adiante haver
um captulo exclusivamente para grficos.
Image Utilizado para exibir imagens em seu relatrio. Podem ser imagens dinmicas
(preenchidas por um banco de dados, por exemplo) ou estticas.
Rectangle Usado para desenhar retngulos ao redor de outros elementos, criando
destaques como uma formatao de pargrafo de um programa de edio de textos, este
elemento pode tambm conter retngulos com cantos arredondados.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

74 74
Text Field Utilizado para criar os campos dinmicos dos relatrios. neste elemento que
voc se conecta a um determinado campo do banco de dados para exibir suas informaes,
por exemplo.
Ellipse Desenha elipses no relatrio.
Line Em um relatrio JasperReports uma linha definida por um elemento retangular
com uma linha diagonal. A linha pode ser desenhada em uma reta perfeita, na horizontal,
vertical ou em ngulo se pressionada a tecla <Shift> antes de arrastar. A linha segue o grid.
Static Text Utilizado para criar rtulos de relatrios.

Na parte inferior, da janela Palette se encontra as Properties. Quando um elemento selecionado
aparece nesta janela suas propriedades para serem alteradas.


Figura 9 A janela Properties do relatrio


Nas propriedades do relatrio, voc possui o grupo Page size. Neste grupo voc pode definir a
largura da pgina (Page width) e a altura da pgina (Page height), bem como a Orientao
(Orientation). Em Orientation, temos Portrait (Retrato) ou Landscape (Paisagem).
Embora as dimenses sejam as mais importantes para a construo de um relatrio, a unidade de
medidas usada pelo iReport e JasperReports em pixels (com uma resoluo de 75 dpi).
Para que voc possa se orientar em um arquivo JRXML do JasperReports, a seguir a Tabela 1
mostra o padro da pgina e seu valor em pixels.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

75 75
Tabela 1 Dimenses em pixels das pginas padronizadas
Padro da pgina Dimenso em Pixels
LETTER 612 x 792
NOTE 540 x 720
LEGAL 612 x 1008
A0 2380 x 3368
A1 1684 x 2380
A2 1190 x 1684
A3 842 x 1190
A4 595 x 842
A5 421 x 595
A6 297 x 421
A7 210 x 297
A8 148 x 210
A9 105 x 148
A10 74 x 105
B0 2836 x 4008
B1 2004 x 2836
B2 1418 x 2004
B3 1002 x 1418
B4 709 x 1002
B5 501 x 709
ARCH_E 2592 x 3456
ARCH_D 1728 x 2592
ARCH_C 1296 x 1728
ARCH_B 864 x 1296
ARCH_A 648 x 864
FLSA 612 x 936
FLSE 612 x 936
HALFLETTER 396 x 612
11x17 792 x 1224
LEDGER 1224 x 792


No grupo Columns voc pode definir quantas colunas seu relatrio possuir em uma pgina, no
item Columns. Column Width automaticamente se altera quando voc adiciona mais de uma
coluna, dividindo sem o valor em partes iguais. Column Spacing determina o espaamento entre
colunas, que tambm influi em Column Width automaticamente.
No grupo More... possvel especificar instrues para a impresso do relatrio. Nele se
encontram:
Scriptlet Class - Onde voc define um scriptlet, que nada mais que uma classe Java cujos
mtodos so executados conforme so especificados os eventos durante a criao do
relatrio, como o incio de uma nova pgina ou o fim de um grupo.
Resource Bundle - o nome do pacote de recursos usado para internacionalizar um
relatrio. o Resource Bundle do Java, onde voc define em um arquivo os textos
traduzidos como rtulos. Cada linguagem corresponde a um arquivo especfico.
When Resource Missing Type Se um pacote de recurso (Resource Bundle) no est
disponvel, voc escolhe uma das opes na caixa de combinao. Representa o atributo
whenResourceMissingType no JasperReports. Neste caso, voc tem as seguintes opes:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

76 76

1. Type Null (Nulo) Imprime a string Null. Esta a opo padro.
2. Type Empty (Vazio) No imprime nada. Recebe como valor Empty no atributo
whenResourceMissingType de JasperReports.
3. Type the Key (Chave) Imprime o nome chave que falta. Recebe como valor Key no
atributo whenResourceMissingType de JasperReports.
4. Rise an Error (Erro) Lana uma exceo parando o processo. Recebe como valor
Error no atributo whenResourceMissingType de JasperReports.

Query Text Determina a query criada para o relatrio.
Query Language Determina a linguagem utilizada para a instruo. Pode ser: SQL,
HQL(Hibernate Query Language), XPath, EJBQL, MDX e XMLA-MDX.
Properties Determina as propriedades para o objeto selecionado.
Title on a new page - Quando ativa, especifica se a banda title ser impressa e em seguida
criada uma nova pgina, gerando uma quebra de pgina.
Summary on a new page - Esta opo similar a anterior (Title on a new page), mas com
a diferena de ser a banda summary que ser impressa como a ltima pgina.
Floating column footer - As bandas columnFooter so impressas por padro no fim das
pginas. Se na impresso do relatrio no houver dados suficientes para preencher uma
pgina, um espao em branco aparecer entre a coluna e o rodap da coluna (columnFooter).
Se voc quer que o texto encontrado na banda columnFooter seja impresso logo aps a
impresso da coluna, marque a opo Floating column footer. Esta opo permite forar a
impresso da banda columnFooter imediatamente aps a ltima interao da banda detail e
no do trmino de todas as colunas. Esta opo geralmente usada quando voc quer criar
tabelas usando os elementos de relatrios.
Ignore pagination - Ignora a paginao ao preencher o relatrio, impossibilitando a
visualizao das demais pginas caso haja mais que uma. Quando ativa, esta opo implica
at mesmo na visualizao correta dos dados caso haja mais de uma coluna.
Print Order - A ordem de impresso (Print Order) determina como os dados impressos na
pgina sero organizados em mais de uma coluna. O padro para a ordem de impresso
Vertical. Com a ordem Vertical, primeiro os dados so impressos um embaixo do outro,
passando para uma nova coluna somente quando a coluna est totalmente preenchida no
final da pgina. Na ordem Horizontal os dados so preenchidos em linha. Os dados passam
por todas as colunas, adicionando uma nova linha somente quando a ltima coluna da
pgina foi preenchida naquela determinada linha.
When no data - Quando o nmero de dados para a impresso vazio (query SQL sem
dados, por exemplo), o relatrio pode ter comportamentos diferentes para apresentar a
pgina ao usurio. Neste caso existem quatro opes, listadas a seguir:

1. Type No Pages (Sem Pginas) O padro. O resultado final um buffer vazio.
2. Type a Blank Page (Pginas em branco) Exibe uma pgina em branco caso no haja
dados.
3. Type All Sections, No Detail (Todas as sees, nenhum detalhe) Mostra todas as
sees existentes no relatrio, menos os detalhes da banda detail.
4. Type No Data section Seo sem dados. Utiliza a band noData, ou seja, voc
adiciona um contedo esttico (ou dinmico sem usar o banco de dados) neste local.
Caso no haja dados em uma determinada pesquisa ou sem conexo com o banco de
dados, esta seo ser exibida.
Language Determina a linguagem a ser utilizada no relatrio. Neste caso, somente as duas
linguagens oficiais do JVM so possveis, por enquanto: Java ou Groovy.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

77 77
Format Factory Class - Recebe uma string com o nome da classe de formatos, habilitando
o uso de datas personalizadas e formatos de nmeros. Representa o atributo
formatFactoryClass de JasperReports e implementa a interface net.sf.jasperreports.engine.


ExibindooGrid
Voc pode exibir o Grid para desenhar o relatrio, v ao menu Designer e clique em Show Grid.
Tambm possvel alinhar os elementos dentro do relatrio se selecionar a opo Snap To Grid.


Figura 10 Exibindo o Grid no Design

Adicionandoumaconexoaumrelatrioembranco
Para a construo deste relatrio, vamos utilizar o banco de dados livraria. V ao menu Data e
clique em Connections/Data Sources, ou na barra de ferramentas Designer.



Figura 11 Connections / Datasources no menu Data e ferramentas Designer


Na caixa de dilogo Connections / Datasources, clique no boto New. Em Datasource selecione o
item NetBeans Database JDBC connection e clique no boto Next.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

78 78

Figura 12 Seleo do datasource NetBeans Database JDBC connection

Na segunda etapa, selecione em Connection a conexo livraria usada neste livro e digite livraria
em Name. Clique no boto Test. Se a caixa de dilogo Connection test successful! surgir,
confirme e clique no boto Save.


Figura 13 Configurando a conexo livraria

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

79 79
Para uma modificao da conexo, na caixa de dilogo Connections / Datasources temos o boto
Modify. Basta selecionar a linha da sua conexo que deseja alterar e clicar neste boto. A caixa de
dilogo de propriedades da conexo reabre. Basta alterar e salvar (Save).
Em mais de uma conexo, voc tem o boto Set as default. Basta selecionar a conexo que deseja
tornar padro (Default) e clicar neste boto. Observe que na caixa de dilogo a coluna Default
apresenta a conexo padro com uma caixa de checagem ativa.
Caso voc precise levar as configuraes da sua conexo para outra mquina, ou quer guard-la
para uma futura reutilizao, clique no boto Export. A caixa de dilogo para salvar a conexo
aparecer. Basta selecionar o local e dar o nome. Caso tenha mais de uma conexo, todas sero
exportadas. Se precisar importar uma conexo do prprio iReport, basta clicar no boto Import.
Depois de configurado, basta fechar a caixa de dilogo.



Figura 14 Conexo criada e disponvel

Criandoaquerydorelatrio
Para criar a query do relatrio, v ao menu File e clique no item Report query. Alternativamente
voc pode ir ao cone Report query, acima do design do relatrio.


Figura 15 Abrindo o Report query


Ao abrir a caixa de dilogo Report Query, clique no boto Query designer. Outra caixa de dilogo
surgir, chamada de SQL Query Designer, mas desta vez para a criao da instruo SQL visual.
Observe que h trs quadros na janela. O primeiro, esquerda, define a exibio da query de forma
visual, separando os elementos padronizados de uma seleo de dados (SELECT, FROM, WHERE
e etc.). A cada coluna de sua tabela selecionada, automaticamente a query adicionar na parte
superior, em SELECT, o campo e um alias. Em FROM surgir a, ou, as tabelas que esto
relacionadas para tal seleo.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

80 80
Voc vai selecionar, atravs do segundo quadro a esquerda, a tabela autores, dando um duplo
clique sobre seu respectivo nome. Esta seleo pode ser atravs do arrastar para o quadro da direita
tambm, caso ache mais prtico.
Existem duas formas de voc selecionar todos os campos de uma tabela, no Query designer. A
primeira ir at a tabela (no caso autores) e clicar no menu de mesmo nome, selecionando a opo
select all. A segunda forma clicando com o direito do mouse e selecionando a opo add
expression, no quadro da esquerda, em SELECT.


Figura 16 Adicionando uma expresso

Neste caso, voc digita o que deseja fazer, na caixa de dilogo expression.edit. Para o caso, digite
* e confirme.
Ao final, voc possuir uma configurao da sua query SELECT similar ao mostrado na Figura 17
a seguir:


Figura 17 Query desenhada na caixa de dilogo SQL Query Designer


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

81 81
Se voc clicar em SQL, a guia abaixo, ao lado de Builder (a atual), voc ver a query construda.
Confirme no boto OK.
Retornando a caixa de dilogo Report query, voc ainda pode fazer alteraes na query criada.
Na parte superior da janela, existe o boto Save query, caso deseje armazenar a consulta construda
para uso posterior em outro relatrio. Se esse for o caso, o carregamento de uma consulta
armazenada pode ser feito atravs do boto Load query.
Como a opo Automatically Retrieve Fields est selecionada, na parte inferior aparece cada
campo selecionado, em uma tabela, com seus respectivos nomes e o tipo de dados em Java de cada
um. importante manter selecionada esta opo, uma vez que na digitao ou alterao de uma
query, possveis erros podem ser encontrados graas exibio dos campos nesta tabela. Caso esta
opo no esteja selecionada, qualquer alterao na query SQL no reflete automaticamente abaixo,
o que necessitar clicar no boto Read Fields. Confirme logo aps no boto OK.



Figura 18 Query final gerada pela caixa de dilogo SQL Query Designer

Desenhandoorelatrio
O desenho do relatrio ser uma etapa importante para a sua compreenso prtica dos elementos
existentes para se criar um e tambm sobre as bands (bandas) em sua gerao.
Para comear na criao do desenho do relatrio, voc vai configurar inicialmente as bands que no
sero exibidas. Com o cursor entre uma band e outra, voc deve arrastar para cima, at que ela se
encontre com a superior. Isso diminui a sua altura at zero, o que exatamente o valor necessrio
para esta desaparecer.
As alturas de cada band para a criao do relatrio exibida conforme a Tabela 2 mostrada a
seguir:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

82 82

Tabela 2 Alturas das bands utilizadas na construo do relatrio
Band Altura da Banda
title 0
pageHeader Mantenha como est
columnHeader Mantenha como est
detail Mantenha como est
columnFooter 0
pageFooter Mantenha como est
summary Mantenha como est


Ateno: Voc pode configurar as propriedades de cada band selecionando-a atravs da janela
Outline Window e alterando em Properties, no campo Band height. Neste caso, a alterao no
precisa ser aplicada (alterou o valor da propriedade, confirmou com a tecla ENTER, mudou).

Adicionando os textos estticos
Antes de iniciar a criao do desenho, voc tem na Figura 19 como ser o resultado final. Veja no
quadro Construindo o design do relatrio para cri-lo.


Figura 19 Aparncia final do relatrio no Designer


Construindo o design do relatrio
Para criar a aparncia vista na Figura 19, os seguintes passos sero feitos:
1. Na janela Palette, arraste o elemento Static Text (Label) e o dimensione a um tamanho
qualquer na band pageHeader. D um duplo clique neste elemento desenhado e digite:
Autores Cadastrados. Na janela Properties altere em Font Size para 24 e clique no boto
Bold. Mude tambm para Center em Horizontal Alignment e para Middle em Vertical
Alignment.
2. Na categoria Box properties, na janela Properties, com o label Autores Cadastrados
selecionado, altere Border para 1 Point e coloque None em Left Border e Right Border.
3. Adicione um elemento Rectangle na band columnHeader e altere a cor em Background a sua
escolha, na janela Properties.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

83 83
4. Adicione quatro elementos Static Text sobre o elemento Rectangle adicionado. Digite ID,
Nome, E-mail e Nascimento respectivamente (ver Figura 19). Altere seu tamanho a sua
escolha e coloque em Bold. Para alinhar, o editor visual do iReport para NetBeans possui
linhas auxiliares para o alinhamento, herdado do Sun's Visual Library API do NetBeans.
5. Na janela Outline, expanda Fields e arraste cada campo para a band detail, no Design. Olhe a
posio conforme a Figura 19 apresenta. Dimensione a largura de cada componente a gosto.
Observe os campos arrastados so Text Fields.


Figura 20 Fields criados a partir da instruo SQL gerada

6. Selecione, no Design, o Text Field que representa o campo nascimento. Na janela Properties,
v at o item Pattern e de um clique no boto com trs pontos ou em sua seleo, pressione
Ctrl+Space. Na caixa de dilogo Text field Pattern, selecione Date em Category e em
Type selecione o formato de data usado no Brasil. Observe na parte inferior, em Pattern, o
formato dd/MM/yyyy.


Figura 21 Seleo do pattern para o formato de data
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

84 84

7. Expanda Variables, na janela Outline, e arraste para a band pageFooter e o posicione no
canto direito.


Figura 22 A varivel PAGE_NUMBER selecionada

8. Para finalizar, adicione um Static Text ao lado desta varivel PAGE_NUMBER e digite
Pgina:.

Clique em Preview para visualizar o relatrio. Observe que os dados encontrados na band detail
sero repetidos at o seu fim, criando uma nova pgina sucessivamente at a ltima linha
encontrada em sua tabela. Na parte inferior voc v o nmero da pgina.


Figura 23 Preview do relatrio criado

Em caso de erro, observe a sada encontrada na parte inferior, na janela iReport output.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

85 85

Figura 24 Sada executada pelo iReport para NetBeans na compilao e exibio do relatrio


ConfigurandooNetBeansIDE6.0paraexecutarseurelatrio
A primeira providncia a fazer configurar as bibliotecas para gerar os relatrios no NetBeans IDE
6.0.
Para compilar sua aplicao, voc vai precisar de sete arquivos JARs, para este caso, listados a
seguir:

1. commons-beanutils-1.7.jar
2. commons-collections-2.1.jar
3. commons-digester-1.7.jar
4. commons-javaflow-20060411.jar
5. commons-logging-api-1.0.2.jar
6. itext-1.3.1.jar
7. jasperreports-2.0.4.jar

Como o iReport para NetBeans necessita de tais bibliotecas para executar, voc pode encontr-las
no CD-ROM anexo ao livro, compactado no diretrio de jasperreports, em lib.
V ao menu Tools e clique no item Libraries.


Figura 25 Selecionando Libraries pelo menu Tools

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

86 86
Na caixa de dilogo Library Manager, clique no boto New Library. Na caixa de dilogo New
Library digite JasperReports (se desejar colocar a verso tambm, interessante) no campo
Library Name e clique no boto OK para confirmar.
Retornando a caixa de dilogo Library Manager, clique no boto Add JAR/Folder. Selecione os
arquivos .jar citados do JasperReports anteriormente e confirme. Retornando, voc ter os arquivos
configurados no campo Library Classpath da guia Classpath.



Figura 26 Bibliotecas do JasperReports

Adicionandoasbibliotecaspararodarorelatrio
Na janela Projects, clique com o direito do mouse sobre Libraries, com seu projeto expandido, e
selecione Add Library no menu de contexto. Na caixa de dilogo Add Library, selecione com
JasperReports (a biblioteca criada anteriormente) e MySQL, com o Ctrl pressionado. Confirme
clicando no boto Add Library.

CriandooServletquechamarorelatrio
Sobre o projeto, clique com o direito do mouse, em Projects, e selecione o item New, clicando em
Servlet.
Na caixa de dilogo New Servlet, digite Relatorio em Class Name. Adicione um pacote em
Package (no caso do livro, seria br.com.integrator). Clique no boto Finish para completar.
Adicione no Servlet o cdigo mostrado na Listagem 1 a seguir e salve.


Listagem1 Trecho do Servlet Relatoriocontendo a chamada ao arquivo JasperReports
//... omitido por no haver alteraes
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

ServletOutputStream servletOutputStream = response.getOutputStream();

String caminho = "/relatorio/";
String relatorio = caminho+"relatorio.jasper";

InputStream reportStream =
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

87 87
getServletConfig().getServletContext().getResourceAsStream(relatorio);

Connection connection = null;
try {
//cria a conexo com o banco de dados
Class.forName("com.mysql.jdbc.Driver");
String db = "jdbc:mysql://localhost:3306/livraria";
connection = (Connection) DriverManager.getConnection(db,"edson","integrator");

// envia o relatrio em formato PDF para o browser
response.setContentType("application/pdf");
//para gerar o relatrio no formato PDF
// o mtodo runReportToPdfStream foi usado
JasperRunManager.runReportToPdfStream(reportStream,
servletOutputStream, new HashMap(),connection);


} catch (ClassNotFoundException ex) {

Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, ex);

} catch (SQLException ex) {

Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, ex);
}
catch (JRException e) {

Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, e);
}
finally{

servletOutputStream.flush();
servletOutputStream.close();

try {
if (connection != null) {
connection.close();
}
} catch (SQLException ex) {
Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, ex);
}
}

}


Para as importaes dos objetos encontrados, utilize o atalho Ctrl + Shift + I (Fix All Imports).


Figura 27 Importao com Fix All Imports

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

88 88
Toda a lgica necessria para a criao do relatrio est no mtodo protegido processRequest().
Este mtodo, configurado para ser chamado tanto via mtodo POST e GET, utiliza o mtodo
runReportToPdfStream(). Este mtodo, de JasperRunManager, cria uma instncia de
java.io.OutputStream() para escrever o relatrio compilado e possui os seguintes parmetros:

runReportToPdfStream(java.io.InputStream inputStream,
java.io.OutputStream outputStream,
java.util.Map parameters,
JRDataSource dataSource)

Para exibir o relatrio no browser, voc precisa passar o relatrio criado para um stream de dados.
exatamente isso que ocorre no primeiro parmetro deste mtodo. O relatrio pego em uma String
e depois convertido em um InputStream, no seguinte trecho:

String caminho = "/relatorio/";
String relatorio = caminho + "relatorio.jasper";
InputStream reportStream = getServletConfig().
getServletContext().
getResourceAsStream(relatorio);

O segundo parmetro a resposta, que definida em um ServletOutputStream, atravs do seguinte
trecho:

ServletOutputStream servletOutputStream = response.getOutputStream();

O terceiro parmetro o HashMap necessrio para transmitir algum parmetro para o seu relatrio,
caso este o tenha.
Por ltimo foi transmitida a conexo, para que o relatrio executasse com sucesso.
A sada foi definida pelo setContentType(), que atravs do objeto response, possibilitou a
finalizao com o MIME TYPE para que o browser o reconhea como PDF.

Ateno: O exemplo passado do Servlet, define apenas um modelo didtico, no sendo ideal para
sistemas em produo. Recomendo o conhecimento de Design Patterns.


ApginaquechamaroServlet
Voc mesmo pode criar se desejar, uma pgina que chamar seu Servlet. O trecho a seguir mostra a
chamada ao Servlet, lembrando que o nome dado est configurado no deployment descriptor
(web.xml), que para o caso deste livro, ser gerado automaticamente pela IDE.
Portanto, abra o arquivo index.jsp e adicione o pequeno trecho mostrado na Listagem 2 a seguir:


Listagem2 Alterao do arquivo index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Relatrios JasperReports</title>
</head>
<body>
<a href="Relatorio">Clique aqui para visualizar seu relatrio</a>
</body>
</html>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

89 89


Figura 28 Relatrio exibido no browser aps sua chamada

Trabalhandocomparmetrosemseusrelatrios
O primeiro exemplo demonstra somente a chamada ao relatrio criado, sem transmitir parmetros.
Para o segundo exemplo, voc vai adicionar um parmetro ao relatrio.
Para fazer este, abra o projeto do Captulo 4, TrabComPadroes. Adicione um diretrio chamado
relatorio e copie para este o relatrio criado.



Figura 29 Exibio do projeto TrabComPadroes contendo o relatorio.jrxml

Abra o arquivo relatorio.jrxml. Na janela Outline, clique com o direito do mouse sobre Parameters
e no menu de contexto selecione parameter em Add.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

90 90

Figura 30 Adicionando um parmetro pelo menu de contexto

Com o parmetro criado e selecionado, v at a janela Properties e altere os campos como mostra a
Tabela 3:

Tabela 3 Propriedades do parmetro criado
Propriedade Valor
Name ID
Parameter Class java.lang.Integer
Default value expression new Integer(0)



Figura 31 Propriedades alteradas do parmetro adicionado

Abra a caixa de dilogo Report Query, e altere a query como mostrado na Listagem 3 a seguir:

Listagem3 Alterao da query usada no relatrio
SELECT
*
FROM
Autores

WHERE id=$P{ID}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

91 91

Figura 32 Alterao da instruo SQL


Feche a caixa de dilogo e clique em Preview para gerar o arquivo .jasper.

AdicionandooServletRelatorio
Crie um Servlet chamado Relatorioe adicione o contedo similar ao mostrado na Listagem 4 a
seguir:

Listagem4 O Servlet Relatorio
//...omitido por no haver alteraes
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

ServletOutputStream servletOutputStream = response.getOutputStream();

String caminho = "/relatorio/";
String relatorio = caminho + "relatorio.jasper";
InputStream reportStream = getServletConfig().getServletContext().
getResourceAsStream(relatorio);

Connection connection = null;

String id = request.getParameter("id");
try {

//chama a conexo da fbrica de conexes
connection = (Connection) ConnectionFactory.getConnection( );
HashMap<String, Integer> parameterMap = new HashMap<String, Integer>();

//o Nome do parmetro e o valor passado ao HashMap
parameterMap.put("ID", Integer.parseInt(id));

// envia o relatrio em formato PDF para o browser
response.setContentType("application/pdf");
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

92 92

//para gerar o relatrio em PDF
// o mtodo runReportToPdfStream foi usado
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,
parameterMap,connection);

}
catch (Exception ex) {

Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, ex);
}finally{
servletOutputStream.flush();
servletOutputStream.close();
try {
//fecha a conexo
ConnectionFactory.closeConnection(connection);

} catch (Exception ex) {

Logger.getLogger(Relatorio.class.getName()).log(Level.SEVERE, null, ex);
}
}

O parmetro passado um java.util.HashMap(), que define se haver um ou mais parmetros. O
parmetro criado no relatrio possui um nome, e este que deve ser utilizado neste HashMap: ID
(referindo-se a $P{ID}. Como se trata de uma chave string e de um valor numrico inteiro, graas ao
mtodo put(Key, Value), o exemplo capturar o campo chave de cada autor e o transmitir ao
parmetro, da seguinte forma:

String id = request.getParameter("id");
parameterMap.put("ID", Integer.parseInt(id));

ChamandooServletparagerarorelatrio
Abra o arquivo mostrarAutoresCads.jsp e adicione mais uma coluna a tabela, sendo que neste
ltima haver a chamada ao servlet Relatorio, como mostra o detalhe na Listagem 5 a seguir:


Listagem5 Chamando o Servlet por mostrarAutoresCads.jsp
<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Trabalhando com DAO e Model 2</title>
</head>
<body>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
<th>ID - Atualizar</th>
<th>Nome</th>
<th>E-mail</th>
<th>Nascimento</th>
<th>Excluir Autor</th>
<th>Em PDF</th>
</tr>

<c:forEach var="lista" items="${ requestScope.autoresList }">
<tr>
<td>
<a href="ServletAutores?cmd=atu&id=${lista.id}">
${lista.id}
</a>
</td>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

93 93
<td>${lista.nome}</td>
<td>${lista.email}</td>
<td><fmt:formatDate value="${lista.nascimento}"
type="DATE"
pattern="dd/MM/yyyy"/>
</td>
<td>
<a href="ServletAutores?cmd=exc&id=${lista.id}">
Excluir
</a>
</td>
<td>
<a href="Relatorio?id=${lista.id}">
Visualizar este autor
</a>

</td>
</tr>
</c:forEach>
</table>
<br />
<a href="formInserindoDados.jsp">Adicionar um novo Autor</a>
<br />
<a href="index.jsp">Pgina Principal</a>
</body>
</html>



Figura 33 Exibio da chamada ao relatrio


Ateno: No CD-ROM h um vdeo que ensina a criar seu relatrio usando o assistente.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

94 94
CaptuloExtra5
EstudodecasocompletocomVisualWebJSF
Este captulo extra a continuao do sistema iniciado nos Captulos 7 e 8, sendo que sem a leitura
destes, ser mais difcil sua execuo.
Adicionandonovascaractersticasaoadministrador
Enquanto que no livro voc pde criar uma aplicao com os elementos fundamentais do Visual
Web JSF, entendendo os detalhes de como funcionam, neste captulo extra, ser finalizada toda a
rea administrativa, adicionando relacionamento s tabelas. Alm disso, outros componentes sero
usados, integrando-se para criar uma rea administrativa mais complexa.
Neste captulo ser apresentado:
A criao de mais trs entidades (tabelas);
Utilizao de campos ocultos;
Transmitindo dados via HTTP, pelo mtodo GET;
Utilizando o componente Listbox com banco de dados;

As entidades e seus relacionamentos
No decorrer do livro, duas tabelas foram utilizadas para o desenvolvimento do administrador do
aplicativo Web: livros e autores. Agora, ser necessrio criar trs novas tabelas: editoras,
publicacao e livro_autor.


Figura 1 Modelo de dados do projeto

A Listagem1mostra o script para a criao das tabelas que sero adicionadas (veja o quadro
Utilizando o NetBeans para instrues SQL) no banco de dados de livraria.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

95 95
Listagem1. Script para criao das tabelas do projeto
CREATE TABLE editoras (
id int(11) NOT NULL auto_increment,
editora varchar(50) default NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;



CREATE TABLE publicacao (
id int(11) NOT NULL auto_increment,
livro_id int(11) default NULL,
editora_id int(11) default NULL,
PRIMARY KEY (id),
/* Foreign keys */
KEY fk_livro (livro_id),
KEY fk_editora (editora_id),
CONSTRAINT fk_editora
FOREIGN KEY (editora_id)
REFERENCES editoras (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_livro
FOREIGN KEY (livro_id)
REFERENCES livros (id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;



CREATE TABLE livro_autor (
livro_id int,
autor_id int,
/* Foreign keys */
CONSTRAINT fk_autor_livro
FOREIGN KEY (autor_id)
REFERENCES autores(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_livro_autor
FOREIGN KEY (livro_id)
REFERENCES livros(id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE = InnoDB;


Entendendoorelacionamento
Quando um livro, uma editora e um autor so cadastrados, podemos relacion-los. Um livro pode
pertencer a um ou mais autores, quanto que a publicao geralmente feita em somente uma
editora. Desta forma, se o livro X, foi escrito pelos autores A, B e C, ser publicado pela
editora Cincia Moderna. Logo, podemos ter muitos autores para um determinado livro ou um
autor para muitos livros. Esta a modelagem mais simples de se entender. Para que haja a relao
entre autor e livro (ou vice-versa), temos uma tabela que possui o relacionamento Many-To-Many
(Muitos-para-Muitos), ao qual armazenar o cdigo do autor e do seu respectivo livro escrito.
evidente que na tabela de livros temos os campos publicacao e edicao, que devem ser
transferidos para a tabela publicacao, mas que no fora feito para apenas estender o exemplo do
livro.




Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

96 96
Utilizando o NetBeans para instrues SQL
No NetBeans, para executar o script da Listagem1, siga os passos descritos a seguir:
1. Tenha conectado seu banco de dados, como descrito no livro atravs do Captulo 4 em Se
conectando ao banco de dados;
2. Com o direito do mouse sobre Tables>Execute Command, digite o script das tabelas na
janela SQL Command 1 e clique no boto Run SQL(Ctrl+Shift+E) (veja detalhes na Figura
4.9 do livro);
3. Verifique a sada na janela Output>SQL Command 1 Execution;
4. Para exibir as tabelas criadas, v em Services>selecione a sua conexo>Tables e, com o
direito do mouse, selecione Refresh no menu de contexto.


Ateno: Adicione o driver JDBC do MySQL ao projeto.


Adicionando novas pginas do administrador
A pgina responsvel pelo cadastro de editoras o mais simples, portanto ser apresentada
inicialmente. Crie uma nova pgina Visual Web JSF Page chamada de Editora, dentro do
diretrio admin. A Figura 2 exibe como esta ser formada e no quadro Componentes da pgina
Editora h uma descrio dos elementos que compe a pgina.


Figura 2 A pgina administrativa de cadastro de editoras
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

97 97
Componentes da pgina Editora
Siga estes passos para a pgina Editora, conforme visto na Figura 2:
1. Adicione um componente Page Fragment Box e selecione o menu do administrador.
Posicione-o como os demais j feitos;
2. Arraste da janela Palette o componente Label para o Design da pgina. Posicione-o e digite
Editora: (altere em text na janela Properties se necessrio);
3. Arraste um componente Text Field, ao lado do rtulo inserido. Altere a propriedade id atravs
de Properties para tfEditora;
4. Adicione o componente Button na pgina e altere em Properties a propriedade id para
btSalvar e text para Salvar;
5. Para finalizar o formulrio, adicione o componente Message Group logo abaixo do
formulrio;
6. Adicione um componente Table abaixo do formulrio. Arraste da janela Services, atravs da
tabela editoras (se no estiver aparecendo, clique com o direito sobre Tables, na sua conexo,
e selecione Refresh). Com o direito sobre ela, selecione Table Layout. Altere as propriedades
de Header Text das duas colunas e adicione duas novas, chamando uma de Excluir e
Atualizar, alterando tambm em Value Expression neste caso. Nas duas colunas adicionadas,
mude tambm a propriedade Component Type para Hyperlink. Se desejar, coloque
paginao;
7. No Design, selecione o link Excluir da tabela adicionada e em Properties altere o id para
excluir. Faa o mesmo para o link Atualizar modificando para atualizar;
8. Para finalizar o componente Table, v janela Properties e desa a rolagem at o item
Advanced e marque a opo internalVirtualForm. Veja detalhes no Captulo 8 a respeito.


ObeanEditora
Assim como feito nos demais exemplos de cadastro criados no livro, para o cadastro de editora
haver um JavaBean especfico. A Listagem 2 exibe o cdigo deste bean:

Listagem2. O bean Editora
public class EditoraBean {
private RowKey rowKey;
private String editora;

public RowKey getRowKey() {
return rowKey;
}

public void setRowKey(RowKey rowKey) {
this.rowKey = rowKey;
}

public String getEditora() {
return editora;
}

public void setEditora(String editora) {
this.editora = editora;
}

}

A explicao da Listagem 2 a mesma elaborada no livro, no Captulo 8.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

98 98
Oscdigosdobotoedoslinks
Como j sabe, basta dar um duplo clique em cada elemento e definir seu cdigo. A seguir voc
possui as listagens contendo os cdigos de cada elemento:


Listagem3. O cdigo do link Excluir do componente Table da pgina
public String excluir_action() {

try {
//captura a linha atual do link de excluso clicado
RowKey rowKey = tableRowGroup1.getRowKey();

if (rowKey != null) {

//atualiza o cache para iniciar a excluso
editorasDataProvider.refresh();

//remove a linha existente no objeto editorasDataProvider
editorasDataProvider.removeRow(rowKey);

//reflete esta ao no banco de dados
editorasDataProvider.commitChanges();

//atualiza o cache para exibir no componente Table
editorasDataProvider.refresh();

}

//limpa os campos existentes
tfEditora.setText(null);

//torna nulo o valor de rowkey em EditoraBean
getSessionBean1().getEditoraBean().setRowKey(null);

//informa ao administrador a excluso
info("Editora excluda!");

} catch (Exception ex) {
editorasDataProvider.revertChanges();
editorasDataProvider.refresh();
error("Erro encontrado: " + ex);
}
//retorna nulo pois no muda a pgina
return null;
}


Listagem4. O cdigo do link Atualizar do componente Table da pgina
public String atualizar_action() {
try {
//leva para o bean EditoraBean os valores existentes
//nas linhas adicionadas
editoraBean = getSessionBean1().getEditoraBean();

// captura a linha atual do componente Table
TableRowDataProvider rowData =
(TableRowDataProvider) getBean("currentRow");
// adiciona os valores dos campos e principalmente o RowKey
// no Bean EditoraBean
editoraBean.setRowKey(rowData.getTableRow());
editoraBean.setEditora((String) rowData.getValue("editoras.editora"));


} catch (Exception ex) {
//informa o erro caso ocorra ao administrador
error("Erro encontrado: " + ex);
}

//retorna nulo pois no muda a pgina
return null;
}
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

99 99
Listagem5. O cdigo do boto Salvar do formulrio da pgina
public String btSalvar_action() {
try {
RowKey rowKey = getSessionBean1().getEditoraBean().getRowKey();
String mensagem;
if (rowKey == null) {
//prepara uma nova linha para insero de dados
rowKey = editorasDataProvider.appendRow();
mensagem = "Adicionado com sucesso!";
} else {
//atualiza o cache para iniciar a atualizao
editorasDataProvider.refresh();
mensagem = "Atualizado com sucesso!";
}
//captura o valor do componente no formulrio
//e o atribui a seu determinado campo no banco de dados
editorasDataProvider.setValue("editoras.editora", rowKey, tfEditora.getText());

//grava as informaes no banco de dados
editorasDataProvider.commitChanges();
//limpa os campos existentes
tfEditora.setText(null);

//torna nulo o valor de rowkey em EditoraBean
getSessionBean1().getEditoraBean().setRowKey(null);

//informa ao administrador o cadastro efetuado
info(mensagem);
editorasDataProvider.refresh();

} catch (Exception ex) {
//informa o erro caso ocorra ao administrador
error("No foi possvel adicionar" + ex.getMessage());
editorasDataProvider.revertChanges();
}

//retorna nulo pois no muda a pgina
return null;
}


As Listagem 3, 4 e 5 exibem cada um dos componentes que tero seu comportamento determinado
por suas aes, conforme j visto em outros cadastros feitos no livro. Portanto, a explicao ser
omitida.

Alterandoomtodoprerender()
Como j visto no livro, atravs do Captulo 8, o mtodo callback prerender() ser alterado para
preencher o Text Field tfEditora para que este exiba o texto do nome da editora selecionado atravs
do componente Table da pgina.

Listagem6. O cdigo do mtodo Callback prerender() da pgina
public void prerender() {
//verifica se RowKey no nulo
if(getSessionBean1().getEditoraBean().getRowKey()!=null){
tfEditora.setText(editoraBean.getEditora());
}
}

DeclarandoavariveleditoraBean
Ao longo das listagens, fora utilizado uma varivel editoraBean, que deve ser declarada como
mostrado a seguir, no cdigo da pgina:

EditoraBean editoraBean = new EditoraBean();
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

100 100
A pgina de criar publicaes
A pgina de publicaes possui um aspecto diferente das pginas j criadas. Seu propsito ligar
uma Editora a um determinado Livro. Para escolher as editoras, voc utilizar um componente
Drop Down List, que exibir todas as editoras cadastradas e enviar o valor chaves da selecionada
para o cadastro. O livro selecionado ser armazenado em um campo oculto, que ser includo na
pgina atravs do componente Hidden Field.
Crie uma pgina Visual Web JSF Page chamada de Publicar. Adicione os componentes exibidos
na Figura 3, incluindo o componente Drop Down List.


Figura 3 Aparncia da pgina Publicar

A Tabela 1 mostra os componentes que tero suas propriedades alteradas.

Tabela 1 Alterao das propriedades dos componentes do formulrio da pgina
Componente Propriedade Valor
Static Text text Editoras Cadastradas
Label text Editoras:
Drop Down List id editoras
Button text Publicar
id btPublicar
Hidden Field* id id


* Para alterar as propriedades do componente Hidden Field, cuja aparncia no exibida no design
da pgina, selecione-o atravs da janela Navigator (veja nmero 2 na Figura 3).

ConfigurandoocomponenteDropDownListeditoras
Arraste Services>Tables>editoras para a pgina. O Visual Web JSF ir question-lo, atravs da
caixa de dilogo Add New Data Provider with RowSet for Table editoras. Esta caixa de dilogo
est reconhecendo que j h em SessionBean1 um RowSet para editoras, selecionando j todos os
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

101 101
dados desta tabela. Como vamos usar o mesmo para exibir no componente Drop Down List,
mantenha a opo Use, que foi sugerida, selecionada e confirme.



Figura 4 Adicionando um novo data provider

Clique com o direito do mouse sobre o componente Drop Down List editoras e selecione, no menu
de contexto, o item Bind to Data (veja Figura 5).


Figura 5 Selecionando Bind to Data no menu de contexto

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

102 102
Na caixa de dilogo Bind to Data, selecione a guia Bind to Data Provider. Em Choose a Data
Provider to bind to editoras o item editorasDataProvider. Automaticamente o Visual Web JSF
selecionar em Value field o campo chave, que no caso ser editoras.id e em Display field o item
editoras.editora. Caso isso no ocorra, dever ser selecionado manualmente.


Figura 6 Ligando o data provider ao componente Drop Down List editoras

Observando o dilogo (ver Figura 6), voc deve ter concludo que sero exibidos os textos com os
nomes das editoras e, o item selecionado transmitido para ser salvo, ser o valor do cdigo chave.

Arrastandoatabelapublicacaoparaapgina
Como os dados envolvidos no formulrio desta pgina sero salvos na tabela publicacao, arraste-a
para a pgina (SEM ser sobre quaisquer componentes exibidos).
Verifique que em Navigator agora h o Data Provider chamado publicacaoDataProvider dentro
do n de Publicar.
AdicionandocdigoaobotoPublicar
D um duplo clique no componente Button btPublicar e adicione o cdigo da Listagem 7.

Listagem7. O cdigo do boto btPublicar do formulrio da pgina
public String btPublicar_action() {

try {

//prepara uma nova linha para insero de dados
RowKey rowKey = publicacaoDataProvider.appendRow();

//captura os valores de cada componente no formulrio
//e os atribui a seus determinados campos no banco de dados
publicacaoDataProvider.setValue("publicacao.livro_id", rowKey, id.getText());

publicacaoDataProvider.setValue("publicacao.editora_id", rowKey,
editoras.getValue());
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

103 103

//grava as informaes no banco de dados
publicacaoDataProvider.commitChanges();

//retorna a seguinte string em caso de sucesso
return "publicado";

} catch (Exception e) {

//em caso de erro, exibe ao usurio
error("Erro: " + e.getMessage());

//reverte alteraes feitas no data provider
publicacaoDataProvider.revertChanges();

}

//retorna nulo em caso de erro, no mudando de pgina
return null;
}


Observando a Listagem 7, percebemos que a captura do valor de um componente Hidden Field
similar ao Text Field, atravs do mtodo getText(). Para o componente Drop Down List editoras,
utilizamos o mtodo getValue()para capturar o valor selecionado.
Ao realizar com sucesso, este boto retorna a string publicar, o que indica que o usurio ser
direcionado a outra pgina.

Adicionandocdigoapgina
Continuando no cdigo, voc dever alterar algumas partes para que possa executar certas aes
que caracterizao o seu uso. A Listagem 8 exibe o que ser alterado.

Listagem8. Alteraes do cdigo da pgina
//...omitido por no ser alterado
public void prerender() {

//captura a variavel GET titulo
this.setTitulo((String) getExternalContext().
getRequestParameterMap().get("titulo"));

}

//...omitido por no ser alterado

private String livid;

public String getLivid() {
return livid;
}

public void setLivid(String livid) {
this.livid = livid;
}


private String titulo;

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

//...omitido por no ser alterado
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

104 104
No cdigo do mtodo prerender()exibido na Listagem 8, exibe um novo mtodo no utilizado at o
momento. Atravs de getExternalContext(), voc tem acesso ao mtodo getRequestParameterMap(),
que possibilita, atravs de get(), capturar o valor de uma varivel transmitida pelo mtodo GET. Isso
significa que transmitiremos uma varivel pelo cabealho HTTP da pgina (barra de endereos)
chamada de titulo. Esta varivel ser capturada e utilizada pela pgina. Veja mais adiante a
explicao do que ser transmitido.
A segunda forma de receber dados pelo mtodo GET atravs de uma pgina criada pelo Visual Web
JSF similar ao utilizado pelo JavaServer Faces, utilizando getters e setters. Como exemplo, a
varivel lividser utilizada para este fim.

ConfigurandooHiddenFieldideottulodapgina
Volte ao Design da pgina. Selecione na janela Navigator a pgina Publicar. V janela
Properties e clique no boto com trs pontos em Title.
Altere como mostrado no trecho a seguir, na caixa de dilogo Title:

Publicar livro #{admin$Publicar.titulo}

Seu exemplo dever ser similar ao da Figura 7.


Figura 7 Alterao da propriedade Title da pgina


Faa o mesmo com o campo oculto (Hidden Field) id. Selecione-o atravs da janela Navigator e na
propriedade text clique no boto de trs pontos. Em Use bind, selecione Bind to an Object e
expanda admin/Publicar. Selecione livid e confirme.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

105 105

Figura 8 Bind para a varivel livid

TransmitindoviamtodoGET
Abra a pgina Livro.jsp, de admin, e adicione uma nova coluna ao componente Table da pgina.
Esta nova coluna ter um Hyperlink como tipo de componente (Component Type). Em Header
Text digite Publicao e em Value Expression digite Gerar. Veja os detalhes na Figura 9.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

106 106

Figura 9 A nova coluna chamada de Publicao

Selecione o link Gerar, em destaque na Figura 10, e v at suas propriedades. D um clique no
boto de trs pontos na propriedade url.


Figura 10 A coluna Publicao e seu link Gerar

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

107 107
Digite em URL, mantendo Use value, como mostrado a seguir:

/admin/Publicar.faces?livid=#{currentRow.value['livros.id']}&titulo=#{currentRow.value['l
ivros.titulo']}

O que ser transmitido via URL foi colorido da seguinte forma:
Em vermelho temos as variveis que sero transmitidas;
Em azul temos os valores destas variveis, que correspondem a valores das colunas do
banco de dados;
Em verde a concatenao para envio de mais de uma varivel, o que ocorre no caso.



Figura 11 - Alterao no campo URL de Gerar

Configurandofacesconfig.xmlparatrabalharcomGET
Para capturar um valor transmitido pelo mtodo GET no JavaServer Faces, utilizamos o
<managed-property/>, que deve possuir em seu valor a expresso #{param.VARIAVEL}. Veja na
Listagem 9 como ficar a alterao feita no arquivo faces-config.xml:

Listagem9. Alterao em faces-config.xml para a pgina Publicar
<managed-bean>
<managed-bean-name>admin$Publicar</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicar</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>livid</property-name>
<value>#{param.livid}</value>
</managed-property>
</managed-bean>

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

108 108
A pgina de publicaes
Crie uma nova pgina Visual Web JSF Page chamada de Publicados. Adicione os componentes
da Figura 12 a seguir. Altere o componente Table como o quadro Exibindo as Publicaes
Cadastradas descreve.


Figura 12 Design da pgina Publicados


Exibindo as Publicaes Cadastradas
Siga estes passos para o componente Table da pgina Publicados, conforme visto na Figura 12:
1. Arraste de Services>SUA CONEXAO>Tables a tabela publicacao para a pgina (NO
faa sobre o componente Table);
2. Assim como j ocorrido em caso anterior, o Visual Web JSF ir question-lo, atravs da
caixa de dilogo Add New Data Provider with RowSet for Table publicacao. Selecione
desta vez a opo Create em admin/Publicados e confirme;
3. Expanda o n de Publicados, na janela Navigator, e d um duplo clique em
publicacaoRowSet;
4. Ao surgir o Design Query, clique com o direito do mouse e selecione Add Table na parte
superior da janela (veja detalhe na Figura 13). Adicione as tabelas editoras e livros;
5. Deixe marcado somente os campos para sua query: publicacao.id, editoras.editora e
livros.titulo;
6. Volte pgina Publicados, em Design, e com o direito do mouse sobre o componente
Table, v at Table Layout;
7. Altere a ordem e os ttulos em Header Text na seqncia: ID, Editora, Ttulo;
8. Na guia Options digite no campo Title Publicaes Cadastradas e no campo Empty
Data Message No h publicaes no Momento. Se desejar, marque Enable Pagination
e confirme.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

109 109

Figura 13 A query relacionada

Vinculando o livro a seus autores
Diferente do link Gerar, que foi transmitido via mtodo GET, o link que ser criado agora
transmitir via mtodo POST, mas sem usar uma sesso.
Abra a classe RequestBean1 e adicione em seu final o trecho da Listagem 10.


Listagem10. Alterao na classe RequestBean1
//... omitidos por no haver alteraes
private String livid;

public String getLivid() {
return livid;
}

public void setLivid(String livid) {
this.livid = livid;
}


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

110 110
AlterandonovamenteapginaLivro
Na pgina de cadastro de Livros (Livro.jsp), adicione mais uma coluna no componente Table e
mova antes da coluna de Publicaes, deixando-a similar a Figura 14 mostrada a seguir:


Figura 14 Nova coluna Autor na tabela da pgina Livros

Selecione o link Adicionar da coluna Autor, do componente Table, e altere a propriedade id para
adicionar (Figura 15).



Figura 15 Propriedade id alterada do link Adicionar do componente Table

AdicionandocdigoaolinkAdicionar
D um duplo clique no link Adicionar, do componente Table, da pgina Livro e adicione o cdigo
mostrado a seguir na Listagem 11:


Listagem11. Cdigo do link Adicionar
public String adicionar_action() {
//captura a linha atual do link de adio clicado
TableRowDataProvider rowData =
(TableRowDataProvider) getBean("currentRow");

//o coloca no bean RequestBean1 para que possa transmitir
//o valor para a pgina LivroAutor
getRequestBean1().setLivid(rowData.getValue("livros.id").toString());

return "adlivroautor";
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

111 111
O cdigo deste link simplesmente adicionar o ID do livro selecionado, no componente Table, a
livid de RequestBean1, criado anteriormente para ser puxado pela pgina que ir vincular o autor
ao livro.

Apginadeadiodeautoraolivro
Crie uma pgina similar a Figura 16, alterando as propriedades conforme a Tabela 2.


Figura 16 Vinculando o livro aos autores


Tabela 2 Alterao das propriedades dos componentes do formulrio da pgina
Componente Propriedade Valor
Static Text text Vincular Autor ao Livro
Label text Autores:
Drop Down List id autores
Button text Adicionar ao Livro
id btAdLivro


ConfigurandoocomponenteDropDownListautores
Arraste Services>Tables>autores para a pgina. O Visual Web JSF ir question-lo, atravs da
caixa de dilogo Add New Data Provider with RowSet for Table autores. Ao ser questionado
quanto a criao do Data Provider, mantenha a opo Use, que foi sugerida, selecionada e
confirme.
Clique com o direito do mouse sobre o componente Drop Down List autores e selecione, no menu
de contexto, o item Bind to Data (similar ao da Figura 5 em exemplo anterior).
Na caixa de dilogo Bind to Data, selecione a guia Bind to Data Provider. Em Choose a Data
Provider to bind to autores o item autoresDataProvider. Automaticamente o Visual Web JSF
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

112 112
selecionar em Value field o campo chave, que no caso ser autores.id e em Display field o item
autores.nome. Caso isso no ocorra, dever ser selecionado manualmente. Confirme.


Figura 17 Bind to Data para o componente Drop Down Listo autores

Ocdigodobotodoformulrio
D um duplo clique no boto Adicionar ao Livro e adicione o cdigo da Listagem 12.


Listagem12. Cdigo do boto Adicionar ao Livro
public String btAdLivro_action() {

//capta o id do livro em getRequestBean1()
String livid = getRequestBean1().getLivid();

try {

//prepara uma nova linha para insero de dados
RowKey rowKey = livro_autorDataProvider.appendRow();

//captura os valores de cada componente no formulrio
//e os atribui a seus determinados campos no banco de dados
livro_autorDataProvider.setValue("livro_autor.livro_id", rowKey, livid);
livro_autorDataProvider.setValue("livro_autor.autor_id", rowKey,
autores.getValue());

//grava as informaes no banco de dados
livro_autorDataProvider.commitChanges();

//retorna a string publicado
return "publicado";

} catch (Exception e) {
error("Erro: " + e.getMessage());

}

//no vai a pgina alguma caso haja um erro
return null;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

113 113
}

Similar ao criado para vincular um livro a uma publicao e sua respectiva editora, neste caso, a
diferena fica por conta de no estarmos usando o envio dos dados via mtodo GET, mas no
colocando os dados em Sesso, como j fora feito em outros exemplos.

A pgina de autores publicados
A ltima pgina Visual Web JSF Page a ser criada no administrador ser AutoresPublicados. Sua
aparncia ser similar a Figura 18. Altere o componente Table como o quadro Exibindo os
Autores Publicados descreve.



Figura 18 Design da pgina AutoresPublicados


Exibindo os Autores Publicados
Siga estes passos para o componente Table da pgina Publicados, conforme visto na Figura 18:
1. Arraste de Services>SUA CONEXAO>Tables a tabela livro_autor para a pgina (NO
faa sobre o componente Table);
2. Expanda o n de AutoresPublicados, na janela Navigator, e d um duplo clique em
livro_autorDataProvider;
3. Ao surgir o Design Query, clique com o direito do mouse e selecione Add Table na parte
superior da janela. Adicione as tabelas autores e livros (veja o resultado final na Figura
19);
4. Deixe marcado somente os campos para sua query: autores.nome e livros.titulo;
5. Volte pgina AutoresPublicados, em Design, e com o direito do mouse sobre o
componente Table, v at Table Layout;
6. Deixe a ordem dos ttulos em Header Text na seqncia: Ttulo e Autor;
7. Na guia Options digite no campo Title Autores publicados e no campo Empty Data
Message No h autores com livros cadastrados. Se desejar, marque Enable Pagination
e confirme.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

114 114

Figura 19 A query relacionada


Anavegaoemfacesconfig.xml
V ao arquivo faces-config.xml e altere a navegao, arrastando do boto Adicionar ao Livro, da
pgina LivroAutor, para a pgina criada (AutoresPublicados). A Listagem 13 exibe a navegao
em detalhe no formato XML.

Listagem13. Navegao da pgina LivroAutorpara AutoresPublicados
...
<managed-bean>
<managed-bean-name>admin$LivroAutor</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.LivroAutor</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/admin/LivroAutor.jsp</from-view-id>
<navigation-case>
<from-outcome>publicado</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
</navigation-rule>
...



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

115 115
Alterando o menu
Adicione mais trs links: Cadastrar Editoras, Publicaes e Autores Publicados.



Figura 20 Menu da rea administrativa do site

Altere a propriedade id de cada um conforme deseja e altere para a string de retorno conforme
mostrado em Criando o relacionamento entre as pginas.
Criando o relacionamento entre as pginas
Devido a inmeros relacionamentos, neste estudo de caso, o arquivo faces-config.xml foi colocado
na ntegra (Listagem 13), em seu formato original, XML, para que voc possa acompanhar cada
relao, caso tenha impresso este captulo. recomendvel olhar o cdigo fonte do projeto, contido
tambm no CD-ROM, para melhor compreenso.

Listagem13. Arquivo faces-config.xml
<faces-config ...
<managed-bean>
<managed-bean-name>SessionBean1</managed-bean-name>
<managed-bean-class>br.com.integrator.SessionBean1</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Page1</managed-bean-name>
<managed-bean-class>br.com.integrator.Page1</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>ApplicationBean1</managed-bean-name>
<managed-bean-class>br.com.integrator.ApplicationBean1</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>RequestBean1</managed-bean-name>
<managed-bean-class>br.com.integrator.RequestBean1</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>menu</managed-bean-name>
<managed-bean-class>br.com.integrator.menu</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Livro</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Livro</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Livros</managed-bean-name>
<managed-bean-class>br.com.integrator.Livros</managed-bean-class>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

116 116
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Contato</managed-bean-name>
<managed-bean-class>br.com.integrator.Contato</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>pesquisar</from-outcome>
<to-view-id>/Pesquisado.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/Page1.jsp</from-view-id>
<navigation-case>
<from-outcome>contato</from-outcome>
<to-view-id>/Contato.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>livros</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>

</navigation-rule>
<navigation-rule>
<from-view-id>/Livros.jsp</from-view-id>
<navigation-case>
<from-outcome>contato</from-outcome>
<to-view-id>/Contato.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/Contato.jsp</from-view-id>
<navigation-case>
<from-outcome>livros</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>Autores</managed-bean-name>
<managed-bean-class>br.com.integrator.Autores</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$menu</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.menu</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Autor</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Autor</managed-bean-class>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

117 117
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Admin</managed-bean-name>
<managed-bean-class>br.com.integrator.Admin</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/Admin.jsp</from-view-id>
<navigation-case>
<from-outcome>livros</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>contato</from-outcome>
<to-view-id>/Contato.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logado</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/admin/Autor.jsp</from-view-id>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/admin/Livro.jsp</from-view-id>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>adlivroautor</from-outcome>
<to-view-id>/admin/LivroAutor.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

118 118
<from-view-id>/Autores.jsp</from-view-id>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>livros</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<application>
<message-bundle>br.com.integrator.Bundle</message-bundle>
</application>
<managed-bean>
<managed-bean-name>Pesquisado</managed-bean-name>
<managed-bean-class>br.com.integrator.Pesquisado</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/Pesquisado.jsp</from-view-id>
<navigation-case>
<from-outcome>livros</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>contato</from-outcome>
<to-view-id>/Contato.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>Busca</managed-bean-name>
<managed-bean-class>br.com.integrator.Busca</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>topo</managed-bean-name>
<managed-bean-class>br.com.integrator.topo</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Editora</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Editora</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/admin/Editora.jsp</from-view-id>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

119 119
<managed-bean-name>admin$Publicar</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicar</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>livid</property-name>
<value>#{param.livid}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Publicados</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicados</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/admin/Publicar.jsp</from-view-id>
<navigation-case>
<from-outcome>publicado</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/admin/Publicados.jsp</from-view-id>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>admin$LivroAutor</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.LivroAutor</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/admin/LivroAutor.jsp</from-view-id>
<navigation-case>
<from-outcome>publicado</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

120 120
</navigation-case>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autpub</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/admin/AutoresPublicados.jsp</from-view-id>
<navigation-case>
<from-outcome>cadlivro</from-outcome>
<to-view-id>/admin/Livro.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadautor</from-outcome>
<to-view-id>/admin/Autor.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editora.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>admin$AutoresPublicados</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.AutoresPublicados</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
...



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

121 121
CaptuloExtra6
EstudodecasocompletocomVisualWebJSF,SpringeHibernateutilizandoJPA
Este captulo extra uma verso do sistema criado nos Captulos 7, 8 e estendidos no Captulo
Extra 5, s que criado utilizando Spring 2.5, Hibernate 3.2 e JPA (Java Persistence API), onde
muitas explicaes tcnicas se encontram no Captulo 10.

Ascaractersticasdaaplicao
O sistema segue o roteiro proposto pelo mesmo exemplo tido ao longo dos Captulos 7, 8 e Extra
5, portanto, o design das pginas sero omitidos, sempre referindo a estes captulos quando se tratar
deste assunto.
Neste captulo ser apresentado:
A criao das entidades (POJOs);
O trabalho com relacionamentos da JPA (One-To-Many, Many-To-One e Many-To-Many);
A facilidade incorporada pelo Spring Framework;
A facilitao do DAO Genrico criado para gerar o sistema;
Utilizao do pool C3P0 e cache de segundo nvel com EhCache.

Ao final deste captulo, o leitor ter habilidade de trabalhar em sistemas complexos e completos
utilizando as tecnologias relacionadas, incluindo o seu teor tcnico para maiores detalhes.

O Projeto
Crie um novo projeto Web Java e chame-o de DesComVWSpringJPAHibernate. Selecione o
framework Visual Web JSF e altere seu pacote para br.com.integrator.
Aps a criao do projeto, adicione o suporte ao Spring Framework atravs do direito do mouse
sobre Libraries, em Add Library>spring-framework-2.5>Add Library. O plugin que fora
instalado possui as bibliotecas do Hibernate e do Spring, como j visto no Captulo 10.

Ateno: Caso no tenha passado pelo livro, algumas bibliotecas podem estar faltando, portanto,
confira os detalhes no captulo 10 do seu livro.

As entidades e seus relacionamentos
Como dito no Captulo Extra 5, no decorrer do livro, duas tabelas foram utilizadas para o
desenvolvimento da aplicao com Visual Web JSF. Agora, ser necessrio criar trs novas tabelas,
totalizando cinco: livros, autores, editoras, publicacao e livro_autor. As tabelas so ilustradas na
Figura 1.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

122 122

Figura 1 Modelo de dados do projeto

A Listagem1, do Captulo Extra 5, mostra o script para a criao das tabelas que sero
adicionadas.

As entidades POJO
Na Figura 2, observa-se o mapeamento de quatro objetos que relacionam-se as cinco tabelas
encontradas no banco de dados. Para cri-las pelo NetBeans, siga os passos demonstrados no
quadro Criando Entidades Persistentes no NetBeans.

Figura 2 Objetos a serem persistidos gerado por engenharia reversa do NetBeans IDE 6
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

123 123
Criando entidades persistentes no NetBeans
Siga estes passos para criar as entidades persistentes em seu projeto, para ficar em conformidade
com o visto na Figura 2:
1. Com o direito do mouse sobre o projeto, selecione New>Entity Classes from Database;
2. Na caixa de dilogo New Entity Classes from Database selecione crie um DataSource
como j fora feito no Captulo 10, em Criando a Entidade Autor;
3. Selecione todas as tabelas do banco de dados livraria na segunda etapa e avance (veja
Figura 3);
4. Na terceira etapa, altere o nome das classes em Class Name para o singular, seguindo o
padro de desenvolvimento. Altere o pacote digitando br.com.integrator.entities;
5. Clique no boto Create Persistence Unit e mantenha o Hibernate, dando um nome de
livraria na Persistence Unit. Confirme tudo.



Figura 3 Selecionando as tabelas para criar as entidades persistentes


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

124 124

Figura 4 Criao das entidades e seu pacote


Ateno: Procure no se confundir neste captulo. Se estiver falando do Captulo 10, significa que
a explicao est neste lugar. O mesmo vale para o Captulo 8 e Extra 5. Este captulo uma
mistura de ambos, onde no 8 e Extra 5 temos o layout proposto e no 10 a integrao com Spring,
Hibernate e JPA.

Alterandoasentidades
Embora o trabalho mais difcil seja feito pelo NetBeans IDE, altere as entidades criadas para como
mostrado nas Listagens de 1 a 5, a seguir, onde sero omitidos as anotaes @NamedQueries e os
mtodos getters e setters:

Listagem1. O cdigo da entidade Usuario
@Entity
@Table(name = "usuarios")
public class Usuario implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "id", nullable = false)
private Integer id;

@Column(name = "usuario")
private String usuario;

@Column(name = "senha")
private String senha;

//getters e setters omitidos


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

125 125
Listagem2. O cdigo da entidade Livro
@Entity
@Table(name = "livros")
public class Livro implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;

@Column(name = "titulo")
private String titulo;

@Column(name = "edicao")
private Integer edicao;

@Column(name = "publicacao")
private Integer publicacao;

@Column(name = "descricao")
private String descricao;

@Column(name = "imagem")
private String imagem;

@OneToMany(mappedBy = "livro", fetch = FetchType.LAZY)
private Collection<Publicacao> publicacoes;

@ManyToMany(fetch=FetchType.LAZY, mappedBy = "livros")
private Set<Autor> autores;

//getters e setters omitidos



Listagem3. O cdigo da entidade Autor
@Entity
@Table(name = "autores")
public class Autor implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;

@Column(name = "nome")
private String nome;

@Column(name = "email")
private String email;

@Column(name = "nascimento")
@Temporal(TemporalType.DATE)
private Date nascimento;

@ManyToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinTable(name="livro_autor",
joinColumns=@JoinColumn(name="autor_id"),
inverseJoinColumns=@JoinColumn(name="livro_id"))
private Set<Livro> livros;

//getters e setters omitidos





Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

126 126
Listagem4. O cdigo da entidade Editora
@Entity
@Table(name = "editoras")
public class Editora implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;

@Column(name = "editora")
private String editora;

@OneToMany(mappedBy = "editora", fetch = FetchType.LAZY)
private Collection<Publicacao> publicacoes;

//getters e setters omitidos



Listagem5. O cdigo da entidade Publicacao
@Entity
@Table(name = "publicacao")
public class Publicacao implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;

@JoinColumn(name = "editora_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.EAGER)
private Editora editora;

@JoinColumn(name = "livro_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.EAGER)
private Livro livro;

//getters e setters omitidos


Mapeamentoobjetossimples
O mapeamento mais simples, onde um objeto tem apenas tipos de dados bsicos, que se entende por
tipos bsicos aqueles que possuem um correspondente na SQL, ou seja, o tipo String em Java
considerado os de campos de texto em seu correspondente SQL.

Mapeamentodeobjetoscomcoleodeobjetos
Esse mapeamento usado quando um objeto possui um conjunto de outros objetos. Para entend-lo,
observe que temos na entidade Livro, uma coleo de publicacoes, por exemplo, que armazenar o
conjunto de publicaes.
Em sua classe relacionada, atravs da entidade Publicacao, temos o atributo livro, que
simplesmente relaciona um livro a sua publicao, enquanto que publicacoes, de Livro,
referencia a classe Publicacao. Isso indica que podemos ter muitas publicaes de um determinado
livro. Ou melhor explicando, cada livro lanado pode ter sua determinada publicao e sua excluso
no afeta ao fato de existir um livro. Estes relacionamentos so:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

127 127
One-To-Many (Um-Para-Muitos) relacionamento da tabela livros (entidade Livro) para a
tabela publicacoes (entidade Publicacao). Para este relacionamento utilizamos a anotao
@OneToMany;
Many-To-One (Muitos-Para-Um) o inverso do relacionamento Um-Para-Muitos. Para
este relacionamento utilizamos a anotao @ManyToOne;

A classe Livro, no exemplo, a que possui um mapeamento do tipo Um-Para-Muitos (1-n),
atravs do atributo de coleo publicacoes. O seu mapeamento foi feito na Listagem 2 a partir da
anotao @OneToMany. Como a coleo conter objetos do tipo Publicacao, ento est classe
tambm dever ser uma classe persistente da aplicao - observe que utilizamos generics para o
tipo. Na anotao @OneToMany, existe um atributo denominado mappedBy que dever receber
como valor o nome do atributo encontrado na classe Publicacao (classe dos tipos de objetos da
coleo). Ou seja, a tabela publicacao possui uma chave estrangeira (livro_id) para a tabela
livros, que representada pelo atributo de classe livro da entidade Publicacao, utilizado pelo
atributo mappedByda anotao @OneToMany, ou seja, mappedBy=livro.
J o atributo fetchindica quando o contedo do atributo ser trazido da base de dados. Este por sua
vez, possui dois valores:

FetchType.EAGER: este valor indica que, se o objeto "pai" for trazido da base de dados, o
atributo mapeado com fetch=FetchType.EAGERfar com que o seu contedo tambm seja
trazido;
FetchType.LAZY: este atributo indica que, se o objeto "pai" for trazido da base de dados, o
atributo mapeado com fetch=FetchType.LAZY far com que o seu contedo somente seja
trazido quando acessado pela primeira vez.

Quando um relacionamento utiliza FetchType.LAZY, a consulta retorna apenas os dados referentes a
livros, de forma que se fossem necessrios os dados da coleo publicacoes, bastaria acessar o
atributo que a representa no objeto Livro.
A anotao @ManyToOnetambm possui o atributo fetch, que possui o mesmo comportamento de
@OneToMany. Com a anotao @JoinColumninformamos qual o nome da coluna que corresponde
chave estrangeira do mapeamento, o que no caso deste exemplo, seria name=livro_id. O atributo
referencedColumnName indica a coluna referenciada na tabela pai do banco de dados, que no
caso em livros, seria o campo id.
J para o caso da tabela livro_autor, h um relacionamento Muitos-Para-Muitos. As das entidades
Livro e Autor, ilustradas nas Listagens 2 e 3, respectivamente, possuem mapeamentos de colees
com o relacionamento Muitos-Para-Muitos (n-n), que feito a partir da anotao @ManyToMany.
O uso da anotao @JoinTable tambm se faz necessrio para informar o nome da tabela
intermediria entre as entidades. Esta anotao possui o atributo name que informa o nome da
tabela intermediria que representa o mapeamento Muitos-Para-Muitos, no caso, a tabela
livro_autor. O atributo joinColumns recebe como valor uma anotao @JoinColumn, informando o
nome da coluna na tabela intermediria, que representa a classe onde est o mapeamento Muitos-
Para-Muitos. No atributo inverseJoinColumns informado qual a coluna que representa a outra
entidade no relacionamento.
Na entidade Livro, para no haver a repetio das anotaes utilizadas em Autor, basta adicionar o
atributo mappedByem @ManyToMany, ficando mappedBy=livros. Isso indica que na classe Autor
h um atributo chamado livros que contm a informao mapeada. Esta condio tambm indica
que Livro seria o lado fraco do relacionamento.
O uso de Set para o tipo dos atributos livros e autores para que no haja repeties. Nossa
inteno trabalhar da seguinte forma:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

128 128
Voc pode ter muitos autores para um livro, na tabela livro_autor, mas s ter um livro para cada
autor, em outras palavras, um livro pode ter sido escrito por muitos autores, mas estes no se
repetem para cada livro, como: Edson Gonalves, Edson Gonalves escreveu Desenvolvendo
aplicaes Web com NetBeans 6, ou seja, houve uma repetio desnecessria de dados que o
Hibernate ignorar.

Utilizando o DAO genrico para criar outros
No Captulo 10 do livro, temos um DAO genrico que facilita o desenvolvimento de outros sem
esforo adicional e repetio de cdigo. Tanto a interface BaseDao como a classe que a
implementa, BaseDaoImp, tero um mtodo adicional, como mostrado nas Listagens 6 e 7.

Listagem6. A interface BaseDaoalterada
...
public interface BaseDao<T, ID> {

//..omitido por no haver alterao

public abstract Query pesq(String query);

}


Listagem7. A classe BaseDaoImpalterada
...
public class BaseDaoImp<T, ID> implements BaseDao<T, ID> {

//..omitido por no haver alterao

public Query pesq(String query) {
return getEntityManager().createQuery(query);
}

}

Este mtodo adicionado permitir a execuo de queries personalizadas, para os casos em que
iremos utilizar mais de uma entidade.
OsDAOs
Como definido no Captulo 10 do livro, temos que criar os DAOs para trabalhar com as entidades
desenvolvidas, estendendo a base. As Listagens de 8 a 17 mostram os DAOs que sero usados
neste captulo.

Listagem8. A interface EditoraDao
package br.com.integrator.dao;

import br.com.integrator.entities.Editora;

public interface EditoraDao extends BaseDao<Editora, Integer>{

}


Listagem9. A classe EditoraDaoImp
package br.com.integrator.dao;

import br.com.integrator.entities.Editora;

public class EditoraDaoImp extends BaseDaoImp<Editora, Integer> implements EditoraDao {

}
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

129 129
Listagem10. A interface LivroDao
package br.com.integrator.dao;

import br.com.integrator.entities.Livro;

public interface LivroDao extends BaseDao<Livro, Integer>{

}


Listagem11. A classe LivroDaoImp
package br.com.integrator.dao;

import br.com.integrator.entities.Livro;

public class LivroDaoImp extends BaseDaoImp<Livro, Integer> implements LivroDao {

}


Listagem12. A interface PublicacaoDao
package br.com.integrator.dao;

import br.com.integrator.entities.Publicacao;

public interface PublicacaoDao extends BaseDao<Publicacao, Integer>{

}


Listagem13. A classe PublicacaoDaoImp
package br.com.integrator.dao;

import br.com.integrator.entities.Publicacao;

public class PublicacaoDaoImp extends BaseDaoImp<Publicacao, Integer>
implements PublicacaoDao {

}


Listagem14. A interface UsuarioDao
package br.com.integrator.dao;

import br.com.integrator.entities.Usuario;

public interface UsuarioDao extends BaseDao<Usuario, Integer>{

}


Listagem15. A classe UsuarioDaoImp
package br.com.integrator.dao;

import br.com.integrator.entities.Usuario;

public class UsuarioDaoImp extends BaseDaoImp<Usuario, Integer> implements UsuarioDao {

}






Listagem16. A classe AutorDao
package br.com.integrator.dao;

import br.com.integrator.entities.Autor;

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

130 130

public interface AutorDao extends BaseDao<Autor, Integer>{

}



Listagem17. A classe AutorDaoImp
package br.com.integrator.dao;

import br.com.integrator.entities.Autor;


public class AutorDaoImp extends BaseDaoImp<Autor, Integer> implements AutorDao {

}


Configurando o Spring
Com a criao dos DAOs, o Spring precisar ser configurado para que o acesso a dados se apie
nos recursos do framework.
Com o direito sobre WEB-INF, em Projects, v em New>Other. Na caixa de dilogo, v em
Spring Framework e selecione Spring Beans Context file. Na segunda etapa, altere para
applicationContextem File Name. Na terceira etapa do assistente, selecione o Namespace exibido
na Figura 5 e confirme.



Figura 5 Seleo do namespace do arquivo de configurao do Spring Framework.


O assistente adicionar automaticamente o Namespace utilizado pelo Spring em seu arquivo de
configurao. Resta configurar os beans que sero utilizados para que o Spring possa gerir as
transaes e inform-lo da classe que ser usada para a injeo de dependncias.
Para a execuo em ambientes Java EE, utilizamos a factory
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean:

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="livraria" />
</bean>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

131 131
Com a propriedade de LocalContainerEntityManagerFactoryBean especificamos o nome da
persistence unit do arquivo persistence.xml. Veja outros detalhes no Captulo 10.
JpaTransactionManager precisa de qualquer implementao de
javax.persistence.EntityManagerFactory para colaborar com EntityManager produzido pela fabrica,
para conduzir transaes. O JpaTransactionManager recomendado para aplicaes que utilizam
apenas uma EntityManager.
Para que no tenhamos que fazer injeo de dependncia do EntityManager em todos os nossos
DAOs, utilizamos a classe
org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor, que procura todas
as classes anotadas com @PersistenceContexte faz a injeo de dependncia automaticamente:


<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


A Listagem 18 exibe o arquivo de configurao do Spring que ser utilizado pela aplicao.

Listagem18. Configurao do arquivo applicationContext.xml.
<beans ...

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="livraria" />
</bean>

<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven />


<bean id="autorDao" class="br.com.integrator.dao.AutorDaoImp" />
<bean id="editoraDao" class="br.com.integrator.dao.EditoraDaoImp" />
<bean id="usuarioDao" class="br.com.integrator.dao.UsuarioDaoImp" />
<bean id="publicacaoDao" class="br.com.integrator.dao.PublicacaoDaoImp" />
<bean id="livroDao" class="br.com.integrator.dao.LivroDaoImp" />
</beans>


Para iniciar o Spring com a aplicao, o arquivo applicationContext.xml dever ser registrado por
um listener em web.xml:

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

Para trabalhar com a JPA, o Spring tambm fornece mais configuraes. Ao trabalhar com
relacionamentos para outras entidades, importante entender que; como estamos trabalhando com o
Hibernate, em alguns casos voc utilizou a estratgia Lazy. Quando a aplicao termina de ler os
dados desta estratgia, a sesso fechada, lanando uma exceo do tipo LazyInitializationException.
Isso significa que temos de deixar a sesso do Hibernate aberta ou inicializar todos os
relacionamentos antes de renderizar a pgina. Evidentemente que, este tipo de situao por si s,
causaria um problema de performance. Para evit-la, no Hibernate, utilizamos um padro chamado
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

132 132
de "Open Session in View". Quando um servidor web recebe uma requisio, esta
automaticamente filtrada pelo Interceptador/Filtro, podendo executar qualquer cdigo antes e
depois da mesma.
Embora o exemplo deste artigo no trate de relacionamentos, muito menos sobre a estratgia Lazy,
importante comentar que, no uso de JPA, teramos que criar um padro semelhante para
EntityManager
2
. O Spring possui um filtro que trabalha sobre este conceito, criando um padro
"Open EntityManager in View", que deve ser configurado em web.xml, conforme o trecho
mostrado:


<filter>
<filter-name>openEntityManager</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>


Para este captulo, iremos utilizar o Filtro, como exemplo, onde na Listagem 19 exibida toda a
configurao que deve ser adicionada em web.xml.

Listagem19. Configurando o Spring Frameworkem web.xml.
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<filter>
<filter-name>openEntityManager</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>openEntityManager</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


Criando um teste unitrio
Para verificar se est funcionando os DAOs criados, uma boa prtica desenvolver um teste sobre
as classes criadas.
No Captulo 4 voc viu como fazer um teste unitrio para uma classe que utilizava acesso a dados
via JDBC. Neste captulo, ser um exemplo de como fazer testes usando o Spring Framework. Para
executar este teste, vamos utilizar os recursos do Spring Framework na verso 2.5. Mas para isso,
teremos que adicionar duas bibliotecas JARs: junit-4.4.jar e spring-teste.jar. Ambos os arquivos
existem no download da biblioteca Spring com suas dependncias.

2
A interface EntityManager responsvel pelas operaes de persistncia no EJB 3.0 e gerncia de entidades
persistentes (Entidades).
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

133 133
Clique com o direito sobre Test Libraries, em seu projeto, e selecione no menu de contexto o item
Add JAR/Folder. Selecione as duas bibliotecas citadas e confirme. Veja onde elas ficaro, na
Figura 6.


Figura 6 Adio das bibliotecas em Test Libraries



Listagem20. Teste unitrio usando o Spring Framework
package br.com.integrator.test;


import br.com.integrator.dao.UsuarioDao;
import br.com.integrator.entities.Usuario;
import java.util.List;

import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:**/applicationContext*.xml"})
public class UsuarioDAOTest {

private UsuarioDao usuarioDao;

@Autowired
public void setUsuarioDao(UsuarioDao usuarioDao) {
this.usuarioDao = usuarioDao;
}


@Test
public void addUsuario(){
Usuario usuario = new Usuario();
usuario.setId(1);
usuario.setUsuario("integrator");
usuario.setSenha("integrator");

usuarioDao.save(usuario);

List<Usuario> users = usuarioDao.getAll("SELECT u FROM Usuario u");
assertEquals(1, users.size());
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

134 134
@Test
public void atuUsuario(){
Usuario usuario = usuarioDao.getById(1);
usuario.setUsuario("edson");

usuarioDao.update(usuario);

List<Usuario> users = usuarioDao.getAll("SELECT u FROM Usuario u");

assertEquals("edson", users.get(0).getUsuario());
}



@Test
public void excUsuario(){
Usuario usuario = usuarioDao.getById(1);

usuarioDao.delete(usuario);

List<Usuario> users = usuarioDao.getAll("SELECT u FROM Usuario u");

assertEquals(0, users.size());
}


}

A Listagem 20 exibe um teste unitrio utilizando as anotaes do Spring Framework. Embora o
NetBeans possua uma biblioteca JUnit em seu programa, infelizmente, para usar a anotao
@RunWith, foi preciso adicionar a biblioteca compatvel com a verso atual, no momento em que
este livro escrito, do Spring.
Com a anotao @ContextConfiguration voc define o nome do arquivo de configurao da
aplicao feito para o uso do Spring, definindo seu nome atravs do atributo locations (que aceita
um array para mais arquivos).
Com a anotao @Autowiredvoc tem a injeo do Spring e pode ento criar seus testes unitrios.
Os detalhes dos mtodos que podemos usar para testes podem ser vistos no Captulo 4.


Figura 7 Resultados do teste unitrio

Voc pode fazer outros testes com os demais DAOs criados.
Controlando o acesso
Temos para o caso, diversos Facades que sero usados para controlar os DAOs criados e integr-los
a sua aplicao Visual Web JSF. As Listagens a seguir mostram as classes responsveis pela lgica
de negcios, delegando chamadas camada de acesso a dados e controle transacional. Este controle
de transaes ser administrado pelo Spring, atravs da injeo nos atributos que j foram
configurados no arquivo applicationContext.xml:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

135 135

<bean id="autorDao" ...
<bean id="editoraDao" ...
<bean id="usuarioDao" ...
<bean id="publicacaoDao" ...
<bean id="livroDao" ...

Estas classes tero depois a injeo do Spring no managed bean para trabalhar com o JavaServer
Faces. Para trabalhar com a entidade Autor, recorra ao livro, que j possui o Facade AutorController,
ao qual aqui sero apenas apresentados os mtodos adicionais a classe.

Listagem 21. Mtodos adicionais da classe AutorController
//...omitido por no haver mudanas
public Autor pesquisarAutor(Long id) {
return autorDao.getById(id);
}

public List todosAutorLivro() {
return autorDao.pesq("SELECT a.id, a.nome, l.titulo " +
"FROM Autor a JOIN a.livros l").getResultList();
}


Listagem 22. O cdigo da classe UsuarioController
package br.com.integrator.controller;

import java.util.List;
import br.com.integrator.dao.BaseDao;
import br.com.integrator.entities.Usuario;
import javax.persistence.Query;

public class UsuarioController {

/**
* Injetado pelo Spring
* @param usuarioDao
*/
private BaseDao<Usuario, Integer> usuarioDao;

public BaseDao<Usuario, Integer> getUsuarioDao() {
return usuarioDao;
}

public void setUsuarioDao(BaseDao<Usuario, Integer> UsuarioDao) {
this.usuarioDao = UsuarioDao;
}

public void atualizar(Usuario Usuario) {
usuarioDao.update(Usuario);
}

public void salvar(Usuario Usuario) {
usuarioDao.save(Usuario);
}

public void excluir(Usuario Usuario) {
usuarioDao.delete(Usuario);
}

public List todos() {
return usuarioDao.getAll("SELECT u FROM Usuario u");
}

public Usuario pesquisar(String usuario){
Query q = usuarioDao.pesq("SELECT u FROM Usuario u WHERE u.usuario=?1");
return (Usuario) q.setParameter(1, usuario).getSingleResult();
}

}
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

136 136
Listagem23. O cdigo da classe EditoraController
package br.com.integrator.controller;

import java.util.List;
import br.com.integrator.dao.BaseDao;
import br.com.integrator.entities.Editora;

public class EditoraController {

/**
* Injetado pelo Spring
* @param editoraDao
*/
private BaseDao<Editora, Integer> editoraDao;

public BaseDao<Editora, Integer> getEditoraDao() {
return editoraDao;
}

public void setEditoraDao(BaseDao<Editora, Integer> EditoraDao) {
this.editoraDao = EditoraDao;
}

public void atualizar(Editora Editora) {
editoraDao.update(Editora);
}

public void salvar(Editora Editora) {
editoraDao.save(Editora);
}

public void excluir(Editora Editora) {
editoraDao.delete(Editora);
}

public List todos() {
return editoraDao.getAll("SELECT e FROM Editora e");
}
}


Listagem24. O cdigo da classe LivroController
package br.com.integrator.controller;

import java.util.List;
import br.com.integrator.dao.BaseDao;
import br.com.integrator.entities.Livro;
import javax.persistence.Query;

public class LivroController {

/**
* Injetado pelo Spring
* @param livroDao
*/
private BaseDao<Livro, Integer> livroDao;

public BaseDao<Livro, Integer> getLivroDao() {
return livroDao;
}

public void setLivroDao(BaseDao<Livro, Integer> LivroDao) {
this.livroDao = LivroDao;
}

public void atualizar(Livro Livro) {
livroDao.update(Livro);
}

public void salvar(Livro Livro) {
livroDao.save(Livro);
}

public void excluir(Livro Livro) {
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

137 137
livroDao.delete(Livro);
}

public List todos() {
return livroDao.getAll("SELECT l FROM Livro l");
}

public List<Livro> pesquisar(String titulo){
Query q = livroDao.pesq("SELECT l FROM Livro l WHERE l.titulo LIKE ?1");
return q.setParameter(1, "%"+titulo+"%").getResultList();

}

public Livro pesquisarLivro(Integer id) {
return livroDao.getById(id);
}

}


Listagem25. O cdigo da classe PublicacaoController
package br.com.integrator.controller;

import java.util.List;
import br.com.integrator.dao.BaseDao;
import br.com.integrator.entities.Publicacao;

public class PublicacaoController {

/**
* Injetado pelo Spring
* @param publicacaoDao
*/
private BaseDao<Publicacao, Integer> publicacaoDao;

public BaseDao<Publicacao, Integer> getPublicacaoDao() {
return publicacaoDao;
}

public void setPublicacaoDao(BaseDao<Publicacao, Integer> PublicacaoDao) {
this.publicacaoDao = PublicacaoDao;
}

public void atualizar(Publicacao Publicacao) {
publicacaoDao.update(Publicacao);
}

public void salvar(Publicacao Publicacao) {
publicacaoDao.save(Publicacao);
}

public void excluir(Publicacao Publicacao) {
publicacaoDao.delete(Publicacao);
}

public List todasPublicacoes() {
return publicacaoDao.pesq("SELECT p.id, l.titulo, e.editora FROM " +
"Publicacao p JOIN p.editora e " +
"JOIN p.livro l").getResultList();
}

public List todosLivroAutorPub() {
return publicacaoDao.pesq("SELECT p.id, l.titulo, e.editora, a.nome FROM " +
"Publicacao p JOIN p.editora e " +
"JOIN p.livro l JOIN l.autores a").getResultList();
}


}

Estas classes dispensam apresentao, uma vez que trabalham com seus respectivos DAOs para
criar os CRUDs.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

138 138
Integrando o Visual Web JSF ao Spring
Para configurar o Spring de modo que ele possibilite se integrar ao JavaServer Faces, necessrio
adicionar o elemento variable-resolver, no arquivo faces-config.xml, como fora feito no Captulo
10 o livro, para chamar a classe DelegatingVariableResolverdo framework:

<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>

A classe DelegatingVariableResolver capaz de resolver beans declarados no Spring e injet-los no
managed bean de forma transparente. Esta injeo indicada com a sintaxe #{bean nomeado no
Spring}, a mesma utilizada pelo JSF para injetar dependncias nos managed beans. Isso indica que
nosso managed bean deixa de ser responsvel por instanciar o objeto que ir utilizar e passa a
receb-lo do Spring. A Listagem26mostra os managed beans configurados em faces-config.xml.

Listagem26. Alteraes no arquivo faces-config.xml
//...omitido por no haver alteraes
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>

<managed-bean>
<managed-bean-name>UsuarioController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.UsuarioController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>usuarioDao</property-name>
<value>#{usuarioDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>LivroController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.LivroController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>livroDao</property-name>
<value>#{livroDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>EditoraController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.EditoraController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>editoraDao</property-name>
<value>#{editoraDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>AutorController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.AutorController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>autorDao</property-name>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

139 139
<value>#{autorDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>PublicacaoController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.PublicacaoController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>publicacaoDao</property-name>
<value>#{publicacaoDao}</value>
</managed-property>
</managed-bean>
...


Ateno: Para detalhes quanto ao comportamento mostrado aqui, veja o Captulo 10.

Acessando o Facade pelo Visual Web JSF
Para acessarmos as classes Facadecriadas, e seus mtodos atravs do Design do Visual Web JSF,
ser necessrio configurar a classe SessionBean1, o padro do Visual Web JSF trafegar em um
escopo de sesso.

Listagem27. Alteraes na classe SessionBean1
//...omitido por no haver alteraes por enquanto
protected LivroController getLivroController() {
return (LivroController) getBean("LivroController");
}

protected EditoraController getEditoraController() {
return (EditoraController) getBean("EditoraController");
}

protected AutorController getAutorController() {
return (AutorController) getBean("AutorController");
}

protected PublicacaoController getPublicacaoController() {
return (PublicacaoController) getBean("PublicacaoController");
}

//transporta em sesso um inteiro selecionado
private Integer id = null;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}
private Livro[] livros;

public Livro[] getLivros() {
return livros;
}

public void setLivros(Livro[] livros) {
this.livros = livros;
}

//carrega todos os livros
public void todosLivros() {
livros = (Livro[]) getLivroController().
todos().toArray(new Livro[0]);
}
private Editora[] editoras;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

140 140

public Editora[] getEditoras() {
return editoras;
}

public void setEditoras(Editora[] editoras) {
this.editoras = editoras;
}
//carrega todas as editoras
public void todasEditoras() {
editoras = (Editora[]) getEditoraController().
todos().toArray(new Editora[0]);
}


private Autor[] autores;

public Autor[] getAutores() {
return autores;
}

public void setAutores(Autor[] autores) {
this.autores = autores;
}

//carrega todos os autores
public void todosAutores() {
autores = (Autor[]) getAutorController().
todos().toArray(new Autor[0]);
}


Ateno: Termine fazendo Build no projeto, como recomendado no Captulo 10 (veja as
explicaes de como funciona no livro em caso de dvida).

Os arquivos persistence.xml e log4j.properties
Altere o arquivo persistence.xml e crie o log4j.properties como feito no livro, atravs do Captulo
10.

As pginas da aplicao
As pginas da aplicao seguiro o Layout (design, componentes, propriedades dos
componentes) mostradas nas montagens decorridas dos Captulos 7, 8 e Extra 5.

Montando sua aplicao para utilizar Spring e Hibernate com JPA
Seguindo um roteiro apresentado pelo Captulo 8, iremos gradualmente trabalhar com a aplicao
Visual Web JSF integrada com Spring e Hibernate atravs da JPA (diferente do CRUD elaborado
no Captulo 10 sobre este mesmo assunto). Crie uma pgina Visual Web JSF chamada Livros,
como feito no incio do Captulo 8 do livro.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

141 141

Figura 8 Tela inicial da pgina Livros

V at Table Layout e altere em Get Data From para livros. Deixe os campos para serem exibidos
e os configure como no Captulo 8, conforme a Figura 9.


Figura 9 Definio dos campos do componente Table

Assim como apresentado no Captulo 10, no desenvolvimento integrado com o Spring e JPA, o
Visual Web JSF pega os valores do Array livros e possibilita manipul-los visualmente.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

142 142

Por fim, adicione no mtodo prerender()a chamada ao mtodo todosLivros()de SessionBean1:

public void prerender() {
getSessionBean1().todosLivros();
}


Nota: No se preocupe com a navegao de pginas, pois esta ser feita de uma forma mais simples
para este estudo de caso.


A criao do cadastro de livros
Na rea administrativa, como feito no Captulo 8, temos o cadastro de livros, dentro do diretrio
admin. Para este caso, a primeira diferena apenas no arquivo estar no nome, que dever ser
Livros e no Livro como no primeiro exemplo. Isso necessrio para evitar problemas quanto
classe da pgina, que possui seu mesmo nome, ficando idntica a entidade Livro. Veja a Figura 10
para maior esclarecimento.


Figura 10 Layout da pgina Livros de admin

Para este caso, ser necessrio criar apenas um formulrio virtual para o link Editar. Os demais
detalhes para a elaborao do design sero os mesmos.
Para o componente Table ser executado o mesmo passo que na elaborao da pgina para exibir os
livros, com a diferena de acrescentarmos trs links.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

143 143

DetalhedapginaLivrosdeadmin
Abra a pgina Livros.jsp, de admin, e adicione uma nova coluna ao componente Table da pgina.
Esta nova coluna ter um Hyperlink como tipo de componente (Component Type). Em Header
Text digite Publicao e em Value Expression digite Gerar.
Selecione o link Gerar, e v at suas propriedades. D um clique no boto de trs pontos na
propriedade url.
Digite em URL, mantendo Use value, como mostrado a seguir:


/admin/Publicar.faces?livid=#{currentRow.value['livros.id']}&titulo=#{currentRow.value['l
ivros.titulo']}


O que ser transmitido via URL foi colorido da seguinte forma:
Em vermelho temos as variveis que sero transmitidas;
Em azul temos os valores destas variveis, que correspondem a valores das colunas do
banco de dados;
Em verde a concatenao para envio de mais de uma varivel, o que ocorre no caso.

Nota: Caso precise de detalhes visuais para entender este trecho, olhe no Captulo Extra 5.

CriandooCRUDcomapgina
Como um CRUD j foi apresentado passo a passo no Captulo 10, com suas devidas explicaes,
sero mostrados apenas os cdigos de cada elemento a seguir.

Listagem28. Criao do mtodo getLivroController()
protected LivroController getLivroController() {
return (LivroController) getBean("LivroController");
}



Listagem29. Alteraes no mtodo prerender()
public void prerender() {
//verifica se id no nulo
Integer id = getSessionBean1().getId();
if (id != null) {
//capta os Livros
Livro[] livros = getSessionBean1().getLivros();
//filtra somente o selecionado para edio
Livro livro = livros[id];

//preenche os campos do formulrio
tftitulo.setText(livro.getTitulo());
tadescricao.setText(livro.getDescricao());
imagemLivro.setUrl("/images/" + livro.getImagem());
tfedicao.setText(livro.getEdicao());
tfpublicacao.setText(livro.getPublicacao());
}

//chama o mtodo todosLivros() para refletir na tabela
getSessionBean1().todosLivros();

}



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

144 144
Listagem30. Alteraes no mtodo do link Excluir
public String excluir_action() {
try {

//captura a linha atual do link de excluso clicado
RowKey rowKey = tableRowGroup1.getRowKey();
if (rowKey != null) {

Livro[] livros = getSessionBean1().getLivros();
Integer id = Integer.parseInt(rowKey.getRowId());

//seleciona somente o livro que ser removido
Livro livro = livros[id];

//chama o controller para excluir o livro selecionado
getLivroController().excluir(livro);

//limpa o ID de SessionBean1 caso esteja com valor
getSessionBean1().setId(null);


//limpa os campos existentes
tftitulo.setText(null);
tfedicao.setText(null);
tfpublicacao.setText(null);
tadescricao.setText(null);

//informa ao administrador a excluso
info("Livro excludo!");
}


} catch (Exception ex) {

error("Erro encontrado: " + ex);
}
//retorna nulo pois no muda a pgina
return null;
}


Listagem31. Alteraes no mtodo do link Editar
public String editar_action() {

try {

// captura a linha atual do componente Table
TableRowDataProvider rowData =
(TableRowDataProvider) getBean("currentRow");

//armazena o id do livro
getSessionBean1().setId(Integer.parseInt(rowData.getTableRow().getRowId()));

} catch (Exception ex) {

error("Erro encontrado: " + ex);
}
return null;

}


Listagem32. Alteraes no mtodo do boto Salvar
public String btSalvar_action() {

String imagem = null;

//define o upload de arquivos atravs do componente File Upload
UploadedFile uploadedFile = fimagem.getUploadedFile();


if (!uploadedFile.getOriginalName().equals("")) {
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

145 145

ServletContext theApplicationsServletContext =
(ServletContext) this.getExternalContext().getContext();

//define o caminho fsico do diretrio images
String path = theApplicationsServletContext.getRealPath("/images");

//captura o nome original do arquivo
imagem = uploadedFile.getOriginalName();

//captura o tipo de arquivo
String uploadedFileType = uploadedFile.getContentType();

//verifica se o arquivo uma imagem vlida
if (uploadedFileType.equals("image/jpeg") ||
uploadedFileType.equals("image/pjpeg") ||
uploadedFileType.equals("image/gif")) {

try {

File file = new File(path + "/" + imagem);

//escreve o arquivo no diretrio determinado
uploadedFile.write(file);


} catch (Exception ex) {
error("Problema com o arquivo: " + imagem);
}

} else {
error(" aceito somente JPEG, PJPEG ou GIF.");

}
}

try {

String mensagem;
Integer id = getSessionBean1().getId();

//se no houver algo em edio
if (id == null) {

Livro livro = new Livro();

//captura os valores de cada componente no formulrio
//e os atribui a seus determinados campos no banco de dados
livro.setTitulo(tftitulo.getText().toString());
livro.setEdicao((Integer) tfedicao.getText());
livro.setPublicacao((Integer) tfpublicacao.getText());
livro.setDescricao(tadescricao.getText().toString());
livro.setImagem(imagem);
getLivroController().salvar(livro);
info("Salvo com sucesso!");

} else {

Livro[] livros = getSessionBean1().getLivros();
//seleciona somente o livro que ser editado
Livro livro = livros[id];

//caso no haja novo upload da imagem
//utiliza a antiga
if (uploadedFile.getOriginalName().equals("")) {
imagem = livro.getImagem();
}

//captura os valores de cada componente no formulrio
//e os atribui a seus determinados campos no banco de dados
livro.setTitulo(tftitulo.getText().toString());
livro.setEdicao((Integer) tfedicao.getText());
livro.setPublicacao((Integer) tfpublicacao.getText());
livro.setDescricao(tadescricao.getText().toString());
livro.setImagem(imagem);
getLivroController().atualizar(livro);
info("Atualizado com sucesso!");
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

146 146


}


//limpa os campos existentes
tftitulo.setText(null);
tfedicao.setText(null);
tfpublicacao.setText(null);
tadescricao.setText(null);

//torna nulo o valor de id
getSessionBean1().setId(null);


} catch (Exception ex) {

//informa o erro caso ocorra ao administrador
error("No foi possvel adicionar" + ex.getMessage());
}

//retorna nulo pois no muda a pgina
return null;
}

As demais pginas administrativas de cadastro simples
Agora voc criar mais duas pginas para cadastros CRUD: Editoras e Autores. Ambos seguiro
um layout similar ao da pgina de Livros, tirando o fato de no haver imagens e upload de arquivos.


Figura 11 Pgina de cadastro de Autores

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

147 147
Para a pgina de cadastro de autores, voc trabalhar com Autore getAutores(). Para o cadastro de
editoras, ser Editorae getEditoras().
Em ambos os casos, sero necessrios o uso de formulrios virtuais para a chamada de edio de
dados.



Figura 12 Pgina de cadastro de Editoras


Observao: Os cdigos das pginas Editoras e Autores sero omitidos deste captulo, uma vez
que podem ser encontrados nos arquivos fontes do projeto no livro, incluso no CD-ROM, e por
possuem semelhanas entre suas operaes.

Acessando a rea administrativa
Como feito no Captulo 8, fora do diretrio admin h uma pgina chamada Admin. Esta pgina
utilizada para se logar no sistema. Somente para relembrar, este login guardado e fica operante
atravs de um Servlet Filter, tambm criado no captulo citado.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

148 148

Figura 13 rea de entrada para a sesso administrativa


Para a elaborao deste exemplo, usamos na classe UsuarioController (Listagem 22) um mtodo
chamado de pesquisar():


public Usuario pesquisar(String usuario){
Query q = usuarioDao.pesq("SELECT u FROM Usuario u WHERE u.usuario=?1");
return (Usuario) q.setParameter(1, usuario).getSingleResult();
}


Uma caracterstica especfica, herdada do JDBC, o uso de parmetros nas queries. Com algumas
adies a query JPQL, o cdigo da query ficou u.usuario=?1, onde o nmero 1 um parmetro.
Lembra-se do parmetro ? usado em JDBC?
O mtodo setParameter()usado para transmitir o parmetro para a consulta. Como o resultado deve
ser somente uma linha, seu tipo Usuarioe o resultado gerado pelo mtodo getSingleResult().
As Listagens 33, 34 e 35 demonstram os cdigos necessrios para serem adicionados a classe
Admin.java (que acompanha a pgina Admin).


Listagem33. Criao do mtodo getUsuarioController()
protected UsuarioController getUsuarioController() {
return (UsuarioController) getBean("UsuarioController");
}


Listagem34. Alteraes no mtodo prerender()
public void prerender() {
//exibe a mensagem caso o usurio tente entrar na rea
//administrativa sem se logar
FacesContext fc = FacesContext.getCurrentInstance();

HttpSession session =
(HttpSession) fc.getExternalContext().getSession(false);

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

149 149
//captura a sesso msg
String msg = (String) session.getAttribute("msg");
//verifica se no nula
if (msg != null) {
error(msg);
} //exibe ao usurio

}


Listagem35. Alteraes no mtodo do boto Logar
public String logar_action() {

try {

//captura o login passado pelo campo usuario
Usuario u = getUsuarioController().pesquisar(tfUsuario.getText().toString());

//verifica se a senha est correta, evitando SQL Injection
if (tfSenha.getText().equals(u.getSenha())) {

//captura a sesso do contexto criado
//pelo JavaServer Faces do VW
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session =
(HttpSession) fc.getExternalContext().getSession(false);

//cria uma sesso contendo o nome de usuario chamada logado
session.setAttribute("logado", tfUsuario.getText());

//caso a sesso msg esteja com valor, a remove
if (session.getAttribute("msg") != null) {
session.removeAttribute("msg");
}

//redireciona para a rea administrativa
return "logado";

} else {
error("Senha invlida");
}


} catch (Exception ex) {
//exibe a mensagem de login ou senha invlidos
error("Login ou senha invlidos");
}
//retorna nulo em caso de erro, no direcionando a pgina alguma
return null;
}


Observando na Listagem 35, temos a chamada ao mtodo pesquisar(), de UsuarioController, que faz
a pesquisa e retorna o objeto Usuario:

Usuario u = getUsuarioController().pesquisar(tfUsuario.getText().toString());

Assim que retornado, para compar-lo a senha transmitida, temos a chamada de getSenha() de
Usuario.

if (tfSenha.getText().equals(u.getSenha())) { ...

As demais caractersticas, como criao da Sessionso similares ao usado na verso SQL.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

150 150
A pgina de publicao
Esta pgina em especial tambm possui caractersticas prprias, pois temos um componente Drop
Down List. Este componente deve ser tratado especialmente pela aplicao para que seja possvel
exibir a lista de editoras cadastradas. Diferente do caso em SQL, ao qual temos as opes visveis,
neste caso, com o uso da JPA, voc tm que criar seu preenchimento manualmente.


Figura 14 Aparncia da pgina Publicar

Na Listagem 36 voc possui o contedo que ser adicionado no mtodo init() da classe
SessionBean1.

Listagem36. Alteraes no mtodo init() da classe SessionBean1
public void init() {
// ... omitido por no ter sido alterado

//cria um list de valores recebidos do mtodo todos()
List editList = null;
editList = getEditoraController().todos();

//gera uma nova lista de opes
editoraOptions = new Option[editList.size()];
Iterator iter = editList.iterator();

//preenche a Drop Down List com os valores encontrados no banco de dados
for (int i = 0; iter.hasNext(); i++) {
Editora editora = (Editora) iter.next();
Option opt = new Option("" + editora.getId(),
editora.getEditora());
editoraOptions[i] = opt;
}

}




Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

151 151
Atravs do mtodo getEditoraController() voc gera um List com o resultado do mtodo todos(), e
cria um novo objeto Option. Este objeto inicia com o tamanho da listagem que comportar:

new Option[editList.size()];

E depois tem seus valores e rtulos preenchidos atravs de um loop que varre os dados e os separa
em um novo objeto Option:


for (int i = 0; iter.hasNext(); i++) {
Editora editora = (Editora) iter.next();
Option opt = new Option("" + editora.getId(),editora.getEditora());
editoraOptions[i] = opt;
}

Observe que o objeto Option possui um construtor com dois parmetros, recebendo no primeiro o
ID que ser transmitido e no segundo o rtulo que ser exibido ao usurio.
Separadamente voc teria dois mtodos (setValue()e setLabel()), caso no recorresse ao construtor:

Option opt = new Option();
opt.setValue(editora.getId()); //o valor que de cada item
opt.setLabel(editora.getEditora()); //o rtulo de cada item


Como no declaramos editoraOptions, v ao assistente e o crie.


Figura 15 Criando o atributo editoraOptions


Depois de criado, v at ele e gere, com o direito do mouse, no menu de contexto os mtodos get e
set, atravs de Insert Code>Getter and Setter. O resultado exibido na Figura 16.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

152 152

Figura 16 Gerao dos mtodos get e set de editoraOptions

LigandooDropDownListeditorasaeditoraOptions
Aps as alteraes, faa Build no projeto. V ao Design da pgina Publicar e clique com o direito
sobre o componente Drop Down List editoras adicionado. Selecione no menu de contexto o item
Bind to Data. Na caixa de dilogo (veja Figura 17), selecione em SessionBean1 o item
editoraOptions.


Figura 17 Seleo de editoraOptions

AdicionandocdigoaobotoPublicar
D um duplo clique no componente Button btPublicar e adicione o cdigo da Listagem 37.




Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

153 153
Listagem37. O cdigo do boto btPublicar do formulrio da pgina
public String btPublicar_action() {
try {
//prepara uma nova linha para insero de dados
Publicacao publicacao = new Publicacao();
Editora editora = new Editora();
Livro livro = new Livro();

//captura os valores de cada componente no formulrio
//e os atribui a seus determinados campos
editora.setId(Integer.parseInt(editoras.getValue().toString()));
livro.setId(Integer.parseInt(id.getText().toString()));
publicacao.setLivro(livro);
publicacao.setEditora(editora);

//grava as informaes no banco de dados
getPublicacaoController().salvar(publicacao);

//redireciona a pgina
return "pubs";

} catch (Exception e) {
error("Erro: " + e.getMessage());

}
//retorna nulo em caso de erro
return null;
}


Como ocorrido no Captulo Extra 5, voc captura os valores do campo oculto e tambm do Drop
Down List e os grava na tabela publicacao.
A diferena aqui est em como feita esta operao. Enquanto que com acesso direto a dados
necessrio apenas fazer uma referncia a tabela, aqui, o responsvel por salvar exige um objeto
Publicacao. Este objeto precisa de dois objetos: Editora e Livro. Cada um destes dois objetos
armazenar seu valor correspondente e em seguida ser envolvido pelo objeto Publicacao, atravs
de mtodos setters. Por fim, a chamada ao mtodo salvar(), de PublicacaoController, armazenar os
dados.

Adicionandocdigoapgina
Continuando no cdigo, voc dever alterar algumas partes para que possa executar certas aes
que caracterizao o seu uso. A Listagem 38 exibe o que ser alterado.


Listagem38. Alteraes do cdigo da pgina
//...omitido por no ser alterado
public void prerender() {

//captura a variavel GET titulo
this.setTitulo((String) getExternalContext().
getRequestParameterMap().get("titulo"));

}

//...omitido por no ser alterado

private String livid;

public String getLivid() {
return livid;
}

public void setLivid(String livid) {
this.livid = livid;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

154 154
}


private String titulo;

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

//...omitido por no ser alterado


No cdigo do mtodo prerender()exibido na Listagem 38, exibe um novo mtodo no utilizado at
o momento. Atravs de getExternalContext(), voc tem acesso ao mtodo
getRequestParameterMap(), que possibilita, atravs de get(), capturar o valor de uma varivel
transmitida pelo mtodo GET. Isso significa que transmitiremos uma varivel pelo cabealho HTTP
da pgina (barra de endereos) chamada de titulo. Esta varivel ser capturada e utilizada pela
pgina. Veja mais adiante a explicao do que ser transmitido.
A segunda forma de receber dados pelo mtodo GET atravs de uma pgina criada pelo Visual Web
JSF similar ao utilizado pelo JavaServer Faces, utilizando getters e setters. Como exemplo, a
varivel lividser utilizada para este fim.

ConfigurandooHiddenFieldideottulodapgina
Volte ao Design da pgina. Selecione na janela Navigator a pgina Publicar. V janela
Properties e clique no boto com trs pontos em Title.
Altere como mostrado no trecho a seguir, na caixa de dilogo Title:

Publicar livro #{admin$Publicar.titulo}

Seu exemplo dever ser similar ao da Figura 18.


Figura 18 Alterao da propriedade Title da pgina


Faa o mesmo com o campo oculto (Hidden Field) id. Selecione-o atravs da janela Navigator e na
propriedade text clique no boto de trs pontos. Em Use bind, selecione Bind to an Object e
expanda admin/Publicar. Selecione livid e confirme.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

155 155
Configurandofacesconfig.xmlparatrabalharcomGET
Para capturar um valor transmitido pelo mtodo GET no framework JavaServer Faces, utilizamos o
<managed-property />, que deve possuir em seu valor a expresso #{param.VARIAVEL}. Veja na
Listagem 39 como ficar a alterao feita no arquivo faces-config.xml:
Listagem39. Alterao em faces-config.xml para a pgina Publicar
<managed-bean>
<managed-bean-name>admin$Publicar</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicar</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>livid</property-name>
<value>#{param.livid}</value>
</managed-property>
</managed-bean>

A pgina de publicaes
Crie uma nova pgina Visual Web JSF Page chamada de Publicados. Adicione os componentes
da Figura 19 a seguir.


Figura 19 Design da pgina Publicados

Esta pgina tambm tem grandes diferenas com relao ao exemplo utilizado com SQL. Primeiro
porque precisamos retornar objetos de diferentes entidades e estes precisam ter seus nomes
reconhecidos pelo Visual Web JSF. Evidentemente, se estivssemos trabalhando com JavaServer
Faces puro, seria mais fcil.

ComoserpreenchidoocomponenteTabledapginaPublicados
O controller desenvolvido na Listagem 25 possui um mtodo chamado de todasPublicacoes(). Este
utiliza o mtodo pesq(), em que voc elabora uma query JPQL especial e determina qual seu
resultado tal como feito no caso da verificao de usurio.


public List todasPublicacoes() {
return publicacaoDao.pesq("SELECT p.id, l.titulo, e.editora FROM " +
"Publicacao p JOIN p.editora e " +
"JOIN p.livro l").getResultList();
}


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

156 156
A diferena aqui que no estamos passando um parmetro e estamos no caso recuperando um
List, atravs do mtodo getResultList().
Observando a query elaborada, temos trs campos que sero retornados de trs tabelas diferentes, o
que no caso ser trs atributos diferentes de trs entidades que partem de Publicacao:

SELECT p.id, l.titulo, e.editora
FROM Publicacao p JOIN p.editora e JOIN p.livro l

O resultado deste List, um conjunto de objetos de diferentes tipos. Somente para ilustrar, em um
componente JavaServer Faces <h:dataTable />comum, recuperaramos estes valores atravs de um
array, sendo a primeira coluna #{item[0]}, a segunda #{item[1]}e etc. Porm, ocorre que no estamos
utilizando JavaServer Faces e sim Visual Web JavaServer Faces, que utiliza um componente
diferente para renderizar uma tabela, devido a sua capacidade visual integrada ao NetBeans.

CriandoumJavaBeanespecial
Para trabalhar visualmente, com o Visual Web JSF, no componente Table, precisamos determinar
os tipos dos campos. Para fazer isso, vamos criar um bean. Crie uma nova classe no pacote
br.com.integrator (crie outro pacote se preferir). Chame esta classe de PublicacoesBean.


Listagem40. O bean PublicacoesBean
package br.com.integrator;

import java.io.Serializable;


public class PublicacoesBean implements Serializable{

private Integer id;
private String titulo;
private String editora;
private String autor;

public PublicacoesBean(Integer id, String titulo, String editora, String autor) {
this.id = id;
this.titulo = titulo;
this.editora = editora;
this.autor = autor;
}

public PublicacoesBean(Integer id, String titulo, String editora) {
this.id = id;
this.titulo = titulo;
this.editora = editora;
}

public PublicacoesBean() {
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

157 157
public String getEditora() {
return editora;
}

public void setEditora(String editora) {
this.editora = editora;
}

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

}


O bean desenvolvido possui atributos que unem informaes que viro de diversas entidades. Seu
propsito organizar o array de objetos em somente um objeto com tipos bem definidos. Isso
facilitar o seu uso pelo Visual Web.

AlterandoaclasseSessionBean1parautilizaroJavaBean
O componente Table agora precisar ter os seus dados sendo alimentados pela classe SessionBean1.
Altere a classe como mostra a Listagem 41 a seguir.


Listagem41. Alteraes na classe SessionBean1
//...omitido por no haver alteraes
private PublicacoesBean[] publicacoes;

public PublicacoesBean[] getPublicacoes() {
return publicacoes;
}

public void setPublicacoes(PublicacoesBean[] publicacoes) {
this.publicacoes = publicacoes;
}

public void todasPublicacoes() {

//cria um ArrayList para adicionar PublicacoesBean
ArrayList<PublicacoesBean> pubs = new ArrayList<PublicacoesBean>();

//pega o List retornado por todasPublicacoes()...
List todasPubs = getPublicacaoController().todasPublicacoes();

//... separa em um loop for
for (Iterator iter = todasPubs.iterator(); iter.hasNext();) {
Object[] o = (Object[]) iter.next();

//e adiciona no ArrayList os novos objetos preenchidos PublicacoesBean
pubs.add(
new PublicacoesBean((Integer) o[0], (String) o[1], (String) o[2]));
}

//depois cria um array de PublicacoesBean do ArrayList
//isso o torna acessvel pelo componente Table
publicacoes = (PublicacoesBean[]) pubs.toArray(new PublicacoesBean[0]);

}

O que ser feito bem simples. Voc est adicionando um array de PublicacoesBean. Esse array
ser preenchido com valores alimentados pelo resultado do mtodo todasPublicacoes() de
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

158 158
PublicacaoController. Como sabe, este devolve objetos, que sero separados atravs de um loop for
e depois adicionados em um ArrayListatravs de novos objetos PublicacoesBean:

for (Iterator iter = todasPubs.iterator(); iter.hasNext();) {
Object[] o = (Object[]) iter.next();
pubs.add(new PublicacoesBean((Integer) o[0], (String) o[1], (String) o[2]));
}

Por fim, este ArrayList transformado em array de objetos PublicacoesBean:

publicacoes = (PublicacoesBean[]) pubs.toArray(new PublicacoesBean[0]);

Novamente, ser necessrio o Build para depois ser reconhecido pelo Design das pginas.

AlterandoPublicados
Na classe Publicados.java(da pgina Publicados), ser necessrio adicionar no mtodo prerender()
a chamada ao mtodo todasPublicacoes()criado em SessionBean1. Esta alterao far com que seja
executado o mtodo quando a pgina for chamada, antes de ser renderizada, alimentando o
componente Table. A Listagem 42 exibe esta adio.


Listagem42. Alteraes do mtodo prerender()
public void prerender() {
getSessionBean1().todasPublicacoes();
}


Voltando ao Design, hora de adicionar as colunas ao componente Table. V em Table Layout e
selecione publicacoes em Get Data From. Selecione os campos mostrados na Figura 20 e crie
uma nova coluna. Nesta coluna, digite Excluir em Header Text e Value Expression, selecione
Hyperlink em Component Type e confirme.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

159 159

Figura 20 Table Layout do componente Table de Publicacoes

Selecione o link Excluir, do componente Table, e d a ele o id excluir em Properties. D um
duplo clique sobre este link e altere seu mtodo como mostrado na Listagem 43.


Listagem43. Alteraes em Publicacoes.java
protected PublicacaoController getPublicacaoController() {
return (PublicacaoController) getBean("PublicacaoController");
}


public String excluir_action() {
try {

//captura a linha atual do link de excluso clicado
RowKey rowKey = tableRowGroup1.getRowKey();
if (rowKey != null) {

PublicacoesBean[] pubs = getSessionBean1().getPublicacoes();
Integer id = Integer.parseInt(rowKey.getRowId());

//seleciona somente o que ser removido
PublicacoesBean pubean = pubs[id];

//cria a publicao
Publicacao publicacao = new Publicacao();

//envia o ID do que ser excludo
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

160 160
publicacao.setId(pubean.getId());

//chama o controller para excluir a editora selecionada
getPublicacaoController().excluir(publicacao);

}

//informa ao administrador a excluso
info("Publicao excluda!");

} catch (Exception ex) {
error("Erro encontrado: " + ex);
}

//retorna nulo pois no muda a pgina
return null;
}


Diferente do exemplo criado no Captulo Extra 5, neste caso, voc est possibilitando a excluso
das publicaes. Se necessrio, retorne ao Design e adicione um componente Message Group para
exibio das mensagens retornadas por uso desta operao.

Adicionando autores a livros
A pgina mostrada na Figura 21 a mesma criada no Captulo Extra 5, portanto ser omitida sua
montagem de componentes visuais.



Figura 21 Vinculando o livro aos autores


Transportandoocdigodolivro
Diferente do link Gerar, que foi transmitido via mtodo GET, o link que ser criado na pgina de
cadastro de Livros transmitir via mtodo POST, usando sesso para simplificar.
Na classe SessionBean1 temos, j pronto, um atributo chamado id, que est sendo exibido na
Listagem 44 apenas para ilustrao:
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

161 161
Listagem44. Alterao na classe SessionBean1
//... trecho j criado na Listagem 25
private Integer id;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}


AlterandoaclasseLivroAutor.java
Coloque no cdigo Java da sua pgina LivroAutore altere o mtodo prerender()(Listagem 45), crie
o atributo autorOptions (Listagem 46) e adicione uma chamada classe AutorController (Listagem
47).


Listagem45. Alteraes no mtodo prerender()
public void prerender() {
List autorList = null;
autorList = getAutorController().todos();
autorOptions = new Option[autorList.size()];
Iterator iter = autorList.iterator();

for (int i = 0; iter.hasNext(); i++) {
Autor autor = (Autor) iter.next();
Option opt = new Option("" + autor.getId(),autor.getNome());

autorOptions[i] = opt;
}

}


Listagem46. Declarao do atributo autorOptions
private Option[] autorOptions;

public Option[] getAutorOptions() {
return autorOptions;
}

public void setAutorOptions(Option[] autorOptions) {
this.autorOptions = autorOptions;
}


Listagem47. Chamando a classe AutorController
protected AutorController getAutorController() {
return (AutorController) getBean("AutorController");
}


Retorne ao design e com o direito do mouse sobre o componente Drop Down List autores,
selecione Bind to Data no menu de contexto. Na caixa de dilogo Bind to Data, expanda o item
admin/LivroAutor, na guia Bind to an Object e selecione autorOptions. Confirme a caixa de
dilogo.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

162 162

Figura 22 Seleo de autorOptions

Diferente do que fora feito na pgina Publicar, neste caso voc no colocou as opes do
componente Drop Down List na classe SessionBean1. Na realidade, nem o outro era necessrio, a
menos que voc v utilizar em outros locais, o recomendado colocar na pgina em que ir
desfrutar de seus benefcios.

AlterandoapginaLivros
Na pgina de cadastro de Livros (Livros.jsp), em admin, adicione mais uma coluna no
componente Table, mova para antes da coluna de Publicaes (veja na Figura 23).


Figura 23 Nova coluna Autor na tabela da pgina Livros


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

163 163
Selecione o link Adicionar da coluna Autor, do componente Table, e altere a propriedade id para
adicionar (Figura 24).



Figura 24 Propriedade id alterada do link Adicionar do componente Table


AdicionandocdigoaolinkAdicionar
D um duplo clique no link Adicionar, do componente Table, da pgina Livros (em admin) e
adicione o cdigo mostrado a seguir na Listagem 48:


Listagem 48. Cdigo do link Adicionar
public String adicionar_action() {
//captura a linha atual do link de adio clicado
TableRowDataProvider rowData =
(TableRowDataProvider) getBean("currentRow");

//o coloca no bean SessionBean1 para que possa transmitir
//o valor para a pgina LivroAutor
Livro[] livros = getSessionBean1().getLivros();
//seleciona somente o livro que ser transmitido
Livro livro = livros[Integer.parseInt(rowData.getTableRow().getRowId())];
//transmite para SessionBean atravs de id
getSessionBean1().setId(livro.getId());

return "adlivroautor";
}


O cdigo deste link simplesmente adicionar o ID do livro selecionado, no componente Table, a lid
de SessionBean1, no qual ir vincular o autor ao livro.


Adicionandooautoraseulivro
Voltando a pgina LivroAutor.jsp, d um duplo clique no boto Adicionar ao Livro e adicione o
cdigo da Listagem 49. Em seguida, adicione o apresentado pela Listagem 50.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

164 164
Listagem49. Cdigo do boto Adicionar ao Livro
public String btAdLivro_action() {

Integer livid = getSessionBean1().getId();

try {
Livro livro = new Livro();
Autor autor = new Autor();

//pesquisa o livro que sera adicionado em livro_autor
livro = getLivroController().pesquisarLivro(livid);

Integer autorId = Integer.parseInt(autores.getValue().toString());

//busca o Autor ao qual pertencer o livro
autor = getAutorController().pesquisarAutor(autorId);

//Adiciona autor na coleo
livro.getAutores().add(autor);

//adiciona o livro a coleo
autor.getLivros().add(livro);


//grava as informaes no banco de dados
getLivroController().salvar(livro);
getAutorController().salvar(autor);

//retorna a string autlivros
return "autlivros";

} catch (Exception e) {
error("Erro: " + e.getMessage());


}

//no vai a pgina alguma caso haja um erro
return null;

}


Listagem 50. Cdigo de getLivroController()
protected LivroController getLivroController() {
return (LivroController) getBean("LivroController");
}


O exemplo apresentado pela Listagem 49 com certeza um dos maiores problemas de quem est
iniciando no desenvolvimento com Hibernate. Como temos um relacionamento Many-To-Many, j
explicado no princpio deste captulo, implica em tomarmos certos cuidados para que no ocorram
problemas na hora de persistir os dados.
Se observar, ver que foram feitas duas pesquisas resultando em duas colees Autor e Livro. Isso
foi feito porque estamos usando um relacionamento bidirecional. Porm, vale lembrar que temos
um atributo mappedByna anotao da entidade Livro:

@ManyToMany(mappedBy = "livros")

Estamos indicando ao Hibernate que devemos ter vrios autores para um determinado livro, mas
que no haver repetio do mesmo autor para o mesmo livro. Se isso ocorrer, o Hibernate exclui a
linha e a recria.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

165 165
A maior questo a ser respondida aqui : por que estamos fazendo uma pesquisa ao invs de
simplesmente passar os valores e persisti-los?
H trs estados possveis para um objeto. O entendimento destes estados e as aes que os
modificam, so muito importantes quando nos deparamos com algum problema:

Transient O objeto est em memria, porm, no foi salvo ainda;
Persistent O objeto j est salvo, porm, em cache na EntityManager, mas pode ser que
ainda no esteja no banco de dados;
Detached O objeto j persistido no banco de dados;


Como o atributo idde Autorest anotado com @GeneratedValue, o Hibernate percebe que h um id
setado e imagina que provavelmente esse objeto j deve existir no banco de dados (ele auto-
incrementado e por deduo, no feito um select), o que o leva a gerar uma exceo ao usurio:

org.hibernate.PersistentObjectException: detached entity passed to persist:
br.com.integrator.entities.Autor

Se no existir o id, a mesma exceo ocorrer. O mtodo persist() no aceita objetos detached,
somente transient e managed. Esta exceo no ocorreria se o idno fosse @GeneratedValue,
ou se utilizarmos o mtodo find(), de EntityManager.
Bom, como estamos usando a primeira opo, resta apenas a segunda para evitar esta exceo.
Portanto, temos as duas pesquisas que resultam nos objetos que desejamos:

livro = getLivroController().pesquisarLivro(livid);
autor = getAutorController().pesquisarAutor(autorId);

Estes valores so colocados em coleo:

livro.getAutores().add(autor);
autor.getLivros().add(livro);

As mudanas feitas somente de um lado da associao no so persistidas. Isto significa que o
Hibernate tem duas representaes na memria para cada associao bidirecional, uma associao
de Autor para Livro e outra de Livro para Autor. Os dados so persistidos ento:

getLivroController().salvar(livro); //No ser salvo

getAutorController().salvar(autor); //Ser salvo

Aqui, Livro usado para salvar a representao em memria no banco de dados.

A pgina de autores publicados
A ltima pgina Visual Web JSF Page a ser criada no administrador ser AutoresPublicados. Sua
aparncia ser similar a Figura 25.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

166 166

Figura 25 Design da pgina AutoresPublicados

CriandoumJavaBeanparaAutoresPublicados
Novamente, para exibir visualmente dados vindos de mais de uma entidade, ser necessrio criar
um JavaBean, concentrando seus respectivos tipos em um s lugar. Crie uma nova classe no seu
pacote principal (br.com.integrator) e altere-a como apresentado na Listagem 51.


Listagem51. Cdigo de AutoresLivroBean
package br.com.integrator;

public class AutoresLivroBean {
private Integer id;
private String autor;
private String titulo;

public AutoresLivroBean() {
}

public AutoresLivroBean(Integer id, String autor, String titulo) {
this.id = id;
this.autor = autor;
this.titulo = titulo;
}
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}
public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

public String getTitulo() {
return titulo;
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

167 167
public void setTitulo(String titulo) {
this.titulo = titulo;
}

}
UtilizandooJavaBeanAutoresPublicados
V at a classe SessionBean1 e adicione o trecho mostrado na Listagem 52.


Listagem52. Trecho do cdigo de SessionBean1
//... omitido por no haver alteraes
private AutoresLivroBean[] autoresLivro;

public AutoresLivroBean[] getAutoresLivro() {
return autoresLivro;
}

public void setAutoresLivro(AutoresLivroBean[] autoresLivro) {
this.autoresLivro = autoresLivro;
}

public void todosAutoresLivros() {
ArrayList<AutoresLivroBean> autoresLivros = new ArrayList<AutoresLivroBean>();
List autoresPub = getAutorController().todosAutorLivro();
for (Iterator iter = autoresPub.iterator(); iter.hasNext();) {
Object[] o = (Object[]) iter.next();
autoresLivros.add(
new AutoresLivroBean((Integer) o[0], (String) o[1], (String) o[2])
);
}
autoresLivro = (AutoresLivroBean[]) autoresLivros.toArray(new AutoresLivroBean[0]);
}


Este cdigo segue a mesma regra do criado para exibir as publicaes. A diferena est no bean que
ser usado e na pesquisa executada para que o mesmo seja preenchido e colocado em um array. Em
AutorController, como foi mostrado anteriormente na Listagem 21, h um mtodo chamado de
todosAutorLivro() que retorna um List:


public List todosAutorLivro() {
return autorDao.pesq("SELECT a.id, a.nome, l.titulo " +
"FROM Autor a JOIN a.livros l").getResultList();
}


Observe a query JPQL elaborada, ao qual temos o relacionamento Many-To-Many:


SELECT a.id, a.nome, l.titulo FROM Autor a JOIN a.livros l


O resultado deste List, um conjunto de objetos de diferentes tipos, o que explica o uso de um
JavaBean novamente.

AlterandoAutoresPublicados
Na classe AutoresPublicados.java (da pgina AutoresPublicados), ser necessrio adicionar no
mtodo prerender(), como feito em exemplo anterior, na pgina Publicados, a chamada ao mtodo
todosAutoresLivros()criado em SessionBean1. A Listagem 53 exibe esta adio.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

168 168

Listagem53. Alteraes do mtodo prerender()
public void prerender() {
getSessionBean1().todosAutoresLivros();
}


Voltando ao Design, hora de adicionar as colunas ao componente Table. Altere o componente
Table como o quadro Exibindo os Autores Publicados descreve.
Exibindo os Autores Publicados
Siga estes passos para o componente Table da pgina AutoresPublicados, conforme visto na
Figura 25:
1. No Design, clique com o direito do mouse sobre o componente Table;
2. Selecione no menu de contexto o item Table Layout;
3. Ao surgir a caixa de dilogo Table Layout, selecione autoresLivro em Get Data From, na
parte superior da janela. Deixe em Selected todos os campos (veja na Figura 26);
4. Deixe a ordem dos ttulos em Header Text na seqncia: ID, Autor e Ttulo;
5. Na guia Options digite no campo Title Autores e Livros e no campo Empty Data
Message No h autores com livros cadastrados. Se desejar, marque Enable Pagination
e confirme.


Figura 26 Table Layout do componente Table de AutoresPublicados

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

169 169
Pesquisando livros na pgina principal
Exatamente como feito no livro, atravs do Captulo 8, voc ir implementar uma busca no site.
Embora iremos utilizar outra forma de acesso aos dados, muitas coisas sero semelhantes. Para
facilitar e no haver dvidas ser repetido os passos aqui.

AdicionandoCdigoaSessionBean1
A classe SessionBean1ser responsvel por captar a string de pesquisa lanada pelo Text Field que
existe no topo da pgina e transportar para a pgina Pesquisado.jsp.
Abra a SessionBean1e adicione um atributo chamado de pesquisado, e crie os mtodos getters e
setters, como mostra a Listagem 54 a seguir.


Listagem54. Alteraes na classe SessionBean1
//... omitido por no haver alteraes
private String pesquisado="";

public String getPesquisado() {
return pesquisado;
}

public void setPesquisado(String pesquisado) {
if(pesquisado==null)
pesquisado="";
this.pesquisado = pesquisado;
}


AlterandooPageFragmentresponsvelpelapesquisa
Abra o arquivo topo.jspf e d um duplo clique no boto btBuscar (ou o id que deu ao boto).
Adicione o cdigo mostrado na Listagem 55.


Listagem55. Cdigo no boto Buscar de topo.jspf
public String btBuscar_action() {

//chama pesquisado em SessionBean1 e atribui o valor
//digitado no Text Field busca
getSessionBean1().setPesquisado((String)busca.getText());

//retorna a string pesquisar para chegar a pgina Pesquisado
return "pesquisar";
}


No cdigo, observe que foi chamado da classe SessionBean1 a varivel pesquisado e transmitido
para ela o valor digitado no Text Field busca (encontrado tambm em topo.jspf).


AlterandoapginaPesquisado
Como feito no Captulo Extra 5, em Pesquisado.java, ser recebido o valor a ser pesquisado,
encontrado em SessionBean1, no qual utilizar o mtodo pesquisar() de LivroController. Em
Pesquisado, chame LivroController(Listagem 56) e depois v at o mtodo prerender()e adicione o
cdigo mostrado na Listagem 57.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

170 170
Listagem56 Chamada de LivroController na classe Pesquisado
protected LivroController getLivroController() {
return (LivroController) getBean("LivroController");
}


Listagem57 Cdigo do mtodo prerender()na classe Pesquisado
public void prerender() {
//captura o valor pesquisado
String pesquisado = getSessionBean1().getPesquisado();

//transporta para o mtodo pesquisar() de LivroController
//e atribui o resultado ao array livros
livros = (Livro[]) getLivroController().
pesquisar(pesquisado).toArray(new Livro[0]);

}


Como o mtodo prerender() chamado no incio, antes da pgina ser renderizada, o valor
pesquisado deve ser transferido para o mtodo pesquisar() de LivroController e seu resultado deve
ser atribudo a um array de objetos Livro (veja Listagem 58). Sua criao dever ser feita em
Pesquisado.java, o que no interfere no mesmo array existente em SessionBean1.


Listagem58 Criao do array livros na classe Pesquisado
private Livro[] livros;

public Livro[] getLivros() {
return livros;
}

public void setLivros(Livro[] livros) {
this.livros = livros;
}


Retornando ao Design da pgina, execute os passos existentes no quadro Alterando o
componente Table de Pesquisado.

Alterando o componente Table de Pesquisado
Siga estes passos para o componente Table da pgina Pesquisado:
1. No Design, clique com o direito do mouse sobre o componente Table;
2. Selecione no menu de contexto o item Table Layout;
3. Ao surgir a caixa de dilogo Table Layout, selecione livros (Pesquisado) em Get Data
From, na parte superior da janela. Deixe em Selected os campos mostrados na Figura 27;
4. Deixe a ordem dos ttulos em Header Text na seqncia: Ttulo, Edio, Publicao e
Imagem;
5. Na guia Options digite no campo Title Resultados da Pesquisa Realizada e no campo
Empty Data Message No foram encontrados livros no nome pesquisado. Se desejar,
marque Enable Pagination e confirme.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

171 171

Figura 27 Table Layout do componente Table de Pesquisado

Formulriosvirtuaisparaapesquisa
Um problema que este sistema de pesquisa possui o fato de estar fora de um formulrio, o que
impede de criar um formulrio virtual, j que um fragmento de pgina e no uma pgina
completa.
Para pginas que possuem formulrio, como de Contato e Admin, ao fazer uma busca um erro
ocorrer, onde haver a validao dos campos destes formulrios. Para evit-los, tanto na pgina
Contato.jsp como em Admin.jsp, voc ir adicionar o formulrio virtual manualmente, como
mostrado na Listagem 59 seguir:


Listagem59 Criao do array livros na classe Pesquisado
...
<webuijsf:form binding="#{Contato.form1}" id="form1"
virtualFormsConfig="pesquisa | | topo:btBuscar topo:busca,
...

A pgina de contato
Como estamos utilizando neste estudo de caso o Tomcat, voc deve adicionar ao projeto bibliotecas
JARs adicionais, que j esto inclusas no GlassFish. Veja no quadro Trabalhando com
JavaMail.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

172 172
Trabalhando comJavaMail
Para adicionar o JavaMail a seu projeto, quando utilizar o Tomcat, faa os seguintes passos:
1. Baixe o JavaMail no endereo http://java.sun.com/products/javamail/index.html.
2. Pegue o arquivo mail.jar e adicione ao seu projeto. De preferncia, crie uma nova
biblioteca, para utilizar em outros projetos (Figura 28).
3. Baixe um arquivo chamado JavaBeans Activation Framework.
4. Descompacte e pegue o arquivo activation.jar e coloque junto ao arquivo mail.jar.

A API JavaMail muito completa e complexa, tendo diversas utilidades, alm de somente enviar e-
mail, o que no ser abordado neste livro.



Figura 28 Criao de uma nova biblioteca no NetBeans

A navegao de pginas
Diferente do que foi feito no Captulo Extra 5, neste caso, no iremos adicionar item por item para
gerar a navegao, o que fora feito manualmente no primeiro caso. Aqui, vamos utilizar os recursos
do JavaServer Faces para minimizar o tamanho da navegao, o que fora feito anteriormente para
criar a pesquisa.
Veja o resultado final do arquivo faces-config.xml mostrado na Figura 29. Na Listagem 60 voc
tem a navegao configurada na ntegra, com destaques.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

173 173

Figura 29 Navegao do aplicativo
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

174 174
Listagem60 Navegao das pginas em faces-config.xml
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>

<managed-bean>
<managed-bean-name>UsuarioController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.UsuarioController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>usuarioDao</property-name>
<value>#{usuarioDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>LivroController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.LivroController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>livroDao</property-name>
<value>#{livroDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>EditoraController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.EditoraController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>editoraDao</property-name>
<value>#{editoraDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>AutorController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.AutorController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>autorDao</property-name>
<value>#{autorDao}</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>PublicacaoController</managed-bean-name>
<managed-bean-class>
br.com.integrator.controller.PublicacaoController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>publicacaoDao</property-name>
<value>#{publicacaoDao}</value>
</managed-property>
</managed-bean>


<managed-bean>
<managed-bean-name>SessionBean1</managed-bean-name>
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

175 175
<managed-bean-class>br.com.integrator.SessionBean1</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Page1</managed-bean-name>
<managed-bean-class>br.com.integrator.Page1</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>ApplicationBean1</managed-bean-name>
<managed-bean-class>br.com.integrator.ApplicationBean1</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>RequestBean1</managed-bean-name>
<managed-bean-class>br.com.integrator.RequestBean1</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$menu</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.menu</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>menu</managed-bean-name>
<managed-bean-class>br.com.integrator.menu</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Contato</managed-bean-name>
<managed-bean-class>br.com.integrator.Contato</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Admin</managed-bean-name>
<managed-bean-class>br.com.integrator.Admin</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>topo</managed-bean-name>
<managed-bean-class>br.com.integrator.topo</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Livros</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Livros</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>


<!--De qualquer lugar acessa as paginas-->
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>livroscads</from-outcome>
<to-view-id>/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pesquisar</from-outcome>
<to-view-id>/Pesquisado.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>contato</from-outcome>
<to-view-id>/Contato.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autores</from-outcome>
<to-view-id>/Autores.jsp</to-view-id>
</navigation-case>
</navigation-rule>



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

176 176
<!--Loga para a rea administrativa-->
<navigation-rule>
<from-view-id>/Admin.jsp</from-view-id>
<navigation-case>
<from-outcome>logado</from-outcome>
<to-view-id>/admin/Livros.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<managed-bean>
<managed-bean-name>admin$Editoras</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Editoras</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<!--Navega de qualquer lugar de /admin-->
<navigation-rule>
<from-view-id>/admin/*</from-view-id>
<navigation-case>
<from-outcome>cadliv</from-outcome>
<to-view-id>/admin/Livros.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>cadaut</from-outcome>
<to-view-id>/admin/Autores.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>caded</from-outcome>
<to-view-id>/admin/Editoras.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>pubs</from-outcome>
<to-view-id>/admin/Publicados.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/Admin.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>autlivros</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>

<managed-bean>
<managed-bean-name>admin$Autores</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Autores</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Publicados</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicados</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$Publicar</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.Publicar</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>livid</property-name>
<value>#{param.livid}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>Livros</managed-bean-name>
<managed-bean-class>br.com.integrator.Livros</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$LivroAutor</managed-bean-name>
<managed-bean-class>br.com.integrator.admin.LivroAutor</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>admin$AutoresPublicados</managed-bean-name>
<managed-bean-class>
br.com.integrator.admin.AutoresPublicados
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

177 177
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/admin/LivroAutor.jsp</from-view-id>
<navigation-case>
<from-outcome>autlivros</from-outcome>
<to-view-id>/admin/AutoresPublicados.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/admin/Livros.jsp</from-view-id>
<navigation-case>
<from-outcome>adlivroautor</from-outcome>
<to-view-id>/admin/LivroAutor.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>Pesquisado</managed-bean-name>
<managed-bean-class>br.com.integrator.Pesquisado</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>Autores</managed-bean-name>
<managed-bean-class>br.com.integrator.Autores</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>


Alterando os menus
Para melhor esclarecimento, ser mostrado nas Listagens 61 e 62 os menus da pgina principal e da
rea administrativa.

Listagem61. Os mtodos dos links do menu Principal
public String livros_action() {
// navega para os livros cadastrados
return "livroscads";
}

public String autores_action() {
// navega para os autores cadastrados
return "autores";
}

public String admin_action() {
// navega para a pgina de login para o administrador
return "admin";
}

public String contato_action() {
// navega para a pgina de contato
return "contato";
}


Listagem62. Os mtodos dos links do menu Administrativo
public String cadaut_action() {
//torna nulo o valor de id
getSessionBean1().setId(null);
return "cadaut";
}

public String cadliv_action() {
//torna nulo o valor de id
getSessionBean1().setId(null);
return "cadliv";
}

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

178 178
public String logout_action() {
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session =
(HttpSession) fc.getExternalContext().getSession(false);

//expira a sesso
session.invalidate();
return "logout";
}

public String caded_action() {
//torna nulo o valor de id
getSessionBean1().setId(null);
return "caded";
}

public String publicacoes_action() {
//torna nulo o valor de id
getSessionBean1().setId(null);
return "pubs";
}

public String autpub_action() {
//torna nulo o valor de id
getSessionBean1().setId(null);
return "autlivros";
}

Configurando um Pool para a conexo
Podemos adicionar as configuraes do arquivo persistence.xml, uma espcie de pool de
conexes para o uso com o Hibernate, ao qual melhora o desempenho de nossa aplicao. Para o
caso, ser utilizado o C3P0 (veja a Listagem 63 para mais detalhes).


<!Configurao do pool de c3p0-->
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000"/>

Oc3p0
Para configurar o c3p0, voc dever incluir a biblioteca c3p0-0.9.1.1.jar em sua aplicao. Este
arquivo, com esta verso, est junto com as bibliotecas encontradas no Spring Framework 2.5. Para
melhor compreender o que foi feito, h uma breve descrio dos novos elementos adicionados no
arquivo, listados a seguir:

hibernate.cache.provider_class - Configura a classe do provedor de cache;
hibernate.c3p0.min_size - A quantidade mnima de conexes com o banco de dados do
pool;
hibernate.c3p0.max_size - A quantidade mxima de conexes com o banco de dados do
pool;
hibernate.c3p0.timeout - O tempo mximo de durao de um comando ao banco;
hibernate.c3p0.max_statements - Nmero mximo de comandos simultneos em
execuo;
hibernate.c3p0.idle_test_period - Intervalo de tempo para que o pool teste se a conexo
continua ativa;

O resultado final de seu arquivo persistence.xml, ser similar ao da Listagem 63, mais adiante.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

179 179
Trabalhando com cache de objetos
Frameworks ORM como o Hibernate, se preocupam com o desempenho das aplicaes, ao qual
podemos contar com um esquema de cache de objetos, evitando idas desnecessrias ao banco de
dados a cada consulta semelhante. Os caches de objetos, quando bem montados, podem tornar a
aplicao ainda mais rpida do que a mesma aplicao feita com o uso direto de JDBC.
Na JPA, e com o Hibernate, h um sistema de cache automtico e no configurado de
EntityManager, ao qual conhecido como cache de primeiro nvel. O cache de primeiro nvel
um cache relacionado a uma nica sesso (EntityManager) do Hibernate, onde esse cache garante
que voc vai acessar sempre os mesmos objetos dentro da mesma. Esse cache no tem nenhuma
preocupao com performance, o seu objetivo de apenas garantir a integridade das informaes
dentro de uma mesma sesso.
Felizmente, possumos uma alternativa de ter um cache de segundo nvel, que opcional e o
que ns veremos aqui.
Para utilizar o cache de segundo nvel, voc deve levar em conta algumas consideraes, onde uma
das mais importantes que, se houverem outras aplicaes fazendo inseres e atualizaes no
mesmo banco de dados, ao qual o Hibernate est conectado, melhor nem utilizar o cache, porque
outra aplicao pode atualizar informaes que podem no ser refletidas pelo Hibernate, uma vez
que estas se encontram em cache. Um detalhe importante que sua aplicao deve ter mais
envolvimento com leituras do que com atualizaes ou inseres de dados. Do contrrio, o cache
pode at mesmo diminuir a performance da aplicao.
Como o objetivo do exemplo mostrar na prtica seu uso, vamos apenas levar em considerao que
a aplicao ser muito usada para leitura e, como foi concebido, no h nveis hierrquicos de
administradores, o que indica ser um sistema pequeno e de poucas mudanas.

Configurandoocache
O arquivo persistence.xml teve uma pequena alterao com relao ao mostrado pelo Captulo 10
do livro, adicionando agora o cache de segundo nvel com EhCache.


Listagem63. O arquivo persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="livraria">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>

<!--Configurao do Hibernate-->
<property name="hibernate.archive.autodetection"
value="class, hbm" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost/livraria" />
<property name="hibernate.connection.username"
value="edson" />
<property name="hibernate.connection.password"
value="integrator" />

<!--Configurao de Debug-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />


<!Configurao do pool de c3p0-->
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

180 180
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000"/>


</properties>
</persistence-unit>
</persistence>


OEhCache
Hibernate tem alguns mtodos teis que podem ajudar a testar e afinar seu cache. Enquanto que
EntityManager fornece um cache de primeiro nvel, podemos adicionar um segundo nvel a
aplicao. Isso possvel atravs de hibernate.cache.use_second_level_cache, voc obtm um
cache de segundo nvel.
O EhCache o framework padro de cache do Hibernate. O plugin do Spring, utilizado no projeto,
j o tem colocado em sua biblioteca. O que vamos fazer agora configur-lo.


Listagem64. O arquivo persistence.xml completo
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="livraria">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>

<!--Configurao do Hibernate-->
<property name="hibernate.archive.autodetection"
value="class, hbm" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost/livraria" />
<property name="hibernate.connection.username"
value="edson" />
<property name="hibernate.connection.password"
value="integrator" />

<!--Configurao de Debug-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />


<!--Configurao do segundo nvel de cache-->
<property name="hibernate.cache.provider_class"
value="net.sf.ehcache.hibernate.EhCacheProvider" />

<property name="hibernate.cache.provider_configuration"
value="/ehcache.xml" />

<property name="hibernate.cache.use_minimal_puts"
value="false" />
<property name="hibernate.cache.use_query_cache"
value="true" />
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.use_structured_entries"
value="true" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Livro"
value="read-write"/>

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Autor"
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

181 181
value="read-write" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Editora"
value="read-write" />

<property
name="hibernate.ejb.classcache.br.com.integrator.entities.Publicacao"
value="read-write" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Usuario"
value="read-write" />



<!Configurao do pool de c3p0-->
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000"/>


</properties>
</persistence-unit>
</persistence>

Para trabalhar com o cache, necessrio configurar o arquivo persistence.xml, conforme a
Listagem 64 completa apresenta.


<!--Configurao do segundo nvel de cache-->
<property name="hibernate.cache.provider_class"
value="net.sf.ehcache.hibernate.EhCacheProvider" />

<property name="hibernate.cache.provider_configuration"
value="/ehcache.xml" />

<property name="hibernate.cache.use_minimal_puts"
value="false" />
<property name="hibernate.cache.use_query_cache"
value="true" />
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.use_structured_entries"
value="true" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Livro"
value="read-write"/>

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Autor"
value="read-write" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Editora"
value="read-write" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Publicacao"
value="read-write" />

<property name="hibernate.ejb.classcache.br.com.integrator.entities.Usuario"
value="read-write" />



Para habilitar o cache na aplicao, necessrio escolher uma implementao da interface
CacheProvider e adicion-la a configurao do Hibernate. A implementao usada
EhCacheProvider, uma implementao no-clusterizvel(no deve ser utilizada em um ambiente de
cluster) da interface CacheProviderpara o Hibernate. Isso indicado na seguinte linha:

<property name="hibernate.cache.provider_class"
value="net.sf.ehcache.hibernate.EhCacheProvider" />

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

182 182
O segundo nvel de cache no projeto
Para configurar as propriedades do cache para a aplicao, necessrio adicionar o arquivo
ehcache.xml no classpath da aplicao (veja a Figura 30). Crie o arquivo da Listagem 65:

Listagem65. O arquivo ehcache.xml completo
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>

<cache name="br.com.integrator.entities.Livro"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
<cache name="br.com.integrator.entities.Autor"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
<cache name="br.com.integrator.entities.Editora"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
<cache name="br.com.integrator.entities.Publicacao"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
<cache name="br.com.integrator.entities.Usuario"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>

<cache name="br.com.integrator.entities.Autor.livros"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
<cache name="br.com.integrator.entities.Livro.autores"
maxElementsInMemory="300"
eternal="true"
overflowToDisk="false"
/>
</ehcache>


O arquivo de configurao do EhCache simples, iniciando com o primeiro elemento
<diskStore/>, que contm a localizao de onde deve ficar o arquivo que est utilizando o cache (se
algum objeto no estiver sido guardado na memria). Neste elemento, voc possui o atributo path,
que pode indicar um diretrio ou usar os seguintes valores:
user.home Este valor indica o diretrio raiz do usurio;
user.dir Este valor indica o diretrio corrente para aplicao;
java.io.tmpdir Este valor indica o diretrio temporrio pra a mquina virtual;

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

183 183
Olhando a Listagem 65, temos no elemento <cache />(que contm as informaes especficas de
cada regio de cache), o atributo name que, neste caso, possui como nome do cache o nome
completo da classe. Caso o nome do cache no seja encontrado, o cache padro ser utilizado. Este
cache tambm configurado no arquivo ehcache.xml com ao elemento <defaultCache />. Os
principais elementos utilizados so apresentados a seguir:
maxElementsInMemory Determina o nmero mximo de objetos que podem ficar
armazenados em memria;
eternal Quando configurado com o valor true, significa que o cache nunca vai expirar;
timeToIdleSeconds O tempo em segundos que um objeto pode permanecer inutilizado no
cache;
timeToLiveSeconds O tempo em segundos que um objeto pode ficar em cache;
overflowToDisk Quando configurado com o valor true e, caso o limite de objetos em
memria, seja superior ao definido pela propriedade maxElementsInMemory, as
informaes sero armazenadas em disco.


Figura 30 Destaque para a localizao do arquivo ehcache.xml


Em seguida, voc deve adicionar a anotao do cache nas entidades que deseja colocar em segundo
nvel. Para isso, altere as entidades como mostra as Listagens de 66 a 70 a seguir:

Listagem66. A entidade Autor
package br.com.integrator.entities;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "autores")
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

184 184
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Autor implements Serializable {

//... omitido por no haver alteraes

@ManyToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST})
@JoinTable(name="livro_autor",
joinColumns=@JoinColumn(name="autor_id"),
inverseJoinColumns=@JoinColumn(name="livro_id"))

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Livro> livros;

//... omitido por no haver alteraes


Listagem67. A entidade Livro
package br.com.integrator.entities;

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;


@Entity
@Table(name = "livros")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Livro implements Serializable {

//... omitido por no haver alteraes

@ManyToMany(mappedBy="livros")

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Autor> autores;

//... omitido por no haver alteraes


Listagem68. A entidade Editora
package br.com.integrator.entities;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "editoras")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Editora implements Serializable {

//... omitido por no haver alteraes



Listagem69. A entidade Publicacao
package br.com.integrator.entities;

import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "publicacao")
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

185 185
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Publicacao implements Serializable {

//... omitido por no haver alteraes



Listagem70. A entidade Usuario
package br.com.integrator.entities;

import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "usuarios")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Usuario implements Serializable {

//... omitido por no haver alteraes


Ao adicionar a anotao @Cache, de org.hibernate.annotations.Cache, voc ativa o cache para a
entidade. A anotao possui CacheConcurrencyStrategy.READ_WRITE, de
org.hibernate.annotations.CacheConcurrencyStrategy, indicando que vamos utilizar o tipo read-
write (leitura-escrita), ao qual permite a leitura e gravao de novas informaes. H outros tipos,
como READ_ONLY, para informaes que no nunca sero atualizadas. H outros valores possveis
para o atributo usage, que determina a estratgia do cache concorrente. Estes valores podem ser:
NONE, READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL. Veja mais
detalhes no quadro Detalhes da utilizao do cache no Hibernate.


Detalhes da utilizao do cache no Hibernate
Utilizar corretamente o cache pelo Hibernate determina como controlar o acesso e o comportamento
dos objetos cacheados, definidos pelo atributo usageda anotao @Cache:
READ_ONLY Utilizado quando a aplicao no atualiza as informaes, apenas a l;
READ_WRITE Deve ser utilizado quando a aplicao faz atualizaes nos objetos que esto
no cache, mas no deve ser utilizado se o nvel de isolamento das transaes for
ISOLATION_SERIALIZABLE;
NONSTRICT_READ_WRITE Utilizado quando a quantidade de atualizaes dos objetos
pequena e quando pouco provvel que duas transaes vo tentar atualizar o mesmo
objeto;
TRANSACTIONAL s pode ser utilizado em um ambiente com suporte a JTA (como um
servidor de aplicaes como o GlassFish ou Gernimo). Esse tipo de cache totalmente
transacional e pode ser utilizado com qualquer nvel de isolamento das transaes. O cache
suportado oficialmente pelo Hibernate 3.x o JBoss TreeCache;

Para sua sorte, na maioria das vezes ser utilizado os modos READ_WRITE ou
NONSTRICT_READ_WRITE, mas para o uso, recomendvel avaliar o comportamento das
transaes do seu sistema. Em vrios casos, o cache de segundo nvel no recomendado.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

186 186
ApndiceExtraB
OMySQL
MySQL um sistema de gerenciamento de banco de dados relacional, multiencadeado, de cdigo-
fonte aberto e nvel corporativo.
O MySQL foi desenvolvido por uma empresa de consultoria na Sucia chamada inicialmente de
TcX, depois, com a popularidade do MySQL, passou a se chamar MySQL AB.
Seu desenvolvimento ocorreu quando estavam precisando de um sistema de banco de dados que
fosse extremamente rpido e flexvel. Foi, assim ento, que eles criaram o MySQL, que
vagamente baseado em outro sistema de gerenciamento de banco de dados chamado de mSQL.
O MySQL rpido, flexvel e confivel. utilizado em muitos lugares por todo o mundo.
Recentemente, esta empresa foi adquirida pela Sun Microsystems.

Obs.: A propsito, parte ''AB'' do nome da companhia o acrnimo para a palavra sueca
''aktiebolag'', ou ''sociedade annima''. Ela traduzida para ''MySQL, Inc.'' De fato, MySQL Inc. e
MySQL GmbH so exemplos de subsidirias da MySQL AB. Elas esto localizadas nos EUA e
Alemanha, respectivamente.

Oqueumbancodedadosrelacional?
Um banco no mundo de cimento e tijolo o lugar onde guardamos dinheiro. Um banco de dados
tambm guarda, s que neste caso so dados.
Chamamos de dados tudo que possamos inserir no computador, nmeros, letras, caracteres, imagens
e etc.
Um banco de dados relacional uma composio de tabelas e colunas que se relacionam entre si.
Esses relacionamentos so baseados em um valor-chave que contido em cada tabela, em uma
coluna.
Instalando o banco de dados
O MySQL tem diferentes formas de instalao quando se trata de sistemas operacionais. No caso do
Windows, voc pode baixar a ltima distribuio atravs do site:

http://www.mysql.com/downloads

Instalando no Windows
Procure pelo formato executvel. O arquivo vem compactado no formato .zip.
Descompacte e instale. A instalao, como no poderia deixar de ser, feita por um assistente. Siga
os passos at a finalizao.
Caso sua mquina tenha o sistema operacional Windows pertencente a famlia NT( NT, 2000 ou
XP), o MySQL instalado como servio. Ento basta iniciar ou parar o servio, encontrado no
Painel de Controle>Ferramentas Administrativas>Servios.
Voc tambm pode utilizar o comando pelo prompt, desde que voc saiba o nome do servio do seu
MySQL:



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

187 187

Para iniciar o servio:
net start mysql


Para parar o servio:
net stop mysql

Instalando o MySQL no Linux
O MySQL Server pode ser instalado no Linux de vrias formas. A forma recomendada a que est
em formato RPM.
Voc deve baixar dois arquivos para instalar o MySQL na sua mquina. Esses arquivos so:

MySQL-server-[verso].i386.rpm para instalar o servidor mysqld no Linux
MySQL-client-[verso].i386.rpm para instalar o cliente mysql para executar os comandos no
Linux.

A instalao poder ser feita atravs do comando rpm, no Shell do seu Linux. Um exemplo seria:

Shell> rpm ivh MySQL-server-5.0.1.i386.rpm MySQL-client-5.0.1.i386.rpm

A verso RPM j vem com pr-configuraes e assim que ocorrer a instalao, para iniciar ou parar
o servidor, a seguinte sintaxe poder ser feita:

Shell>/etc/init.d/./mysql start para iniciar o servidor MySQL
Shell>/etc/init.d/./mysql stop para parar o servidor MySQL

Acessando o banco de dados MySQL
NoWindows
Se voc estiver usando o sistema operacional Windows e utilizou a instalao padro do programa,
abra o prompt de comando e digite a seqncia:

cd\mysql\bin

Lembrando que voc deve estar no drive em que o MySQL est instalado. Por padro voc o instala
no drive C.
Digitando o comando a seguir voc entra no MySQL.

mysql u root -p

Tecle ENTER e receber o pedido de senha:
password
Digite a senha que voc configurou na instalao e tecle ENTER novamente.

Nota: Verses mais modernas do MySQL para o sistema operacional Windows no necessitam de
tantos passos para iniciar, bastando ir at o atalho encontrado no menu Iniciar do sistema e no
atalho do MySQL iniciar o prompt de comando encontrado neste local.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

188 188
NoLinux
Se voc utilizou a instalao binria, em rpm (recomendado), basta abrir o terminal e digitar a
seqncia:

shell>mysql u root -p

Se j estiver logado como root, no seu sistema operacional, no h necessidade de colocar o u
root -p depois do comando mysql. Somente p caso haja uma senha.

Comandos essenciais para o uso do MySQL
Muitos so as instrues SQL para que voc venha a dominar um banco de dados. Porm, alguns
comandos so imprescindveis para que voc possa trabalhar. Estes comandos so descritos a
seguir.

OcomandoCREATE
H muitas maneiras diferentes de criar banco de dados no MySQL. Ao criar um banco de dados,
voc normalmente ter o layout inteiro pronto. Normalmente adicionaria as tabelas imediatamente
depois de criar o banco de dado, mas, teremos uma etapa por vez.
A primeira etapa para criar um banco de dados no MySQL inserir o comando CREATE
DATABASE nome_banco_de_dados da SQL (Structured Query Language) no monitor MySQL,
onde nome_banco_de_dados o nome do banco de dados que voc est criado.

No prompt de comando, no monitor do MySQL, insira o seguinte comando:

mysql> CREATE DATABASE relatorios;

Note que no foi utilizado acentuao e em casos de palavras compostas no insira espaos, se for o
caso insira sublinhado _ .

OcomandoUSE
Depois de confirmado a criao do banco de dados, voc dever utilizar o comando USE para
utilizar o banco de dados relatorios.

USE relatorios;

Um ponto importante que o MySQL no torna ativo o banco de dados que voc criou, isso deve
ser implcito.

OcomandoDROP
O comando DROP semelhante ao comando CREATE. Enquanto o ltimo cria um banco de
dados, o primeiro exclui. O comando DROP do SQL imperdovel. No h caixas de confirmao
para ver se voc tem certeza. Este comando exclui o banco de dados e tudo o que estiver nele.
s ir at o prompt de comando e no monitor do MySQL e digitar:

mysql> DROP DATABASE relatorios;

Isso excluir o banco de dados veculos e tudo o que estiver nele.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

189 189
Criandotabelas
Criar tabela no MySQL uma tarefa relativamente fcil. Para se criar uma tabela basta usar a
seqncia:

shell>mysql u root p
shell>DIGITE AQUI SUA SENHA

Aps estar no monitor do MySQL digite a seguinte seqncia:

mysql> CREATE DATABASE relatorios;

mysql> USE relatorios;

mysql> CREATE TABLE categorias (
-> CategoriaID int(11) NOT NULL auto_increment,
-> categoria varchar(40) NOT NULL,
-> descricao longtext,
-> PRIMARY KEY (CategoriaID),
-> KEY categoria (categoria)
-> ) ENGINE=InnoDB

OcomandoSHOW
Assim que criada sua primeira tabela. Para ver o resultado basta digitar a seqncia:

SHOW TABLES FROM relatorios;

Para ver as colunas que existem na sua tabela digite:

SHOW COLUMNS FROM categorias;

OcomandoDESCRIBE
Se preferir, o comando DESCRIBE faz a mesma coisa que SHOW, mostrando as colunas
existentes em sua tabela.

DESCRIBE categorias;

Ou simplesmente:
DESC categorias;

Alterando tabelas existentes
Agora que voc criou a sua tabela o que aconteceria se voc precisasse alterar algo que fez?
Confira os seguintes exemplos para alterar o nome da tabela, tipo de dados e o nome da coluna:

Alterandoonomedacoluna
Usando a clusula CHANGE voc pode alterar o nome da coluna da sua tabela:

ALTER TABLE produtos CHANGE prod_nome produto_nome VARCHAR(150);
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

190 190
Alterandootipodecoluna
O tipo pode ser alterado usando a clusula MODIFY:

ALTER TABLE categorias
MODIFY CategoriaID VARCHAR(200) NOT NULL;

Renomeandoumatabela
Renomear o nome de uma tabela, tambm se usa ALTER TABLE, mas com a clusula RENAME:

ALTER TABLE produtos RENAME tb_categorias;

Excluindo/adicionandocolunasetabelas
Como voc pode ver quando uma coluna criada ou uma tabela estas no so escritas na pedra e
podem ser alteradas facilmente. Isso tambm implica em adicionar colunas em uma tabela existente
ou exclu-la.

Eliminandotabelasecolunas
O comando DROP tambm utilizado para eliminar as colunas de uma tabela.
Para excluir uma tabela existente execute a seguinte seqncia:

DROP TABLE categorias;

Para excluir somente uma coluna execute a seguinte seqncia:

ALTER TABLE categorias DROP descricao ;

Isso excluir a coluna e todas as informaes que voc armazenou.

Adicionandocolunas
O comando ADD o responsvel pela insero de uma nova coluna.

ALTER TABLE categorias ADD descricao TEXT;

Adicionandocolunasapsoutradeterminadacoluna
O comando AFTER adiciona a nova coluna na tabela aps o nome mencionado.

ALTER TABLE categorias ADD descricao TEXT AFTER categoria;

Utilizandondices
Um ndice um arquivo estruturado que facilita o acesso a dados.
Isso significa que um ndice na coluna correta aumentar a velocidade de uma consulta
consideravelmente. Um ndice trabalha da mesma forma que pastas com separador alfabtico em
um gabinete de arquivo ele permite pular para a parte do alfabeto que voc est procurando.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

191 191
Decidindoquaiscolunasincluirnondice
Voc deve colocar um ndice na(s) coluna(s) que utilizar com mais freqncia como filtro em suas
consultas.
Os ndices tambm funcionam melhor em colunas que contm dados nicos. Essa uma das razes
pela as quais chaves so normalmente suas melhores escolhas para ndices. Essa tambm pode ser
uma das razes que as pessoas confundem chaves e ndices. Uma chave ajuda a definir a estrutura
de um banco de dados, ao passo que ndice apenas aprimora o desempenho.
Um ndice pode ser composto de uma ou mais colunas. Voc tambm pode ter mais de um ndice
em uma tabela.

Criandoumndice
Por padro, o MySQL cria um ndice se voc declara uma coluna como uma chave primria. No h
necessidade de criar um ndice nessa coluna; caso contrrio voc teria dois ndices em uma mesma
coluna.
A sintaxe para criar um ndice em uma coluna:

ALTER TABLE categorias ADD INDEX idx_cat(categoria);

Excluindondices
Excluir um ndice to simples quanto criar. A sintaxe a mesma que excluir uma coluna ou uma
tabela:

DROP INDEX nomedoindice ON nomedatabela;

Ou...

ALTER TABLE nomedatabela DROP INDEX nomedoindice;

Para alterar uma tabela eliminando uma chave primria, utilize a seguinte sintaxe:

ALTER TABLE nomedatabela DROP PRIMARY KEY;


Nota: Se voc estiver usando uma coluna com AUTO_INCREMENT, voc no excluir a chave
primria enquanto no retirar esse modificador.

Tiposdetabelas
O MySQL possui uma caracterstica um pouco diferente dos outros sistemas gerenciadores de
banco de dados, uma vez que no MySQL possvel escolher o tipo da tabela no momento da
criao. O formato de armazenamento dos dados, bem como alguns recursos do banco de dados so
dependentes do tipo de tabela escolhido.
A definio do tipo de tabela pode ser feita na criao da tabela, como voc pode ver a seguir:

CREATE TABLE teste (
id INT NOT NULL,
nome VARCHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

192 192


No comando criado, o tipo da tabela, indicado em TYPE=MyISAM, significa que voc est criando
uma tabela com o tipo MyISAM, que o padro das tabelas, caso no seja informado o TYPE. A
partir da verso 4.0.18 voc pode utilizar ENGINE como sinnimo de TYPE.
Os tipos mais comuns de tabelas criadas so o MyISAM (padro) e o InnoDB(suporta transaes):
OtipoMyISAM
Este o tipo de tabela padro do MySQL. Caso no seja informado o tipo de tabela, o MySQL
criar a tabela do tipo MyISAM. O tipo de tabela padro pode ser alterado incluindo-se no arquivo
de configurao, chamado de my.cnf (no Linux) ou my.ini (no Windows), a opo a seguir:

default-storage-engine=INNODB

As tabelas MyISAM so armazenadas em 3 arquivos, com o mesmo nome da tabela, mas com
extenses diferentes:
.FRM que armazena a definio da tabela.
.MYD que contm os dados.
.MYI contendo os ndices.
Estas tabelas so de grande desempenho para leitura, uma vez que os seus ndices so armazenados
em rvores binrias balanceadas, o que prov um ganho para o acesso s informaes. O MyISAM
no trabalha com transaes (commit ou rollback) e tambm no possui integridade referencial, isto
, ao incluir uma chave estrangeira com alguns constraints, esta servir apenas como documentao,
mas as restries no sero respeitadas pelo banco.
OtipoInnoDB
O tipo InnoDB do tipo de tabela transacional, desenvolvido pela InnoDBase Oy. A partir da
verso 4.0 do MySQL ele passa a ser parte integrante das distribuies do MySQL. O InnoDB
apresenta, alm da capacidade transacional, outros recursos que so realmente teis na utilizao de
tabelas:
Integridade referencial, com implementao dos constraints SET NULL, SET DEFAULT,
RESTRICT e CASCADE;
Ferramenta de backup on-line (ferramenta comercial, no GPL);
Lock de registro, como Oracle, DB2, etc;
Nveis de isolamento;
Armazenamentos de dados em tablespace.
Por se tratar de um tipo de tabela com recursos mais avanados, requer mais espao em memria e
disco, alm de se apresentar, em determinadas situaes, um pouco mais lento que tabelas do tipo
MyISAM. Apesar disto, o tipo InnoDB tem se mostrado extremamente rpido se comparado com
outros SGBDs transacionais.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

193 193
Alterandootipodeumatabela
Com o comando ALTER TABLE no possvel alterar o tipo da tabela, por isso, voc pode alterar
da seguinte maneira:

ALTER TABLE departamentos ENGINE=INNODB;


Tipodedados
Como a maioria dos sistemas de gerenciamento de banco de dados relacional (Relational Database
Management Systems RDBMS), o MySQL tem tipos de dados especficos de coluna.
O MySQL tem vrios tipos de dados que suportam funes diferentes. Um tipo de dados a
definio das informaes que uma coluna armazenar. Pode haver muitos tipos de dados em uma
tabela, mas cada coluna armazenar seu prprio tipo de informaes especficas.
H quatro tipos de grupos de formatos de dados. O primeiro o numrico. O segundo tipo o
formato de caractere ou string. Esse formato consiste em letras e nmeros ou qualquer coisa que
voc coloque entre aspas. O terceiro grupo formado por datas e horas. O tipo final uma forma de
miscelnea. Ele consiste em tudo que no se encaixa em quaisquer uma das outras categorias.


Tiposnumricos
Os tipos numricos destinam-se somente a nmeros. Os diferentes tipos de nmeros ocupam uma
quantidade diferente de espao na memria.
Um bom exemplo voc tentando comprar um chocolate em uma loja e ao passar no caixa a voc
descobre que deve pagar pela caixa inteira. Voc diz que no precisa de tudo, mas atacado e s e
vendido de caixa. Se voc vai utilizar 3 nmeros, por que ocupar um espao na memria como se
estivesse utilizando 100?
Lembre-se: voc s deve pagar pelo que vai usar.


Tabela B.1 - Armazenamento numrico
Nome do tipo Espao na memria
TINYINT 1 byte
SMALLINT 2 bytes
MEDIUMINT 3 bytes
INT 4 bytes
BIGINT 8 bytes
FLOAT(Inteiro,Decimal) 4 bytes
DOUBLE(Inteiro,Decimal) 8 bytes
DECIMAL(Inteiro,Decimal) O valor de bytes Inteiro + 2



Se a coluna numrica e declarada UNSIGNED, o intervalo dobra para o tipo dado. Por exemplo,
se voc declara que uma coluna que UNSIGNED TINYINT, o intervalo dessa coluna de 0 a
255. Declarando dessa forma voc faz com que essa coluna tenha somente valores positivos.



Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

194 194
Tabela B.2 -Tipos numricos
Nome do tipo Intervalo de valor Sem sinal
TINYINT -128 a 127 0 255
SMALLINT -32768 a 32767 0 65535
MEDIUMINT -8388608 a 83888607 0 - 16777215
INT -2147483648 a 2147483647 0 - 4294967295
BIGINT -9223372036854775808 a
9223372036854775807
0 - 18446744073709550615
FLOAT(Inteiro,Decimal) Varia dependendo dos valores
DOUBLE(Inteiro,Decimal) Varia dependendo dos valores
DECIMAL(Inteiro,Decimal) Varia dependendo dos valores

FLOATs, DOUBLEs e DECIMALs so tipos numricos que podem armazenar fraes. Os outros
no.
Utilize DECIMAL para nmeros realmente grandes. DECIMALs so armazenados de maneira
diferente e no tm limites.
ModificadoresAUTO_INCREMENT,UNSIGNEDeZEROFILL
Esses modificadores s podem ser utilizados com tipos de dados numricos. Eles utilizam
operaes que somente podem ser feitas com nmeros.


AUTO_INCREMENT
O modificador de coluna AUTO_INCREMENT automaticamente aumenta o valor de uma coluna
adicionando 1 ao valor mximo atual. Ele fornece um contador que timo para criar valores
nicos.
Voc tambm pode incluir um nmero. Se quiser que uma coluna AUTO_INCREMENT inicie
com 9.000, por exemplo, s declarar explicitamente um ponto inicial utilizando a seguinte sintaxe:


mysql> CREATE TABLE teste (
-> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
-> ) AUTO_INCREMENT=9000;


UNSIGNED
UNSIGNED depois de um tipo inteiro significa que ele s pode ter um zero ou valor positivo.

ZEROFILL
O modificador de coluna ZEROFILL utilizado para exibir zeros esquerda de um nmero com
base na largura de exibio.
Como todos os tipos de dados numricos tm uma largura de exibio opcional, se voc declara um
INT(8) ZEROFILL e o valor armazenado 23, ele ser exibido como 00000023.
Para isso utilize a seguinte sintaxe:

CREATE TABLE teste (id INT(4) ZEROFILL);

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

195 195
Tiposdecaractereoudedadosdestring
O outro grupo importante de tipo de dados so os tipos de strings ou de caractere.
Uma string um conjunto de caracteres. Um tipo de string pode armazenar dados como So Paulo
ou Avenida So Joo, n. 255. Qualquer valor pode ser armazenado em um tipo de dados de string.


Tabela B.3 - Tipos string
Nome de tipo Tamanho mximo Espao de armazenamento
CHAR(X) 255 bytes X bytes
VARCHAR(X) 255 bytes X + 1 byte
TINYTEXT 255 bytes X + 1 byte
TINYBLOB 255 bytes X + 2 bytes
TEXT 65.535 bytes X + 2 bytes
BLOB 65.535 bytes X + 2 bytes
MEDIUMTEXT 1,6 MB X + 3 bytes
MEDIUMBLOB 1,6 MB X + 3 bytes
LONGTEXT 4,2 GB X + 4 bytes
LONGBLOB 4,2 GB X + 4 bytes


CHAReVARCHAR
Fora todos esses tipos, os tipos VARCHAR e CHAR so os mais utilizados. A diferena entre eles
que o VARCHAR tem um comprimento varivel e o CHAR no. Os tipos CHAR so utilizados
para comprimentos fixos. Voc utilizar esse tipo quando os valores no variam muito. Se voc
declara um CHAR(10), todos os valores armazenados nessa coluna tero 10 bytes de comprimento,
mesmo se ele tiver 3 bytes de comprimento. O MySQL preenche esse valor para ajustar o tamanho
que foi declarado. O tipo VARCHAR faz o contrrio. Se voc declara um VARCHAR(10) e
armazena um valor que tem somente 3 caracteres de comprimento, a quantidade total de espao de
armazenamento de 4 bytes (o comprimento mais um).
A vantagem de utilizar os tipos CHAR que as tabelas que contm esses valores fixos so
processadas mais rapidamente que aquelas que so compostas pelo tipo VARCHAR. A
desvantagem de utilizar o tipo CHAR o espao desperdiado.
De um modo geral no se pode utilizar os dois na mesma tabela, pois quando feito o MySQL
converte automaticamente uma coluna com o tipo CHAR em VARCHAR.
A nica exceo quando voc declara uma coluna como VARCHAR(3), o MySQL converte
automaticamente em CHAR(3). Isso acontece porque valores de 4 caracteres ou menores so muito
pequenos para o tipo VARCHAR.

TEXTeBLOB
TEXT e BLOB(Binary Large Object) so tipos variveis de comprimento que podem armazenar
grandes quantidades de dados. Voc utilizar esses tipos quando quiser armazenar imagens, sons ou
grandes quantidades de textos, como pginas da Web ou documentos.
Um bom exemplo se voc estiver querendo armazenar valores de uma <TEXTAREA> de uma
sesso de comentrios em uma pgina da Web, o tipo TEXT seria uma boa escolha.
Tiposvariados
H basicamente trs tipos variados; os tipos ENUM, SET e DATE/TIME.

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

196 196
TipoENUM
O tipo ENUM uma lista ENUMerada. Significa que essa coluna pode armazenar apenas um dos
valores que esto declarados na lista dada.
Voc pode ter at 65.535 itens em sua lista enumerada. uma boa escolha para caixas de
combinao.
TipoSET
O tipo SET muito parecido com o tipo ENUM. O tipo SET, como o tipo ENUM, armazena uma
lista de valores. A diferena que no tipo SET, voc pode escolher mais de uma opo para
armazenar. Um tipo SET pode conter at 64 itens. O tipo SET uma boa escolha para opes em
uma pgina da Web em que o usurio pode escolher mais de um valor.
Tiposdedataehora(DATE/TIME)
O MySQL suporta vrios tipos de data e hora. Esses so mostrados na tabela a seguir:

Tabela B.4 - Tabela de data e hora
Tipo Intervalo Descrio
DATE 1000-01-01 a 9999-12-31 Datas. Ser exibida como YYYY-MM-DD
TIME -838:59:59 a 838:59:59 Hora. Ser exibida como HH:MM:SS
DATETIME 1000-01-01 00:00:00 a
9999-12-31 23:59:59
Data e Hora. Ser exibida como YYYY-MM-
DD HH:MM:SS
TIMESTAMP[(F)] 1970-01-01 00:00:00 Um registro de data/hora, til para relatrio de
transao. O formato de exibio depende do
formato de F.
YEAR[(2 | 4)] 70-69 (1970-2069)
1901-2155
Um ano. Voc pode especificar 2 ou 4 formatos
de dgitos. Cada um desses tem um intervalo
diferente, como mostrado.

Modificadoresadicionaisdecoluna
O MySQL tem vrias palavras-chave que modificam a maneira como uma coluna funciona.
Como vimos acima, temos AUTO_INCREMENT e ZEROFILL e como eles afetam a coluna em
que so utilizados. Alguns modificadores se aplicam apenas em colunas de um certo tipo de dado.

Tabela B.5 - Tabela de Modificadores
Nome de modificador Tipos aplicveis
AUTO_INCREMENT Todos os tipos INT
BINARY CHAR, VARCHAR
DEFAULT Todos, exceto BLOB, TEXT
NOT NULL Todos os tipos
NULL Todos os tipos
PRIMARY KEY Todos os tipos
UNIQUE Todos os tipos
UNSIGNED Tipos numricos
ZEROFILL Tipos numricos

O modificador BINARY faz com que os valores armazenados sejam tratados como strings binrias,
fazendo-os distinguir letras maisculas e minsculas. Ao classificar ou comparar essas strings, a
distino entre maisculas e minsculas ser considerada.
Por padro os tipos CHAR e VARCHAR no so armazenados como binrios.
O modificador DEFAULT permite especificar o valor de uma coluna se no existir um valor.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

197 197
Os modificadores NULL e NOT NULL especifica se na coluna deve haver um valor ou no.
Por exemplo; se voc especificar a coluna como NOT NULL voc forado a colocar um valor,
pois esse campo requerido.
PRIMARY KEY um ndice que no deve conter valores nulos (NULL). Cada tabela deve conter
uma chave primria, isso facilita uma consulta de dados. Abordarei essa questo mais adiante.
O modificador UNIQUE impe a regra que todos os dados dentro da coluna declarada devem ser
nicos, mas aceita valores nulos.


SintaxebsicadaSQL
A primeira coisa que devemos fazer quando criamos um banco de dados e depois uma tabela e
utiliz-la inserindo dados.


ComandoINSERT
O comando INSERT INTO adiciona dados em uma tabela. A sua sintaxe :

mysql> INSERT INTO departamentos (dept_nome)
-> VALUES ('Livros');

O nome da tabela em que voc ir inserir dever ser declarada logo no incio INSIRA DENTRO
nomedatabela (colunas) VALORES (valores inseridos dentro de cada coluna);
importante salientar que strings ficam entre aspas ou apstrofos e valores numricos (declarados
como tipo de dados numricos) no precisam de aspas ou apstrofos.
Para inserir mais de um valor separe-os por vrgula:

mysql> INSERT INTO nomedatabela(colunas) VALUES (valores inseridos 1),
->(valores inseridos 2),
->(e assim por diante);


ComandoSELECT
A instruo SELECT provavelmente a mais utilizada de todas as instrues de SQL. A instruo
SELECT somente retornar os dados que so armazenados no banco de dados dentro de uma tabela.
O MySQL realiza essa instruo mais rpido que qualquer outro banco de dados do mercado.
A sintaxe :

SELECT nomedacoluna FROM nomedatabela WHERE condies;

No caso do nosso banco de dados livraria:

SELECT * FROM livros; # o asterisco indica todas as colunas


AclusulaWHERE
Com a clusula WHERE voc filtra informaes de acordo com a condio passada:

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

198 198
SELECT * FROM autores WHERE id=3;

Nesse caso foi colocada uma condio que dentre todos os registros s dever aparecer os dados
ONDE a coluna id for igual 3.
A clusula WHERE especifica o critrio utilizado para selecionar linhas particulares. O nico sinal
igual utilizado para testar igualdade observe que isso diferente do Java e fcil se confundir.
Alm da igualdade, o MySQL suporta um conjunto completo de operadores e expresses regulares.
Na Tabela B.6 a seguir esto listadas as mais utilizadas por voc:


Tabela B.6 - Tabela de Operadores no MySQL
Operador Nome Exemplos Descrio
= igual autor_id = 1 Testa se os dois valores so
iguais
> maior que Quantidade > 50 Testa se um valor maior que
o outro
< menor que Quantidade < 50 Testa se um valor menor que
o outro
>= maior ou igual
a
Quantidade >= 50 Testa se um valor maior ou
igual ao outro
<= menor ou igual
a
Quantidade <= 50 Testa se um valor menor ou
igual ao outro
!= ou <> diferente de Quantidade !=0 Testa se um valor diferente
do outro
IN
cidade in (So Paulo, Minas Gerais) Testa se o valor est em um
conjunto particular
NOT IN
cidade not in (So Paulo, Minas
Gerais)
Testa se o valor no est em
um conjunto particular
IS NOT Endereo no
nulo


IS NULL Endereo
nulo
promocao is null Testa se o campo no contm
um valor
BETWEEN Quantidade
entre um valor
e outro
valor BETWEEN 200 AND 350 Testa se o campo tem valores
entre um e outro

FunesquetrabalhamcomainstruoSELECT
Vistas ao longo desse livro, sejam aplicadas ou comentadas, voc tem a explicao mais detalhada a
seguir:

LIMIT
Funo que limita resultados exibidos na tela.
SELECT * FROM tabela LIMIT 2;

Limita a visualizao de 2 linhas de dados.

SELECT * FROM tabela LIMIT 2,5;

Limita a visualizao da linha 2 a linha 5 de dados. Esta instruo foi utilizada para paginao de
dados.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

199 199
COUNT()
Conta a quantidade de linhas encontradas, de acordo com a coluna passada entre os parnteses.
Para contar uma determinada quantidade de dados em uma coluna:

SELECT COUNT(coluna) FROM tabela;

Isso no reflete a quantidade total existente na tabela, pois um valor NULL pode existir.
Para contar o total de linhas existentes em uma tabela, use:

SELECT COUNT(*) FROM tabela;

Conta quantas linhas de dados existem em todas as linhas.


Nota: Em caso de fazer a contagem em campo de valor NULL, o resultado final ser diferente.


ORDERBY
Ordena os resultados de acordo com a coluna estabelecida (crescente ou decrescente):

SELECT * FROM tabela ORDER BY coluna;
Ordena de forma crescente pela coluna dada.

ORDERBY...DESC

SELECT * FROM tabela ORDER BY coluna DESC;

Coloca os dados selecionados em ordem decrescente pela coluna.

LIKE
Usado para filtrar dados em uma coluna que armazena strings (varchar, text e etc). Sua sintaxe
como mostrada a seguir:

mysql>SELECT * FROM autores WHERE nome LIKE 'ed%';

Neste caso pode-se fazer uma busca por apenas a inicial do valor desejado.

O sinal de %(porcentagem) o caractere curinga que significa qualquer caractere.

mysql>SELECT * FROM livros WHERE nome LIKE '%dominando%';

Colocando a % no incio e no fim, com um valor no meio, possvel buscar todos os valores que
contenham a palavra dominando, seja no comeo, meio ou fim. Esta instruo foi feita para os
exemplos que utilizavam um sistema de auto-completar (caixa de sugestes).

Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

200 200
ComandoUPDATE
O comando UPDATE permite editar os valores de dados existentes. A sintaxe para modificar os
valores :

UPDATE tabela SET coluna= valor WHERE coluna=valor;

Atualiza os dados da coluna determinada em SET na condio passada em WHERE.

ComandoDELETE
A instruo DELETE muito semelhante instruo SELECT. A nica diferena em vez de
selecionar registros para visualizar, essa instruo exclui esses registros.
A instruo DELETE tem a seguinte sintaxe:

DELETE FROM tabela WHERE coluna=valor;

TrabalhandocomJunes
As junes so uma parte integrante de um banco de dados relacional. As junes permitem ao
usurio de banco de dados tirar proveito dos relacionamentos que foram desenvolvidos na fase do
projeto do banco de dados.
Uma JUNO o termo utilizado para descrever o ato em que uma ou mais tabelas so unidas
entre si para recuperar dados necessrios com base nos relacionamentos que so compartilhados
entre elas.

CriandoumajunocomINNERJOIN
A seguinte sintaxe cria uma juno:

SELECT tabela1.coluna, tabela2.coluna FROM tabela1 INNER JOIN tabela2 on
tabela1.coluna_de_valor_identico=tabela2.coluna_de_valor_identico;

INNER JOINs so provavelmente as mais comuns de todas as junes.
Uma INNER JOIN significa que todos que todos os registros que esto sem correspondncia so
descartados. Somente as linhas correspondidas sero exibidas no conjunto de resultados. Os dados
aparecem na ordem em que voc especifica.


ChavesvariadasdoMySQL
Oqueumachave?
Uma chave em uma tabela em um banco de dados fornece um meio de localizar rapidamente
informaes especficas. Embora uma chave no precise significar qualquer coisa para o usurio
humano do banco de dados, as chaves so uma parte vital da arquitetura de banco de dados e pode
influenciar significativamente o desempenho.

Comoaschavesfuncionam
Uma chave existe como uma tabela extra no banco de dados, embora pertena sua tabela pai. Ela
ocupa espao fsico no disco rgido (ou outras reas de armazenamento) do banco de dados. Pode
ser to grande quanto a tabela principal e, teoricamente, at maior.
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

201 201
Voc define a chave para se relacionar com uma ou vrias colunas em uma tabela especfica. Como
os dados em uma chave so totalmente derivados da tabela, voc pode eliminar e recriar uma chave
sem qualquer perda de dados.

Benefciosdeusarumachave
A utilizao adequada de chaves pode aprimorar significativamente o desempenho do banco de
dados. Para utilizar a analogia de um ndice de livro, considere o pouco nmero de pginas que
necessrio no ndice de um livro para dar viso rpida dos temas importantes. Compare quanto
tempo voc levaria se estivesse pesquisando pelo volume, pgina por pgina.

SuportedechavesdoMySQL
O MySQL suporta os seguintes comandos para criar chaves nas tabelas existentes:

ALTER TABLE nome_tabela ADD (KEY | INDEX) nome_do_ndice (nome_da_coluna [,...]);

ALTER TABLE nome_tabela ADD UNIQUE nome_do_ndice (nome_da_coluna[,...]);

ALTER TABLE nome_tabela ADD PRIMARY KEY nome_do_ndice (nome_da_coluna[,...]);

Observe que no MySQL, chave e ndice so sinnimos.
Esses so os formatos preferidos para adicionar chaves a tabelas existentes. Para compatibilidade
com outras implementaes de SQL, o MySQL tambm suporta os seguintes:

CREATE INDEX nome_do_ndice ON nome_tabela (nome_da_coluna[,...]);

CREATE UNIQUE INDEX [nome_do_ndice] ON nome_tabela (nome_da_coluna[,...]);

CREATE PRIMARY KEY ON nome_tabela (nome_da_coluna,...);

Voc pode definir as chaves quando cria uma tabela:

CREATE TABLE nome_da_tabela (nome_da_coluna tipo_de_campo [NULL | NOT NULL], KEY
col_index (nome_da_coluna));


Chavesprimrias(PrimaryKey)
Uma chave primria semelhante em princpio a uma chave nica, seus dados devem ser nicos,
mas a chave primria de uma tabela tem um status mais privilegiado. Apenas uma chave primria
pode existir para cada tabela e seus valores de campo nunca podem ser nulos.
Uma chave primria geralmente utilizada como um link estrutural no banco de dados, definindo o
relacionamento entre as tabelas diferentes. Sempre que quiser unir uma tabela a outra, voc deve ter
a chave primria dessa tabela.
O MySQL no requer que voc especifique que a coluna em que estiver a chave primria seja NOT
NULL(no nula) *, mas porm se tentar colocar um valor idntico na coluna chave, esta retornar
um erro que no pode haver duplicao.


Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

202 202
* Este caso somente para chaves primrias em tabelas cuja coluna selecionada seja INT ou
semelhante. Em casos de ser VARCHAR, CHAR e etc, exigida a utilizao do NOT NULL. Caso
isso no ocorra, voc ter como resultado um erro. Se desejar que seja nulo o campo, coloque uma
chave UNIQUE.

Chavesestrangeiras(ForeignKey)
As chaves estrangeiras no so atualmente suportadas no MySQL pelas tabelas do tipo MyIsam. A
mais usada e recomenda para transaes so as tabelas do tipo InnoDB.
A seguir voc tem o comando necessrio para criar uma chave estrangeira no seu banco de dados:


ALTER TABLE produtos ADD CONSTRAINT fk_categoria
FOREIGN KEY (CategoriaID) REFERENCES
categorias (CategoriaID) ON DELETE CASCADE ON UPDATE CASCADE;

Excluindoumachaveestrangeira
Para excluir uma chave estrangeira, use o comando:
ALTER TABLE produtos DROP FOREIGN KEY fk_ categoria;

AdministrandooMySQL
Um sistema de MySQL pode ter muitos usurios. O usurio root geralmente deve ser utilizado
somente para propsitos de administrao, por razes de segurana. Para cada usurio que precisar
utilizar o sistema, voc precisar configurar uma conta e senha.
No obrigatrio configurar senhas para usurios, mas recomendo que voc configure senhas para
todos os usurios que forem criados.

EntendendoosistemadeprivilgiosdoMySQL
O MySQL suporta um sofisticado sistema de privilgios. Um privilgio um direito que um usurio
tem para realizar uma ao particular em um objeto particular.
Quando voc cria um usurio no MySQL, voc concede a ele um conjunto de privilgios para
especificar o que ele pode e no pode fazer dentro do sistema.

Configurandousurios
Os comandos GRANT e REVOKE so utilizados para fornecer e retirar direitos dos usurios do
MySQL. Ele pode ser concedido nos seguintes nveis:

Global
Banco de dados
Tabela
Coluna

O comando para criar um usurio com privilgios como mostrado a seguir:

GRANT privilgios [colunas] ON item
TO nome_do_usuario [IDENTIFIED BY senha]
[WITH GRANT OPTION]
Desenvolvendo Aplicaes Web com NetBeans IDE 6

Parte integrante do livro Desenvolvendo Aplicaes Web com NetBeans IDE 6 no pode ser vendido ou distribudo separadamente

203 203

As clusulas entre colchetes so opcionais.
Para conceder privilgios ao um usurio no banco livraria, voc deve criar um usurio com os
seguintes privilgios:

mysql> grant all
-> on livraria.*
-> to edson identified by 'integrator';

Com isso voc concede todos os privilgios de manipulao do banco de dados livraria somente ao
usurio edson, com a senha integrator.


Confirmandoonovousurio
Para confirmar a criao do novo usurio, voc deve executar o comando a seguir:

flush privileges;

Revogandoprivilgios
Para revogar esse privilgio voc deve fazer o seguinte comando:

mysql> revoke all
-> on relatorios.*
-> from edson;

ObtendoinformaescomSHOW
Se voc desejar visualizar todos os privilgios que um usurio tem, execute o seguinte comando:

SHOW GRANTS FOR edson;

Para visualizar todos os usurios existentes no seu MySQL execute;

SHOW GRANTS;