Você está na página 1de 757

~l

NelBeans

EDSON G ONALVES

Desenvolvendo Aplicaes Web com


JSP, Servlets, JavaServer Faces,
Hibernate, EJB 3 Persistence e AJAX

."

. . EDITORA

'-YJ CINCIA MODERNA

Agradecimentos

Primeiramente agradeo o apoio e compreenso de minha famlia pelos


severos dias de ausncia.
Agradeo tambm ao apoio da Editora Cincia Moderna por acreditar
em mais este livro.

Sumrio

COMO A W EB TRABALHA? .................................................................. ..

Protocolos, Pedidos e Respostas .................................. ...... ........ ..


O Protocolo HTTP ...................................................................... .
O Pedido Via GET .......... .......... .............. .....................................
O Pedido Via POST ................................ .. ...................................
A Resposta HTTP ........................ .. .... ............ ....... .. ................ .. ....
Outros Protocolos .........................................................................

2
3
4
5

A LINGUAGEM JAVA ................. .. ................................... ........................


Instalando o Software de Desenvolvimento Java .........................
Fazendo Download do Java SE 5.0 JDK .....................................
A Instalao do J2SE 5.0 SDK no Windows .. ................ .............
Configurao do Kit em seu Ambiente Operacional ..............
Testando a Configurao do J2SDK .............. .........................
Em Windows verso 9x ...................... .... .......... ........ ...............
Instalando o J2SE 5.0 JDK no Linux.... ...... .... ...... .... ..............

7
8
9
10
15
17
18
18

FAZENDO F UNCIONAR O J AVA NA W EB ....................................................

23
23
24

O Torncat ......................................................................................
Servlets e JSP .. ........... ...... ........ .......... .. ............. ....... ... ........ .........

XVIII

Desenvolvendo Aplicaes Web com JSP...

Instalando o Tomcat .............................. ... .... ....... ......... ................


A Instalao do Tomcat ................................................................
No Windows ........ ................... ................. .................. ........ ......
Adicionando a Varivel CATALINA HOME ........................
No Linux ........................................................... ....... ...............
Iniciando o Tomcat ................................................ .......... .............
No Windows.. ............................. ............ .............. .......... .........
No Linux .................................................................................
Parando o Tomcat .........................................................................
No Windows ..... ........ ............................ ............... .......... ..........
No Linux .................................................................................
O Tomcat em Operao .................. .... ...................... .......... ..........

INTRODUO AOS SERVLETS ..................................................................

ESCOLHA SEU AMBIENTE DE DESENVOLVIMENTO ................ ......................

24
25
25
25
26
26
26
26
26
27
27
27

29
Porque Iniciar com Servlets? ................................ ........ ............... 29
Uma Aplicao Servlet ..... ................... .......................... ........ .. .... . 29
O Ciclo de Vida de um Servlet.. ................ ................................... 31
Rodando o Servlet no Tomcat .............................. ................ ........ 34
A Configurao do Arquivo web.xml .................. ...... ........ .......... 36
Mapeando um Servlet ...................... .................. ...... ........... ......... 36
Outras Formas de Mapear um Servlet.......................................... 37
Criando Arquivos Web Archive (WAR) ....................................... 39
Undeploy de uma Aplicao Web Usando o Tomcat 5.5 ............. 40
Deploying de uma Nova Aplicao Usando o Tomcat 5.5........... 40

O NetBeans ................. ......... ....... ............ .... ... ... .......... ..... ............
Como Obter essa IDE ........ ............ .......... .. ........ .......... ............ .....
No Linux ........................ .. ...... ... .......... ............. ........ .......... ... ... ....
Iniciando na IDE NetBeans ..........................................................
Criando seu Primeiro Projeto Web no NetBeans ........ .................
Como Desenvolver Servlets Usando o NetBeans ........................
Executando o Servlet Criado ................ .................. .......... ............
Criando um WebARchive no NetBeans ........ .... ...... ............ .........

41
41
42
44
44
45
48
52
52

Sumrio [)il] XIX

o Eclipse ......................................................................................
Obtendo a IDE. ........................................ ...... ....................... ........

53
53

No Windows ...................... ........... ....................... ......... ...........


No Linux .................................................................................

54
55

Iniciando na Platafonna Eclipse ........ ............ .............................. 55


O Workbench ........ .... . .................... ...... .... ..... ...... ..... .... .. .. ... ..... .... . 57
Criando seu Primeiro Projeto Web no Eclipse ............................. 58

Desenvolvendo Servlets Usando o Eclipse ..................................


Executando o Servlet Criado no Eclipse.. .......... ...... .. ............ ......
Criando um WebARchive no Eclipse ........................ .......... .........

64
70
72

Qual a Melhor IDE? .... ........ .. ...... .............. .... .. ............ ..............

73

A CLASSE

H TTPSERVLET ........................ ...... ........ .................. ..............

75

Criando um Servlet que Trabalha com o Mtodo POST .............


Trabalhando com o Mtodo GET ................ .......... .............. ........

75
79

Recuperando Strings de Consulta com Servlets ...........................


Enviando Caracteres Especiais em Query Strings .......................

80
82

OUTROS M TODOS MUITO TEIS DA INTERFACE HTTPS ERVLETREQUEST..

Praticando os Mtodos.... .... .......... .............. .......... ............ ...........


Varrendo um Fonnulrio .................................................... ..........

87
87
91

Recuperando os Cabealhos Enviados.........................................


Redirecionando um Acesso .......... ...................... ...... ....................

93
95

COOKIES E SESSES ...... ............ .................................. ..... ...... ...... .........

97
97
98
100
102
107
109
111
113
113

Cookies .. ................. .... ................................. .. ................... .. ..........


Criando Cookies .............. ........ .............................. .............. .........
Recuperando um Cookie ..............................................................
Sesses.........................................................................................
Tenninando uma Sesso...............................................................
Gerenciando uma Sesso..............................................................
Descobrindo a Criao e o ltimo Acesso.... ...............................
Configurando a Expirao no Arquivo web.xml..........................
Destruindo uma Sesso ...................................................... .... ......

XX lI

10

Desenvolvendo Aplicaes Web com JSP...

INTRODUO A JAVASERVER PAGES ........................................................


A Estrutura da. Pgina JavaServer Pages ......................................
Preciso Compilar uma Pgina JavaServer Pages? ........ ...............
JavaServer Pages so Servlets? ..................... .................... ...........
Como o Servlet Container Saber que Alterei o Arquivo? .... ......
A Configurao do Arquivo web.xml ..........................................
O Ciclo de Vida ............................................................................
A Estrutura do J avaServer Pages .................................................
Diretivas .......................................................................................
Diretiva Page .... ........................................................ ... .................
Desenvolvendo JSP no NetBeans 5.5 ..........................................
Desenvolvendo JSP no Eclipse 3.2 usando WTP ........................
Usando a Diretiva Page ................................................................
Diretiva Include ........ ............ .... .... ...... .... ......................................
taglib .............................................................................................
Como Compilar a taglib Criada ...................................................
O Descritor da Biblioteca de Tags (TLD - Tag Library
Descriptor) ........... ................ ........................................ ... ........
Como Utilizar essa taglib em sua Aplicao ........................... .....
Utilizando a tag Personalizada em uma Pgina JSP ....................
O Uso de Expresses...... ...... ............................ ............................

115
115
117
117
117
117
118
119
119
120
121
122
125
127
128
130

COMPARANDO lAVASERVER PAGES COM SERVLETS ...................................


Recebendo Dados Via POST ............................ .. ........................
Objetos Implcitos em JSP ....................................... ....................
request ................................... ......... .... .... ....... .............. .... ... .....
response ......... ........... .. ................................ ........ .. .... .. ......... ... .
out ..... ... ... ................................ ................... ... ................ ..........
seSSlon ....... .... .... ...... ...... .. ........... ................ .... ..... .......... ...... ....
config .............. ................... .... .... ...... ........................ ........ ... ....
application .................... .... ...... ...................................... ...........
page .. ... ... ................... .. .............. .... ....................... .... .... ... ... ... ..
pageContext ..... ... ... ...... ...... .... ........ .... .... .... ..... ........................
exception .. ............. ................................. ... .... ..........................
Enviando e Recebendo Dados Via Mtodo GET .........................
Recuperando Vrios Valores Enviados ........................................

137
137
139
139
140
140
140
140
140
141
141
141
141
143

131
133
134
135

ij

11

Sumrio [jl)

XXI

CONTROLANDO ERROS..........................................................................

Tratando os Erros .........................................................................


Outros Erros Comuns ...................................................................
Capturando Erros Usando JavaServer Pages .............................. .
Personalizando uma Pgina JSP para Exibir o Erro .....................
Capturando o Erro ...................................................................
Enviando Erros .............................................................................

12

ACTlONS.................................................................................... .... ..... .

Standard Actions ........... ............................... ................................


A Action <jsp:include /> ..............................................................
A Action <jsp:forward /> .............................................................
A Action <jsp:useBean /> ............................................................
Custom Actions ................................ ........ ....................................
JSTL Actions ....................... .............. .. .............. .. ..... .... ....... ...... ...

13

JAVABEANS ..........................................................................................

Criando seu Primeiro JavaBean ...................................................


Como Fazer esse Bean Usando o NetBeans ................................
Como Fazer esse Bean Usando o Eclipse ....................................
Um Outro Exemplo .......................................... ...... ......................
Compreendendo os JavaBeans ........................................ ...... .......
As RegTas ................................................................................
Usando as Actions <jsp:setProperty /> e <jsp:getPropert /> .......
Criando um JavaBean mais Dinmico .........................................
O Atributo Scope .................... ......................................................
Encapsulando mais de um Campo no Eclipse ..............................

14

FAZENDO U PLOAD DE ARQUIVOS ............................................................

A Biblioteca File Upload.... .................................... ......................


Fazendo upload de Arquivos Utilizando JSP e JavaBeans ..........
Para Funcionar ............ .. ......................................... ......................
Como Adicionar uma Biblioteca Usando o NetBeans .................
Como Adicionar uma Biblioteca Usando o Eclipse .....................
Segurana no Upload ............................................... ....................
Utilizando esse JavaBean .................................. :..........................

147
147
152
155
156
156
157 '
163
164
164
166
168
169
169
171
172
172
176
179
181
181
182
184
186
187
189
189
190
195
195
196
196
202

XXII !lI

15

Desenvolvendo Aplicaes Web com JSP...

TRABALHANDO COM BANCO DE DADOS ..................................................

Introduo ao JDBC .. .... .......................................... ................ .....


MySQL e o JDBC ........................................................................
A Instalao e Utilizao do MySQL .............................. .... ...... .. .
Instalando no Windows................................................................
Instalando o MySQL no Linux .............................. .... .............. .... .
Acessando o Banco de Dados MySQL ........................................
No Windows ............................................................................
No Linux .......................................... ..... ..... .. .... ........ .... ....... ....
O Comando CREATE ..................................................................
O Comando USE ..........................................................................
Criando Tabelas ............................................................................
O Comando SHOW ......................................................................
Configurando Usurios ................................................................
Confinnando o Novo Usurio ......................................................
Inserindo um Registro..................................................................
Instalando o Driver JDBC ............................................................
Utilizando um Driver JDBC no NetBeans e no Eclipse ..............
As APls JDBC ..............................................................................
O Pacote java.sql ......................................... .. ........ .................. ... ..
O javax.sql ...................................... ............. .... ... .. .......................
O Acesso ao Banco de Dados e a Conexo JDBC ... ..... ...... ....... ..
Os Tipos de Dados no Java e na SQL ..........................................
Desenvolvendo Via JDBC ................................... ... ......................
Conectando sua Pgina JSP ao Banco de Dados .........................
Inserindo Dados ...........................................................................
Entendendo os Principais Statements ............... ........ .. .......... .......
Explorando a Interface PreparedStatement ..................................
Explorando a Interface CallableStatement .......... .... .. .... .... ...........
Criando Stored Procedures no MySQL ................ ...... .. ................
Atualizando e Excluindo Valores .................................................
AAtualizao ................................... ...................... .... .... ..............
O Formulrio que ser Preenchido ... ....................... ............ ...
Pool de Conexes ... .. ............. .......... ............... ..... .........................
Configurando o Recurso JNDI JDBC ..................................... .....

205
205
206
206
206
207
208
208
208
209
209
210
210
211
211
211
212
212
212
213
213
213
215
217
217
221
225
225
226
227
230
234
234
240
240

Sumrio

16

(1[jlJ

XXIII

Trabalhando com o Aplicativo Web Admin ........ .... ..... ... .............
Baixando e Instalando o Admin ..............................................
Criando um Administrador para Acessar a Aplicao Admin ......
Como Configurar pelo Admin o JNDI .........................................
Desenvolver dessa Forma Correto? ...........................................

242
243
243
244
247

JAVASERVER PAGES EXPRESSION LANGUAGE ............................ .............. .

249
250
250
251
252
253
254
254
258
260
261

A Sintaxe ......................................................................................
LiteraIs ...................................................... ... .. ...... ... ...... ... ..... .... .. .
Operadores .......................................................... ... ....... .. .......... ...
O Operador empty ........................................................................
Converso de Tipo Automtica ....................................................
Boxing .... ...... .. ........................................... ....... ..... .... ...................
Um EL mais Dinmico .................. ........ ...................... ........... ......
A Expression Language e os JavaBeans ......................................
Palavras Reservadas .....................................................................
Desabilitando EL ..........................................................................

17

JAVASERVER PAGES STANDARD TAG LIBRARY .........................................

Instalando o JavaServer Pages Standard Tag Library ..................


JSTL no NetBeans ........................................................................
JSTL no Eclipse ............................... ...... ...... ....... ................... ......
Criando seu Primeiro Exemplo em JSTL ....................................
Entendendo o JSTL .. .... .......... .......... ............................................
A Core Tag Library ...................... .................. .. ............................
Internacionalizando e Formatando ...............................................
Para Internacionalizao ........................ ...... ...........................
Para Formatao ......................................................................
As Tags SQL ................................................................................
As Tags que Processam XML .................................................
Colocando na Prtica ...................................................................
As Actions <c:remove I>, <c:when /> e <c:if /> ....................
Actions <c:forEach I>, <c:forTokens /> .................................
A Action <c:forTokens /> ...................................... .......... .......
A Action de Captura de Erros ......................................................

265
266
266
267
268
269
269
269
270
270
270
271
271
272
274
276
278

XXIV

Desenvolvendo Aplicaes Web com JSP...


Actions Relacionadas URL ....................................................... 280
A Action <c:import I> ............................................................. 280
A Action <c:url /> ................................................................... 280
A Action <c:redirect /> ........................................................... 281
A Action <c:param /> ....................................... .......................
Internacionalizao da Aplicao .................................................
A Action <fmt:setLocale /> .....................................................
Exibindo os Textos no Idioma Definido ......................................

281
282
282
282

A Actions <fmt:bundle /> e <fmt:setBundle /> ...................... 283


A Action <fmt:message /> ...................................................... 284
Colocando a Internacionalizao em Ao ............................. 284
Criando um Arquivo .Properties no NetBeans ............................. 285
Criando um Arquivo .Properties no Eclipse ............ ..................... 288
Usando os Recursos de Internacionalizao em uma Pgina JSP 293
As Actions de Formatao .............................. ........... .. ................ 295
As Diversas Actions de Formatao ....................................... 295
A Biblioteca de Tags SQL ........................ .. .......... .. ...................... 299
A Action <sql:setDataSource /> .............................................. 299
A Action <sql:query /> ............................................................ 300
A Action <sql:update /> .......................................................... 303
As Actions <sq l:param /> e <sql:dateParam /> ...................... 303
A Action <sql:transaction /> ...................................................
A Biblioteca de Tags XML .................................................. .. ......
A Action XML Core................................... .............................
As Actions <x:parse /> e <x:out /> .........................................
AAction Controle de Fluxo XML ...............................................
As Actions <x:forEach /> e <x:if /> .......................................
As Actions <x:choose I>, <x:when /> e <x:otherwise /> .......

308
310
311
311
313
314
314

As Actions de Transformao XML ..................................... ....... 315


A Action <x:transform /> ......... .. ............................................. 316

18

T AGS ........ ......................................................... 319


Em Qual Situao Eu Devo Usar Custom Tags? ......................... 319

ENTENDENDO CUSTOM

Reusabilidade ................... ... ........................................ .. ....... ... 320

Sumrio

lll XXV

Readaptabilidade ..................................................................... 320


Manutenibilidade .................................................................... 320
Custom Tags e Biblioteca de Tags, Qual a Diferena? ................ 321
Construindo uma Biblioteca de Tags Clssicas ........................... 321
Criando a Classe InputTag ........................................................... 322
O Papel do TLD ........................................................................... 326
Referenciando uma Biblioteca de Tags em uma Pgina JSP ....... 329
Chamando a Tag Personalizada na Pgina JSP ............................ 330
Criando Algo mais Dinmico ....................................................... 332
Criando o Descritor da sua Tag Personalizada ............................. 334
Utilizando sua Tag LoopTag ........................................................ 336
Criando Tags Condicionais .......................................................... 337
A Tag IF ................................................................................... 337 '
A Tag de Condio do IF .............................................................. 338
O Resultado Aps a Condio ................................................ 339
O Caso Else ........................ ..................................................... 341
Criando o TLD ...................................................... ....................... 342
Como Utilizar as Tags IfrrhenlElse ............................................. 343
Conhecendo SimpleTags .... .......................................................... 344
Um Simples Exemplo ............................................................. 345
O Arquivo TLD ....................................................................... 346
Utilizando a Tag Simples ...................................................... .. 346
Um Tag Simples mais Dinmica .................................................. 347
Criando e Utilizando Tag Files .................................................... 349
Criando um InputTag ...................................................... .. ...... 351
Utilizando a Tag Inputag ......................................................... 351
Criando uma Tag Files Mais Dinmica ........................................ 352
Colocando em Ao a Tag ............................................................ 354
Empacotando e Distribuindo suas Tags ....................................... 354
Configurando .................. .... ......... ...... ....... ....... .................. ........... 355
Empacotando ............ ............ ................................. ...... ... ... .. .......... 357
Usando sua Biblioteca de Tags ................................ .. .................. 359
Prefixos Reservados.. ...... ... ...... ....................... ... ......... .... .. ...... ... .. 359
O JavaBeans e as Tags Personalizadas ............................ .... ......... 359

XXVI lI Desenvolvendo Aplicaes Web com JSP...

19

ENVIO DE E-MAIL ............................................................... .... ..............


Preparando o Ambiente ................................................................
Configurando para Envio de E-mail ...........................................
Enviando E-mail sem Autenticao ........................ .... .......... .. .... .
Enviando um E-mail Atravs de um Bean ...................................
Utilizando o EmailBean ..........................................................
Enviando E-mail com Contedo Anexo ................................. ......
A Biblioteca Commons Email ......................................................
E-mail com Anexo Utilizando a Biblioteca Commons Email ......
Enviando E-mail em Formato HTML Usando Commons Email.
Enviando E-mail com Autenticao .............................................

361
361
365
370
370
373
375
378
380
382
384

20

MODEL-VIEW-CONTROLLER E DATA ACCEss OBJECT ................ .... ..........


O que MVC? .............................................................................
As Aplicaes Web .......................................................................
O Model 1 ...............................................................................
O Model2 .. ........ ........................................................ .............
A Pgina para Logar (view inicial) .........................................
O Model Usuariojava .............................................................
O Controller Servlet Logar .....................................................
A View logado.jsp ...................................................................
O Padro DAO (Data Access Object) ..........................................
A Fbrica de Conexo ..................................................................
Convertendo o Ano do MySQL ...................................................
Personalizando as Excees .........................................................
O Bean Livros ............. .. ................................. ............ .. ... .............
Como Criar um Construtor pelo Eclipse .................................
Manipulando a Tabela Livros ...................... .... ...................... ......
A Interface....................................................................................
Utilizando o DAO .................... ...... ..............................................
As Views ......................................................................................
Mostrando os Livros Cadastrados ...........................................
Cadastrar Novos Livros ................................................................
Atualizando Livros .......................................................................
Percebendo as Mudanas ............................................................ .

385
385
387
387
392
394
395
396
398
399
400
402
404
405
407
408
413
414
419
419
423
425
427

in

21

Sumrio [iiil]

XXVII

JAVASERVER FACEs ...............................................................................


Configurando um Projeto JavaServer Faces ................................
Trabalhando com JavaServer Faces no NetBeans .......................
Desenvolvendo com JavaServer Faces no Eclipse .......................
Criando um Exemplo Simples para Comear ..............................
No Diretrio WEB-INF ...........................................................
O JavaBean .............................................................................
O Formulrio que Enviar o Nome .........................................
A Pgina que Resulta no Sucesso do Envio ............................
Conhecendo Melhor o JavaServer Faces .....................................
A Arquitetura Model- View-Controller ....................................
Converso de Dados ...............................................................
Validao e Manipulao de Erros .........................................
Internacionalizao .................................................................
Componentes Customizados ................................ ........ ...........
As Tags Padres de JavaServer Faces ..........................................
JSF Tags HTML ......................................................................
Atributos Suportados Pertencentes ao HTML ........................
JSF Tags Core ....................................................................... ..
Ciclo de Vida do JSF ....................................................................
Internacionalizando uma Aplicao JSF .................................
Banco de Dados e JSF ..................................................................
O Bean de Comunicao com as Pginas JSF .............................
O Problema do Ano MySQL ........................................................
Configurando a Navegao .................................... ......................
As Pginas JSF .............................................................................
O Arquivo Inicial da Aplicao ...............................................
O Menu da Aplicao ..............................................................
Exibindo todos os Livros Cadastrados .... ................................
Cadastrando um Novo Livro ...................................................
Atualizando um Livro Cadastrado ..........................................
Excluindo um Livro ................................................................
Tomando um Campo Obrigatrio no Preenchimento .............
Personalizando Mensagens Padro do JavaServer Faces ............
Como Alterar as Mensagens sem a Necessidade de Recompilar.

429
429
430
432
447
448
449
452
455
456
456
457
457
458
458
458
458
460
462
463
463
469
470
473
476
480
480
480
482
484
488
491
491
495
497

XXVIII llI

Desenvolvendo Aplicaes Web com JSP...

Validando a Entrada de Valores .... ...... .. .. .... .. .. .... .. ............. ..........


Validando o ISBN ....... .. ..... ..... .. ..... ....... ......... .......... .... .... .... ...
Configurando o Validador .......... .............. ... ... ... ....... ... .. ...... ....
Aplicando o Validador .. ... .. .. .. .. ...... ... ...... .. .... ...... ........ ... ... .. ....
Validando pelo Bean ........ ........ .. ... ..... ..... ......... ................. ......
Dando um Estilo a sua Tabela ............. ....... ... ... ... .... ..... .. .. .... .. ... ...

498
499
502
503
504
505

22

JAVASERVER FACES E HIBERNATE .. ....... ....... ..... ............ .... ........ ....... .... ...
O Hibemate ..... .......... .. ..... .. .......... .. ........... ............ .... ..... ..... .........
Antes de Comear ........... .. ..... ...... .. .... ..... ........ ................ ...... .... ...
Colocando o Hibemate para Trabalhar .... ......... ......... .. .. ... ........ .. .
Mapeando a sua Tabela .... ...... .... .. ...... ........ ..... ... .... ... ... ..... .. .. ... ... .
Confi gurando o Hibemate .... .... .. ... .. ... .......... ..... .... ... .... ... .. ..... ... ...
Conectando-se ao Hibemate ............................................ .... .. ......
A Interface Utilizada .. ........ .... .... ....... ... .. .......... ... ... ...... ..... ......
Para a Aplicao Funcionar ...... ...... ....... .......... ..... ... .. ... .. .... .. .. .... ..
Hibemate Annotations ..... ................ ... .. .... ........ ... .. ............ .......... .
Hibemate ... ......................... .... .......... ...... ......... ....... ... .. ......... .. .
Annotations ......... .................. ...... ... .......... ...... .... ...... ......... .. ....
O Conceito da Nova API de Persistncia .. ........ ...... .. .... ... .... ... .....
Configurando sua Aplicao para Utilizar Annotations .... ...... .. ...
A Conexo Atravs das Anotaes ..... ... ...... .. ..... ... ............ ... ..
Configurando o Hibemate para Aceitar Anotaes .. .... .. ... .....
Log4J em um Projeto Utilizando Hibemate ............. ........ ...........
Configurando o Arquivo log4j .properties .. .... ........ ...... ....... ....
Nveis de Logging ................ ........... .... ..... ..... .. ......... .. .... .... .. ...
Layouts ................. ... ........ ... .... .. .. .... .. ... .... .... .................... ........
Usando a Sada no Console ....... ...... .... .. .. ...... ...... .... ..... ... ........ .....
Um Pouco mais de JSF e Hibemate .......... ..... ..... .... ........... .. ...... ..
A Classe Chamada pelo JSF ....... .......... .. .... .. ... ... ...... ... ....... ....
Mas s Isso? ....... .... ............ ........ .. ..... .. .............. .... .. .... ..... ... ......

511
512
512
513
515
517
520
524
525
525
526
527
527
528
531
532
533
534
534
535
536
536
537
541

23

JAVASERVER FACES E AAPI DE PERSISTNCIA EJB 3 .... ...... ..... ... ........ .. .. 543
Mas o que Vem a Ser EJB? ........ ........ .. ............... .. .... .... .... .... ... .. .. 544
Baixando e Configurando o TopLink ... ... .............. ..... ........ ........ .. 545

Sumrio l'iJ XXIX

24

Iniciando em TopLink ............... .... ........ .... .. ...... .. .. ..... ... .. .... ..... ....
A Criao do Banco de Dados .. ....... ...... .... ... .... .......... ... .... .....
A Modelagem do Sistema .... .. .... .......... ........... ........ ..... .... ............
O Mapeamento dos Livros ...... ... .... ... ... ..... ....... .......... ..... ... .....
O Mapeamento da Editora ........ ......... .... .............. ...... ..... .... ....
O Mapeamento de Autores ........... ..................... .......... .... ..... ...
O Mapeamento de Publica0 ............... .. ....... .............. ..... .........
A Java Persistence QL ....... .. ...... .... ... ........ ........ .... .... .......... ....
Configurando o TopLink ........ ........ .. ........ ......... ...... ... ... .. .... ....
Fazendo querys JPQL ... ...... ..... .. .... ........ .... ....... .... .. ......... .. ... ..
Desenvolvendo seu Projeto .... .... ........................ ......... ... ...... .... ....
Um JOIN em uma Pgina JSF ..... ..... ................... ... .. ....... ... ..... .....
Paginando Resultados Utilizando JSF .............. ..... ......... ..... ... .....
Adicionando Novos Mtodos ...... ...... ..... ......... .. .... .... ... ... .... ...
Aplicando a sua Pgina JSF ... ........... .... ......... .............. ........ ...
Paginando Resultados Atravs da JPA .. ... ...... ...... ... .... .. ...... ..... .. ..
Controlando a Paginao .... ... .... ...... .... ...... ........ ... ........ ..........
Paginando os Resultados ... ... ......... ....... ........ .... ... ..... .. .. ..... ......

547
547
549
549
551
553
554
556
561
563
566
572
575
575
580
582
584
587

AJAX ......... ............. ....... .. ..... .......... :..... ... ............ ........ .... ...... ...... ......
Como o Ajax Trabalha ...... .. .......... ....... ........... .... ....... .. .... .. ..... .... .
Preparando-se para Trabalhar com Ajax ......... .. ... ......... .... .. ... .. .. ..
Ajax Bsico ..... .. ...... ..... ... .. ... .. .. ...... ........ ..... ........... ....... ......... ......
Os Pedidos XMLHttp .... .. .......... ... .... ... ..... ..... .. .. ... .... .. ..................
Ajax na Prtica .................... ..... ...................... ... .......... .... ...... .. .....
Configurando seu Projeto .................................. ..... ...... ........... .....
Configurando as Classes .. ................... .. .... ... ..... ...... ................
Configurando a Persistncia .... ... ..... ....... .... .... ........... ..... ........
Criando o Servlet ..... ..... ... ... .. ...... .... ... .... ....... ......... .. .. .. ...........
A Pgina HTML que Receber os Dados ..... .. ............. ... .... ....
Enviando pelo Mtodo POST .... ........ .. .. ........... ...... ..... .. .... .....
Utilizando Frameworks Ajax .... .......... ... ........ ..... ....... ..................
Dojo Toolkit ..... .............. .. .. .. ... .... .. ....... .. ........... .... ..... .. ... ........... ..
Vantagens de Utilizar o Dojo Toolkit .... .. .. ........ ...... ..... .. ... .....
Desvantagens de Utilizar o Dojo Toolkit .. ........ ...... ... ....... ... ...

589
590
592
592
592
593
593
594
597
598
599
605
612
613
613
614

xxx

l\jl] Desenvolvendo Aplicaes Web com JSP...

Baixando e Configurando o Dojo Toolkit.. .............................


Criando um Cadastro com Dojo Toolkit .......................... .......
O DWR .......... ......... .... .. ............ .. .................... ... .................... .. .....
Vantagens de Utilizar DWR ....................................................
Desvantagens de Utilizar DWR ..............................................
Baixando e Configurando DWR ................... ............ .. ............
Criando um CRUD com Ajax e DWR ....................................
Configurando o DWR ..................................................................
O Reconhecimento da Classe Java pelo DWR .......................
Adicionando JavaScript a sua Aplicao ................................
Transformando a Data Atravs do JavaScript ................... ..... .
A Pgina Final da sua Aplicao .............................................
JavaServer Faces e Ajax ...... ............................ ..... ........ ................
Utilizando o Framework Ajax4jsf.. .........................................
Vantagens de Utilizar o Ajax4jsf ......................... ....... ........ ....
Desvantagens de Utilizar o Ajax4jsf.. .... .............. ...................
Baixando e Configurando o Ajax4jsf.. ....................................
Criando um CRUD com Ajax4jsf ...........................................
Configurando o Ajax4jsf ..............................................................
Configurando faces-config.xml ..............................................
A Pgina Final da sua Aplicao .... .................. .......................

614
614
618
618
618
619
619
622
625
627
634
635
640
640
640
641
641
641
645
646
647

ApNDICES

UM Pouco SOBRE JAVA .............................. ......... .............. .... .... ............


O Princpio Bsico de Java ..........................................................
System.out.println("Ol Mundo!"); ........................................
Variveis e Operadores .................. .... ...... .... .................................
Tipos de Dados Inteiros ...............................................................
Tipos de Dados em Ponto Flutuante ................. .......... ....... ......... .
Tipo de Dados de Caractere ............. .......................... ........ .... ......
Tipo de DADOS LGICO ....................................... ....................
Declarao de Variveis .................................................. .......... .. .
Comentrios .................................................................................
Operadores .................................................. ... .................. ........ .. ..

653
653
654
654
654
655
655
656
656
657
658

Sumrio [ilJ

XXXI

Palavras Chave e Identificadores ........ ....................................


Estruturas de Controle ..................................................................
A Estrutura iLe1se iLelse ..........................................................
A Estrutura switch ........................................................................
A Estrutura de Repetio For .......................................................
O loop While ................................................................................
O loop dO ... while ......... .................................................................

659
660
660
661
662
663
664

A Estrutura try... catch ... finally .....................................................


Excees mais Comuns ................................................................
Categorias das Excees ..............................................................
Declare ou Manipule a sua Exceo................................. ...........

665
666
667
667

Mtodos.................... ............... .. .... .... ........... ......... .. ...... ... ... ........ .
Fundamentos da Orientao a Objetos .................. .......................
Classes....... ............... .. .................. ................ ................................
Objetos .. .......................................................................................

667
669
669
671

Herana ................................... ... ........... .... .... ....... .. ....... .... .......... . 672
Polimorfismo ............. .......... .............. .... ......... ... ........ ........ ..... ...... 673

CONTEXTO DE DESENVOLVIM ENTO WEB EM JAVA .................................... 675


No Diretrio WEB-INF ................................................................ 675
Instalando uma Aplicao Web em Outro Local .......................... 676

TRABALHANDO COM DATAS .............................................................. .. ... 679

O XHTML .........................................................................................
O HTML4 ............................................... .......... .. ....... ..................
Uma Introduo Linguagem HTML .. .. ......... ............................
HyTime - HypermediafTime-based Document Structuring
Language ....... ............. ...... .......................................................
SGML - Standard Generalized Markup Language ............... .......
Como so as Marcaes HTML? .................................................
Documento Bsico e seus Componentes......................................
A tag <head /> ..............................................................................
A tag <body /> ....................... .......................................................
Quebra de Linha ........... .. .......................................................... ....

683
683
684
684
684
685
685
686
686
686

XXXII lJ Desenvolvendo Aplicaes Web com JSP...


Pargrafos .. ......................................................... ... ....... .. ...... ........ 687
Formatao de Textos .................................................................. 687
Formatando em Negrito ............................................ ........ .. ......... 687
Formatando em Itlico ............................................................ 687
Ligando um Documento com Links ............................................. 687
Tabelas ................... .. ......................... ............. .. ............................ 688
Formulrios .................................... ..... ........... ........ ... ................... 688
Outros Atributos da tag <form /> ............................................ 689
Enctype ....................................................... ............................ 689
Entrando com Dados.................................... .......... .... .................. 689
TAGS Responsveis por Entrada e Envio de Dados.................... 690
INPUT .... .............. ................................................................... 690
Campos de Entrada de Texto .................................................. 690
Campo de Dados Senha .......................................................... 690
Outros Atributos ... ........................................................................ 690
VALUE ..... .. ........... .................................................................. 690
SIZE ............................................... .............. ...:.. ....... ...... ....... . 691
MAXLENGHT .... ...... .... ........ ..... ....... ..... ..... .. ............... .......... 691
NAME .. ... ... ............ ............ ..... ..... ..... ...... ......... ... ........ .... ........ 691
ID ....... ..... ........... ..................................... ..... ........................... 691
Caixas de Checagem (Checkbox) ................................................ 692
CHECKBOX ..................... ... ...................... ... ... ... .. .... ... ........... 692
Botes de Rdio .. ................................ ......................................... 692
RADIO ... ...... ... ......... .................................. ..... ... ..... ......... ....... 692
CHECKED ... ............. ............ ...... ... ......... ... .... ...... ........ ... .. .. ... . 692
Botes de Ao ........... ........ .. .... ... ... ............. ........... .. ... ..... ... .... ..... 693
SUBMIT ............................ ...... ... ................. ..... ...................... 693
RESET ........................ .. .......................................................... 693
BUTTON ................... ................................... .. .... ........ ... ......... 693
IMAGE .................................................................................... 694
Caixas de Seleo.............. ........................................... .. .............. 694
SELECTED ................................. ... .............. ...... ........ ............. 694
SIZE ................................................... ..................................... 695
MULTIPLE .............. ... ........ ...... ........ ...................................... 695
Agrupando Opes ....................................................................... 696

Sumrio l)il]

XXXIII

reas de Texto ........... .. .... .... .......... ...... ... ....... .... ....... .. ... ..... ........ .. 696
COLS ...................................................... ................................ 697
ROWS ...................................................... ............................... 697

WRAP .....................................................................................
Rtulos ............................... .. ............................... ...... ... .......... ......
Campo Oculto .. ... ..... .. ..... .. ..... ... .......................... .. ........... .. .. ... .. ...
HIDDEN ......... .. ................................. .... .. .... ...........................
Campo de Arquivos ... ....... ..... .... ... .... ... ... ...................... ................
FILE ........................................................................................
Botes de Fonnulrio Especiais ........... ........ ... .......... ..... ... .. ... .. ....
BUTTON .............. ..................... ...... .......... ........................ .....
Somente Leitura e Desabilitado .............................. .......... ...........
READONLY .................. .. ...... ...... ........... ................................
DISABLED ............. ................... ....... .... ... ... ... ... ....... .......... ... ..
FIELDSET .................................................. ... .... ............... .... ..

697
697
698
698
698
698
699
699
700
700
700
700

Tecla de Acesso ............... .. ... ............. ... ..... ........ ..... ..................... .
accesskey .................................................................................
As Diferenas entre o HTML 4 e o XHTML. ..............................
Requisitos de Confonnidades para Documentos ....................

701
701
701
701

Diferenas para o HTML 4 ..........................................................


Esta Seo Infonnativa. ..... ........ .. .... .... ............... ................ ..
Os Documentos devem ser bem Fonnados ..................................
Elementos e Nomes de Atributos devem ser em Letras
Minsculas ..... ... .... .... ... ........ .............. .. .. .. ...............................
O Uso de Tags de Fechamento Obrigatrio ..............................
Elementos Vazios.... . .... .. ...... ...... ... ...... ............. ......... ........ .. ....
Os Valores de Atributos devem Estar entre Aspas .......................
A Sintaxe para Atributos deve ser Escrita por Completo ........
Elementos Vazios ... ... ........... .... ..... ...... ............. ... ........... .. ..... ..

703
703
703

O MySQL .. ... .. .. ... ........ ........................ .............. .... ..... ...... .. .... .... .......
O que um Banco de Dados Relacional? ................. .. ..... ... ..... ....
Instalando o Banco de Dados ... ...... ...... ...... .......... .. .... ... ...... ..... ....
Instalando no Windows... .... .... .... ... .... .. ...... ...... ... .... ..... .. ...... .... ......
Para iniciar o servio: .... ................ ........ ............ ........ .............

707
708
708
708
708

703
704
704
704
705
705

XXXIV llI Desenvolvendo Aplicaes Web com JSP...


Para parar o servio: ...............................................................
Instalando o MySQL no Linux .....................................................
Acessando o Banco de Dados MySQL ........................................
No Windows ............................................................................
No Linux ......................................................................................
Os Comandos CREATE e DROP .............................................. ...
O Comando CREATE ..................................................................
O Comando USE.................. ............ .. ..........................................
O Comando DROP .......................................................................
Criando Tabelas...... .. .......... ..................... .....................................
O Comando SHOW .......................... ............................................
SHOW TABLES FROM livraria; ...........................................
O Comando DESCRIBE ..............................................................
IF NOT EXISTS ...........................................................................
Alterando Tabelas Existentes .......................................................
Alterando o Nome da Coluna .......................................................
Alterando o Tipo de Coluna .........................................................
Renomeando uma Tabela .............................................. ........ .... .. .
Excluindo / Adicionando Colunas e Tabelas ................................
Eliminando Tabelas e Colunas .................................................... .
Adicionando Colunas ...................................................................
Adicionando Colunas Aps uma Outra Determinada ..................
Utilizando ndices ............... ..... ..... ................................ ...............
Decidindo quais Colunas Incluir no ndice ..................................
Criando um ndice .................................................................. ......
Excluindo ndices ................................................................. ........
Tipos de Tabelas................ ...................................... .....................
O Tipo MylSAM .. .... .... ................................................................
O Tipo InnoDB .................... .................................... .....................
Alterando o Tipo de uma Tabela ..................................................
Tipo de Dados ..............................................................................
Tipos Numricos ..........................................................................
Modificadores AUTO_ INCREMENT, UNSIGNED
e ZEROFILL ...........................................................................
AUTO_INCREMENT ....................................................... .. ... .....

709
709
709
709
710
710
711
711
711
712
712
712
713
713
713
713
714
714
714
714
714
715
715
715
715
716
716
717
717
718
718
719
720
720

Sumrio l\I XXXV


UNSIGNED .................................................................................
ZEROFILL ...................................................................................
Tipos de Caractere ou de Dados de String ...................................
CHAR e VARCHAR ....................................................................
TEXT e BLOB .............................................................................
Tipos Variados ..............................................................................
Tipo ENUM ......................................................... ..... ...................
Tipo SET ......................................................................................
Tipos de Data e Hora (DATEfTIME) ...........................................
Modificadores Adicionais de Coluna ...........................................
Sintaxe Bsica da SQL .................................................................
Comando INSERT ........................................................................
Comando SELECT .......................................................................
A Clusula WHERE .....................................................................
Funes que Trabalham com a Instruo SELECT .....................
LIMIT ................. ............. .... ................ .. ............................ ...........
COUNT( ) ....................................................................................
ORDER BY ..... .................................................. ...........................
ORDER BY ... DESC ...................................................................
LIKE ..................... .................. ........ ...... ... ........... .... ... .... ....... ........
Comando UPDATE ................ .. .......................... .. ................. ... ....
Comando DELETE ......................................................................
Trabalhando com Junes ...................................................... .... ..
Criando uma Juno com INNER JOIN ......................................
Chaves Variadas do MySQL ........................................................
O que uma Chave? ...............................................................
Como as Chaves Funcionam ...................................................
Benefcios de Usar uma Chave ...............................................
Suporte de Chaves do MySQL ...............................................
Chaves Primrias (Primary Key) .................................................
Chaves Estrangeiras (Foreign Key) .............................................
Excluindo uma Chave Estrangeira ...............................................
Administrando o MySQL .............................................................
Entendendo o Sistema de Privilgios do MySQL ........................
Configurando Usurios ................................................................

720
720
721
721
722
722
722
723
723
723
724
725
725
726
727
727
727
728
728
728
729
729
729
729
730
730
730
730
731
731
732
732
732
733
733

XXXVI

[1iil]

Desenvolvendo Aplicaes Web com JSP...

Confinnando o Novo Usurio ......................................................


Revogando Privilgios .................................................................
Obtendo Infonnaes com SHOW ..............................................
Bibliografia ......................... ....... .... ... ...... .... ... .... .......... .... ............
Referncias Internacionais ......................................................
Referncias Nacionais .............................................................

734
734
734
735
735
736

Introduo

como o Java.
Voc v tantos JUGs (Grupos de usurios de discutem e disseminam a
linguagem), como tambm livros a respeito da mesma.
Na atualidade voc conta com diversas tecnologias de servidor, sejam
elas para construir um simples site com um contedo dinmico (comum
nos dias atuais) ou para construir um complexo sistema B2B (Business-ToBusiness) ou B2C (Business-To-Consumer).
Existem diversas tecnologias disponveis atualmente para o desenvolvimento dessas classes de aplicaes, onde as mais famosas so o PHP,
ASP, ASP.NET, CGr, Ruby on Rails, Python e etc.
Muitos que migram para o Java se perguntam do porque essa linguagem ser to famosa , uma vez que muito mais complexa que as demais
citadas.
A utilizao de tecnologias Java oferece diversas vantagens em relao ao uso de outras tecnologias de servidor. As principais vantagens so
herdadas da prpria linguagem Java, como:
Portabilidade: a aplicao desenvolvida pode ser implantada em diversas plataformas, como por exemplo Windows, Linux, Macintosh, sem
que seja necessrio modificar ou mesmo reconstruir a aplicao. Tudo bem
que exista tambm portabilidade nas modernas linguagens de desenvolviENH UMA LINGUAGEM TEM TANTO ES PAO NA MDIA BRA SILEIRA

VIII lI

Desenvolvendo Aplicaes Web com JSP...

mento, principalmente na Web, mas algumas como ASP.NET no oferece


um suporte direto da empresa que o criou, no garantindo assim total
portabilidade em todos seus componentes.
Orientao a Objetos: a programao orientada a objetos, simplificando o desenvolvimento de sistemas complexos. Muitas linguagens atuais tambm trabalham com linguagens orientadas a objetos, mas devido a
sua histrica forma de desenvolvimento, muitos mantm o modelo tradicional, ou seja, prefere trabalhar procedural mente, como acontece com o
PHP, onde muitos alegam ser o modo mais "produtivo".
Flexibilidade: o Javaj se encontra bastante difundido, contando com
uma enornle comunidade de desenvolvedores, ampla documentao e diversas bibliotecas e cdigos prontos, dos quais o desenvolvedor pode usufruir sem a necessidade de gastar algum valor a mais ou at mesmo de
codificar. A esse meio temos as famosas bibliotecas prontas e frameworks .
Com certeza, nisso o Java campeo.
IDEs: outra grande vantagem na utilizao da linguagem Java est
em suas IDEs, que com certeza, so as melhores do mercado, em qualquer
ramo de atividade em que voc queira empregar essa linguagem .
Alm dessas vantagens, a arquitetura de servidor escrita em Java possibilita alguns beneficios adicionais, como escalabilidade, onde na maior
parte dos servidores de aplicaes modernos, possvel distribuir a carga
de processamento de aplicaes desenvolvidas em diversos servidores, sendo
que servidores podem ser adicionados ou removidos de maneira a acompanhar o aumento ou decrscimo dessa carga de processamento.
Ainda assim, depois desses argumentos, voc pode duvidar da facilidade do Java, principalmente se voc vem de linguagens como ASP ou
PHP. Antes de mais nada, perceba que no estou falando mal dessas linguagens e nem ao menos quero dizer que o Java superior a elas. O que vou
provar nesse livro que Java pode ser muito mais produtivo e lgico, se
voc for bem orientado no seu desenvolvimento .

Quem Deve Ler Este Livro


Este livro foi escrito com o intuito de ensin-lo a trabalhar com o desenvolvimento de aplicaes Web escritas em Java utilizando as principais

Introduo

IX

tecnologias que englobam essa matria: Servlets, JavaServer Pages e


JavaServer Faces, tambm podendo utilizar uma IDE. O foco do livro est
no desenvolvimento e no na utilizao de uma IDE.
No decorrer deste livro, voc aprender no somente a trabalhar com
aplicaes Web escritas em Java como tambm a instalar e configurar um
Container Servlet, trabalhar com banco de dados MySQL, criar aplicaes
dinmicas utilizando Ajax. Portanto presume-se que voc seja um iniciante
nas artes do desenvolvimento Web.
Infelizmente isso no o isenta de conhecer a linguagem Java. O livro
est baseado no desenvolvimento Web utilizando a tecnologia Java, onde o
bsico da linguagem necessrio . Caso voc no tenha alguma noo, leia
os apndices deste livro, onde poder faci litar o seu entendimento, mas no
se tomar um grande conhecedor da linguagem, o que vai muito alm do
escopo pretendido por essa obra .

Antes de Comear
Em algumas partes deste livro voc encontrar alguns smbolos, que o ajudaro a entender o cdigo proposto e desenvolvido, que so os mostrados a
segUir:
~

Indica que o cdigo continua na linha de baixo.

O Indica que haver uma explicao do cdigo onde se encontra,


indicado em meio explicao, no texto .
Indica que acima ou abaixo contm mais cdigo, mas que no
est sendo exibido por no ter sido alterado .

Os Softwares Requeridos
Os aplicativos criados neste livro no exigem software proprietrio. Portanto ao longo dos captulos voc no s aprender como usa-los como
tambm onde encontra-los na Internet.
Este livro no est focado especialmente em um sistema operacional,
portanto a sua escolha livre nesse ponto.

x [lilJ

Desenvolvendo Aplicaes Web com JSP...

Hardware Requerido
Uma boa configurao de hardware se faz necessrio para trabalhar com
aplicaes escritas em Java. Caso voc venha a trabalhar com as IDEs apresentadas no livro, um computador deve ter as seguintes configuraes para
uma confortvel utilizao:
~ Processador: Pentium 4 ou similar
~ Memria: 768 MB de RAM mnimo (recomendo 1GB de RAM)
~ HD: 10GB de espao livre
~ Monitor: 17 polegadas (necessrio para o uso das IDEs)
Alguns testes foram executados em Pentium 3 com 512 MB de memria, no qual houve certa lentido na utilizao das IDEs, mas no a
inviabilidade de seu uso.

Cdigos dos Exemplos Criados no Livro


Todos os cdigos dos exemplos criados no livro se encontram disponveis
na Internet, no site Web do autor: http://www.integrator.com.br . Para testar facilmente um aplicativo que fora desenvolvido no livro, voc tem os
arquivos dispostos em projetos criados na IDE Eclipse sem as bibliotecas,
que devero ser baixadas nos locais indicados ao longo dos captulos.

Viso Geral dos Captulos


Ao longo deste livro, voc ter muitos cdigos para desenvolver. A sua
grande maioria est na integra, para que voc mesmo o digite. Embora seja
um livro voltado para o trabalho com cdigos, ainda assim possui uma
grande quantidade de imagens (quase 200 figuras) , que ilustram desde o
resultado do que voc obter nas suas aplicaes at mesmo os passos utilizados em uma IDE.
CAP TULO

1:

COMO A WEB TRABALHA?

Criar pginas Web sem entender como ela trabalha algo impossvel de se
imaginar. Neste captulo voc conhecer os fundamentos sobre a funciona-

Introduo [ii] XI
lidade da Web, passando de uma requisio feita pelo seu browser ao servidor at os diversos protocolos existentes.
CAPTULO

2:

A LINGUAGEM JAVA

o que

Java? Como configurar minha mquina para utilizar aplicaes


Java? Posso rodar Java em outros sistemas operacionais? Essa e outras
perguntas sero respondidas atravs deste captulo, onde voc aprender
onde encontrar, a instalar e configurar o Java SE tanto no sistema operacional
Windows como no Linux.
CAPTULO

3:

FAZENDO FUNCIONAR O JAVA NA WEB

A configurao de um container Servlet necessria para que suas pginas


Web escritas em Java rodem em sua mquina . Neste captulo voc aprender onde baixar, instalar e configurar o Apache Tomcat 5.5, um dos
containeres Servlet mais utilizados do mundo .
CAPTULO

4:

INTRODUO AOS SERVlETS

Servlets, o que isso? Neste captulo voc ser introduzido no aprendizado


sobre Servlets, seu ciclo de vida, sua configurao, seu desenvolvimento,
compilao e publicao no Tomcat.
CAPTULO

5:

ESCOLHA SEU AMBIENTE DE DESENVOLVIMENTO

Na atualidade, duas IDEs Java vem se destacando no mercado: Eclipse e


NetBeans. A pergunta : qual uti lizar? Voc aprender neste captulo a utilizar o bsico de cada IDE, desde onde baixar at a sua configurao de
projetos e criao de aplicaes escritas em Java no desenvolvimento Web.
CAPTULO

6:

A CLASSE HTTPSERVlET

Com um aprofundamento na criao de Servlets, voc aprender neste captulo como captar pedidos via mtodo GET e POST, uti lizando links e
formu lrios para envio de informaes .

XII

[il] Desenvolvendo Aplicaes Web com JSP...

CAPTULO

7:

OUTROS MTODOS MUITO TEIS DA INTERFACE

HTTPSERVlETREQUEST

Neste captulo voc aprender outros mtodos utilizados na construo de


Servlets que pode desde varrer um conjunto de dados enviados por um
formulrio at mesmo recuperar cabealhos do servidor.
CAPTULO

8:

COOKIES E SESSES

Gerar cookies em pginas Web algo to comum, extremamente utilizado


em sites de comercio eletrnico e agora ao seu alcance. Neste captulo
voc aprender a criar e a recuperar cookies, para utiliz-los em um controle as visitas feitas em seu site. Alm disso, aprender a criar e gerenciar
sesses, o habilitando para criar sofisticadas reas administrativas que exijam um usurio e senha para entrar, e que esses dados persistam por toda a
aplicao at a sua sada.
CAPTULO

9:

INTRODUO A JAVASERVER PAGES

A tecnologia JSP (JavaServer Pages) fora criada pela Sun Microsystems


para facilitar o desenvolvimento de pginas Web que exijam um alto grau
de designo Mas o que JSP? Esse captulo o introduzir nessa tecnologia,
suas semelhanas e diferenas com Servlets, sua configurao e publicao no Tomcat. Tambm aprender a criar JSP em sua IDE predileta.
CAPTULO

10:

COMPARANDO JAVASERVER PAGES COM SERVlETS

Aps aprender a criar pginas JSP, provavelmente voc quer gerar pginas
com as mesmas caractersticas criadas nos exemplos feitos com Servlets.
Este captulo o mostrar exatamente isso, possibilitando assim uma melhor
compreenso de como migrar de Servlets para JSP.
CAPTULO

11:

CONTROLANDO ERROS

Erros, uma situao inevitvel quando estamos aprendendo . No poderia


ser diferente no desenvolvimento de aplicaes Web . Mas como entend-

Introduo ll XIII
los e control-los? Este captulo o ensinar a entender os en'os mais comuns e como contorn-los sem traumas. Voc tambm aprender a tomar
seu erro mais amigvel ao usurio, em caso de falha no seu sistema quando
publicado.
CAPTULO

12:

ACTIONS

Actions so tags que afetam o comportamento em JSP e a resposta retomada


ao cliente. Durante a traduo o container substitui uma Action por um
cdigo Java que corresponda a seu efeito. Neste captulo voc aprender
sobre as diversas actions encontradas na construo de pginas JSP e o
quanto isso pode facilitar no seu desenvolvimento.
CAPTULO

13:

JAVABEANS

JavaBeans so classes que possuem o construtor sem argumentos e mtodos de acesso get e set. Muito utilizado em construes de aplicaes Java,
voc aprender no s a utilizar essas classes, mas tambm o que elas podem facilitar no desenvolvimento de suas pginas JSP, separando a lgica
do design o
CAPTULO

14:

FAZENDO UPlOAD DE ARQUIVOS

Enviar arquivos para o servidor uma das tarefas mais comuns em sistemas administrativos construdos para rodar em aplicaes Web. Neste captulo voc desenvolver um JavaBean que trabalhar com uma biblioteca
Open Source para enviar arquivos para o servidor. Aprender tambm como
fazer esse upload com segurana, permitindo um determinado tamanho
mximo para o arquivo enviado, bem como tambm a extenso permitida.
CAPTULO

15:

TRABALHANDO COM BANCO DE DADOS

Uma imerso ao uso do banco de dados com aplicaes escritas em Java


utilizando pginas JSP mostrada neste captulo. Voc aprender neste
captulo os passos bsicos para trabalhar com um banco de dados, no caso

XIV

[lJ Desenvolvendo Aplicaes Web com JSP...

o MySQL. Configurar seu acesso utilizando uma biblioteca JDBC e criar


uma aplicao contendo desde a incluso at a excluso de dados.
CAPTULO

16:

JAVASERVER PAG ES EXPRESSION LANGUAGE

Com linguagem de expresso JSP, EL (JavaServer Pages Expression


Language), voc pode melhorar muito o seu aplicativo, tornando-o mais
simples. Este captulo o introduzir no uso de EL, mostrando os fundamentos, que sero aplicados mais adiante em pginas JSTL e JSF. Alm disso,
voc aprender como desativar essa linguagem de expresso, caso haja
necessidade.
CAPTULO

17:

JAVASERVER PAGES STANDARD TAG LIBRARY

Com a biblioteca JSTL (JavaServer Pages Standard Tag Library) voc ter
uma facilitao no desenvolvimento de pginas JSP, trabalhando com tags
personalizadas. Programadores JSP eventualmente usam JSTL para criar
pginas rapidamente. Este captulo lhe dar a viso geral de JSTL, desde
seus fundamentos bsicos, passando pela internacionalizao da aplicao
at o uso de banco de dados e XML.
CAPTULO

18:

ENTENDENDO CUSTOM TAGS

Este captulo o ensinar a criar tags personalizadas, mostrando como desenvolver aplicaes utilizando caractersticas que envolvem os frameworks,
criando seus prprios componentes.
CAPTULO

19:

ENVIO DE E-MAil

Dez entre dez aplicativos criados para a Web enviam e-mail. Enviar e-mail
atravs de suas aplicaes algo vital para a comunicao com os usurios
de um site. Nesse captulo voc aprender desde a instalar e configurar um
servidor Open Source de envio de e-mail at o envio com autenticao e
arqu ivo anexo. Tambm conhecer uma biblioteca mais simples de envio
de e-mails, facilitando seu traba lho no dia-a-dia.

XVI

I\jl] Desenvolvendo Aplicaes Web com JSP...

CAPTULO

24:

AJAX

Com a exploso do Web 2.0, este livro no poderia deixar de abordar a


construo de aplicaes Web escritas em Java com a adio de Ajax.
Este captulo o ensinar os fundamentos do Ajax, passando pelo uso
de frameworks, incluindo para a utilizao de JavaServer Faces.
ApNDICE A: UM POUCO SOBRE JAVA

Uma introduo linguagem Java no que diz respeito aos seus mais bsicos conceitos, ideal para quem nunca trabalhou com a linguagem.
ApNDICE

B:

CONTEXTO DE DESENVOLVIMENTO WEB EM JAVA

Este apndice o mostrar como desenvolver um contexto para sua aplicao Web utilizando o Tomcat.
ApNDICE C: TRABALHANDO COM DATAS

Este apndice introduz a utilizao da classe SimpleDateFormat, dando alguns detalhes, j que sua utilizao ao longo do livro algo muito comum.
ApNDICE D:

XHTML

Rodar pginas em um browser no seria possvel se a sua sada no fosse em


(X)HTML. Esse apndice introduz um iniciante no desenvolvimento Web na
utilizao das principais tags existentes nessa linguagem de marcao.
ApNDICE

E: O

MvSQL

Existem muitos exemplos em que voc acessa vrias vezes o banco de


dados. Neste livro, o MySQL foi escolhido como o servidor de dados que
voc acessa. Para isso, uma melhor compreenso de sua utilizao necessria. Este apndice o ensinar alguns dos principais comandos que voc
pode utilizar no MySQL, caso no o conhea.

Introduo
CAPTULO

20:

xv

MODEl-VIEW-CONTROllER E DATA ACCESS

OBJECT

Com dois padres de desenvolvimento de aplicaes Java, importantssimos para a elaborao de pginas Web dinmicas, voc aprender o que
significa MVC (Model-View-Controller) e DAO (Data Access Object) e
como aplic-los em seus sistemas.
CAPTULO

21:

JAVASERVER FACES

Este captulo o ensinar os fundamentos existentes para desenvolver uma


aplicao Web com o uso do framework oficial da Sun Microsystems .
apresentada a tecnologia de forn1a gradual, passando dos passos bsicos,
internacionalizao da aplicao, utilizao de banco de dados com o padro DAO at a paginao de resu ltados e utilizao de estilos.
CAPTULO

22:

JAVASERVER FACES E HIBERNATE

Como uma extenso ao captulo 21, esse captulo aborda a utilizao da


tecnologia JSF com um dos frameworks mais utilizados como camada de
acesso ao banco de dados: Hibernate. Voc aprender nesse captulo o que
e como o Hibernate trabalha, dando os primeiros passos na sua utilizao.
Aprender tambm a utilizar sua linguagem, a HQL, e a trabalhar com
anotaes, um recurso novo neste framework.
CAPTULO

23: JAVASERVER FACES E A API

DE PERSISTNCIA EJB

A camada de persistncia recentemente lanada pela Sun em sua nova verso do Java EE tem agitado muito os desenvolvedores ao redor do mundo.
Neste captulo voc aprender a criar acesso a banco de dados utilizando a API de persistncia EJB3, conhecendo a linguagem JPQL e aplicando seus desenvolvimentos a uma interface criada pelo framework JSF.
Tambm se aprofundar na utilizao de anotaes, criando inclusive relacionamento entre objetos para pesquisa em mltiplas tabelas no banco de
dados.

.........
. . .

Captulo

1
Como a Web Trabalha?

STECAPTULO TEMO INTU ITO DE ENSIN- LOCOMO AW EBTRABALHA, uma vez


que voc pode ser um iniciante nessa rea. Se esse no for o seu caso,
ainda assim, d uma lida no contedo . Algumas vezes deixamos despercebido um ou outro detalhe e isso nos causa problemas no momento em que
estamos desenvolvendo . Afinal, importante saber o que est acontecendo
antes mesmo de saber como fazer .

Protocolos, Pedidos e Respostas


Existe um conjunto de protocolos que auxiliam o mapeamento de aes
dos usurios do lado cliente no uso de aplicaes Web.
A Web uma aplicao cliente/servidor em grande escala, onde o
cliente (um navegador Web ou um programa FTP) se conecta ao servidor
usando um protocolo. O mais comum desses protocolos o HTTP (Hypertext
Transfer Protocol), onde em uma requisio do browser devolvido pelo
servidor textos e imagens.
Esse protocolo trabalha com pedidos e respostas

O Protocolo HTTP
O protocolo HTTP comea com uma solicitao, que por sua vez o devolve
com uma resposta. A seguir voc tem as solicitaes desse protocolo:

[J Desenvolvendo Apl icaes Web com JSP...


~

GET - Solicita ao servidor um recurso chamado de solicitao


URl. Os parmetros da solicitao devem ser codificados nessa
solicitao, para que o mesmo os entenda. Este o mtodo mais
usado, pois a forma como o browser chama o servidor quando
voc digita um URL para que ele o recupere.
~ POST - Embora similar ao GET, o POST contm um corpo nos
quais seus parmetros de solicitao j so codificados. O mais freqente uso desse mtodo na submisso de formulrios (X)HTML.
~ HEAD - Similar ao mtodo GET, o servidor apenas retoma a
linha de resposta e os cabealhos de resposta .
~ PUT - Esse mtodo permite o envio de arquivos par ao servidor
Web .
~ DELETE - Permite a excluso de documentos dentro do servidor
Web.
~ OPTIONS - possvel fazer uma consulta de quais comandos
esto disponveis para um determinado usurio.
~ TRACE - Permite depurar as requisies, devolvendo o cabealho de um documento .

O Pedido Via GET


Aps enviar a solicitao, o navegador pode enviar alguns cabealhos que
fornecem informaes a respeito da solicitao, seu contedo, o browser
que enviou sua solicitao e etc. Os cabealhos aparecem em linhas consecutivas. Se voc faz um pedido via GET a um endereo Web, como
www.integrator.com.br. voc recebe as seguintes informaes:
GET / HTTP/ 1.1
Host: www . integrator.com .br
User-Agent : Mozilla/ 5. 0 (Windows; U; Windows NT 5.1; pt-BR;
r v :1. 8 . 0 .4) Gecko/2006 05 08 Firefox / 1 . 5 .0.6
Connec t i on: Keep-Alive

De incio voc tem o mtodo utilizado para fazer o pedido dos dados,
no caso o GET, seguido de uma barra "/", indicando que a informao

Como a Web Trabalha?

f\I 3

requisitada direta a raiz do domnio. Caso haja um chamado a um diretrio


especfico, tambm chamado de Diretrio Virtual , voc veria GET /
diretorio/ HTIPIl.1 , indicando que o diretrio faz parte da raiz, contendo
o nome indicado logo aps, o que no caso seria diretrio . H tambm uma
outra situao, a de enviar uma string de consulta, conhecida como query
string, podendo tambm ser visto da seguinte forma: GET /web/
?empresa=Integrator%20Technology%20and%20Design. Nesse caso,
voc ver o caractere especial de interrogao "?", indicando que existe
uma string de consulta, seguido do nome da varivel chamado no caso de
"empresa", um sinal de igual indicando a atribuio de valor e o valor da
varivel logo em seguida. No caso indicado , voc tambm v uma
codificao da URL, comum nos browsers modernos, onde o espao, por
exemplo, substitudo por %20. Na mesma linha voc tem o protocolo
usado, chamado de HTTP verso 1.1: "HTTP/l.l" O protocolo HTIP 1.1
se trata de um protocolo que implementa a possibilidade de ter mltiplos
hosts sobre um mesmo IP, conhecidos como Virtual Hosts.
Na segunda linha voc tem o Host, que indica o objetivo do pedido,
no caso o endereo digitado. Essa informao uma exigncia do protocolo HTIP 1.1, pois como j foi dito, em uma maquina pode haver mltiplos
hosts, e o servidor precisa saber para qual host ele deve apontar.
A terceira linha voc tem o cabealho User-Agent, que acessvel ao
servidor e ao cliente, onde indica o browser que voc est usando, bem
como o sistema operacional e a lngua usada. A quarta e ltima linha se
trata do cabealho Connection, que tipicamente tem o valor de Keep-Alive .

O Pedido Via POST


Um pedido via POST muito similar ao pedido via GET, mas se diferencia
pela quantidade de informaes que podem ser transmitidas por essa forma .
Tipicamente, voc veria os seguintes cabealhos em um pedido via
POST:
POST / H'I"rP / 1. 1

Host: www.integrator.com.br
User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; pt-BR;

[iiIJ Desenvolvendo Aplicaes Web com JSP...

rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4


Content-Type: application/x-www-form-urlencoded
Content-Length: 57
Connection: Keep-Alive
empresa=Integrator%20Technology%20and%20Design&nome=Edson

A primeira linha indica o mtodo utilizado, no caso o POST. Os cabealhos HOST e User-Agent so iguais ao do mtodo GET.
O cabealho Content-Type indica como o corpo do pedido codificado. Os browsers sempre codificam os dados postados como application/
x-www-form-urlencoded, que o MIME type usado para codificar URL
simples (similar ao %20 explicado anteriormente no mtodo GET).
O cabealho Content-Length indica o comprimento de bytes transmitidos, que no caso so 57. Aps o cabealho Connection voc tem uma
linha em branco, seguida das informaes transmitidas pelo mtodo. Nesse
caso voc tem a transmisso de duas variveis (empresa e nome), seguidas
de suas respectivas informaes. Note o & "e - comercial", tido como o
separador padro utilizado para envio de mais de uma varivel.

A Resposta HTTP
A resposta HTTP tem uma linha de status (como a de solicitao) e cabealhos de resposta, assim como o corpo de resposta opcional.
No caso de voc entrar em um site e ele estiver disponvel, voc teria
a seguinte resposta:
HTTP/1.1 200 OK
Date: Sat, 15 Apr 2006 18:21:25 GMT
Content-Type: text/htrnl;charset=ISO-8859-1
Content-Length: 2541
<htrnl>
<head>
<title> Integrator Technology and Design </title>
</head>
<body>

Ijl] Desenvolvendo Aplicaes Web com JSP...


~

FTP - Sigla para File Transfer Protocol, onde muito usado para
transmisso de arquivos para um servidor. Fornece os principais
comandos para troca de arquivos .
SMTP - Sigla para Simple Message Transfer Protocol, e fornece
os comandos necessrios para envio de mensagens a um servidor
de e-mail.
POP - Sigla para Post Office Protocol, onde permite que um
cliente acesse e manipule mensagens de correio eletrnico disponveis em um servidor.
IMAP - Sigla para Internet Message Access Protocol e permite
que um cliente acesse e manipule mensagens de correio eletrnico disponveis em um servidor, assim como ocorre no protocolo
POP.

Como a Web Trabalha? l\J

Existem respostas no qual o servidor encaminha ao browser, onde contm um nmero, indicando um problema ocorrido. Os mais comuns so:
~ 200 (OK): Confirmao de que a requisio foi respondida com
sucesso.
~ 304 (NOT MODIFIED): Os recursos no foram modificados desde a ltima vez quem que voc fez um pedido. Isso ocorre por
causa dos mecanismos de cache do browser.
~ 401 (UNAUTHORIZED): O cliente no tem acesso autorizado
para acessar a rea requisitada. Pode ocorrer de o browser pedir
um nome de usurio e senha, devido ao acesso restrito a essa rea
no servidor.
~ 403 (FORBIDDEN): O acesso rea requisitada falhou. Isso pode
ocorrer em caso de acesso a reas que exigem login e senha e no
houve autorizao para aquele usurio.
~ 404 (NOT FOUND): No encontrado. Ocorre quando voc tenta
acessar uma rea inexistente no endereo passado, por exemplo,
pginas removidas ou recursos excludos.
O servidor devolver um cabealho Date que indica a data e hora em
que a resposta foi gerada no servidor. O cabealho de Content-Type especifica o MIME type para HTML (textlhtml) com uma codificao ISO-88591 (padro para recursos cujas informaes contenham acentos, como ocorre em nosso idioma) . O cabealho Content-Length similar ao visto em
POSTo O restante so informaes que sero exibidas no browser, ou seja,
o contedo, propriamente dito, do site .

Outros Protocolos
No menos importante que o protocolo HTTP, voc tem tambm os seguintes protocolos disponveis na Internet:
~ Tep - Sigla para Transport Communication Protocol representa
a camada de transporte de dados e comunicao entre mquinas,
cliente e servidor.
~ HTTPS - Similar ao HTTP, mas com SSL (Secure Socket Layer)
sobre esse protocolo, possui criptografia que assegura a troca de
dados entre cliente e servidor, evitando assim a leitura dos dados
por terceiros que no contenham a chave da criptografia.

..... ..... .....

Captulo

2
A Linguagem Java

E TEM POS EM T EM PO S O M UN DO CONII ECE UMA GRANDE M UDANA. No mun


do do desenvolvimento, uma delas aconteceu quando Java foi anunciado, em maio de 1995, pela empresa Sun Microsystems, no qual lanava
naquele momento uma linguagem de programao que trabalhava em sites
produzidos na World Wide Web.
O que chamava ateno nessa linguagem era o fato de que ela podia
ser portvel para outros sistemas operacionais. Alm, sua fama cresceu
rapidamente porque a Web como conhecemos hoje estava em ascenso, e
Java possibilitava fazer diversas coisas, como animaes, que at ento
no eram possveis em pginas existentes na World Wide Web.
Seu tamanho tambm era um fator importante, onde depois de instalado uma mquina virtual em sua mquina, os arquivos Applet, como so
conhecidos at hoje, eram pequenos assim como a velocidade de transmisso na poca, o que facilitava a visualizao desses aplicativos.
O Java amadureceu e com as mudanas ocorridas no mundo, muitas
implementaes foram criadas, com o intuito de abranger essas mudanas.
Hoje voc pode estar usando tanto aplicativos desktop, pginas para a
Internet ou at mesmo aplicativos pequenos em celulares. Todos criados
com a linguagem Java.
A linguagem Java nos dias de hoje utilizada por grandes bancos,
pois fornece extrema segurana. Tambm utilizada por grandes empresas
que desejam trafegar uma grande quantidade de dados e necessita de estabilidade e portabilidade entre outras empresas .

8 llI Desenvolvendo Aplicaes Web com JSP...


Milhes de pessoas j aprenderam essa linguagem e, grandes empresas a esto usando. Lugares como a NASA, IBM, ESPN entre outros so
apenas exemplos da confiabilidade que a linguagem Java demonstra em
seus utilizadores.
As variaes de formas e sistemas criados em Java so imensos. Voc
encontra Java em:
~ Servidores Web
~ Bancos de dados relacionais
~ Computadores de grande porte
~ Telefones mveis
~ Sistemas de carto de crdito entre outros

Instalando o Software de Desenvolvimento Java


Atualmente, o SDK (Software Development Kit) est em sua verso 5 e
est disponvel para as seguintes plataformas:
Microsoft Windows
Linux
Sun Solari s
Mac Os
Entre outros

Voc pode baixar o programa no site Web sobre Java da Sun no endereo http://java.sun.com.
A Sun publica periodicamente releases do SDK e costuma numerlos com um ponto extra e um dgito logo aps o nmero da verso principal, como por exemplo: 1.4.1,1.5.0.1 e etc.

Cuidado na hora de baixar o kit de desenvolvimento, pois existem outros kits, no qual o que voc precisar est descrito logo
a seguir.

. . .. ........... .......... . ... ....... . . . ...

A Linguagem Java llJ

Fazendo Download do Java SE 5.0 JDK

o primeiro passo para que voc comece a desenvolver programas em Java,


consiste em obter o Kit de Desenvolvimento Java, que at o momento em
que esse livro escrito, est na verso 1.5, atualmente conhecido como
Java SE 5.0. Para conseguir o Java SE 5.0 JDK voc deve acessar o endereo: http://java.sun.com/javase/downloads/index.jsp.
Aps acessar o endereo anterior, a pgina de download do Java SE
5.0, voc ver vrios produtos, referentes ao Java SE, para download. Logo a
seguir voc ter uma descrio dos mais utilizados pelos iniciantes em Java:
~ JDK 5.0 with NetBeans IDE - Consiste em uma IDE (Ambiente
de Desenvolvimento Integrado - como o Eclipse) mais o Java SE
5.0 JDK.
~ JDK 5.0 with Java EE - Consiste em modelos de componentes,
gerenciamento, web services e APIs de comunicao necessrios
para o desenvolvimento de aplicaes Web mais o Java SE 5.0
JDK
~ JDK 5.0 - Este o kit de desenvolvimento Java. Este kit consiste
em um compilador Uavac), uma ferramenta de execuo Uava),
uma ferramenta para gerao de documentao Uavadoc), um conjunto de bibliotecas prontas para o uso e etc.
~ Java Runtirne Environrnent (JRE) 5.0 - Este o ambiente
runtime do Java, usado apenas para executar os programas feitos
em Java.
~ J2SE 5.0 Docurnentation - A documentao do J2SE. Esta documentao contm as informaes sobre todas as bibliotecas do Java.
Clique no link Download JDK, a pgina de termos de uso (Terms ofUse)
ser mostrada, para efetuar o download do JDK, voc deve aceitar os termos de uso do Java SE, clique na caixa de checagem "Accept" e em seguida no boto "Continue". Em seguida a pgina de Download ser carregada.
Observe que na pgina de Download existe diversos Java SE. Existe
Java SE para plataforma Windows, Linux, Solaris SPARC, Solaris x86 e
Linux AMD64. No seu caso voc efetuar o download do Java SE para o
seu sistema operacional.

10 lI

Desenvolvendo Aplicaes Web com JSP...

A Instalao do J2SE 5.0 SDK no Windows


Aqui, neste exemplo, eu irei abordar a instalao do SDK na plataforma
Windows, mais especificamente no sistema operacional Windows XP.
O mesmo processo se aplica as outras plataformas Microsoft.
Aps efetuar o download do SDK, d um duplo clique no arquivo
executvel. No momento em que escrevo esse livro, a verso baixada era
j d k-I_5_O_I O-wind ows-i586-p.exe.

Figura 2 .1

A primeira etapa da instalao a tela de licena. Clique na caixa de


seleo "[ accept the terms in the license agreement", e clique em "Next".
Esta tela descreve os temos de licena do J2SE 5.0 JDK.

A Linguagem Java !'il 11

Please read the folowin rlCense areement careful1y.

Sun Microsystems, Inc. Binary Code License Agreement


lo,lhe JAVA 2 PLATFORM STANDARD EDITION DEVELOPMENT KIT 5.0
SUN MlCROSYSTEMS, INC. ("SUII") IS VII1LLNG TO LICENSE THE SOFTWARE IDENTIFIED
BELO'I/II TO VOU 0NlY UPON THE CONDlTlON THA T VOU AceEPT ALL OF THE TERMS
eONTAINED IN THIS BlNARY eODE LICENSE AGREEMENT ANO SUPPLEMENTAL UCENSE
TERMS (COLLECTIVEL Y "AGREEMENT"). PLEASE READ THE AGREEMENT CAREFULL Y . BY
DO\MIILOADING OR INSTALUNG THS SOfTWARE, VOU ACCEPT THE TERMS OF THE
AGREEMENT. INDICATE ACCEPTANCE BY SELECTING THE "ACCEPT" BUTTON AT THE
BOTTOM OF THE AGREEMENT. IF VOU ARE NOT VII1LLlNG TO BE BOUND BV ALL THE TERMS,
SELECT THE "DECLINE" BUTTON AT THE BOTTOM OF THE AGREEMENT ANO THE
cil

0[A~~~.J~~Li[I~~nSe ~~.I!!Jl..e$

O I 110 not accept the terros in the !icense ag,eement


In~t,;:l5hield------------------------

Mext

>

Caneel

Figura 2 . 2

Na segunda etapa, voc tem a tela de configurao. Nesta tela voc


pode configurar o tipo de instalao que deseja .. Clique apenas no boto
"Change... " se desejar alterar o diretrio onde o J2SDK ser instalado.

Select the program features vou want instaDed.


Select optloMI features to instaM from the list below. Vou can chane your cholee of featlXes after
Installatlon by using the Add/Remove Prorams utility In the Contro! Panel
Feature Description

J2SE Development Kit 5.0,

V"

including private JRE 5.0. This


win ,equir. 264 M8 on your hard
drive.

Demos
Source Code
Public JRE

InstaU to:
C:\Arquivos de programas\Java\jdkl .5.0_10\
lr,~'t~~nShield

Change ...

...._.- ..................._. __.. __..._._- ..- ................._...._......... _ .._..

< 8ack

Figura 2.3

li:

Next

>

II

Caneel

12 llI

Desenvolvendo Aplicaes Web com JSP...

Alterando o diretrio de instalao do J2SDK:


Caso voc queira alterar o diretrio onde ser instalado o J2SDK, na
caixa "Folder Name" altere seu caminho para C:\jdk1.5.0_10\, deixando
igual ao da Figura 2.4 e clique no boto "OK", para retornar a tela anterior. Clique no boto "Next" em seguida.

Browse to the destination folder.


~ookin:

[L' r:::J
=,-_.j-_dk_1._5._
~_;_'''_
-_-_-'~_-__
-~~==_
--_.

_____.!~~.JJ:2J

I d1

Eolder name:

1C::\jdkl .5. 0~10\


Install5hield - - - - - - - - - - - -- - -- - - - - - - -

OK

J[

Cancel

Figura 2.4

Aguarde at o fim do processo de instalao do J2SDK.

A Linguagem Java l\jl]

13

lhe pr09'am foatures you selected are bei>Q instaled,


PleMe wait whIIe the Instai Wzard Installs J2SE Developmert KIt 5,0
Update 10, lhls may take severa! mirutes,

Status:

.....

In~'l5hie!d-----------------------

Ne>t>

Figura 2.5

Na Tela de Configurao do Runtime do Java (Figura 2,6) clique no


boto "Next" para continuar, no necessrio mudar o diretrio,

Select the pr0'7l11l\ features you want nstaled,

lhe J2SE Runtme Envi'orvnert wlh support for European l.w,)uaQes ... be Instaled, Select
opttonal features to instai f,om the 1st below,

m.r--~l

1F~1Elmm,
~

.- E3 o
'So Support for Ac:kitionallanouaoes
.... G3 o Additional Font and Media Support

Feature Description
lhe J2SE Rlrime Envirorvnert wlh
European Ianguaoes, lhis 'eq.Jires
131 "'" on your hard drlve,

Instai to:
C:\ArquivoS de pr09'amas\Java\,et.5,0_10\
Change",
lnst~'IS."'e;d

- - - - . - - - - - - - - - . -....---.-.--.-.-...--....-..----.-.....
Next >

Figura 2.6

,I I

Cantei

14

l)jIJ Desenvolvendo Aplicaes Web com JSP...

Nesta etapa voc habilita os browsers para suportar programas desenvolvidos em Java, os Java Applets (Figura 2.7). Depois clique no boto
"Next" e aguarde os arquivos serem copiados.

Browser Registration

Select the browsers you want to register with Java(TM) Plug-In.

Microsoft Internet Explorer

Mozllla and Netscape

Vou may change the settings later In the Java(TM) Contro! Pane!.

InstaI!Sh : e ! d - - - - - - - -- - - - - - - - -- - - - - - -

< Back

I'

Next

>

JI

Cancel

Figura 2.7

Pronto, o processo de instalao do J2SE 5.0 JDK, bem como o


Runtime do Java foram completamente instalados. Clique no boto "Finish"
para finalizar.

A Linguagem Java

(1jjl]

15

Installation Completed

The Install Wizard has successfully installed J2SE Development


Kit 5.0 Update 10. CUck Finish to exit the wizard .

.: Back

Finish

Figura 2.8

CONFIGURAO DO KIT EM SEU AMBIENTE OPERACIONAL

Um problema muito comum encontrado nos iniciantes em programao


Java a configurao do kit no seu ambiente operacional.
Para configurar qualquer varivel de ambiente em um sistema Windows
na verso NT, voc deve entrar no Painel de Controle, S istem a e na guia
Avanado clique no boto Variveis de Ambiente.

16

[lij Desenvolvendo Aplicaes Web com JSP...


Cfl~

Proprit'dadcs do sistema

Avanado
Pala tia!' o mlcino Pfoveito destas ekCfo6eS. prccito lCf IClto Iogon como

_bm.

Oes:err()enho

Elci.os: visuais. ~o de processadot. U$O de memria e


mem6f~vit~

Peths: de llluilrlO

ConIigua6es da Alea de tlabah> relativas

seu Iogon

lricial:!aoo o re~a:SO
I~Ofmaaet

sobre riciaizalo

depuoJo

Clique aqui para acessar as


variveis de ambiente do
'----------"-----~I sistema operacional Windows
...-:-:-,-,-----,..-----1

c......

I L........,r----,--------------.J

Figura 2.9

As variveis de ambiente so seqncias de caracteres que contm informaes como unidade, caminho ou nome de arquivo.
As varive is de ambiente controlam o comportamento de vrios programas. Como exemplo de variveis de ambiente tem:
PATH, CLASSPATH, USER, TEMP, JAVA_HOME e etc. Estas
variveis de ambiente so utilizadas por muitos programas, para
definir um espao em memria principal (RAM), onde alguns
processamentos sero executados.

A varivel PATH contm uma lista de diretrios (caminhos de programas) separados por pontos-e-vrgulas.
V at o fim da varivel e adicione um ponto-e-vrgula, se esse j no
houver, e adicione o caminho onde seu SDK est instalado, seguido do
texto \bin, que neste caso seria (Figura 2.10):
C:\ j dkl .5.0_1 0\bin ;

A Linguagem Java ll 17

L1)rg)

Editar varivel de sistema


!!Lome da varivel:

IPath

!'.alor da varivel:

l os comuns\Adobe\AGL;C:\jdkl.5.0_10\bin

~=========~I

t ,.
r

OK

'vl

Cancelar

Variveis do sistema
Varivel
NUMBER_OF_P ...
OS
Path
PATHEXT
PGLOCALEOIR

!,~ ;

Valor

.w....... ......."'.....>~.,-."''''''_.''',,.-

~indows_NT

C:\Arquivos de prOiramas\Borland\Oelp ..
.COM; .EXE; .BAT; .CMO;. VB5;. VBE; .)5; ....
C: \Arquivos de progr <!Im<!ls\Postgre5QL \.. .
Nova

II

Editar

OK

I[

~
~1;

Excluir

I [ Cancelar

Figura 2.10

Confirme as caixas de dilogos e logo aps faa o teste.


TESTANDO A CONFIGURAO DO

J2SDK

Aps a configurao do J2SDK, voc dever fazer um teste para ver


se tudo ocorreu com sucesso. O processo de teste consiste em abrir o Prompt
de comando do Windows:
Boto Iniciar, Todos os programas, Acessrios e finalmente Prompt
de comando.
Na tela do prompt de comando digite java -version:

18
c\

Desenvolvendo Aplicaes Web com JSP...

IIElEl

Prolllpt de comando

:'>java -ve~ s ion


"ava vers ion "1 .. 5 .. 0J0"
ava(TI1) 2 Runt iflle Envil-onfllent. Standal'd Edition (build 1. 5. 0....10-b03>
ava HotSpot<TI1> Client UI1 (build 1.5.0....10-b03. fIIixed mode. s hal'ing>

:,>

Figura 2.11

EM

WINDOWS VERSO

9x

Voc deve editar o arquivo autoexec.bat , encontrado em


C:\autoexec.bat e adicionar as variveis como o exemplo a seguir:

Onde o local indicado no exemplo, onde voc tem instalado o JDK.


INSTALANDO O

J2SE 5.0 JDK

NO LINUX

Aps a concluso do download do SDK, abra o terminal do Linux e


siga os passos a seguir. No momento em que escrevo esse livro, a verso
baixada era jdk-l_5_0_10-linux-i586.bin.
Digamos que voc tenha baixado no diretrio /tmp, como foi o caso
na elaborao desse livro. No se esquea estar como root para fazer a
instalao.
No terminal digite os comandos a seguir em destaque:
Para entrar no diretrio, caso voc j no esteja nele:
shell # cd / t mp

A Linguagem Java lI 19

Alterando a permisso do arquivo para executvel, assim voc poder


instal-lo:
shell# chmod +x jdk-l_5_0_10-1inux-i586.bin

Executando o arquivo:

Sle

~ dit

~iew

rerminal Tabs

I::!elp

edson@ntegrator:-$ cd I t nl> /
edson@integrator : /tfTll$ chmod +x Jdk- 1_5_o_10- li nux - i586. bin
edson@ntegrator:/tl1l'$ .tj dk 1_5_o_10 linux 586. bn I

Figura 2 . 12

Assim que iniciar a instalao, voc ver a tela de licena da instalao, como mostra a imagem seguir (Figura 2.13):

20 ll

Desenvolvendo Aplicaes Web com JSP",

tile ,dit lli.'" Ierminal lObs tjelp


Sun Microsystems. Ine . Binary code License Agreement
for the JAVA 2 PLATFCf1M STAl'VAR) EDITION OEVROPi'ENr
KIT 5.0
~ MICROSYSTEMS, INC.
( ' SUN') 15 WILLING TO LICENSE
TH: SOFTWARE IDENTIFIED ElELo.I TO YCJJ QN..Y LPON H
CONDITION THAT YCJJ ACCEPT ALL CF TH: TERMS CONTAIr-ED IN
THI S 81 NAF(( CODE LI CENSE AGREEi'ENr AI'V S1..PPLEMENT AL
LICENSE TERMS (COLLECTIVELY 'AGREEi'ENr'). PLEASE READ
TH: AGREEMENT CAREFLLLY . 8Y oa.or-LOADI NG OR I NST ALLI NG
THIS SOFTWARE, YCJJ ACCEPT THE TERMS CF TH: AGREEi'ENr.
lNOICATE ACCEPTANCE 8Y 5aECTING H 'ACCEPT' 8lITTON AT
TH: 80TTOM CF TH: AGREEi'ENr. I F YCJJ ARE NOT WI LLI NG TO
ElE 80LNl 8Y ALL THE TERMS, SELECT TH: 'OECL lr-E ' 8lITTON
AT THE 8OTTOM DF TH: AGREEf-ENT foN) TH: DCWNLOAD OR
INSTALL PAOCESS WILL NOT CONT I r-I...E.

1. OEFINITIONS . SOftware- means the identlfied above


in binary form, any other ma chine readable materials

(including, but not limited to, libraries, 50urce

h les, header files, and data files), any updates cr


errar corrections provided by Sun, and any user

Figura 2.13

Para visualizar toda a licena, use as setas para cima e para baixo do
seu teclado. As teclas Page Up e Page Down tambm podem ser usadas.
Ao final voc ver a pergunta de que aceita os termos de licena "Do
you agree to the above Iicense terms? [yes or no]". Digite y (Figura 2.14):

Eile ,di! llie", Iorminal Tabs tjelp


Agreement.

G. Third party Cade. Additional copyright natices and


hcense terms applicable to portions of the Software
are set forth in the THIRDPARTYLlCENSEFeADME. txt file.
In addltion to any terms and conditions of any third
party opensource/freeware license identified in the
THIROPARTYLlCENSEREADI'E. txt fi te, the disctai mer of
warrallty olnd limi tation of liabi li ty provisions in
paragraphs 5 and 6 of the Binary Code License Agreement
shall apply to olll SOftware in this distribution.
H. Termination for Infringement. Ei ther party may
terminate this Agreement i/T'fTlediately should any
SOftware become, ar in either party's opinion be lik,ely
to become, the subject of a claim of infringement of
olny intellectual property rig,ht.
For inqui ries please contact: Sun Microsystems, Inc.,
4150 Network Ci rcle , santa Clara, California 95054,
U. S. A.

(LFI'1 43333/Form 10#011801)

Do Vou agree to the above license terms? {yes or no}


y

Figura 2.14

A Linguagem Java [Ijl] 21

A instalao ser iniciada. Ao seu trmino, mova o diretrio criado


para o local que voc achar mais indicado ou para um outro diretrio se
desejar (Figura 2.15):
shell# rnv

jdk1 . 5 . 0_10

/ usr !loca1/

610 edit llio'" rorminal Tabs t:lelp


infiang: i dkl. 5 . O_IO/man/J a_JP . eucJP/ma~il~onso le ~ 1
innating: 1dkl. 5. O_IO/man/j a_JP. oucJP/man l /idb.1
innating: i dkl. 5 . O_IO/man/i a_JP. eucJP/manl/i info.l
innating: i dkl. 5 . O_IO/man/i a_JP. oucJP/manl/ imap . I
innating: 1dkl . S.O_IO/man/j a_JP. oucJP/manl/jps.1
,nnating: ldk I. S.O_IO/man/j a_JP . eucJP/manlli sadebugd.1
inna ting: jdkl. S.O_IO/manl a_JP . oucJP/manl/j stack.1
,nnating: 1dk I. 5. O_IO/man/j a_JP. oucJP/manl/ j stat.1
innating: 1dk I . 5. O_IO/man/j a_JP. oucJP/manl/j statd.1
inna ting: idkl. S.O_IO/man/ i a_JP. eucJP/manl/nati ve2ascli.1
innating: )dk 1. 5. O_IO/man/ ja_JP. eucJP/manl/rmic. I
innating: idkl. 5. O_IO/man/i a_JP. eucJP/manl/soria lver.1
innating: )dkI.S.O_IO/man/ia_JP.oucJP/manl/idli.1
Cr.ating idk 1. 5. o_lO/lib/too lo . i ar
cr.ating i dkl. 5. 0_10/ j re/lib/rt. i ar
ereating j dk 1. 5. 0_10/ j re/lib/j sse . i ar
Creating j dk 1.5. O_lOtj r e/tib/charsets. j ar
e r oati ng i dk I. 5. 0_10/ i ro,hb/oxt/localedata . i ar
eroating jdkl. 5. o_lo/i re/lib/p lugin. j ar
er.ating idkl. 5 . O_IO/Jre/lib/i ava...s . j ar
Croating idkl. 5. o_lO/i ro/hb/doploy . j a r
Dane.
root@integrator:/trrpl mv jdk1.5.0_101 /usr/local ll

--.

o)

Figura 2.15

Entre no arquivo profile em /etc/profile e adicione as linhas:


JAVA_HOME=/ jdkl.5.0_10
JRE_HOME=/ jdkl.5.0_10/jre
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/lib
export MANPATH=$MANPATH:$JAVA_HOME/man

As variveis usadas so explicadas rapidamente a seguir, dando a voc


noo do que cada uma faz:
JAVA HOME - Diretrio onde a JDK est instalada
JRE_HOME - Diretrio onde a mquina virtual est instalada

22 I\l Desenvolvendo Aplicaes Web com JSP.. ,


PATH - Diretrio dos executveis, onde inclui o do Java
CLASSPATH - Diretrio das libs
MANPATH - Diretrio do manual, acessvel por man javac,
java -version
Surgindo as informaes, a instalao foi feita com sucesso .
e
81e

;:dit

~ew

Ierrninal T3bs

' !

~elp

roo t {li ntegrator: Itmp# Java . version


java version -1.5.0_10
Java(TM) 2 Runtime Environment , Standa rd 81ition (build 1.5.0_10.b03)
Java HotSpot (TM) Client VM (bui ld 1. 5.0_10 b03, mixed mode, sharing)
root@integrator:/ t "1" I

II
I

Figura 2.16

... ..... ....


.Captulo

3
Fazendo Funcionar o Java
na Web

ARA QUEo JAVA FUNCION E EMAPLICAES ESC RITAS PARA WEB, voc precisa
r de um Container Servlet. Um container Servlet pode ser um servidor, servindo todos os tipos de aplicativos Web, ou a integrao de um,
trabalhando exclusivamente para servir pginas escritas em Java. Atualmente no mercado existem diversos servidores e containeres, sendo os mais
famosos: Apache Tomcat, Red Hat JBoss, IBM WebSphere e etc .
Neste livro voc trabalhar exclusivamente com o Tomcat, facilitando assim sua compreenso com relao ao trabalho de um container Servlet.

O Tomcat
Tomcat tem suas origens no incio da tecnologia servlet. A Sun Microsystems
criou o primeiro continer servlet, o Java Web Server, para demonstrar a
tecnologia, mas no era um servidor robusto, para uso na Web como se
necessitava. Ao mesmo tempo, o Apache Software Foundation (ASF) criou
JServ, um servlet engine que integrava com o servidor Web Apache.
Em 1999, a Sun Microsystems doou o cdigo do Java Web Server
para o ASF, e os dois projetos se fundiram para criar o Tomcat. A verso 3.x
foi primeira da srie Tomcat e teve a descendncia direta do cdigo original que a Sun Microsystems doou ao ASF.
Em 2001, oASF liberou a verso 4.0 do Tomcat, que era uma completa arquitetura redesenhada do Tomcat no qual teve um novo cdigo base. A

24

[)il] Desenvolvendo Aplicaes Web com JSP...

srie Tomcat, verso 4.x um RI (reference implementation) de


especificaes Servlet 2.3 e JSP 1.2.
A verso Tomcat 5.x a atual e a RI de especificaes Servlet 2.4 e
JSP 2.0, no qual esse livro est baseado. Embora exista a verso 6.0 a caminho, ela no foi empregada por estar em uma verso no instvel, alpha, at
o momento em que esta obra escrita.
Tecnicamente, o Tomcat um Container Web (como j dito anteriormente). Mas o Tomcat tem a capacidade de atuar tambm como servidor
Web/HTTP assim como pode funcionar integrado a um servidor web dedicado como o Apache ou o Microsoft IIS. O Tomcat, porm, no implementa
at.o momento um container EJB .

Servlets e JSP
J2SE (Standard Edition) planejado para desenvolvimento do lado cliente
e pode ser usada para desenvolver as tradicionais aplicaes baseadas em
cliente/servidor.
As aplicaes para Web esto aladas em Java EE (Enterprise Edition).
A implementao de aplicaes Web usando o padro Java EE bastante
complexa.
Servlets e JSP so duas tecnologias desenvolvidas pela Sun
Microsystems para desenvolvimento de aplicaes Web a partir de componentes Java que executem do lado servidor.

Instalando o Torncat
Para instalar o Tomcat, inicialmente, voc dever ter tambm instalado o
Java em sua mquina.
Se voc apenas for rodar aplicaes no Tomcat, basta ter o JRE (mquina virtual do Java) instalado. Mas se voc desenvolve, o ambiente JDK
dever estar instalado (como j visto anteriormente).
A srie estvel de verses 5.5.x para o Tomcat 5, uma ramificao da
srie 5.0.x, focada para o J2SE 5.0, com uma nova modelagem de vrios
componentes estruturais visando maior desempenho, estabilidade e facilidade de manuteno. Para quem utiliza o J2SE 1.4, o Tomcat 5.0.x ainda
o mais recomendado. O uso do Tomcat 5.5 com J2SE 1.4 requer o download

Fazendo Funcionar o Java na Web ~ 25

e instalao de um pacote adicional de compatibilidade Uakarta-tomcat5.5.?-compat.zip ) .

A Instalao do Torneat
Instalar o Tomcat simples como no caso do JDK. Voc dever baixar a
verso desejada no site. Entre no link http://torncat.apache.org/download55.cgi e selecione a distribuio binria desejada.
No WINDOWS

Existe mais de uma forma de instalar o Tomcat na sua mquina, em


Windows. Em Binary Distributions, na pgina, voc tem o item Core,
que permite selecionar o arquivo compactado "zipado", "tarball" ou como

Windows Executable.
Como executvel voc ter a instalao em forma de assistente. No
caso, iremos dar preferncia ao arquivo compactado, baixando para o
Windows no formato zip.
Descompacte-o e coloque-o em um diretrio chamado de Torncat,
tomando assim fcil o seu acesso ao diretrio.
Se voc der preferncia pela instalao por assistente, voc poder
rod-lo como servio ou no, dependendo de voc.
ADICIONANDO A VARIVEL CATALlNA

HOME

%CATALINA_HOME% o diretrio onde voc escolheu para instalar o


seu Tomcat. No Windows, em verso NT, faa o mesmo procedimento executado anteriormente no caso da configurao do JDK.
Crie uma varivel chamada de CATALINA_HOME e coloque em
seu valor o caminho da instalao.
No Windows 9x, voc deve entrar no arquivo autoexec.bat e adicionar a linha:
set CATALINA_HOME=C:\tomcat

Lembrando que o caminho apresentado o local onde eu escolhi para


instalao do Tomcat.

26

ljI] Desenvolvendo Aplicaes Web com JSP...

No

LINUX

No Linux voc tem a possibilidade de instalao como no Windows, baixando o arquivo com extenso tar.gz (tarball) ou .zip se assim preferir.
Descompacte o arquivo com o seguinte comando, no diretrio onde
se encontra o arquivo baixado:
shell# tar -xpvzf apache-tamcat-S.S.20.tar.gz /usr/local/tamcat

Aps a descompactao, no arquivo /etc/profile adicione a varivel


CATALINA HOME:
CATALINA_HOME=/usr/local/tomcat<R>export CATALINA_HOME

Iniciando o Tomcat
Aps instalar o Tomcat, voc dever inici-lo. Embora existam dois sistemas operacionais sendo abordados, a inicializao no caso ser idntica,
desde que no haja a instalao por assistente no Windows.

No

WINDOWS

Para iniciar no Windows, v at o diretrio %CATALINA_HOME% e


no diretrio bin d um duplo clique no arquivo startup.bat.
Se voc quiser rodar pelo prompt de comando, execute a seguinte linha:
%CATALlNA_HOME%\bin\startup.bat

No

LINUX

Para o Linux, voc deve iniciar atravs do comando:


shell # $CATALlNA_HOME/bin/startup.sh

Parando o Tomcat
Assim como voc inicia, voc tambm pode parar o Tomcat.

Fazendo Funcionar o Java na Web lI

No

27

WINDOWS

Para parar o Tomcat no Windows use o comando :


%CATALlNA_HOME%\bin\shutdown.bat

Se preferir, voc pode ir at onde o Tomcat est instalado e no diretrio


bin dar um duplo clique no arquivo shutdown.bat.

No

LINUX

Pare o Tomcat com o comando a seguir no Linux:


$CATALINA_HOME / bin /shutdown.sh

O Torneat em Operao
Depois de instalado e iniciado o Tomcat, voc pode v-lo trabalhando
abrindo um navegador e digitando em sua barra de endereos:
http: // l ocalhost: 8080
n - ~~. [~ ~u f~ ._~~~~
' ~ c"~,,,,;~

AaPo

q, . .;p. . t"

r-~ ~:C~~_5.20

. .. 1 ~I
The

Apache SOftware Foundation


http://www .api31che.org/

Ifyou'r....Ing thll page via a w.b browu r, It muni you'v. u tup Tomeat
aucc: ...fulty. Congratulaton. 1
As)Wrt'If)'haYe gueSS6d by now. aiS Is lhe
fowdoo d"M! local II\es,'steln at

00f~

Tomcalholl'ld paga eM be

$CATALINA_HOHE/ ....ebepp!J/ROOT/ lndc)( . j!JP


YIOere '1CATAlNAJ 'O,1E"IS ttIe root Clt lhe TomeDt InstalatlOll o"eclOl\' I yoo're
Se9lflg dls page. 8Odyou donlUlfi( VOU stlOUkJ be. lhen lftl6f VOU'I efthera use.
whO!\as arrived atnewlflSlalatron of Tomcel. or)'Olife an adrnlfllstratorvllO hasnl

oor

tlsIher setl4l (JJIte (i~ PrCMding tI"'.e lanel IS lhG case, piaase refer [O me
Tornear P9cl(ll9!1lalionlor more detailed S(ftL!P anel admrnislJ'atJon irtormaoon [han
IslOll"ldntt"le t.lSTAll file
NOTE : Ths pega isprec~led IYOUCl"lar'l9811.thls page Wllf)()( c~e 51ncell
was COI'T'(lId rto a seMi( ai buld tme (S8e'

fC ...T.u.l)rf.l_lIOU/ wtb.'p./ROOT/vn-IH' I .. ~t= .1I.1 as lo howlt was rr.apped)


NOTE: For tec:urity rUlons, uslng th. admlnlatratlon webapp Ii ru trld.d
to ulen wUh rol. "admln". lhe manag., w.bapp II ru trJctad to Ute,. wtth

rol. "manag."'. Users are delin&d in

Figura 3.1

I c ... n 1.. IN ... _KO Iu:/contlto...::.t -\l!II~u .... l

... ..... .....


.Captulo

4
Introduo aos Servlets

ERVLETS SO CLASS ES JAVA, desenvolvidas de acordo com uma estrutura


bem definida, e que, quando instaladas junto a um Servidor que
implemente um Servlet Container (um servidor que permita a execuo de
Servlets, muitas vezes chamado de Servidor de Aplicaes Java), podem
tratar requisies recebidas de clientes .

Porque Iniciar com Servlets?


Muitos desenvo lvedores iniciantes atualmente vem aprendendo a trabalhar
com Java para aplicaes Web utilizando primeiramente JavaServer Pages
(JSP) e depois acabam conhecendo Servlets. Na verdade, Servlets so
base do desenvolvimento de qualquer aplicao escrita em Java para a Web.
O container Tomcat que voc est usando um Container Servlet.
Como voc ver, mesmo que mais adiante voc termine utilizando
JavaServer Faces, o framework da Sun, ainda assim, voc dever ter conhecimento de Servlets .

Uma Aplicao Servlet


A idia nesse exemplo criar o Servlet de forma simples' e transparente,
para que voc entenda basicamente seu funcionamento.

30

[jlJ Desenvolvendo Aplicaes Web com JSP...

A seguir voc tem um exemplo de Servlet:


MeuPrimeiroServlet.java

package meupacote;
import
import
import
import

java.io.IOException;
java.io.PrintWriter;
javax.servlet.ServletException;
javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
public class MeuPrimeiroServlet extends
javax.servlet.http.HttpServlet
public void destroy( ) {
super.destroy( );

public void init( ) throws ServletException {


super.init( );

protected void service(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=ISO-8859-1");
String html = "<html>" +
"<head><title>Trabalhando com Servlet</title></head>" +
"</head>" +
"<body>" +
"<hl>Meu primeiro Servlet</hl>" +
"< /body> " +
"</html>" ;
PrintWriter out
response.getWriter();
out .print(html) ;

out.close( );

Introduo aos Servlets l'iI 31

o mtodo setContentType(String s) O especifica o tipo de contedo


(MIME Media Types) da resposta para o navegador. O MIME Type ajuda o
navegador a determinar como exibir os dados. O MIME (Multipurpose
Internet Mail Extensions) Type nesse caso "text/html", indicando que a
resposta um documento HTML. Para ver uma lista completa de tipos de
contedo, visite o site http://www.iana.org/assignments/media-types/.
Caso voc altere o MIME Type de sada, seu navegador poder se
comportar chamando o programa que represente a leitura da media no seu
sistema operacional ou ento colocar para download caso no o reconhea .

O Ciclo de Vida de um Servlet


Todo Servlet segue um ciclo de vida composto de 3 fases: inicializao,
atendimento s requisies e finalizao.
A inicializao ocorre quando o Servlet Container carrega o Servlet:
se o parmetro <Ioad-on-statup/> estiver presente e contiver um inteiro
positivo, abordado mais adiante, essa carga ocorre quando o prprio servidor iniciado; caso contrrio, essa carga ocorre quando recebida a primeira requisio a ser mapeada para a aplicao que contm o Servlet.
Aps a inicializao, o Servlet pode atender requisies. Assim, enquanto o servidor estiver ativo, e a aplicao que contm o Servlet estiver
carregada, este permanecer na fase 2 de seu ciclo . Uma vantagem da
tecnologia de Servlets e pginas JSP com relao a outras tecnologias que
o fato do Servlet permanecer carregado permitindo assim com que dados
armazenados em variveis de classe persistam ao longo dos diversos pedidos recebidos. Assim, possvel manter um pool de conexes ao banco de
dados, por exemplo, de maneira que no haja necessidade de iniciar e estabelecer uma nova conexo ao banco de dados a cada novo pedido recebido.
Finalmente, quando o servidor finalizado, ou quando a aplicao
tornada inativa pelo Servlet Container, o Servlet finalizado.

32

[Ii) Desenvolvendo Aplicaes Web com JSP...

Inicializando

Inicializado

serviceO

Servindo os
-destroyO~
Pedidos

Coletando o
lixo e
Finalizando

Figura 4.1 - Ciclo de vida.

cdigo anterior, foi desenvolvido em seu escopo inicial na IDE


Eclipse, onde voc tem um Servlet chamado de MeuPrimeiroServlet. Isso
nada mais que uma classe Java que estende a classe javax.servlet.http.
HttpServlet, uma classe abstrata que estende ajavax.servlet.GenericServlet.
Essa ltima implementa a interface javax.servlet.Servlet, que a fonte de
toda a programao Servlet, onde temos a abstrao central dessa tecnologia.
Todo Servlet implementa essa interface, direta ou indiretamente.
O funcionamento bsico de um Servlet compreende em:
void init (ServletConfig config) - A inicializao do Servlet para
parmetros que podem ser lidos e variveis comuns a todas as requisies
que devem ser inicializadas. Um exemplo disso so as conexes ao banco
de dados estabelecidas aqui, na inicializao.
void service(HttpServletRequest req, HttpServletResponse res)Chamadas ao mtodo de servio, pelo Servlet Container, onde seu servlet
responde as suas solicitaes. aqui onde o Servlet vai interagir com os
pedidos, processar e responder.
void destroy( ) - Esse mtodo libera os recursos que estavam sendo
usados pelo Servlet e chamado quando finalizado pelo servidor em que
est sendo executado.

Introduo aos Servlets

~
~

33

O servlet criado est baseado em HttpServlet/ a classe abstrata


que gera aplicaes web baseadas no protocolo HTIP, No entanto/ a API no foi criada somente para esse protocolo,

interface
Servlet

interface
ServletConlig

+init(config:ServletConfig):void
+getServletConligQ:ServletConlig
+service(req:ServletRequest,res:ServletResponse):void
+getServletlnfoQ:String
+destroyQ:void

+getServletNameO:String
+getServletContextQ:ServletContext
+gellnitParameter(name:String):Slring
+gellnitParameterNamesQ:Enumeration

GenericServlef
+getlnitParameter(name:String):String
+getlniIParameterNarnesO:Enumeration
+getServletConligQ:ServleIConlig
+GetServletContextQ:ServletContext
+init(config:ServletConfig):void
+initO:void
+service(req:ServletRequest,res:ServletResponse):void

HttpServlet
#doGet(req:HttpServletRequest,resp:HtlpServletResponse):void
#doHead(req:HllpServletRequest,resp:HllpServletResponse):void
#doPost(req:HtlpServletRequest,resp:HttpServletResponse):void
NdoPut(req:HllpServletRequest,resp:HtlpServletResponse):void
NdoDelete(req:HtIpServletRequest,resp:HltpServletRespollse):void
#doOptions(req:HllpServletRequesl,resp:HllpServletResponse):void
#doTrace(req:HttpServletRequest,resp:HttpServletResponse):void
Nservice(req:HllpServletRequest,resp:HllpServletResponse):void
+service(req:ServletRequest,res:ServletResponse):void

Figura 4.2

A criao de Servlets exige as classes do pacote javax.servlet e


javax.servlet.http, que pertencem a API Servlet do Java, que faz parte do
Java EE,
Para compilar o cdigo, voc precisa incluir no classpath o arquivo
servlet-api.jar, que fica no diretrio lib do Tomcat: $CATALINA_HOME/
common/lib/servlet-api.jar, onde $CATALINA_HOME o diretrio de
instalao do seu TOMCAT.

34 l'iI

Desenvolvendo Aplicaes Web com JSP...

G.l

rG Tomcat 5.5
;) bin
El

rG common
~ classes
fi::) endorsed

10 i18n
:llll
Figura 4.3

Para compilar, voc deve fazer:


javac -classpath $CATALINA_HOME/common/lib/servlet-api.jar
Site/MeuPrimeiroServlet.java

Digamos que no Windows, seu Tomcat esteja instalado em C:\Tomcat,


ento voc teria que executar da seguinte maneira:
javac -classpath C:\Tomcat\common\lib\servlet-api.jar
Site\MeuPrimeiroServlet.java

Um arquivo com a extenso .class criada .

Rodando o Servlet no Tomcat


Para fazer o exemplo rodar no Tomcat, voc deve fazer a seguinte configurao de diretrios : dentro de $CATALINA_HOME, em webapps, crie
um diretrio chamado Site e dentro dele a seqncia de diretrios e o arquivo .c1ass gerado, como mostra a seguir:
Tomcat\
webapps\
Site\
WEB-INF\
classes\
meupacote\
MeuPrimeiroServlet.class

Introduo aos Servlets li'I 35


Dentro do diretrio WEB-INF, voc dever criar um arquivo descritor
da sua aplicao. Esse arquivo se chamar web.xml e ter a seguinte aparncia:
web.xml.

<?xml version="l.O" encoding="UTF-B"?>


<!DOCTYPE web-app PUBLIC n_ // Sun Microsystems, Inc. // DTD Web
Application 2.3 // EN" nhttp: // java.sun.com/ dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
<description>
Descritor do contexto de desenvolvimento.
</description>
<display-narne>
Meu Primeiro Servlet
</display-narne>
<servlet>
<servlet-narne>MeuPrimeiroServlet</servlet-narne>
<servlet-class>
meupacote.MeuPrimeiroServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-narne>MeuPrimeiroServlet</servlet-narne>
<url-pattern>/MeuPrimeiroServlet</url-pattern>
</servlet-mapping>
</web-app>

Depois de configurado, digite no navegador o URL do seu Tomcat


chamando o Servlet:
http://localhost:BOBO/ProjetoJavaWeb/MeuPrimeiroServlet

o resultado ser como mostrado na Figura a seguir:

36 l\I Desenvolvendo Aplicaes Web com JSP...


U Trabdlhaodo com Servlet MOlitW firefox

GJ@rg)

Meu primeiro Servlet

Q :

Figura 4.4

Para entender os Servlets, uma breve explicao do pacote


javax.servlet e javax.servlet.http:
javax.servlet - Pacote dos servlets genricos, independe de protocolo;
javax.servlet.http - Estende a funcionalidade do pacote javax.servlet
para uso do protocolo HTIP.

A Configurao do Arquivo web.xml

o arquivo descritor de contexto (Deployment Descriptor) padro de uma


aplicao Web, segundo a especificao Java Servlet/Java EE, o web.xml.
As informaes nele contidas detm as configuraes especificas da aplicao. Onde voc tem :
~ Informaes textuais de ttulo (elemento <display-name I>, nome
para exibio no Manager) e comentrio da descrio description
I~ do contexto, teis para identificao e documentao.
~ O elemento <servlet I> indica o nome do Servlet bem como sua classe.
~ No elemento <servlet-mapping /> voc mapeia o Servlet para
que seja melhor acessvel no navegador. Para entender essa ltima situao, veja a explicao a seguir:

Mapeando um Servlet
Chamar um Servlet pelo pacote e nome da classe uma situao incomum
e estranha, por isso mapear um Servlet uma boa prtica para acesso a
mesma. Para isso, o elemento <servlet /> e <servlet-mapping /> entram
em ao. A Figura 4.5 demonstra essa situao:

Introduo aos Servlets

37

<servlet>
<servlet-name>UmServlet</servlet-name>
<servlet-c1ass>
meupacote.MeuPrimeiroServlet
</servlet-c1ass>
</servle!>
r - - - - - - - - - - - Nome do Servlet

<se""el-mapp;ng>

<servlet-name>UmServlet</servlet-name>
<url-pattern>/MeuServlet</url-pattern>
pp 9
</servlet-ma

n > t
_ _ _ _ _ _ _ _ _- -

URL de acesso a Servlet

Figura 4.5 - Servlet chamado de UmServlet mapeado como


MeuServlet.

o acesso a esse Servlet pelo navegador ser digitando MeuServlet no


caminho da sua aplicao Web:
http://localhost:8080 / Site / MeuServlet

Outras Formas de Mapear um Servlet


Existe uma outra forma de mapear o Servlet, especificando diversas urls,
apontando assim para o mesmo Servlet. Se voc marcar o elemento <urlpattern /> como /MeuServlet/*, toda url que acessar o padro http://
localhost:8080/Site/MeuServlet/* ir ter acesso ao Servlet criado:
web.xml
<servlet-mapping>
<servlet-name>UmServlet</servlet-name>
<url-pattern> /MeuServlet/* </url-pattern>
</ servlet-mapping>

38 l\l Desenvolvendo Aplicaes Web com JSP...


Tambm poder ser acessado da seguinte forma:
http://localhost:BOBO/Site/PrimeiroServlet.java
web.xml
<servlet-mapping>
<servlet-name>PrimeiroServlet</servlet-name>
<url-pattern>*.java</url-pattern>
</servlet-mapping>

o elemento <Ioad-on-startup /> indica que este Servlet deve ser carregado quando a aplicao for iniciada.
O contedo desse elemento deve ser um inteiro indicando a ordem na
qual o Servlet ser carregado. Se o valor um inteiro negativo, ou no for
apresentado (se esse elemento no existir), o container carregar o Servlet
que quiser. Se o valor um inteiro positivo ou O (zero), o container deve
carregar e inicializar o Servlet assim que a aplicao iniciada. O container
deve garantir que os Servlets marcados com inteiros contendo valores menores devem ser carregados primeiramente.
Veja um exemplo de sua utilizao:
web.xml
<servlet>
<servlet-name>PrimeiroServlet</servlet-name>
<servlet-class>
meupacote.MeuPrimeiroServlet
</servlet-class>
<load-on-startup>l</load-on-startup> u
</servlet>

Introduo aos Servlets ~

39

No elemento <Ioad-on-startup /> t:t" voc determina a ordem de carregamento desse Servlet.

Com relao a esse processo de inicializao que o Servlet somente poder receber requisies aps a concluso de seu processo de inicializao .

Criando Arquivos Web Archive (WAR)


Um arquivo Web Archive (WAR) uma aplicao Web empacotada. Voc pode usar arquivos WAR para importar uma aplicao Web em um servidor Web.
Web ARchive e um formato compactado, baseado no mesmo formato de compactao de arquivos ZIP, para distribuir aplicaes, ou bibliotecas, atravs de um s arquivo .
Em um arquivo WAR podem-se incluir quaisquer tipos de arquivos
como: classes, imagens, configuraes, entre outros.
Utilize o comando a seguir para gerar um WAR file, selecionando
todos os arquivos existentes no diretrio. Entre no diretrio Site e execute
o comando jar para criar o WAR file:
j ar cfv Si te .war *

Note que surgir um arquivo chamado Site.war, como determinado.

!lI:! EJ

" Prompt de co"","do

:'Site)jar cfy Site.war


dded rnanifest
dding : WEB- I NF..... <in - 9) (out - 9)(stored Bx )
dding: WEB-IHP/ classcs/(in - 0> (out - 0)(stored 8x)
dding : WEB-INP/ cla$s es/lllleupacote/(in 9> (out - 9)(stored ex)
dding: WEB- IHPl'classes/lllleupacote / HeuPri... eil"oServlet.class(in 1316) (out- (53)
<deflated S0r. )
dding: \lEB-INP/ classes/...eupacote/l1euSegundoSerulet.clas s <in - 1308) (out - (52)(
eElated S0i':>
dding! IIEB- I NF/lib/ <in - 0) <out - 0><.to~.d 0%)
dding: WEB-IHP/ web. x" l ( in 886 > {out - 363>(deflated 59;0: >
:~ite >

Figura 4.6

40

[ii) Desenvolvendo Aplicaes Web com JSP...

Undeploy de uma Aplicao Web Usando o


Tomcat 5.5
Como voc j tem instalado, devido operao executada anterionnente, a
aplicao Web chamada Site, voc ir primeiramente aprender a remover uma
aplicao usando o Tomcat. O comando undeploy EXCLUI sua aplicao:
http://localhost:BOBO/manager/undeploy?path=/Site

No navegador voc receber a seguinte mensagem:


OK - Undeployed application at context path /Site

Deploying.de uma Nova Aplicao Usando o.


Tomcat 5.5
O processo de instalao de uma aplicao Web conhecido como deploy.
O deploy da aplicao compactada necessita do seguinte comando para
que seja instalada:
http: //{hostname}:{portnumber} / manager /deploy?path={context-path}

No caso da aplicao criada, digite o exemplo a seguir no Windows,


partindo do principio que seu arquivo WAR est no endereo C :\Site:
http://localhost:BOBO/manager/deploy?path=/Site&war=file:/
c: \Site\S ite. war

No Linux, voc faria de fonna similar, no se esquecendo do endereo onde se encontra seu arquivo WAR:
http://localhost:BOBO/manager/deploy?path=/Site&war=file:/home/Site.war

Para visualizar se sua aplicao est funcionando corretamente, digite


o endereo no navegador:
http ://localhost:BOBO / Site

:',

.........
. . ,

Captulo

S
Escolha seu Ambiente de
D esenvolvimento

o DECORRER DESTE LIVRO, voc ter muitos cdigos a digitar e, com isso,
erros iro aparecer. Embora faa parte do processo de aprendizado do
iniciante ter erros, muitas vezes comuns e repetidos, o problema minimizado com o uso de uma boa IDE. Felizmente, em Java, existem timas
IDEs para desenvolvimento da linguagens que no custam nada. Nesse
livro, voc ser apresentado a duas IDEs, as mais usadas no mercado:
NetBeans e Eclipse .

O NetBeans

o NetBeans considerada uma das melhores IDEs open source do mercado.


Desenvolvida pela Sun Microsystems e mantida pela comunidade, a cada
nova verso vem se mostrando uma madura e consistente ferramenta para
desenvolvimento Java . No momento em que esse livro est sendo escrito, a
verso atual da IDE NetBeans era a 5.5. Em matria de desenvolvimento
Web, essa IDE muito madura, sendo uma excelente alternativa para aqueles que desejam desenvolver aplicaes Web de forma simples e rpida.
Essa ferramenta possui sistemas de depurao em tempo de desenvolvimento, mostrando a voc falhas de digitao, variveis no declaradas,
mtodos inexistentes, importaes de bibliotecas atravs de auxilio da ferramenta e etc.

42

[ljlJ Desenvolvendo Aplicaes Web com JSP...

Como Obter essa IDE


Para obter o NetBeans 5.5, entre no endereo http://www.netbeans.org.
Assim que abrir o site, voc encontrar um boto para fazer o Download da
IDE:

NetBeans IDE 5.5

Learn More aboyt NetBean;; IDEi

AI! the tools software developers need to create cross-platform Java deS'ktop,
enterpr'ise and web applications. Runs on Windows, Linux, tvlacOS, as wel! as
Solaris. lt is easy to instaI! and use, works right out of the box -- and it is
open-source and freeI

~;~~tB~~ ID~::::::: :: )

(3

Get Free CO

Figura 5.1

Uma segunda pgina surgir, para que voc defina exatamente o que
deseja baixar. Caso ele no reconhea o sistema que est usando, clique no
link Other Systems & Languages.

NetBeans IDE 5.5 Download

NetBeans IDE 5.5 Installer


(Windo\IJs/English)
netbean:;-S_S-windows .exe (44.1 rl1B)
MOS: 79c26f68ca4e9ba8f6091717bdb23efd

Download NetBeans IDE

Other 5vstems & Languages

cr-

Legal notice I Re lease Notes I Installaton lnstructons


NetBeans ID E 5.5 requres a Java SE JDK, version 5 or 6.

Figura 5.2

Escolha seu Ambiente de Desenvolvimento

lll 43

Aps clicar no segundo boto para download da IDE, uma nova tela o
avisar que o download iniciar automaticamente. Caso isso no ocorra, d
um clique no link download it here.

NetBeans IDE 5.5 Download

Your download should start automaticallv.


If not, download it here.

(U5ng download server 1)

Figura 5.3

Aps baixar sua IDE, voc precisar instal-la. Para isso, execute o assistente de instalao, como o de costume. Observe que para funcionar a IDE,
voc precisa ter o Java 5 ou o 6 instalado em sua mquina. Caso no tenha,
existe a opo de baixar o Java na pgina da Sun contendo a IDE, como j
falado em captulo anterior, na instalao e configurao do Java. At o momento em que esse livro escrito, o Java 6 ainda no estava em verso estvel.

Welcome to the lnstall Wizard


for NetBeans IDE 5.5
The Install Wizard will install NetBeans IDE 5.5 on your computer.
To continue. choose Nex!.

Figura 5.4

44

[li] Desenvolvendo Aplicaes Web com JSP...

Um outro detalhe que o NetBeans contm o Tomcat embutido, o


que, em matria de testes, no h necessidade de utilizar o que voc instalou, se assim desejar. H tambm a possibilidade de configurar o Tomcat
por voc instalado .

No Linux
Ligeiramente diferente do Windows, no Linux voc deve baixar o arquivo
com terminao .bin. Se voc est ambientado nesse sistema operacional,
no sentir dificuldades.
D a permisso necessria no arquivo, executando o comando no terminal:
shell # chmod +x netbeans-5 5-1inux.bin

Para executar o instalador do NetBeans, basta fazer a seqncia no


terminal:
shell# .1 netbeans-S_S-linux.bin

Iniciando na IDE NetBeans


Assim que instalar o NetBeans, voc poder abri-lo atravs dos atalhos
encontrados em menu do sistema operacional ou na rea de trabalho.
Uma tela de boas vindas aparecer bem ao centro da IDE (Figura
5.5), contendo a paleta Welcome. Do lado esquerdo voc encontra trs
janelas j abertas:
~ Projects - Onde ficam os seus projetos desenvolvidos
~ Files - Onde voc tem acesso a todos os arquivos, inclusive os
ocultos (uma espcie de explorer)
~ Runtime - Onde voc tem acesso aos servidores configurados no
NetBeans, os servidores de dados configurados e etc.

45

Escolha seu Ambiente de Desenvolvimento

-4

r~_
TT_
~_
._
ST_AA
_T_
.D____~__~ 1 ~i_
.R~
T~
~l~
B
~.
~.~
~~
~~__________~__~____

I WeJeome to NetS.Jns IDE

.. c.tting Started

" WhM'.Hew
- lotroductJon to J

fE'

'-

Addon Pack.

~ To Cf.dIy get statted, cee1he '.COll~c ""'*'" Geblg Slatted ar


i open one cf lhe many SIInlJIe P'o;octs I.rdef SerI'flIe Pro;ecta .

" Profller

TtiS sedion anti the BIoos stctlon beIow 'd

~aIy cbI*IY lhe

I _stNrlSeenclt.Coriels. Iftport .... Nel.Beans~c , tnd


l posmgslromOl tIdN. N118I!ans~CCIITII1'II.nty.

.. Enterprl
- VisualWeb

- oc ...

~ ~ ._

1!1."'!1of.;e

.. _._~. . .... __ ... "_ __.... _ ........__ .____ _. __ .. ___ .... _ _ _


v
AlLAATlClES

Web
Enterprl

"etBnn. Plug."" Modulu

.. J.". lHuePrlnts Solutions

o SHOW OM ST ARTUP

Figura 5.5

Criando seu Primeiro Projeto Web no NetBeans


Para desenvolver seus aplicativos Web descritos neste livro, usando a IDE
NetBeans, voc precisar iniciar um projeto. Para criar seu primeiro projeto
Web, v ao menu File e clique em New Project.

Ctrl+Shift+O
',)pen Recent PrOlf.Kt
Close Prolect
Open File ...
5et

I~a;n

Ctrl+O

Pro)o:!C!:

Prole.:t Propertle,;

Figura 5.6

46

[1jjlJ

Desenvolvendo Aplicaes Web com JSP...

Alternativamente, najanela Projects, voc pode dar um clique com o


boto direito do mouse e selecionar a opo New Project no menu de
contexto.
A caixa de dilogo New Project surgir, onde voc dever selecionar
em Categories o item Web e em Projects o item Web Application. Clique
no boto N ext para prosseguir.

[8J

E New Project
Step.
I.

Choo.e Project

2.

...

Choole ProJect
CoteQorles:

::15
!

~; -""---'-,

...._-

@i'- Web AppilCdtlon


@ web AppIic. tion with Existing Sources

Web

Enterprlse
~_ Neteeaos PiuQ-in Mod.ies

meJ

Projects:

liJ

Web Appication with Existing IW. Script

Sompies

Description:

(reates aR e:mpty We:b application n a standard IDE project. A standard project uses an
IOe oene:rated build script to build, n.l'l, and debug ycu projed .

Figura 5.7

Na segunda etapa voc colocar o nome do seu projeto, em Project


Name e desativar o item Set Source Levei to 1.4. Clique no boto Finish
para terminar.

Escolha seu Ambiente de Desenvolvimento lljl] 47

E New \'Ieb Applicalon

(gJ

steps

Name and locatlon

I.

Proje<t Nome:

I MeuPrinolroProjeto

Proje<t Locatlon:

i C:\Documents ond SeUngs\Edsoo

Project FoIder:

['C:iCu;;et;;;(j-5ei~EdSOO\MeUPfiffiei;C;P;:oito

2.

Choose Project
Name and location

3.

F,amewor1<s

Sotrce 5tructtre: (Java B8uePrirts

Add to Erterprise Appicatton:

Server:

Java EE Version:

Context Poth:

I
II

Browse ...

---1

i.",,;j

[:;w.;;;...--.--...--_.._....--"".-.,..".. ,..-...._-_......------V]

t8lxldled Tomcot (5.5. 17)


!ME 1." ~
i IMeuPrinoi'oP,ojeto

Recanmendotion: 5ou'ce Levei 1.'1 shooJd be used n J2EE 1.-1 projects.

O Set 5ou'ce levei to 1.-1

Figura 5.8

o projeto criado pelo NetBeans comea com um arquivo inicial, chamado de index.jsp, as configuraes de uma aplicao Web escrita em
Java (context.xml e web.xml), assim como os diretrios META-INF e
WEB-INF.
Em Source Packages voc define o pacote dos seus aplicativos e em
Libraries voc adiciona as bibliotecas utilizadas no desenvolvimento da
aplicao.

48

~ Desenvolvendo Aplicaes Web com JSP...

: Projects ..

r:

x Files

I; Runtime

13 ... @) MeuPrimeiroProjeto
~ Web Pages

: ~e META-INF
1 OO"i:l WEB-INF

L... ~ _

S. }

Configuration Files

f .....Q MANIFEST.MF
~

..... tsl

L. t:dl

. B
S. lJB

contexto xml
web.xml

Server Resources
Source Packaoes

l.. .... lJ <def ault package>

$ "lfl

Test p(lckages

s ~

Libraries
~. Q] JDK 1.5 (Default)

. Illi

Bundled Tomcat (5.5.17)

W ~ Test Libraries

Figura 5.9

Como Desenvolver Servlets Usando o NetBeans


Aps criar seu primeiro projeto, v ao menu File e clique em New File. A
caixa de dilogo New File surgir. Com o item Web ativo em Categories,
selecione Servlet em File Types. Clique no boto Next para ir prxima
etapa.

Escolha seu Ambiente de Desenvolvimento

lI 49

l8.l

E'J New file


Steps

Choose f ~e Type

I.

Choose file Type

2.

. ..

Proje<t:

_ _ _ _ _ _=:3]

@MetI'rimeiroProjeto
............ ____________

c..a.t.~~'e.<.:
'" Web

,..

(:) Enterprise

'-L:!

Java Cla,ses
, fj lavaSe.", Obje<t,

.xJnit
~ Persistence

-a

::I

<

1("'\

Fie Types:

r~li!)I@ !I!IiiliSPm'
I@

D
I.-.--.-_.- 1"""
' ..
Fiter
Web Appication listene,

(d TO<) l il,ary De,cripto,

-&)
I@

Web Services

5un ROSOU'ce,

~lI'lMP~.ntArtjfN't. :~J

i >.

TO<) Fi.
TO<) Handler
~ HTMl
I@ lSF ManOQOd Sean
I@ 5trut, Action
L strut, ActionFoo:m Se.,,'--_ _ _ _ _ _v'-'

Description:

(reates a new servlet dass. A serv!et is a server*side Java dass which runs wlhin a web server.

Figura 5.10

Na segunda etapa voc coloca o nome do Servlet que est desenvolvendo em Class Name e o nome do pacote voc digita em Package. Caso
voc tivesse j um pacote, bastava selecion-lo. Clique em Next para prosseguir com o assistente .

50 l\l

Desenvolvendo Aplicaes Web com JSP...

f) New Servlet

'

Steps
l.

2.
3.

Choose Fie Type


Name andlocation
CorYiuro Servlet Deployment

.
..

N~~m~e,,=n~dL~o~c,,~tio~
n

_ _ __ _ _ _ __ _ _ __ _ _ __

doss Namo: 15ervletsComNetBeans


'---'------------------'
Project:
Location:

1500',0Paci<.aQes

vJ

padcaoe:

Croatod File: nd SettlnQs\Edson\MeuPrimei'oPrOjetO\Sf'\!ava\meupacoto\ServletsComNetBeans.)ava l

Figura 5.11

A ltima etapa do assistente para voc configurar o Deployment


Descriptor (web.xml), onde voc pode adicionar as informaes do Servlet
no arquivo, mantendo a opo marcada em Add information to deployment
descriptor (web.xml) . A definio de Servlet Name equivale e altera
<servlet-name /> e URL Pattern(s) em <url-pattern I>.

51

Escolha seu Ambiente de Desenvolvimento

Steps

1.
2.
3.

Choose Fie Type


Nome .00 Location
Configure Servlet

Deployment

Confioure Servlet Deployment

ReQister tho Servlet with tho .pp/ication by 1livin9 the Servlet ao internai nome (Servlet

Nome). Then specfy patt.rns that ldentty the URLs that invoke the Servlet. Separate
ndipIe patterns with c"","",s.

o Add information to

depIoyment descriptor (..eb.xmI)

dass Name:

IW!Jf)iJ(.(,\tlJ,31;rv~~t-.;n\f,li'h~.t1(~"'HlS

Servlet Nome:

L~~~~~!'~_. ___.__ .

URL Pattern(s):

I /Servlet,CornNetS.ans

I
----------]

lrOtlaizatlon P"'....ters:

v.....

Ne..

Figura 5.12

Ao final, um Servlet pr-configurado criado, dando a voc a possibilidade de alter-lo a sua maneira. Um mtodo protegido chamado
processRequest( ) chamado por doGet e doPost, portanto nesse mtodo que voc pode alterar o Servlet, acrescentando o contedo que desejar
para resultar no navegador.
Isso ocorre porque o NetBeans contm templates com pr-configuraes, possibilitando assim um cdigo pr-criado aps o uso do assistente.

52

[)jl) Desenvolvendo Aplicaes Web com JSP.. ,

lluhlic c lass

S e t:vl et~ Cotra.NetB e ens

e xtends Ht tp Set vl e t {

protected void processRequest (HetpSetvletReque s t re que :st, HttpServl etRe spons e resp ons e)
throws Se rvletE xcepti on, IOExcep t.ion (
Print\h:: i te r out = t:e 3p on s e . geUTriter () ;
te. pon . setContentType (" t ext/htllll ; charse t I SO-8859-1") ;
StIinq ht.1ll1 "<htlD l >" +
"<head><title:>Ttobalhando COID SeIvlec</title></head>" +
"</head>" +
"<body>" +
"<hl>Meu Primeiro SeIvlet</hl>" +
"</body>" +
"</ht.1ll1>" ;
out . llrint (ht.1ll1) ;
ou c. elose () ;

,-

I:

;
i

!
i< j

Figura 5 .13

Executando o Servlet Criado


Qualquer projeto no NetBeans pode ser executado clicando-se no boto
Run Main Project, considerando que o projeto que voc est trabalhando
o Main Project.

'"\,

IRun Main Project (F6)


Figura 5.14

Um problema que voc vai encontrar que ele abrir primeiramente


o arquivo index.jsp. Dessa maneira, ou voc cria um link nesse arquivo
(index.jsp) ou digita na barra de endereos o URL para acessar o Servlet.

Criando um WebARchive no NetBeans


Criar um arquivo WAR para publicar suas aplicaes muito simples no
NetBeans . Simples porque ele, por padro, j est configurado para tal situao .

Escolha seu Ambiente de Desenvolvimento

53

Toda vez que voc compila um projeto, o NetBeans por padro cria
um arquivo WAR no diretrio dist, dentro do diretrio de seu projeto.
Mas se voc quiser saber onde desativar, basta clicar com o direito do
mouse sobre o nome do projeto, e no menu de contexto selecionar a opo
Properties. Ao abrir a caixa de dilogo Project Properties, v ao item
Packaging em Build. Note que o item Create WAR file est ativo .
Desmarque essa opo e o NetBeans deixar de criar o WAR file nos seus
projetos .

O Eclipse
A IDE Eclipse, chamada por muitos de Plataforma Eclipse, considerada
por uma grande maioria de desenvolvedores Java como a melhor IDE para
desenvolvimento dessa linguagem. Alm de mais rpida que o NetBeans,
tanto em carregamento como no uso de seus assistentes de cdigo, essa
IDE possui uma grande gama de plug-ins, podendo se adaptar a qualquer
situao de desenvolvimento . Desenvolvida inicialmente pela IBM e liberada a comunidade, essa IDE a apenas cinco anos vem atraindo diversas
grandes empresas, unidas no desenvolvimento e melhoria da plataforma.
At o momento em que esse livro est sendo escrito, a verso mais atual do
Eclipse a 3.2 .

Obtendo a IDE
Para desenvolver aplicaes Web usando a plataforma Eclipse, primeiramente voc dever ter o Eclipse junto ao seu mais recente projeto, o plugin WTP (Web Tools Platform). O plug-in WTP necessrio para desenvolver aplicaes escritas em Java para a Web. Para obter a IDE Eclipse, j
configurada com o WTP, v ao endereo http://www.eclipse.org/webtools.
Para baix-lo, clique no link Download Now:

--

...--,---..,

~.-

~,-.

54

ljl] Desenvolvendo Aplicaes Web com JSP...


Do\omload

WTP 1.5.2

(October

31.2006)

ITl Download n0"\t


ITl Release plan U

'"
o

WTP 2.0

ITl Project plan .


Ali Downloads

ITl The complete lisl of downloads


is available here .

Figura 5.15

Logo aps voc escolher a plataforma em que o seu Eclipse vai rodar. Devido ao seu desenvolvimento, a IDE tem uma compilao diferente
para cada sistema operacional. Isso pode soar estranho quando se trata de
uma IDE desenvolvida em Java, mas o Eclipse utiliza uma linguagem de
criao de interface prpria, chamada de SWT. Caso qUE ira obter maiores
informaes a respeito, eu recomendo a leitura do meu livro Dominando
Eclipse, onde o SWT tratado de forma clara e prtica.
WebTools Platform; All oin-olle

The Eclipse Web Tools Platform Project will initially focus on infrastructure for tools used to build applications for
standards-based Web and Java runtime environments. WTP all-in-one module includes the complete set of software
lo staft using wtp immediately. This package already has wtp combined with the complete set of prerequisites.
eclipse 3.2.1 sdk. emf. gef and jem. Vou will not need anything else.
Status Platform

Download

ri

wtp-all-in-one-sdk-R-l .5.2-2OO610261841 -win32. zip~

Windows

{5

Status Platform

Download

ri

wtp-all-in-one-sdk-R-l .5.2-20061 0261841 olinuxogtk.tar. gz~

Linux (x86/GTK 2)

Status Platform

Download

ti

wtp-all-in-one-sdk-R-l.5.2-20061 0261841-macosx-carbon. tar. gz~

Mac OSX (Mac/Carbon)

Figura 5.16

No

WINDOWS

Aps baix-lo, descompacte-o em um local definido por voc em seu sistema operacional. Por exemplo, se estiver usando o drive C: do Windows,
descompacte a pasta eclipse nesse local.

Escolha seu Ambiente de Desenvolvimento

No

55

LINUX

Ou no Linux, execute o comando para descompactao do Eclipse em um


local definido, como no meu caso:
shell# tar -xpvzf /tmp/wtp-all-in-one-sdk-R-l.5.2-1inux-gtk.tar.gz
/home/edson

Iniciando na Plataforma Eclipse


Aps descompactar o Eclipse, voc pode inici-lo diretamente pelo
executvel ecIipse.exe no Windows:

fJ
V
L-JI

fJ
fJ

conflQuration

plugins

rnr
Lll.!J

ArqUIVO ECllPSEPR')DUCT

io. '

eclipse.ini
Parmetlos de conflglJrd~o
I K8

.
e
~..

lJ

features

readme

.edpseproduct
eclipse.exe

I 1-8

tU
IIC
..

--==~

notice.html
ArQuI'!o HTML

=~

nB

epl-vIO.html
;,rQUI'!O HTML

13 KB

startup.jar
Exewtable J-lr File
33,8

Figura 5.17

No Linux voc pode iniciar o Eclipse da seguinte maneira, desde que


haja as devidas permisses:
shell# /home/edson/eclipse/./eclipse

Assim que iniciar o Eclipse, voc pode selecionar ou aceitar o local


onde ele vai armazenar seus projetos, o chamado Workspace e caso no
queira mais ter essa caixa de dilogo aparecendo, marque a opo Use this
as the defauLt and do not ask again . Confirme aps clicando no boto OK:

56

Desenvolvendo Aplicaes Web com JSP...

(E)

fc Workspace launcher
Select a workspace
Eclipse SDK stores your projects in a folder called a workspace.
Choose a workspace folder to use for this session.
Workspace:

C:\Documents anel Settings\Edson\workspace

v ; [ Browse ...

o Use this as the default and do not ask again


OK

,I [

Cancel

Figura 5.18

Quando o Eclipse carregar, voc ver uma tela de boas vindas, como
ocorre com o NetBeans:

Figura 5.19

Escolha seu Ambi ente de Desenvolvimento ll 57

O Workbench
Ao fechar a view Welcome, voc v o que chamamos de Workbench. O
Workbench a interface grfica do usurio no Eclipse. Alm de exibir os
familiares menus e caixas de ferramentas, organizados em perspectivas
que contm vises e editores.

Barra de Perspectiva

Barra de Ttulo

Barra de Status

Figura 5.20

As barras de ttulo, ferramentas , perspectiva e status tendem a


ficar no mesmo local de uma perspectiva para outra. Se voc no personalizar o aparecimento e contedo das barras, as barras estaro sempre disponveis e nos mesmos locais, podendo sofrer pequenas variaes dependendo da perspectiva:
~ Barra de Ttulo: A barra de ttulo sempre exibe o nome da perspectiva atual.

58 lI

Desenvolvendo Aplicaes Web com JSP...

Barra de Menu: Esta a barra de menu global do Eclipse, que


lhe permite fazer todas as tarefas gerais. As opes disponveis
em cada menu tambm mudaro dependendo do que estiver selecionado.
~ Barra de Ferramentas: Esta a barra de ferramentas global do
Eclipse que tambm lhe permite executar tarefas gerais e tarefas
especficas para itens selecionados.
~ Barra de Status: Esta linha exibe tipicamente informao sobre
o item selecionado, embora possa conter informaes adicionais
que dependem da tarefa voc est executando atualmente. Por
exemplo, quando voc estiver em um editor de texto, a barra de
status poder mostrar sua posio atual dentro do documento .
~ Painel do Editor: exatamente o que o seu nome diz: uma
ferramenta para editar documentos. Esses documentos podem ser
qualquer coisa, desde fontes de programas ou configuraes de
sistemas.
~ Views: Views mostram grupos de objetos relacionados .

Criando seu Primeiro Projeto Web no Eclipse


Se voc deseja desenvolver seus aplicativos Web descritos nesse livro usando
a IDE Eclipse, voc precisar iniciar um projeto, assim como ocorre com o
NetBeans.
No menu File v at o item New e clique em Project. A caixa de
dilogo New Project surgir, onde voc definir o tipo de projeto que voc
deseja desenvolver. No caso, voc expandir a opo Web e selecionar
Dynamic Web Project. Clique no boto Next para prosseguir:

Escolha seu Ambiente de Desenvolvimento [\.J

ij

59

1RI

f New Project
Select a wizard

(reate a Dynamc Web project

Wizards:

<>

Itype flter text


;... @

:.*

Java Project
Java Project from ExistinQ Ant 6uildf~e

!.~ Plug-in Project

1tJ,(O General
~(O

cvs

ltJ 127 Eclipse Modelng Framework


1l ' (O EJB
IlI27 J2EE
ll(O Java
til .(0 Plug-in Development
8 (O Web
Dynamlc Web Project
. :...~ statc Web Project
(O Examples

... t1.

Figura 5.21

No prximo passo do assistente, em Project Name, voc digita o nome do


seu projeto. Diferente do NetBeans que vem com o Container Servlet embutido, no Eclipse voc deve defini-lo .

60

[li] Desenvolvendo Aplicaes Web com JSP...

lEl

\b New Oynamic Web Project


Dynamic Web project
Create a standalone Dynamic Web project or add it to a new or existing Enterprise Application.

Projed name: ~------~~-------------------------------------.


! PrimeiroProjetoUsandoEclipse
, Project contents:
~ Use default

; Oir'.lctory: I'C-"\-Ooc--un-,en-t-5-.n.-,j-se-tt-m-'J$-\E-'d-:son-\m--eu-Prt-flW-'-~O'i-,-ol-ks-poce--\Pr-_-lr-cPr-O-jR-,to-U-,.-n-do-Ec-\p-s-e-"I ' ~owse ... '


( Target Runtlme

< Back

li

Next

>

II

Finish

II

New,.,

(ancel

Figura 5.22

Em Target Runtirne clique no boto New. A caixa de dilogo New


Server Runtime surgir. Nessa caixa de dilogo voc define qual o servidor ou Container Servlet voc ir utilizar. Nesse caso, seguindo o mesmo
modelo de desenvolvimento usado no NetBeans, voc utilizar o Apache
Tomcat na verso 5.5. Expanda a opo Apache e selecione Apache Torncat
v5.5. Clique no boto Next para prosseguir:

Escolha seu Ambiente de Desenvolvimento [il]


~ New Server Runtime

61

New Server Runtime


DeFine a new instaUed server runtime environment

__

- -- _-_._--_._._- .

....

...

_-_..._._.........__._._._._--

Runtimes are used at build time to compile projects.


Select the type of runtime that vou want to deFine:
Don't see your server listed? Click here

s tC7 Apache
. !j
!j
. !j
.!j

--

tC7
.:.....

Apache Tomcat v3.2


Apache Tomcat v4.0
Apache Tomcat v4.1
Apache Tomcat v5.0
Apache Tomcat v5.5
BEA Systems

tl
-

,'V

View By: L-lv_en_d_or_ _ _':;"''V..:Jil


Descrlption: Apache Tomcat v5.5 supports J2EE 1.2, 1.3, and 1.4 Web modules.

<.: Back

Next

>

Finish

Cancel

Figura 5.23

Na prxima caixa de dilogo, voc ter que selecionar o local onde se


encontra o seu Tomcat instalado. Faa isso clicando no boto Browse no
item Torncat installation directory. Confirme assim que selecionar a instalao do Tomcat no boto Finish.

62

[iilJ Desenvolvendo Aplicaes Web com JSP...

~- New Server Runtime

Torncat Serve r
Specify the installation directory

Nllme:

IApache Tomcllt vS.S


Tomcllt instlllllltion directory:

t..:lC:.:.:\!..:.Tom
=c.:.:at-=s,::,s~_ _ _ _ _ _ _ _ _ _ _---l1 [

Browse ...

JRE:
L:.llr..:.,
e.;,..
1._
s ....:
0_=O_
9

____________

< 13ack

~
v~1 !lnstalled JRES ...

Il~' ;--! ' .. Finish

J!

Cancel

Figura 5.24

Voltando para a caixa de dilogo New Dynamic Web Project confirme clicando no boto Finish. Uma caixa de dilogo chamada License
Agreement aparecer, bastando apenas confirma-la clicando no boto I
Agree.

Escolha seu Ambiente de Desenvolvimento

l1fi1I

63

(g)

license Agreement
Arequest has been made to cache the resource:
http://iava.sun.com/xmVns/i2ee/web-app_2_4.xsd
In order to cache the resource you must agree to the license below:

EXPRESS OR IMPLIED CONDmONS. REPRESENTATIONS


AND WARRANTIES. lNCLUDlNG ANY IMPLIED WARRANTY
OF MERCHANTABILITY. FITNESS FOR A PARTICULAR
PURPOSE OR NON -lNFRlNGEMENT. ARE HEREB Y
EXCLUDED. SOO MICROSYSTEMS. lNC. ("SOO") AND ITS
LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
SUFFERED BY LICENSEE AS A RESULT OF USlNG,
MODIFYlNG OR DISTRIBUTING TIIIS SOFTWARE OR ITS
DERIVATIVES. lN NO EVENT WILL SUN OR ITS LICENSORS
BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
FOR DIRECT, lNDIRECT. SPECIAL. CONSEQUENTIAL,
lNCIDENTAL OR PUNrnVE DAMAGES, HOWEVER CAUSED
AND REGARDLESS OF THE THEOR Y OF LIABILITY, ARISlNG
OUT OF THE USE OF OR lNABILITY TO USE TIIIS SOFTWARE,
EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
You acknowledge that this software is not designed, Iicensed or intended
for use in the design, construction, operation or maintenance of any nuclear
facility.
[ I Agree

I [I Disagree I

Figura 5.25

Provavelmente seu Eclipse no est utilizando a perspectiva J2EE,


portanto no se assuste quando vir essa caixa de mensagem "Open
Associated Perspective?". Clique no boto Yes para confirmar a utilizao da perspectiva.

64

Desenvolvendo Apli caes Web com JSP...

(=- Open Associated Perspective?

This kind of project is associated with the J2EE perspective. Do vou want to
open this perspective now?

o Remember my decision
Yes

J[

No

Figura 5 .26

projeto criado pelo Eclipse, diferente do que acontece com o


NetBeans, no comea com nenhum arquivo inicial. As configuraes de
uma aplicao Web escrita em Java (web.xml), assim como os diretrios
META-INF e WEB-INF, tambm esto no projeto criado pelo Eclipse. Se
voc no fez nenhuma alterao, o diretrio WebContent o usado para
armazenar os arquivos Web. Em Java R esources: sr c ficam armazenados
os arquivos .java, bem como seus pacotes. No diretrio build voc tem os
arquivos .c1ass, o .java compilado.

Deployment Descriptor: PrimeiroProjetoUsandoEclipse

13 ~ JIIVII Resources : src


(B l!I\ Libraries
f.d. build
.f.d. classes
f.d. WebContent
13 f.d. META-INF

. . ~ MANIFEST .MF

f.d. WEB-INF
!27 lib
web.xml

Figura 5.27

Desenvolvendo Servlets Usando o Eclipse


Aps criar seu primeiro projeto, v ao menu File, na opo New e clique
em Other .

Escolha seu Ambiente de Desenvolvimento [liIJ

65

A caixa de dilogo New surgir. Expanda o item Web e selecione


Servlet. Clique no boto Next para prosseguir.

Select a wizard
Create a new Servlet

Wizards:

Itype filter text


lt.J (8. Java

~I

0(8. Java Emitter Templates


8:J(8. Plug-in Development
{iJ (8. Server
{iJ

$(2:> web
~ CSS
r~ Dynamic Web Project

..

HTML

~1 JavaScript
~ JSP

~
0 Q

ffi

Static web Project


~I

07 _Web Services

!...

..: Back

' I,
ti o Next>

I ,------,

j t_.o ~insh

__ ! ____
Ca_n_ce_l--.J

Figura 5.28

'/Ioftl
~

Alternativamente voc pode clicar com o boto direito do mouse


sobre o nome do projeto, na view Project Explorer, e selecionar a opo Servlet no item New.

A caixa de dilogo Create Servlet surgir. Em Class name voc


digitar o nome do seu Servlet e em Java package voc digitar o nome
do seu pacote. Clique no boto Next para prosseguir.

66

[1iJ Desenvolvendo Aplicaes Web com JSP...

~ Crea~e Servtet

rgJ

Create Servlet
Specify c1ass file destination.

Project:

IPrimeiroProjetoUsandoEc1ipse

Folder:

I\PrimeiroProjetoUsandoEc1ipse\src

I Ir-Br-ow-s-e-.
.. 1

~I

Javapackage: m
=e=u::
pa=co=t=e = = = = = = = = = = = = = = : : : : : ; ' [Browse ..
Class name:

[ ServletsComEclipse

Superclass:

I javax.servlet.http.HttpServlet

I
I B-ro-w-se-..-,.I
f""[

D Use exlsting Servlet class


(Ias~

name:

Ir~ervIetsco-m-Eclipse--------------'I '

BtOwse ...

D Generate an annotated servlet class

1-----------------------------------------------------"
< Back

I'

Next >

JI

Finish

I[

Cancel

Figura 5.29

A prxima etapa do assistente para voc configurar o Deployment


Descriptor (web.xml), onde voc adiciona as informaes do Servlet no
arquivo (no opcionalmente como em NetBeans) . A definio de Name
equivale e altera <servlet-name /> e URL Mappings em <url-pattern I>.
Em URL Mappings, inclusive, se voc desejar altera-lo, ter que seleciona-lo e depois clicar no boto Edit.

Escolha seu Ambiente de Desenvolvimento

:a

Create Servlet

lI 67

rg)

Create Servlet
Enter servlet deployment descriptor specific information.

Name

IServletsComEclipse

Description

1
...._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _----'

InitiaUzation Parameters:

Edlt...
Pemove

URL Mappings:

r'"C~""P"

Edit ...
Remove

-----'

< Back

11

Next

>

I'

jI

Flnish

Cancel

Figura 5.30

rg)

l- URL Mappings:

Pattern: I /servletsComEcliPse
OK

iI

Cancel

Figura 5.31 - Alterao alternativa do url-pattern.

Clique no boto Next para ir at a ltima etapa.


Em Interfaces, selecione o item javax.servlet.Servlet e clique no
boto Remove para excluir.

68

Desenvolvendo Aplicaes Web com JSP...

Na parte inferior voc deve selecionar os itens que no esto selecionados, como por exemplo init e destroy. Clique no boto Finish para terminar.
~

Create Servlet

Create Servlet
Specify modifiers, interfaces to implement, and method stubs to generate.

Modifiers:

~Publc

O Abstrllct O Fnal

Interfaces:

~
lRemove~

which method stubs would Vou like to crellte?


~ Constructors from superclass
~ Inherited abstract methods

~nit

DtoString

o getServletInfo

~doPost

DdoPut

DdoDelete

~destroy

~doGet

< Back

1_ r~ext >

Finish

1[

Cancel

Fig ura 5.32

Embora o Eclipse tenha feito parte dos cdigos necessrios para o


Servlet, voc dever acrescentar bem mais informaes do que acontecia
no NetBeans. Isso bom, pois o faz treinar os cdigos. Da mesma forma
que no NetBeans, o Eclipse contm um conjunto de templates que so
utilizados quando um assistente chamado.
Em alguns casos, voc digitar cdigos que no esto disponveis no
escopo do seu arquivo .java, precisando ser importado. A importao de

Escolha seu Ambiente de Desenvolvimento [1iJ

69

um pacote trs ao seu aplicativo uma determinada funcionalidade que ali


no existia.

~~

~~

.53
54
5S-

56

out

re3pon~ e .ge tWr1t.er(

' - Import 'PrintWrler' (Java.lo)

G Create da 'Prrtwrt....

); , - - - - - - - -- -- ----1
.~,
"va.io.lOExc~ion.'

Lt

r~: ,..

.>"

~rt java.io.PrintWriter.

O Create nterface 'Prnt.Writer'


<> CMnoe to 'PNGImaoeWrler' (cOII'I .sU"I.WMQeio.Mns.pno

J import javax.servlet .ServletExceptionj


~ Change to 'Prlnter' (c.om.SU"l.orQ.apache.XJTlII,nterrW.serli !fnPort javdx.serv\et.ht:tp .... tpServIet:Requesti
! ' ( c:> Chongeto 'PrintJobAdapter'(javax.print.event)
..
a () Create elUl1 'PrintWrl....
'f
o Add type ""rametet 'PrintW'l.... to 'ServletsComEclp.e' v
puJJ~ ~

2, _.

Figura 5.33

No Eclipse, assim como no NetBeans, voc encontra assistentes no


desenvolvimento do cdigo, como por exemplo o de resolver uma possvel
falha de importao de um pacote. Uma lmpada amarela aparece na lateral esquerda do Code Editor do Eclipse, na mesma linha do erro apontado
com um sublinhado vermelho. Com o ponteiro do mouse voc d um clique
nessa lmpada e aparece uma caixa de opes para que voc decida a melhor forma de resolver o problema. importante frisar que essa ajuda no
resolve o problema dando a voc a primeira opo como sendo a mais
certa, o que exige, com certeza, um conhecimento a respeito do que voc
est desenvolvendo.
Para aceitar a opo proposta, basta dar um duplo clique ou simplesmente ao clicar na lmpada assistente, a primeira opo sendo a correta,
basta voc confirmar com o Enter no teclado . Se for outra a opo, as setas
direcionais no teclado tambm podem ser usadas, seguidas com o Enter
para confirmao.

70

l)il] Desenvolvendo Aplicaes Web com JSP",

lcl.

!'1

O (reate interface 'PrintWriter'


.(>
.(>
.(>

Change to 'PNGImageWriter' (com,sun ,imageio,plugins,pn, I l


j'
Change to 'Printer' (com,sun,org,apache,xml.internal.serii : '
Change to 'PrintJobAdapter' (javax,print.event)
; .
(reate enum 'PrintWriter'
- '

o Add type para meter 'PrintWriter' to 'ServletsComEclipse'

.<lJC

--l\(,

~ ;--=~",,=:l

t~

,,_,8t . _

Figura 5.34

Executando o Servlet Criado no Eclipse


Para executar a aplicao, voc dever clicar em Ruo e em Ruo As e selecionar Ruo 00 Server.

Organize Favorites .. ,

Figura 5.35

A caixa de dilogo Ruo 00 Server surgir, onde o servidor j configurado existe j selecionado em Server ruotime. Se voc no quiser mais
essa caixa de dilogo, marque a opo Set server as project default (do
not ask agaio) . Clique no boto Fioish para executar.

Escolha seu Ambiente de Desenvolvimento [Ii'J

~ Run On Serve r

71
~

Define a New Server


Choose the type of server to create

How do vou want to select the server?

'Choose an eXIsting server

@ Manually define a new server


Server's host name:

L..1_oc_a_lh_o_st_ _ _ _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ _ _..:tv


=
~1

Select the server type:


Don't see your server listed? Cfick here
8 (23, Apache
, " ,, ~ Tomcat v3.2 Server

~ Tomcat v4 .0 Server
~ Tomcat vi.l Server
~ Tomcat v5. O Server
(t) (23,
(t)(23,
ctJ(23,
(t) . (23,

f3 .i.HM.....ii4ri4'

BEA Systems
IBM
JBoss
ObjectWeb

View By: ILv_en_d_or_ _ _.!;.


t'v:.! J~1
Description: Publishes and runs J2EE Web projects and server configurations to a local Tomcat server.

jVA
l1Installed Runtmes ... 1

Server runtime: Apache Tomcat v5.5


OSet server as project default (do not ask again)

<6ack

Next

>

I'

finish

I[

Cancel

Figura 5.36

Diferente do NetBeans, o Eclipse no abre, por padro, um navegador


externo. Ele usa a API do Internet Explorer, no caso do Windows, para usar
dentro da prpria IDE. Outro detalhe est na execuo da aplicao. Se
voc mandar rodar o Servlet, ele que surgir no navegador.

72

~ Desenvolvendo Aplicaes Web com JSP...

P Trabalhando com Servlet )(

, li <" http://Iocalhost:8080/PrineiroProjetoUsandoEclpse/ServletsColli'dipse

,v

I ~ 11

Meu Primeiro Servlet

Figura 5.37

Criando um WebARchive no Eclipse


Criar um arquivo WAR para publicar suas aplicaes no Eclipse diferente
do NetBeans. Enquanto o NetBeans tem isso por padro, no Eclipse voc
tem que criar quando quiser e no projeto que desejar.
Selecione o projeto que deseja criar o arquivo WAR.
V ao menu File e clique em Export. Na caixa de dilogo Export
expanda o item Web e selecione WAR file . Clique no boto Next.
Em Web module voc tem o nome do arquivo e em Destination voc
seleciona o destino onde ser criado o arquivo, clicando no boto Browse.

[g]

f..- hpOft
WAR Export
ExPQft web ~ject to the local Ue syst .

~)

Figura 5.38

Escolha seu Ambiente de Desenvolvimento l\I 73

Qual a Melhor IDE?


Muitos fruns de discusso e blogs mantm sempre a mesma pergunta:
Qual a melhor IDE?
A idia desse captulo no dizer qual a melhor ou pior, mas sim
orient-lo para que voc escolha a sua IDE predileta, partindo do princpio
de que, antes de emitir uma opinio, se deve primeiramente conhecer como
cada uma trabalha e como se encaixa nas suas necessidades .
Outro detalhe que voc no pode deixar de lado o fato de que as
duas so gratuitas e ambas podem ser usadas em conjunto.

.. ....
. .

Captulo

6
A Classe HttpServlet

CLASSE HTTPS ERVLET SOBRESCREVEo MTODO SERVICE para distinguir entre


as solicitaes tpicas recebidas de um navegador Web cliente. Os dois
mtodos mais comuns e usados de solicitao HTTP so GET e POST .
As utilizaes dos dois mtodos so muito comuns, uma vez que o
mtodo GET pode tanto obter informaes, onde voc pode requisitar um
arquivo ou uma imagem, como tambm pode enviar dados, que neste caso
temos o limite do cabealho HTTP.
O mtodo POST no requisita informaes, e sim as envia (posta),
dados para o servidor. As utilizaes mais comuns de solicitaes POST
consistem em enviar ao servidor informaes de um formulrio HTML em
que o cliente insere dados ou envia informaes ao servidor para que esse
possa pesquisar em um banco de dados e etc.
A classe HttpServlet define os mtodos doGet e doPost para responder as solicitaes GET e POST vindas de um cliente.
Os dois mtodos recebem como argumentos um objeto
HttpServletRequest e um objeto HttpServletResponse que permitem
interao entre o cliente e o servidor.

Criando um Servlet que Trabalha com o Mtodo


POST
A seguir voc tem um Servlet que trabalha com o mtodo POST:

76

[IilJ Desenvolvendo Aplicaes Web com JSP...

TrabComPost.java

package pacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax . servlet .http.HttpServletResponse;
public class TrabComPost extends javax.servlet.http.HttpServlet
public void destroy( ) (
super.destroy( );

protected void doPost(HttpServletRequest request, C)


HttpServletResponse response)
throws ServletException, IOException
String usuario = request. getParameter ("usuario");

String senha = request.getParameter("senha");


String html = "<html><head>"+
"<title>Trabalhando com Post em Servlet</title>"+
"</head>"+
"<body>" ;

6) if (usuario. equals ("edson") && senha.equals ("123") ) {


html += "Seja bem vindo Edson";
else{

html += "Usurio ou senha invlidos";


html += "</body></html>";

A Classe HttpServlet [Ijjl]

77

r espons e.setContentType ("text/html ");


PrintWriter writer = response.getWriter( li C)

writ er. print(html ) ;


writ er .close( ) ;

public void init ( ) t hrows Ser vl etException {


super.init ( );

Utilizando o mtodo doPost( ) O voc recupera valores vindos pelo


mtodo POSTo Quando uma requisio HTTP recebida por uma classe
que estende HttpServlet, seu mtodo service( ) chamado, sendo que a
implementao padro desse mtodo ir chamar a funo correspondente
ao mtodo da requisio recebida. Ou seja, caso um envio seja feito pelo
mtodo POST, como no exemplo, o mtodo doPost() implementado por
voc ser chamado.
A interface HttpServletRequest trabalha com alguns mtodos e no
caso, voc conheceu o mtodo getParameter( String n) 8. Esse mtodo
retoma o valor associado com um parmetro enviado para o Servlet como
parte de uma associao GET ou POSTo O argumento n representa o nome
do parmetro. No caso do seu servlet foi usuario e a senha, no qual vinham das tags <input /> do xhtrnl de mesmo nome.
voc verifica se foram passados
Atravs de uma condicional ir
valores como usuario e senha iguais ao valor verificado pelo mtodo
equals(String s).
A interface HttpServletResponsecontm a resposta ao cliente. Uma
grande nmero de mtodos so fornecidos para pennitir ao Servlet fonnular uma resposta. No seu caso, o mtodo setContentType( String tipo)
define o tipo MIME da resposta ao navegador. O tipo MIME pennite ao
navegador detenninar como exibir os dados. No caso o tipo MIME de resposta foi "text/html", que indica que a resposta um documento HTML.
Para dar uma resposta ao cliente, voc pode usar a OutputStream ou
o PrintWriter que retomado do objeto response.

78

[iilJ Desenvolvendo Aplicaes Web com JSP...

PrintWriter writer = response.getWriter( l; C)


OutputStrearn strearn = response.getOutputStrearn( );

Tambm possvel redirecionar o usurio para outra pgina atravs


do mtodo sendRedirect(String):
response.sendRedirect("logado.htrnl") ;

Voc s deve chamar um dos trs mtodos mostrados. Escre-'n1AM~


vendo atravs do writer, o cabealho enviado ao cliente e
~nlNll~\I~ impede o redirecionamento, enquanto que se voc chamar o
mtodo getWriter e depois o getOutputStream ocorrer um erro.

index.html
< ! DOCTYPE htrnl PUBLIC "- I!W3C/ /DTD XHTML 1. o Transi tional/ /EN"
''http://www . w3 . org /TR/xhtrnll/DTD/xhtrnll-transitional. dtd ">
<html xmlns="http://www.w3 .org/1999/xhtrnl">
<head>
<title>Login e Senha</title>
</head>
<body>
<form action=IServletPost" method="post"> O
Login : <input type="text" name="usuario" />
<br />
Senha: <input type="password" name="senha" />
<br />
<input type="subrnit" va l ue=" Logar" />
</forrn>
</body>

</htrnl>

o
e

A tag <form /> envia os dados via POST para o action indicado,
que no caso se chama ServletPost, o nome mapeado no arquivo
web.xml.
Os dados enviados so compostos por dois campos, um do tipo text,
que envia o usuario e outro do tipo password que envia a senha.

A Classe HttpServlet ~

79

Trabalhando com o Mtodo GET

o mtodo GET trabalha com informaes enviadas via URL. Esse mtodo
pode ser usado via query string de um link ou via formulrio com o atributo
method em GET.
Uma string de consulta parte do URL que aparece depois de um ponto
de interrogao. Por exemplo, o URL a seguir contm uma string de consulta:
http://integrator.com.br/buscar/?p=Hypertext+Preprocessor

Nesse exemplo, a string de consulta contm uma varivel denominada p cujo valor "Hypertext Preprocessor".
As strings de consulta so usadas para transmitir informaes do navegador para o servidor. Normalmente, voc no digita a string de consulta
diretamente na barra de endereos do navegador. Ao contrrio, cria um link
em uma pgina que contm a string de consulta.
http://integrator.com.br/TrabComGetServlet?empresa=Integrator

Voc pode transmitir diversas variveis de consulta em uma nica


string. Para fazer isso, basta separ-las com o caractere &("e" comercial).
http: //integrator.com .br/
TrabComGetServlet?nome=Edson&empresa=Integrator

A pgina a seguir demonstra um link transmitindo mais de uma string


de consulta:
index.html
< !DOCTYPE html PUBLIC "-/ /W3C/ /DTD XHTML 1. O Transitional / /EN"
''http: //www . w3. org/TR/xhtml1/DTD/xhtml1-transiti ona1. dtd">
<html xmlns=''http: //www.w3 . org/1999/xhtml'' >
<head>
<title>Trabalhando com Mtodo GET</title>
</head>
<body>

80

[1jjl] Desenvolvendo Aplicaes Web com JSP...

<a href =" TrabComGetServ let ?nome=Edson&empresa=Integrator" > O


Meu nome e minha Empresa
<Ia>

<br I >
<a href="TrabComGetServlet ?empresa=Integrator "> fi}
Minha empresa
</ body>
</ html>

o-

Note o envio de mais de uma string de consulta (query string),


onde se tem a varivel nome com o valor Edson e a outra varivel empresa com o valor Integrator separados por um & "e-comercial".
Aqui voc tem o envio de apenas uma string de consulta .

e-

Recuperando Strings de Consulta com Servlets


Para recuperar uma string de consulta com um Servlet, crie o seguinte arquivo:
TrabComGetServlet.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TrabComGetServlet extends
javax.servlet.http.HttpServlet
public void destroy( ) (
super.destroy( );

A Classe HttpServlet

ll 81

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
String nome = request.getParameter("nome"); O
String empresa = request. getPararneter ("empresa") ;
String html = "<html><head>"+
"<title>Trabalhando com GET em Servlet</title>"+
"</head>"+
"<body>"+
"Nome: <strong>"+nome+"</strong><br />"+
"Empresa: <strong>"+ empresa+"</strong><br />" +
"A query string enviada : <strong>"+
request getQueryString ( ) +" </ s trong>" +

"</body></html>";
response. setContentType (" text/html" ) ;
PrintWriter writer = response. getWriter ( );
writer.print(html);
writer.close( );

public void init( ) throws ServletException {


super. init ( );

"

'

"

"

..... _ _

__

_ _ _ _ _ _ _ _ _ "-

_ , __

___

__

__

Note que voc pode recuperar uma query string (string de consulta)
da mesma forma que voc recupera no mtodo doPost(), s que a diferena que pelo mtodo doGet( ).
O mtodo getParameter(String s) O alm de retomar o valor informado,
tambm retoma null caso no recupereo valor indicado entre os parnteses.
Caso voc queira toda a string de consulta, basta usar o mtodo
getQueryString( ) @ , que retoma a query string completa, aquela aps o
sinal de interrogao "?".

- ______

..... _

-.11..=..- _

__ _

82 l\I Desenvolvendo Aplicaes Web com JSP...


" Trabalh.lndo com GET em s",vlet

<>

~C> ! http://Iocalhost:6080!Serv!etsTrobComGetPost!Tr.bComGetServlet?nome-Edson&empres.-Inte.....tor

;.d JOIo

Nome: Edson
Empresa: Integrator
A query string enviada : nome=Edson&empresa=Integrator

Figura 6.1

Enviando Caracteres Especiais em Query Strings


Em alguns casos voc vai precisar enviar caracteres especiais em seus links
e que, sem isso, com certeza situaes indesejadas acontecero.
Um problema clssico de o usurio querer enviar caracteres especiais que causam problemas quando so tratados de maneira comum na URL,
como o caso do & "e-comercial". Quando a string codificada, possveis
caracteres problemticos sero substitudos.
Uma outra situao que apontaria esse tipo de utilizao e em sistemas de busca cujo transmitem informaes via HTIP, exigindo assim uma
codificao dos caracteres especiais.
O Servlet a seguir trata exatamente disso:
EnvCaractEspec.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder; .,
import javax.servlet.ServletException;
import javax .servlet.http.HttpServletRequest;
import javax.servlet .http.HttpServletResponse;
public class EnvCaractEspec extends javax.servlet.http.HttpServlet

A Classe HttpServlet lI

83

public void destroy( ) (


super.destroy( );

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
String queryString =
URLEncoder.encode("Cidado&:Joo","ISO-8859-1");@

String html = "<html><head>"+


"<title>Enviando Caracteres especiais< / title>"+
"< / head>"+
"<body>" +
"<a href= \ "RecCaractEspec?dados="+queryString+" \ ">" + 6)
"Clique aqui para enviar" +
"< / a>"+
"< / body>< / html>";
response. setContentType (" text/html" ) ;
PrintWriter writer = response . getWriter( );
writer.print(html);
writer.close( );

public void init( ) throws ServletException (


super.init( );

o - A importao do pacote j ava.net.URLEncoder necessrio para


que voc possa utilizar o mtodo encode(String s, String s) para codificar
a query string que deseja enviar para um outro Servlet, JSP ou outra aplicao Web. A classe URLEncoder contm mtodos estticos por converter
uma String para o formato MIME application/x-www-form-urlencoded.

84

Desenvolvendo Aplicaes Web com JSP...

Caso voc queira saber mais a respeito dessa codificao, o link http://
www.w3.org/TRlhtmI4/ poder ajud-lo.
o mtodo encode(String text, String enc) chamado da classe
URLEncoder, possibilitando assim a converso do caractere & (e-comercial) para o seu equivalente em URL encode (%26). Os acentos tambm
utilizados sero codificados pelos seus equivalentes, enviando assim uma
string de consulta totalmente aceitvel nos padres da Web. Embora o segundo parmetro seja opcional, ele toma o mtodo depreciado, portanto o
certo ter o dois obrigatoriamente. O segundo parmetro indica a codificao
que ser utilizada, como no caso ser em ISO-8859-1. Mas se seu documento for salvo no padro UTF-8, utilize esse encode.
@) - Nesse momento a varivel queryString recebe os dados com o
encode aplicado e colocado no link que ser gerado pelo Servlet.
A Servlet a seguir receber essa string.

e-

RecCaractEspec.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet . ServletException;
import javax .servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RecCaractEspec extends javax.servlet.http.HttpServlet

public void destroy( ) (


super.destroy( );

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {

A Classe HttpServlet l'il

85

String dados = request. getParameter ("dados") ;


String htrnl

= "<htrnl><head>"+

"<title>Recebendo caracteres especiais< / title>"+


"</head>"+
"<body>"+
"Os dados recebidos s!o: <strong>"+dados+"< / strong><br />"+
"A query string recebida : <strong>"+
request . getQueryString( )+"< / strong>" +
"< / body>< / htrnl>";
response . setContentType("text/htrnl") ;
PrintWriter writer = response.getWriter( );
writer.print(htrnl);
writer . close( );

public void init( ) throws ServletException (


super . init ( );

Esse Servlet no ter explicao, pois seu contedo no tem nenhum tipo
de novidade.

..

..... ..... ..

Captulo

7
,

Outros Mtodos Muito Uteis da


Interface HttpServletRequest

no s recuperar cada parmetro


separado, mas varrer esses valores em um loop. Essa interface, alm de
oferecer os mtodos da superc1asse ServletRequest, oferece tambm suporte a cookies e sesses.
Alm do mtodo getParameter( ) voc tambm conta com os seguintes mtodos:
String[] getParameterValues(String s) - Retoma um array de Strings
caso o parmetro tenha mltiplos valores.
Enumeration getParameterNames( ) - Retoma uma enumerao
com os nomes de todos os parmetros enviados.
String getHeader(String s) - Retoma o valor do cabealho enviado.
Enumeration getHeaders(String s) - Retoma uma enumerao com
os valores do cabealho.
Enumeration getHeaderNames( ) - Retoma uma enumerao com
os nomes de todos os cabealhos.
Como so mtodos encontrados com a classe ServletRequest voc
pode us-los em outros protocolos que no sejam HTTP.
OG ICA MENTE VOC DEVE ESTA R QUERENDO

Praticando os Mtodos
Considere a seguinte situao:

88

[Iiil] Desenvolvendo Aplicaes Web com JSP...

Voc tem um formu lrio com opes musicais e gostaria de varr-lo


para saber quais foram escolhidas pelo usurio.
index.htm1

<! DOCTYPE html PUBLIC "- /!W3C /! DTD XHTML 1. O Transitional / / EN"
''http ://www . w3 . org / TR / xhtml1 / DTD/ xhtml1-transitional. dtd">
<html xmlns=''http: //www.w3 . org/1999 / xhtml">
<head>
<meta http-equiv="Content-Type" content="text/htmlj charset=ISO8859-1" / >

<title>Trabalhando com outros mtodos de HttpServletRequest< / title>


</ head>
<body>
<f orm action= "TrabOutrosMetComServlet" method="post">
<h2>Escolha as msicas< / h2>
<p>
<input name="musica" type="check})ox" value="ROCK" I>

Rock<br / >
<input name="musica" type="checkbox" value="POP" I >
POP<br />
<input name="musica" type="checkbox" value="DANCE" / >
Dance<br / >
<input name="musica" type="checkbox" value="MPB" />
MPB<br / >
<input name=" musica" type="checkbox" value="SERTANEJO" />
Sertanejo
</ p>
<br / >
<input type="submit" name="btEnviar" value="Enviar" />
</ form>
</ body>
</html >

iJ

Outros Mtodos Mu ito teis da Interface HttpServletRequest l'iI

89

o-

O formulrio demonstra vrias caixas de checagem com o mesmo nome. A idia o usurio selecionar uma ou mais msicas, mas capturar apenas as selecionadas.
O Servlet a seguir demonstrar como voc varre os valores para obter
esse resultado, usando o mtodo getParameterValues( ):
TrabOutrosMetComServlet.java

package meupacote;
import java.io . IOException;
i mport java . io . PrintWriter;
i mport javax.servlet.ServletException;
import javax . servlet .http . HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TrabOutrosMetComServlet extends
j avax . servlet.http.HttpServlet
public void destroy( } {
super.destroy( };

protected void doPost(HttpServletRequest request,


HttpServletResponse response}
throws ServletException, IOException
String[] e = request.getParameterValues("musica"} i

String html = "<html><head>"+


"<title>Trabalhando com Outros mtodos em Servlet</title>"+
"</head>"+
"<body>H +
"<h2>Msicas escolhidas: </h2>" ;
for(int i=Oi i< e.lengthi i++}{E9

html+= "<strong>"+e [i)+"</strong><br I>";

90

[1iil] Desenvolvendo Aplicaes Web com JSP...

html+="</body></html>";
response. setContentType ( "text/html") ;
PrintWriter writer = response. getWriter ( };
writer.print(html};
writer.close( };

public void init( } throws ServletException {


super.init( };

o-

Atravs do mtodo getParameterValues(String s) voc chama


o campo msica,selecionados pelo usurio, e o atribui a um array (isso
porque um array de informaes).
49 - Com o loop for() voc distribui os valores encontrados na varivel e[ ] gravando-os no html que ser impresso na tela do usurio.
rr

Trabalhandu (Otll outros mtodos de HttpServletRequest X

<

"" E)

~~ http://1ocalhost:6080fServletsComOutrosMetsfndex. htmiv' l ~

Escolha as msicas

o Rock
DPOP
o Dance

=E)

~MPB

Sertanejo

<>

~,

~C:. http://Iocalhost:8080/ServletsComOutrosMets/lrabOutrosMetComServlet

Msicas escolhidas:
~--------~ ROCK

POP
MPB

Figura 7.1

"J liI>

Outros Mtodos Muito teis da Interface HttpServletRequest [IilJ

ij

91

Varrendo um Formulrio
Agora se voc preferir, pode fazer tambm a varredura em todos os objetos
enviados em um formulrio, por exemplo:
formulario.html
<!DOCTYPE html PUBLIC "-I!W3CI!DTD XHTML 1.0 Transitionall!EN"
''http://www.w3.org / TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xrnlns= "http: //www . w3 . org /1999 / xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1" />
<title>Trabalhando com outros mtodos de HttpServletRequest</title>
</head>
<body>
<form action= "VarrendoTodosObj etos" method= "post" >
<h2>Cadastre-se aqui:< / h2>
<p>
Nome:<input narne="nome" type="text" />
<br / >
E-mail: <input narne="email" type="text" />
<br / >
Site: <input narne="site" type="text" / >
<br />
</ p>
<br / >
<input type="submit" narne="Enviar" va1ue="Enviar" />
</ f orm>
</body>
</ html>

o formulrio criado no documento forrnulario.htrnl simples com


campos de texto somente. A seguir voc tem o Servlet que faz a varredura
nesse formulrio:

92 liI

Desenvolvendo Aplicaes Web com JSP.. .

VarrendoTodosObjetos.java

package meupacote;
import java.io . IOException;
import java . io . PrintWriter;
import j ava. util. Enumerationi

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class VarrendoTodosObjetos extends
javax.servlet.http.HttpServlet
public void destroy( ) (
super.destroy( );

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException , IOException
Enumeration e = request.getParameterNames(

)i

C)

String html = "<html><head>"+


"<ti tle>Trabalhando com getParameterNames ( ) </ ti tle>" +
"</ head>"+
"<body>" +
"<h2>Dados Cadastrados: </h2>" ;
while(e.hasMoreElements( )){ ~
String param = (String) e.nextElement( )i ~
html+= "<strong>"+param+":</strong>"+

request . getParameter(param)+"<br I>";


html+="</body></html>H;
response. setContentType ("text/html") ;
PrintWriter writer = response.getWriter( );

Outros Mtodos Muito teis da Interface HttpServletRequest

!I 93

writer.print(html) ;
writer.close( );

public void init( ) throws ServletException (


super.init( );

o-

Como j foi dito anteriormente, mas no custa reforar, o mtodo


getParameterNames() retoma uma enumerao com os nomes de todos
os parmetros enviados.
Com o mtodo hasMoreElements( ) voc testa se a enumerao
contm mais elementos, onde o loop while faz com que todos os elementos
sejam vistos.
@) - A chamada ao mtodo nextElement( ), de Enumeration retoma
os sucessivos elementos, onde ocorre uma coero de tipo (Type Casting)
para String. A varivel param nesse momento contm como valor o nome
dos campos passados pelo formulrio.
O - Nesse momento voc transmite a String html o nome do campo
enviado pelo formulrio, atravs da varivel param e tambm os valores
enviados por esse campo, trazidos pelo mtodo getParameterO que recebe como parmetro a varivel param (pois nela que se encontra o nome
do campo, alterado a cada nova passada do loop while) .

e-

Recuperando os Cabealhos Enviados


Uma outra situao interessante que voc pode vir a fazer recuperar os
cabealhos vindos do navegador. A seguir voc tem um Servlet que faz
exatamente isso:
RecCabecalhos.java

package meupacote;
import java.io.IOException;

94

~ Desenvolvendo Aplicaes Web com JSP...

import
import
import
import
import

java . io . PrintWriter;
java.util.Enurneration;
javax . servlet.ServletException;
javax.servlet.http.HttpServletRequest ;
javax.servlet.http.HttpServletResponse;

public class RecCabecalhos extends javax.servlet.http.HttpServlet


public void destroy( ) (
super.destroy( );
public void init(
super.init( );

throws ServletException (

protected void service (HttpServletRequest request,


HttpServletResponse response)
throws ServletException , IOException

response . setContentType("text/ht ml ;charset=ISO-8859-1 " );


String html = "<html>" +
"<head><title>Trabalhando com Servlet</title></head> " +
"</head>" +
"<body>" ;
Enurneration e = request . getHeaderNarnes( );
while(e. hasMoreElements( ) )(
String cabecalho = (String) e .nextElement( ) ;
html+= "<strong>"+ cabecalho +" : </strong>"+
request.getHeader(cabecalho); 1
html+= "<br />";

html+= "</body>" +
"</html>" ;
printWriter out = response . getWriter( );
out.print(html);

Outros Mtodos Muito teis da Interface HttpServletRequest [1jjl]

ij

95

o mtodo getHeaders( ) O , como j foi dito, retoma uma enumerao com os valores do cabealho, propositalmente colocado dentro de um
loop com mtodo hasMoreElements( ) para varrer todos os cabealhos
encontrados.
I" Trabalhando com St>rvlet X

<> "

11 ~

Ihttp://1ocalhost:8080/ServtetsComOutrosMets/RecCabecalhos

accept: */*
accept-Ianguage: pt-br
accept-encoding: gziP. deflate
user-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; FDM)
host: localhost8080
connection: Keep-Alive

Figura 7.2 - Resultado obtido dos headers no chamado do Servlet

Redirecionando um Acesso
Algumas vezes voc precisa redirecionar um acesso para uma outra pgina, no mesmo site, ou para um outro site. Fazer isso usando Servlet simples, basta usar o mtodo sendRedirect(String s ) O .
RedirComServlet.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirComServlet extends
javax.servlet.http.HttpServlet {

96

[liil] Desenvolvendo Aplicaes Web com JSP...

publ ic void destroy( ) (


super.destroy( );

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
String usuario = request . getParameter (" usuario") ;
String senha = request . getParameter (" senha") ;
if (usuario.equals ("edson") && senha . equals("123 " )) (
response.sendRedirect("uBuario_ val.html"); u

else{
response. sendRedirect ( "uBuario_ inv. btml" ) ;

public void init( ) throws Servl etException {


super. init ( );

Para funcionar o Servlet anterior, basta criar uma pgina inicial com
uma caixa de usurio e uma caixa de senha.
<fonn action="RedirComServlet" method= "post">
Login:<input type="text" name=" usuario " /><br />
Senha:<input type="password" name=" senha " /><br />
<input type="submit" value="Logar" />
</ fonn>

Para as pginas no qual o Servlet ir redirecionar fica a seu critrio


quanto ao seu contedo, apenas no se esquecendo do nome do arquivo
para usurio vlido, sendo usuario _ val.htrnl, e para usurio invlido, sendo usuario inv.htrnl.

- .- .
.Captulo
.-

Cookies e Sesses

STE CAP TULO O INTRODUZIR EM DOIS CONCEITOS M UITO USA DOS

no mundo

do desenvolvimento de sites: cookies e sesses.


De um lado voc tem os cookies, usados at os dias de hoje para
armazenar no computador do usurio suas preferncias na navegao de
um site, comum em sites de comrcio eletrnico e as sesses, utilizadas
para armazenar temporariamente informaes de um usurio em uma determinada rea de um site, como por exemplo, rea administrativa ou
ento uma caixa de e-mails .

Cookies
Voc pode usar um cookie para armazenar informaes no computador de
um cliente quando ele visitar seu site da Web.
Essas informaes podem ser usadas para identificar o cliente quando
ele retomar ao seu site.
A capacidade de identificar os clientes e personalizar contedo importante porque pode ser usada para aumentar as vendas. Um exemplo simples : talvez voc queira exibir anncios distintos para clientes diferentes,
de acordo com seus interesses. Se voc registrou o fato de que um determinado cliente gosta de visitar as pginas de seu site da Web que mostram
livros de informtica, pode mostrar automaticamente a esse cliente mais
anncios relacionados a livros de informtica quando ele retomar a visitar
o site. assim que o comrcio eletrnico Amazon.com ficou famoso .

98

[)jl] Desenvolvendo Aplicaes Web com JSP...

Os cookies foram desenvolvidos pela Netscape para corrigir uma deficincia observada na interao entre servidores da Web e navegadores. Sem
os cookies, a interao entre os servidores e navegadores sairia do controle.

.'Df

7
Ri

De onde vem o termo "cookie"? Lou Montulli, que programou a


especificao original do cookie para a Netscape, explica: "Cookie
um termo bastante conhecido em computao, utilizado quando se descreve uma parte opaca de dados mantida por um intermedirio. O termo se aplica perfeitamente ao uso; simplesmente no muito conhecido fora da rea da computao."

H dois tipos de cookies: cookies de sesso e cookies persistentes. Os


cookies de sesso so armazenados na memria. Permanecem no computador do cliente somente enquanto ele est visitando o seu site da Web.
O cookie persistente, por outro lado, podem durar meses ou at anos.
Os cookies persistentes so armazenados em um arquivo de texto no computador do cliente. Esse arquivo de texto denominado arquivo Cookie
nos computadores com sistema operacional Windows e arquivo Magic
Cookie nos computadores Macintosh .

Criando Cookies
Para criar um cookie, voc precisa instanciar a classe javax.servlet.http.
Cookie. Essa classe fornece apenas um tipo de construtor que recebe duas
variveis do tipo String, que representam o nome e o valor do cookie.
O servlet a seguir mostra como criar um cookie:
CriandoCookie.java
package meupacote;
import
import
import
import
import

java.io.IOException;
java.io.PrintWriter;
javax.servlet.ServletException;
javax.servlet.http.Cookie;
javax.servlet.http.HttpServletRequest;

Cookies e Sesses l'iI

99

import javax.servlet.http.HttpServletResponse;
public class CriandoCookie extends javax.servlet.http . HttpServlet
{

public void destroy( } {


super.destroy( };

protected void doGet(HttpServletRequest request ,


HttpServletResponse response}
throws ServletException, IOException
Cookie meucookie = new Cookie("nome", "Edson")iO
meucookie. setMaxAge(60) ; ~
meucookie.setSecure(false); t)
meucookie. setComment ("Meu nome") ; O
response .addCookie(meucookie) ; ~

String html = "<html><head>"+


"<title>Criando um Cookie</title>"+
"</head><body>"+
"<h2>Seu cookie foi criado com sucesso!</h2>"+
"<a href=\"VisualizaCookie\">" +
"Clique aqui para ver o Cookie criado" +
"</a>"+
"</body></html>";
response. setContentType ("text/html") ;
printWriter writer = response.getWriter( };
writer.print(htmlJ;
wciter.close( };

public void init( } throws ServletException {


super.init( };

100

Desenvolvendo Aplicaes Web com JSP...

A classe Cookie(String s, String s) chamada com a passagem


de dois parmetros, um o nome do cookie e o outro o valor.
o mtodo setMaxAge(int i) define o tempo (em segundos) para
que o cookie expire. No caso de voc ter um cookie por dois dias
na mquina, poderia ser definido da seguinte forma:
seucookie.setMaxAge(2*24*60*60).
6) O mtodo setSecure(boolean b) indica se o cookie deve ser transferido pelo protocolo HTTP padro.
O O mtodo setComment(String s) cria um comentrio para o
cookie criado.
6) Com o mtodo addCookie(Cookie c) voc grava o cookie na
mquina do usurio.

O resultado dessa pgina ser apenas uma sada HTML comum, contendo
um texto e um link. Esse link o levar direto para um Servlet que ir receber o cookie .

Recuperando um Cookie
Para recuperar um cookie voc usa o mtodo getCookies() do objeto implcito request. O Servlet a seguir recupera o cookie criado anteriormente:
VisualizaCookie.java
package meupacote;
import
import
import
import
import
import

java .io . IOException;


java.io.PrintWriter;
javax.servlet.ServletException;
javax.servlet.http.Cookie;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

public class VisualizaCookie extends


javax.servlet.http.HttpServlet
public void destroy( ) (
super.destroy( );

Cookies e Sesses lI
protected void doGet(HttpServletRequest request,
HttpServletResponse response}
throws ServletException, IOException (
Cookie listaCookies[] = request.getCookies( )i 4)

Cookie nome = null;


if (listaCookies != null) {
for (int i = O ; i < listaCookies . length ; i++)
if (listaCookies[i] .getName( ) . equals("nome")}
nome = listaCookies[i];
break;

String html = "<html><head>"+


"<title>Visualizando um Cookie</title>"+
"</head>"+
"<body>" +
"O Cookie chamado <strong>nome</strong> tem o valor: " +
"<strong>" + nome . getValue( ) + "</strong>"+ 6)
"</body></html>";
response . setContentType ( "text/html") ;
PrintWriter writer = response.getWriter( };
writer.print(html};
wri ter. close ( );

public void init( } throws ServletException {


super. ini t ( );

101

102

Desenvolvendo Aplicaes Web com JSP...

O mtodo getCookies( ) recupera os cookies encontrados.


} O loop for varre os cookies e com o if voc verifica se o cookie
o que se chama nome. Caso seja, o valor atribudo a varivel
nome e o break chamado para finalizar o loop.
8 O mtodo getValue() o responsvel por retornar o valor encontrado no cookie. No caso seria Edson o valor encontrado no cookie
criado no Servlet anterior.

(t \lsuahzando um CooWe X

<? ~ li! $'

I http://localhost:8080/ServletsComCookies/VisualizaCookie

Lv. .1 ~

o Coolcie chamado nome tem o valor: Edson


v

Figura 8.1

Ateno: Se os cookies no funcionarem, significa que o browser

~~tenQaa~

do usurio est configurado explicitamente para no aceitar


cookies. Com as crescentes preocupaes em torno da privacidade de quem navega na Internet, alguns usurios passaram a
bloquear o armazenamento de cookies em seus browsers .

Sesses
Largamente usada em aplicaes Web administrativas e tambm em comrcios eletrnicos, as sesses carregam geralmente informaes de uma
pgina para outra, usando ou no cookies.
AAPI de Servlets disponibiliza um mdulo extremamente til no controle de informaes associadas ao usurio que acessa uma rea restrita ou
que necessita de informaes que sejam transmitidas de uma pgina para
outra, conhecido como mdulo de gerenciamento de sesses de usurios.

Cookies e Sesses I'il

103

Esse mdulo funciona basicamente criando um identificador de sesso


na primeira vez que o usurio acessa a aplicao. A interface que representa
a sesso de usurio a javax.servlet.http.HttpSession.
A partir dessa definio, o servidor procura fazer com que todas as
requisies vindas daquele usurio carreguem esse identificador de sesso,
seja atravs de cookies, ou de URLs (com informaes adicionais de caminho) para que incorporem essa informao.
Dentro do servidor estabelecido um objeto de sesso nico e que
somente pode ser acessado pelo cliente que o chamou. Assim sendo, esses
objetos de sesso no so compartilhados entre cada usurio da aplicao.
A seguir voc vai fazer dois Servlets que representar a criao e a
utilizao da Sesso:
ServletSessionPagUm.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http .HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpSession;
public class ServletSessionPagUm extends
javax.servlet.http.HttpServlet
public void destroy( ) (
super.destroy( );

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
HttpSession sessao = request.getSession(true) i 4)

104

[iiilJ

Desenvolvendo Aplicaes Web com JSP...

sessao. setAttribute ("nome", "Edson");

String html = "<html><head>" +


"<title>Trabalhando com Sesso</title>" +
"</head>"+
"<body>" +
"Sua sesso foi criada com sucesso!<br />" +
"Sua ID : <strong>" + sessao.getld( ) + "</strong><br />" +

"<a href=\"ServletSessionPagDois\">Clique aqui</a>" +


" para ver a sesso na pgina seguinte." +
"</body></html>";
response.setContentType("text/html"};
PrintWriter writer = response.getWriter( };
writer.print(html};
writer.close( };

public void init( } throws ServletException {


super. init ( );

o mtodo getSession(boolean b) O retoma um objeto HttpSession


associado com a atual sesso de navegao do cliente. Esse mtodo pode
criar um objeto HttpSession (argumento true) se ainda no existir um para
o cliente.
O armazenamento de um objeto de sesso feito pelo mtodo
No caso, o objeto de sesso chamado
setAttribute(String s, Object obj)
nome contm um valor chamado de Edson.
O mtodo getld( ) 6) captura o identificador dessa sesso.
Quando voc clicar para ir ao segundo Servlet criado, essa sesso ser
mantida, para que o nome criado nessa sesso seja recuperado.

e.

Cookies e Sesses llI


ServletSessionPagDois.java

package meupacote;
import java . io . IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http . HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession ;
public class ServletSessionPagDois extends
javax.servlet .http.HttpServlet
public void destroy( } {
super.destroy( };

protected void doGet(HttpServletRequest request,


HttpServletResponse response}
throws ServletException, IOException
HttpSession sessao = request.getSession(true};
String nome = (String) sessao.getAttribute ("nome") ; O

String html = "<html><head>"+


"<title>Trabalhando com Sesso</title>" +
"</head>"+
"<body>" ;
i f (nome! =null) (

htrnl += "Sua ID :<strong>" + sessao . getId( ) +


"</strong><br />"+
"E seu nome : <strong>"+nome+"</strong>";
else{

105

106 l\J

Desenvolvendo Aplicaes Web com JSP...

html += "Sua sesso no f oi criada. <br />"+


"<a href=\ "ServletSessionPagUm\ ">Clique aqui</a>" +
" para criar a sua sesso.";

html += "</body></htrnl>";
response.setContentType("text/html");
PrintWriter writer = response.getWriter( );
writer .print(html);
writer.close( );

public void init( ) throws ServletException {


super.init( );

Para recuperar um objeto de sesso, voc deve usar o mtodo


getAttribute(String s) O. Esse mtodo retoma um Object e que, para voc
ter em formato String, uma coero de tipo deve ser feita . Caso no encontre o objeto de sesso procurado, esse mtodo retoma um valor null

e.

". Trabalhando com Sesso X

~ ~

Ii!l ~<},

http://loc.!llhost:8080/ServletsComSession/ServletSessionPagDois fv

Sua ID :7CBB6AD986A89B6D53D7B887FF600F6D
E seu nome : Edson

Figura 8.2

Cookies e Sesses ll

107

Terminando uma Sesso


Uma outra caracterstica importante dos objetos de sesso que ele permite que sesses criadas automaticamente expirem aps um determinado tempo de inatividade. Obviamente, o desenvolvedor tambm pode expirar uma
sesso explicitamente atravs de sua programao.
Primeiramente para dar continuidade no exemplo j em curso, voc
ir acrescentar as seguintes linhasu, em destaque, no arquivo
ServletSessionPagDois.java:

if (nome! =null) (
html += "Sua ID :<strong>" + sessao.getId( ) +
"< /strong><br />"+
"E seu nome : <strong>"+nome+"</strong><br />"+

"<a href=\"ServletFecharSessao\">Clique aqui</a>"+

" para fechar a sesso";

O Servlet a seguir ir remover o valor do objeto de sesso chamado


nomeO .
ServletFecharSessao.java

package meupacote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet . http .HttpServletResponse;
import javax.servlet.http.HttpSession;

108 lI

Desenvolvendo Aplicaes Web com JSP...

public class ServletFecharSessao extends


javax.servlet.http . HttpServlet {
public void destroy( } {
super.destroy( };

protected void doGet(HttpServletRequest request,


HttpServletResponse response}
throws ServletException, IOException {
HttpSession sessao = request.getSession(true};
sessao.removeAttribute("nome")iO

String nome = (String) sessao. getAttribute ("nome") ;


String html = "<html><head> "+
"<title>Terminando uma Sesso</title>"+
"</head>"+
"<body>"+
"Sua ID :<strong>" + sessao.getld( ) +

"</strong><br />"+
"E seu nome : <strong>"+nome+"</strong><br />"+
"<a href=\ "ServletSessionPagUm\ ">Clique aqui</a>"+
" para iniciar uma nova sesso"+
"</body></html>";
response. setContentType ( "text/html" ) ;
printWriter writer = response . getWriter( };
writer.print(html} ;
writer.close( };

public void init( } throws ServletException {


super. init ( );

Cookies e Sesses l\I

109

Embora o mtodo removeAttribute(String s) O seja chamado, apenas o objeto de sesso nome removido. A sesso em si continua sendo
ativa. Voc pode ver isso com o mtodo getId() 8 .

(t

=El

Termloando urna Sesso X

Sua ID :6E62AA2 73FFBB566DOEFD3584AA5C2 7A


E seu nome : null
Clique aqui para iniciar uma nova sesso
v

Figura 8.3

Gerenciando uma Sesso


Voc pode controlar a expirao de uma sesso, obtendo um maior controle de sua aplicao Web.
Usando mtodo setMaxInactivelnterval(int i) voc pode definir o
tempo mximo de inatividade na aplicao, em segundos. Com o mtodo
getMaxlnactivelnterval( ) voc captura o tempo dado como mximo de
inatividade, em segundos.
Usando o mtodo invalidate() voc permite que a sesso seja expirada explicitamente pela aplicao.
Para exemplificar como funciona esse controle sobre uma sesso, voc
ir modificar o arquivo ServletSessionPagUm.java como mostrado a seguir:

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
HttpSession sessao

= request.getSession(true);

sessao. setAttribute ("nome", "Edson");


sessao.setMaxlnactivelnterval(lli .,

110 Il Desenvolvendo Aplicaes Web com JSP...


String html = "<html><head>"+
"<title>Trabalhando com Sesso</title>"+
"</head>"+
"<body>" +
"Sua sesso foi criada com sucesso!<br />"+
"Sua ID : <strong>" + sessao.getId( ) + "</strong> <br /> "+
"O tempo mximo de inatividade : <strong>" +
sessao.getMaxlnactivelnterval( ) + ~
"</strong> segundo(s)<br />"+
"<a href=\"ServletSessionPagDois\">Clique aqui</a>"+
" para ver a sesso na pgina seguinte . " +
"</body></html> " ;
response.setContentType("text/html ");
printWriter writer = response .getWriter( ) ;
writer.print(html);
writer.close( ) ;

o
49

Nesse ponto voc determinou , atravs do mtodo


setMaxlnactivelnterval(l) que o tempo de inatividade do acesso ao seu Servlet seria de apenas um segundo.
Com o mtodo getMaxlnactivelnterval() voc pode colocar na
pgina o tempo configurado para a inatividade da aplicao .

I Trabalhando com Sessao X

Sua sesso foi criada com sucesso!


Sua ID : 63EE1A1C6D882C9219F2916D3CD9E3 78
O tempo mximo de inatividade : 1 segundo(s)
Clique aqui para ver a sesso na pgina seguinte.

..,
Figura 8.4

Cookies e Sesses llI 111

Caso voc venha a querer ir para o Servlet seguinte, ser necessrio ir


antes de um segundo, pois a sesso ser expirada. uma tima forma de
configurar reas que exijam segurana .

Descobrindo a Criao e o ltimo Acesso


Alm de controlar a expirao de uma sesso, voc tambm pode descobrir
quando foi criada e o ltimo acesso.
Para fazer isso basta chamar o mtodo getCreationTime( ) para a
data de criao e getLastAccessedTime( ).
Caso queira us-los, faa como no exemplo a seguir:
new Date (sessao.getCreationTime ( ))
new Date (sessao . getLastAccessedTime ( ))

Foi utilizado Date do pacote java.util para converter em formato de


data o resultado obtido pelos mtodos usados.
Perceba que nesta simples data voc tem diversas informaes como
dia da semana (Sun), ms (Set) dia, hora e outras informaes como o
timezone.
Caso queira converter em nosso sistema idiomtico, pode faz-lo de
forma simples, como mostrado a seguir:
ServletSessionPagDm.java
import java.text.SimpleDateFormat; C)
import java . util.Date;

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException (
HttpSession sessao = request .getSession(true);
sessao. setAttribute ("nome", "Edson");
SimpleDateFormat formato

1 12

[\] Desenvolvendo Aplicaes Web com JSP.. .


new SlnpleDateFormat("dd/MM/yy - HH:mm:ss");

String html = "<html><head>"+


"<title>Trabalhando com Sesso</title>"+
"</head>"+
"<body>" +
"Sua sesso f oi criada com sucesso!<br />"+
"Sua ID : <strong>" + sessao.getld( ) + "</strong><br />H+
"O tempo mximo de inatividade : <s trong>" +
sessao.getMaxlnactivelnterval( ) + "</strong> segundo(s)<br />"+
"Sesso criada em: <strong>"+
formato.format(new Date (sessao.getCreationTlne ( ))) +

EB

"< / strong><br / >" +


"ltimo acesso em : <strong>"+
forrnato.format(new Da t e (sessao . getLastAccessedTi me ( ) ))+
"< / strong><br / >"+
"<a href=\" ServletSessionPagDois\ ">Clique aqui</ a>" +
" para ver a sesso na pgina s eguinte. "+
"< / body></html >";
respons e. setContent Type (" t ext/html

N
)

PrintWriter writer = response . getWriter( ) ;


writer . print(html );
writer.close( );

Primeiro, e muito importante, no esquea de importar os pacotes


referentes a classe Date e a classe SimpleDateFormat O.
A classe SimpleDateFormat
fornece um conjunto de caracteres
padro para formatao do objeto Date.
Para utilizar, chame o mtodo format e, trazendo assim o formato
de data que criou na chamada da classe. Caso queira mais detalhes, veja o
Apndice que trata sobre o assunto no final deste livro .

Cookies e Sesses

113

Configurando a Expirao no Arquivo web.xml


Evidentemente que voc pode chegar a se esquecer de colocar um tempo
para expirao da sua sesso e, tendo em vista que isso consome certo
recurso do servidor, existe a possibilidade de ter a expirao (timeout) da
sesso pelo arquivo web.xml.
A configurao feita pelo arquivo web.xml faz com que voc tenha a
expirao dada pelo tempo indicado em todas as sesses correntes na sua
aplicao Web, sem exceo.
Para configur-lo, adicione os seguintes elementos, como mostrado:
web.xm1

<session-config>
<session-timeout>5</session-timeout>

</session-config>
</web-app>

o elemento <session-config /> configura a sesso de uma aplicao


Web, onde voc tem o elemento opcional <session-timeout /> O com o
tempo para finalizar a sesso da aplicao. O nmero deve ser um inteiro.
O nmero cinco em questo representa o tempo em minutos para a expirao
da sesso da sua aplicao.
Evidentemente voc nesse caso no precisaria usar o mtodo setMax
Inactivelnterval(int i), a menos que voc queira controlar a sesso especificamente para essa parte da sua aplicao.
Usando o mtodo getMaxlnactivelnterval() voc ver o tempo dado
como 300 (trezentos) segundos nesse caso .

Destruindo uma Sesso


Voc viu que possvel remover um objeto de sesso, mas que isso no
destruiu a sesso. Destruir uma sesso remov-la, e que, se for chamar
novamente uma pgina contendo sesses, um novo objeto de sesso criado.

114

[iiilJ

Desenvolvendo Aplicaes Web com JSP...

...............
~
~

Para saber se uma sesso novai voc pode usar o mtodo


isNew().

ServletFecharSessao.java

protected void doGet(HttpServletRequest request,


HttpServletResponse response}
throws ServletException, IOException {
HttpSession sessao = request.getSession(true};
sessao.invalidate( }i 4)
/ / sessao. removeAttribute ("nome");
/ / String nome = (String) sessao. getAttribute ("nome");
String html = "<html ><head>" +
"<title>Destruindo uma Sesso< / t i tle>" +
"< / head>" +
"<body>\n" +
"<strong> Sesso destruida com s ucesso!</strong><br />"+
"<a href =\ "ServletSess i onPagUm\ ">Clique aqui</a>" +
" para iniciar uma nova ses so\n" +
"</body></html>";
response. setContentType ("text/html" );
PrintWriter writer = response.ge t Writer( };
writer . print(html} ;
writer . close( };

o Servlet ServletFecharSessao foi modificado para destruir o objeto


de sesso, usando o mtodo invalidate( ) O. Se voc retornar ao
ServletSessionPagUm um novo objeto de sesso ser criado.

............

Captulo

Introduo a JavaServer Pages

NQUANTO QUE DESENVO LV ER UM SERVLET, voc tem que inserir muitos cdigos Java, a parte de layout da pgina fica a cargo do Web Designer, no
qual trabalha com imagens, cores e outros elementos visuais existentes em
um web site.
Graas a esse problema, a equipe da Sun desenvolveu uma tecnologia
baseada em Servlets chamada de JavaServer Pages (JSP).
JavaServer Pages so pginas Java embebidas em HTML. Dessa forma a pgina dinmica gerada pelo cdigo JSP. A primeira vez que uma
pgina JSP carregada pelo container JSP, o cdigo Java compilado gerando um Servlet que executado. As chamadas subseqentes so enviadas diretamente ao Servlet, no havendo mais a recopilao do cdigo Java .

A Estrutura da Pgina JavaServer Pages


Como as pginas JavaServer Pages so cdigos Java embebidos em pginas
HTML, voc pode definir o local que deseja colocar seu cdigo.
Dentro do arquivo, voc insere elementos pertencentes ao JSP, seguindo a sintaxe:
i ndex.jsp

<%@ page language= "java" contentType="text/htrnl; charset=ISO-8859-1"


pageEncoding="ISO-8859-1"%>

116

[1jjl] Desenvolvendo Aplicaes Web com JSP...

< !OOCTYPE html PUBLIC " - //W3CI lOTO XHTML 1. o Transitional//EN"


''http://www.w3.org/TR/xhtml1/0TD/xhtml1- transitiona l .dtd''>
<html xmlns=''http : //www . w3. org /1999 Ixhtml">
<head>
<meta http-equiv="Content-Type" content=" text/html i charset=ISO8859-1" I>

<title>Trabalhando com JavaServer Pages</title>


</head>
<body>
<%

String s = "<h2>Esse um cdi go JSP embebido no HTML</h2>"i


out.write(s)i O

%>

</body>
</html>

o arqui vo index.jsp, diferente do Servlet, no fica dentro do diretrio


classes, em WEB-INF, mas sim diretamente na raiz da sua aplicao. Observe tambm que o arquivo, embora contenha cdigos HTML, tem a extenso modificada para .jsp.
Para escrever cdigo Java em sua pgina basta coloc-lo entre as tags
<% e %>. Esse cdigo chamado de scriptlet.
Scriptlet, o cdigo escrito entre <% e %>, um nome composto da
palavra script (linguagem de script) com o sufixo let, que indica pequeno.
Esse costume dotado pela Sun Microsystems, foi assim com
Servlet e agora com Scriptlet entre outras nomenclaturas que
no vem ao caso.

Existem variveis j implcitas no cdigo jsp, onde todo arquivo


jsp j possui uma varivel chamada out (do tipo JspWriter) que
permite imprimir objetos atravs do mtodo write, print ou println:

<% out.write(s) i %>

Escolha seu Ambiente de Desenvolvimento [IjlJ

117

Preciso Compilar uma Pgina JavaServer Pages?


Uma das grandes vantagens de desenvolver em JavaServer Pages que
voc no precisa compilar seu cdigo. Voc cria a pgina e a coloca pra
rodar no Servlet Container. Caso precise alterar, altere e pronto.

JavaServer Pages so Servlets?


A pgina JSP um arquivo de script interpretado inicialmente e depois
compilado em um Servlet. O arquivo pr-compilado numa classe Java
quando acontecer o primeiro chamado desse arquivo. Voc pode visualizar
o Java criado, assim como o compilado no Tomcat em:
$CATALINA_HOME/work/Catalina/localhost/SiteJSP/org/apache/jsp

Como o Servlet Container Saber que Alterei o


Arquivo?
O compilador verifica a data de alterao do arquivo que contm a pgina
JSP e caso essa data se modifique, o processo de compilao executado
novamente para garantir que as alteraes feitas na pgina sejam visveis
para os usurios da aplicao.
Devido a todo esse processo de compilao / recopilao, aps a
modificao, assim como na criao, de uma pgina JSP, sempre mais
lento que os acessos seguintes.
Por trs de uma pgina JSP existe um Servlet especial, chamado Page
Compiler, que intercepta requisies direcionadas a recursos com extenso .jsp.

A Configurao do Arquivo web.xml


No caso da criao de arquivos JSP, voc adiciona novos elementos no
arquivo web.xml para ter a chamada de um arquivo inicial, quando sua
aplicao for chamada:

118

Desenvolvendo Aplicaes Web com JSP...

web.xml
<?xrnl version="l.O" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3/ /EN" ''http://java . sun. com/dtd/web-app_2_3 . dtd">
<web-app id="WebApp_ID">
<display-name>
TrabComJSP
</ display-name>
<welcome-file-list>
<welcame-file>index.jsp</welcome-file> 4)
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default .jsp< /welcome -file>
</welcome-file-list>
</web-app>

Note a adio do elemento <welcome-fiIe-list /> que contm um subelemento <webcome-fiIe I>, indicando um ou mais nomes de arquivos que
devero ser carregados automaticamente caso voc no digite o nome do
arquivo na chamada da aplicao no navegador. Como voc j deve ter
notado, o primeiro da lista o chamado para ser a pgina default, caso no
seja encontrada, a segunda da lista o arquivo inicial e assim por diante at
o fim.
Ao executar essa aplicao no Servlet Container, voc notar que a
chamada inicial lenta, isso graas a sua compilao. Depois disso, na
segunda chamada em diante fica consideravelmente mais rpido, como j
dito anteriormente .

O Ciclo de Vida

o fato de uma pgina JSP ser convertida para um Servlet faz com que ela
tenha o mesmo ciclo de vida apresentado pelo Servlet, onde existe a
inicializao, a requisio, e finalmente a finalizao.

Escolha seu Ambiente de Desenvolvimento

119

No existem mtodos equivalentes ao doGet e doPost de um Servlet


para o atendimento as requisies, j que o prprio contedo da pgina
contm o cdigo a ser executado e retornado para o browser a cada chamada.
Por outro lado, existem os mtodos jspInit( ) e jspDestroy( ) que
possibilitam a implementao de cdigos de inicializao e finalizao,
respectivamente, da pgina JSP.

A Estrutura do JavaServer Pages


Em pginas dinmicas escritas em JSP voc tem as tags de abertura <% e
fechamento %>, como j dito anteriormente, para se adicionar o comando
desejado.
As tags mais comuns so:
~ Comentrios: <%-- esse um comentrio em JSP --%> e
<%
/* esse comentrio tem
mais de uma linha */
%>
~ Declarao de atributos ou mtodos: <%! %>
~ Expresso de um resultado: <%= %>
~ Tags Personalizadas: <%@ taglib %>
Exemplo de tag personalizada:
<%@taglib uri=''http://java. sun.com/jsp/jstl/core" prefix="c"%>

Onde uri o nome definido no arquivo TLD e prefix o nome da tag


que ser utilizada na pgina JSP.

Diretivas
Diretivas so usadas para fornecer informaes especiais ditas ao container
sobre a pgina JSP quando esta compilada para Servlet.
Voc tem trs tipos de diretivas principais:
~ page: permite importao de classes, customizao de super classes servlet entre outras;

120

(ilJ Desenvolvendo Aplicaes Web com JSP...

include: permite que um contedo seja inserido de um arquivo no


servlet.
~ taglib: permite que o ambiente JSP importe uma determinada biblioteca de tags.
Para cada um desses tipos de diretivas, existem conjuntos de atributos
especficos utilizados para parametrizar a diretiva .

Diretiva page
Conforme o prprio nome indica, a diretiva page serve para se definir diretivas
da pgina. A diretiva page tem a seguinte sintaxe: <%@ page %>
Os atributos mais usados so:
~ language="java" - Especifica a linguagem que est sendo usada.
~ extends="pacote.classe" - Define se a super classe do servlet
por herana.
~ import="pacote.classe. *" - Pacote que deve ser importado.
~ session="true I false" - Permite ou no variveis de sesso.
~ buffer="none I lOkb" - Tamanho do buffer em KB para o
JspWriter out. O buffer padro definido pelo servidor.
~ info="mensagem" - Define uma string que pode ser recuperada
pelo mtodo getServletInfo(). Com esse atributo o desenvolvedor
pode adicionar uma documentao pgina que resume sua funcionalidade.
~ errorPage="erro.jsp" - Define a pgina de erro no qual ser desviado caso isso ocorra.
~ isErrorPage="true I false" - Define se uma pgina de controle
de erro.
~ contentType="text/html" - Informaes sobe a pgina, o MIME
type do documento.
~ pageEncoding="ISO-8859-1" - Define o conjunto de caracteres
para a pgina JSP.
~ autoFlush="true I false" - O valor true (padro) indica se o buffer
deve ser esvaziado quando estive cheio. Em false, indica que uma
exceo deve ser mostrada quando ocorrer overflows.

Escolha seu Ambiente de Desenvolvimento

lI 121

Desenvolvendo JSP no NetBeans 5.5


Voc j sabe que o NetBeans por padro, ao criar um projeto, cria uma
pgina JSP chamada de index.jsp, desde que seu projeto siga os passos
executados no Captulo 5. Mas a idia aqui mostrar como criar uma nova
pgina JSP, caso assim voc queira.
No menu File, clique em New File. Na caixa de dilogo New File, no
item Web em Categories, voc seleciona JSP em File Types. Clique no
boto Next.

step.
I.
2.

Choo." fill! Type


.

Choose file

Proj.<t:

Tr""

I@TrobComJSP
Fie Types:

Cate<ples:
'-- :) Web

! ib Etterprise
f--

, :)

Java Classes
JavaBeans Objeds
Jlk1It

;~

,<

..................

..

t!)
@

T09 Lilr",y Descriptor


T09 Fole
T09 Horder

~ HTML

~:, <>.1I"I("MP~ntArt~Mt~

.",

@ 5ervlet
@ Flter
I@ Web Appicatioo Liste".r
~.

i -ib Persistence
f-- Web 5ervices
i SUl ReSOU'teS
;

~-

>11

I@ JSf ManaQed Sean


=,
[@ Strlts Action

j;\...,~tn~!, lltli!lct'Q{!Jl_Q.,<I{\._ _ _ _ _ _.J!..

Description:
Creates new JSP fie ar JSP seQmer1t usi'><) either standard JSP synl:ax OI' XM. synl:ax, lSP technoloQy
enables '(OU to add dynamic behavior to web paeJOs, A lSP file must be run oro JSP.enab4ed web

server.

Figura 9.1

Na ltima etapa do assistente, voc define o nome da sua pgina JSP,


sem a extenso, em JSP File Name. Em Folder voc ainda pode determinar um diretrio em especial para salvar o arquivo. O item Options determina qual a sintaxe que ser usada em suas pginas JSP, que no caso est
selecionado inicialmente o padro - JSP File (Standard Syntax).

122

[li!] Desenvolvendo Aplicaes Web com JSP...

(8]

E I'lew JSP File


teps

I.

Z.

Choose Fie Type


!'Iam.. anel Locatlon

Name anel Locatlon

~IpaQI
~'''''=JSP~==========~

JSPFleNome:
Proje<t:
1 TrobCamJSP

~====================~~

L-I
W_eb_pOQe
-,,s _ _ _ _ _ _ _ _ _ _-'--"
"',1

Locotlon:

C'------------'-,--------l '-1-BrOWS-',-.. -"


_]

FoIder:

0ptI0ns:

JSP Fie (Stondord Syntox)

O JSP Doctoner"ot (l<K Syntax)

O Creat. as a JSP Se9mert

Des<riptlon:
JSP fie usinQ JSP stondard synta>:.

Figura 9.2

Desenvolvendo JSP no Eclipse 3.2 usando WTP


Fazer pginas JSP no Eclipse usando o plug-in WTP simples como na
criao dos Servlets. Com o projeto criado e selecionado, v ao menu File,
em New e clique em Other.
Na caixa de dilogo New, expanda o item Web e selecione JSP . Clique
no boto Next.

Escolha seu Ambiente de Desenvolvimento li'I

123

Select a wizard
Create a new JavaServer Page

1-____________

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __

_
0

Wizards:

Itype filter text


~I

lfJ (d. Server


$(d. web
o o ~ CSS

;.

t~ Dynamic Web Project

: m HTML
~ JavaScript
:.

00

:' ~ FII

o ~ Servlet

~ Static Web Project


(2:; Web Services
fi; (2:; XML
$(2:; Examples
,

li;

< Back

Next

> J

Finlsh

11

Cancel

Figura 9.3

Na segunda etapa do assistente voc pode detenninar em que diretrio


deseja criar a pgina JSP, bem como tambm definir seu nome. Por padro,
quando voc seleciona o projeto que deseja criar a pgina, ele j seleciona
o diretrio WebContent. No necessrio colocar a extenso. Clique em
Next para prosseguir.

124 li'I Desenvolvendo Aplicaes Web com JSP...

rEl

~ New JavaServer Page


JavaServer page
Create a new JavaServer Page.

Enter Of select the ~rent folder:

ICriandoJSPComEcupse/WebContent
fiJ <>
/>.

(B

1d .JETEmitters

8 ~ CriandoJSPComEclipse
127 .settings
(B 127 build
127 src
127 webContent
ciJ .~ PrimeiroProjetoUsandoEclipse
Il f.:3 Servers
G:l ~ ServletsComCool<ies
~ ServletsComOutrosMets
Il
ServletsComSession
G:l ~ ServletsTrabComGetPost

'EI

File name: paginaJSP

IAdvanced I

<Back

li

Next

>

1I

Finish

11

Cancel

Figura 9.4

Na terceira e ltima etapa voc seleciona um template gerado para a


criao da pgina JSP. Se no quiser usar um template, desmarque a opo
Use JSP Template. Nesse caso, o arquivo ser gerado em branco, podendo
assim ser feito totalmente a sua maneira. Ao terminar, clique no boto Finish.

Escolha seu Ambiente de Desenvolvimento l\jl]


-

125

~ New JavaServer Page

(RJ

Select JSP Template


Select a template as initial content in the JSP page.

o Use JSP Template


Templates are 'New JSP' templates found in the Jsp Temolates preference page,

........._........_.._.._---_.. _ - - - - ,
Description
JSP I'nth html marku
JSP with xhtml markup
J5P with xhtml markup and xml style syntax

Name
New JSP Ftle html
New JSP File (xhtml)
New JSP File (xhtml, xml syntax)

Preview
<%@ page language="java" contentType="text/html; charset=${encoding}"
pageEncoding="${encoding} "o;.>
<I DOCTYPE html PUBLlC "-//W3CIIDTO HTML 4.01 TransitionalllEN" "http://www.w3.org/TR/htmI4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=${encoding}">
<title>lnsert title here</title>
</head>
<body>
${cursor}
~

< Back

Ne>l '>

Finish

j[

Cancel

Figura 9.5

Usando a Diretiva page


A pgina JSP a seguir demonstra alguns atributos da diretiva page:
data.jsp
<%@

page language="java"

contentType="text/htm1"
pageEncoding="ISO-8859-1"
info="Escrito por Edson Gonalves"

126

[ljjI] Desenvolvendo Aplicaes Web com JSP...


iIDport="java.util. *"
import="java.text.SimpleDateFoIlllat"

%>

<!DOCTYPE html PUBLIC "- //W3C//DTD XHTML 1. 0 Transi t iona l //EN"


''http : //www.w3.or g/TR/xhtml1/DTD/xhtml1 -transitional .dtd''>
<html xmlns= ''http : //www . w3 . org/1999 /xhtml ">
<head>
<title>Usando a Diretiva page</ t itle>
</head>
<body>
Es se um exempl o da util izao da diret iva <st rong>page</ strong>
<br />
<%
Date hoje = new Date( );
SimpleDateFoIlllat formato =
new SimpleDateFormat ("dd/MM/yy");

%>
A dat a de hoj e : <s t rong><% = formato.format(hoje) %></ strong>4B
</body>
</ html>

Voc pode notar que no incio da sua pgina JSP existe a diretiva
page com vrios atributos, discutidos no incio desse tpico. O
mais importante nesse ponto compreender a simplicidade perto
do desenvolvimento usando Servlets.
No Captulo 8 desse livro voc j havia visto a utilizao da classe SimpleDateFormat. Novamente lembrando, caso queira mais
informaes a respeito, v at o Apndice no final deste livro .
C) Como resultado da diretiva page em conjunto com o atributo
import voc pode manipular a data do servidor e format-la, dando
como resultado o visto na imagem a seguir:
Voc ver mais a diretiva page em ao em captulos posteriores.

Escolha seu Ambiente de Desenvolvimento lI


=E]

.,. Usando a Diretiva page )(

;-- ~ li! t$'

127

Ihttp://localhost:8080/CriandoJSPComEclipse/data,jsp ,v]1liiJo

Esse um exemplo da utilizao da diretiva page


A data de hoje : 18/11/06

Figura 9.6

Diretiva Include
A diretiva include permite que sejam includos arquivos na hora em que a
pgina JSP compilada em Servlet. Sua sintaxe similar a:
<%@ include file="topo.html" %>

Para exemplificar essa diretiva, voc ir cnar trs pginas:


usandoDiretivalmport.jsp, cabecalho.html e rodape.html.
cabecalho. htm1
<h1 style="color:red; background-color:#EEEEEE">
Esse o cabealho
</h1>

rodape. html
<strong>Esse texto faz parte do rodap</strong>

A nica pgina dinmica no caso, ou seja, feita em JSP o arquivo


usandoDiretivalmport.jsp:
<%@ page language="java"
contentType=Htext/htrnl"
pageEncoding="ISO-8859-1"
%>
H
<!OOCTYPE htrnl PUBLIC "-IIW3CIIDTD XHTML 1,0 TransitionalllEN
,

128

Desenvolvendo Aplicaes Web com JSP...

''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www . w3 . org/1999 /xhtml">
<head>
<title>Usando a Diretiva import< /t itle>
</head>
<body>
include file=lcabecalho.htm1" %>0

<%@

<h3>Esse o contedo da pgina</h3>


include file=lrodape.htm1" %>

<%@

</body>
</html>

Usando a DiletlVa lIT~t X

Esse o \:4:1 bealho


Esse o contedo da pgina
Esse texto faz parte do rodap

Figura 9.7

A vantagem de utilizar essa diretiva est no fato de que voc pode


manter contedo esttico ou dinmico comum a diversas pginas JSP em
arquivos separados, includos, atravs dessa diretiva, conforme a necessidade. Sendo assim, um menu, cabealho, rodap e outras situaes que
podem se repetir ao longo de diversas pginas no site podem ser inclusos,
no necessitando de ser refeito a cada nova pgina e, auxiliando assim, na
administrao do contedo .

taglib
Tags Personalizadas ou Customizadas so comuns no desenvolvimento de
pginas dinmicas escritas em Java. Ao longo dos anos dois tipos de tags

Escolha seu Ambiente de Desenvolvimento

129

personalizadas surgiram, que aqui chamaremos de Tags Clssicas e Tags


Simples.
O objetivo nesse exemplo criar uma tag bsica que no tem a inteno de ser reutilizvel, mas de apresentar o desenvolvimento de uma taglib
personalizada. Esse exemplo utilizar uma Tag Clssica. Esse exemplo ser
necessrio principalmente porque envolve uma srie de detalhes com a
construo que o ajudar a entender melhor sua aplicabilidade.
A tag que voc ir produzir simplesmente imprimir uma frase: "Desenvolvendo com taglib" como resultado em uma pgina HTML.
A classe a seguir demonstra como criar uma tag personalizada:
DesenvolvendoTaglibs.java
package meupacote;
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.TagSupport;
public class DesenvolvendoTaglibs extends TagSupport { 4)

public int doStartTag( ) throws JspException { ~


try {
pageContext.getOut{ ).print("Desenvolvendo com
taglib");

catch (IOException ioe) { t)


throw new JspTagException("Erro: IOException");
return

SKIP_BODY;~

A classe abstrata TagSupport parte das APls de tags JSP e define todos os mtodos que o JSP precisa em tempo de execuo
para chegar funcionalidade da tag.

130 Il Desenvolvendo Aplicaes Web com JSP...

o mtodo pblico doStartTag() chamado em runtime(tempo

de execuo) para trazer as tags personalizadas. Observe que no


existe um construtor explcito para essa tag e nem mesmo um
mtodo main( ) para chamar a classe. Isso acontece porque o
processador de tag no uma classe independente, mas sim
instanciado em runtime pelo cdigo JSP quando chama seus mtodos. AAPI de tags personalizadas define um conjunto de mtodos para essas tags.
A tag quando chamada ir imprimir na tela a mensagem "Desenvolvendo com taglib" para o usurio, usando o mtodo print de
pageContext.
O Caso haja um erro na execuo, disparado um erro, uma exceo IOException.
6) O retomo da constante SKIP_BODY necessrio, como exigido
pelo mtodo, para que diga ao runtime como proceder quando
encontrar a tag. Esse retomo diz ao mecanismo de execuo para
simplesmente ignorar o corpo da tag, se houver um, e prosseguir
avaliando o restante da pgina. Evidentemente existem outros
valores de retomo vlidos para doStartTag( ), mas que no est
sendo explorado aqui, nesse momento.

Mesmo que voc me veja citando a palavra runtime, no significa que o seu desenvolvimento ser recopilado toda vez que
chamar uma pgina JSP. Na verdade, o cdigo JSP chamado e
compilado somente uma vez, sem ter uma alterao posterior,
transformando-se em um Servlet, como j dito anteriormente .

Como Compilar a taglib Criada


A compilao bem simples, como se faz quando voc quer compilar um
Servlet. A compilao exige o CLASSPATH para uma determinada biblioteca que o ajudar na compilao da tag desenvolvida.
Para compilar, no Windows faa:

Escolha seu Ambiente de Desenvolvimento I.l

131

javac -classpath $CATALINA_HOME \common\lib\jsp-api .jar ...


meupacote\DesenvolvendoTaglibs.java

Onde a compilao seria mais ou menos da seguinte fonna:


Digamos que seu Tomcat esteja instalado no Windows no diretrio
torneat no drive C:, e que o local onde se encontra sua aplicao seja em
C:\torneat\webapps\TrabTagLib, sendo assim, voc faria:
C:\Tomcat\webapps\TrabTaglib\WEB-INF\classes> ...
javac -classpath C: \Tomcat\common\lib\jsp-api .jar ...
meupacote\DesenvolvendoTaglibs.java

Note que a navegao foi feita at o diretrio classes, e l se originou


a compilao. Mas isso no obrigatrio, pois poderia ser feito assim, caso
o seu Tomcat esteja instalado no drive C: e que tem o nome Tomeat 5.5 no
diretrio:
C:\>javac -classpath "C:\Tomcat 5.5\common\lib\jsp-apLjar" ...
"C: \Tomcat 5. 5\webapps\TrabTaglib\WEB-INF\classes\meupacote ...
\DesenvolvendoTaglibs.java"

No Linux, voc segue a mesma regra, partindo do princpio que voc


tem o Tomcat instalado no diretrio /usr/loeal/torneat:
shell# javac -classpath /usr/local/tomcat/common/lib/jsp-api.jar ...
/usr/local/tomcat/webapps/TrabTaglib/WEB-INF/classes/meupacote ...
/DesenvolvendoTaglibs.java

O Descritor da Biblioteca de Tags (TLD - Tag


Library Descriptor)
Depois de compilado, voc tem uma classe dentro do diretrio classes, no
pacote rneupaeote, chamado de DesenvolvendoTaglibs em WEB-INF.
Dentro desse mesmo diretrio, WEB-INF, voc vai criar um outro
diretrio chamado de tld, e adicionar o arquivo mostrado a seguir, dentro
dele com a extenso .tld:

132 l\l

Desenvolvendo Apl icaes Web com JSP...

TrabCornTaglib . tld
<?xml version="l.O" encoding="ISO-8859-l"?>
<!DOCTYPE taglib PUBLIC "- I ISun Microsystems, Inc.IIDTD JSP Tag
Library 1.1 //
EN"

"http: // java . sun . com / j 2ee/dtds / web- j sptaglibrary_l_l . dtd">

<taglib>
<tlibversion>l.O< / tlibversion>
<jspversion>1 . 2< / jspversion>
<shortname>< I shortname>
<uri>desenvolvendoTaglibs</uri> )
<tag>
<name>frase</name>

<tagclass>meupacote.DesenvolvendoTaglibs</tagclass>
<bodycontent>empty</bodycontent>

C)

<info>
Desenvolvendo com taglibs
</ info>
< / tag>

</ taglib>

O elemento <uri i> define o nome para a referencia da taglib que


voc ainda vai fazer na sua pgina JS P.
No elemento <name /> voc defin e o nome para o elemento que
ser chamado pela pgina JSP para imprimir na pgina o contedo
desenvolvido na classe DesenvolvendoTaglibs.
6) O elemento <tagclass /> define o camin ho para a sua classe, onde
se encontra a tag personalizada. Note que segue a mesma lgica
dos Servlets, se houver um pacote (o que por conveno deve
sempre haver) o nome do pacote vem antes e separado por ponto
o nome da classe.
O O elemento <bodycontent /> detelmina que sua tag personali zada no tenha um corpo, ou seja, no iniciar como alguns elementos HTML, como <h2> e terminar com </h2>.

Escolha seu Ambiente de Desenvolvimento

133

Como Utilizar essa taglib em sua Aplicao


Depois de desenvolvido e configurado o TLD, voc precisa configurar o
seu deployment descriptor (web.xrnl) para que seja possvel rodar a aplicao utilizando essa tag personalizada.
web.xml
<?xml version="l.O" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsysterns, Inc. //DTD Web Application 2.3//EN"
''http: //java.sun .com/dtd/web-app_2_3 .dtd''>
<web-app>
<display-name>
TrabComTagLib
</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>desenvolvendoTaglibs</taglib-uri>
<taglib-location>

C)

/WEB-INF/tld/TrabComTaglib.tld
</taglib-location>
</taglib>
</web-app>

No deployment descriptor da sua aplicao voc obrigado a


colocar o elemento <taglib /> envolvendo os elementos:
<taglib-uri /> - que deve ser adicionado o mesmo nome dados pelo
elemento <uri /> definido no TLD TrabCornTaglib.tld.
<taglib-Iocation /> - aqui voc define o local onde se encontra o
arquivo TLD criado.

134 !i'I

Desenvolvendo Aplicaes Web com JSP...

Utilizando a tag Personalizada em uma Pgina


JSP
Depois de desenvolvido e configurado, voc precisa apenas chamar essa
tag personalizada. Para cham-la a pgina a seguir demonstra como fazer:
utilizandoTagPers.jsp
<%@ taglib uri="desenvolvendoTaglibs" prefix="jsps" %>0
e%@ page language="java"
contentType=" text/html "
pageEncoding= "ISO-8859- 1"
%>
e!DOCTYPE html PUBLIC "- //W3C//DTD XHTML 1.0 Transitional//EN"
''http://www .w3.org/TR/xhtmll/DTD/xhtmll -transitional. dtd ">
ehtml xrnlns=" http : //www .w3.org/1999/xhtml" >
ehead>
emeta http-equiv="Content - Type" content="text/html ; charset=ISO8859 -1 " />
eti tl e>Trabal hando com tag libs e/ ti t l e>
e/head>
ebody>
eh3> <jsps:frase />

e/ h3>

e/body>
e/html >

Depois de todo o desenvolvimento, que a primeira vista assusta


um iniciante, voc tem a diretiva taglib em ao, onde voc utiliza o atributo uri necessrio para chamar a sua tag personalizada. No elemento prefix voc define o nome de um prefixo que
ser colocado na chamada a tag personalizada.
Para chamar a tag personalizada, voc utiliza o nome dado no
atributo prefix, da diretiva taglib, separado por dois-pontos e o
nome da tag personalizada. S para lembr-lo, esse nome voc
definiu no TLD TrabComTaglib.tld no elemento <name I>.

Escolha seu Ambiente de Desenvolvimento ~

135

Mais adiante voc ver como fazer mais tags personalizadas, em um


captulo totalmente dedicado a isso .

O USO de Expresses
Em algumas pginas JSP construdas at agora utilizamos um elemento
dinmico chamado de expresso. Esse elemento serve para imprimir o
resultado na pgina do usurio Web, convertendo o valor em uma String.
<%= expresso %>

Note que a expresso contm um sinal de igual "=" e no termina com


ponto-e-vrgula.

.. ....
. ..

Captulo

10
Comparando JavaServer Pages
com Servlets

IDIA DESTE CAPTULO COMPARAR, lado-a-Iado, OS Servlets criados com


seus similares em JavaServer Pages.
Isso no quer dizer que voc deva ignorar o conhecimento adquirido
nos captulos de Servlets, j que perceber rapidamente que bem mais
simples desenvolver JSP. A base de tudo e outras coisas mais esto nos
Servlets .

Recebendo Dados Via POST


Como j foi dito, os mtodos doGet e doPost no se encontram nas pginas JSPs. Graas a isso voc tem uma maior flexibilidade de qual mtodo
vai usar quanto ao seu recebimento.
O formulrio criado similar ao usado no Captulo 6 deste livro, mas
vai ser colocado aqui para conferncia:
index.htm1

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ / EN"


''http: //www . w3. org /TR/xhtml1/DTD/xhtml1-transitional. dtd">
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1" />

138 1RI Desenvolvendo Aplicaes Web com JSP...


<title>Login e Senha</title>
</ head>
<body>
<form action="recebe.jsp" method="post")

Login:<input type="text" name="usuario" /> <br />


Senha:<input type="password" name="senha" /><br />
<input type="submit" value= "Logar" />
</forrn>
</body>
</html>

Como ocorria com o Servlet, voc deve enviar o formulrio para


o arquivo indicado no atributo action da tag <form I>. Observe
que o formulrio contm dois campos, um chamado usuario e o
outro senha.
A pgina JSP seguir imita o Servlet TrabComPost do Captulo 6:

recebe.jsp

<%@ page language="java" contentType="text/html"


pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
''http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xrnlns=''http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1" />
<tit le>Recebendo dados via POST com JSP</tit1e>
</head>
<body>
<%
String usuario = request.getParameter("usuario"} i

String senha = request.getParameter("senha");


if(usuario.equals("edson")

&&

senha.equals("123")) {

Comparando JavaServer Pages com Servlets [iI]

139

out. println ( "Sej a bem vindo Edson" );


else{
out. println ( "Usurio ou senha invlidos" );

%>
</body>
</html>

No Servlet, voc chamava o mtodo getParameter(String s), do objeto HttpServletRequest e nesse momento voc poderia us-lo. Aqui isso
no aconteceu, ou seja, voc no precisou chamar um objeto para usar o
mtodo getParameter(String s) 0 , mas obrigado a utilizar o objeto implcito request. Isso facilita o desenvolvimento de pginas criadas com a
linguagem Java, mas tm consigo o problema de "sujar" o cdigo como as
demais linguagens dinmicas, que ser abordado mais adiante .

Objetos Implcitos em JSP


Com a inteno de dar produtividade no desenvolvimento de aplicaes
Web usando a linguagem Java, a Sun Microsystems elaborou um conjunto
de objetos que podem ser usados dentro de uma pgina JSP sem precisar de
declarao. A esses objetos damos o nome de Objetos Implcitos.
Dessa forma, como acontece com todo objeto em Java, cada objeto
implcito uma instncia de uma classe ou interface seguindo sua API
correspondente.
REQUEST

Um dos mais utilizados objetos implcitos, o objeto request instanciado


da interface javax.servlet.http.ServletRequest. Esse objeto prov acesso a
todas as informaes disponveis requisitadas pelo usurio (como
parmetros de requisies e cabealhos) e pode ser usado exatamente da

140 l\I Desenvolvendo Aplicaes Web com JSP...


mesma forma que o parmetro HttpServletRequest, usado no mtodo
service( ) de um Servlet.
RESPONSE

Assim como o objeto request, o objeto response implcito e instanciado


da interface javax.servlet.http.HttpServletResponse. Novamente, este objeto pode ser usado de exatamente do mesmo modo que o parmetro
HttpServletResponse, usado no mtodo service( ) de um Servlet.
OUT

objeto implcito out representa uma instncia da classe


javax.servletjsp.JspWriter e usada para imprimir caracteres como a classe similarJava. io.Print Writer. Voc tem em uso os mtodos print() , println(
) e write( ) para escrever dados como resposta.
SESSION

o objeto implcito session representa o objeto da classe


javax.servlet.http.HttpSession e define a sesso do usurio, como feito na
Servlet.
CONFIG

objeto implcito config define uma referncia ao objeto da interface


javax.servlet.ServletConflg que representa o objeto de configurao do
Servlet gerado para o JSP, podendo ser configurado pelo deployment
descriptor (web.xml).
APPLlCATlON

objeto implcito application prov uma referencia a interface


javax.servlet.ServletContext que representa o contexto da aplicao. Com

Comparando JavaServer Pages com Servlets

141

isso, voc pode annazenar dados que sero compartilhados e visveis a


todas as sesses da aplicao.
PAGE

Esse objeto implcito se refere prpria pgina.


PAGECONTEXT

Uma referncia de objetojavax. servletjsp.PageContext diferente do restante de objetos implcitos avaliados. A instancia pageContext proporciona
ao desenvolvedor JSP acesso a todos os escopos disponveis no JSP e para
vrios atributos de pgina teis, como o pedido atual e resposta, o
ServletContext, HttpSession e ServletConfig.
EXCEPTION

prprio objeto implcito exception uma instncia do objeto


java.lang. Throwable , representando uma exceo e estar presente em pginas de erros na aplicao .
Aps ver os objetos implcitos que a tecnologia JSP disponibiliza sem
a necessidade de declarao, voc continuar na comparao dos exemplos criados em Servlets vs JSP.

Enviando e Recebendo Dados Via Mtodo GET


Um exemplo interessante usado na construo de Servlets era o envio de
caracteres especiais utilizando o mtodo GET.
Os caracteres especiais devem ser tratados, sempre que voc quiser
passar essas infonnaes usando o mtodo GET no utilizando um fonnulrio . Digo isso porque, se voc fizer um teste, o fonnulrio (X)HTML j
codifica os dados enviados pelo mtodo GET, tratando-os da fonna correta
para que seja passado pelo cabealho HTTP.

142 lI Desenvolvendo Aplicaes Web com JSP...


enVCaractEspeciais.jsp
<%@ page language="java"
contentType="text/html"
pageEncoding="ISO-8859-1"

lnport=ljava.net.URLEncoder"

%>
< !DOCTYPE html PUBLIC "-//W3CIIDTD XHTML 1. O Transitional//EN"
''http://www . w3 . org/TR/xhtml1/DTD/xhtml1-transitional. dtd" >

<html xmlns=''http://www.w3 .org!1999/xhtml">


<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1" I>

<title>Enviando Caracteres Especiais Usando JSP</title>


</head>
<body>
<%
String queryString =

URLEncoder.encode("Cidado&Joo l ,"ISO-8859-1");

%>
<a href=" recCaractEspeciais. j sp?dados=<%=queryString %>" > 6)
Envia Caracteres Especiais
<Ia>

</body>
</html>

A importao do pacote java.net.URLEncoder necessrio para


que voc possa utilizar o mtodo encode(String s, String s) para
codificar a query string, assim como ocorria com o Servlet criado
no Captulo 3 desse livro.
O mtodo encode(String s, String s) utilizado atravs da classe
URLEncoder para codificar os caracteres especiais.
@) Depois de codificados, os caracteres so transmitidos a varivel
String queryString que ser remetida a pgina
recCaractEspeciais.jsp.

Comparando JavaServer Pages com Servlets li'I

143

recCaractEspeciais.jsp
<linh<%@ page language="java"
contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<!DOCTYPE html PUBLIC "- //W3C // DTD XHTML 1.0 Transitional // EN"
''http: //www . w3. org / TR / xhtml1 / DTD / xhtml1-transi tional. dtd">
<html xmlns= ''http: //www . w3. org /1999 / xhtml ">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1" / >
<title>Recebendo Caracteres Especiais< / title>
</head>
<body>
<%
String dados = request.getParameter("dados") i

%>
Voc enviou os seguintes dados: <strong><%=dados %></strong>
<br / >

A query string passada foi:<br / >


<strong><%=request.getQueryString( )%>< / strong>

</ body>
</html>

Como j era de se esperar, voc recupera os valores enviados e os


imprime na tela 0, e tambm exibe a string de consulta enviada (detalhe:
codificada) 8 .

Recuperando Vrios Valores Enviados


A idia aqui fazer como o Servlet j feito anteriormente, s que usando
uma pgina JSP para recuperar diversos valores selecionados em uma lista
de um formulrio.

144

[Iiil] Desenvol vend o Aplicaes Web com JSP...

envDivOpc.jsp

<%@ page language =" java"


contentType=" text/html"
pageEncoding="ISO- 8859 -l"%>
< ! DOCTYPE html PUBLIC "- / /W3C/ / DTD XHTML 1. o Transi tional / /EN"
''http: //www .w3 . org/TR/xhtml1 /DTD/xhtml1-transitiona1. dtd">
<html xmlns=''http:/ /www .w3 . org!l999/xhtml">
<head>
<title >Selecione os programas que voc usa</title>
</head>
<body>
<%
String[ ] e = request.getPara.meterValues("programas"); O
i f (e! =null ) {

out .println ("<h2>Voc selecionou os seguintes programas</h2>");


f or(int i=O; i< e.length; i++) {
out . println( "<str ong>"+e[il+"< / strong><br />" ) ;

%>
<h2 >Se lecione um ou mais programas usando o Ctrl</h2>
<forro action="envDivOpc. jsp" method="post">
<select name="programas" size="4 " multiple="multiple" > 6)
<option value="Eclipse">Eclipse</option>
<option value="NetBeans">NetBeans</option>
<option value="VisualStudio.NET">VisualStudio .NET</option>
<option value="BrOffice.org">BrOffice.org</option>
<option value="Dreamweaver">Dreamweaver</option>
</select>
<input type="submit" name="btEnviar" value="Enviar" / >
</forro>
</body>
</html>

Comparando JavaServer Pages com Servlets lI

145

Similar ao ocorrido com o Servlet j feito, voc recupera diversos


valores enconh"ados dentro da caixa de seleo mltipla do HTML.
Primeiramente voc tenta recuperar os diversos valores enviados usando o mtodo getParameterValues(String s) O. At ai, nenhuma novidade.
Mas veja que existe uma verificao pra saber se o valor recuperado
NULO @ . Isso importante, porque se ele no existe, ento ele null em
JSP, assim como nos Servlets, claro.
Os diversos valores enviados so colocados em uma tag (X)HTML
possibilitando o
chamada <select /> que contm o atributo multiple
usurio de selecionar um ou mais valores. Inclusive essa situao foi colocada principalmente porque, diferente do exemplo usado no Servlet, esse
tipo de opo no tem alternativa, pois os valores se concentram todos em
uma nica tag, dispondo de diversos elementos agrupados. As checkbox
eram diferentes, pois voc poderia recorrer a colocar nomes diferentes para
cada caixa de checagem e burlar o problema de recuper-los como um
array.

e,

>

fi}

;Jj>

Ihttp://Iocalhost:8080/CompJspComServlets/envDivOpc.jsp

I r;;;.

Voc selecionou os seguintes programas


Eclipse

NetBeans
BrOffice.org

Selecione um ou mais programas usando o Ctrl


Eclipse
"
NetBeans
VisualStudio.NET

~r()ffic:eorg _._.,-:!. .

I Enviar I
Figura 10.1

..... .....

....

Captulo

11
Controlando Erros

URANTEA EXECUO DE UMAAPLICAO W EB ESCRITA EMJAVA, existe a possibilidade de acontecer vrios erros durante o processamento de um
recurso no servidor, onde, caso haja um erro do prprio servidor, este cuida
da sua manipulao (ou no). Caso haja um erro da aplicao, o Container
fornece meios para o desenvolvedor manipul-lo.
Os erros de servidor podem ser considerados como excees Java (em
tempo de execuo ou erros, ServletException ou subclasses, IOException e
subclasses) ou pelos prprios cdigos HTTP, chamado de status.
Controlar erros simples, no necessitando impor mudanas nas
classes e sim de um simples arquivo de configurao.
Atravs dele possvel configurar cada tipo de erro (atravs de cdigo
ou exception), dizendo qual pgina htrnl, jsp, Servlet e etc ., deve ser utilizada .

Tratando os Erros
Para tratar os erros, voc cria pginas de erros especficas. As pginas de
erros podem ser alteradas via deployment descriptor que define uma lista
dessas pginas, permitindo a configurao dos recursos a serem retomados
por um container, indicando onde est o erro de resposta no Servlet, ou se
foi uma exceo do Java ou do container. Um Servlet pode usar o
RequestDispatcher para chamar outro Servlet que trate erros, desvian-

148 l\l Desenvolvendo Aplicaes Web com JSP...


do o processamento para uma pgina de erro adequada. Se o Servlet gerar
um erro que no seja manuseado pelos mecanismos da pgina, o status
code deve ser atribudo para 500, indicando um erro dentro do servidor
http no qual impediu o resultado de uma solicitao.
Para ajud-lo a entender algumas excees, crie o Servlet mostrado a
segUIr:
TrabCamErros.java
package rneupacote;
irnport java.io.IOException;
irnport java.io.PrintWriter;
irnport javax.servlet.ServletException;
irnport javax.servlet.http.HttpServletRequest;
irnport javax.servlet.http.HttpServletResponse;
public class TrabCornErros extends javax.servlet.http.HttpServlet {
public void init( ) throws ServletException {
super. init ( );

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
int vall = Integer.parselnt(request.getParameter("vall"))iO
int va12 = Integer.parselnt(request.getParameter("va12")) i
float resultado=vall/val2;
String htrnl = "<htrnl><head>"+
"<title>Tratando Erros</title>"+
"</head>"+
"<body>" +
"O resultado : <strong>" +resultado+"< /strong><br />" +
"A query string enviada : <strong>" +

Controlando Erros l'il

149

request.getQueryString( ) +
"< / strong><br I> " +
"<forro action= \ " TrabComErros \ " method=\"get \ ">"+
"Valor 1: <input type= \ "text \ " name=\"vall\" /><br I >" +
"Valor 2: <input type= \ "text \ " name= \ "va12\" / ><br I>" +
"<input type= \ "submit \ " value= \ "Enviar\" I>" +
"< / body>< / html>";
response.setCont entType("text/html") ;
printWriter wri t er = response.getWriter( );
writer.print (html) ;
writer.close ( );
public void destroy( ) {
super.destroy( );

Sem nenhum segredo aparente, voc capturou dois parmetros enviados por uma string de consulta, chamados de vaU e val2 e fez o Type
Casting (coero de tipo) para nmeros inteiros O. A idia aqui fazer
uma diviso entre o valor enviado por vaU e o valor enviado por val2.
Mas esse Servlet comea com um pequeno problema, ele precisa ter
um valor inicial para ambas as variveis. Se isso no acontecer, a exceo
NumberFormatException de java.lang ser disparada. Na Figura 11.1
voc tem ilustrado o erro dado pelo Tomcat.
Embora voc tenha a explicao da causa, sua tarefa amenizar a
apresentao do problema, mostrando ao usurio uma tela mais agradvel
e mais compreensvel a um leigo .
Para personalizar essa pgina, voc ir alterar o arquivo web.xml da
sua aplicao, acrescendo essa exceo.

150

Desenvolvendo Aplicaes Web com JSP...


=El

l' Apache TomcatI5.5.17 Error report )(

;-.::" !!li

<8'

Ihttp://localhost:6080ITratandoErrosITrabComErros

HTTP Status 500 -

Exception report

:mm:numm The server encountered an internai error O that orevented It from fulfilfing this reguest.
mumm
java.lang.NumberFormatException: null
java . lang. Integer . parselnt(Unknown Source)
java. lang . Integer.parselnt(Unknown Source)
meupacote. TrabComErros. doGet (TrabComErros . java: 19)
javax.servlet . http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlec.service(HttpServlet.java:802)

mm The fuI! stack trace of the root cause is aVailable in the Apache Tomcatl5.5.17 Ioas.
ache Tomcatj 5.5.17

Figura 11.1

web.xml

<error-page>
<exception-type>
java.lang.NumberFormatException 4)
</exception-type>
<location>/erro_nfe.html</location>

</error-page>
</web-app>

Primeiramente voc adicionou um elemento <error-page /> contendo


o sub-elemento <exception-type I>, onde se tem a exceo que deve ser
tratada, o que nesse caso java.lang.NumberFormatException O.

Controlando Erros l\l

151

No elemento <Iocation 1>8 voc detennina a pgina que tratar essa


exceo. A URI do recurso indicado dever iniciar com I, significando ser
relativo raiz da aplicao. A pgina poder ser dinmica (JSP, Servlet,
JSF e etc.), neste caso, o recurso dinmico ter os atributos de
HttpServletRequest: javax.servlet.error.status_code e javax.servlet.
error.message automaticamente fornecidos.
A seguir um exemplo de uma pgina para tratar essa exceo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN"


''http:/ /www.w3.org/TR/xhtml1/DTD /xhtml1-transitional.dtd''>
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>java.lang.NumberFormatException</title>
</head>
<body>
<h2>Um erro ocorreu com a sua aplicao</h2>
<h3>java.lang.NumberFormatException</h3>
<!--

Esse comentrio foi feito porque o Internet Explorer tem um

tamanho de arquivo considerado ideal para que seja enviado para


o navegador.

Caso o erro que voc personalizou no aparea e, em seu lugar,


o IE coloque o erro dele, crie um comentrio como esse daqui,

sendo assim chamado por ele


</body>

-->

</html>

Essa pgina contm infonnaes simples, que evidentemente voc a


tomar mais interessante.

152

Desenvolvendo Aplicaes Web com JSP...

....teH~~

Note tambm que nela contm um comentrio . O Internet


Explorer, em testes, no considerava essa pgina, sem o comentrio, como sendo possvel de ser exibida pelo navegador,
exibindo em seu lugar o default usado pelo navegador. O navegador; IE 6, considera um tamanho mnimo de bytes para que
eles sejam exibidos. Ao que parece, um arquivo com 512 bytes
o suficiente para exibir o contedo, embora em testes, algumas pginas somente eram exibidas com 1024 bytes.

Se no quiser esse tipo de erro, voc tem duas alternativas: ou cria


valores iniciais para que a sua aplicao no gere um erro; ou cria uma
condio evitando que sua aplicao tenha um erro antes de ter o envio dos
valores pelo formulrio .

Outros Erros Comuns


Como bem voc deve saber, uma aplicao nunca est totalmente imune a
erros. Mesmo tendo resolvido um problema, outros tambm podem ocorrer.
Um deles voc tentar dividir certo nmero por zero.
Mais uma vez uma exceo disparada, s que dessa vez diferente
da anterior. Para resolver esse problema, voc dever incluir o tratamento
dessa exceo no deployment descriptor, assim como fora feito com o exemplo anterior.
Abra o arquivo web.xml e adicione as seguintes linhas em destaque:
web.xml.

<error-page>O
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/erro_ae.html</location >
</error-page>
<context-param>

Controlando Erros

153

o seguinte trecho adicionado ir tratar um erro que o servidor havia


encontrado, o java.lang.ArithmeticException, mostrando ao usurio uma
pgina chamada de erro_ae.htmIO .
A seguir voc tem a pgina erro_ae.html, lembrando novamente do
comportamento do IE com relao ao tamanho por ele considerado ideal
para um arquivo HTML.

< !DOCTYPE html PUBLIC "-/ /W3C / /DTD XHTML 1. o Transitional//EN"


''http: //www.w3.org/TR/xhtml1 /DTD/xhtml1-transitional.dtd">
<html xmlns="http: //www.w3.org/1999/xhtml">
<head>
<title>HTTP 500: Erro interno do servidor</ title>
</head>
<body>
<h2>Um erro interno ocorreu com o servidor:< / h2>
Sua aplicao est tentando executar uma operao
dividindo um
valor por zero. Essa diviso disparou no servidor
exceo:<br />
<strong>java.lang.ArithmeticException< /s trong><br
Entre em contato com o administrador do sistema e
desse erro.
</body>
</html>

ilegal,
uma
/>
o informe

Procedendo dessa forma, o erro ser mais amigvel.


Um outro erro muito comum tentar acessar uma URI invlida, ou
seja, uma pgina inexistente. Evidentemente isso tambm ir disparar um
erro de nmero 404.
O erro 404 o padro para informar que o recurso que voc est tentando acessar no existe no endereo indicado. Novamente esse erro estranho e pode ser personalizado.
Entre novamente no deployment descriptor, o arqu ivo web.xml e adicione as linhas em destaque a seguir:

154

[\J Desenvolvendo Aplicaes Web com JSP",

web.xml.

<error-page>
<exception-type>j ava , lang , ArithmeticException</exception -type>
<location>/erro_ae.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>

<context-pararn>

A seguir voc tem o cdigo na integra da pgina 404.html, indicando


o status 404 lanado pelo servidor personalizado :
404.html

<!DOCTYPE html PUBLIC "-//W3C // DTD XHTML 1.0 Transitional//EN"


''http://www .w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd''>
<html xrnlns=''http://www .w3.org/1999/xhtml''>
<head>
<title>HTTP 404: pgina ou arquivo no encontrado</title>
</head>
<body>
<h2>HTTP 404 : pgina ou arquivo no encontrado</h2>
Se voc est vendo es s a mensagem porque o endereo que
voc est tentando acessar ou no existe ou foi movido.<br />
Caso queira mais in f ormaes a respeito , entre em contato com
o administrador do site.
</body>
</html>

Controlando Erros lll

ij

~
~

155

URI cada recurso disponvel na Web como documento HTML,


imagens, vdeos, msicas, programas e etc., que tem um endereo que pode ser codificado por um Identificador Universal de
Recursos, ou URI (sigla inglesa para Universal Resource Identifier).

Um detalhe importante a ser dito que cada servidor livre para


implementar o comportamento padro de manipulao de excees em caso
de erros, caso exception-type no seja determinado .

Capturando Erros Usando JavaServer Pages


Voc tambm pode usar os recursos de capturar erros com JavaServer Pages,
bastando para isso usar a diretiva page, como visto a seguir:
tratErrosUsandoJSP.jsp

<%@ page language="java"


contentType="text/htrnl"
pageEncoding="ISO-8859-l"
errorPage="error-page.btm1"

%>
< !DOCTYPE htrnl PUBLIC "-//W3C/ /DTD XHTML 1. O Transitional / / EN"
''http: //www .w3 .org / TR/xhtrnll / DTD/ xhtrnll-transitional.dtd">
<htrnl :xmlns= ''http://www . w3 . org /1999 /xhtrnl" >
<head>
<title>Tratando Erros< / title>
</head>
<body>
<%
String vall = request. getParameter ("vall") ;
String val2 = request. getParameter ( "val2" ) ;
int valorl = Integer.getlnteger(vall);
int valor2 = Integer.getlnteger(vaI2);
%>
</body>
</htrnl>

156

[iijIJ Desenvolvendo Aplicaes Web com JSP...

Essa pgina JSP, criada especialmente com um erro, contm a diretiva


page com o atributo errorPageO, apontando para uma pgina esttica
criada em HTML.

Personalizando uma Pgina JSP para Exibir o


Erro
Embora voc possa personalizar em uma pgina esttica um erro, evidentemente voc deve querer capturar esse erro. Para isso voc deve apontar o
atributo errorPage da diretiva page para uma pgina JSP:
errorPage="error-page.jsp"

Ficando assim no topo de sua pgina tratErrosUsandoJSP.jsp :


<%@ page language="java"

contentType="text/html"
pageEncoding="ISO-8859-1"
errorPage="error-page.jsp"

%>

CAPTURAN DO O ERRO

A pgina error~age.jsp dever ter na diretiva page o atributo isErrorPage,


contendo um valor booleano true.
error-page . jsp
<%@ page language ="java"

contentType="text/html;"
pageEncoding= "ISO-8859-1 "
isErrorPage="true"

%>
< ! DOCTYPE html PUBLIC "- /!W3 CI lOTO XHTML 1. O Transi tionall IEN"

''http://www . w3 . org /TR/ xhtml1 / 0TO / xhtml1-transitional. dtd">

Controlando Erros l\I

157

<html xmlns=''http://www . w3. org/1999 /xhtml ">


<head>
<title>Erro na execuo da sua pgina JSP< / title>
</head>
<body>
<hl>Erro na execuo da sua pgina JSP< / hl>
Um erro ocorreu no seu sistema. Verifique a seguir a possibilidade
de executar novamente a pgina corrigindo suas falhas:
<strong>
<%= exception.toString( ) %>
</strong>

</ body>
</ html>

Com atributo isErrorPage, contendo o valor true 0, voc est informando ao Container Servlet de que essa uma pgina de erros.
A exceo capturada logo a seguir, sendo impressa na tela 8 .

Enviando Erros
Gerar e enviar uma resposta automaticamente para o cliente contendo uma
pgina de erro padro de acordo com o nmero do status informado algo
que um Servlet pode fazer, usando o mtodo de resposta sendError(int i,
String s). Esse mtodo recebe o nmero do erro que deseja enviar e tambm pode receber uma mensagem como parmetro para ser enviado de
forma personalizada ao usurio. Se a resposta j tiver sido executada esse
mtodo lana uma exceo lIIegalStateException. O Servlet a seguir envia ao usurio o erro 403 (Forbidden):
EnviandoErros.java

package meupacote;
import java.io.IOException;
import javax.servlet.ServletException;

158

[1iI] Desenvolvendo Apl icaes Web com JSP...

import javax.servlet . http.HttpServletRequest;


import javax.servlet .http.HttpServletResponse;
public class EnviandoErros extends javax . servlet.http.HttpServlet

public void destroy( } {


super. destroy ( };

protected void doGet(HttpServletRequest request,


HttpServletResponse response}
throws ServletException, IOException {
response. sendError (403, "Voc no tem pennisso") ; O

public void init( } throws ServletException {


super . init( };

o mtodo sendError(int status, String message)O envia para o usurio o HTTP Status Code 403, e tambm uma mensagem personalizada. O
resultado ao acessar esse Servlet pode ser conferido na Figura 11 .2:
Embora no seja obrigatrio, voc deve utilizar as constantes que significam exatamente o inteiro HTTP Status Code. Por exemplo, ao invs de
utilizar o inteiro 403 , voc utilizaria SC_FORBIDDEN.

~-'--'

-- ......_.... .. - .......-

---

......

..... .

- .,....--

---~_....-......-

. ...

Controlando Erros

fiI 159

t't Apache TorncatjS.S. 17 Error report X

"-, .:;> 11 ~~

Ihttp://localhost:8080/TratandoErros/EnviandoErros

HTTP Status 403 - Voc no tem permisso

Ll'Jm Status report


Jilmi!Gl voc no tem permisso

:.mmJJWillil Access to the specfled resource (Voc no tem permisso) has been forbldden.

ache Tomcat/ 5.5.17


v

Figura 11.2

o trecho a seguir demonstra a substituio do nmero inteiro 403


pela sua constante equivalente:
EnviandoErros.java

protected void doGet(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
response.sendError(response.SC_FORBIDDEN,Voc no tem
permisso) ;

A seguir voc tem uma tabela com a constante equivalente no HTTP


Status Code, a mensagem do que significa e a verso do HTTP.

160 lI

Desenvolvendo Aplicaes Web com JSP...


Tabela 11.1
Constante

SC CONTINUE
SC SWITCHING PROTOCOLS
SC OK
SC CREATEO
SC ACCEPTEO
SC NON- AUTHORITATIVE- INFORM
ATION
SC NO CONTENT
SC RESET CONTENT
SC PARTIAL CONTENT
SC MULTIPLE CHOICES
SC MOVE0 PERMANENTLY
SC MOVE0 TEMPORARILY
SC SEE OTHER
SC NOT MOOIFIEO
SC USE PROXY
SC BAD REQUEST
SC UNAUTHORIZEO
SC PAYMENT REQUIREO
SC FORBIOOEN
SC NOT FOUNO
SC METHOO NOT ALLOWEO
SC NOT ACCEPTABLE
SC_PROXY_AUTHENTICATION_REQ
UIREO
SC REQUEST TIMEOUT
SC CONFLICT
SC GONE
SC LENGTH REQUIREO
SC PRECONOITION FAILEO
SC REQUEST ENTITY TOO LARGE
SC REQUEST URI TOO LONG

Cdigo

100
101
200
201
202
203
204
205
206
300
301
302
303
304
305
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414

Mensagem Padro
Continue
Switching Protocols
OK
Created
Accepted
Non-Authoritative
Information
No Content
Reset Content
Partial Content
Multiple Choices
Moved Permanently
Moved Temporarily
See Other
Not Modified
Use Proxy
8ad Request
Unauthorized
Payment Required
Forbidden
Not Found
Method Not Allowed
Not Acceptable
Proxy Authentication
Required
Request Timeout
Conflict
Gone
Length Required
Precondition Failed
Request Entity Too Large
Request-URI Too Long

Verso
doHTTP

1.1
1.1
1.0
1.0
1.0
1.1
1.0
1.1
1.1
1.1
1.0
1.0
1.1
1.0
1.1
1.0
1.0
1.1
1.0
1.0
1.1
1.1
1.1
1.1
1.0
1.1
1.1
1.1
1.1
1.1

Controlando Erros

I\l 161

Tabela 11.1 (continuao)


Constante

se UNSUPPORTED MEDIA TYPE

Cdigo

Mensagem Padro

Verso
doHTTP

se GATEWAY TIMEOUT

415
500
501
502
503
504

Gateway Timeout

1.1
1.0
1.0
1.0
1.0
1.1

se- HTTP- VERSIONNOT SUPPORTED

505

HTIP Version Not


Supported

1.1

se INTERNAL SERVER ERROR


se NOT IMPLEMENTED
se BAD GATEWAY
se SERVIeE UNAVAILABLE

Unsupported Media Type


Intemal Server Error
Not Implemented
8ad Gateway
Service Unavailable

..... .....

....

Captulo

12
Actions

JSP e a resposta
retornada ao cliente. Durante a traduo o container substitui uma
Action por um cdigo Java que corresponda a seu efeito.
Voc j deve ter notado que, apesar de mais simples, utilizar o JSP no
lugar dos Servlets ainda no melhorou muito.
Como alternativa a isso, voc pode usar as bibliotecas de tags que
contm encapsulada partes de funcionalidades lgicas. Essas aes fazem
com que as pginas JSP fiquem muito mais limpas e mais fceis de serem
lidas. Alm, essas tags so baseadas no formato XML e podem ser usadas
tranquilamente por um no desenvolvedor Java.
Mas infelizmente, desenvolver bibliotecas de tags personalizadas
uma alternativa complexa, pois o envolve em um projeto que exige tempo,
tanto para desenvolver como tambm para testar. Pensando nisso, muitos
desenvolvedores ao redor do mundo passaram a criar, e compartilhar de
forma livre, bibliotecas personalizadas com o intuito de serem aperfeioadas e testados por muitas pessoas ao mesmo tempo . A prpria Sun
Microsystems, junto com o Apache Software Foundation tambm desenvolveram suas tags.
Os trs tipos de elementos Actions em JSP so:
~ Standard actions
~ Custom actions
~ JSTL actions
CTIONS SO TA GS QUE A FETA M O COMPORTA M ENTO EM

164

Desenvolvendo Aplicaes Web com JSP...

Standard Actions
A JSP Standard Actions existe desde o primeiro release da especificao
JSP 1.0 e possibilita ao autor da pgina JSP a capacidade de ter um conjunto de aes escritas de fonna relativamente pequena em sua sintaxe. A
maioria das funcionalidades dadas so baseados na manipulao de componentes JavaBeans como requisio de arquivos (include),
redirecionamento de URL e etc .

A Action <jsp:include I>


A action <jsp:include /> similar ao visto anterionnente, na diretiva
inc1ude, onde voc pode incluir uma pgina, ou um pedao de documento
em uma outra pgina.
A action<jsp:include /> demonstra uma facilidade semelhante diretiva
include, mas com algumas diferenas sutis. A action <jsp:include /> executada atualmente em tempo de pedido, habilitando assim a incluso de
contedo dinmico, assim como esttico, tomando assim mais flexvel.
Outra diferena que a action <jsp:include /> no inclui o contedo atual
do recurso includo da mesma maneira como a diretiva include. Ao invs
disso, a action <jsp:include /> incluir qualquer sada gerada pelo recurso
includo diretamente para a JspWriter apontando para a varivel implcita
out. Isso significa que voc pode especificar qualquer tipo diferente de
recurso Web, como outra pgina JSP ou Servlet, contanto que produza um
contedo do mesmo tipo que a chamada pela pgina JSP.
A sintaxe a seguir demonstra como usar a action <jsp:include I>:
<jsp:include page="pagina.jsp" flush="true"/>

Para dinamizar o exemplo, crie a pgina a seguir:


topo.jsp

<%
String texto

= "Esse

out.println( texto) ;
%>

texto do t opo ";

Actions

ll 165

A pgina a seguir ir incluir a pgina JSP topo.jsp:


index.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Trabalhando com Standard Actions

</title>

</head>
<body>
<j sp: include page="topo. j sp" I>

</body>
</html>

Como voc mesmo pode comprovar, a Standard Action <jsp:include /


> muito simples e fcil de ser usada.
Essa tag action pode tambm conter um corpo e, com ajuda de outra
tag, voc pode passar parmetros:
<jsp: include page=" topo. jsp" >
<jsp:param name=" texto" value="Esse texto do topo" I>
</jsp:include>

o tag <jsp:param /> tem dois atributos:

name e value. O atributo


name d o nome do parmetro que pode ser usado pela pgina includa
para acessar esse parmetro. O atributo value o valor dado ao atributo
name.
Com uma pequena mudana voc pode usar essa tag nas pginas j
criadas:

166 l'il Desenvolvendo Aplicaes Web com JSP.. .


topo.jsp

<%
String texto = request.getParameter("texto");
out.println(texto);

%>
index.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<! DOCTYPE html PUBLIC "- /!W3C/ /DTD XHTML 1. O Transitional/!EN"
''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Trabalhando com Standard Actions

</title>

</head>
<body>
<h3>
<jsp:include page="topo.jsp" >
<jsp:param name="texto" value="Esse texto do topo"l>
</jsp:include>

</h3>
</body>
</html>

A Action <jsp:forward I>


A action <jsp:forward /> usada para redirecionar o pedido atual a outro
recurso, como uma pgina esttica, uma pgina JSP ou um Servlet. A sintaxe a seguir demonstra a tag da action <jsp:forward I>:
<j sp: forward page="pagina . jsp' I>

Actions l\I

167

A tag <jsp:param /> tambm pode ser usado com <jsp:forward I>:
redirecionando.jsp
<%@ page language="java"
contentType="text/htrnl"
pageEncoding="ISO-8859-1"
%>
<!DOCTYPE htrnl PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
''http:/ / www.w3.org / TR/ xhtrnl1/DTD/xhtrnl1-transitional . dtd''>
<htrnl xmlns=''http: //www.w3.org/1999/xhtrnl''>
<head>
<title>Usando Standard Actions para redirecionar</title>
</ head>
<body>
<jsp:forward page="index.jsp" />
</ body>
</htrnl>

Voc tambm pode usar em conjunto com a tag <jsp:param /> como
no caso anterior:
<jsp:forward page="redirecionado.jsp">
<jsp:param name="texto" value="Esse texto veio da pgina que ...
redirecionava" />
</jsp:forward>

A seguir voc tem os exemplos desse modo de redirecionamento em ao:


redirecionando.jsp
<%@ page language="java"
contentType="text/htrnl"
pageEncoding="ISO-8859-1"
%>
<!DOCTYPE htrnl PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

-_.

-'-

.-

~......

...... .

'-

.......

- --- . -

---

168

[)jI] Desenvolvendo Aplicaes Web com JSP...

''http://www.w3.org/TR/xht ml1/DTD/xhtml1 - transitiona l .dtd''>


<html xmlns=''http://www.w3.org/1999/xhtml ''>
<head>
<ti t le>Usando Standard Actions para redirecionar</tit l e>
</ head>
<body>
<jsp:forwar d page="redirecionado . jsp">
<jsp:param name="texto" value="Esse texto veio da pgina queredirecionava" />

</jsp:forward>
</body>
</ html>

redirecionado.jsp

<%@ page language="java"


contentType=" text/ html"
pageEncoding="ISO- 8859-1'
%>
<! DOCTYPE html PUBLIC "-//W3C/ /DTD XHTML 1. O Transi t iona l // EN"
''http : //www.w3.org/TR/ xhtml1 /DTD/ xhtml1-transitional .dtd'' >
<html xmlns=''http: //www.w3 . org/1999/xhtml ''>
<head>
<ti tl e>Trabal hando com Standard Act i ons</tit l e>
</ head>
<body>
<%=request.getParameter("texto")%>

</ body>
</ html>

A Action <jsp:useBean I>


A action <jsp :useBean /> projetada especificamente para simplificar o
trabalho dos desenvolvedores com relao a separao do contedo e do
cdigo. Este padro associa um exemplo de um obj eto Java (conhecido

Actions [lil]

169

como JavaBean). A action <jsp:useBean /> altamente flexvel, e sua


funcionalidade controlada pelos atributos passados action.
Essa action ser abordada detalhadamente em captulo posterior.

Custom Actions
Desenvolver em JSP permite desenvolver mdulos reutilizveis, chamados de Custom Actions. Uma custom action invocada usando uma tag
customizada (ou personalizada), popularmente conhecida como custom tag,
em uma pgina JSP.
Uma Tag Library um conjunto de custom tags. Voc j teve em
captulo anterior um pequeno exemplo dessa tag. Criar tags personalizadas
facilita o uso no desenvolvimento de pginas onde equipes de trabalho se
misturam em programadores e designers. Criando uma tag, voc separa a
lgica do design, evitando assim fazer com que o designer seja obrigado a
conhecer a linguagem Java .

JSTL Actions
A JavaServer Pages Standard Tag Library Actions, conhecida tambm
como JSTL, encapsula, em tags simples, as funcionalidades mais comuns
em muitas aplicaes JSP. JSTL consiste em uma coleo de bibliotecas,
tendo cada uma um propsito bem definido, que permitem escrever pginas JSP's sem cdigo Java, aumentando assim a legibilidade do cdigo e a
interao entre desenvolvedores e web designers, proporcionando assim
maior rapidez no desenvolvimento de um web site.
Uma pgina JSTL uma pgina JSP contendo um conjunto de tags
JSTL's. Cada tag realiza um determinado tipo de processamento, onde
cada tag JSTL, faz parte de uma biblioteca JSTL. Sendo assim, uma pgina
JSTL pode utilizar vrias bibliotecas JSTL's.
A primeira especificao JSTL foi libertada emjunho de 2002, com o
propsito exclusivo de fazer com que pginas JSP se tomassem mais fceis de escrever.
Mais adiante voc ver uma captulo completo, com detalhes sobre
essas actions.

.... ...... ......


.Captulo

13
JavaBeans

AVABEANS SO CLASSES QUE POSSUEM O CONSTRUTOR sem argumentos e mtodos de acesso get e set. Tecnicamente isso no necessrio, para uma
classe ser considerada um JavaBean. JavaBeans so amplamente utilizados
em conjunto com pginas JSP, tendo a principal caracterstica de separar a
lgica do visual.
Essa classe pode realizar qualquer tipo de tarefa dentro de uma aplicao Java. O cdigo de JavaServer Pages possui um conjunto de tags para
definir o uso dos JavaBeans. A action <jsp:useBean /> altamente flexvel, e sua funcionalidade controlada pelos atributos passados action.
A action <jsp:useBean I> extremamente flexvel e sua funcionalidade exata controlada pelos atributos passados ao.
Se usada corretamente, essa ao pode reduzir beneficamente a quantia de cdigo scriptlet que seria necessrio em caso contrrio .

o JavaBeans no existe apenas para o desenvolvimento Web,


como largamente usado. Sua concepo inicial era a
reutilizao de programao visual, os famosos "Beans" do
Swing. Tecnicamente JavaBeans o termo correto para a
reutilizao de partes de programas visuais, com certas funcionalidades, mas que passou a ser conhecida popularmente como
componentes, na programao visual para desktop.

172

Desenvolvendo Aplicaes Web com JSP...

Criando seu Primeiro JavaBean


Como voc j sabe, possvel converter boa parte do cdigo Scriptlet,
presente em uma pgina JSP, para um JavaBean, ou componente, visando
reutilizao de objetos. A parte mais importante disso a separao da
lgica da aplicao com a parte visual, facilitando assim o trabalho do
designer e tambm o do desenvolvedor.
Para utilizar um JavaBean, voc precisa primeiro cri-lo. O JavaBean
a seguir um simples exibidor de mensagem, visando introduzi-lo nessa
"forma" de desenvolvimento.
MeuPrimeiroJavaBean.java

package meupacotei
public class MeuPrimeiroJavaBean
private String mensagem = ""i
public String getMensagem{ } {
return mensagem i
public void setMensagem {String mensagem}
this. mensagem = mensagem i

Como Fazer esse Bean Usando o NetBeans


Como voc pode perceber, o Bean nada mais do que uma simples classe
com atributos privados e mtodos acessores pblicos de mesmo nome com
get e set no incio.
Para isso, no NetBeans, v ao menu File, no item New File. Na caixa
de dilogo New File, selecione em Categories o item Java Classes e em
File Types o item Java Class. Embora o NetBeans possua uma categoria
de JavaBeans, para componentes e no para o caso como o que est sendo

Escolha seu Ambiente de Desenvolvimento llfilI

173

apresentado. Clicando em Next, voc tem na segunda etapa do assistente o


nome da classe em Class Name e do pacote em Package. Ao terminar o
preenchimento, clique em Finish.

steps
1.

Z.

Choose fie Type


_
anellocation

anel Locatlon

ClassNome: ~
imelro)a.'::..~~ __________ ....._.._____.._. _ _ _ _ _ _ _ _ _
Proleet:

ITrobComJavolleans

Lcxollon:

15ou'ce PeckaQes

P~ :

~ot.

Created File: nd 5ettinQs\Edson\TrebComJavolleans\src\lav.l,meupacote\MeuPrlmeiro)avolle",,jov. 1

Figura 13."

Quando o cdigo gerado aparecer, voc s precisa criar o atributo, ou


atributos, que deseja utilizar.
Selecione um deles clicando com o direito do mouse. No menu de
contexto v at o item Refactor e clique em Encapsulate Fields.

174

lljl] Desenvolvendo Aplicaes Web com JSP...

f. @:::Me'rineiroJaVaIlean.java

li <? +

~ ~ ~ 'i ; '

L ____.________. __.__._.--.------.. .-------.-4> V<Joo ! ~ '%."" , 2;l! ~ ! o o ""..

ElJ-S
-.J

package .eup"cote;

li ;1 ElPubl~:i~::" S::~~;1::~::~::::~~:~____
I~

/ .. Cre .. ce3 ,,~


public MeuPr:lmo\

. . -~:,1.~_.

Go To

Select n
Enterpris. Resoure.s

Web Service el.nt ResOU'ees

Find Usages
Show Javado<

Al+F7

1:

Reformat Code
Fix I"-ts

etrl+Shilt+F
Al+Shilt+F

Rename ...
Elrtraet Method ...
CMnge Method Parameter...

Run Fie

Shift+F6

Pu! Up.. .

N.wWal:eh ...

Ctrl+Shilt+F7 ~~_
Down
_~~.._...__ ._.______ .._______ -.-;

.I I
.,

1 1

II

I,

Ak+FI

.1111

ctrl+Shilt+M

. ~r~.:-":~~~ry_-c_al:_
ch ......._Alt_+~t:!:.~J.IIII!~.II
i_.T
:. c-=.._ Br
..__...akpoint
._.: ._ _ _ _ _ _ ._ _____C
.._tn_+_F_8._..___
j
0,..
ur:..-x
O
_ 99Ie

(op,:-,

Ctrl+C

Paste

Ctrl+V

Mov. elass...
Mov. Inner to Olker Levei ...

AIt+Shilt+V

eonvert Anonymous Class to lmor ...


Elrtraet Interface .. .

Extraet Supere"'ss .. .
,--..--....- - -.................--_..--.-............_-----I~'-""'type ~'.:_~ossib~.:._._._. _______

Code FoIds

Safely Defete.. .

!Jndo

U_

Redo

............_......._......-

.: : : : :~j

Figura 13.2

A caixa de dilogo Encapsulate Fields surgir, contendo a lista de


campos que sero encapsulados em mtodos getters e setters.
Abaixo existe a visibilidade dos mtodos acessores (Accessor's
Visibility), que no caso deve ser publico

175

Escolha seu Ambiente de Desenvolvimento [1jl]

EI Encapsulate Fields - meupacote.MeuPrill1eiroJavaBean


Llst of Fields to Encapsulate:
Fleld

'ti

. ,: Create Getter

.. " Create Setter

~ getMensagem

mensagem

Fields' Visibi~ty:

!private

Accessors' Visibility:

!publiC

~ setMensagem

~ Use Accessors Even When Field Is Accessible

~ Preview AlI Changes

Next

> ]

Cancel

Help

Figura 13.3

Clique no boto Next. Na parte inferior da sua IDE, aparecer a janela Refactoring. Essa janela mostra as alteraes que sero feitas no seu
arquivo. Clique em Do Refactoring para confirmar ou Cancel se desejar
cancelar toda a operao.

-_._-----_.

,-----: Refactorino

'i'X

~ ~ Encapsulate fields in class meupacote.MeuPrlmeiroJavaBean [2 occurrences]

li'.1i
~ @ TrabComJavaBeans
--=- s,,8,
, 0 1m Source Packages
8 . ~ mmeupacote
~
s. ~ h MeuPrimeiroJavaSean

'*

t, . 0

Create method getMensagem

L .., ~ Create method setMensagem

~
Do Refadoring I)j

I Cantei I
Figura 13.4

176

[1iJ Desenvolvendo Aplica es Web com JSP...

Como Fazer esse Bean Usando o Eclipse


Simples como fazer no NetBeans, v ao menu File, item New e clique em
Other. Selecione Class no topo da lista na caixa de dilogo New. Clique
no boto N ext.
Em Package digite o nome "do pacote e em Name o nome do Bean.
Clique no boto Finish.

L8J

New Java Class

Java Class
(reate a new Java class.

Source folder :
Package:

ITrab( omJavaBeans/src
Imeupacote

I [ Browse .. .
[ Browse .. .

O Enclosinc;J type:

~================--,I[

Name:

IMeuPrimeiroJavaBean

Modiflers:

0 public

Odefault

Dabstract Dfinal
5uperclass:
Interfaces:

prv6te

Bro~:: ...

protected

[J statc

I[ BroVo/se... I

Ijava.lang.Object

,
I

~============~

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _- - J

Which method stubs wouId you liI<.e to create?

Add .. .

I_~~-j

O public static void main(stringD args)


O Constructors from superclass

o Inherited abstract methods

Do you want to add comments as configured In the ~ of the current project?

O Generate comments

Finish

Figura 13.5

j'

Cancel

Escolha seu Ambiente de Desenvolvimento [IjjlJ

177

Para encapsular em mtodos acessores pblicos, voc pode fazer da


mesma forma que no NetBeanso Clique com o direito do mouse sobre o
atributo que deseja encapsular e no menu de contexto selecione Refactor e
clique em Encapsulate Fieldso
Os nomes dos mtodos getter e setter j esto prontos, bastando apenas selecionar o acesso, em Access modifier, que dever ser publico
Por fim, se desejar ter um preview do que vai acontecer como ocorreu
no NetBeans, dando a possibilidade de cancelar as alteraes se assim desejar, basta clicar no boto Preview ou ento ir direto as mudanas clicando
no boto OK.

Encapsulate Field

Satter name:

IgetMensagam
IsetMensagem

Insert new methods after:

IAs first method

Access modifier:

<!>public Oprotected O default Oprivate

Field access in declaring type:

<!> usa setter and getter O keep field reference

Getter name:

_.._-=:1

O Generate method comments

Preview

> Ik

OK

~I

Cancel

Figura 13.6

Para utilizar esse JavaBean, crie a seguinte pgina JSP:


usandoMeuPrimJavaBean.jsp
<%@ page language="java"

contentType=Htext/html H

pageEncoding="ISO-8859-1"

%>
< ! OOCTYPE

html PUBLIC "- // W3C I lOTO XHTML l. o Transi tionall IEN"

178

[liilJ

Desenvolvendo Aplicaes Web com JSP...

''http://www.w3.org/TR/xhtmll/DTD/xhtmll- transitional.dtd''>
<html xrnlns=''http://www .w3 .org/1999/xhtml">
<head>
<title>Usando meu pr i meiro JavaBean</t i tle>
</head>
<body>
<j sp: useBean id="prilneirojb"

class=lmeupacote.MeuPrimeiroJavaBean"/>

A mensagem atua l <strong> <%= primeirojb.getMensagem( ) %>


</strong>
<br />

A mensagem, depo i s de adi c i onada :<br />


<strong>
<%
prilneirojb. setMensagem ("Meu prilneiro JavaBean") ;
out.println(prilneirojb.getMensagem( ));

%>
</strong>
</body>
</html>

A action <jsp:useBean /> cria uma instncia da classe JavaBean e


armazena uma referncia para ela em uma varivel scripting, chamada
primeirojb. Uma expresso JSP simples usada para chamar o mtodo
getMensagem( ) para trazer a mensagem existente. No existindo nenhuma
mensagem, o mtodo setMensagem( String m) lhe d a possibilidade de
colocar um texto e depois recuper-lo com getMensagem( ). Evidentemente esse exemplo muito bsico e no vem a ser a verdadeira lgica por
trs desse recurso, no qual sua utilidade est aqui apenas para ensin-lo de
forma simplificada.
A imagem a seguir demonstra o resultado ocorrido na utilizao desse
JavaBean.

Escolha seu Ambiente de Desenvolvimento


t'

lI 179

Usando meu primeiro JavaBean X

,,':0-:")

Iil ~<!;;

Ihttp://localhost:8080/TrabComJavaBeans/usandoMeuPrimJavaBean.jsp ,vJI &lo

11

A mensagem atual
A mensagem, aps adicionada :
Meu primeiro JavaBean
v

Figura 13.7

Um Outro Exemplo
A idia desse exemplo criar um JavaBean que formatar suas datas, como
j apresentando anteriormente com o uso de Servlet.
For.matandoDatas.java
<lipackage meupacote;
import java.util.Date;
import java . text . *;
public class ForrnatandoDatas
private DateForrnat dateForrnat;
private Date data;
public ForrnatandoDatas( ) {
dateFor.mat = DateFor.mat.getlnstance( ,;
data = new Date( );

public String getData( ) {


return dateForrnat.forrnat(data) ;

public void setData(Date data) {

C)

180 ll Desenvolvendo Aplicaes Web com JSP...


this . data = data;

public void setFormato(String formato) (


this.dateFormat = new SimpleDateFormat(formato);

Para utilizar esse JavaBean crie a pgina JSP a seguir:


TrabComDatas . jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
< !DOCTYPE html PUBLIC "-//W3C/ /DTD XHTML l. O Transi t ional//EN"
''http:/ / www .w3.org/TR/xhtml1/DTD/xhtml1 -transitional. dtd">
<html xmlns= "http : //www . w3. org/1999 /xhtml ">
<head>
<title>Usando JavaBeans para formatar datas</title>
</head>
<body>
<jsp: useBean id="data " class="meupacote.FormatandoDatas " / >

A data atua l <strong> <%= data.getData( ) %> </strong>


</body>
</html>

Esse exemplo bem simples, pois o JavaBean chama a data atual e


atravs da formatao executada pelo mtodo getInstance( ) O da classe
DateFormat. Esse mtodo retoma um formato no estilo SHORT.
Mas lgico que voc pode manipular essa sada e a forma que voc
pode usar simples:

Escolha seu Ambiente de Desenvolvimento

181

TrabComDatas.jsp

<body>
<jsp:useBean id="data " class="meupacote.FormatandoDatas"/>
<% data. setFormato ("dd/MM/yy"); %>

A data atual <strong><%= data. getData ( ) %></st r ong>


</body>

Veja que basta, antes de chamar o mtodo getData(), chamar o mtodo setFormato(String f) O e dar a ele o formato de data que quer exibir.

Compreendendo os JavaBeans
Como voc pode ter notado, at o momento, um JavaBean nada mais do que
uma classe que obedece a um conjunto de regras, utilizando mtodos "getters"
e "setters". Mas essas regras so adotadas voluntariamente pelo desenvolvedor,
onde se ele desejar, poder iniciar seus mtodos com outros nomes.
claro que isso implicaria em outras situaes que no esto em discusso nesse momento. O que realmente voc deve entender que, qualificar uma classe como sendo um JavaBean uma situao exclusivamente
sua. O compilador no lhe dir: isso um JavaBean. Voc quem diz a ele.

As

REGRAS

Em uma situao tcnica, voc tambm tem que seguir algumas regras,
para que o que voc est desenvolvendo seja realmente um JavaBean.
Os JavaBeans, como j foi dito anteriormente, existem tanto para
modelar sistemas grficos criados para desktop ou tambm para aplicaes
Web em conjunto com pginas JSP. Isso, na prtica, implica em duas diferenas iniciais bsicas:
1. JavaBeans criados para trabalhar em desenvolvimento de aplicaes grficas desktop precisam implementar a interface

182

Desenvolvendo Aplicaes Web com JSP...

java.io.Serializable. Isso acontece porque so armazenados em


arquivos. J no caso de pginas JSP, isso no necessrio, uma
vez que, normalmente, s existem em memria.
2. Os JavaBeans desenvolvidos para aplicaes desktop tem uma
tendncia dos nomes com mtodos iniciando com set e get coincidirem com os nomes dos atributos da classe, pois esses representam, numa maioria das vezes, objetos visuais que necessitam
ser configurados.
A tabela a seguir demonstra as regras de trabalho com JavaBeans:
Tabela 13.1
Regra

Descrio da Regra

Construtor

Se o JavaBean no contiver nenhum construtor declarado explicita--_J


mente, o interpretador Java considerar, j faz parte da definio da
linguagem, a existncia de um construtor implcito sem argumentos e
sem nenhuma utilidade.

Persistncia

Os JavaBeans podem implementar a interface java.io.Serializable.


Mas como j foi dito, essa regra no precisa ser obedecida. A no
existncia dessa implementao o impossibilita de ser salvo em arquivo ou ser enviado de um computador para outro em uma aplicao
distribuda.

Atributos

Se o JavaBean criado possui um atributo que voc deseja obter o


seu valor, ele deve ser acessvel por um mtodo pblico que, de preferncia, deve ter o mesmo nome, com o prefixo get. Por exemplo: um
atributo chamado-teste deve ser acessvel externamente por um mtodo public getTeste( ).
Caso se queira alterar o valor do atributo, o mesmo deve ser feito por
um outro mtodo, tambm pblico, void, com o prefixo set; tendo
tambm , um parmetro de mesmo tipo para tal mudana. Por exemplo: seguindo o caso anterior, o atributo teste ser alterado em seu
valor atravs do mtodo public void setTeste (Tipo valor) .
Executando essa normativa, voc tem os atributos encapsulados.
Portanto esses mesmos atributos devem ser qualificados como protected ou private .

Usando as Actions <jsp:setProperty I>


<jsp:getPropert I>

Como voc viu, os JavaBeans, acessveis atravs da action <jsp:useBean 1>,


so simples de trabalhar dentro das pginas JSP. Ma a utilizao ainda de

Escolha seu Ambiente de Desenvolvimento !I

183

Scriptlets no agrada no seu trabalho. Evidentemente voc j deve ter concludo que devem existir actions especficas para isso.
Como o nome j sugere, a tag <jsp:setProperty I> usada para alterar uma propriedade existente em seu JavaBean.
Para um JavaBean, usando o exemplo da data feito anteriormente,
voc pode setar uma propriedade chamada data, desde exista o mtodo
setData( ). A seguir voc tem a sintaxe dessa tag:
<jsp:setProperty name="data"
property="formato" value="dd/ MM/ yy" / >

Para colocar em prtica, voc vai alterar o exemplo ltimo, tirando o


scriptlet e o substituindo pela action <jsp:setProperty I>, como mostra a
seguir o detalhe em destaque:
TrabComDatas.jsp

<body>
<jsp:useBean id="data" class="meupacote.FormatandoDatas" / >
<jsp:setProperty name="data"
property="formato" value="dd/ MM / yyyy"/> O
A data atual <strong><%= data.getData( ) %>< / strong>
</ body>
</html>

o resultado obtido o mesmo do scriptlet, mas com a diferena que


voc est usando uma tag.
Da mesma forma que voc pode alterar um valor, atravs de uma
action, voc tambm pode capturar um valor de uma propriedade. Para
isso, a action <jsp:getProperty 1>0 captura o valor existente na propriedade chamada. Como no exemplo anterior, se eu desejo capturar o valor de
uma propriedade chamada data, eu posso desde que exista um mtodo
chamado getData( ). A seguir voc tem a sintaxe dessa tag:
<jsp:getProperty name="data" property="data" />

184 ll Desenvolvendo Aplicaes Web com JSP...


Para propsitos mais prticos, altere como mostrado a seguir, na sua
pgina JSP deste captulo:
TrabComDatas.jsp

<body>
<jsp:useBean id="data" class="meupacote.FormatandoDatas"/>
<jsp :se tProperty narne="data" property="forrnato" value="dd/MM/yyyy"/>
A data atual
<strong>
<jsp:getProperty name="data" property="data" />

</strong>
</body>
</html>

Note que houve uma simplificao do cdigo, tomando-o mais claro


a um usurio sem experincia com Java e, possibilitando assim, um melhor
trabalho em equipe, onde a colaborao pela clareza do cdigo ajuda no
desenvolvimento do designo

Criando um JavaBean mais Dinmico


At o momento voc criou JavaBeans estticos, que trazem e levam informaes, mas todas sem interao com o usurio. O exemplo a seguir demonstra a criao de um JavaBean interagindo com o usurio:
InteragindoBean.java

package meupacote;
public class Interagi ndoBean
private String nome ;
public String
return nome;

getNome( ) {

Escolha seu Ambiente de Desenvolvimento [ilJ

185

public void setNome(String nome)


this.nome = nome;

o JavaBean criado simples e portanto no ser comentado.


Para acess-lo, voc vai criar a seguinte pgina:
interagindo.jsp

<%@ page language="java"


contentType=Htext/html"
pageEncoding="ISO-8859-1"
%>
< !DOCTYPE html PUBLIC "-/ /W3C/ /DTD XHTML 1. o Transitional/ /EN"
''http://www.w3 .org/TR/xhtml1/DTD/xhtml1-transitional.dtd H>
<html xmlns=Hhttp://www.w3 .org/1999/xhtml">
<head>
<title>Interagindo com o Usurio</title>
</head>
<body>
<jsp:useBean id=Hinteragindo H class=Hmeupacote.lnteragindoBean" />
<jsp: setProperty name="interagindo" property="*" />

Seu nome : <strong>


<jsp:getProperty name=Hinteragindo" property="nome" />
</strong>
<form method="post H action="interagindo.jsp">
Nome: <input type="text" size="20" name="nome" /> <br />
<input type="submit" name=Hsubmit H value="Enviar H />
</form>
</body>
</html>

186 !l Desenvolvendo Aplicaes Web com JSP...


Se na tag <jsp:setProperty /> voc usar o valor "*,, para o atributo
property O, significa que todos os valores de elementos de formulrios
que possurem nomes iguais s propriedades sero transferidos para as respectivas propriedades no momento do processamento da requisio. No
exemplo dado, voc tem um atributo chamado nome em seu JavaBean e,
para enviar esse valor, chamou a tag <jsp:setProperty atribuindo o valor *
ao atributo property, indicando o nome da tag HTML <input/>, no atributo name com o valor nome
Os valores dos parmetros enviados pelo cliente para o servidor so
sempre do tipo String. Os valores String so convertidos para outros tipos
de dados para serem utilizados pelas propriedades encontradas no JavaBean.
Essa converso mostrada pela tabela a seguir:

e.

Tabela 13.2 - A converso do <jsp:setProperty />


O valor Sfring convertido usando

Tipo da Propriedade
boolean ou Boolean

java .Iang. Boolean. valueOf{ String s)

byte ou Byte

java.lang.Byte.valueOf{String s)

char ou Character

java.lang.Character.valueOf{String s)

double ou Double

java.lang.Double.valueOf{String s)

integer ou Integer

java.lang.lnteger.valueOf{String s)

float ou Float

java.lang.Float.valueOf{String s)

long ou Long

java.lang.Long.valueOf{String s)

Quando voc usar o atributo property="*", as propriedades


do Bean no precisam aparecer necessariamente como no formulrio HTML e vice-versa .

O Atributo Scope
Existe um atributo chamado scope, do qual ainda no foi visto, que aparece
na tag <jsp:useBean I>. O escopo dos JavaBeans indicam a utilizao daquele objeto. Existem quatro valores possveis para o escopo de um objeto:
page, request, session e application. A seguir voc tem uma tabela com a
descrio de cada uma desses escopos:

Escolha seu Ambiente de Desenvolvimento I\.l

187

Tabela 13.3

Escopo

Descrio

page

Objetos declarados com esse escopo so vlidos at a resposta ser enviada ou o


pedido ser encaminhado para outro programa no mesmo ambiente, ou seja, s6
podem ser referenciados nas pginas onde forem declarados e removido no fim
da execuo da mesma. Objetos declarados com o escopo page so referencia
dos pelo objeto pageContext.

request

Objetos declarados com esse escopo so vlidos durante o pedido e so acessveis mesmo quando esse pedido encaminhado a outro programa no mesmo
ambiente. Somente est disponvel durante a execuo do request, ou seja, a
cada novo pedido, um JavaBean instanciado para atender a requisio.
Objetos declarados com o escopo request so referenciados pelo objeto request.

session

Objetos declarados com esse escopo so vlidos durante a sesso existente,


desde que a pgina seja definida para funcionar em uma sesso e removido
quando a sesso expirar ou se for encerrada explicitamente. Objetos declarados
com o escopo session so referenciados pelo objeto session.

application

Objetos declarados com esse escopo so acessveis por pginas no mesmo servidor de aplicao e removido quando o servidor Web parado ou quando a aplicao Web reiniciada. Objetos declarados com o escopo application so
referenciados pelo objeto application .

Encapsulando mais de um Campo no Eclipse


Enquanto que no NetBeans, mais de um campo privado pode ser encapsulado
de uma s vez, usando a ferramenta Refactor, no Eclipse ligeiramente
diferente.
Veja o caso na Figura 13.8 a seguir:
COE]

d) llvros.)ava )(

1 package

m~upacot~;

'-' 0

import

java . util.Dat~;

'I

5 public class Livro3 ~


prlvate String i3bn;
7
prlvate String titulo;
8
prlvate Integer edicao;
prlvate Date publicacao;
prlvate String de3cricao;

<

Figura 13.8

188 Il Desenvolvendo Aplicaes Web com JSP...


Note que so vrios os atributos dessa classe, o que far com que
vrios mtodos getters e setters sejam feitos. Mas para encapsular todos
de uma s vez no Eclipse, v ao menu Source e clique no item Generate
Getters and Setters. Na caixa de dilogo Generate Getters and Setters
clique no boto Select AlI.

Generate Getters and Setters

"'

Irg]

Select getters and setters to create:


lB ~

tE . ~

D
D

lB" ~

lB~

ll~

I Select Ali .'.1


lo.
I Deselect Ali \lI

descricao
edicao
isbn
publicacao
titulo

I
[ Select Setters I

[ Select Getters

Insertlon point:

ICursor position

'cl

Sort by:

IAelds in getterIsetter pairs

.VJI

Access modifer
0public

Oprotected

o final

O synchronzed

Odefauft

Oprivate

O Generate method comments


The format of the getters/setters may be conflgured on the Code Templates preference page.

10 of 10 selected.

<1>
Figura 13.9

Confinne a caixa de dilogo no boto OK.

OK

I[

Cancel

.. ..

...

Captulo

14
Fazendo Upload de Arquivos

LGUMAS VEZES VOC PREC ISA ENVIAR ARQUIVOS AO SERVIDOR

e para fazer

isso, voc precisar se preocupar com alguns detalhes:


~ Que arquivo desejo enviar
~ O tamanho mximo que o arquivo poder ter
~ O local onde desejo armazenar os arquivos enviados

Trabalhar com arquivos em Java no uma tarefa fcil. Mas voc pode
utilizar uma biblioteca de terceiros, ajudando-o assim nessa tarefa .

A Biblioteca File Upload


Um exemplo de uma biblioteca que pode ser utilizada para esse tipo de
tratamento pode ser encontrada no endereo http://jakarta.apache.orgl
commons/fiIeupload/ . A verso atual no momento em que esse livro est
sendo desenvolvido FileUpload 1.1.1.
O arquivo commons-fiIeupload-1.1.1.jar e deve ser colocado dentro do diretrio lib, que deve se encontrar em WEB-INF.
Alm desse arquivo, voc precisar do arquivo commons-io-1.2.jar,
que pode ser baixado no endereo
http: //jakarta.apache.org/commons/io/ .

190

[iiJ Desenvolvendo Aplicaes Web com JSP...

Commons 10 uma biblioteca de utilidades para dar assistncia com


o desenvolvimento de funcionalidades para entradas e sadas (lnput/Output).
A biblioteca FileUpload depende dessa biblioteca .

Fazendo upload de Arquivos Utilizando JSP e


JavaBeans
A idia criar um simples JavaBean, mas poder ser aperfeioado com
mtodos que o ajudem no desenvolvimento para utilizar o Upload de arqUIvOS .

UploadBean. j ava

package meupacote;
import java.io.File;
import java.util . *;
import org.apache.commons.fileupload.*;
import org.apache . commons .fileupload.disk .DiskFileltemFactory;
import org.apache . commons .fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
import javax.servlet.http.*;
public class UploadBean {
private DiskFileltemFactory fileUpload
private ServletFileUpload sfu
ServletFileUpload(fileUpload};
private String diretorio;
private String filename;

= new

= new

public void setDiretorio(String diretorio}


this.diretorio = diretorio;

DiskFileltemFactory( };

Fazendo Upload de Arquivos l'iI

191

public String getDiretorio( ) (


return diretorio;

public String getFilename( ) (


return filename;

publ ic boolean doFilePost (HttpServletRequest request,

4)

ServletContext context)
if (request.getContentType ( ) == null )

return false;
if (! request. getContentType ( ). startsWith ("multipart / formdata ")) 8)
return false;
String path = context.getRealPath(getDi retorio ( ) ); t)
try
List list = sfu.parseRequest(request);
Iterator iterator = list . iterator( );

~
~

while(iterator.hasNext( ))(
Fileltem item

= (Fileltem)iterator.next(

if (!item.isFormField( )) (
f i lename = item.getName(

);

) ;~

if ((filename != null) &&


(! filename.equals ("'))) {
filename = (new File(filename)) .getName( );
item.wri te(new File(path + " I " +
filename )) ;0

192

[)jlj Desenvolvendo Aplicaes Web com JSP...

}catch (FileUploadException e) {
e.printStackTrace( );
}catch (Exception e) {
e.printStackTrace( );

return true;

Esse JavaBean criado simples e o auxilia a fazer upload de arquivos


sem trauma. Voc perceber que pode ser implementado com muito mais
funcional idades.
Antes de mais nada, voc precisa importar a biblioteca do FileUpload:
import org. apache. commons. fileupload. *;
import org.apache.commons.fileupload.disk.DiskFileltemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

A classe pblica DiskFilelternFactory estende java.lang.Object e


implementa FilelternFactory. Se os elementos forem pequenos, os mantm em memria, ou em um arquivo temporrio no disco, para elementos
maiores. O limite de tamanho sobre o qual ser armazenado o contedo em
disco configurvel, assim como o diretrio no qual sero criados os
arquivos temporrios.
private DiskFileltemFactory fileUpload =
new DiskFileltemFactory( );

A classe pblica ServletFileUpload estende FileUpload. Esta classe


controla mltiplos arquivos por nico envio.

Fazendo Upload de Arquivos !\I

193

private ServletFileUpload sfu =


new ServletFileUpload(fileUpload);

o mtodo doUpload(HttpServletRequest hsr, ServletContext se)


0 , recebe dois parmetros, onde um a requisio feita pelo formulrio e
a outra o contexto necessrio para a aplicao Web criada por voc. Graas interface ServletContext, do pacote javax.servlet.ServletContext,
usado para acessar informaes a respeito do ambiente do Servlet, onde
voc pode, por exemplo, recuperar o caminho fisico dado a um determinado arquivo, partindo do contexto onde se encontra sua aplicao Web.
voc verifica se foi enviado alguCom request.getContentType( )
ma informao para o mtodo doUpload (). Caso no tenha sido submetido nada, ele retoma false. O mesmo acontece se voc submeter um arquivo
de um formulrio sem o atributo enetype="multipart/form-data"
O caminho fsico mencionado a pouco tido pelo mtodo
getRealPath(String path) O.
Atravs de parseRequest(HttpServletRequest hsr) 0 voc adquire
uma lista de elementos, que so associados a um List.
A interface Iterator CD associa, a cada coleo, um mecanismo para
percorrer seu contedo independentemente da sua estrutura interna. Um
objeto desta classe oferece os mtodos: hasNext(), next() e remove().
A varivel filename o nome do arquivo, que aps o loop while
pego com o mtodo getName( )8, no qual retoma uma String. A classe
File encapsula a funcionalidade necessria para se trabalhar com o sistema
de arquivos na mquina.
Com o mtodo writeG) voc tem o arquivo encontrado escrito no
diretrio mencionado pela varivel path .
Para utilizar esse JavaBean, basta criar a pgina mostrada a seguir:

e.

fazendoUploadComJsp.jsp
<%@ page language="java"

cOtentType=" text/htrnl "


pageEncoding="ISO-8859-1"
%>

194

[1jjl] Desenvolvendo Aplicaes Web com JSP...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitionall/EN"


''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Fazendo Upload de arquivos</title>
</head>
<body>
<jsp:useBean id="upl" scope="page"
class=lmeupacote.UploadBean" />

<jsp:setProperty name=" upl " property="diretorio"


value="arquivos"/>

<%
if( upl.doFilePost(request,application) ) {

out.println( upl.getFilename( ) ); t}

%>
<form method="post" action=" fazendoUploadComJsp. j sp"
enctype="multipart/form-data">
Arquivo: <input type="file" name="file" /><br />
<input type="submit" name="submit" value="Enviar" />
</form>
</body>
</html>

o
e

Primeiro voc chama o JavaBean criado.


Com a tag <jsp:setProperty /> voc determina o nome do diretrio
que ir receber os arquivos no Upload.
8) Com um IF, voc verifica se o mtodo doUpload() retoma true
ou false. Perceba tambm os parmetros passados para que ele
funcione corretamente.

Fazendo Upload de Arquivos [ijjlJ

195

Caso a o mtodo doUpload( ) retome um valor true, significa


que voc fez o upload do arquivo com sucesso e portanto poder
ter impresso na pgina o nome do arquivo enviado, atravs do
mtodo getFilename( ), que retoma esse nome .

Para Funcionar
Voc NO pode esquecer de colocar os arquivos commons-fileupload1.1.1.jar e commons-io-1.2.jar dentro do diretrio lib em WEB-INF.
Sem esses arquivos voc no far o upload desejado, sem contar os
erros que aparecero .

Como Adicionar uma Biblioteca Usando o NetBeans


No seu projeto, v com o direito do mouse sobre o item Libraries e no
menu de contexto selecione Add JAR/Folder.
Selecione os arquivos desejados e clique em confirme.

: Projects .,

I B .. @

x : files

: Runtime

UploadComfileUpload

e '(Q

Web Pages

. ~" iC) META-INF


ttJ"iC) WEB-INF

, "".i) index.jsp
$I"Q) Confguraton Files

;,, ., 68

Server Resources

$ " 6EI

Source Packages

$ , 69

Test Packages

$1 .~ ~iIIiiIiiI!---------,
00",
Add Projed ...

i $.Q] JDK
' ..:)

Figura 14.1

196 lI

Desenvolvendo Aplicaes Web com JSP...

Como Adicionar uma Biblioteca Usando o Eclipse


Com o seu projeto selecionado, v ao menu Project e clique no item
Properties. Na caixa de dilogo Properties clique no boto Add Externai
JARs. Selecione os arquivos e confirme.
~ Properties for FileUploadCornEclipse

Itype filter text


Info
' .. Beanlnfo Path
Bunders
J2EE Module Dependencl
JIlVIl Build P<lth
ltl Java Code Style
ltl J<lva Compiler
lavadoc Location
JSP Fragment
. Profile Compliance and Vi
project F<lcets
Project References
Server
Targeted Runtimes
.. Task Tags
Vlllidation
Web Content Settngs
Web Project Settings
ltl XDoclet

r:::- ,rQ)r:g)

J2EE Module Oependencies


This property P/lge lets Vou add the Web Library dependency to other jav<l
modules in the workpspace. This dependency resolves the java modules into
the web\fib folder of the web module & deployment time.
Select ut~ity projects to add as Web Library projects to the web module
JAR/Module

Project

Select Ali
Oe:;"lect Ali
Add JARs .. .

IAdd Externai JARs . " I


I Add Variable ... .r

~<i~i~i.~_(-~~=-_~
, ~~ii~ . ____________________

IRestore Defaults II

Apply

I[

Cancel

OK

'-------'

Figura 14.2

Segurana no Upload
Um problema que voc vai enfrentar, ao enviar arquivos para o servidor,
ser o de dizer quais esto autorizados para serem feitos upload. Isso, principalmente se no for voc a pessoa no qual vai operar a aplicao.

Fazendo Upload de Arquivos l\l

197

Dizer tambm o tamanho do arquivo e o nome do diretrio no qual ir


armazenar os arquivos enviados. Tambm interessante verificar um erro
comum, o de esquecer o enctype="multipart/form-data".
Para fazer tudo isso, voc vai modificar o Bean criado, adicionando
novos mtodos e propriedades. O JavaBean, com as alteraes em destaque, mostrado na integra logo a seguir:
UploadBean.java

package meupacote;
import java . io.File;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileltemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet . ServletContext;
import javax.servlet.http.*;
public class UploadBean (
private DiskFileltemFactory fileUpload
DiskFileltemFactory( );
private ServletFileUpload sfu
new
ServletFileUpload(fileUpload);
private String diretorio;
private String filename;
private static int KB

1024;

private static int ME


1024 * 1024;
private int size;
private String extensoesPermitidas;
private String erro=null;

new

198

l)jl] Desenvolvendo Aplicaes Web com JSP...

public void setDiretorio(String diretorio)


this.diretorio = diretorio;

public String getDiretorio( ) (


return diretorio;

public String getFilename( ) (


return filename;
public void setSize(int size) (
this . size = size;

public int getSize( ) (


return size;

private void setErro(String erro) (


this.erro = erro;

public String getErro( ) (


return erro;

public void setExtensoesPermitidas(String extensoesPermitidas)


this.extensoesPermitidas = extensoesPermitidas;

public String getExtensoesPermitidas( ) {


return extensoesPermitidas;

Fazendo Upload de Arquivos [liil]

199

public boolean doFilePost(HttpServletRequest request,


ServletContext context)
if (request.getContentType(
return false;

null) {

if (! request. getContentType ( ). startsWi th ("multipart/


form-data") )
setErro("Seu formulrio no envia arquivos");
return false;

fileUpload . setSizeThreshold(4 * KB);

String path
try

context.ge tRealPath(getDiretorio( ));

sfu.setSizeMax(getSize( ) * MS);

List list = sfu.parseRequest(request);

for (Iterator iterator = list . iterator( );


iterator.hasNext( );) {
Fileltem item = (Fileltem)iterator . next( );
if (!item.isForrnField( )){
filenarne = item.getNarne( );

if ((filenarne != null) &&

200

Desen volvendo Aplicaes Web com JSP...

(!filename.equals(""))) {
filename

= (new

File(filename)) . getName( );
if(isPermission(filename)) {

item.write(new File(path + "I" + filename));


else{
setErro ( "Arqui vo no permi tido" ) ;
return false;

}catch( FileuploadBase.SizeLimitExceededException

slee){ ~

slee.printStackTrace( );
setErro ("Tamanho excedido") ;
return false;
}catch (Exception e) {
setErro("Uma Exceo ocorreu: "+e.getMessage( ));
e.printStackTrace( );
return false;

return true;

public boolean isPermission (String fileName)

C)

String lowerCaseName = fileName.toLowerCase( );


StringTokenizer st = new
StringTokenizer(extensoesPermitidas , " ,H );

Fazendo Upload de Arquivos l\I

201

while(st.hasMoreTokens( )) {
if (lowerCaseName.endsWith("."+st.nextToken( )))
return true;

return false;

Novos atributos foram adicionados nesse JavaBean 0, com o intuito


de definir regras como tamanho do arquivo (size), valor MB, KB, extenses
permitidas (extensoesPermitidas) e erros (erro). Com esses atributos, voc
encapsula em mtodos setters e getters valores que sero definidos pelo
usurio.
Com o mtodo setSizeMax(long 1)49, de org.apache.commons.
fileupload.servlet.ServletFileUpload, voc define o tamanho mximo permitido pelo arquivo, em bytes. Evidentemente essa definio deve ficar,
embora no obrigatrio, dentro de um bloco try... catch, para que uma exceo seja disparada caso o tamanho definido exceda. Se exceder, a exceo FileUploadBase.SizeLimitExceededException@) disparada, no qual
voc pode capturar e avisar seu usurio do problema ocorrido, como fora
feito no caso.
Um outro mtodo, chamado de isPermission(String filename)O,
entra em ao, determinando se a extenso do arquivo que voc est fazendo
upload permitida. A idia nesse caso transmitir pela tag <jsp:setProperty I>,
no atributo value, as extenses permitidas separadas por vrgula, como por
exemplo: "jsp, pdf, gif'.
Para que isso seja possvel, entra em cena a classe StringTokenizer,
capaz de varrer uma String e quebr-la em tokens, isto , palavras-chave
separadas por algum caractere delimitador, como no caso, a vrgula. Atravs
do loop While(), voc varre os tokens, atravs do mtodo hasMoreTokens(
), que retoma true enquanto houver algo na String. O mtodo nextToken()
retomar o token atual, concatenando-se ao ponto ".". Isso foi necessrio,
porque o arquivo que voc fizer upload, ser lido pela sua extenso, aps o

202 ll Desenvolvendo Aplicaes Web com JSP...


ponto. Isso possvel porque, ao transmitir o arquivo, em tipo String, voc
pode usar o mtodo endsWith() (termina com) e determinar a extenso
que quiser, como ".jpg", ".gif' e etc. Voc deve estar se perguntando, mas
eu posso fazer isso sem o ponto, ento, o porqu do ponto?
A resposta para isso est no nome do arquivo que um usurio pode
mandar, algo como meuarquivogif e no conter a extenso. E esse ser um
arquivo pernicioso, como ocorre no Linux, onde um executvel no precisa de extenso, como no Windows. claro que isso no o assegura de que
ainda assim um arquivo pernicioso no seja enviado, mas o ajuda a barrar
pelo menos para os menos experientes .

Utilizando esse JavaBean


Fica evidente que se toda a lgica est aplicada no JavaBean, a sua pgina
JSP ser bem simples, uma vez que voc s precisa chamar esses novos
mtodos e exibir as mensagens de erros, quando houver. A pgina JSP
mostrada na integra a seguir, com destaques para as adies:
fazendoUploadComJsp.jsp

<%@ page language="java" contentType="text / html"


pageEncoding="ISO-8859-1"%>
< !DOCTYPE html PUBLIC "-/ /W3C/ / DTD XHTML 1. O Transitional//EN"
''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''>
<html xmlns=''http://www .w3.org/1999/xhtml">
<head>
<t itle>Fazendo Upload de arquivos</title>
</head>
<body>
<jsp:useBean id="upl" scope="page" class="meupacote.UploadBean" />
<jsp:setProperty name="upl" property="diretorio"
value=" arquivos "/>
<jsp:setProperty name="upl" property="size" value=" l "/>O
<j sp: setProperty name=" upl" property=" extensoesPermitidas "

Fazendo Upload de Arquivos [)iIJ


value="jpg , gif, pdf, doe, odt"/>

203

E9

<%
if(upl.doFilePost(request,application)){
out.println(upl.getFilename( ));
else{
if( upl.getErro( )!=null)

out.println(upl.getErro( ));
%>
<form method= "post" action=" fazendoUploadComJsp. j sp"
enctype="multipart / form-data ">
Arquivo: <input type="file" name="file" / ><br / >
<input type="submit" name="submit" value="Enviar" / >
</ form>
</ body>
</ html>

o
e

Chamando a propriedade size, voc define, em MB, o tamanho


mximo que seu arquivo ter.
Em extensoesPermitidas, voc define as extenses, sem o ponto, que sero permitidas, todas, separadas por vrgula.
@) Caso o Upload do arquivo tenha alguma falha, o mtodo getErro( )
trar pra voc o erro armazenado graas ao mtodo setErro (String
err) do seu JavaBean.

... ... ....

.. ..

Captulo

1$
Trabalhando com Banco de
Dados

RABALHAR COM BANCO DE DADOS EM APLICAES WEB a coisa mais comum no desenvolvimento. Este captulo tratar do uso de banco de
dados em aplicaes Web com Servlets e pginas JSP. Existem atualmente
dezenas de bancos de dados no mercado. Os mais populares so o Oracle,
MySQL, SQL Server, PostgreSQL, DB2, Interbase, Firebird. Todos eles
so baseados no conceito relacional de dados .

Introduo ao JOBe
JDBC uma API includa dentro da linguagem Java para o acesso a banco
de dados . Consiste em um conjunto de classes e interfaces escritas em Java
que oferecem uma completa API para a programao com banco de dados,
por tanto uma soluo 100% Java.
JDBC uma especificao formada por uma coleo de interfaces e
classes abstratas, que devem implementar todos os fabricantes de drivers
que queiram realizar uma implementao de seu driver 100% Java e compatvel com JDBC .
Devido ao JDBC ser escrito completamente em Java tambm passa a ter
a vantagem de ser independente de plataforma. Sendo assim, no ser necessrio escrever um programa para cada tipo de banco de dados, uma mesma
aplicao escrita utilizando JDBC poder trabalhar com banco de dados como
Oracle, Sybase, SQL Server, MySQL, Firebird, PostgreSQL e etc. Para que

->

"'---"---

206

[1jjI]

Desenvolvendo Aplicaes Web com JSP...

isso acontea, basta alterar o JDBC referente ao banco de dados usado e o


seu sistema passar a se comunicar com o banco de dados configurado.

MySQL e o JOBe
Sendo um dos sistemas de gerenciamento de bancos de dados mais usados
do mundo, sua velocidade e capacidade de ser multiplataforma s poderiam chamar a ateno de quem desenvolve em Java.
O driver JDBC escolhido para fazer os exemplos neste livro foi o
Connector/J. Usando o driver Connector/J, todos os tipos de aplicaes de
Java podem acessar um banco de dados e seus dados, desde que seja em
MySQL claro.

A Instalao e Utilizao do MySQL


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
famlia NT( NT, 2000 ou XP), o MySQL instalado como servio. Ento
basta iniciar ou parar o servio, encontrado no Painel de CODtrole>FerrameDtas Administrativas>Servios.
Voc tambm pode utilizar o comando pelo prompt, desde que voc
saiba o nome do servio do seu MySQL:
Para iniciar o servio
net start mysql

Trabalhando com Banco de Dados lI

20 7

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.rprn - para instalar o servidor mysqld
no Linux
MySQL-client-[verso].i386.rprn - 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-S.O.l.i386.rpm MySQL-clientS.O.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

Se o seu sistema operacional for Linux e sua distribuio for o


Debian ou baseados nesta distro, voc pode compilar os fontes
ou converter em .deb usando o Alien. O Alien permite converter
pacotes .rpm, que originalmente seriam destinados a distribuies como o Fedora, Red Hat Enterprise em .deb.

208

[ljjl] Desenvolvendo Aplicaes Web com JSP...

Acessando o Banco de Dados MySQL


No

WINDOWS

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.

~
'/lo/ti
No

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
clicando no atalho do MySQL para iniciar o prompt de comando
encontrado neste local.

LINUX

Se voc utilizou a instalao binria, em rpm (recomendado), basta abrir o


terminal e digitar a seqncia:
shell>mysql -u root

Trabalhando com Banco de Dados l\J

209

Se j estiver logado como root, no seu sistema operacional, no h


necessidade de colocar o -u root depois do comando mysql.

O Comando CREATE
H muitas maneiras diferentes de criar banco de dados no MySQL (assim
como h em outros bancos da mesma categoria). Ao criar um banco de
dados, voc normalmente ter o layout inteiro pronto. Nom1almente 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 livraria;

Note que no foi utilizado acentuao e em casos de palavras compostas no insira espaos, se for o caso insira sublinhado" _ " .

O Comando USE
Depois de confirmado a criao do banco de dados, voc dever utilizar o
comando USE para utilizar o banco de dados livraria.
USE livraria;

Um ponto importante que o MySQL no toma ativo o banco de


dados que voc criou, isso deve ser implcito.

210

[lil] Desenvolvendo Aplicaes Web com JSP...

Criando Tabelas
Criar tabela no MySQL uma tarefa relativamente fcil. Para se criar uma
tabela basta usar a seqncia mostrada a seguir em destaque. Observe os
passos:
1 - Lagar no sistema:
shell>mysql -u root -p

2 - Entrar no banco de dados criado:


mysql> USE livraria;

3 - Criar a tabela livros:


my sql > CREATE TABLE livros (
- > isbn CHAR (13) NOT NULL PRlMARY KEY,
- > titulo VARCHAR(SO) ,
- > edicao_num TINYINT(2),

- > ano-publicacao YEAR,


- > descricao

TEXT

- > );

O Comando SHOW
Assim que criada sua primeira tabela. Para ver o resultado basta digitar a
seqncia:
SHOW TABLES FROM livraria;

Para ver as colunas que existem na sua tabela digite:


<
SHOW COLUMNS FROM livros;

Trabalhando com Banco de Dados lI

211

Configurando Usurios

comando GRANT utilizado para fornecer direitos aos 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:
my s ql > 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.

Confirmando o Novo Usurio


Para confirmar a criao do novo usurio, voc deve executar a instruo a
segUIr:
my sql> flush privileges;

Inserindo um Registro
Para inserir um registro, execute a seguir a instruo SQL:
my sql> INSERT INTO livros (isbn, titulo, edicao_num,
->

ano-publicacao, descricao)

->

VALUES ('85-7393-543-X','Daminando AJAX',1,'2006','AJAX');

212

Desenvolvendo Aplicaes Web com JSP...

Instalando o Oriver JOSe

o arquivo que ser adicionado, o ajudar a se conectar ao banco de dados


MySQL. Esse arquivo JAR o driver JDBC chamado de Connector/J,
que voc poder baixar no site http://www.mysql.com/downloads.No
momento em que escrevo , o driver que estou utilizando o mysqlconnector-java-5.0.3-bin.jar. O arquivo pode ser baixado em formato .zip
ou formato. tar.gz. Aps baixar, descompacte e coloque o arquivo citado
anteriormente no diretrio lib em WEB-INF da sua aplicao .

Utilizando um Oriver JOSe no NetSeans e no


Eclipse
Da mesma forma aprendida no Captulo 14, voc pode configurar o driver
JDBC seguindo os mesmos passos descritos, portanto detalhes sobre essa
configurao ser omitida nesse captulo.

As APls JOSe
As APls JDBC consistem em diversos pacotes que possibilita ao desenvolvedor de aplicativos vrios servios.
A verso 2.0 da API JDBC contm duas partes principais: o JDBC 2.1
Core API (representado atravs de classes nos pacotes java.sql) e o JDBC
2.0 Optional Package API (representado atravs das classes nos pacotes
javax.sql). Na verso 3.0 da API JDBC, as duas partes principais foram
combinadas em uma, o JDBC API; porm em sua verso 3.0, permanece o
pacote original que ainda nomeia todas as classes. O JDBC API 4.0 busca
melhorar a aplicao Java ao acesso a dados SQL, com o intuito de melhorar o desenvolvimento, aproveitando os recursos do Java SE 5, como os
Generics e Annotations, alm de adicionar novas classes utilitrias. Apesar
de mencionado, o JDBC API verso 4 ser disponibilizado pelo Java SE 6,
de codinome Mustang, que at o momento em que esse livro escrito, se
encontra em verso beta.

Trabalhando com Banco de Dados ~

213

O Pacote java.sql
Este pacote contm as classes core e interfaces que so necessrias para
lidar com o bancos de dados.
Esses elementos relacionam as tarefas como s mostradas a seguir:
~ Fazer uma conexo ao banco de dados pelo DriverManager;
~ Enviar declaraes SQL para um banco de dados, inclusive elementos como Statement, PreparedStatement e Connection;
~ Lidar com respostas e atualizaes via ResultSet;
~ Mapeamento padro de tipos SQL para classes e interfaces na linguagem Java, inclusive elementos como Array, B/oh , C/oh, Date,
Time e Timestamp,
~ Obter metadados de um banco de dados por DatabaseMetaData,
colunas em um ResultSet via ResultSetMetaData
~ Lidar com excees tal como o SQLException.

O javax.sql
Este pacote contm as classes e interfaces que so usadas pelo acesso de
lado servidor de fonte de dados.
A principal incluso como parte de javax.sql o DataSource que
possibilita uma alternativa para DriverManager. Tambm inclui coisas
como pool de conexes, transaes distribudas, e a implementao de
RowSet.

O Acesso ao Banco de Dados e a Conexo J DBC


A tabela a seguir descreve algumas das classes mais comuns e interfaces
usadas para conexes de banco de dados e a execuo de querys no banco
de dados.

214 I\l Desenvolvendo Aplicaes Web com JSP...


Tabela 15.1
Classe

Descrio

java.sql.DriverManager

Prov um servio bsico para administrar drivers


JDSC. Em JDSC 2.0, este foi cedido pelo uso de javax.sql .DataSource.

javax.sql. DataSource

Permite localizar o objeto que prov uma interface


para a atual conexo de banco de dados. O DataSource implementado pelo autor do driver JDSC e pode
ter os seguintes resultados quando o mtodo getConnection( ) invocado:Sasic: Chamadas devolvero
um objeto standard Connection. Connection pooling:
As chamadas produziro um objeto Connection que
automaticamente participa em um pool de conexes.
Transao distribuda: As chamadas produziro um
objeto Connection que pode ser usado em uma
transao distribuda, e na maioria dos casos ser
capaz de participar em um pool conexes.

java .sql .Statement

Um Statement usado para executar uma declarao


Sal esttica e devolver os resultados. Apenas um
nico ResultSet pode estar aberto para um Statement
por vez. Aplicaes que necessitam de mltiplos ResultSets abertos tem que criar objetos Statements
separados.

java.sql.PreparedStatement

Um PreparedStatement uma sub-interface de Statement e isso representa uma declarao Sal pr-compilada. Esta declarao Sal pode incluir parmetros
que podem ser mudados a cada chamada, sem re-especificar a declarao. Uma declarao parametrizada, por exemplo, pode ser "SElECT * FROM LIVROS
WHERE ISBN=?".

java .sql .CallableStatement

Uma sub-interface de PreparedStatement, CallableStatement, prov um modo padro para chamar procedimentos armazenados (stored procedure) pelo JDSC
de maneira independente de banco de dados. Um
CallableStatement pode devolver um ou mais objetos
ResultSet.

java.sql.ResultSet

Um ResultSet contm as linhas retornadas de um Statement (incluindo Prepared e Callable) examinando o


banco de dados. ResultSet tem um cursor que pode
ser usado para interagir atravs dos resultados. Dependendo do ResultSet, pode ser navegvel em direes mais de uma direo, alm de pode ser
atualizvel.

Trabalhando com Banco de Dados [iiilJ

215

Os Tipos de Dados no Java e na SQl


No novidade alguma dizer que a linguagem Java diferente da linguagem SQL, tanto em suas estruturas como em tipo de dados. Evidentemente
isso no um problema, uma vez que voc pode desenvolver classes Java
que usam comandos SQL, podendo traduzir de um modelo para o outro.
Para que isso seja possvel, voc precisa mapear os tipos de dados do Java
para os tipos de dados da SQL. A tabela a seguir mostra os tipos de objeto
Java e seus similares no tipo JDBC :
Tabela 15.2 - Tipos de Objeto Java Mapeados para Tipos JDSe
Tipo de Objeto Java

TipoJDBC

String

CHAR,VARCHARoulONGVARCHAR

java.math .BigDecimal

NUMERIC

Boolean

BIT

Integer

INTEGER

long

BIGINT

Float

REAL

Double

DOUBlE

byteD

BINARY, VARBINARY ou lONGVARBINARY

java.sql.Date

DATE

java.sql.Time

TIME

java.sql.Timestamp

TIMESTAMP

Clob

ClOB

Blob

BlOB

Array

ARRAY

Struct

STRUCT

Ref

REF

Java class

JAVA OBJECT

Para ajud-lo a compreender o mapeamento no uso do banco de dados MySQL, o mtodo ResultSet.getObject( ) usa as converses de tipo
entre MySQL e tipos Java, seguindo a especificao de JDBC onde apropriado. O valor devolvido por ResultSetMetaData. GetColumnClassName(
) tambm mostrado a seguir:

216

Desenvolvendo Apl icaes Web com JSP...


Tabela 15.3 - Tipos MySQL para Tipos Java em
ResultSet.getObject( )
Tipos MySQL

Valor retornado de
GetColumnClassName

Retornado como Classe


Java

BIT(1) (MySQL 5.0)

BIT

BIT( > 1) (MySQL 5.0)

BIT

bytell

TINYINT

TINYINT

java./ang.Boo/ean se TINYINT
se a configurao da propriedade tiny/nt1isBit definida como
true (o padro) e annazenado
um
tamanho
de
1
ou
java./ang./nteger para mais.

BOOL. BOOLEAN

TINYINT

Veja TINYINT. como TINYINT(1)


para valores booleanos

SMALLlNT[(M)] [UNSIGNED)

SMALLlNT [UNSIGNED)

java./ang./nteger (indiferentemente se UNSIGNED ou no)

MEDIUMINT[(M))
[UNSIGNED]

MEDIUMINT [UNSIGNED)

java./ang.lnteger, se UNSIGNED
java./ang.Long

INT,INTEGER[(M))
[UNSIGNED)

INTEGER [UNSIGNED)

java./ang./nteger, se UNSIGNED
java.lang.Long

BIGINT[(M)] [UNSIGNED)

BIGINT [UNSIGNED)

java./ang.Long, se UNSIGNED
java.math.Big/nteger

FLOAT[(M ,D))

FLOAT

java./ang.F/oat

DOUBLE[(M,B)]

DOUBLE

java./ang.Doub/e

DECIMAL[(M[,D)))

DECIMAL

java.math.BigDecima/

DATE

DATE

java.sq/.Date

DATETlME

DATETIME

java.sq/. Timestamp

TIMESTAMP[(M))

TIMESTAMP

java.sq/. Timestamp

TIME

TIME

java.sq/. Time

YEAR[(2 ou 4))

YEAR

Se a configurao da propriedade yearlsDateType definida


para false, ento o tipo de objeto
retomado java.sq/.Short. Se
for true (o padro) ento o tipo
java.sq/Date (com a data fixada
em 1 de Janeiro, meia noite).
Exemplo, um ano annazenado
como 2006, retoma 2006-01-01 .

CHAR(M)

CHAR

java./ang.String (a menos que o


caractere fixado para a coluna
seja BINARY, ento bytell retornado)

VARCHAR(M) [BINARY]

VARCHAR

java./ang.String (a menos que o


caractere fixado para a coluna
seja BINARY, ento bytell retornado)

java./ang.Boo/ean

Trabalhando com Banco de Dados ~

217

Tabela 15.3 - Tipos MySQL para Tipos Java em


ResultSet.getObject( ) (continuao)
Tipos MySQL

Valor retornado de
GetColumnClassName

Retornado como Classe


Java

BINARY(M)

BINARY

byteD

VARBINARY(M)

VARBINARY

byteD

TINYBLOB

TINYBLOB

byteD

TINYTEXT

VARCHAR

java./ang.String

BLOB

BLOB

byteD

TEXT

VARCHAR

java./ang.String

MEDIUMBLOB

MEDIUMBLOB

byteD

MEDIUMTEXT

VARCHAR

java./ang.String

LONGBLOB

LONGBLOB

byteD

LONGTEXT

VARCHAR

java./ang.String

ENUM('valor100valor20 ... )

CHAR

java./ang.String

SET('valor1 oovalor2 o )

CHAR

java.lang.String

Desenvolvendo Via JDBC


Os exemplos mostrados a seguir demonstram o trabalho de pginas JSP
usando a API JDBC. Embora essa prtica de desenvolvimento no seja
recomendada nos dias atuais, importante que voc, como desenvolvedor
iniciante, aprenda como utiliz-la.
Esses exemplos so importantes para adquirir o conhecimento necessrio para o trabalho com banco de dados e sua manipulao via pginas
Web.
Se voc est vindo de outras tecnologias Web, como PHP ou ASP,
essas tcnicas sero ideais para que voc se familiarize com a tecnologia
Java .

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, a pgina JSP a seguir demonstra de forma simples como
trabalhar com o MySQL.

218

[iijlJ

Desenvolvendo Aplicaes Web com JSP...

trabComDBusandoJSPeJDBC.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
import="java. sql. *"

%>
<!DOCTYPE html PUBLIC "-l lw3CIIDTD XHTML 1.0 TransitionalllEN"
''http: //www . w3 . org I TR /xhtmll /DTD/xhtmll-transitional. dtd">
<html xrnlns= "http://www . w3 . org /1999 Ixhtml" >
<head>
<title>Trabalhando com Banco de dados usando JDBC e JSP< /t itle>
</head>
<body>
<table border=" 1" >
<thead>
<tr>
<th>ISBN</th><th>Ttulo</th>
<Itr>

</thead>
<tbody>
<%
Connection conn = null;
Statement st

null;

ResultSet rs

null;

try (
Class. forName("com.mysql.jdbc.Driver") .newlnstance ( ) i

conn =
DriverManager.getConnection("jdbc:mysql:lllocalhost/livra ria", 8)
"edson","integrator") i
st = conn.createStatement( )i C)
rs = st.executeQuery("select isbn, titulo from livros")i0

Trabalhando com Banco de Dados Ill


while(rs.next( )) (

219

%>
<t r >

<td><%= rs.getString("isbn") %></td>


<td><%= rs.getString("titulo") %></td>
<Itr>

<%
} / / end while

cat ch (Except i on ex)


ex.pr i ntStackTrace( );
}
~

f inally {
if (rs != null) rs.close(

)i

if (st != null) st.close(

)i

if (conn != null) conn.close(

)i

%>
</ t body>
</ t able>
</ 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.* 0 , 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.
da classe Class
A linha anterior utiliza o mtodo static forName
(pacote java.lang) para carregar a definio de classe para o driver de banco
de dados.
Se a cla sse no for locali zada , ele dispara uma exceo :
java.lang.ClassNotFoundException.

220

[lijl] Desenvolvendo Aplicaes Web com JSP...

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 t), 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 O voc cria um objeto
Statement para enviar declaraes SQL ao banco de dados. Se houver um
erro, dispara tambm a exceo java.sqI.SQLException.
Com o mtodo executeQuery 0, voc tem o retomo de um objeto
que implementa ResultSet e que contm os resultados da consulta.
Atravs de um loop while 0 voc varre os resultados encontrados,
onde o mtodo next(), de ResultSet, retoma um valor booleano true, quando
o resultado das linhas pesquisadas na query forem exauridas.
O mtodo getString() 8 , 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 retomados ao servidor,
uti lizando o mtodo c1ose() O . Nesse caso a clusula usada finally, que
liberar os recursos, caso os resultados sejam bem sucedidos ou no.

221

Trabalhando com Banco de Dados l)il]

=El

+'" Trablhando com Banco de dados usando JD8e e JSP X

\:;::, .:;>

li)

$'

Ihttp://localhost:8080!TrabComJDBC!trabComDBusandoJSPeJDBCjsp v I ~

r--- iSBN --- r------

- Ttulo

185-7393-436-0 !Dominando JBuilder X


185-7393-486-7 !Dominando Eclipse
185-7393-494-8 !OpenOffice.org 2.0 Writer
185-7393-495-6 IOpenOffice.org 2.OBase
185-7393-504-9 IOpenOffice.org 2.0 Calc
185-7393-519-7 IDominando NetBeans

-------

185-7393-536-7 ITomcat - Guia Rapido do Administrador


185-7393-543-X IDominando AJAX
v

Figura 15.1

Inserindo Dados

o exemplo que ser feito agora 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 uma outra pgina JSP,
que recuperar essas informaes e as enviar para o banco de dados
MySQL.
for.mInserindoDados. j sp

<!DOCTYPE html PUBLIC "-/ / W3C//DTD XHTML 1.0 Transitional/ /EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http: / /www .w3. org/1999/xhtml">
<head>
<title>Inserindo dados via JDBC com JSP< / title>
</head>
<body>
<form action="inseri ndoDados.jsp" method="post">

222 lll Desenvolvendo Aplicaes Web com JSP...


<table>
<tr>
<td>ISBN:</td>
<td><input type="text" name="isbn" /></td>
<Itr>
<tr>
<td>Ttulo:</td>
<td><input type="text" name="titulo" /></td>
<Itr>
<tr>
<td>Edio : </td>
<td><input type="text" name="edicao" /></td>
<Itr>
<tr>
<td>Publicao:</td>
<td><input type="text" name="publicacao" /></td>
<Itr>
<tr>
<td>Descrio:</td>
<td><textarea name="descricao" rows="S" cols="2S"></textarea></
td>
<Itr>
<tr>
<td colspan="2">
<input type="submit" name=HbtCadastrar" value= HEnviar" />
</td>
<Itr>
</table>
</form>
</body>
</html>

Como essa uma pgina simples com um formulrio bsico contendo


apenas contedo HTML, no haver comentrios sobre o mesmo.
A pgina JSP que ir receber esses valores mostrada a seguir:

Trabalhando com Banco de Dados [ljjl] 223


inserindoDados.jsp
<%@ page language="java"

contentType="text/html; "
pageEncoding="ISO-8859-1"
import="java.sql.*"
%>
<%

String isbn = request . getParameter ("isbn") ;


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. j dbc . Dri ver" ) . newInstance ( );
conn =
DriverManager.getConnection("jdbc:mysql://localhost/livraria",
"edson" , "integrator") ;
OString SQL = "INSERT INTO livros (isbn, titulo, edicao_num, " +
"ano-publicacao, descricao) " +
"values (r, ?, ?, ?, r)";
pst = conn.prepareStatement{SQL); ~
~

pst . setString{l, isbn);


pst.setString{2, titulo);
pst.setInt{3, Integer.parseInt{edicao));
pst.setString{4, publicacao);
pst.setString{S, descricao);

pst.executeUpdate{ );

224 lll Desenvolvendo Aplicaes Web com JSP.. .


pst.clearParameters{ l; 6)
catch {Exception ex} {
ex. printStackTrace { };
finall y {
if (pst != null) pst.close( };
if (conn != null) conn.cl ose( };
%>
<!DOCTYPE html PUBLIC "- /!W3C / / DTD XHTML 1. O Transitional / / EN"
'' http: //www.w3. org / TR/ xhtmll / DTD/ xhtml1-transitional.dtd ''>
<html xmlns= '' http: //www. w3 . org/1999 / xhtml" >
<head>
<title>Dados recebidos </ title>
</ head>
<body>
O ISBN <strong><%=isbn %></ strong> f oi inserido com sucesso !
</ body>
</ html >

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 O 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) 8), voc prepara os
dados que esto vindo dos campos do seu aplicativo para inserir no banco

Trabalhando com Banco de Dados lll

225

de dados. Como voc mesmo j concluiu, o tipo string foi utilizado graas
ao tipo existente no banco de dados.
O mtodo setlnt{int i, int i) faz o mesmo que o anterior, mas exige
um valor inteiro. Com o mtodo executeUpdate() O 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() 0 .

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 denotadas na declarao SQL pelo smbolo de interrogao (?).

226 l\l Desenvolvendo Aplicaes Web com JSP...


A tabela a seguir mostra os mtodos setters que indicam os tipos para
PreparedS tatement:
Tabela 15.4
Mtodo void

Descrio

setBoolean(int paramlndex, boolean b)

Parmetro de entrada com valor booleano.

setDate(int paramlndex, Date d)

Parmetro de data de entrada. Deve ser


um valor java.sq/.Date.

setDouble(int paramlndex, double d)

Parmetro de entrada com valor double.

setFloat(int paramlndex, fioat f)

Parmetro de entrada com valor fioat.

setlnt(int paramlndex, int i)

Parmetro de entrada com valor int.

setLong(int paramlndex, long I)

Parmetro de entrada com valor long.

setString(int paramlndex, String s)

Parmetro de entrada com valor String.

clearParameters( )

Limpa os parmetros enviados pelos mtodos setters .

Explorando a Interface CallableStatement


Ocasionalmente voc pode precisar de uma situao onde voc executar
procedimentos armazenados em um sistema administrativo de banco de
dados (RDBMS) . O CallableStatement d a voc a possibilidade de chamar procedimentos armazenados usando a API JDBC. A sintaxe SQL possui duas formas de procedimentos armazenados. A primeira forma inclui
um parmetro de resultado conhecido como OUT. A segunda forma no
usa o parmetro OUT. Cada uma das formas tem um parmetro IN.
Para melhor esclarecer essa interface, voc ir construir um Stored
Procedure no MySQL.

'/loto
~

O MySQL usado nesses exemplos est na verso 5. Verses


inferiores a essa no do suporte a stored procedures (procedimentos armazenados).

Trabalhando com Banco de Dados [Iiil]

227

Criando Stored Procedures no MySQL


Para ilustrar o uso da interface CallableStatement, primeiro voc precisa
ter procedimentos armazenados em seu banco de dados. Como o livro est
todo baseado no desenvolvimento com o banco de dados MySQL, evidentemente voc precisar criar os procedimentos armazenados nesse banco
de dados.
As stored procedures pode consistir em declaraes de SQL e vrias
estruturas de controle especiais. Isto pode ser til quando voc quiser executar a mesma funo de aplicaes diferentes ou plataformas, ou como
um modo de encapsular funcionalidade.
Para esse exemplo, voc ir criar um stored procedure com parmetro.
Para isso, no seu MySQL digite a sequncia a seguir:
DELIMlTER $$
CREATE PROCEDURE sp_m_liv_isbn(INvIsbn VARCHAR(lOO))
BEGIN
SELECT

FROM livros WHERE isbn=vIsbn;

END;

$$
DELIMITER

A idia transmitir um parmetro para que voc possa filtrar os livros, chamando apenas uma procedure com o ISBN do livro.
Para testar a stored procedure, antes de mais nada, ser preciso que
voc tenha feito pelo menos um cadastro de um livro . Depois disso, chame-a da seguinte forma:

Agora voc ir construir a pgina JSP que ir trabalhar com esse procedimento armazenado .

228

[)jlJ Desenvolvendo Aplicaes Web com JSP...

trabComStoredProcedure.jsp

<%@ page language="java"


contentType="text / html"
pageEncoding="ISO-8859-1"
import="java . sql.*"
%>
<!DOCTYPE html PUBLIC "- I!W3C // DTD XHTML 1.0 Transitional l! EN"
''http: //www .w3 . org / TR / xhtml1 / DTD/xhtml1-transitional.dtd''>
<html xmlns=''http:/ / www .w3.org/1999 / xhtml''>
<head>
<title>Trabalhando com Stored Procedure</title>
</ head>
<body>
<form action="trabComStoredProcedure.jsp">
ISBN: <input type="text" name="isbn" / >
<input type="submit" name="btEnviar" value="Pesquisar" / >
</ form>
<%
String isbn request.getParameter("isbn");
Connection conn = null;
ResultSet rs = null;
CallableStatement cStatement

null;

if(isbn!=null) {
try {
Class.forName("com.mysql.jdbc .Driver") .newInstance( );
conn =
DriverManager. getConnection ("jdbc :mysql: / /localhost/
livraria" ,
"edson" , "integrator") ;
cStatement =
conn.prepareCall(\\{CALL sp_m_liv_isbn(?} }"};O
cStatement.setString(l,isbn};

E9

Trabalhando com Banco de Dados [lil)


rs = cStatement . executeQuery( l;

EB

if(rs.next( )) {
%>
<table border="l">
<tr>
<th>ISBN</th><th>Ttulo</th>
<Itr>
<%
do (
%>
<tr>
<td><%= rs.getString(l) %></td>
<td><%= rs.getString(2) %></td>
<Itr>
<%
}while(rs.next( ));
%>
</table>
<%
else{
out.print(ULivro no encontrado");
catch (Exception ex) (
ex. printStackTrace ( );
finally {
if (conn != null) conn.close( );
if (rs != null) rs.close( );
if (cStaternent != null) cStaternent.close( );
}//end if

%>
</body>
</htrnl>

229

230 l\l Desenvolvendo Aplicaes Web com JSP...


Com o mtodo prepareCall(String s) 0 , de CallableStatement, voc
pode chamar seu stored procedure, criado no MySQL. Utilizando o mtodo
setString()
similar ao usado em PreparedStatement, voc transmitiu ao
procedimento o valor que desejava passar, o IN do stored procedure. O resultado capturado pelo ResultSet, atravs do mtodo executeQuery()
Apesar de a pgina JSP ser de simples compreenso, vale esclarecer
algumas situaes ocorridas nela. A primeira que existe uma verificao
inicial, antes de qualquer coisa, para que voc possa transmitir um ISBN
vlido. Lembre-se de que o mtodo getParameter( ) retoma NULL caso
ele no encontre nenhum valor.
Depois de passado o ISBN, um outro fator importante est na existncia ou no do valor transmitido. Caso o ISBN seja vlido, isso feito pelo
IF(rs.next()), o loop do ... while traz os valores para voc. Esse um caso
em que voc obrigado a usar o do .. .while, ou nem t-lo, uma vez que o
resultado deve ser apenas um livro ou nenhum . O dO ... while foi colocado
porque o rs.next( ) existente no IF j captura o primeiro valor existente.
Caso usasse um loop while ou for, no haveria mais valores para serem
exibidos, devido ao retorno false de rs.next( ) da verificao desses loops.
Isso anularia o exemplo, no exibindo nada .

e,_

e.

Atualizando e Excluindo Valores


Outra situao comum no desenvolvimento de pginas JSP a atualizao
de valores e a excluso.
Para atualizar uma linha de um banco de dados, existem mais de uma
forma. A mais simples manipular a declarao SQL diretamente, usando
o comando UPDATE. O mesmo se aplica ao DELETE.
Para exemplificar essas situaes, voc ir criar o exemplo a seguir
que ir excluir inicialmente um livro:
excluindoDB .jsp
<%@ page language=" java"

contentType="tex t / html"
pageEncoding="ISO-88 59-1"
import=" j ava . sql. * "

%>

Trabalhando com Banco de Dados lI

231

< !DOCTYPE html PUBLIC "-/ / W3C / / DTD XHTML 1. o Transitional/ / EN"
''http://www .w3.org / TR / xhtml1 / DTD/ xhtml1-transitional.dtd''>
<html xmlns=''http: //www.w3 . org/1999 / xhtml''>
<head>
<title>Excluso de livro< / title>
</head>
<body>

<%
String isbn=request. getParameter ("isbn") ;
if (isbn! =null) {
Connection conn = null;
Statement st = null;
try {
Class.forName("com .mysql.jdbc.Driver") .newInstance( );
conn =
DriverManager . getConnection("jdbc:mysql: / /localhost/
livraria " ,
"edson","integrator");
st

conn.createStatement();

st . executeUpdate("delete frem livros where isbn= 1 11 +i sbn+ 11 111) i

out.println("O livro de ISBN <strong>"+


isbn+"< / strong> foi excluido com sucesso!");
catch (Exception ex) (
ex.printStackTrace( ) ;
out. println ( "Problema ao excluir");
finally {
if (st != null) st.close( );
if (conn != null) conn.close( );

232 l'il

Desenvolvendo Aplicaes Web com JSP...

%>
</body>
</html>

Voc ir notar nesse exemplo que, diferente do que j foi feito, o valor
da varivel ISBN embebido diretamente na SQLO. Isso necessrio
quando voc no est usando a interface PreparementStatement.
Para facilitar a sua vida, altere o primeiro exemplo com banco de
dados feito neste livro, como mostra a seguir o trecho em destaque:
trabComDBusandoJSPeJDBC.jsp

<tr>
<th>ISBN</th><th>Ttulo</th>
<th>Excluir</th><th>Atualizar</th> )

<Itr>
</thead>
<tbody>

<%
Connection conn

= null;

Statement st

null;

ResultSet rs

= null;

try {
Class. forName ( "com. mysql. j dbc . Dri ver" ) . newlns tance ( );
conn

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

conn.createStatement( );

rs
st.executeQuery("select isbn, titulo from livros");
while(rs.next( )) {
%>

Trabalhando com Banco de Dados l\I

233

<tr>
<td><%= rs.getString("isbn") %></td>
<td><%= rs.getString("titulo") %></td>
<td>

8<a href="excluindoDB.jsp?isbn=<%= rs.getString("isbn") %>">


Clique aqui
<Ia>

</td>
<td>

<a href="atDB.jsp?isbn=<%= rs.getString("isbn") %>">


Clique aqui
<Ia>

</td>

<Itr>

A Figura 15.2 a seguir ilustra como ficar sua tela com as alteraes
feitas:
I" TI ab<llhando com Banco de dados u$ndo JDBC e JSP )(

./;:; ~'. Iil <$'


ISBN

Ihttp://localhost:8080/TrabComJDBC/trabComDBusandoJSPeJDBC.jsp
Ttulo

185-7393-436-0 [Dominando JBuilder X

Excluir

1 Atualizar

[Clique aqui [Clique aqui

[8-5~7j9-3~486=7- [D-~~;-d~&lip;---------------'------ ---- [clig~~- aqui [Cliq~g~

[8s=::i39"i49.4-8-[OpenOffiee.org 2.0 Writer

--------[Cliq~e ag~;lQlig~-;;;:qci

[85-7393-495-6 [OpenOffiee.org 2.0 Base

[Clique aqui [Clique aqui

[85-7393-504-9 [OpenOffiee.org 2.0 Cale

[Clique aqui [Clique aqui

rs5-7393-519-7 [Dominando N etBeans

!Clique aqui IClique aqui


185~393-':-536=7 ' ~eat - Guia Rapido do Ackcini~d~~ ICii(;~~- aqci [Clique aqui

[85-7393-543-X [Dominando AJAX

[Clique aqui [Clique aqui


v

Figura 15.2

234 l'iI Desenvolvendo Aplicaes Web com JSP...


Partindo dessa pgina JSP, voc ir clicar em um dos links escritos
"Clique aqui" e transmitir pelo link o ISBN pertencente a essa linha. A
pgina excluindoDB.jsp se responsabilizar em receber o ISBN, verificar
se ele no nulo e ento excluir a linha pertencente a esse valor.

A Atualizao
Para atualizar, voc precisa de dois passos. O primeiro enviar esses dados
a uma pgina contendo um formulrio. Esse por usa vez ser preenchido
com os resultados vindos do banco de dados, mostrando assim ao usurio
seu estado atual. Aps o usurio alter-lo, o formulrio ser submetido ao
comando UPDATE.

o FORMULRIO QUE SER PREENCHIDO


O formulrio a seguir ser preenchido pelos resultados vindos do banco de
dados. Esse formulrio no ser o resultado final da atualizao, mas o
intercambio entre o que voc quer atualizar e a atualizao efetuada em si.
atDB.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
import="java.sql.*, java.text . *"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
''http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''>
<html xmlns=''http://www . w3. org/1999 /xhtml">
<head>
<title>Atualizando dados via JDBC com JSP</title>
</head>
<body>
<%
String isbn = request.getParameter("isbn").trim( );

Trabalhando com Banco de Dados ~


if(isbn!=null) {

235

Connection conn = null;


PreparedStatement pst
null;
ResultSet rs = null;
SimpleDateForrnat dateForrnat

null;

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

6) pst = conn.prepareStatement(ltselect ... fram livros where isbn=?"};


pst.setString(l, isbn);
rs = pst.executeQuery( );
pst.clearPararneters( );
dateFormat = new SimpleDateFormat ("yyyy");
if(rs.next( )) ( @)

%>
<forrn action="atualizaDB.jsp" method="post">
<table>
<tr>
<td>ISBN:</td>
<td><input type="text" narne="isbn"
value="<%= rs.getString("isbn") %> "
readonly="readonly" I>
</td>
<Itr>

<tr>
<td>Ttulo:</td>
<td><input type="text" narne="titulo"

236 l\I

Desenvolvendo Aplicaes Web com JSP...

value="<%= rs.getString("titulo"} %>" />


</ td>
<Itr>
<tr>
<td>Edio:< / td>
<td><input type="text" name="edicao"
value="<%= rs . getString("edicao_num"} %>" / >
</ td>
<I tr>
<tr>
<td>Publicao:< / td>
<td>
<input type="text" name="publicacao"
value="< %= dateFormat.format(rs.getDate("anoJ)ublicacao"}} %>"

/>

</ td>
<I tr>
<tr>
<td>Descrio:< / td>
<td>
<textarea name="descricao" rows="S" cols="2S">
<%= rs.getString("descricao"} %></textarea>
</ td>
<I tr>
<tr>
<td co l span="2">
<input type="submit" name="btAtualizar" value="Atual i zar" />
</td>
<I tr>
</ table>
</ form>
<%
} // end if

else{ out.println("Livro no encontrado"); }

catch (Exception ex) {


ex . printStackTrace( };

Trabalhando com Banco de Dados l\l 237


finally {
if (pst != null) pst.close( );
if (rs != null) rs.close( );
if (conn != null) conn.close( );

}// end if
%>
</body>
</html>

Quando voc clica no link "Clique aqui", na coluna Atualizar,


existente na pgina JSP trabCornDBusandoJSPeJDBC.jsp, voc
transmite o ISBN. Nesse ponto voc recupera o ISBN enviado.
A verificao para saber se o valor recuperado existe importante, para evitar erros na consulta que dever ser feita.
@) Utilizando PreparedStatement, voc faz uma consulta aos livros
existentes na tabela livros com o ISBN recuperado.
O Atente ao formato do ano, feito por SimpleDateFormat, apresentando apenas o ano, em formato longo, com a String "yyyy". Isso
ser necessrio para a exibio correta do ano cadastrado.
Antes de sair exibindo os valores do banco em seus respectivos
campos, voc deve verificar se existe algum resultado. Se existir, o
formulrio HTML preenchido com os resultados. Como o ISBN
no poder ser alterado, o campo que o recebe do banco de dados
tem um atributo readonly="readonly". Com esse atributo, voc
poder apenas ler o resultado, mas no poder edit-lo. Existe um
outro atributo HTML para a tag <input /> chamado de disabled=
"disabled". No o use, pois o campo ISBN ser necessrio para a
recuperao do valor contido na hora da atualizao, para que a
declarao SQL UPDATE saiba qual a linha deve ser atualizada.
<D O formato de data vindo do banco de dados, via JDBC ser ANOMS-DIA. Por exemplo, se o ano cadastrado na linha que deseja
atualizar for 2006, o resultado ser 2006-01-01, ou seja, o ano
cadastrado do primeiro ms e com o primeiro dia. Evidentemente
no foi isso que voc cadastrou. Para que o valor exibido seja

238 llI Desenvolvendo Aplicaes Web com JSP...

como o cadastrado, entra em ao o mtodo format(Date d) da


classe SimpleDateFormat, com o fonnato "yyyy", como voc
configurou no incio dessa pgina.
Caso nenhum livro seja encontrado pelo ISBN transmitido ou
algum est tentando digitar um valor invlido, a mensagem "Livro no encontrado" ser exibida.

Esse fonnulrio envia para a pgina atualizaDB.jsp os resultados encontrados nos campos, e nesse caso, essa pgina JSP ser responsvel pela
atualizao.
atualizaDB.jsp
<% @ page language="java"
c ontentType="text/html"
pageEncoding="ISO-8859-1"
import="java.sql.*"
%>
< !DOCTYPE html PUBLIC "- !lW3C / /DTD XHTML 1.0 Transitional !l EN"
''http: // www.w3 . org / TR/ xhtmll / DTD/ xhtmll-transitional. dtd">
<html xmlns="http: // www.w3 . org/1999 / xhtml ">
<head>
<title>Dados atualizados< / title>
</ head>
<body>
<%
String isbn = request.getParameter("isbn");
String titulo = request.getParameter("titulo");
String edicao = request. getParameter ( "edicao") ;
String publicacao = request. getParameter ("publicacao") ;
String descricao = request. getParameter ( "descricao" ) ;
if(isbn!=null) {
Connection conn = null;
PreparedStatement pst = null;
try {

Trabalhando com Banco de Dados

[1jilJ

239

Class.forName{"com.mysql.jdbc.Driver"} .newInstance{ };
conn =
DriverManager.getConnection{"jdbc:mysql://localhost/
livraria" ,
"edson","integrator"};
OString SQL = "UPDATE livros SET titulo=?, " +
" edi cao_num=?, " +
"ano....publ icacao=?, descricao=? " +
"where isbn=? "i

pst = conn.prepareStatement{SQL};
pst.setString{l, titulo};
pst.setInt{2, Integer . parseInt{edicao}};
pst.setString{3, publicacao};
pst.setString{4, descricao};
pst . setString{5, isbn};
pst.executeUpdate{ };
pst.clearParameters{ };
out .println{ "Os dados do ISBN: "+isbn+" foram atualizados"};
catch {Exception ex} {
ex.printStackTrace{ };
out.println{"Erro ao atualizar"};
finally {
if {pst 1= null} pst.close{ };
if {conn != null} conn.close{ };
}/ /end if
else{
out.println{"ISBN no existente"};

%>
</body>

</html>

240

[1jj'J

Desenvolvendo Aplicaes Web com JSP...

Com os campos enviados e recuperados, tudo que voc tem que


fazer executar o comando UPDATE da linguagem SQL. Com a
alterao feita, uma mensagem exibida. Caso no exista um
ISBN uma outra mensagem ser mostrada .

Pool de Conexes
Quando uma aplicao Web acessa um banco de dados remoto, esse acesso
pode ser feito por uma conexo JDBC, como visto anteriormente. Tipicamente, uma conexo de JDBC fisica estabelecida entre a aplicao cliente e o servidor de banco de dados por uma conexo TCP/IP.
Pool de conexes reduzem expressivamente o tempo de conexes
estabelecidas criando uma conexo fisica no incio do sistema.
Quando uma aplicao requerer uma conexo, uma destas conexes
fisicas provida a essa aplicao. Em um sistema comum, sem o pool de
conexo, quando a aplicao termina de usar a conexo, este a desconecta,
como feito anteriormente usando o mtodo c1ose(). Porm, no caso de uma
conexo fisica, essa devolvida somente para o pool de conexes, onde
espera o prximo pedido da aplicao para um novo acesso ao banco de
dados .

Configurando o Recurso JNOI JOBC


Usando recursos JNDI no Tomcat para configurar acesso a dados via JDBC
o modo indicado para proporcionar acesso ao banco de dados por aplicaes Web.
Primeiramente adicione a biblioteca JDBC do MySQL em
$CATALINA_HOME/common/lib, onde $CATALINA_HOME o local onde se encontra instalado o Tomcat.
No arquivo server.xml, localizado em $CATALINA_HOME/conf,
procure a linha onde se encontra a sua aplicao Web e adicione como
mostrado a seguir:

Trabalhando com Banco de Dados lil

241

server.xml.

o <Context path="/Site">
e <Resource name="jdbc/LivrariaDB" auth=" Application"
type=Njavax.sql.DataSource"
driverClassName="com .mysql. jdbc. Driver"
url="jdbc:mysql://localhost:3306/1ivraria"
username="edson"
password="integrator"
maxActive="30"
maxldle="20000"
maxWait="120" / >
</Context>

o
S

A configurao para o pool de conexes ser atravs do contexto


da sua aplicao. No caso foi ilustrado aqui com o nome de /Site,
mas verifique o nome que voc deu.
Dentro do contexto, voc configura os dados necessrios para o
acesso ao banco de dados. Para que voc entenda o significado
dos principais atributos dados, veja na Tabela 15.5 a seguir:
Tabela 15.5

Atributo

Descrio

driverClassName

O nome da classe do driver JOSC.

maxActive

O nmero mximo de conexes ativas neste pool

maxldle

O nmero mximo de conexes inativas nesse pool

maxWait

Em milissegundos, indica o mximo de espera para uma conexo, gerando aps uma exceo.

username

Nome do usurio

password

Senha

url

O URl JOSC compatvel especificando o banco de dados para


ser usado

validationOuery

Uma query SOL opcional usada para validar uma conexo,


exemplo:
validationOuery="select trom testdata;"

242

l)J Desenvolvendo Aplicaes Web com JSP...

Depois de configurado e entendido o que significa cada atributo, voc


ir configurar o arquivo web.xml, em WEB-INF da sua aplicao Web:
web.xml.:

<resource-ref>
<res-ref-name>jdbc/LivrariaDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Application</res-auth>
</resource-ref>
</web-app>

Com o elemento <resource-ref /> voc define o JNDI configurado


no Tomcat. A interface javax.sql.DataSource foi introduzida como parte do
JDBC 2.0 Standard Extension para proporcionar em aplicaes Java um
modo padro para fazer administrao da conexo do banco de dados e
poll de conexes fornecidas para aplicaes de servidores Java.

Caso o Tomcat diga que no est encontrado o driver JDBC do


MySQL porque voc adicionou o driver com o Tomcat rodando. Pare e inicie a instncia do Tomcat para que esse venha a
reconhec-lo .

Trabalhando com o Aplicativo Web Admin


Uma das principais vantagens de uma configurao GUI baseada na Web
a potencialidade para ser executada remotamente. O Tomcat tem uma ferramenta de administrao baseada em Web que voc pode usar para administrar o servidor e aplicaes Web individuais. Essa ferramenta lhe permite editar o arquivo server.xml. Para que se possa usar essa ferramenta,
antes, voc deve efetuar download da mesma, pois esse no vem instalado
com o Tomcat por padro.

Trabalhando com Banco de Dados

243

BAIXANDO E INSTALANDO O ADMIN

Inicialmente voc ter que voltar ao site do projeto Tomcat e baixar o Admin,
que, como j foi dito, no vem com a distribuio.
Volte novamente pgina para download http://tomcat.apache.org/
download-55.cgi e v at o item Binary Distributions.
Em Administration Web Application voc pode escolher em qual
formato voc vai baixar.
Descompacte o arquivo e, se o Tomcat estiver rodando, pare-o por
uns instantes. No diretrio onde se encontra o $CATALINA_HOME, arraste o diretrio conf ou copie-o, como preferir. O mesmo dever ser feito
com o diretrio server. Feito isso, voc s ir acrescentar os itens inexistentes
no Tomcat. O diretrio conf que estava compactado vem com a configurao para a execuo do admin, arquivo esse chamado de admin.xrnl. Em
server voc tem um diretrio webapps que contm o subdiretrio adrnin,
onde se encontram os arquivos da aplicao QUI Web do admin .

Criando um Administrador para Acessar a


Aplicao Admin
Para configurar um novo administrador, v em $CATALINA_ HOME/confl
torncat-users.xrnl.
Edite o arquivo como mostrado em destaque a seguir:
tamcat-users.xml

<?xml version='l.O' encoding='utf-8'?>


<torncat-users>
<role rolenarne="torncat"/>
<role rolenarne=" rolel" />
<role rolenarne= "rnanager" />
<role rolename="admin"/>
<user username="admin" password="admin" roles="manager, admin"/>
<user usernarne="torncat" password="torncat" roles="torncat" />
<user usernarne= "both" password="torncat" roles="torncat,rolel"/>
<user usernarne="rolel" password="torncat" roles="rolel" />
</torncat-users>

244 lI Desenvolvendo Aplicaes Web com JSP...


Inicie novamente o Tomcat. Entre no endereo, pelo seu navegador:
http://localhost:8080/admin

A entrada do Tomcat Web Server Administration Tool, o Admin, tem


um formulrio para se logar, diferente do Manager visto no Captulo 3.
Perceba que voc adicionou um role chamado admin (referindo-se a
aplicao), mas no foi necessrio acrescentar outro usurio. O usurio
admin foi mantido, o mesmo do usado para acessar o Manager, precisando apenas adicionar o rolename ao atributo roles, separando apenas por
uma vrgula do role j existente.
Como voc j sabe, coloque admin no campo User Name e admin
no campo Password .

Como Configurar pelo Admin o JNDI


Digamos que voc no tenha feito a configurao para acessar a livraria ou
exclua essa configurao. Para criar uma nova, usando o admin, v a Data
Sources da sua aplicao Web e, em Data Source Actions, no menu drop
down, selecione Create New Data Source.
Preencha os campos como mostrado na Figura 15.3 a seguir:

Trabalhando com Banco de Dados [Ijjl] 245


Data Sources

Propertv
JNDI Name

..._................................

_ _-_ ,
........

S~~ Source

~?a~; Driver

..

.... _..

1://

_ - - _.._.._._......._...._...............

I~:OC :

mysq

. ................ .

lO~:~_~~t ~::.~6~:~~~~~~~~~

11.c:.~r:.'r:.'X.~~I)~~:Pr.i~:r.

.................._.........._.... _.-.......

...............................1

I fUser
-.- - - - : \ I[dSn
- - ...
==
Name:
__ = = = - - - -..../
. m ]

Password:
Max. Active
Connections

I ~--~

Valida'on Que,\,

I;
Figura 15.3

Salve as alteraes clicando no boto Save.


A seguir voc tem a pgina JSP que acessa o JNDI configurado:
usandoJNDIDB . jsp

<%@ page language="java" contentType="text/html"


pageEncoding="ISO-8859-1"
import="java.sql.*, javax.sql.* , javax.naming.lnitialContext"
%>
<! DOCTYPE html PUBLIC "- //W3C/ /DTD XHTML 1. O Transitional/ /EN"
''http://www .w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd''>
<html xmlns=''http://www .w3 . org/1999/xhtml''>
<head>
<title>Usando Pool de Conexo</title>
</head>
<body>
, <table border=" 1" >

246 l\J Desenvolvendo Aplicaes Web com JSP",


<tr>
<th>ISBN</th><th>Ttulo</th>
<Itr>
<%
Connection conn = null;
Staternent st
null;
ResultSet rs = null;
try {
InitialContext ctx = new InitialContext( )i
DataSource ds =
O (DataSource) ctx.lookup("java:comp/env/jdbc/LivrariaDB")i
conn = ds,getConnection( );
st = conn . createStaternent( );
rs = st.executeQuery("select isbn. titulo frorn livros");
while(rs.next( )) {
%>
<tr>
<td><%= rs.getString("isbn") %></td>
<td><%= rs.getString("titulo") %></td>
<Itr>
<%

catch (Exception ex)


ex .printStackTrace( );
finally {
if (rs != null) rs.close( );
if (st != null) st.close( );
%>
</table>
</body>
</htrnl>

Trabalhando com Banco de Dados [ljlJ 247

Nota que o nome do seu JNDI que o jdbclLivrariaDB O com um


prefixo adicionado java:comp/env/. Este prefixo indica ao recipiente que
o recurso um recurso interno .

Desenvolver dessa Forma Correto?


Definitivamente, entender como funciona uma pgina JSP acessando e
modificando dados de um banco de dados correto. Mas desenvolver dessa maneira NO.
No correto porque voc est trabalhando de forma procedural. Mas
Java no orientado a objetos?
A resposta sim . Mas orientao a objetos significaria criar classes
que tem acesso a um banco de dados e classes que respondem com os
valores e os manipulam. Em uma pgina JSP o correto conter apenas o
mnimo possvel de scriptlets. A essa forma de desenvolver aplicaes chamamos de Padres de Desenvolvimento. Um padro muito praticado no
desenvolvimento de aplicaes Web escritas em Java o Model 2, baseado
no paradigma MVC. Quanto ao acesso a banco de dados temos um padro
popularmente usado, chamado de DAO (Data Access Object).

...
a

Captulo

16
JavaServer Pages Expression
Language

XPRESSION LANGUAGE ou EL, COMO MAIS CONHECIDA, so declaraes


que disponibilizam uma sintaxe mais simples para executar algumas
das aes que os elementos de script JSP o fazem. A EL foi introduzida
como parte do padro JSP a partir da verso 2.0.
A EL simplifica certas caractersticas do desenvolvimento, principalmente onde JSP mais complexo no que diz respeito de escrever aplicaes Web sem usar vrios scriptlets dentro de suas pginas. Na verdade, h
muitos problemas com a utilizao de cdigo Java na forma de scriptlets
em pginas JSP.
O primeiro problema mais comum e mais bvio, est na criao de
interface do usurio para um sistema. bem provvel que os desenhistas
grficos (designers) faam essa tarefa. Eles so escalados por geralmente
serem melhores que os programadores Java a criar interfaces de usurio
funcionais. O segundo problema causado pelo uso de scriptlets isso de
manuteno. Quantidades grandes de cdigo embutindo na interface do
usurio de um sistema fazem dessa interface uma tarefa muito mais dificil
de alterar e entender.
Graas a esses motivos, uma linguagem de expresso mais simples
viria a ser bem aceita, uma vez que simplifica a vida dos desenvolvedores
e designers de aplicativos construdos para Web.

.....

~-

--

--

--

250 lI

Desenvolvendo Aplicaes Web com JSP...

A Sintaxe
Antes de mais nada, no importa onde a EL usado, ele sempre invocado
de uma maneira consistente, pela construo ${expr} ou #{expr}, onde expr
a expresso EL que voc deseja avaliar. Na especificao EL 2.1, a sintaxe de ${expr} e #{expr} so equivalentes e podem ser intercambiadas em
seu uso. Porm, na utilizao de outra API Java Platform, Enterprise Edition,
pode ocorrer de terem restries em seu uso . Especificamente, quando usadas em pginas JSP, as duas formas no podem ser usadas em conjunto.
Em uma pgina JSP, $ {expr} usada para expresses que so avaliadas imediatamente, no entanto # {expr} usada para expresses para as
quais seu resultado adiado.
A seguir voc tem um exemplo do uso de EL:
<jsp:useBean id="jbean" class="pacote.MeuJBean"/>

${jbean.nome}

Esse trecho chama o JavaBean e tem como sada propriedade nome .

literais
Da mesma maneira que em qualquer linguagem de programao, a EL fornece vrios literaIs para os desenvolvedores usarem. Um literal pode ser de
um valor Booleano, inteiro, ponto flutuante, String ou um valor nulo. A
tabela a seguir mostra os valores que so vlidos por cada tipo de literal:
Tabela 16.1
Valor

Descrio

Booleano

Valores true ou false.

String

Qualquer string delimitada por aspas duplas ou simples. O backslash usado


como um caractere de escape para aspas e backslashes. Por exemplo: 'Este texto
"contm um valor entre aspas simples", mas com caractere de escape\\' ou com o
uso de diretrios como "c:\\My Documents\\apress". Voc precisa escapar aspas
s quando elas esto inclusas por uma aspas do mesmo tipo; em outras palavras,
'\" ou "\" ". Sendo assim, uma situao como: O valor de "marca d'gua."; no precisa ser escapada.

Ponto
Flutuante

Qualquer nmero de ponto flutuante positivo ou negativo (-1 .3E-50, 3.13159,


4.00000000000001, .55, .66e2, e assim por diante)

Inteiros

Qualquer nmero de inteiro positivo ou negativo (-20, 10, 1250, e assim por diante).

Null

Um valor nulo

JavaServer Pages Expression Language ll

251

A seguir voc tem alguns exemplos de expresses simples e o que


eles avaliam em uma pgina JSP:
$ {true} <%--avalia para verdadeiro--%>
${"Aqui voc tem uma marca d'gua com aspas simples que no precisa de caracteres de escape"}
${5*4} <%--resulta no nmero 20--%>

Operadores
Voc pode usar a maioria dos habituais operadores Java dentro das declaraes EL. A tabela a seguir mostra os operadores:
Tabela 16.2
Tipo

Operador

Aritmticos

+, -, *,/, div, %, mod

Comparao

== e eq
!= e ne
< e It
> e gt
<= e le
>= e ge

Lgico

&& e and

\I e ar
! e not
Outro

O, empty, O, . (ponto)

A seguir voc tem um exemplo do uso de expresses aritmticas:


usandoELemJSP.jsp
c%@ page language="java"
contentType="text / htrnl"
pageEncoding= "ISO-8 859-1 "%>
c!DOCTYPE htrnl PUBLIC "- //W3C // DTD XHTML 1.0 Transitional // EN"
''http:/ / www.w3.org/TR/ xhtrnll/DTD / xhtrnll-transitional.dtd H >
chtrnl xrnlns="http://www.w3.org / 1999/xhtrnl">
chead>

252 Il Desenvolvendo Aplicaes Web com JSP.. .


<title>Trabalhando com Expression Language</title>
</head>
<body>
<h2>Expresses Aritmticas</h2>
Um exemplo de clculo 1 + 5 * 10 - 3 / 2 :
<strong> ${1 + 5 * 10 - 3 / 2} </strong><br/>
Um valor negativo (-5 -8) : <strong> ${-S - 8} </strong><br/>
Uma diviso usando div: <strong> ${6 div 2} </strong><br/>
O resto de uma diviso (10%8): <strong> ${10 % 8} </strong>
<h2>Comparaes</h2>
<h3>Utilizando Boolean</h3>
Uma compar ao usando operador ternri o "? :" :
<strong> ${(true) ? "verdadeiro" : "falso"} </strong>
<h2>Operador empty</h2>
empty "" : <str ong> ${empty '\I'} </s t rong><br/>
empty "texto : <strong> ${empty "texto"} </strong><br/>
<h2>Valor Null</h2>
null == null : <strong> ${null == null} </strong><br/>
"null == nul l : <strong> ${"null" == null} </strong><br/>
</body>
</html>

O Operador empty

o operador empty um operador de prefixo, tendo um nico operando a


sua direita. Pode ser usado para verificar se um valor nulo . Por exemplo:
${empty ""}

Retoma true. J a situao:


$ {empty "texto"}

Retoma false, pois contm um valor entre as aspas.

JavaServer Pages Expression Language [lil]

253

A no existncia de uma varivel em EL considerado null. Um valor


nuU considerado empty (vazio) se testado com o operador empty.
A tabela a seguir demonstra a utilizao do operador empty tambm
em determinadas situaes:
Tabela 16.3
Tipo de dados do operando

Valorempty

String
Varivel

NULL

Array

Sem elementos

Map

Sem elementos

List

Sem elementos

Converso de Tipo Automtica


No necessrio declarar o tipo de uma varivel antes de us-la. Isto
diferente do que voc j conhece na utilizao da linguagem de programao Java, onde o nome de cada varivel deve ser declarada com o seu respectivo tipo antes de seu uso.
A vantagem de uma linguagem automaticamente tipada, como no caso
da EL, est na facilidade de programar. O desenvolvedor JSP/EL no tem
que se preocupar com a declarao de toda varivel usada e seu tipo mais
apropriado. Com maior facilidade de programar, o desenvolvedor, muitas
vezes, no precisa chamar qualquer tipo de funes de coero de tipo
(converter um tipo para outro). Ao invs disso, o desenvolvedor pode confiar em um conjunto de regras embutidas na EL, regras de coero de tipo
neste caso.
A desvantagem dessa forma de programao que, em algumas situaes, voc pode precisar de um melhor controle em cima do tipo de dados. Nestes casos, voc precisar entender as diferentes regras definidas e
como elas podem afetar seu resultado.

254

~ Desenvolvendo Aplicaes Web com JSP...

Boxing
A converso de tipo bsica est baseada em boxing. Boxing simplesmente
a ao de criar um objeto Java associado a um tipo primitivo. Na tabela a
seguir voc tem tipos primitivos comuns em Java e a utilizao do boxing:
Tabela 16.4
Tipos primitivos
int

Boxed Type
Integer

long

Long

double

Double

char

Character

boolean

Boolean

o boxing de uma varivel do tipo int embrulhado com um Integer. O


boxing de um long, embrulhado em uma instncia Long.
A ao de converter um valor embrulhado a seu valor primitivo associado chamada de unboxing.
Coero, ou converso de tipo automtica, acontece quando o tipo
exigido no igual ao tipo do valor ou varivel entrante. Um exemplo
disso voc enviar um valor inteiro de uma varivel cuja a necessidade
seja de uma String ou vice-versa. Antes de esta converso acontecer, a EL
sempre empacotar um tipo primitivo .

Um EL mais Dinmico
Voc pode usar a EL dentro do corpo de uma pgina JSP de forma que
passa produzir contedo dinmico .
usandoELparaRecVal.jsp
<%@ page language= "java"

contentType="text/html"
pageEncoding="ISO-8859-1"
%>
< !DOCTYPE

html PUBLIC "-//W3C/ /DTD XHTML 1. O Transitional/ /EN"

JavaServer Pages Expression Language

l\J 255

''http://www . w3. org/TR/xhtml1/DTD/xhtml1-transitional. dtd">


<html xmlns= "http: //www . w3 . org /1999 /xhtml" >
<head>
<title>Trabalhando com EL< / title>
</head>
<body>
<strong>${param[\nome/]} </strong> ~

<form action="usandoELparaRecVa l.jsp">


Nome: <input type="text" name="nome" />
<br />
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

Objetos implcitos em EL so disponveis ao desenvolvedor de pginas JSP, dentro de uma expresso EL, sem qualquer codificao explcita
ou declaraes. So projetados objetos implcitos para facilitar a programao e fazer os aspectos mais comuns de uma pgina JSP disponveis
para escrever cdigo dentro do escopo EL.
Graas a esse objeto implcito, voc pde acessar o valor do campo
nome atravs de param O . Voc pode por exemplo, capturar o browser
usado:
${header["user-agent"]}

A tabela a seguir mostra os objetos implcitos que voc pode usar em


suas pginas JSP com EL:

256 lI Desenvolvendo Aplicaes Web com JSP...


Tabela 16.5
Descrio

Objeto Implcito
applicationScope

Contm todas as variveis do escopo da aplicao.

cookie

Mapeia o cookie atravs de um nico objeto Cookie. Se mais


de um cookie existir com o mesmo nome, o primeiro
recuperado.

header

Recupera os valores contidos no cabealho especfico.

headerValues

Recupera em um array todos os possveis cabealhos


encontrados.

initParam

Recupera o parmetro de inicializao contido no contexto.

pageContext

O objeto PageContext.

pageScope

Contm todas as variveis de escopo da pgina.

param

Recupera o parmetro enviado para a pgina.

paramValues

Recupera em um array os vrios parmetros com seus


valores enviados.

requestScope

Recupera todas as variveis de escopo.

sessionScope

Recupera as variveis de sesso.

A pgina a seguir demonstrar melhor alguns desses objetos:


objetosImplicitosNaEL.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
< !DOCTYPE html PUBLIC "-/ /W3C/ /DTD XHTML 1. O Transitional/ /EN"
''http://www .w3.org/TR/xhtml1/DTD/xhtml1-transitional . dtd''>
<html xmlns=''http : //www.w3.org/1999/xhtml''>
<head>
<t i tle>Trabalhando com Objetos Implc i tos no EL</ti t le>
</head>
<body>
<table border="l ">
<tr>
<td>Objeto</td>

JavaServer Pages Expression Language lI

257

<td>Cdi go us ado</td>
<t d>Sada</td>
<Itr>
<t r>
<td>PageCont ext</td>
<td>${'${'}pageContext . request.reques tURI}</ t d>
<t d> ${pageContext.request.requestURI} </ t d>
<Itr>
<tr>
<td>pararn</td>
<td>${ ' ${'

}pararn[\\va~iosH]

}</td>

<t d> ${param["varios"]} </td>


<I t r>
<tr>
<t d>pararnValues</td>
<td>${'${ ' }pararnValues.varios[l]}</td>
<td> ${paramValues.varios[l]} </td>
<I t r>
</ t abl e>
</body>
</htrnl>

Quando rodar essa aplicao, passe os parmetros pela URL como


mostrado a seguir:
obj etosImpl ici tosN aEL.j sp ?varios=Edson&varios=Integra tor
No hayer explicao, pois o resultado falar por si mesmo. A Figura
16.1, a seguir, demonstra a sada obtida:

258

[IiilJ Desenvolvendo Aplicaes Web com JSP...

f't Tr<lbalhando com Objetos Implcitos no EL )(

ICdigo usado
ISada
,.IObjeto
...................................... ......_......_... _................_............................._....................... [_........................................................._.................. _ .............................
jPageContext $(pageContext.request.requestURI) l TrabComEUobjetosImplicitosNaEL.jsp
..............._.. _.................. _..._._._...................................................
!param
$ (param('varios"J)
ILUson
........................................ r___..... _..................._ ..........

I;;~;;;v~~;~ ,${;;;;;.;;;V~~;~~~-;;-.;~[l-j}

;::~

rfut;;~t~;_

___

Figura 16.1

A Expression Language e os JavaBeans


Voc tambm pode usar EL em conjunto com JavaBeans. Isso com certeza
simplifica ainda mais o cdigo usado. Por exemplo:
<jsp:getProperty name="meuBean" property="nome" />

Poder ser chamado tambm assim, como voc j conhece:


<%= meuBean. getNome ( ) %>

Ou assim, usando EL:


${meuBean. nome}

Para ilustrar essa situao, voc criar o seguinte JavaBean:


OmSimplesJavaBean.java

package meupacote;
public class UmSimplesJavaBean
private String nome;
private String email;

JavaServer Pages Expression Language [liilJ 259


public UmSimplesJavaBean( )(
setNome ("Edson H) ;
setEmail ( .. edson@integrator.com.br .. );
public void setNome(String nome)
this . nome = nome;
public String getNome( ) (
return nome;
public void setEmail(String email) (
this.emai l = email;
public String getEmail( ) {
return email;

A pgina a seguir consome esse JavaBean criado :


usandoJavaBeansComEL.jsp

<%@ page language="java"


contentType="textlhtml"
pageEncoding="ISO-8859-1'%>
< !DOCTYPE html PUBLIC "-!lW3C//DTD XHTML l.0 Transitional!lEN"
''http://www .w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd''>
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>Usando Expression Language com JavaBeans</title>
</head>
<body>
<j sp: useBean id=" spjb" class= "meupacote. UmSimplesJavaBean"
scope="request">
<jsp:setProperty name="spjb" property="*"/>
</jsp:useBean>

260

l)jl] Desenvolvendo Aplicaes Web com JSP...

Seu nome : <strong>${spjb.nome}C)</strong><br />


Seu e-mail : <strong> ${spjb.email} </strong>
<form action=" $ {pageContext. request. requestURI}" method="post ">
Nome: <input type="text" name="nome"/><br />
E-mail: <input type="text" name="email" /><br />
<input type="submit" value="Enviar" />
</form>
</body>
</html>

Note que a chamada aos mtodos gettersO encontrados no JavaBean


criado pode ser facilmente trazidos a sua pgina JSP com uma sintaxe limpa e simples.
Alternativamente voc tambm pode acessar da seguinte forma:
${spjb["nome"]}
${spjb["email"]}

Palavras Reservadas
Como qualquer outra linguagem, a JSP EL tem muitas palavras que esto
reservadas. Uma palavra reservada (tambm conhecida como palavra chave) a que tem um significado especial dentro da linguagem. Isto significa
que voc no pode usar essa palavra reservada para representar qualquer
outra coisa, como o nome de uma varivel. As seguintes palavras so reservadas no JSP EL:

JavaServer Pages Expression Language Il

261

Tabela 16.6 - Palavras Reservadas no EL


and

eq

gt

true

instanceof

or

ne

It

false

empty

not

if

ge

null

div

mod

Desabilitando EL
Em verses anteriores do JSP, os caracteres "$ {" no tem nenhum significado especial; ento, possvel que voc venha a ter erros caso tenha
alguma pgina anterior verso no qual a EL apareceu, causando assim
problemas na manuteno de antigas aplicaes Web em Servlet Containers
modernos. Para evitar isso, o EL pode ser desabilitado:
No arquivo web.xml (deployment descriptor da sua aplicao), acrescente as seguintes linhas em destaque:
web.xml.

<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web- app>

o resultado do exemplo anterior em um browser seria como mostra a


Fig. 16.2 a seguir:

262 l\I Desenvolvendo Aplicaes Web com JSP...


f!' Trabalhando com Expression langvage X

Expresses Aritmticas
Um exemplo de clculo 1 + 5 * 10 - 3/2: ${l + 5 * 10 - 3/2}
Um valor negativo (-5 -8): ${-5 - 8}
Uma diviso usando div: ${6 div 2}
O resto de uma diviso (10%8): ${10 % 8}

Comparaes
Utilizando Boolean
Uma comparao usando operador temrio "7 :" : ${(true) ? "verdadeiro": "falso" }
~i

Figura 16.2 - Demonstrao da EL desabilitada.

Voc tambm pode desabilitar as expresses EL em uma nica pgina


dentro do deployment descriptor, alterando o trecho como mostrado a
segUIr:
web.xml

<jsp-config>
<jsp-property-group>
<url-pattern>apenasEssaPagina.jsp</url-pattern>
<el-ignored>true</el -ignored>
</jsp-property-group>
< / j sp-config>
</web-app>

Como voc j deve ter concludo, tambm possvel desabilitar as


expresses EL em um conjunto de pginas dentro de um mesmo contexto:

JavaServer Pages Expression Language (\J


web.xml

<jsp-config>
<jsp-property-group>
<url-pattern>/paginas/</url-pattern>

<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web-app>

263

.........
.. . ..

1,

Captulo

JavaServer Pages Standard Tag


Library

EvIDO COMPLICADA SINTAXE QUE OS SCRIPTLETS JSP TRAZEM, tanto no desenvolvimento de pginas web como na manuteno, novos formatos
de negcios comearam a surgir, tanto para suprir essas necessidades como
tambm para agilizar o processo de construo de web sites com a linguagem Java.
A especificao JavaServer Pages Standard Tag Library (JSTL)
teve seu primeiro release (verso 1.0) liberado em junho de 2002 e a sua
chegada foi um marco para os desenvolvedores de pginas JSP.
A especificao JSTL engloba vrias aes comuns que so projetadas
para controlar a maioria das tarefas mais comuns que os desenvolvedores
de pginas JSP necessitam. JSTL consiste em uma coleo de bibliotecas,
tendo cada uma um propsito bem definido, que permite escrever pginas
JSPs sem cdigo Java, aumentando assim a legibilidade do cdigo e a
interao entre desenvolvedores e web designers, proporcionando assim
maior rapidez no desenvolvimento de um web site.
Uma pgina JSTL uma pgina JSP contendo um conjunto de tags
JSTLs. Cada tag realiza um determinado tipo de processamento, onde cada
uma dessas tags faz parte de uma biblioteca JSTL. Sendo assim, uma pgina JSTL pode utilizar vrias bibliotecas JSTLs.
Alguns dias depois que a especificao JSTL havia sido libertada, o
projeto Jakarta Taglibs do grupo Apache seguiu com uma implementao
de referncia da especificao pronta para uso.

266

[Ii] Desenvolvendo Aplicaes Web com JSP...

o primeiro release de manuteno do JSTL (JSTL 1.1) foi completado em novembro de 2003. Um segundo release de manuteno, JSTL 1.2,
foi iniciado em junho de 2004 .

Instalando o JavaServer Pages Standard Tag


Library
Originalmente, a implementao de referncia (RI - Reference
Implementation) do JSTL foi fornecida pelo projeto Apache Jakarta como
parte de seu projeto de Taglibs. Subseqentemente, a Sun Microsystems
incluiu o RI como parte do Java Web Services Developer Pack (JWSDP).
Dessa forma, voc tem mais de uma opo para obter a implementao
de referncia. Se voc precisar de s do JSTL, voc pode baix-lo no projeto Jakarta no endereo Web: http://jakarta.apache.org/taglibs. Alternativamente, voc pode adquirir tambm o JWSDP da Sun no endereo:
http://java.sun.com/webservices/jwsdp.
Um endereo mais direto pode ser usado em:
http://www.apache.org/dist/jakarta/taglibs/standard/binaries/ .

Entre nesse ltimo endereo e baixe os binrios .zip ou tar.gz.


Aps descompactar, pegue apenas dois arquivos JARs:
~ jstl.jar
~ standard.jar
Coloque-os dentro do diretrio lib, em WEB-INF da sua aplicao
Web .

JSTL no NetBeans
No seu projeto, clique com o direito do mouse sobre o item Libraries e
selecione no menu de contexto o item Add Library (Figura 17.1).
Na caixa de dilogo Add Library selecione o item JSTL 1.1 em
Libraries e clique no boto Add Library (Figura 17.2).

JavaServer Pages Standard Tag Library [Ijl]


: Projects .. x ; files

: Runtime

8 -.. @ DesenvolvendoComJ5TL

S t(i) Web Pages


i G3.. ) META-INF
i $. .:J WEB-INF

, L....~

index.jsp

$1 "~ Configur!!tion Files


Server Resources

f. . 68
$-6B
$ . 6lll

Source Pack.ages
Test Pack.ages

L -____________________________.

Figura 17.1

E: Add library
libraries:
~JAX-WS2.0
~JAXB2 . 0
~JSF 1.1
~:

JSTll.l

~JUnt
~ Struts 1.2.9
~ Swing layout Extenslons
~ ToplinkEssentlals

Manage Lbraries ...


Cancel

II

Figura 17.2

JSTL no Eclipse
Siga o mesmo procedimento do Captulo 14.

Help

267

268 l\I

Desenvolvendo Aplicaes Web com JSP...

Criando seu Primeiro Exemplo em JSTL


Depois de instalado na sua aplicao Web, voc precisa aprender a utilizar
essas tags.
primeiroExemploUsandoJSTL.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"%>
<%@

taglib uri="bttp:/ /java. sun.com/jsp/jstl/core" prefix="c" %>0

< !DOCTYPE html PUBLIC "-!/W3C/ /DTD XHTML 1. O Transitional/ /EN"


''http://www.w3 . org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http: / /www .w3.org/1999/xhtml">
<head>
<title>Meu primeiro exemplo usando JSTL< /t itle>
</head>
<body>
<hl> <c:out value="Meu primeiro exemplo usando JSTL"/> </hl>e
</body>
</html>

Para usar o JSTL em uma pgina JSP, voc precisa primeiro definir o cabealho. Esse cabealho definido na diretiva taglib j
vista anteriormente. A URI nesse caso um endereo Web, e no
se trata de uma requisio a ser feita no protocolo HITP, e sim
para seja feita uma busca nos arquivos JARs que se encontram no
diretrio lib da sua aplicao. No JSTL existem quatro APIs bsicas, sendo a CORE a que voc est usando. O prefixo usado a
letra "c", que um padro definido pela Sun.
Ao ter o cabealho definido, a sua utilizao se faz simples, uma
vez que so tags. Nesse caso voc usou a tag out para imprimir o
valor "Meu primeiro exemplo usando JSTL". O resultado
esse texto impresso na tela do seu browser.

JavaServer Pages Standard Tag Library l\I

269

Entendendo o JSTL

o JSTL uma coleo de quatro bibliotecas tags. Cada biblioteca de tags


fornece aes teis (ou tags) baseados nas seguintes reas funcionais:
~ Core
~ Internacionalizao (118n) e formatao
~ Acesso a banco de dados relacional (tags SQL)
~ Processamento de XML (tags XML)

A Core Tag Library


Esta biblioteca contm um centro de aes de propsito geral, que fornecem solues simples, mas efetivas, a problemas comuns que os
desenvolvedores experimentaram em quase toda aplicao JSP. Tarefas
simples como exibir contedo, condies ou iteraes em cima de uma
coleo de itens e etc.
Esse grupo de tags so as mais usadas freqentemente e incluem:
~ <c:if /> para condies
~ <c:forEach /> e <c:forTokens /> para interao
~ <c:choose 1> ... <c:when 1> .... <c:otherwise I> para um fluxo seletivo
~ <c:set /> e <c:remove /> para trabalhar com escopo de variveis
~ <c:out /> para fazer a sada de valores de variveis e expresses
~ <c:catch /> para trabalhar com excees Java
~ <c:url /> para criar e trabalhar com URLs

Internacionalizando e Formatando
Como a Internet alcanada em todos os cantos do planeta, empresas em
todo o mundo passaram e se preocupar em fornecer um contedo internacionalizado, muitas vezes com a lngua nativa e em outros idiomas. O processo de construir uma aplicao de forma se possa adaptar a vrios idiomas e regies sem qualquer esforo de desenvolvimento adicional so conhecidas com a internacionalizao, ou 118n ("internationalization" uma
palavra de 20 caracteres que comea com a letra "i" e termina com "n" ,
tendo 18 letras entre "i" e "n"). A biblioteca de Internacionalizao e

270

[Iiil) Desenvolvendo Aplicaes Web com JSP...

Fonnatao fornece uma srie de aes que o ajudam no uso dos trs componentes chaves associados com a internacionalizao: locales, resource
bundles e base names.
Esse grupo de tags incluem como as mais usadas:
PARA INTERNACIONALIZAO
~

<frnt:setBundle I>: Carrega um pacote de recurso para um escopo especifico, como as mensagens encontradas dentro de um arquivo .properties.
<frnt:setLocale I>: Detennina o local (a lngua a ser usada) na
internacionalizao do contedo.
<fmt:rnessage I>: Para mostrar uma mensagem internacionalizada.

PARA FORMATAO
~
~

<frnt:forrnatNurnber I>: Para fonnatar um valor numrico com


a especfica preciso ou fonnato.
<fmt:formatDate I>: Para fonnatar a data e a hora em um especfico fonnato (de acordo com a conveno internacional do local
especificado)

As Tags SQl
Como no poderia deixar de ter, o JSTL contm tags para trabalhar com
banco de dados de relacional podendo desde annazenar infonnaes como
tambm manipul-las. Embora seja prefervel usar a arquitetura ModelView-Controller (MVC) para separar a lgica de negcios do acesso a banco de dados da camada de apresentao, s vezes voc pode precisar acessar
um banco de dados em pginas JSP.
O JSTL prov um conjunto de aes pela biblioteca de tags SQL para
facilitar a interao com um banco de dados de relacional usando comandos SQL como SELECT, INSERT, UPDATE e DELETE.
Em seu conjunto temos:

JavaServer Pages Standard Tag Library


~
~
~

ll 271

<sql:setDataSource I>: Essa tag cria um DataSource para a conexo com um banco de dados.
<sql:query I>: Executa instrues SQL do comando SELECT.
<sql:update I>: Executa instrues SQL como UPDATE, INSERT
e DELETE.

As TAGS

QUE PROCESSAM

XM L

o uso de XML para representar e trocar dados

est se tomando o padro da


indstria rapidamente. XML atualmente visto com mais importncia pelo
desenvolvedor de pginas JSP. Era de se esperar que a biblioteca de tags
JSTL fornecesse um conjunto de tags separadas para lidar com processo de
XML. As aes de XML fornecidas suprem s necessidades bsicas do
XML e provvel que um desenvolvedor de pginas JSP necessite tambm
de aes mais complexas para controle do XML e tambm para suas transformaes.
A seguir voc tem algumas tags do seu conjunto:
~ <x:forEach I>: Essa tag usada para varrer colees.
~ <x:if /> e <x:choose I>: Essas tags usada para fornecer operao condicional e permite escolher entre opes mutuamente exclusivas.
~ <x:out I>: Essa tag usada para fazer a sada, similar ao scriptlet
<%=%> .

Colocando na Prtica
muito comum utilizar o JSTL em conjunto com EL. Por esse motivo
voc far alguns exemplos de sua utilizao utilizando essa dupla.
usandoJSTLComEL.jsp

<%@ page language="java"


contentType="text/html;"
pageEncoding="ISO-8859-1"
%>
<%@taglib uri=''http://java . sun. com/j sp/j stl/core" prefix="c" %>

~.

'-

---

-------_.~--

272

[1jjlJ

Desenvolvendo Aplicaes Web com JSP...

<!DOCTYPE html PUBLIC


H-//W3C//DTD XHTML 1.0 Transit i onal// EN"
xhtmll /DTD/xhtmll-trans itional .dtd H>

'' http : //www . w3 . org/TR/

<html xmlns=Hhttp://www.w3.org/1999/xhtml H>


<head>
<tit l e>Desenvolvendo com JSTL e EL</ ti tle>
</ head>
<body>
<c: set var="email"value="edson@integrator.com.br" />0
Seu e-mail : <strong> <c:out value="${email}"/> </strong> e
</body>
</html>

o
8

Voc pode usar a action <c:set /> para declarar uma varivel em
uma parte da aplicao Web (page, request, session ou application), e freqentemente usada junto com a action <c:out I>.
Note que na action <c:out /> voc utiliza a EL para trazer a varivel.

As ACTIONS <C:REMOVE

I>,

<C:WHEN

/>

E <C:IF

/>

o exemplo a seguir demonstra mais algumas tags JSTL CORE em conjunto:


maisTagSJSTLemAcao.jsp
<%@page language=Hjava"
contentType="text/html"
pageEncoding=" I SO-8859-1"
%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
< !DOCTYPE html PUBLIC "-//W3C/ /DTD XHTML 1. O Transitional//EN"
''http: / /www . w3. org/TR/xhtmll/DTD/xhtmll-transitional. dtd" >
<html x- ' -: - - "http: //www _w3 _org/1999 / xhtml" >

JavaServer Pages Standard Tag Library !li]

273

<head>
<title>Desenvolvendo com JSTL</title>
</head>
<body>
<c:if test="${param.nome != null}">O
<c:set var="nome" value="${param.nome}"
Seu nome : <c:out value="${nome} "
<br

I>

I>

I>

</c:if>
<c:remove var="nome" 1>49
<c: choose>8)
<c:when test="${nome != null}">
A varivel ${'${'}nome} contm o valor ${nome}<br

I>

</c:when>
<c:otherwise>
A varivel ${'${'}nome} foi removida
</c:otherwise>
</c:choose>
<form action="${pageContext.request .requestURI}" method="post">
Nome: <input type="text" name="nome H I><br I>
<input type="submit" value=HEnviar H I>

</form>
</body>
</html>

A tag <c:if I> a condio IF conhecida da programao Java.


Dentro de seu corpo (o que seria o bloco da condio), voc declara a criao de uma varivel chamada nome com o valor resultante do nome transmitido pelo formulrio.
A tag <c:remove I> remove a varivel nome.
6) A tag <c:choose I> tambm faz testes de condio, onde a condio est em <c:when 1>, que no caso verifica a varivel nome

274 llI Desenvolvendo Aplicaes Web com JSP...


diferente de null. Caso no seja, a tag <c:otherwise I> entra em
ao. Combinado as actions <c:choose />, <c:when /> e
<c:otherwise I> voc tem uma srie de condies alternativas de
uma maneira semelhante aos blocos if, elseif e else ou switch/
case das linguagens de programao modernas.
ACTlONS <C:FOREACH

I>,

<C:FORToKENS

/>

A action <c: forEach /> provavelmente um das aes mais teis provido
pelo JSTL que habilita seu contedo de corpo a ser processado vrias vezes. A action <c:forEach /> repetidamente processa o contedo contido em
seu corpo em cima de uma coleo de objetos ou de um nmero fixo at
que as repeties sejam alcanadas.
H duas sintaxes alternadas para a action <c:forEach I>.
forEach.jsp
e%@ page language="java "
contentType="text/htrnl "
pageEncoding="ISO-8859-1"
%>
e%@taglib uri="http://java . sun.com/jsp/jstl/core" prefix="c"%>
e'DOCTYPE htrnl PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"

''http://www.w3.org/TR/

xhtrnll/DTD/xhtrnll-transitional.dtd">
ehtrnl xrnlns="http://www.w3.org/1999/xhtrnl">
ehead>
etitle>A tag forEache/title>
e/head>
ebody>
ec :set var="str"
value="A,B,C,D,E" />
estrong>A varivel ${ ' ${'}str }:e/strong>
ebr />
ec :out value="${str}" />
ebr />

JavaServer Pages Standard Tag Library [1i]

275

<strong>Usando forEach em uma coleo:< / strong>


<br />
<c:forEach var="letras" items="${str}">
<c:out value="$(letras} " />
<br />
</c:forEach>
<br />
<strong>Usando forEach de 1 at lO:</strong>
<br />
<c:forEach var="i" begin="l" end="lO">
<c:out va lue= "$( i}" />
<br />
</c:forEach>
<br />
<strong>Usando forEach para nmeros pares de 2 at l O: </strong>
<br />
<c:forEach var='i' begin='2' end='lO' step='2'>
<c:out va lue='$(i}' />
<br />
</c:forEach>
</body>
</ html>

Voc pode usar a action <c:forEach /> de duas maneiras: para interao
sobre um conjunto de valores inteiros ou para interagir em cima de um
conjunto de informaes contidas em uma estrutura de dados . Para realizar
essas tarefas, a action <c:forEach /> oferece os seguintes atributos:
~ items: O atributo items da action <c:forEach /> interage em cima
de uma estrutura de dados vlidos para este atributo. Este atributo
no necessrio quando voc interage sobre valores explicitamente inteiros.
~ var: O nome de uma varivel de escopo que referncia o item
atual da repetio . Se voc interage sobre valores inteiros explcitos, aquela varivel de escopo contm o valor inteiro atual. Caso a

276

~ Desenvolvendo Aplicaes Web com JSP...

interao seja sobre um conjunto de dados, o valor contido ser o


objeto atual daquela estrutura.
varStatus: O nome de uma varivel de escopo que referncia um
objeto que tem propriedades correspondentes ao status da repetio. Esse objeto do tipo javax.serv/etJspJstl.core.LoopTagStatus.
begin: Se estiver interagindo sobre valores inteiros, esse atributo
especifica o valor inicial. Se estiver interagindo sobre um conjunto de dados, esse atributo especifica o ndice do primeiro item
acessado naquela estrutura. Se voc especificar este atributo, seu
valor deve ser maior que ou igual zero.
end: Interagindo sobre um valor inteiro, esse atributo especifica o
valor final. Interagindo sobre um conjunto de dados, esse atributo
especifica o ndice do ltimo item acessado naquela estrutura.
Especificando esse atributo, seu valor deve ser maior que ou igual
ao valor especificado para o atributo begin .
step: O valor que o loop deve incrementar durante todo o ciclo de
uma repetio. Especificando esse atributo, seu valor deve ser
maior que ou igual a um.

A ACTION <C:FORToKENS

/>

A segunda action de interao disponibilizada pelo JSTL <c:forTokens I>,


no qual interage sobre Strings separados por um determinado delimitador,
quebrando-os, da mesma forma que a classe de java.util.StringTokenizer
trabalha.
varrendoComForTokens.jsp
<%@ page language="java"
contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<%@taglib uri=Hhttp://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
xhtmll/DTD/xhtmll-transitional.dtd H>

''http://www.w3.org/TR/

JavaServer Pages Standard Tag Library

l\I 277

<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>A action forTokens</title>
</head>

<body>
<formmethod="post" action="${pageContext.request.requestURI}">
<table border="O">
<tr>
<th>Digite a sequencia de dados:</th>
<Itr>

<tr>
<td><input width="20" maxwidth="20"
name="palavras" size="50" value="${param.palavras}" 1></td>
<Itr>

<tr>
<td><input type="submit" name="enviar" value="Enviar" 1></td>
<Itr>

</table>
</form>

<c:if test="${pageContext.request.method=='POST ' }">


<table border="l">
<c:set var="i" value="l" I>
<c:forTokens items="${param.palavras}" var="palavra" delims=" -;,")

<tr>
<td><strong>Palavra <c:out value="${i}" I> </strong></td>
<c:set var="i" value="${i+l}" I>
<td><c:out value="${ palavra } " 1></td>
<Itr>
</c:forTokens )

</table>
</c:if>
</body>

</html>

A action <c:forTokens /> contm os seguintes atributos:

278 l\I

Desenvolvendo Aplicaes Web com JSP...

items: O string para tokenize


delims: O delimitador de caracteres
~ begin: Se especificado, deve ter um valor maior ou igual zero.
~ end: Se especificado, o valor deve ser maior ou igual begin.
~ step: Se especificado, deve ter um valor maior ou igual a um.
~ var: O nome de uma varivel de escopo que referncia o item
atual da repetio.
~ varStatus: O nome da varivel de escopo que representa o status
da interao. Esse objeto do tipo javax.servlet.jsp.jstl.core.Loop
TagStatus.
O resultado desse cdigo mostrado na Figura 17.3 a seguir:
~

fi A action forTokens )(

<>

;'>

111 t!;;~

Ihttp://localhost:8080/DesenvolvendoComJSTL/varrendoComForTokens.jsp l~1

SI>

Digite a sequencia de dados:


Ilntegrator Technology and Design

I Enviar I

IPalavra l lIntegrator

IPalavra Z ITechnology
IPalavra 3 !and
IPalavra 4 1Design

------,

Figura 17.3

A Action de Captura de Erros


Capturar excees algo muito comum no desenvolvimento de aplicaes
Web escritas em Java. Voc as captura usando o bloco try... cath normalmente.
No caso de usar JSTL, voc coloca em prtica a action <c:catch I>. O
exemplo a seguir demonstra a sua utilizao :

JavaServer Pages Standard Tag Library ljI]

279

capturandoExcecoes.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"%>
<%@taglib uri=''http://java.sun.com/jsp/jstl/core'' prefix="c"%>
<!DOCTYPE html PUBLIC
"-I!W3C//DTD XHTML 1.0 Transitional // EN"

''http://www.w3.org/TR/

xhtml1/DTD/xhtml1 -transitional . dtd">


<html xmlns=''http://www.w3.org!1999/xhtml''>
<head>
<title>Capturando Excees em JSTL< /t itle>
</head>
<body>
<c: catch var=le">O
<j sp: include page="naoExiste. j sp"

/>

<jsp:setProperty name="erro" property="sem" value="Invlido" />


</c:catch>
<c:if test="${el=null}">fl

A exceo :<c:out value="${e}" />


</c:if>

<c:if test="${e==null}">
Caso no tenha exceo
</c:if>
</body>
</html>

o
e

A exception capturada pela action <c:catch /> e armazenada na


varivel "e".
Depois essa varivel utilizada em um teste dentro da action
<c:if /> e, no caso de ser diferente de null (quando ocorre uma
exceo), essa exceo impressa com a action <c:out I>.

280

ljlJ Desenvolvendo Aplicaes Web com JSP...

Actions Relacionadas URL


Trabalhar com aplicaes Web utilizar a URL para transmitir informaes. Evidentemente o JSTL possui caractersticas relativas URL como
importar arquivos, links, redirecionamentos e captura de informaes.
A seguir voc tem as actions que compem essas caractersticas.
A ACTlON <C:IMPORT

/>

Esta ao importa o contedo de um recurso baseado em URL e fornece


um modo simples e genrico para acessar esses recursos podem ser includos ou podem ser processados dentro de uma pgina JSP.
O seu uso bsico:
<c:import url="http://www.integrator.cam.br" />

Copiando o contedo para uma varivel:


<c: import url="http://www.integrator.cam.br" var="conteudo" />

A action <c:import I> aceita os seguintes atributos:


Tabela 17.1
Atributo

Descrio

charEncoding Permite especificar o encoding dos caracteres (exemplo: ISO-8859-1 ).


context

Especifica a URL bsica que ser usada para solucionar uma URL
relativa dada pelo atributo url.

scope

Especifica o escopo para a varivel pelo atributo


page.

varo O padro

url

Especifica a URL que deseja importar.

var

Especifica a varivel que vai receber a salda da URL.

A ACTION

<C:URL

/>

A action <c:url I> fornece uma forma de construir corretamente URLs


formatadas. Uma situao de seu uso seria a de transmitir a sesso de um
usurio via URL.

JavaServer Pages Standard Tag Library

lI 281

Os browsers modernos fornecem um mecanismo de sesso armazenando-os em cookies (arquivos de texto pequenos armazenados na mquina do
usurio), que so mandados de volta com cada pedido que o usurio faz
durante uma "sesso." Como esses browsers permitem o usurio de incapacitar o armazenamento de cookies (normalmente por razes de segurana),
voc precisa se assegurar de que a sesso est sendo mantida, reescrevendo a
URL, passando assim esses dados pelo endereo da aplicao Web.
Um exemplo de uma URL reescrita com a sesso transmitida:
bttp://www.integrator.eam.br/livros.jsp;jsessionid=33eab537de4

Um exemplo de usa utilizao:


<e:url value= ..bttp://www.integrator.eam.br/livros.jsp .. />

A ACTION <C:REDIRECT

/>

Como o prprio nome sugere, a action <c:redirect /> envia um redirecionamento HTIP para um cliente.
Seu escopo :
<e:redireet url= ..bttp://www.integrator.eam. br .. />

A ACTION <C:PARAM

/>

A action <c:param /> leva dois atributos bsicos: name e value; que representam o nome do parmetro pedinte junto ao seu valor respectivamente.
Um exemplo de sua utilizao:

<c:url value="http://www.integrator.com.br/livros. php .. var=" url" >


<c:param name=Hisbn" value="123456" />
</c:url>
<br /><strong>O resultado da URL :</strong>
<c:out value=H${url}"/>

282

[ljl] Desenvolvendo Aplicaes Web com JSP...

Ou de uma outra forma, representada com o seguinte escopo:


<c : param name="isbn">123456</c : param>

Onde sua sada seria: O resultado da URL :


http://www.integrator.com.br/livros.php?isbn= 123456

Internacionalizao da Aplicao
Internacionalizar uma aplicao Web nos dias de hoje uma situao muito comum entre os desenvolvedores. A biblioteca JSTL facilita seu desenvolvimento, disponibilizando tags especiais para essa funcionalidade.
A ACTION

< FMT:SETLoCALE / >

Esta action pode ser usada para alterar o local do cliente especificado no
processamento de uma pgina JSP.
Um exemplo de sua utilizao:
<fmt:setLocale value =len_US" scope="session" />

O local escolhido armazenado em uma varivel chamada


javax.servlet.jsp.jstl.fmt.locale e pode ser armazenado em qualquer extenso escolhida.
O atributo value especifica um cdigo de duas partes que representa o
cdigo de idioma ISO-639 e o cdigo do pas ISO-3166 .

Exibindo os Textos no Idioma Definido


Com local definido, ou pela configurao do browser do cliente ou atravs
de uso da action <fmt:setLocale I>, o JSTL precisa usar os textos pr-definidos no idioma escolhido para exibir o contedo no browser com o idioma
identificado por seu local.

JavaServer Pages Standard Tag Library [)ilJ

283

Para isso, necessrio que voc, como desenvolvedor, fornea uma


coleo de recursos (normalmente Strings) para cada local que voc pretende aderir. Para isso, voc utiliza uma coleo de recursos que conhecida como resource bundle e implementada por padro de uma chave=valor
em um arquivo de propriedades (com a extenso .properties). Para mais
informaes, d uma olhada no javadoc da classejava.utiI.ResourceBundle.
A ACTIONS <FMT:BUNDLE

/>

E <FMT:SETBuNDLE

/>

Para habilitar o uso de textos no idioma definido, voc precisa especificar


o pacote de recursos exigido que forneam as mensagens localizadas.
Sendo assim, voc usa a action <fmt:bundle /> ou <fmt:setBundle />
para especificar um recurso. Uma vez declarado, o pacote do recurso pode
ser usado para fornecer os texto no idioma definido.
Embora sejam semelhantes, as actions <fmt:bundle> e <fmt:setBundle>
so usadas de diferentes modos para fornecer mensagens localizadas em
pginas JSP.
A action <frnt:bundle /> usada para declarar uma localizao de
contexto I 18n para usar por tags dentro de seu corpo:
<fmt:bundle basename="Rotu
<fmt:message key="rotulos.nome"/>
<fmt:message key="rotulos.email"/>
</fmt:bundle>

o resource bundle com o nome rotulo declarado para fornecer recursos localizados para as actions <fmt:message I>.
Como a action <fmt:bundle /> projetada para trabalhar com aninhamento da action <fmt:message /> , um atributo opcional tambm pode ser
usado:
<fmt:bundle basename="Rotulos" prefix="rotulos">
<fmt:message key="nome"/>
<fmt:message key="email"/>
</fmt:bundle>

284 !\J Desenvolvendo Aplicaes Web com JSP...

o atributo opcional prefix habilita a colocao de um prefixo prdefinido que fundamental para qualquer action <fmt:message /> aninhada tomando seu uso mais simplificado.
A action <frnt:setBundle /> tambm fornece funcionalidade semelhante action <fmt: bundle I>, mas com uma diferena sutil. Em vez de ter
que aninhar qualquer action <fmt:message/> como contedo de corpo, a
action <fmt:setBundle /> habilita um pacote de recursos a serem armazenados na varivel de configurao javax.servlet.jsp.jstl.fmt.localization
Context, assim qualquer action <fmt:message /> que aparecer, em qualquer parte da pgina JSP, pode acessar o pacote sem ter que ser declarada
continuamente:
<frnt:setBundle basenarne="Rotulos" />
<frnt:rnessage prefix="rotulos.norne" />

A ACTION <FMT:MESSAGE

/>

J mencionado anteriormente, a action <fmt:message /> usa um parmetro


fundamental, key, para extrair a mensagem do pacote de recursos e imprimir com JspWriter..
Outro parmetro opcional, var, habilita a mensagem localizada a ser
armazenada em um parmetro em vez de ser impresso pelo Jsp Writer. Como
com a maioria das tags JSTL, a extenso desta varivel pode ser fixada
usando o atributo scope.
COLOCANDO A INTERNACIONALIZAO EM Ao

Primeiramente voc ir criar dois arquivos com a extenso .properties .


Esses arquivos devero ficar dentro do diretrio classes, no subdiretrio
rneupacote, em WEB-INF.

titulo=Internationalization
ingles=English

JavaServer Pages Standard Tag Library [il]

285

portugues=Portuguese
nome=Narne
email=E-mail
enviar=Send

o primeiro arquivo o resource bundle (pacote de recursos) da linguagem em ingls para a pgina JSP.
rotulos-pt_BR.properties

titulo=Internacionalizao
ingles=Ingls
portugues=Portugus
nome=Nome
email=E-mail
enviar=Enviar

o segundo arquivo o resource bundle

da linguagem em portugus

do Brasil para a pgina JSP.

Criando um Arquivo .Properties no NetBeans


Para criar um arquivo do tipo Properties, direito do mouse sobre o pacote
criado, na janela Projects, e no item New clique em Properties File, ou
em New File, opo Other, selecionando Properties Files, na caixa File
Types.

286 lI

Desenvolvendo Aplicaes Web com JSP...

I:Projects
!8

.. x

r:Files

I:Runtlme

@ OesenvolvendoComJSTl

ij:; .. ~

$. ~

Web Pages
Configuration Files

~ B Server Resources

SQj)
.

Source Pack.ages

: ... (0

$1.(W
$. (iiI

Test
libraries

@.. :g JSTl
@... :g JSTl

a,.Qj
; a,.. ffiB

(ti-GIl

JDK

Compile Pack.oge F9
Find...
Ctrl+F
Cut
Ctrl+X

~ Java C!ass ...

Copy

Ctrl+C
Ctr!+"
Test libr-- - - - - - - - l
Delete
Delete

J5P ...

~ Servlet. ..

~ HTMl ...

Rename ...

~ Web Service ...

..i. Web Service Client ...

e;, Folder ...


Figura 17.4

D o nome para o arquivo em File Name e confirme no boto Finish.


~ New Properties file
Steps
l.

Choosa Fio Type

2..

Nameandloc_n

~
Name and locatlon

fio Nome:

l!_~~_

m _

_ _ . . . .

.............___...............1

Prolect:

L~~_~~!':... __.__ .. ___.... .. __ ...

FoIder:

Isrc\jov.\meupacote

Figura 17.5

mJ

.. 'I

I I~Br-aws-e.-

JavaServer Pages Standard Tag Library [ljlJ

287

Para adicionar uma nova localidade, ou seja, o segundo arquivo, proceda da seguinte forma:
1 - Clique com o direito do mouse sobre o arquivo .properties criado.
2 - No menu de contexto selecione o item Add Locale.
3 - Na caixa de dilogo New Locale voc pode selecionar a localidade diretamente em Predefined Locales e confirme no boto OK.

(g)

E:" Hew Locale


I pUR
LanQUageCode:

'-~_ _ _ _ _ _ _ _ _ _ _ _ _

Country Code:

'-pR_ _ _ _ _ _ _ _ _ _ _ _ _~

Variant:

1
...._ _ _ _ _ _ _ _ _ _ _ _-..::~

...:::..=J

Predefined Loca/es:
nI_NL_EURO - Dutch , Netherlands , Euro
no_NO - Norwegian I Norway
no_NO_B - Norwegian , Norway I BoI<m81
plyL - PoIish , PoIand
pt_BR portugus I Brasil
pt _PT - portugus , Portugal
pt_PT _EURO - portugus' Portugal' Euro
ro_RO - Romanian I Romania

OK

iI

Cancel

11

Help

Figura 17.6

V ao projeto e expanda o arquivo .properties por voc criado e d um


duplo clique onde est indicando pt_BR - portugus (Brasil) e altere os
rtulos desse arquivo.

288 l\J

Desenvolvendo Aplicaes Web com JSP...


: Projects .. x ; files

: Runtime

S @ Oesenvolvendo(omJSTL

GJ '~ Web Pages

$J . fG

Configuratlon Files

t. . ijg

Server Resources

$H:m

Source Pacl<.ages

. . mmeupacote

8 . . ~ rotulos .properties
$ '. defaultlanguage

rt: ...

1iJ. fiiB

~...t)
GHi:j}

pt_BR .. portugus (Brasil)

Test Pacl<.ages
Libraries
Test Libr aries

Figura 17.7

Criando um Arquivo .Properties no Eclipse


Para criar um arquivo do tipo Properties, no Eclipse, voc ter uma tarefa
um pouco maior. Isso porque, diferente do NetBeans, o Eclipse no possui
um excelente editor para arquivos dessa natureza nativamente, sendo necessrio pegar um plug-in. Na verdade, essa a natureza do Eclipse, o que
o toma extremamente flexvel em sua escolha.
Para esse exemplo, eu vou apresentar a voc o plug-in ResourceBundle
Editor, que se encontra no site http://www.resourcebundleeditor.com/.
Na lateral do site clique no link Installation e, assim que carregar a
pgina, clique em Download onde se encontra Eclipse 3.x users.
Voc ser levado ao site sourceforge.net do projeto, onde o plug-in
que voc deve baixar o primeiro da lista. No momento em que esse livro
est sendo escrito, a verso atual 0.7 .5, e o arquivo baixado foi
ResourceBundleEditor_ vO. 7.5.zip.
Assim que baixar o arquivo, descompacte-o.
Se estiver com o Eclipse aberto, feche-o. Copie o diretrio plugins
existente no diretrio descompactado e o cole dentro do diretrio onde se
encontra o Eclipse. Confirme qualquer caixa de mensagens que aparecer e
no se preocupe. No Windows no haver remoo de arquivos existentes,
apenas ocorrer um acrscimo. J no Linux no tem essa mensagem de
substituio como ocorre no Windows.

JavaServer Pages Standard Tag Library

!IiI 289

Inicie o Eclipse e vamos criar seu primeiro arquivo .properties atravs desse plug-in.
No menu File v a New e selecione Other. Na caixa de dilogo New
selecione o item ResourceBundle expandindo o diretrio ResourceBundle.
Clique no boto Next para prosseguir.

Select a wizard
Cria um ou mais arquivos de propriedades.

Wizards:

Itype filter text


II

( EJB

Itl '( Example EMF Model Creation Wizards


Itl ( J2EE
Itl ( Java

:J te:; Java Emitter Templates


(8 Plugin Development
8 (8 ResourceBundle

(i)

-.. ff 1;#1.'II@-mll
(i) ,( Server

$ ' ( Web
( Web Servlces
(i) ( XML
Itl V'? Examoles

rB

< EJack

Next

>

lr

Fini,n

,I

Cancel

Figura 17.8

Na prxima etapa do assistente, em Pasta (no estranhe, est em portugus brasileiro mesmo) selecione o pacote por voc criado clicando no
boto Procurar e indo no seu projeto e abrindo os diretrios que compem
o desenvolvimento. Se o seu pacote se chamar meupacote, v
src\meupacote.

290 lI

Desenvolvendo Aplicaes Web com JSP...

Em Nome Base escreva o nome do seu arquivo .properties.


Abaixo voc tem um local escrito Selecione ou digite uma localizao. Procure o idioma que vai suportar esse primeiro arquivo e clique no
boto Finish para confirmar o assistente.

ResourceBundle (Arquivos de Propriedades)


Este assistente cri" um conjunto de arquivos com" extenso * .properties, que
podem ser abertos pelo editor de ResourceBundle .

, Pasta:
Nome Base:

IL

\!=.D~es:.:.e:.:.:nv:.:.o:.:.:lve:.:.n:.:.do~C:.:o;;:.m:.:J5..:.;TL:.!:\s:.:.:rc:.!:\m..:.;e:.:u::.;pa:.:co:.:.t;;..e_

---'1 [Iocale].properties

r_ot_u_
los_ _ _ _ _ _ _ _ _ _ _ _ _ _

LI

'Localizaes selecionadas

Selecione ou digite uma localiza~o

Iportugus (Brasil)
Ipt
Idioma

--111Procurar ... I

_ _ _ _

,vI

1I BR
Pas

("

'

,_ ..

i lncluir _o>
~.

[ <-- Excluir
Variante

< B"ck

Next

>

l'

Finish

j1

C"ncel

Figura 17.9

Antes de continuar qualquer outra coisa, primeiro voc tem que associar a abertura do arquivo .properties ao plug-in instalado, pois o Eclipse
sempre ir usar o padro dele quando voc quiser abrir diretamente o arquivo com um duplo clique. Para alterar, v ao menu Window e clique em
Preferences. Expanda o item General, depois expanda o item Editors e
selecione File Associatins.

291

JavaServer Pages Standard Tag Library

Em File types procure por * .properties e na parte inferior, em


Associated editors selecione o item Editor de RessourceBundle. Clique
no boto Default encontrado na lateral direita e confirme a caixa de dilogo clicando no boto OK.

_ ~r.gJ

,. Preferences

~!~t~;t-----=

I I fie Assoclatlons
~:II

8 General
fii Appearance
c.pobiitle,
Comp",e/patch
content Type,
8 Editor,

Se. 'Content Type.' for content-type bMed fio associlJtions,


fie typos:
~ ' , jsf

. Structured Text Editor,


Iil Text Editor,
Koy,
Perspedrves

11

k.l

~ ' ,propertles

tI ,serVet

- Search

~"shtl!'l

anel Shutdown
WebBrowser
Wekome
III Workspace
Itl Ant
Gl Data
startup

~ ' , sqI

~ Ed<or de Pesour,eBu1d1<! (defatl:)

8 Editor de Resourc_
De,empenho

Adcl. ..

~ Propertles File Ed<or (1oc1<.ed by 'Java Propertio, Fie' content type)


111 rext Editor <_d by 'Java Propertles file' content typo)

ForrnataSo

fi) Help

III Instal/Upddle
Gj- Internet
lava
pUa-;,

Ili ' ,jsp


Ili ' ,jspf
Ili ' ,jspx
li ' ,oyerride

.... Filo A.soclations

_..

'---~I I

-QJ ',j>aQe

Develooment.______

J -=. _=..=-====--=-=--=--=--=.: :.:_=-=-=====--------_.'::.. =:


... =:
..

1I

'---"DK"'--....

C5lCeI

Figura 17.10

Quando voc der um duplo clique no arquivo, uma janela se abrir. O


Editor RessourceBundle muito simples de entender. Em Propriedades
(olhe a aba inferior), voc pode incluir as keys digitando na caixa ao lado
do boto Incluir. Ou pode ir diretamente aba do idioma e digitar tudo
manualmente. No meu caso eu digitei tudo manualmente, para ficar mais
rpido no primeiro exemplo.
Para criar o segundo arquivo .properties, v aba Novo. Selecione a
localizao e clique no boto Criar.

__

_.

_ _ '---'..L ___

_._

....

_ _

___

'_~_--"'-----""'--.~_

292

l)jlJ Desenvolvendo Aplicaes Web com JSP...

Novo arquivo de propriedades:


Selecione ou digite uma localizao

IEngUsh (United States)

,v:1

~~ c:=J
Idioma

Pais

Variante

Figura 17.11

Depois de criado, na aba Propriedades, a tela dividida. Basta selecionar a key na lateral, e digitar no idioma que ainda no foi preenchido a
palavra traduzida. Aps digitar todas as keys (note que ele indica as que
esto faltando) , voc pode dar uma conferida indo na aba do idioma que
voc acabara de preencher. Perceba que fora colocado a key automaticamente para voc.

Iilo *rotulos( ... ].propertoes


d~or

para RessotirceBundle:rotulos[ ... ].properties.


English (United States)

"" email

""""
""
""
""

inQles
nome
portugues
titulo

~ Propriedades

L_
portugus (8r asi!)

English (United St&es) I portugus (Brasi) Novo .. . I


Figura 17.12

JavaServer Pages Standard Tag Library fii1l

293

Usando os Recursos de Internacionalizao em


uma Pgina JSP
Agora que voc j sabe como criar os arquivos necessrios para internacionalizar sua aplicao, o JSTL ir fazer a sua parte.
internacionalizacaoComJSTL.jsp
<%@ page language="java"
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"%>O
<c:choose>
<c:when test="${param.locale eq 'en_US'}">
<fmt:setLocale value="en_US" 1>0
</c:when>
<c:otherwise>
<fmt:setLocale value="pt_BR" I>
</c:otherwise>
</c:choose>
<fmt: setBundle basename="meupacote. rotulos" 1>$
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC
"-IIW3CIIDTD XHTML 1.0 TransitionalllEN"

"http://www .w3.org/TR/

xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www .w3.org/1999/xhtml''>
<head>
<title> <fmt:message key="titulo" 1></title>O
</head>
<body>
<a href="?locale=en_US"><fmt:message key="ingles" 1></a>
<a href="?locale=pt_BR"><fmt:message key="portugues" 1></a>

294 [iii'] Desenvolvendo Aplicaes Web com JSP...


<br />
<form action="">
<fmt:message key="nome" I>: <input type="text" name="nome" />
<br />
<fmt:message key="email" I>: <input type="text" name="email" /
><br />
<input type="submit" value="<fmt:message key="enviar" />" />
</form>
</body>
</html>

o Para usar o JSTL nessa pgina JSP, voc precisa primeiro definir
os cabealhos que sero usado nesse caso. Esses cabealhos so
definidos na diretiva taglib, como j vista anteriormente. A URI
do primeiro cabealho chama as tags CORE e o segundo cabealho s tags de formatao e internacionalizao. O prefixo usado
a letra "fmt", que um padro definido pela Sun.
Atravs de um teste, voc define a configurao da linguagem
com a action <fmt:setLocale I>. O atributo value do primeiro
en_US e do segundo pt_BR.
@) Com a action <fmt:setBundle /> voc define no atributo basename
o local onde se encontra o arquivo properties.
O A action <fmt:message /> usada para chamar o texto contido no
arquivo .properties de acordo com a linguagem usada. Isso feito pelo atributo key .

. . . . . . . . . . . . . . _. ._-_.... . . . . . . _ . . . . . . . . . . . _..._. . . . . __ . . __ ....._--;;;;'Ei,


.,. lnterMtlOnalizabon )(

<> ,,;

lliII <8> http://loc~host:8060IDesenvolvendoComJSTlrlnl:ernacioMlizacaOComJSTl.jsp?1ocale-en_US

,v,1

I
~

~ P ortuguese

==:J

Name:1
E_mai1:'r=1======;1

I Send I
v

Figura 17.13

JavaServer Pages Standard Tag Library l\I

295

As Actions de Formatao
Alm do idioma, usurios de diferentes localizaes tm padres diferentes relativos a algumas situaes como:
~ Datas e horas
~ Formatos numricos
~ Formatos de Moedas
Felizmente, para tomar o seu trabalho mais fcil, a biblioteca de tags
do JSTL fornece actions que formatam essas situaes.
As DIVERSAS ACTlONS DE FORMATAO

As actions <frnt:tirneZone /> e <frnt:setTirneZone /> complementam uma


a outra de uma forma similar as actions <fmt:bundle /> e <fmt:setBundle />
mostradas anteriormente. A action <fmt:timeZone /> usada para especificar uma zona de tempo para aninhamentos que aparecem dentro de seu
contedo de corpo, considerando que a action <fmt:setTimeZone /> seja usada para armazenar uma referncia de qualquer lugar para uma zona de tempo
em uma varivel exportvel para uso em uma pgina JSP.
A action <frnt:forrnatDate /> fornece uma flexvel formatao de
zona de tempo utilizando objetos de java.util.Date de forma que a data e a
hora depende do modo da zona de tempo do cliente. Em sua forma mais
simples, a action <fmt:formatDate /> aplica o formato padro da zona de
tempo atual e tem a sada com JspWriter.
Com a action <frnt:parseDate /> voc tem uma funcionalidade complementar para a action <fmt:formatDate /> analisando gramaticalmente e
convertendo a representao de datas e horas que foram formatadas de acordo com as configuraes locais ou customizada. Esta action particularmente til se voc precisa permitir aos usurios ao redor do mundo a entrar
com informaes de data e horas em seu prprio formato local e ter corretamente uma anlise de acordo com o considerado correto ao servidor.
A action <frnt:forrnatNurnber /> tambm flexvel e capaz de
formatar um valor numrico em um determinado local ou formatar de acordo
com as configuraes locais como um nmero, moeda corrente ou porcentagem.

296

l)ilJ Desenvolvendo Aplicaes Web com JSP...

o exemplo a seguir demonstra essas action com alguns atributos em


ao:
diversasActionSDeFormatacao . jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<%@taglib uri=''http://java.sun . com/jsp/jstl/core'' prefix="c"%>
<%@taglib uri="http://java.sun . com/j sp/j stl/fmt" prefix=" fmt "%>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"

''http://www.w3.org/TR/

xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns=''http://www.w3 .org/1999/xhtml ">
<head>
<title>Formataes de data, hora , nmero e moeda</title>
</head>
<body>
<h2>Padro atual</h2>
<jsp:useBean id="data" class= "j ava. ut il.Date" />
Data padro: <fmt:formatDate value="${data} "/><br />
Somente a data no formato dd/MM/yyyy :
<fmt:formatDate value="${data}" type="DATE"
pattern="dd/MM/yyyy" />
<br />
A hora: <fmt : formatDate value="${data} " type="TIME"
dateStyle="default"/>
<h2>Los Angeles Ti me Zone</h2>
<fmt:timeZone value=IAmerica/Los_Angeles">O

Default format : <fmt:formatDate val ue="${data} "/><br />


Data no formato dd/MM/yyyy :
<fmt : formatDate value= "${data}" type="DATE"
pattern="MM-dd-yyyy"/>
<br />
Hora estilo SHORT:

JavaServer Pages Standard Tag Library [1iJ

297

<fmt: formatDate value=" $ {data}" type="TIME"


timeStyle="SHORT"/>
<br />
</fmt: timeZone>

<hr />
<h2>Formatao de Moeda</h2>
<c:set var="salario" value="SOOO" />
<fmt:setLocale value="en_US"/>
<fmt:formatNumber type="CURRENCY" value="${salario}" />
<br />
<fmt:setLocale value="pt_BR"/>
<fmt:formatNumber type="CURRENCY" value="${salario}" />
<br />
<hr />
<h2>Formatao de Nmeros</h2>
<c:set var="numero" value="lOOO" />
<fmt:formatNumber type="NUMBER" groupingUsed="true"
minFractionDigits="2" value="${numero}" />
<hr />
<h2>Formatao de Porcentagem</h2>
<c:set var="porcentagem" value="O.OS" />
<fmt:formatNumber type="PERCENT" value="${porcentagem} " />
</body>
</html>

Embora muito simples de compreender, primeiramente voc tem os


Time Zones O que definem a data correspondente ao local indicado. Evidentemente voc deve saber qual time zone pretende mostrar.

- _.. .... ..

~...

. -

298 lli'I

Desenvolvendo Aplicaes Web com JSP.. .

~ Formataes de data, hora, nmero e moeda X

';::; co" IJ

'<f;><:"

Ihttp:/nocalhost:8080/DesenvolvendoComJSTL/diversasActionsDeFormatacao.jsp

Los Angeles Time Zone

_~I ~

Default format : 23/11/2006


Data no formato ddI.M:MJyyyy : 11-23-2006
Hora estilo SHORT: 17:03

Formatao de Moeda
$5,000.00
R$ 5,000,00

Formatao de Nmeros
1.000.00

Formatao de Porcentagem
5%

Figura 17.14

Caso voc queira ver o time zone da regio desejada, execute o trecho
a seguir em uma pgina JSP com as taglibs JSTL devidamente configuradas:

<jsp:useBean id="data" class="java. util.Date" />


<table border="l">
<c:forEach var="timezone"
items="<%=java.util. TimeZone.getAvailableIDs( )%>">
<tr>
<td width="51%">
<c:out value="${timezone}" />
</td>

JavaServer Pages Standard Tag Library l)jl]

299

<td width="49%">
<fmt:timeZone value="${timezone}">
<fmt:formatDate value="${data} " timeZone="${zn}"
type="both" I>
</fmt:timeZone>
</td>
<Itr>

</c:forEach>
</table>

Esse cdigo varrer as Time Zones onde na primeira coluna voc poder ter o local desejado .
Tabela 17.2 - Atributos da action <fmt:formatOate I>
Atributos

Descrio

type

Pode ser time, date ou both. Usado para imprimir somente a hora,
data ou ambos.

dateSty/e

Pode ser usado short, medium, long ou full (ou default). Usado para
imprimir a data.

timeSty/e

Pode ser short, medium, long ou full (ou default). Usado para imprimir
a hora.

va/ue

Um valor do tipo java.util.Date usado para renderizar data e hora .

A Biblioteca de Tags SQl


Embora seja desencorajado o uso de tags SQL da biblioteca JSTL em aplicaes de pginas JSP, essa parte do captulo existe apenas com o intuito de
ensin-lo como trabalhar com essas actions.
A ACTlON

<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

_ _

._

---A. _

..

. . &...-1_ ....

300 l\I

Desenvolvendo Aplicaes Web com JSP...

/> configura uma fonte de dados e transmite essa infonnao atravs do


atributo var, em uma fonte de dados criada no escopo da pgina ou em
dataSource para uma fonte de dados fisica.
A fonte de dados configurada usada pelas actions restantes da biblioteca de SQL que podem executar as instrues SQL j conhecidas.
Voc pode configurar o data source da seguinte fonna:
<sql:setDataSource var="dataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/livraria" user="edson"
password="integrator"/>
Tabela 17.3
Atributo

Descrio

driver

O nome da classe JOSe que ser usada.

scope

A varivel de escopo definida pelo atributo varo 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=ljdbc/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.
A ACTION <SOL:OUERY

/>

A action <sql:query /> fornece a funcionalidade de executar querys do tipo


SELECT:

JavaServer Pages Standard Tag Library

301

<sql:query var="livros" dataSource="${dataSource}" >


SELECT .. FROM livros
</sql:query>

o exemplo a seguir demonstra o uso da conexo e da execuo de


uma query com as tags SQL do JSTL:
usandoSQLComJSTL.jsp

<%@ page language="java"


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/sql" prefix="sql"%>O

<!DOCTYPE html PUBLIC


"- !/W3C !/DTD XHTML l. O Transi tional / IEN"

''http://www . w3 . org ITRI

xhtmll/DTD/xhtmll-transitional . dtd">
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>Usando instrues SQL com JSTL</title>
</head>
<body>

<sql: setDataSource var="dataSource"


dri ver=" com. mysql . j dbc . Dri ver"
url="jdbc:mysql:lllocalhost/livraria"
user="edson" password="integrator" I>

<sql : query var="li vros" dataSource=" $ {dataSource} ,,>@)

SELECT .. FROM livros


</sql:query>

<table border="l">
<tr>

302

[lijl] Desenvolvendo Aplicaes Web com JSP...

<th>ISBN</th>
<th>Ttulo</th>
<th>Atualizar</th>
<th>Excluir</th>
<Itr>
<c:forEach var="row" items=I${livros.rows}">O
<tr>
<td> <c:out value="${row.isbn}" 1>0</td>
<td><c:out value="${row.titulo}" 1></td>
<td>
<a href=" fAtJSTL. j sp?isbn=<c: out value=" $ {row. isbn}" I>">
Atualizar
<Ia>
</td>
<td>
<a href="excluirJSTL.jsp?isbn=<c:out value="${row.isbn}" I
>">
Excluir
<Ia>
</td>
<Itr>

</c:forEach>
</table>
</body>
</htrnl>

o
e

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.
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 Iib de WEB-INF.

JavaServer Pages Standard Tag Library

I\l 303

6) A query criada, nesse caso selecionando todos os registros encontrados na tabela livros.
O 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.
6) Os resultados so exibidos utilizando-se a EL contendo a varivel
determinada no atributo var existente na action <c:forEach I>,
separado por ponto " ." e o nome da coluna a ser exibida.
A ACTION <SOL:UPOATE

/>

A action <sql:update /> possibilita a manipulao de dados via SQL (SQL


Data Manipulation Language) com as declaraes INSERT, UPDATE e
DELETE serem executados. Tambm possvel executar declaraes SQL
Data Definition Language, como uma criao de tabela ou declaraes de
alterao.
A sintaxe desta action semelhante a j usada <sql:query I>. Novamente, um atributo var est disponvel para armazenar o resultado da action
<sql:update /> embora no seja obrigatrio.
O tipo do parmetro var java.lang.Integer.
As ACTIONS <SOL:PARAM

/>

E <SOL:OATEPARAM

/>

As actions <sql:param /> e <sql:dateParam /> so usadas ambas nas actions


<sql:query /> e <sql:update/>. Essas actions so aninhadas so usadas
para passar parmetros em um string de SQL parametrizado.
A seguir voc tem a sua sintaxe em conjunto com a action <sql:update I>:
<sql:update var="r" dataSource="${dataSource}">
DELETE FROM livros WHERE isbn =?
<sql : param value="${param. isbn}" I>
</sql:update>

Ou a sintaxe em conjunto com a action <sql:query I>:

304 ll Desenvolvendo Aplicaes Web com JSP...


<sql:query var="livros" dataSource="${dataSource}">
SELECT * FROM livros WHERE isbn =?
<sql : param value="$ {param. isbn} 11 />

</ sql :query>

Os valores so passados pela action <sql:param /> e substitudos para


cada parmetro marcado com o caractere "?" na instruo SQL. A ordem
no qual as actions <sql:param /> aparecem determina qual parmetro ser
substitudo.
fAtJSTL.jsp

<%@ page language="java"


contentType="text/htrnl"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri=''http://java.sun.com/jsp/jstl/core'' prefix="c"%>
<%@taglib uri= ''http://java.sun . com/j sp/j stl l frnt" prefix=" frnt" %>
<%@ taglib uri=''http://java . sun . com/jsp/jstl/sql'' prefix="sql"%>
<!DOCTYPE htrnl PUBLIC
"-I!W3CIIDTD XHTML 1.0 Transitional ll EN"

''http://www . w3 . org/TR/

xhtrnll/DTD/xhtrnll-transitional.dtd">
<htrnl xrnlns=''http://www.w3.org/1999/xhtrnl''>
<head>
<title>Forrnulrio de Atualizao</title>
</head>
<body>
<sql:setDataSource var="dataSource"
driver="corn.rnysql.jdbc.Driver"
url="jdbc :rnysql: Illocalhostllivraria"
user="edson" password="integrator" I>
<sql :query var="livros" dataSource=I${dataSource}">O

JavaServer Pages Standard Tag Library [)jIJ


SELECT

305

FROM livros WHERE isbn=?

<sql :param value="$ {param. isbn} " I >


</sql:query>
<c:set var="row" value="${livros.rows[O]}" I>e
<c:set var="data" value="${row.ano-publ i cacao}"I>.

<form action="atualizaJSTL.jsp" rnethod="post">


<table>
<tr>
<td>ISBN:</td>
<td>
<input type="text" narne="isbn"
value="<c:out value="${row . isbn}" I>"

readonly="readonly" I>

</td>

<Itr>
<tr>
<td>Ttulo:</td>
<td>
<input type="text" narne="titulo"
value="<c:out value="${row.titulo}" I>" I>
</td>

<Itr>
<tr>
<td>Edio:</td>
<td>
<input type="text" narne="edicao"
value="<c:out value="${row.edicao_nurn}" I>" I>
</td>

<Itr>
<tr>
<td>Publicao:</td>
<td>

<input type="text" name="publicacao"

306 lI Desenvolvendo Aplicaes Web com JSP...


value="(fmt : formatDate value="${data}" type=IDATE"
pattern="yyyy"l>" I>

</ td>
<I tr>

<tr>
<td>Descri o:< / td>

<td>
<textarea name =" descri cao" rows ="5" co l s="25">
<c:out value="${ r ow . de s cri ca o}" 1></ t ext ar ea>
</ td>
<I tr>

<tr>
<td co l span="2">
<input type="submit" name="btAtua l izar" value="Atuali zar" I>
</ td>
<I tr>

</ table>
</ form>
</ body>

</ html>

Do link criado na pgina anterior, voc transmite o cdigo do


ISBN para essa pgina. Esse ISBN passado pela action
<sql:param /> e substitudo.
Como se trata de exibir o contedo de apenas uma linha, no ser
necessrio um loop. Por esse motivo uma varivel chamada row
foi declarada. Atente ao detalhe de exibio de apenas uma linha,
usando a EL: ${livros.rows[Oj}.
6) O ano de publicao existente na tabela de livros ser armazenado em uma varivel chamada data.
O A varivel data formatada usando a action <fmt:formatDate I> .

A pgina a seguir utiliza a action <sql:param /> em conjunto com a action


<sql:update I>:

JavaServer Pages Standard Tag Library

Ill 307

atualizaJSTL.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri="http://java.sun.com/jsp/j s tl/core" prefix="c"%>
<%@ taglib uri= "http://java . sun . com/j sp/ j stl/sql " prefix=" sql "i>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"

''http://www.w3.org/TR/

xhtmll / DTD/xhtmll-transitional.dtd">
<html xrnlns= "http://www . w3 . org / 19 99 /xhtml">
<head>
<title>Dados atualizados</title>
</head>
<body>
<sql:setDataSource var="dataSource"
driver="com .mysql . jdbc . Driver"
url="jdbc:mysql: / /localhost/livraria"
user="edson" password="integrator" />
<sql :update var="resul tado" dataSource=" $ {dataSource}" >0
UPDATE livros SET
titulo=?, edicao_num=?,
ano-publicacao=?, descricao=?
WHERE isbn=?

<sql:paramvalue="${param.titulo}" />
<sql : param value="${param.edicao}" />
<sql:param value="${param.publicacao}" />
<sql:param value="${param.descricao}" />
<sql:param value="${param.isbn}" />
</sql:update>
<c:if test="${resultado>O} " >@

<h3>Os dados foram atualizados com sucesso !< / h3>

308

Desenvolvendo Aplicaes Web com JSP...

<a href=" usandoSQLComJSTL. j sp">Vo ltar a pgi na princ i pa l< /a>


</c:if>

</ body>
</ html >

o
e

A action usada nesse exemplo a <sql:update />, trabalhando


com a instruo SQL UPDATE. Dessa vez, mltiplas actions
<sql:param /> so utilizadas. A ordem definida pelos caracteres
"?" devem ser respeitadas na hora de colocar as actions.
Caso a instruo seja bem sucedida, o valor inteiro enviada a
varivel resultado , informando o nmero de linhas retomadas.
Caso o valor seja maior que zero, a mensagem de atualizao
mostrada e um link para retomar a pgina principal.

A ACTION

< SQL:TRANSACTION / >

A action <sql:transaction /> que possibilita trabalhar com um comportamento transacional na SQL.
As actions <sql :query /> ou <sql:update /> podem ser includas como
parte de uma transao aninhadas dentro da action <sq1:transaction I>.
<sql :transacti on dataSource="$ {dataSource}"
isol ation="r ead_committed">
<sql:update var ="resul t ado">
DELETE FROM livr os WHERE i sbn = ?
<sql : param value="$ {param . isbn }" />
</sql:update>
</ sql: t r ansac tion>

Se a action <sql:update /> for executada com sucesso, a transao ter


o commit automtico. Se o comando o DELETE falhar, a transao inteira
desfeita, o famoso ROLL BACK.
Note que o DataSource declarado pela action <sql:transaction I>,
um detalhe muito importante. O atributo isolation, que opcional, tambm

JavaServer Pages Standard Tag Library

ll 309

pode ser fornecido para dar o nvel de isolamento da transao. Este atributo
deve ter um dos seguintes valores:
~ read committed
~ read uncommitted
~ repeatableJead
~ serializable
A pgina a seguir termina o exemplo com a excluso de dados usando
JSTL:
excluirJSTL.jsp

e%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"%>
e%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
e%@ taglib uri="http://java . sun.com/jsp/jstl/core" prefix="c" %>
e!DOCTYPE html PUBLIC
"- I!W3CI!DTD XHTML l. O Transi tionall IEN"
xhtmll/DTD/xhtmll-transitional.dtd">

''http://www . w3 . org ITR I

ehtml xmlns="http://www.w3.org/1999/xhtml''>
ehead>
etitle>Excluindo com JSTLe/title>
e/head>
ebody>
esql:setDataSource var="dataSource"
driver="com.mysql.jdbc . Driver"
url="jdbc :mysql : Illocalhostllivraria"
user="edson" password="integrator" I>

<sql: transaction dataSource="$ {dataSource}"


isolation="read_committed">

esql :update var="resultado">


DELETE FROM livros WHERE isbn = ?
esql:param value="$ {param. isbn} "I>
e/sql:update>
</sql:transaction>

310 I\l

Desenvolvendo Aplicaes Web com JSP...

<c: if test="${resultado>O }">


<h3>O ISBN ${param . i sbn} f oi excluido com sucesso!</ h3 >
<a href="usandoSQLComJSTL. jsp">Vo ltar a pgina principa l </a>.
</ c : if>
</ body>
</ htrnl>

A excluso feita da mesma maneira que a atualizao, usando a


action <sql:update/>. Note a utilizao da action <sql:transaction/> .

A Biblioteca de Tags XML


Nos ltimos anos o XML se tomou um padro de arquivo por representar e
trocar dados entre aplicaes de todos os tipos . Dados representados por
XML so simples em sua estrutura e fcil de validar. Mas o fato principal
de seu sucesso foi de que seus dados fundamentado em texto, o que aumentou sua popularidade, especialmente com as tecnologias de servios
Web.
o JSTL fornece uma biblioteca que processa tags XML e projetada
para resolver muitas das tarefas comuns que ocorrem em pginas que usam
dados XML.
A biblioteca que processa tags XML pode ser dividida em trs actions:
~ Core
~ Controle de Fluxo
~ Transformao
As duas primeiras reas funcionais so bem parecida com a biblioteca
de tags de Core, exceto o fato de que so projetadas para trabalhar com
dados no formato XML.
A action de Transformao XML possibilita transformar os dados XML
em um contedo visualmente melhor usando XSL Transformations (XSLT).
A biblioteca de actions XML que processam essas tags toda baseada
em tomo do XPath (uma recomendao do W3C desde 1999), onde se
pode especificar partes individuais de um documento XML usando uma
simples expresso XPath

JavaServer Pages Standard Tag Library [ljjlJ 311

~.l1L1nQaa~

Para usar o XPath com os exemplos desta sesso, voc precisar das bibliotecas Xalan. Se voc baixou o JWSDP como descrito no princpio desse captulo, voc pode encontrar as bibliotecas Xalan no diretrio de jaxp\lib\endorsed. Outra forma de
obter essas bibliotecas pelo endereo http:j j
xml.apache.orgjxalan-jj. Aps baixar; copie os arquivos JARs
dentro do diretrio lib, em WEB-INF, da sua aplicao.

A ACTION

XM L CORE

-"~n

Similar a action Core do JSTL, com a caracterstica de fornecer as tags


fundamentais para interagir com o contedo XML.
As ACTIONS <X:PARSE

/>

E <X:OUT

/>

Como voc j est bem familiarizado com o JSTL, o exemplo dado a seguir demonstrar a varredura do XML e a sada dos resultados encontrados
na pgina JSP.
Crie um arquivo chamado Iivros.xml dentro do diretrio raiz da sua
aplicao. Adicione o seguinte contedo:
livros.xml.

<linha1><?xml version=" 1. o encoding=" I50-8859-1"?>


li

<livros>
<livro>
<isbn>85-7393-486-7</isbn>
<titulo>Dominando Eclipse</titulo>
<edicao>l</edicao>
<publicacao>2006</publicacao>
<descricao>Conhea a IDE mais usada do momento</descricao>
</livro>
<livro>
<isbn>85-7393-519-7</isbn>

312

Desenvolvendo Ap licaes Web com JSP...

<titulo>Dominando NetBeans</titulo>
<edicao>1</edicao>
<publicacao>2006</publicacao>
<descricao>
Conhea as principais caractersticas dessa IDE
</descricao>
</livro>
<livro>
<isbn>85-7393-543-X</isbn>
<titulo>Dominando AJAX</titulo>
<edicao>1</edicao>
<publicacao>2006</publicacao>
<descricao>Domine o AJAX</descricao>
</livro>
</livros>

o XML no ser comentado, pois simples em sua estrutura.


A pgina JSP a seguir demonstra como trazer os dados encontrados
no XML criado usando a biblioteca JSTL:
usandoXMLcamJSTL.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISQ-8859-1"
%>
<%@ taglib uri=''http://java.sun . com/jsp/jstl/core H prefix="c" %>
<%@ taglib uri=''http://java . sun.com/jsp/jstl/xml.'' prefix="x" %>0
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" ''http : //www.w3.org/TR/
h~m14/1oose.dtd>

<html>
<head>
<title>Manipulando o XML atravs de JSTL</title>
</head>
<body>

JavaServer Pages Standard Tag Library

lI 313

<c:import url="livros.xml." var="url" 1>$


<x:parse xml.="${url}" var="doc" scope="application" I>.
<table border="l" >
<tr>
<th>ISBN</ th>< th>Ttulo</ th>< th>Publicao</ th>
<I tr>
<x: forEach select="$doc/livros/livro" var=ll">O
<tr>
<td><x:out select=I$1/isbn"I>0</ td>
<td><x:out select="$l/titulo"l></ td>
<td><x:out select="$l/publicacao"l></ td>
<I tr>
</x:forEach>
</ table>
</ body>
</ html>

Primeiramente nesse exemplo voc tem que importar as bibliotecas


que iro ser usadas, sendo que, a mais nova a de XML O.
Com a action <c:import I>@ voc importa o arquivo XML criado
anterionnente. Com a action <x:parse 1>6) voc pode manipular o documento XML, onde o seu contedo analizado e salvo na varivel detenninada em seu escopo. Nesse exemplo o escopo de armazenamento
application.
Com a action <x:forEach 1>0, pertencente s actions de controle de
fluxo XML, voc varre os elementos encontrados no documento XML,
existentes na varivel $doc agora, e os envia para uma outra varivel, $1.
A action <x:out 1>0 similar a sua inn da biblioteca Core <c:out I>
e tem como propsito a sada dos resultados no navegador.

A Action Controle de Fluxo XML


Agora que foi visto como analisar gramaticalmente, annazenar e recupt:rar
os dados XML, voc pode dar uma olhada nas actions de controle de fluxo
XML (XML Flow Control), que condicionalmente processam cdigo JSP

314 lll

Desenvolvendo Aplicaes Web com JSP...

baseado no resultado de uma expresso XPath e interage sobre os elementos dentro de um documento XML.
Assim como os casos anteriores, similar a biblioteca Core.
As ACTIONS <X:FOREACH

/>

E <X:IF

/>

Para que no haja tantos exemplos, como j mostrado ao longo do captulo,


altere o arquivo criado como mostra o exemplo a seguir:
usandoXMLcamJSTL.jsp
<x:forEach select="$doc/livros/livro" var="l">
<x:if select="$l/titulo='Dominando AJAX'''>
<tr>
<td><x:out select="$l/isbn"I></td>
<td><x:out select="$l/titulo"I></td>
<td><x:out select="$l/publicacao"I></td>
<Itr>

</x:if>
</x :forEach>

Como a action <x:forEach /> foi demonstrada anteriormente, apenas


a action <x:if /> uma novidade, embora nem tanto assim. Note que seu
comportamento similar ao da biblioteca Core.
As ACTIONS <X:CHOOSE

I>,

<X:WHEN

/>

E <X:OTHERWISE

/>

Tambm similar a biblioteca Core, substitui um conjunto de condies if.


usandoXMLcomJSTL.jsp
<x:forEach select="$doc/livros/livro" var="l">
<x:choose>

JavaServer Pages Standard Tag Library lI

315

<x:when select="$l/titulo='Dominando AJAX'''>

<c:set var="cor" value="#EEEEEE" />


</x:when>
<x:when select="$l/titulo='Dominando Eclipse"'>

<c:set var="cor" value="#CCCCCC" I>


</x:when>
<x:otherwise>

<c:set var="cor" value="#FFFFFF" I>


</x:otherwise>
</x:choose>

<tr bgcolor="${cor}">
<td><x:out select="$l/isbn" /></td>
<td><x:out select="$l/titulo" /></td>
<td><x:out select="$l/publicacao" /></td>
<Itr>
</x:forEach>

o resultado como mostra a Figura 17.15 a seguir:


!1' Mar\1pulando o XML atravs de JSTL X

<;:::. ';/ li <!;)~ [iittP:lllocalhost:8080/DesenvolvendoComJSTl/u;~ndoxML~o~jSTL.jSp

r----'-ISi3N---- r-----

-a ~

- ~~

Ttulo

[85-7393-486-7 '. ominando Eclipse [2006


/85-7393-519-7 [Dominando NetBeans ;:-12-00-6--=1
185-7393-543-X

ominando AJAX

12006

Figura 17.15

As Actions de Transformao XML


A situao aqui transtormar o documento XML em outro tipo de contedo, como HTML ou WML.

316 !\l

Desenvolvendo Aplicaes Web com JSP...

A ACTION <X:TRANSFORM

/>

Como tudo em JSTL, de forma muito simples voc pode aplicar uma
formatao de um arquivo XSLT em seu documento XML.
Para colocar essa action em ao, primeiramente voc precisar criar
um documento XSLT para formatar o XML:
livros.xsl
<?xml version=" 1. O" encoding="ISO-8859-1"?>
<xsl :stylesheet version="l.O"
xmlns:xsl="http://www .w3 . org/1999/XSL/Transforrn">
<xsl:template match="/">
<html>
<head>
<title>Utilizando XML com XSLT</title>
<style>
.alternado{background-color:#EEEEEE}
.titulo{background-color:#CCCCCC}
</style>
</head>
<body>
<table border="l">
<tr>
<th colspan="4">Livros Cadastrados</th>
<Itr>
<tr class="titulo">
<th>ISBN</th>
<th>Ttulo</th>
<th>Edio</th>
<th>Publicao</th>
<Itr>
<xsl:for-each select="livros/livro">
<xsl:element name="tr">
<xsl:if test="(position( ) mod 2 = 1)">
<xsl:attribute name="class">

JavaServer Pages Standard Tag Library ljlJ

317

alternado
</xsl:attribute>
</xsl:if>
<td>
<xsl:value-of select="isbn" I>
</td>

<td>
<xsl:value-of select="titulo" />
</td>

<td align="center">
<xsl:value-of select="edicao" I>
</td>
<td align="center">
<xsl:value-of select="publicacao" />
</td>

</xsl:elernent>
</xsl:for-each>
</table>
</body>
</htrnl>
</xsl:ternplate>
</xsl:stylesheet>

o arquivo livros.xsl o responsvel por formatar os resultados encontrados no arquivo Iivros.xml. Um elemento <xsl:for-each I> usado
para selecionar os dados encontrados na rvore do documento XML. Note
que a raiz do XML o elemento <livros I> e cada elemento <livro I>
varrido para que voc possa pegar os resultados .
O elemento <xsl:value-of I> usado para computar o texto gerado.
Para que a cor de cada linha fique alternada, o elemento <xsl:element
I> usado para criar um elemento HTML, que no caso se trata da tag <tr 1
>. Essa tag que ser criada ter um atributo chamado class, que gerado
tambm atravs do elemento <xsl:attribute I>. Esse atributo est entre o
elemento <xsl:if I> que testa um resultado, onde dependendo o valor aplica ou no a classe existente da folha de estilo.

318 l\i'I

Desenvolvendo Aplicaes Web com JSP...

Agora para aplicar o XSLT no documento XML, basta criar a pgina


a seguir com a action <x:transform I>.
usandoXSLTcomXMLeJSTL.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>

<c::import url="livros.xml" var="livros" />


<c::import url="livros.xsl" var="xslt" />
<x:transform xml =" $ {livros} xslt="${xslt}" />
11

o resultado como mostrado na imagem a seguir:


0E]

~ UtjlZndo XML com XSl T X

,,'::. <>

r>

Ihttp:/nocalhost:6060/DesenvolvendOComJSTL/usandoXSLTcomXMLeJSTL.jsp .., I ~
Livros Cadastrados

ISBN

Titulo

dio

185-7393-486-7 IDominando Eclipse

'----==

;:::1

185-7393-519-7 IDominando NetBeans ~I

~I
185-7393-536-7 ITorncat Guia Rpido ~I
185-7393-436-0 ominando JBuilder X ~
185-7393-543-X !Dominando AJAX

2006
2006
2006
2005
v

Figura 17.16

..

..... ..... ..

Captulo

1~

Entendendo Custam Tags

uma vez
que j foi apresentado a essa situao em um exemplo dado em captulo anterior. As Custom Tags possibilitam encapsular funcionalidade
reutilizveis em pginas JSP. Uma das desvantagens principais de ambientes de scripting como JSP o quanto se toma fcil de reunir um conjunto de
repetidas aes em pginas diferentes e, muitas vezes, sem pensar em como
ser mantido e acrescido no futuro.
Apesar disso, voc deve estar se perguntando do porque criar tags
personalizadas, em meio a tantas j existentes e at mesmo diante de situaes como os JavaBeans, que resolvem muitas situaes. exatamente o
que voc entender neste captulo .
AGS PERSONALIZADAS NO UMA COISA MUITO INCOMUM PARA VOC,

Em Qual Situao Eu Devo Usar Custom Tags?


Entre as melhores prticas que j foram estabelecidas ao redor do desenvolvimento de pginas JSP, uma das mais importantes a de ter o mnimo
de cdigo Java, sempre que possvel, embutido em uma pgina JSP. A experincia mostrou aos desenvolvedores trs fatores chave que se beneficiam
desta prtica, que so:
~ Reusabilidade
~ Readaptabilidade
~ Manutenibilidade

320 l\I Desenvolvendo Aplicaes Web com JSP...


Esses trs fatores so explicados a seguir:

REUSABI LI DADE
Uma meta comum associada a praticamente todas as linguagens de programao, a reutilizao de cdigo o ajuda a acelerar o desenvolvimento de
uma aplicao, principalmente quando se trata de uma aplicao de grande
porte. Voc percebeu que, ao criar pginas JSP com cdigos Java embutido, como no caso de acesso a banco de dados, fora percebido que muitas
das caractersticas ali existentes seriam bem mais produtivas se fossem
compartilhadas, pois se tratavam do mesmo cdigo praticamente em todas
as situaes, embora essas situaes fossem diferentes em suas finalidades. A reutilizao diminui drasticamente a manuteno, focando em uma
nica classe ou componente, uma vez que alteraes em uma aplicao por
causa de erros causados so problemticos quando se encontram em vrios
nveis do programa separadamente.
O modo que JSP lhe permite reutilizar cdigo atravs de custom tags e
bibliotecas de tags.

READAPTABI LI DADE
Custom Tags melhoram a readaptabilidade encapsulando cdigo Java fora
da pgina. Como voc pode ter notado, no to dificil escrever Scriptlets
em pginas JSP no desenvolvimento, o mais duro ler a pgina.
Encapsulando o cdigo Java em uma tag customizada remove esse problema da pgina, fazendo uma limpeza, deixando os textos mais curtos e mais
legveis. Escolhendo nomes apropriados para sua tag customizada tambm
pode fazer uma pgina mais fcil para designers de pgina lerem e entenderem.
MANUTENIBILlDADE

Um importante conceito em manutenibilidade remover as duplicaes de


seus cdigos, concentrando em um nico local uma mesma situao
requerida por diversas partes de sua aplicao. Se voc tiver 10 cpias do

Entendendo Custam Tags [1iJ

321

mesmo mtodo espalhadas ao longo de uma aplicao Java, voc tem 10


lugares diferentes para fazer correes quando um erro encontrado. Porm, se voc extrair esse mtodo e nele tiver 100 chamadas que seja, para
aquele mtodo, o erro fixado em s um lugar. Isso um conceito importantssimo , principalmente se voc tiver a inteno de ser um grande
desenvolvedor, que faz parte de uma equipe que trabalha com grandes projetos.
Se voc puder encapsular alguma parte da funcionalidade em uma tag
customizada, mudanas ou problemas so direcionadas aquela tag
customizada, e ento todas as partes da sua aplicao que necessitar chamar essa tag adquire suas funcionalidades e problemas so resolvidos alterando-se somente o cdigo da tag e no as partes que a chamam.
H vrios sinais que ajudam identificam se um sistema ser fci l ou
difcil para se manter. Usando tags customizadas j um desses sinais para
uma aplicao JSP, uma indicao que ser fcil de se manter.

Custom Tags e Biblioteca de Tags, Qual a Diferena?


Uma biblioteca de tags simplesmente uma coleo de uma ou mais tags
customizadas ou personalizadas. Uma biblioteca de tags pode ser usada
novamente em uma nica pgina, em vrias pginas em uma aplicao, ou
por vrias pginas em aplicaes diferentes. Por exemplo, a biblioteca de
tags JSTL Core contm todas as tags que ajudam voc a reso lver os problemas comuns encontrados na construo de pginas JSP, como interagir com
colees ou simplesmente adicionar lgica condicional a pgina. Veja que
so vrias tags que se encontram em uma mesma biblioteca .

Construindo uma Biblioteca de Tags Clssicas


Voc viu no Captulo 9 uma introduo de como se criar tags personalizadas usando Java. A idia nesse captulo no abordar totalmente o assunto, uma vez que isso por si s daria um livro inteiro. Aqui sua misso ser
compreender melhor como tudo funciona e as possibilidades do que pode
ser feito a partir da.

322 l\l Desenvolvendo Aplicaes Web com JSP...

Criando a Classe InputTag


A classe InputTag ter o desenvolvimento de uma tag genrica, que poder ser usada em todas as tags tipo <input type I>, encontrado em formulrios feitos em HTML.
InputTag . java

package meupacotei
import java.io.IOExceptioni
import javax.servlet . jsp . JspWriteri
import javax.servlet.jsp . tagext.TagSupport i
public class InputTag extends TagSupport
private String type = null; .,
private String name = null;
private String id = null;
private String value = null;
private String size = null;
private String maxLength = null;

public String getType( ) {


return typei

public void setType(String type) {


this . type = typei

public String getMaxLength( ) {


return maxLength i

public void setMaxLength(String maxLength) {

Entendendo Custam Tags li'l


this.rnaxLength

= rnaxLength;

public String getSize( ) {


return size;

public void setSize(String size) {


this.size = size;

public String getld( ) {


return id;

public void setld(String id) {


this.id = id;

public String getNarne( ) {


return narne;

public void setNarne(String narne)


this.narne = narne;

public String getValue( ) {


return value;

public void setValue(String value)


this.value = value;

323

324

~ Desenvolvendo Aplicaes Web com JSP.. .

public int doStartTag( ) throws javax.servl et.jsp.JspException

{~

return SKIP_BODY;

public int doEndTag()

throws javax.servlet.jsp.JspException

try{
JspWriter out = pageContext.getOut( );
out. pr i nt ("<input") ;
out .print(" type= \ "" + getType(
out .print(" name= \ "" + getName(

+ \1 \ "");

+ "\

1111) ;

if(getValue( ) != null)
out.print(" value= \ "" + getValue( ) + " \ "");
if (getld( ) != null)
out.print(" id= \ "" + getld(

+ 11 \

11

Jf) ;

if (getSize ( ) ! = null)
out . print(" size= \ "" + getSize(

+ 11 \

1111)

if (getMaxLength( ) != null)
out.print(" maxlength= \ "" + getMaxLength( ) + " \ "");

out.print(" / >");
catch (IOException ioe) (
System.out.println("Erro:"
+ ioe.getMessage( ));

this.release ( );
return EVAL_PAGE;

{~

Entendendo Custam Tags


public vo id release( }
super.release( };

325

(t)

type = null;
name = null;
id = null;
value

= null;

si ze = null;
maxLength = null;

A tag <input /> dos formulrios HTML contm alguns atributos, que
foram criados aqui, na sua tag personalizada O. Esses atributos, aqui, na
classe InputTag so privados e sero acessveis pelos mtodos gets e sets
pblicos da classe.
Os mtodos com inicio get em seus nomes sero os que retomaro os
valores enviados, como descreve o conceito JavaBeans. Os mtodos com
incio set, contm tambm uma entrada de parmetro. Para melhor ilustrar,
veja a seguir o detalhe:
Uma tag <input type="text" /> precisaria dos mtodos, na sua tag
personalizada, para ser configurado como tal: setType(String type) e
getType( ). O primeiro mtodo pblico, set'fype(String type) tem essa
nomenclatura por se referir ao atributo type, e que por sua vez recebe um
parmetro, que ser os types existentes na tag HTML (text, submit, reset,
checkbox, radio). O mtodo getType() no pega valores, apenas retoma o
valor encontrado.
O mtodo doStartTag( )S, como j foi dito no Captulo 9, chamado em runtime pelo JSP para avisar ao processador de tags que deve fazer
seu trabalho. Nesse exemplo, no fora utilizado para processar a tag, pois a
tag no contm um incio em si. O retomo da constante SKIP_BODY
indica que a tag no tem um corpo.
O uso do mtodo doEndTag( )6), assim como doStartTag( ), um
dos mtodos de uma tag no qual realiza uma lgica nica. Assim como
ocorre no mtodo doStartTag( ), seu nome indica quando ela ser chama-

326

~ Desenvolvendo Aplicaes Web com JSP...

da; nesse caso, quando o final de uma tag for alcanada. Para tags sem
corpo t:inputTag type="text" I, isso significa que ela chamada quando a barra ("I") for alcanada. Nesse caso, voc cria todo o escopo da tag de
formulrio HTML <input I> nesse mtodo. Para tags com corpo, esse mtodo chamado quando a tag de fechamento encontrada /t:fim_tag .
Isso comum em algumas tags HTML, como por exemplo a tag <form>
que tem como fechamento </form> .
Ao chamar doEndTag( ), o runtime do JSP notificado de que a tag
est processada e que est pronto para continuar o processamento do restante da pgina. No entanto, pode ser que nesse ponto a tag prefira que a
pgina termine, ao invs de continuar a execuo. Isso acontece em uma
tag cujo trabalho seria de redirecionar o usurio para uma outra pgina ou
outro URL e sendo assim, a pgina no deve continuar com sua execuo,
quando completa. Se esse for o caso , voc deve retornar a constante
SKIP_PAGE. Mas no exemplo dado, voc pode implementar diversas tags
em um formulrio usando essa tag personalizada, portanto nesse caso, voc
deseja que a execuo continue em andamento, retornando EVAL_PAGE.
O mtodo release( )0 permite que seu processador de tags faa a
limpeza na vida de uma tag. Note que chamado esse mtodo em
doEndTag( ) e que nele, voc atribui valores nulos aos atributos existentes . Isso necessrio, para que o ltimo atributo no fique na memria
quando voc chamar outro .

O Papel do TLD
O TLD serve para dois propsitos:
1. Ele contm informaes necessrias para auxiliar as ferramentas
de autoria JSP, que por sua vez, analisam, utilizam e exibem estas
informaes.
2. Ele contm todos os dados sintticos necessrios pelo mecanismo
de runtime durante a traduo pelo JSP. Para que.\ voc entenda
como esse mecanismo usa isso, na hora da execuo, o runtime
traduz o arquivo JSP em um Servlet (isso voc j sabe), primeiro
carregando o TLD para cada uma das bibliotecas de tags associadas com a pgina. Em seguida, analisa e preenche algumas c1as-

Entendendo Custom Tags Il

327

ses auxiliares com as informaes contidas dentro do arquivo e,


finalmente, quando o runtime encontra uma tag personalizada no
JSP, ele consulta os dados armazenados nessas classes auxiliares,
validando a sintaxe da tag e criando stubs Java para as tags.
Como voc pode ver, criar o arquivo TLD de suma importncia e fica
evidente que sem esse descritor, sua pgina JSP jamais conseguir trabalhar com a tag personalizada.
TrabComTaglib.tld

<?xrnl version=" 1. O" encoding=" 1S0-8859-1"?>


<taglib xrnlns="http://java.sun.com/xrnl/ns/javaee"
xrnlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xrnl/ns/javaee/webjsptaglibrary_2_1.xsd"
version=H2.1">
<description>
Tag library
</description>
<jsp-version>2.1</jsp-version>
<tlib-version>1.0</tlib-version>
<shortname></shortname>
<uri>inputTags</uri>)

<tag>
<name>inputTag</name>~
<tagclass>meupacote.InputTag</tagclass>~

<bodycontent>empty</bodycontent>)
<attribute>
<name>type</name>
<required>true</required>
</attribute>
<attribute>

328

[liilJ

Desenvolvendo Aplicaes Web com JSP...

<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>value</name>
<required>false</required>
</attribute>
<attribute>
<name>size</name>
<required>false</required>
</attribute>
<attribute>
<name>id</name>
<required>false</required>
</attribute>
<attribute>
<name>maxLength</name>
<required>false</required>
</attribute>
</tag>
</ taglib>

Embora algumas coisas j tenham sido ditas, no Captulo 9, no custa


novamente reforar. O elemento <uri I> O o mapeamento necessrio
para ter acessibilidade na chamada da taglib pela sua pgina JSP.
O elemento <name 1>0, no menos importante, tem o nome da tag
personalizada que voc criou. O elemento <tagclass 1>6) a indicao de
onde se encontra a classe da biblioteca de tags.
Usando o elemento <bodycontent 1>0, voc diz ao runtime JSP que
a sua tag personalizada no contm um corpo.
Um novo item visto agora se trata dos elementos que compem a sua
tag personalizada, o elemento <attribute I>, uma vez que voc deve definir aqui o nome do atributo e quais sero considerados obrigatrios. Observando sua classe, a tag que voc est criando tem os atributos type e name

Entendendo Custom Tags l\l

329

como obrigatrios, elemento <required /> (recendo sempre true se for


obrigatrio ou do contrrio, false), e os demais opcionais. Digo isso porque
existem nos demais uma condio if definindo se o retomo do valor dado
ao atributo diferente de null. Caso seja diferente de null, a sua classe de
retoma o trecho da tag que no obrigatrio, como por exemplo value. O
atributo value no obrigatrio porque caixa de entrada de texto em HTML
no precisam na maioria dos casos de um valor pr-definido. J o type e o
name so essenciais, uma vez onde voc precisa dizer ao browser que receber o HTML compilado pela pgina JSP e o tipo de tag no qual est
querendo que ele exiba, assim como seu nome, possibilitando assim fazer
com que essa pgina tenha um formulrio til at mesmo no envio dos
dados por esses campos criados .

Referenciando uma Biblioteca de Tags em uma


Pgina JSP
Voc j sabe que uma pgina JSP deve permitir que o runtime saiba que biblioteca de tags ele estar usando. Mas voc ser detalhado de como isso feito.
Os arquivos JSP usam uma diretiva, j comentada em captulo anterior, chamada de <@ taglib /> para indicar que biblioteca de tags eles pretendem usar. A sintaxe para reforar a memria :
<%@ taglib uri= " referenda da uri nica

da biblioteca "

prefix= "prefixo-personalizado" %>

A diretiva taglib serve aos seguintes objetivos:


1. Declarar que o arquivo JSP usa uma biblioteca de tags especificada;
2. Identificar o TLD para que essa biblioteca de tags, referenciando
um URI nico (o uri pode apontar para o TLD diretamente ou
para uma seo da biblioteca de tags em web.xml- como no exemplo do captulo anterior a esse - que a referencia);
3. Designar um prefixo para todas as tags que faro parte da biblioteca. Isso fornece um espao identificador para suas tags . Mas no
se preocupe se voc tiver na sua biblioteca o mesmo nome de uma
tag que existe em uma outra biblioteca.

330 lI Desenvolvendo Aplicaes Web com JSP...

Chamando a Tag Personalizada na Pgina JSP


A pgina JSP a seguir simples, como a maioria dos exemplos dados neste livro. Isso facilita o entendimento do assunto, por mais complexo que ele o seja.
index.jsp
<%@ page language="java" contentType="text/html"
pageEncoding="ISO-8859-1"%>
<~o@

taglib uri=" /WEB- INF /tld/TrabComTaglib. tld \\

prefix="t" %>0
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional // EN"

''http://www.w3.org / TR/

xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Trabalhando com Taglibs</title>
</head>
<body>
<forro action="index.jsp" method="post" >
Usurio: <t:inputTag name="usuario" type="text" />$<br />
Senha: <t:inputTag name="senha" type="password" /> <br / >
<t:inputTag name="btEnviar" type="submit" value="Enviar" />
</forro>
</body>
</html>

o
e

Note a chamada da taglib onde a uri, que novamente venho a


afirmar, deve ser nica. O prefixo dado por voc, e embora existam certos prefixos que so reservados, uma letra qualquer o ajuda a escolher o melhor prefixo, no caso foi escolhido "t" de TAG.
Depois de chamada a sua biblioteca de tag, a sua utilizao se faz
de maneira bem simples. Voc comea com o prefixo, seguido de
dois pontos e o nome da tag que ir empregar, no caso inputTag.
Os atributos dados como obrigatrios so name e type. A ltima

Entendendo Custom Tags [)J

331

tag criada, o boto de enviar, voc adicionou um atributo a mais,


chamado value, que no caso no obrigatrio.

o resultado desse trabalho voc pode ver na imagem a seguir:


" Trbalhando com Tagltbs X

~ c;> li ~C:,

Usurio:

Ihttp://focalhost:8080lTrabComBib~otecaDeTaos/index.lsp

IVJI

F ====::::::;--l

Senha: I
I Enviar I

Figura 18.1

Com uma pequena modificao no seu cdigo, na pgina JSP, voc


consegue outros elementos mais, veja:
index.jsp
<%@ page language="java" contentType="text/html"
pageEncoding="ISO-8859-l"%>
<%@ taglib uri=H/WEB-INF/tld/TrabComTaglib.tld" prefix="t" %>
<!DOCTYPE html PUBLIC
"-/ / W3C//DTD XHTML 1.0 Transitional//EN"

''http:/ / www.w3.org/TR/

xhtmll / DTD/ xhtmll-transitional . dtd">


<html xmlns=''http:/ / www.w3.org/1999/xhtml''>
<head>
<title>Trabalhando com Taglibs< / title>
</head>
<body>
<forro action=Hindex.jsp" method=Hpost" >
Nome: <t:inputTag name="nome" type="text" size="25" / ><br />
e-mail: <t:inputTag name="email " type="text" size="25" /><br />
sexo: <t:inputTag name="sexo" type="radio" value="m"/>Masculino

332 l'iI Desenvolvendo Aplicaes Web com JSP...


<t:inputTag name="sexo" type="radio" value="f"/>Feminino
<br />
Tipo de msicas:<br />
<t:inputTag name="pop" type="checkbox" value="pop"/>POP <br />
<t:inputTag name=Hrock" type="checkbox" value="popH/>Rock <br />
<t:inputTag name=Hdance" type="checkbox" value="pop"/>Dance <br />
<br />
<t:inputTag name="btEnviar" type="submit" value="Enviar" />
<t:inputTag name="btLimpar" type="reset" value="Limpar" />
</form>
</body>
</html>

Criando Algo mais Dinmico


Est bem, voc achou interessante trabalhar com tags personalizadas mas
gostaria de fazer algo mais dinmico, como um loop que se repetisse de
acordo com um certo nmero de vezes passadas. Tudo bem, vamos fazer
algo desse tipo.
Primeiramente voc ir criar uma nova tag, essa tag ir criar um loop,
como o while:
LoopTag . j ava
package meupacote;
import javax . servlet.jsp.*;
import javax . servlet . jsp.tagext.*;
import java . io.*;
public class LoopTag extends BodyTagSupport {(t
private int contar;
public void setContar(String cont)

{~

Entendendo Custam Tags

riI 333

try {
contar

= Integer.parselnt(cont);

} catch(NurnberFormatException nfe)
contar

= 1;

pub1ic int doAfterBody( )

{~

if (contar- >= 1) {
BodyContent bodyC

try {
JspWriter out

= getBodyContent(

);.,

bodyC.getEnclosingWriter(

out.println(bodyC.getString(
bodyC.clearBody(

);~

));~

);~

} catch(IOException ioe)
Systern.out.println("Erro: " + ioe.getMessage( ));
return(EVAL_BODY_AGAIN);
} else {
return(SKIP_BODY);

Para trabalhar com uma tag de repetio, como a feita, voc precisa
primeiro saber de qual classe herdar certas funcionalidades. A tag feita
uma simples interao com condio de repeties, onde o usurio pode
colocar em seu corpo o objeto HTML ou um outro que deseja repetir e
dizer quantas vezes deseja repetir.
O As tags que processam o corpo contendo mltiplos pontos devem
comear estendendo BodyTagSupport.
f9 O mtodo pblico setContar(String cont) determinar a quantidade de vezes que sua tag ir iterar na pgina JSP. Voc dir a tag
para repetir cinco vezes e assim ela o far.

334

~ Desenvolvendo Aplicaes Web com JSP...

6) O mtodo doAfterBody() controla a iterao com seus cdigos


de retorno, onde, para continuar a iterao, esse mtodo retoma
um valor de IterationTag.EVAL_BODY_AGAIN. Para interromper a iterao, o mtodo doAfterBody( ) retoma um valor
BodyTag.SKIP_BODY. Esse mtodo tambm onde voc reexporta o valor iterado (valor atual da propriedade no qual voc est
iterando) e escreve o resultado da iterao atual na resposta.
O O mtodo getBodyContent() recupera o corpo da tag processada atr:..vs de seu objeto BodyContent, desde que o processador
de tags estenda BodyTagSupport.
O mtodo getEnclosingWriter(), no objeto BodyContent, retoma
um JspWriter que usado por para escrever de volta para o usurio. Repare que isso diferente do mtodo pagContext.getOut( )
que j fora usado anteriormente em uma tag mais simples.
CD Chamar o mtodo getString( ), no objeto BodyContent, faz com
que um tag retorne Strings contendo o corpo processado da tag.
Essas Strings so impressas ao usurio chamando o mtodo
println() do objeto JspWriter .
8 O contedo do objeto BodyContent pode ser limpo chamando o
mtodo clearBody() .

Criando o Descritor da sua Tag Personalizada


Para que essa tag possa ser utilizada, voc ir criar o descritor a seguir:
LoopTag.tld

<?xrnl version="1.0" encoding="ISO-8859-1"?>


<taglib xrnlns="http://java.sun.com/xrnl/ns/javaee"
xrnlns:xsi="http://www.w3.org/2001/XMLScherna-instance"
xsi:schernaLocation="http://java.sun.com/xrnl/ns/javaee/webjsptaglibrary_2_1.xsd"
version="2.1">
<description>
Tag library
</description>

Entendendo Custam Tags l\l

335

<jsp-version>2.1< / jsp-version>
<tlib-version>1.0< / tlib-versi on>
<shortname>< / shortname>
<uri>LoopTag< / uri>
<tag>
<name>loop< / name>
<tagclass>meupacote.LoopTag< / tagclass>
<bodycontent>JSP</bodycontent>ct
<attribute>
<name>contar< / name>
<required>true< / required>
<rtexprvalue>true</rtexprvalue>$
</ attribute>
</ tag>
</ taglib>

O elemento <bodycontent I> especifica como a tag usa seu corpo. O ambiente JSP usar esse valor para entender como a tag
quer que o runtime do JSP trate seu corpo. Os valores que um
elemento <bodycontent I> pode ter so:
~ empty - denota que a tag deve ter um corpo vazio;
~ JSP - denota que um corpo inclui contedo JSP;
~ tagdependent - denota que o corpo inclui contedo que a tag
deve interpretar.
Se esse elemento no estiver, o valor padro assumido JSP, o que
demonstra claramente que ele no obrigatrio.
O elemento <attribute I> se difere dos demais por dizer o nome de
uma atributo <name I> e se o atributo pode ou no ser obrigatrio em seu
uso, e isso voc j viu, na utilizao do elemento <required I>. Mas um
novo elemento surge nesse cenrio, o chamado <rtexprvalue 1>8, que
especifica se o atributo pode aceitar valores extrados de uma expresso
em tempo de execuo. Esse atributo pode aceitar valores true, false, yes
ou no. Se no estiver disponvel, o padro false.

336 l\I Desenvolvendo Aplicaes Web com JSP...

Utilizando sua Tag LoopTag


Depois de configurada a sua nova tag de iterao, falta somente voc criar
um documento e acrescent-la para ver seu comportamento.
<%@ page language="j ava" contentType="text/html "
pageEncoding="ISQ-8859-1"%>
<%@ taglib uri =" /WEB-INF/tld/LoopTag.tld" prefix="t" %>
< ! DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1 . 0 Transitional//EN" ''http://www.w3.org/TR/
xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=''http://www.w3 .org/1999/xhtml ">
<head>
<tit l e>Traba l hando com Taglibs</ tit le>
</head>
<body>
<t : loop contar="S" >0

<h3>Repetindo cinco vezes</h3>


</t:loop>

</body>
</html>

A sua utilizao uma das coisas mais simples de entender, uma


vez que voc teve toda uma explicao ao longo do desenvolvimento de como essa tag trabalharia. Ao chamar sua tag personalizada, no parmetro contar voc determina a quantidade de vezes que deseja repassar o loop.
j'J T,ab~o com Taglbs X

Repetindo
Repetindo
Repetindo
Repetindo

cinco vezes
cinco vezes
cinco vezes
cinco vezes

Repetindo cinco vezes

Figura 18.2

Entendendo Custom Tags ll

337

Criando Ta9s Condicionais


Dessa vez voc criar tags condicionais como IF/THEN/ELSE. Essas tags
trabalham verificando se o valor condicional retoma true ou false . Embora
existam mais entre essas condicionais, ser abordado apenas o bsico.

A TAG IF
A tag a seguir desenvolvida ser o IF, como conhecemos nas linguagens de
programao. Essa tag envolver as demais, onde ter um corpo que representa o IF em si e no sua condio ou impresso do resultado obtido da
condio feita.
IfTag.java

package meupacote;
import javax.servlet.jsp.tagext.*;
public class IfTag extends TagSupport
private boolean condicao;
private boolean temCondicao = false;
public void setCondicao(boolean condicao)
this.condicao = condicao;
temCondicao = true;

public boolean getCondicao( ) {


return(condicao);

public void setTemCondicao(boolean flag) {


this.temCondicao

= flag;

338 lI Desenvolvendo Aplicaes Web com JSP...


public boolean temCondicao( ) (
return(temCondicao) ;

public int doStartTag( ) (


return(EVAL_BODY_INCLUDE);

A classe Iffag no tem segredo. Apenas recebe um valor de condio


e retoma esse valor, informando tambm atravs do mtodo ternCondicao( )
se existe ou no uma condio .

A Tag de Condio do IF
Como uma tag condicional muito complexa, voc ter que criar tambm
uma classe que verifique a condio.
IfCondTag.java

package meupacote;
import javax.servlet.jsp . *;
import javax . servlet.jsp.tagext.*;
public class IfCondTag extends BodyTagSupport
public int doStartTag( ) throws JspTagException
IfTag ifTag =
(IfTag)findAncestorWithClass(this, IfTag.class);(t
if (ifTag == null) (
throw new JspTagException("no contm uma condio em if");
return(EVAL_BODY_AGAIN);
}

public int doAfterBody( ) {

Entendendo Custom Tags [)jIJ

339

IfTag ifTag =
(IfTag)findAncestorWithClass(this, IfTag.class);
String bodyString = getBodyContent( ) .getString( );
if (bodyString.trim( ).equals("true"))
ifTag. setCondicao (true) ;
} else {
ifTag.setCondicao(false);
return(SKIP_BODY);
}
}

Quando certa tag est contida no corpo de uma outra tag, a tag
que contem a outra o pai da tag contida (como no exemplo o
IITag). O processo de atravessar uma classe especfica j
implementado por findAncestorWithClass( ) na classe
TagSupport. Esse mtodo recebe dois parmetros; onde um
referencia a tag a partir do qual deve ser iniciada a busca (em
muitos casos this) e o outro parmetro uma classe representando o processamento de tags que estamos procurando. Para que
voc entenda bem, a classe ItTag contm a capacidade de capturar uma condio e de retomar essa condio, assim como saber
se h ou no uma condio. Se IITag for um valor null, uma
exceo disparada. Caso no seja, o mtodo doAfterBody( )
assume o trabalho e verifica se existem um contedo condicional
true, como string. Se for, envia o valor booleano true para o
mtodo encontrado dentro da classe Iffag chamado de
setCondicao(boolean b). Do contrrio retoma o valor booleano
false para o mesmo mtodo da classe ItTag.

o RESULTADO Aps A CONDiO


A tag criada agora, tambm dependente de IITag, ser o resultado a ser
exibido ao usurio caso a condio seja true.

340

[\] Desenvolvendo Aplicaes Web com JSP...

IfThenTag . j ava

package meupacote;
import javax . servlet.jsp . *;
import javax.servlet . jsp . tagext.*;
import java.io.*i
public class IfThenTag extends BodyTagSupport {
public int doStartTag( } throws JspTagException
IfTag ifTag =
(IfTag) findAncestorWithClass(this, IfTag.class) ; (
if (ifTag == null) {
throw new JspTagException("no contm uma condio em if"};
} else if (!ifTag . temCondicao( )} {
throw new JspTagException("a condio deve vir antes dessa tag"} ;
return(EVAL_BODY_AGAIN};
}

public int doAfterBody( } (


IfTag ifTag =
(IfTag) findAncestorWithClass(this, IfTag.class) ;
if (ifTag.getCondicao( )} {
try (
BodyContent body = getBodyContent( );~
JspWriter out = body.getEnc l osingWriter( };
out . print(body . getString(}} ;
} catch(IOException ioe} {
System . out . println("Erro: " + ioe . getMessage( }};
}

return(SKIP_BODY};

Entendendo Custom Tags

o
e

lI 341

Novamente findAncestorWithClass() chamado para que seja


acessvel a classe IITag.
o mtodo getBodyContent( ) recupera o corpo da tag processada atravs de seu objeto BodyContent, desde que o processador
de tags estenda BodyTagSupport, como ocorreu no exemplo criado para fazer uma repetio de valores. O mtodo
getEnclosingWriter( ), no objeto BodyContent, retoma um
JspWriter que usado por para escrever de volta para o usurio .
O mtodo getString() , no objeto BodyContent, faz com que um
tag retome Strings contendo o corpo processado da tag. Essas
Strings so impressas ao usurio chamando o mtodo print( ) do
objeto JspWriter.

o CASO ELSE
Bom, voc j deve ter percebido que construir tags personalizadas mais
complexas uma tarefa mais complicada e que merece uma srie de situaes que devem ser analisadas. Uma delas que, caso a condio do IF no
seja satisfatria, voc deve apresentar uma outra resposta ao usurio, e que
bem me lembro, isso feito pelo ELSE.
IfElseTag. java

package meupacote;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class IfElseTag extends BodyTagSupport
public int doStartTag( ) throws JspTagException
IfTag ifTag =
(IfTag)findAncestorWithClass(this, IfTag.class);
if (ifTag == null) (
throw new JspTagException("no contm uma condio em if");
} else if (!ifTag.temCondicao()) {

342 !liI Desenvolvendo Aplicaes Web com JSP...


throw new JspTagException("a condio deve vir antes dessa tag");

pub1ic int doAfterBody( ) {


IfTag ifTag =
(1fTag)findAncestorWithC1ass(this, 1fTag.c1ass);
if (!ifTag.getCondicao( )) {
try (
BodyContent body = getBodyContent( );
JspWriter out = body.getEnc1osingWriter( );
out.print(body.getString( ));
} catch(10Exception ioe) (
System.out.println("Erro: " + ioe.getMessage( });
}

return(SK1P_BODY) ;

Muito similar classe IffhenTag, s que a condio nesse caso, em


lfElseTag, no deve ser satisfatria. Se essa for situao, o resultado
dessa tag impresso .

Criando o TLD
Novamente voc ir criar um arquivo com a extenso tld e adicionar o
contedo mostrado a seguir:
TagsCondicionais.tld

<?xm1 version="1. O" encoding=n 1SO-8859-1"?>


<tag1ib xm1ns="http://java.sun.com/xm1/ns/javaee"
xm1ns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xm1/ns/javaee/web-

Entendendo Custom Tags

l\I 343

jsptaglibrarL2_1.xsd"
version="2.1">
<description>
Tag library
</description>
<jsp- version>2.1< / jsp-version>
<tlib-version>l.O< / tlib-version>
<shortname>< / shortname>
<uri>TagsCondicionais< / uri>
<tag>
<name>if</name>
<tagclass>meupacote.lfTag</tagclass>
<bodycontent>JSP< / bodycontent>
</ tag>
<tag>
<name>condicao</name>

<tagclass>meupacote . lfCondTag< / tagclass>


<bodycontent>JSP< / bodycontent>
</ tag>
<tag>
<name>then</name>

<tagclass>meupacote.lfThenTag< / tagclass>
<bodycont ent>JSP< / bodycontent>
</ tag>
<tag>
<name>else</name>

<tagclass>meupacote.lfElseTag< / tagclass>
<bodycontent>JSP< / bodycontent>
</ tag>
</ t aglib>

Como Utilizar as Tags IflThen/Else


Crie uma nova pgina JSP e adicione o cdigo mostrado a seguir:

344

[lil] Desenvolvendo Aplicaes Web com JSP...

usandolfThenElse.jsp

<%@ page language=Hjava H


contentType=Htext/html H
pageEncoding=HISO-8859-1"
%>
<%@ taglib uri=H I WEB-INF I tId/ TagsCondicionais. tId H prefix=H cond n %>
<!DOCTYPE html PUBLIC
H- I IW3C I I DTD XHTML 1. o Transitional ll ENH ''http: / /www.w3 .org / TR I

xhtmll / DTD / xhtmll-transitional.dtd H>


<html xmlns="http: //www.w3.org / 1999 / xhtml">
<head>
<title>Trabalhando com Taglibs</title>
</ head>
<body>
<cond: if>
<cond:condicao>false</cond:condicao>
<cond:then>O resultado verdadeiro</cond:then>
<cond:else>O resultado falso</cond:else>
</cond:if>

</ body>
</ html>

A utilizao das tags bem simples, pois voc adiciona a tag if e em


seguida adiciona a tag condicao, para que seja possvel passar o valor
booleano. O valor false , no exemplo, faz com que a tag else (o que seria o
bloco else em questo) trabalhasse .

Conhecendo SimpleTags
Construir biblioteca de tags customizadas com SimpleTags muito similar
ao desenvolvido com as tags "clssicas". Voc tem que criar o comportamento da tag, referenciar a classe em um descritor de tags (Tag Library
Descriptor ou TLD) e incluir o TLD em sua pgina JSP.

345

Entendendo Custom Tags

Mas a diferena entre desenvolver uma tag simples e uma tag clssica se
encontra no processo existente em um manipulador de tags baseado em Java.
Classes SimpleTag usa menos mtodos, interfaces diferentes com
contedo de corpo, e tem diferentes objetos implcitos avaliados. Esta seo cobre os princpios existentes por trs de SimpleTags e como elas reduzem a dificuldade de construir bibliotecas de tags.
UM SIMPLES EXEMPLO

exemplo a seguir mostrar um exemplo simples da utilizao com


SimpleTags:

UtilizandoSimpleTags.java
package meupacote;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class UtilizandoSimpleTags extends SimpleTagSupport
public void doTag( ) throws JspException, IOException~

(e)

getJspContext( ).getOut( ).write(~


"Utilizando SimpleTags ' "
) ;

A primeira coisa que voc tem que fazer para criar SimpleTags
estender sua classe a SimpleTagSupport O. No h nenhuma preocupao com SKIP_BODY, EVAL_BODY, EVAL_PAGE ou quaisquer outros
valores de retomo associado com tags clssicas. Ao invs disso, h um
mtodo doTag( )8, que encapsula a funcionalidade do que a tag ir executar. A sada gerada pela tag feita atravs do objeto JspContext8 . O mtodo getOut( ) no objeto JspContext retoma uma referncia para a instncia JspWriter no qual usado para renderizar a pgina JSP.

346 l'iI Desenvolvendo Aplicaes Web com JSP...

o ARQUIVO TLD
Para utilizar essa tag simples, basta criar o arquivo TLD como ocorre nas
tags clssicas, sendo assim, crie o arquivo a seguir:
UtilSimpleTags.tld

<?xml version="l.O" encoding="ISO-8859-1"?>


<taglib x.mlns=''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/webjsptaglibrary_2_1.xsd"
version="2.1">
<description>Utilizando SimpleTag</description>
<jsp-version>2.1</jsp-version>
<tlib-version>l.O</tlib-version>
<shortname></shortname>
<uri>UtilTagSimples</uri>
<tag>
<name>frase</name>
<tag-class>meupacote.UtilizandoSimpleTags</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

Como a configurao a mesma das tags simples, no haver comentrios sobre a mesma.
UTILIZANDO A TAG SIMPLES

Agora que est configurado, simples utilizar:


utilizandoSimpleTags.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"

Entendendo Custom Tags

I\l 347

%>
<%@ taglib uri="/WEB-INF/tld/UtilSimpleTags.tld" prefix="ust" %>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN" ''http://www.w3.org/TR/
xhtmll/DTD/xhtmll-transitional.dtd">
<html xrnlns="http://www.w3.org/1999/xhtml">
<head>
<title>Trabalhando com SimpleTags</title>
</head>
<body>
<ust:frase/>

</body>
</html>

Tambm pela simplicidade e repetio da situao, no haver explicao .

Um Ta9 Simples mais Dinmica


A idia aqui mostrar o quanto mais simples ficou em relao ao desenvolvimento de tags clssicas na construo de uma tag que captura um valor e
o lmpnme:
SimpleTagDinamica.java

package meupacote;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class SimpleTagDinarnica extends SimpleTagSupport {
String nome = "";
public void setNome( String nome)

348

Desenvolvendo Apl icaes Web com JSP.. .


this. nome

nome;

public void doTag( ) throws JspException, IOException


getJspContext( ) .getOut( ) .write{ nome );

Essa tag tem um mtodo simples chamado setNome( String nome)


que recebe uma String como valor e depois impresso na tela.
O arquivo TLD a seguir configura essa tag:
SimpleTagDinamica.tld
<?xrnl version="l.O" encoding="ISO-8859 - 1"?>
<taglib xrnlns=''http://java.sun.com/xrnl/ns/javaee''
xrnlns :xsi=''http://www.w3.org/2001/XMLSchema-instance''
xsi:schemaLocation=''http: // java.sun . com/xrnl/ns/javaee/webjsptaglibrary-2_1 . xsd"
version="2.1">
<description>Utilizando SimpleTag Dinarnica</description>
<jsp-version>2.1< / jsp-version>
<tlib-version>l.O </ tlib-version>
<shortnarne></shortnarne>
<uri>www.integrator.com.br/simpletags/dinamica</uri>4)
<tag>
<narne>nome< / narne>
<tag-class>meupacote . SimpleTagDinarnica</tag-class>
<body-content>empty</body-content>
<attribute>
<name>nome</name>
<required>true</required>
<rtexprvalue>true< /rtexprvalue>
</attribute>
</tag>
</taglib>

Entendendo Custom Tags i1il 349

Observe a configurao do elemento <uri />0 , que contem um endereo web.


simpleTagDinamica.jsp
<%@ page language="java"
contentType="text/html"
pageEncoding=" ISO-8859-1"
%>
<%@ t aglib
uri= ..www.integrator.com.br/simpletags/dinamica..
prefix="s"
%>
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4 . 01 Transitional//EN" ''http://www . w3 . org/TR/
ht m14 / 1oose.dt d">
<html>
<head>
<t itle>Simpl eTag Dinmica</t i tle>
</head>
<body>
<s : nome nome="${param[ 'nome '] }" />
<f orro act i on="">
Nome: <input t ype=" t ext " name=" nome" />
<i nput t ype="submit" value= "Enviar ">
</ f orro>
</body>
</ html>

Com o atributo uri da diretiva taglib voc chama o URI configurado


no arquivo TLD. O restante similar ao j desenvolvido at o momento .

Criando e Utilizando Tag Files


Voc sabe, por experincia nesse captulo, que criar tags em JSP no
simples se o desenvolvedor estiver usando o que chamamos de tags clssicas.

350 llI

Desenvolvendo Aplicaes Web com JSP...

Mas na verdade, a partir da verso 2.0 das especificaes JSP, o desenvolvimento de tags personalizadas se tomou bem mais simples. O que voc
ser apresentado aqui como criar tags simples.
O seu primeiro exemplo ser similar ao mostrado no Captulo 9. Similar apenas no texto que ser impresso na tela, claro.
O primeiro passo criar um diretrio chamado tags dentro de WEBINF. Nesse diretrio, voc criar um arquivo com a extenso .tag que conter o contedo mostrado a seguir:
frase.tag
%@tag body-content=" empty"%
Desenvolvendo com taglib

Depois de criar esse simples contedo, agora voc ir criar uma pgina JSP que chamar essa tag. Isso mesmo, voc no est vendo "coisas",
isso uma tag.
utilizandoTaglib.jsp
<%@ page language="java"
contentType=Htext/html"
pageEncoding="ISO-8859-1"
%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="jsps" %>0
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" ''http://www.w3.org/TR/
html4/loose.dtd">
<html>
<head>
<title>Trabalhando com Custom Tags</title>
</head>
<body>
<h3>< jsps:frase
</body>
</html>

/></h3>~

Entendendo Custom Tags [\.J

351

Antes de mais nada, quero que perceba a diferena do j visto em


captulo anterior. Quando voc chamar o diretiva taglib, ao em vez de utilizar o atributo uri, voc utilizou simplesmente o atributo tagdir 0 , apontando assim para o diretrio onde contm a sua tag customizada. O atributo
prefix continua existindo. Para utilizar o contedo existente nessa tag personalizada, o mesmo procedimento feito em caso anterior foi mantido aqui,
basta chamar o prefixo seguindo de dois-pontos e o nome dado a tag
customizada quando salvo, ou seja, o nome do arquivo sem a extenso .tag.
A pergunta que com certeza voc deve estar se fazendo : eu posso
criar tags avanadas com isso? A resposta : SIM. Vejamos exemplos mais
complexos a seguir.
CRIANDO UM INPUTTAG

Voc ir criar tags do tipo input e com a tag <label /> em conjunto. Para
isso crie o arquivo mostrado a seguir:
inputag.tag
<%@tag pageEncoding="ISO-8859-1" body-content="empty"%>

<'Y"@attribute name="rotulo" required="true" %>


<%@attribute name="nome" required="true" %>
<%@attribute name="tipo" required="true" %>
<label for="${nome} ">${rotulo} </label>
<input type="${tipo}" name="${nome}" id="${nome}" I>

Como voc vai passar atributos, a diretiva aUribute usada. O atributo name determina o nome dos atributos da sua tag. Se voc quiser que
seja obrigatrio o seu uso, basta adicionar o atributo required com o valor
true.
UTI'.IZANDO A TAG INPUTAG

Para usar, basta adicionar na sua pgina como mostrado a seguir:

... _ ._ L _"

_.

~.~

.~.L_

.......

~~

_ .. _ ---"

_ _

352 l'iI

Desenvolvendo Aplicaes Web com JSP...

utilizandoTagFiles . jsp

<%@ page language="java"


contentType="text / html"
pageEncoding="ISO-8859-1"
%>
<%@ taglib tagdir=" / WEB-INF / tags " prefix="t" %>
<!DOCTYPE html PUBLIC
"- //W3C // DTD HTML 4.01 Transitional // EN" ''http:/ / www.w3 . org / TR /
htm14 / 1oose.dtd">
<html>
<head>
<title>Trabalhando com Custom Tags< / title>
</ head>
<body>
<form>
<t:inputag nome="nome" rotulo=INome:" tipo="text" />
<br />
<t:inputag nome="senha" rotulo=ISenha:" tipo="password" I>

</form>
</ body>
</ html>

Pela simplicidade de seu desenvolvimento, no h necessidade de


explicao .

Criando uma Tag Files Mais Dinmica


evidente que somente as tags geradas no so o suficiente para lhe garantir mil e uma possibilidades. O que na verdade voc deve estar se perguntando : como eu crio situaes dinmicas com condies e loops?
A resposta : utilizando JSTL. Isso mesmo, voc pode utilizar uma
terceira biblioteca para adicionar novas funcionalidades a sua e toma-la
mais dinmica. Veja um caso:

Entendendo Custom Tags

353

tagdinamica.tag

<%@tag pageEncoding="ISO-8859-1" body-content="empty"%>


<'Yo@

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

<%@attribute name="opcoes" required="true" %>


<%@attribu te name="delimitadores" required="true" %>
<%@at tribute name="nome" required="true" %>
<%@attribute name="tamanho" %>
<%@attribute name="multiplo" %>
<c:if test="${tamanho != null}">
<c:set var="size" value="size='${tamanho}'" I>
</c:if>
<c:if test="${multiplo == true}">
<c:set var="multiple" value="multiple='multiple'" I>
</c:if>

<select name="${nome} " ${size} ${multiple}>


<c:forTokens items="${opcoes}" var="item"
delims="${delimitadores}">
<option value=" ${item} ">${item}<loption>
</c:forTokens>
</se l ec t >

o interessante dessa tag est na utilizao do JSTL, da biblioteca Core.


Perceba que existem diversos atributos requeridos e dois que no so. Esses dois atributos no obrigatrios so a situao do qual, com valor surge
uma situao. Por essa razo a action <c:if /> foi usada. Caso exista um ou
os dois atributos no obrigatrios, cada um com uma situao, portanto
uma condio, uma varivel criada. Caso no seja criada a varivel 9
valor resultante vazio .
Como a tag a <select /> do HTML, essa tag contm tambm opes.
As opes so criadas pela tag <option /> do HTML. Para gerar todas as
tags <option /> do exemplo, um loop feito com a action do JSTL chamada <c:forTokens I>, no qual interage sobre Strings separados por um determinado delimitador, quebrando-os . A idia passar os valores pelo atribu- '
to opcoes da tag que voc est criando e os separar por um delimitador,
tambm configurvel, atravs do atributo delimitadores.

354 l\I Desenvolvendo Aplicaes Web com JSP...

Colocando em Ao a Tag
Para voc visualizar a tag criada em ao, crie a pgina JSP a seguir:
tagFilesDinamica.jsp
<%@ page language="java"
contentType=ntext/html"
pageEncoding="ISO-8859-1"
%>
<%@ taglib tagdir=n/WEB-INF/tags n prefix="t" %>
<!DOCTYPE html PUBLIC
H-//W3C//DTD HTML 4.01 Transitional//EN n ''http://www.w3.org/TR/
htm14/1oose.dtd">
<html>
<head>
<title>Trabalhando com Custom Tags</title>
</head>
<body>
<form>
<t: tagdinamica nome="estados"
opcoes="SP, RJ, MG, PR, RS"
delimitadores=" ,"
tamanho="3"
multiplo="true" />
</form>
</body>
</html>

Note os atributos da tag. Com o atributo opcoes foram passados as


opes que a tag <select /> ter, separados por espao e vrgula. Portanto
no atributo delimitadores os valores so um espao e uma vrgula .

Empacotando e Distribuindo suas Tags


Evidentemente, aps a criao de suas tags personalizadas, voc vai querer
empacot-las e distribu-las livremente. Mas como fazer?

Entendendo Custom Tags lll 355

Empacotar tags significa colocar as classes de implementao junto


com o descritor de biblioteca em um arquivo .jar seguindo uma conveno
que ainda lhe instrui a:
~ Colocar seus arquivos de classes de tag dentro do arquivo .jar enquanto mantm sua estrutura de pacote.
~ Colocar seu TLD no arquivo .jar em um diretrio chamado METAINF .

Configurando
Para ilustrar, nada melhor que usar o que voc j fez e empacotar tudo . Para
empacotar as tags, faamos a seguinte estrutura do arquivo .jar, como mostra a Figura a seguir:
8\ META-INF
BC;:; tags
: . ~ frase.tag
: ;. ~ nputag. tag
: ;,. @l tagdnamca.tag
:... [Rl LoopTag.tld

:. [RJ

OutrasTags.tld
SimpleTagDinamlca.tld
.. [Rl TagsCondicionais.tld
i.. [Rl TrabComTaglib.tld
; . ~ UtilSimpleTags.tld
8 c;:; meupacote
. Q IfCondTag.class

!.... [Rl

.Q IfElseTag. class
.Q

IfTag.class

. Q IfThenTag.class
Q
Q

Q
Q

InputTag.class
LoopTag.class
SimpleTagDinamica.class
UtilzandoSimpleTags.class

Figura 18.3

Um diretrio META-INF ser criado. Ao lado desse diretrio um


outro chamado meupacote com todas as classes criadas. O diretrio METAINF conter todos os arquivos com extenso .tld criados. Dentro de cada
TLD ter um URI diferente, de preferncia. Por exemplo, o TLD
LoopTag.tld ter o seguinte elemento <uri I>:

356 lll Desenvolvendo Aplicaes Web com JSP...


<uri>http : //www.integrator.cam.br/loop</uri>

Faa os demais como desejar.


A URI um identificador nico para a bibli oteca de tags
- e no precisa representar um recurso vlido da
Internet.

Para a utilizao das Tag Files, primeiro voc dever criar um diretrio
tags dentro de META-INF e l colocar todos os arquivos de extenso .tag.
Depois precisar configurar as tags em um arquivo .tld dentro do
diretrio META-INF:
OutrasTags . tld
<?xm1 version=" 1. 0" encoding="ISO-8859 - 1"?>
<taglib xm1ns="http://java.sun . com/xm1/ns/javaee"
xm1ns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/webjsptaglibrary_2_1.xsd"
version="2.1">
<description>
Tag library
</description>
<jsp-version>2.1</jsp-version>
<t1ib- version>1.0</t1ib-version>
<shortname></shortname>
<uri>http://www.integrator.com.br/outras</uri>
<tag-file>
<name>fase</name>
<path>/META-INF/tags/frase.tag</path>
</tag-file>
<tag-fi1e>
<name>inputag</name>

Entendendo Custom Tags !lI 357


<path>/META-INF / tags / inputag.tag</path>
</ tag-file>
<tag-file>
<name>tagdinamica< / name>
<path> / META-INF / tags / tagdinamica.tag< / path>
</ tag-file>
</ taglib>

Nesse arquivo TLD voc fez uso de um elemento chamado <tag-fiIe /


>, um sub-elemento de <taglib/>, que contm os elementos <name /> como
sendo o nome da tag e o elemento <path I>, contendo o caminho da tag.
Uma obrigao encontrada em verses anteriores das
especificaes atuais do JSP que o arquivo TLD deveria se
chamar taglib.tld. Este requerimento est ultrapassado . O fato
que, atualmente, voc pode ter mais de um arquivo TLD em
um diretrio META-INF para distribuir mais de uma biblioteca
de tags em um mesmo arquivo JAR .

Empacotando
Para empacotar, no necessrio prtica, nem to pouco habilidade, tudo
que necessrio ter essa estrutura como mostrado na imagem anterior e ir
ao terminal, ou prompt de comando, e fazer o comando a seguir:
jar cfv tagscustamizadas.jar *

Veja a Figura 18.4 do prompt de como ser na sua tela:

358
"

[lilJ Desenvolvendo Aplicaes Web com JSP...

lia

Prompt de comando

:'Documents and Settings'Edson'meuprimeiroworkspace'tagslibs)jar cfu tagscustom.

zadas .j a l'" *

dde d ",a nifes t


ignoring entry HETA - IHP/
dding: HETA- HP/LoopTag.tld(in - 709) (out - 370)(deflated 47%)
dding: HETA - IHP/Outras Tags .tld(in - 734) (out - 340)(deflated 53%)
dding: HETA- IHP/Si",pleTagDinamica . tld(in - 714) (out - 369)(deflated 48 %)
dding: HETA- IHP/tags/(in 0) (out - 0)(stored 0%)
dding: HETA- IHP/tags / Erase.tag(in - 55) (out - 56)(deflated -1%)
dding : HETA- IHP/tags/inputag.tag(in - 289) (out - 165)(deflated 42%)
dding : HETA - IHP/tags/tagdina",ica.tag(in - 707) (out - 331)(deflated 53%)
dding : HETA- IHP/TagsCondicionais . tld(in - 920) (out - 363)(deflated 60x)
dding: HETA-IHP/TrabCo",Taglib . tld(in - 1244) (out - 412)(deflated 66%)
dding: HETA - IHP/UtilS i mpleTags.tld(in - 587) (out - 321)(deflated 45%)
dding: meupacote/(in - 0) (out - 0)(stored 0x)
dding: ",eupacote/lfCondTag.class(in - 1195) (out - 683)(deflated 42%)
dding: ",eupacote/ lfElseTag.class ( in - 1732) (out - 942)(deflated 45x)
dding: meupacote/lfTag.class(in - 782) (out - 418)(deflated 46x )
dding: ",eupacote/lfThenTag . class(in - 1732) (out - 943)(deElated 45%)
dding: neupacote/lnputTag.class(in - 2952) (out - 1294)(deflated 56x)
dding: meupacote/LoopTag.class(in - 1548) (out - 837)(deflated 45%)
dding: meupacote/Si",pleTagDinamica.clas s(in - 865) (out - 476)(deflated 44%)
dding: meupacote/UtilizandoSimpleTags.class(in - 756) (out - 423)(deElated 44%)

Figura 18.4

Um arquivo chamado de tagscustomizadas.jar criado no diretrio


onde voc se encontra no prompt ou terminal.

A Sun Microsystems criou um pacote de arquivos que os compacta em um s arquivo, com extenso .jar.
JAR a sigla para Java ARchive e um formato compactado,
baseado no mesmo formato de compactao de arquivos ZIP,
para distribuir aplicaes, ou bibliotecas, atravs de um s arquivo.
Em um arquivo JAR podem-se incluir quaisquer tipos de arquivos como: classes, imagens, configuraes, entre outros.
O formato foi criado na verso 1.1 do JDK e muito aperfeioado
na 1.2 sinalizando sua aceitao. Hoje em dia essencialmente
usado. A prpria API do Java distribuda em arquivos JAR.
A especificao do formato JAR define como obrigatrio apenas
existncia do arquivo de manifesto em um diretrio chamado META-INF.

Entendendo Custom Tags [il] 359

Usando sua Biblioteca de Ta9s


Depois de empacot-las, voc pode utilizar em um projeto. Para fazer isso,
adicione o arquivo criado, tagscustomizadas.jar no diretrio lib em WEBINF.
Em uma pgina JSP, basta depois adicionar a diretiva taglib, por exemplo:
<%@

taglib uri="http://www.integrator.com.br/loop" prefix="t" %>

Prefixos Reservados
Ao longo do desenvolvimento de suas tags personalizadas, voc precisou
cham-las para a sua pgina JSP sempre usando a diretiva taglib e nomeando nesse caso sempre um prefixo, no atributo prefixo O que ainda no
havia sido dito que existem prefixos que so reservados e sua utilizao
no recomendada. A seguir voc tem os nomes j reservados e que portando, devem ser evitados:
~ jsp
~ servlet
~ ]SPX
~ sun
~ sunw

O JavaBeans e as Ta9s Personalizadas


Agora que j entende como funciona os JavaBeans e as tags personalizadas, voc precisa saber quando usar tags personalizadas e quando usar
JavaBeans para empacotar alguma funcionalidade reutilizvel. Afinal de
contas, JavaBeans so componentes reutilizveis e a especificao JSP prev
um mecanismo embutido para integrar e utilizar as caractersticas dos
JavaBeans. Embora possam ser usadas ambas as tecnologias para alcanar
mesma meta de encapsular e abstrair dados para uma pgina JSP, h diferenas significantes entre os dois.
JavaBeans so bons objetos de propsito geral que podem encapsular
muito bem uma situao simples de uso global.

360 l'il

Desenvolvendo Aplicaes Web com JSP...

Voc continuar usando JavaBeans em exemplos porque fazem grandes objetos de negcio. Porm, as tags personalizadas so tecnologias Web
especficas. Essa tags personalizadas so usadas principalmente para elementos de gerao de apresentao, e como tal eles encapsulam principalmente comportamento. Alm disso, custom tags esto atentas ao ambiente
no qual esto rodando. Por exemplo, voc pode criar tags personalizadas
que tm acesso para os mesmos objetos implcitos disponveis nas pginas JSP em desenvolvimento: pageContext, request, response, session e
por ai vai . Porm, JavaBeans so componentes nos quais implicam em
reutilizar qualquer ambiente Java; conseqentemente, eles no sabem sobre tais particulares da JSP. Dessa forma, tags personalizadas so uma escolha muito melhor por encapsular funcionalidades reutilizveis no qual
ser usada pela pgina JSP. Lembre-se das seguintes regras antes de sair
desenvolvendo um ou outro:
Use JavaBeans por representar e armazenar informao e estado.
Um exemplo a construo de JavaBeans para representar os
objetos de negcios de sua aplicao.
Use custom tags para representar e implementar aes que ocorrem nesse JavaBeans, como uma lgica relacionada apresentao dessas informaes.

... ....
. .

Captulo

11
Envio de E-mail

NVIAR E-M AILS UMFATORCOMUMNO DIA-A-DIADE UMSITE. Principalmente


se esse si te for dinmico. Existem diversas razes para que seu site
envie e-mails ; pode ser por formulrios de contato, aviso de cadastro, alerta de um sistema administrativo e etc.
Evidentemente aprender a enviar e-mails essencial para a construo de aplicaes. Este captulo o introduzir no desenvolvimento de aplicaes que enviam e-mail utilizando Java .

Preparando o Ambiente
Para enviar e-mails, voc precisar de um servidor SMTP. Nesse caso existem duas opes: ou voc tem um ambiente servidor para testar ou cria um
ambiente servidor de envio de e-mails em sua prpria mquina. Como esse
livro tem o intuito de ensinar iniciantes, voc ser apresentado ento
instalao de um servidor de envio de e-mails gratuito .
O ambiente escolhido o Java Apache Mail Enterprise Server, ou
JAMES . O Apache James Mail Server um servidor SMTP, PPOP3 e NNTP
completamente escrito em Java. Em cima dessa possibilidade, voc tem
um ambiente totalmente portvel.
Para fazer download do Apache James Mail Server, voc deve ir ao
endereo http://james.apache.org/download.cgie baixar de um de seus
mirrors . A verso atual enquanto esse livro escrito 2.3.0.

362

[ijjlJ Desenvolvendo Aplicaes Web com JSP...

As opes para baix-lo so variadas, e voc seleciona a verso binria (Binary) com a compactao utilizada em seu sistema operacional. Por
isso, se voc estiver utilizando o Windows, baixe a verso .zip, que no caso
seria james-2.3.0.zip. No Linux seria james-2.3.0.tar.gz.

\ Apache ]ames 2.3.0 is the best available version


This release has many enhancements and bug fi xes over the previous
release . See the Change Log for a detailed list of changes. Some of the
earlier defec ts could turn a James mail server in to an Open Relay . Ali users
of James are urged to upgrade to James v2.3 .0 as soon as possible.

Binary (Unix TAR) : james-2.3.0.tar.g2 [PGP ]


Binary (ZIP Format) : james-2.3 .0.zip [PGP)
Source (Unix TAR) : james-2.3.0- src.tar.g2 [ PGP]
Source (ZIP Format) : james-2.3.0 - src .zip [PGP)
Source with Avalon Phoenix binaries (Unix TAR):
j ames - with - phoenx-2. 3 .O-src. tar .g2 [PGP]
Seurce with Avalen Pheenix binaries (ZIP Fermat) :
james-with-phoenix-2. 3 .O-src. zip [PGP]
Other Bnaries

Figura 19.1

Depois de baixado descompacte-o em um local de sua escolha.


A primeira coisa que voc dever fazer iniciar o servidor. Para fazlo, v ao local de sua instalao e execute o arquivo run.bat se for Windows
ou run.sh se for Linux.
Para ficar mais claro a situao, vou colocar uma situao. Digamos
que eu esteja usando o Windows e descompactei o arquivo em C:\james2.3.0.
Para rodar o arquivo run.bat, vou usar o prompt de comando.
CD\james-2.3.0\bin

Ao entrar no local indicado, digite run, como mostrado a seguir:


C: \ james -2 .3. 0\bin>run

Envio de E-mail

[1iil]

363

11iJE!

" Prompl de comando run


ic~o$oft Windows XP [ue~$o 5.1.2 00
<C> Copy~ight 1985-2001 Hic~osoft Co~p.
:'Docu~ent$

and

Setting$'Ed$on>CD'ja~e$-2.3.0'bin

:'ja~es-2.3.0'bin>~un

sing PHOEHIX-HOHE:
C:,ja~es-2.3.0
sing PHOEHIX_THPDIR: C:'ja~e$-2.3.0'te~p
sing JAUA-HOHE:
C:'Arquiuos de p~og~a~as'Jaua'jdk1.5.0_0?

a~es Hail Se~ue~ 2.3.0


e~ote Hanage~ Service sta~ted

OP3 Seruice sta~ted plain:110


HTP Seruice sta~ted plain:25
TP Seruice started plain:119
etchHail Disabled

plain:4555

Figura 19.2

Ao iniciar o James Mail Server, voc ter dentro do diretrio apps,


em sua estrutura, um diretrio chamado james.
Seguindo o mesmo exemplo dado, voc precisar configurar um arquivo chamado config.xml no diretrio apps/james/SAR-INF. Portanto no
Windows temos:
C:\james-2.3.0\apps\james\SAR-INF\config.xml

Por padro, o login e a senha encontrados no arquivo config.xml


root para usurio e root para senha. Portanto para mudar isso procure o
trecho mostrado a seguir:
<administrator_accounts>
<account login="root" password="integrator"l>
<administrator_accounts>

Para setar o e-mail para um servio particular, voc deve mudar a linha:
<servernarnes autodetect="true" autodetectIP="true">
<servernarne>localhost</servernarne>
<servernarne>integrator . com.br</servernarne>
</servernarnes>

364 l\I Desenvolvendo Aplicaes Web com JSP...


Para configurar o IP ou DNS server altere em:
<dnsserver>
<servers>
<server>192.168.1.200</server>
</servers>
<autodiscover>false</autodiscover>
<authoritative>false</authoritative>
</dnsserver>

Para acessar remotamente ou at mesmo localmente a ferramenta administrativa, digite:


telnet 127.0.0.1 4555
Onde voc ver:
JAMES Remote Administration Tool 2.3. O
Please enter your login and password
Login id:
root
Password:
integrator

Ao entrar voc ver:


Welcome root. HELP for a list of commands

Onde o comando help lista os comandos disponveis.


Se chamar a ajuda, voc ter os comandos, onde os principais so:

Envio de E-mail ~

365

Tabela 19.1
Comando

Descrio

help

Mostra a ajuda.

listusers

Mostra contas existentes.

countusers

Mostra o total de contas existentes.

adduser [usurio] [senha]

Adiciona um novo usurio

verify [usurio]

Verifica se um usurio existente.

deluser [usurio]

Deleta um usurio existente.

shutdown

Mata a corrente JVM (conveniente quando James


roda em daemon).

quit

Fecha a conexo.

Para adicionar usurios aos mailboxes, execute o comando:


adduser edson integrator

Para fechar a conexo com o telnet, execute o comando:


quit

Configurando para Envio de E-mail


Depois de preparado o ambiente, voc vai precisar de duas bibliotecas para
envio de e-mail:
1. Baixe o JavaMail no endereo http://java.sun.com/products/
javamaillindex.html. Sua verso est em 1.4 no momento em
que o livro escrito e acima de tudo, open source.

366

[1iil] Desenvolvendo Aplicaes Web com JSP.. ,


JavaMail1,4
(April 25, 2006)

The JavaMail1.4 release includes many API improvemenls approved by lhe Java
Community Process via JSR-919. II also includes improvemenls in MIME parsing
performance and support for parslng and conslructing Delivery Slalus
Noliticalions.
Nole: Vou will also need lhe Java8eans AClivalion Framework (JAF) extension lhal
provides lhe javax.aclivation package. We suggeslyou use version 1.1 of JAF, lhe
latest release.
As usual, send feedbacklo javamail@sun.com.
Download JavaMail1.4

NEW

I Download I
Figura 19.3

2. Pegue o arquivo mail.jar e coloque no diretrio Iib em WEB-INF.


3. Baixe um arquivo chamado JavaBeansActivation Framework, que
se encontra no momento em que o livro escrito na verso 1.1 .
JavaBeans(TM) Activatlon Framework 1.1
NOTE: Carefulty review lhe files lisled below to select the ones vou want, then click the Iink(S) to download. I(you
don' complete your download, vou may return to the Download Center anytime, sign in, then click the
"DownloadlOrder Histor{ link on the letl to continue.
For any download problems or questions, Illease see the Download Center FAQ.
How long wi lllhe download take ? 1:9

Figura 19.4

4. Descompacte e pegue o arquivo activation.jar e coloque no


diretrio Iib em WEB-INF junto ao arquivo mail.jar.
AAPI JavaMail muito completa e complexa, tendo diversas utilidades, alm de somente enviar e-mail. Mas como o foco desse captulo
somente enviar e-mail, ns no nos atearemos a outras situaes.

Envio de E-mail l\I

367

Para esse primeiro exemplo, voc dever ter feito ou ter um usurio
para autenticar na sua conta de e-mail. Se no tiver, siga os passos dados
anteriormente.
enviandoEmail.jsp
<%@ page language=" j ava" contentType=" text/htm"
pageEncoding="ISO-8859-1"
import=" j ava. util. *, j avax. mail. *, j avax. mail. internet. * ,
meupacote.Autenticar"
%>
<IDOCTYPE html PUBLIC
"- //W3C//DTD XHTML 1.0 Transitional // EN" ''http://www . w3.org/TR/
xhtmll/DTD/xhtmll-transitional. dtd">
<html xmlns=''http://www.w3 .org/1999/xhtml">
<head>
<title>Enviando meu primeiro E-mail< / title>
</ head>
<body>
<%

Properties props = new Properties( )i4)


props.put("mail.smtp.host", "localhost")ie
props.put("mail.smtp.auth","true")i6)

Session s = Session.getDefaultlnstance(props,
newAutenticar("edson@integratorjava.com.br","integrator")0
)i

MimeMessage message = new MimeMessage(s) i @)


InternetAddress from =
new InternetAddress("edson@integrator.com.br")i
message.setFrom(from)iQ)
InternetAddress to = new InternetAddress("edson@teste.com")i
message.addRecipient(Message.RecipientType.TO, tO)i ~

368

[ilJ Desenvolvendo Aplicaes Web com JSP...

message.setSubject("Teste usando JavaMail.") i O


message. setText ("Sej a bem vindo JavaMail!") i 0
Transport.send(message)iCV
%>
<h2>E-mail enviado com sucesso!</h2>
</body>
</html>

atravs da classe javax.mail.Session que voc obtm os objetos


responsveis pelo envio e leitura de e-mails. Mas, para obter um objeto
Session, voc precisa passar informaes do servidor de e-mails. Para fazer isso voc utiliza um objeto chamado java.utiI.PropertiesO.
A configurao da classe Properties feita atravs de propriedades prestabelecidas pela API, como o nome do servidor SMTPe e se o servidor
exige autenticao . O exemplo foi feito com um servidor exigindo autenticao, o que muito comum em muitos servidores espalhados na Internet.
Para criar a sesso, o objeto Session ~hamado logo a seguir, criando
uma instncia utilizando o mtodo getDefaultInstance( ) O. Como fora
indicado que o servidor exige autenticao, o mtodo getDefaultInstance( )
exige que no segundo parmetro seja passado um objeto que implementa a
interface Authenticator. Um objeto da classe Authenticator obtm os dados
para autenticao do usurio, retomando um objeto PasswordAuthentication.
Nesse caso uma classe chamada Autenticar(String s, String s) ser utilizada passando o usurio e a senha necessrios para ser autenticado no servidor SMTP. Essa classe ser criada mais a seguir.
A sesso ter uma mensagem com MimeMessage(Session s) 0, que
pode enviar mensagens para um ou mais destinatrios. Cada destinatrio pode
ter um nome e e-mail, feito atravs do objeto InternetAddress(String s).
Atravs do mtodo setFrom( )0, de MimeMessage, voc define quem
est enviando a mensagem. Com o mtodo addRecipient( )8, de
MimeMessage, voc define os tipos de destinatrios que sero representados por atributos da inner class RecipientType, da classe Message. Voc
pode configurar com CC (Carbon Copy - Cpia Carbono), BCC (Blind
Carbon Copy - conhecido como cpia carbono oculta) e TO (destinatrio
principal, o utilizado nesse exemplo):

Envio de E-mail [1iiJ

369

Message.RecipientType.TO

Para criar o assunto da mensagem, o mtodo setSubject(String s) 0,


de MimeMessage, usada. O contedo da mensagem, ou sejam, o corpo da
mensagem criado pelo mtodo setText(String s) 0 .
Para transportar a mensagem, a classe abstrata javax.mail.Transport
chamada, no qual contm o mtodo send(MimeMessage m)fD)para enviar
a mensagem.
Para enviar a mensagem, a classe de autenticao dever ser feita.
Crie o arquivo Autenticar.java, no pacote meupacote, a seguIr:
Autenticar.java

package meupacote;
import javax .mail . *;
public class Autenticar extends Authenticator
private String usuario;
private String senha;
public Autenticar ( ) {}
public Autenticar(String usuario, String senha) {
this.usuario = usuario;
this .senha = senha;

public PasswordAuthentication getPasswordAuthentication( ) (


return new PasswordAuthentication(usuario, senha ); .,

A classe Autenticar estende javax.mail.Authenticator que sabe como


obter os dados para autenticao do usurio. Para que isso seja obtido com

370 ll Desenvolvendo Aplicaes Web com JSP...


sucesso, o objeto PasswordAuthentication(String user, String pass)O
dever ser retomado.

~.ten~~

No se esquea de que voc deve testar esses exemplos utilizando a Internet conectada para que o e-mail chegue a seu
desti nat rio .

Enviando E-mail sem Autenticao

o envio de e-mail sem autenticao mais simples. A opo mail.smtp.auth


no existir e no segundo parmetro do mtodo getlnstance( ) basta adicionar o valor null.
props. put ( "mail. smtp. host", "localhost");
session = Session.getlnstance(props, null};

Enviando um E-mail Atravs de um Bean


Para ilustrar o envio de e-mail, voc criar um JavaBean. Esse JavaBean
tambm enviar um e-mail em formato HTML.
EmailBean. j ava

package meupacote;
import java.util.Date;
import java.util.Properties;
import
import
import
import
import
'import
public

javax.mail.Message;
javax.mail.MessagingException;
javax.mail.Session;
javax.mail . Transport;
javax.mail. internet. InternetAddress;
javax.mail.internet.MimeMessage;
class EmailBean {

Envio de E-mail [ljI]

371

private String to = null;


private String from = null;
private String subject = null;
private String message = null;
public static Properties props = null;
public static Session session = null;
static{
props = System . getProperties( );
props.put {"mail. smtp.host" , "localhost");
props . put ("mail . smtp. auth" , "true") ;
session = Session.getlnstance(props,
new Autenticar("edson@integratorjava.com.br","integrator")
);

public void setTo(String to) (


this . to = to;

public void setFrom(String from) (


this.from = from;

public void setSubject(String subject) (


this.subject = subject;

public void setMessage(String message)


this.message = message;

public void sendMail( ) throws Exception (


if(!this.verificarCampos( ))
throw new Exception("No foi enviado o e-mail . ");

372

[IjI] Desenvolvendo Aplicaes Web com JSP...

try
MimeMessage message = new MimeMessage(session} i
message.setRecipient(Message.RecipientType . TO,
new InternetAddress(this.to}} i
message.setFrom(new InternetAddress(this.from}}
message.setSubject(this.subject} i

message.setSentDate(new Date( }}i .,


message.setContent(this.message, "text/htm1"}i$

Transport.send(message}

catch (MessagingException e)
throw new Exception(e.getMessage( }}i
catch(Exception e}{
e.printStackTrace( }i

private boolean verificarCampos( } {


if((this.to == null} I I (this.from == null)
(this.subject == null) I I (this .message
return falsei
if((this.to.indexOf("@"}
(this.to.indexOf(" . ")
return falsei

== -l} II
== -l}}

if((this.from.indexOf("@"}
(this. from. indexOf (".")
return falsei
return truei

== -l} I I
== -l}}

II
null)}

Envio de E-mail lI

373

o JavaBean ~riado de simples entendimento. Uma novidade desse


Bean est no mtodo setSentDate() O que transmite a data para o cabealho da mensagem. Caso voc no transmita, alguns e-mails podem acusar
uma data totalmente arbitrria a enviada.
A outra diferena encontrada nesse exemplo est no contedo da menno qual voc define o
sagem, definido pelo mtodo setContent( )
MimeType "text/html".

e,

UTILIZANDO O EMAILB EAN

o Bean criado pode ser utilizado em uma pgina JSP contendo um formulrio:
enviandoEmailcomEmail Bean.jsp
<%@ page language= "java "
contentType=" t ext / html "
pageEncoding="ISO- 88 59 - 1"
%>
<!DOCTYPE html PUBLIC
"- // W3C I I DTD XHTML 1. O Transitional ll EN" ''http: // www . w3 . org I TR I
xhtml1 / DTD/ xhtml1-transiti onal.dtd" >
<html xmlns="http: //www .w3. org/1999 / xhtml" >
<head>
<title >Digite seu e-mail </ title>
< / head>

<body>
<jsp:useBean id="email " class="meupacote.EmailBean" I>
<j sp: setProperty name=" email " property=" *" I >
<%
i f (request getParameter ("submi t") ! =null)
email . sendMai l ( ) ;
%>
<form action="sendMai14. jsp method="post">
<table border="O" >
<tr>
<td>De: </ td>

374

[Iij Desenvolvendo Aplicaes Web com JSP...

<td><input type="text" narne="from" 1></td>


<Itr>
<tr>
<td>Para:</td>
<td> <input type="text" narne="to" 1></td>
<Itr>
<tr>
<td>Assunto: </td>
<td><input type="text" narne="subject" 1></td>
<Itr>
<tr>
<td>Mensagem:</td>
<td><textarea rows="5" cols="25" narne="message"></textarea></td>
<Itr>
<tr>
<td colspan="2">
<input type="submit" narne="submit" value="Enviar N I>
</td>
<Itr>
</table>
</form>
</body>
</html>

Seria interessante voc fazer com que o mtodo sendMail ( ) retome


um valor booleano caso tenha sucesso. Isso daria a voc a possibilidade de
dar condies de avisar o usurio de que o e-mail foi enviado com sucesso.
Se quiser enviar diretamente o e-mail, basta seguir o exemplo a seguir:
enviandoEmailViaJavaBean.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<!OOCTYPE html PUBLIC
"- I IW3CI lOTO XHTML l. O Transitional//EN" ''http://www . w3 . org/TRI

Envio de E-mail l\l

315

xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns= "http://www . w3 . org /1999 /xhtml" >
<head>
<title>Enviando um e-mail por JavaBean</title>
</head>
<body>
<jsp:useBean id="email" class="meupacote.EmailBean" />
<jsp:setProperty name="email" property="from"
value="edson@integrator.com.br"/>
<jsp:setProperty name="email" property="to"
value="edson@teste.com"/>
<jsp:setProperty name="email" property="subject"
value="Testando o EmailBean"/>
<jsp:setProperty name="email" property="message"
value="<strong>Estou testando JavaMail</strong>"/>
<% email.sendMail( }; %>
</body>
</html>

Enviando E-mail com Contedo Anexo


Mais um grande problema na construo de sistemas coorporativos: o envio de e-mails com contedo anexo. Muitos desenvolvedores iniciantes se
deparam nessa questo, alguns apontam para um link externo ou enviam o
contedo anexo.
Enviar um e-mail com contedo anexo no complicado, apenas exige um pouco mais de conhecimento da API. O que voc vai fazer agora
um pequeno exemplo de como enviar esse tipo de mensagem.
mensagemComAnexo.jsp

<%@ page language="java" contentType="text/htm"


pageEncoding="rSQ-8859-1'
import="java.util.*, javax.mail.*, javax.mail.internet.*,
meupacote.Autenticar, javax.activation.* " 4)
%>

376

[IjlJ

Desenvolvendo Aplicaes Web com JSP...

<!DOCTYPE html PUBLIC


"-//W3C/ / DTD XHTML 1.0 Transitional/lEN" ''http://www.w3.org/TR/
xhtml1 / DTD/xhtml1-transitional . dtd">
<html xmlns="http://www.w3 . org/1999/xhtml">
<head>
<title>Enviando meu primeiro E-mail</title>
</ head>
<body>

<%
Properties props = new Properties( );
props.put("mail . smtp.host", "localhost");
props. put ("mail . smtp. auth" , "true") ;
Session s = Session.getDefaultlnstance(props,
new Autenticar("edson@integrator . com . br","integrator")
);

MimeMessage message

new MimeMessage(s);

InternetAddress from = new


InternetAddress("edson@integrator . com.br");
message.setFrom(from);
InternetAddress to = new InternetAddress("edson@teste . com");
message.addRecipient(Message.RecipientType.TO, to);
message. setSubj ect ("Teste usando JavaMail ." ) ;
message. setSentDate (new Date( ));

Ii cria a Multipart
Multipart mp = new MimeMultipart( ); ~

Ii adiciona o contedo
MimeBodyPart conteudo= new MimeBodyPart( );

EB

conteudo.setContent( .. E-mail com contedo anexo", "text/htm1");

Envio de E-mail l\l

377

mp.addBodyPart(conteudo); t)

Ii anexa o arquivo na mensagem


MimeBodyPart anexo= new MimeBodyPart{ ); ~
FileDataSource fds =
new FileDataSource ("C: /temp/logotipo. jpg") ; <D
anexo.setDataHandler(new DataHandler(fds)); ~
anexo. setFileName (fds.getName( )); C)
mp.addBodyPart(anexo); ~
Ii adiciona a Multipart na mensagem
message.setContent(mp); ~
Transport.send(message);
%>
<hl>A mensagem foi enviada com sucesso</hl>
</body>
</html>

Para transportar o e-mail com um corpo de mensagem junto a um


arquivo anexo, primeiro voc precisar importar a biblioteca:
javax.activation. *0.
O e-mail possui mais de uma parte, o que no caso exigir o uso da
classe MimeMultipart() e. O primeiro contedo, um texto, ser colocado em uma instncia da classe MimeBodyPart( ) 6). Atravs do mtodo '
setContent( ) voc determina o contedo de texto e o MimeType. Para
adicionar esse contedo a instncia MimeMultipart( ), voc utiliza o mtodo addBodyPart( ) O.
A segunda parte do e-mail ser o envio de um arquivo, aqui representado por uma imagem. Novamente uma instncia criada ao objeto
MimeBodyPart( ) 6) indicando a segunda parte do e-mail. Nesse caso o
envio de um arquivo ser feito. Para anexar um arquivo voc precisa criar
um FileDataSource0 a partir do cominho fsico completo do arquivo que
voc deseja anexar para o envio.

378

[\] Desenvolvendo Aplicaes Web com JSP...

Assim que determinado o arquivo, o mtodo setDataHandler( )8


do objeto MimeBodyPart chamado para pegar um novo objeto
DataHandler (new DataHandler( que obtm como parmetro a instncia do FileDataSource, contendo o arquivo anexado.
Para indicar ao objeto MimeBodyPart o nome do arquivo, o mtodo
setFileName() fi) chamado e como parmetro recebe o nome do arquivo
vindo do mtodo getName() da instncia de FileDataSource.
A imagem finalmente anexada instncia de MimeMultipart( ) atravs do mtodo addBodyPart() 0 .
Finalmente o contedo adicionado mensagem, atravs do mtodo
setContent()f]) que recebe como parmetro a instncia de MimeMultipart( ) .

A Biblioteca Commons Email


Pertencente ao projeto Jakarta Apache, a API Commons Email foi desenvolvida como uma camada abstrada da API JavaMail, simplificando seu
uso no desenvolvimento de envio de e-mails.
Para baixar essa biblioteca, entre no link http://jakarta.apache.org/
site/downloads/downloads_commons-email.cgie baixe o arquivo binrio (Binary) do projeto.
No site, existe a possibilidade de baixar em formato .zip ou .tar.gz, no
qual voc deve utilizar o que melhor lhe convier, onde, s para lembrar, o
formato .zip o mais usado em ambientes Windows e .tar.gz (conhecido
como tarball) o mais usado no ambiente Linux.
Ao baixar, descompacte o arquivo commons-email-1.0.zip ou
commons-email-1.0.tar.gz e pegue o arquivo commons-email-1.0.jar e
coloque no diretrio lib da sua aplicao em WEB-INF.

_'n

..

~l1UnQaa~

Alm dessa biblioteca, claro que voc dever adicionar as


tradicionais da API JavaMail.

Para enviar um e-mai:


segUIr:

~ : !!izal ,rin

essa biblioteca, crie a pgina J<::;P a

Envio de E-mail [iijI]

379

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
import=" org. apache. cOIIIIIOns .mail . SiIleEmail "O
%>
< ! DOCTYPE html PUBLIC
"-I IW3CI IrJrD HTML 4.01 TransitionalllEN" ''http://www . w3. org/TR/htm141

l oose.dt d">
<html>
<head>
<title>Enviando e-mail com Common Email</title>
</head>

<body>
<%
SiIleEmail email = new SiIleEmail ( );
ema i 1. setHostName ("localhost") ;

email.addTo( .. edson@integrator.cam.br... "Edson");

email. setFrom( .. edson@integrator.cam.br.. , "Edson");


email. setSubj ect ("Mensagem de Teste");

email.setMsg("Teste de Email utilizando cOlllllOns email");


email. send ( );

%>
<h2>Envi ando e-mail com Common Email</h2>
</body>
</html>

A primeira coi sa que voc tem que fazer importar a biblioteca


org.apache.commons.maiI.SimpleEmailO.

380 llI

Desenvolvendo Aplicaes Web com JSP...

A segunda coisa que voc deve fazer chamar a classe SimpleEmail( )


Esta classe usada para enviar e-mails simples. A configurao para o
envio do e-mail utilizando essa biblioteca comea com o mtodo
setHostName() 8) que recebe o nome do host SMTP que ser utilizado
para envlar a mensagem.
Quem vai receber o e-mail deve ser configurado utilizando o mtodo
addTo() O. O remetente configurado com o mtodo setFrom() 0 e o
assunto o mtodo setSubject() 0. O contedo da mensagem de e-mail
adicionado utilizando o mtodo setMsg() 8.
Como voc pode observar, realmente bem mais simples utilizar essa
biblioteca do que diretamente a API JavaMail.

e.

E-mail com Anexo Utilizando a Biblioteca


Commons Email
Enviar um e-mail em anexo com a biblioteca Commons Email algo muito simples tambm, assim como o visto anteriormente.
emailComAnexoEmCommonsEmail.jsp

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-l"
import=" org. apache. commons .mail. *" %>

<! DOCTYPE html PUBLIC


"- //W3C // DTD HTML 4.01 Transitional//EN" ''http://www.w3.org/TR /
html4 / loose.dtd">
<html>
<head>
<title>Enviando e-mail com Common Email e Anexo</title>
</head>
<body>
<%
EmailAttachment attachment = new EmailAttachment(
attachment.setPath("C:/temp/logotipo.jpg") i 6)

)i ~

Envio de E-mail ~

381

attachment.setDisposition(EmailAttachment.ATTACHMENT); 4)
attachment.setDescription("Logotipo da empresa Integrator");0
attachment.setName("Integrator");C1)
MultiPartEmail email = new MultiPartEmail(

); ' ~

email . setHostNarne("localhost n ) ;
email.addTo( .. edson@integrator.com.br .. , "Edson Gonalves") ;
email.setFrom( .. edson@integrator.com . br .. , "Edson");
email. setSubj ect ("Mensagem de Teste") ;
email. setMsg ("Teste de Ernail utilizando cornrnons email") ;

email.attach(attachment); ~
email. send ( );

%>
<h2>Enviando e - mail com Cornrnon Ernail e Anexo</h2>
</body>
</html>

Apenas para lembr-lo , a importao da biblioteca org.apache.


commons.mail.* O necessria para a utilizao nesse exemplo.
Para colocar um arquivo em anexo, primeiro voc deve chamar a classe
EmailAttachment( ) f) , que usada para se criar os anexos do e-mai!.
Com o mtodo setPath( )
de EmailAttachment, voc determina o
caminho fisico para o arquivo que ser anexado.
Com o mtodo setDisposition( ) O voc informa a disposio do
arquivo, passando para ele uma constante String qu-e no caso define como
parte de um anexo.

e,

382

~ Desenvolvendo Aplicaes Web com JSP...

o mtodo setDescription( ) 6) define uma descrio para o arquivo


anexo e o mtodo setName() 0 um nome para o arquivo anexo.
A classe MultiPartEmail( ) 8 usada emitir mensagens multipart.
Isto permite uma mensagem de texto com anexos.
E por ltimo, voc adiciona o anexo a mensagem com o mtodo attach(
) G) antes de enviar.
Enviando E-mail em Formato HTML Usando
Commons Email
Para o envio de e-mail no formato HTML voc deve usar a classe HtmlEmail.
O funcionamento dessa classe parecida com a da classe MultiPartEmail.
Porm, essa classe possui um mtodo adicional que configura o MimeType
da mensagem para textlhtml. Alm disso, essa classe permite a voc adicionar o contedo da mensagem como somente texto (texto puro), nos casos
onde no so suportados e-mails em formato HTML.
envEmailCommonEmail.jsp
<l<%@ page language="java"
contentType="text/html"
pageEncoding="ISO-8859-1"
import="org.apache.commons.mail.*,
java.net.URL"
%>
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional/ / EN" ''http://www.w3.org/TR/
html4/loose.dtd">
<html>
<head>
<title>Enviando e-mail com Common Email e Anexo</title>
</head>
<body>
<%
HtmlEmail email = new HtmlEmail{ );

Envio de E-mail

ll 383

email. setHostNarne (" localhost") ;


email.addTo("edson@integrator.com . br"

"Edson Gonalves");

email.setFrom("edson@integrator.com.br", "Edson");
email. setSubj ect ( "Mensagem de Teste") ;
URL url =
new URL ( ''http://www . apache. org 1 ilIIages 1asf_ logo_wide. gif") i

String cid = email.embed{url, "Logo do Projeto Apache")i@)


email.setHtm1Msg{"Logo do Apache - <img src=\"cid:"+
cid+"\" I>") iO
email. setTextMsg ("Mensagem caso no suporte HTML") i 0

email. send ( );

%>
<h2>Enviando e-mail com Cornrnon Ernail e HTML< / h2>
</body>
</html>

Como j fora explicado no incio desse exemplo, a classe HtmlEmail( )


envia e-mails no formato HTML, segundo a biblioteca Commons Email.
Atravs da classe java.net.URL@ voc pode adicionar uma imagem
remotamente. Essa imagem remota precisa ser utilizada dentro do e-mail
que ser enviado, ento entra em ao o mtodo embed( )8), que retoma
uma String. Essa String um identificador aleatrio gerado que deve ser
usado para referenciar a imagem em uma tag <img />0 .
O mtodo setTextMsg( ) 0 envia uma mensagem em texto simples
(Plain Text), caso o e-mail no suporte o formato HTML.

384 lI Desenvolvendo Aplicaes Web com JSP...

Enviando E-mail com Autenticao


Diferente dos exemplos dados na API JavaMail, aqui os exemplos foram
mostrados sem autenticao. Mas se o seu caso for de ter autenticao,
ento basta utilizar o mtodo setAuthenticator( ).
Para isso, basta adicionar a classe Autenticar criada para os exemplos com a API JavaMail e adicionar a linha em destaque a seguir em seus
exemplos:

HtmlErnail email = new HtmlErnail( };


email.setHostName("localhost"};
email.setAuthenticator(
new Autenticar("edson@integrator.cam.br","integrator"));

.... ... ....

Captulo

20
Mode/- View-Contro//er e Data
Access Object

STE CAP TULO

o INTRODUZIR EM DOIS DOS MUITOS CONCEITOS ARQU ITETNICOS

importantes do desenvolvimento de aplicaes Web escritas em Java,


que o ajudaro na construo dessas aplicaes que tm como base exibir
uma interface a um usurio de um sistema, possibilitando-o manipular seus
dados. A primeira arquitetura chamada de Model-View-Controller, ou
mais conhecida pela sigla MVC. A estrutura do MVC, um paradigma do
desenvolvimento, oferece beneficios significantes para aplicaes Web, e
estando familiarizado com isso, voc aumentar sua compreenso de uma
gama de conceitos, alguns dos quais usam ou emprestam de MVC.
O outro conceito o padro Data Access Object, conhecido tambm
pela sigla DAO. Os modernos sistemas que acessam dados utilizam esse
padro de desenvolvimento como base para a manipulao com o banco de
dados.
Existem muitos outros conceitos englobando o desenvolvimento de
aplicaes escritas em Java, no qual voc pode se aprofundar atravs das
boas prticas de desenvolvimento, conhecidas como Design Patterns, que
vai muito alm do proposto por este livro .

O que MVC?
MVC um conceito (paradigma) de desenvolvimento e design que tenta
separar uma aplicao em trs partes distintas. Uma parte, a Model, est

386

[\J Desenvolvendo Aplicaes Web com JSP...

relacionada ao trabalho atual que a aplicao administra, outra parte, a


View, est relacionada a exibir os dados ou informaes dessa uma aplicao e a terceira parte, Controller, em coordenar os dois anteriores exibindo
a interface correta ou executando algum trabalho que a aplicao precisa
completar.
A arquitetura MVC foi desenvolvida para ser usada no projeto de
interface visual em Smalltalk.
Estas partes so respectivamente:
~ Model: O Model (Modelo) o objeto que representa os dados do
programa. Maneja esses dados e controlam todas suas transformaes. Esse modelo no tem conhecimento especfico dos
controladores (controller) e das apresentaes (views), nem sequer contm referncia a eles. Portanto, o Model so as classes
que trabalham no armazenamento e busca de dados. Por exemplo,
um cliente pode ser modelado em uma aplicao, e pode haver
vrios modos de criar novos clientes ou mudar informaes de
um relativo cliente.
~ View: A View (Apresentao) o que maneja a apresentao visual dos dados representados pelo Model. Em resumo, a responsvel por apresentar os dados resultantes do Model ao usurio.
Por exemplo, uma Apresentao poder ser um local administrativo onde os administradores se logam em uma aplicao. Cada
administrador poder visualizar uma parte do sistema que outro
no v.
~ Controller: O Controller (Controlador) o objeto que responde
as ordens executadas pelo usurio, atuando sobre os dados apresentados pelo modelo, decidindo como o Modelo devera ser alterado ou devera ser revisto e qual Apresentao devera ser exibida.
Por exemplo, o Controlador recebe um pedido para exibir uma
lista de clientes interagindo com o Modelo e entregando uma
Apresentao onde esta lista poder ser exibida.
Como voc pode ver, o modelo MVC uma forma de desenvolvimento que ajuda na manuteno do sistema, um padro muito aceito no
desenvolvimento de aplicaes Java, principalmente no de aplicaes escritas para a Web.

Model-View-Controller e Data Access Object [liil]

387

A separao lgica da aplicao nestas partes assegura que a camada


Modelo no sabe nada praticamente do que exibido; restringido por representar as partes de componentes do problema que resolvido pela aplicao. Igualmente, a camada de Apresentao s est relacionada a exibir
os dados e no com implementar lgica de negcios que controlada pela
camada Modelo. O Controlador, como um gerenciador de trfego, dirige as
apresentaes a serem exibidas e com as devidas mudanas de dados e
recuperaes vindas da camada Modelo .

As Aplicaes Web
muito comum vermos ainda nos dias de hoje o desenvolvimento de aplicaes Web construdas com cdigo HTML e cdigo servidor em uma
mesma pgina, criando uma embaraosa confuso . exatamente isso que
aconteceu nos exemplos de JDBC e JSTL, cdigos de SQL, juntas a cdigos de programao, e sadas de resultados ao usurio, tudo em um s
local.
Esse tipo de desenvolvimento conhecido como embutir a lgica de
negcios ao resultado final. Essa prtica condenada pelos desenvolvedores
atuais, principalmente os de aplicaes escritas em JSP. Graas a essa
condenao, o paradigma do modelo MVC foi incorporado no desenvolvimento, criando assim dois modelos para desenvolvimento de aplicaes
escritas em Java: Model 1 (Modelo 1) e Model 2 (Modelo 2), baseados no
paradigma MVC.

o MODEL 1
A primeira arquitetura, conhecida como Model 1, muito comum no desenvolvimento de aplicaes Web, chamada de page-centric. Esta arquitetura fornece o modo mais fcil de reunir uma aplicao Web. Envolve simplesmente a construo de uma aplicao como um conjunto de pginas
JSP.
A sucesso de eventos explicada neste exemplo simples, uma vez
que voc j fez o desenvolvimento de uma aplicao Web (mesmo sem um
padro):

388

[)jlJ Desenvolvendo Aplicaes Web com JSP...

1. O usurio pede uma pgina de Web-por exemplo, a pgina principal, index.jsp.


2. O container Servlet executa a lgica contida na pgina index.jsp
como tambm inclui pginas para que se possa apontar. Esta execuo pode incluir a recuperao de dados de um banco de dados
ou outras funes que satisfaam lgica de negcios. Os
JavaBeans fornecem as representaes de dados dentro da pgina
JSP.
3. Unido junto lgica de negcios da pgina, sero confeccionadas
e apresentados o HTML ao usurio.
4. Como resultado do processo, construdo o HTML final e exibido ao usurio .

r;;:=
1

'r-

J5P

Pedido
OJ
;;O

pages

Resposta

:E
VI

.-...__..1" -

N'

;;O

r' , -

Q,ava

Be~

.......
I

Container
Servlet

Dados

Figura 20.1 - Arquitetura Mode/l.

Para exemplificar sua aplicao, tome o exemplo a seguir, que cria


um "suposto" carrinho de compras dos livros selecionados:
A pgina de produtos.jsp:
<%@ page language=Hjava"

contentType=" text/htrnl H

Model-View-Controller e Data Access Object l\J

389

pageEncoding="ISO-8859-1"
session="true"
%>
<!DOCTYPE html PUBLIC
"-//W3CIIDTD XHTML 1.0 TransitionalllEN"

''http://www.w3.org/TR/

xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Selecione o livro</title>
</head>
<body>
<a href="comprar.jsp?livro=Dominando+AJAX&cmd=add">
Dominando AJAX
<Ia>
<br I>
<a href= "comprar. j sp?li vro=Dominando+Eclipse&cmd=add">
Dominando Eclipse
<Ia>
<br I>
<a href=" comprar. j sp?li vro=Dominando+NetBeans&cmd=add" >
Dominando NetBeans
<Ia>
</body>
</html>

A pgina comprar.jsp :

<%@ page language="java"


contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<!DOCTYPE html PUBLIC
"-//W3CIIDTD XHTML 1.0 TransitionalllEN"
xhtml1/DTD/xhtml1-transitional.dtd">

''http : //www.w3.org/TR/

390 lI Desenvolvendo Aplicaes Web com JSP."


<html xmlns="http://www . w3.org/1999/xhtml''>
<head>
<title>Livros Comprados</title>
</head>

<body>
<jsp:useBean id="carrinho" scope= "session H
class="meupacote.CarrinhoDeCompras" I>
<jsp:setProperty name="carrinho" property="* " I>
<%
String[] livro = request.getParameterValues("livr o");
if (livro != nu l l) (
carrinho.process(livr o);
String[] prods = carrinho.get Prods( );
if (prods . length > O) {
%>
<table border="l">
<tr>
<th colspan="2">Carrinho de Compras</th>
<Itr>

<%
for (int i
%>

O; i < prods .length; i ++) {

<tr>
<td><%=prods[i]%></td>
<td><a href="?livro=<%=prods [i ] %>&cmd=r">Exclui r</a></td>
<Itr>

<%
%>
<tr>
<td colspan=" 2" ><a href="utilizandoCarrinho. j sp">Comprar mais</a>
</td>
<Itr>

Model-View-Controller e Data Access Object [)J

391

</table>

<%
else {
out,println("<h2>Voc no tem produtos no seu carrinho</h2>"
+ "<a href=\"utilizandoCarrinho,jsp\">Comprar mais</a>");
%>
</body>
</html>

o JavaBean CarrinhoDeCompras,java :
package meupacote;
import java,util,Vector;
public class CarrinhoDeCompras
Vector<String> V;
String cmd=null;
public CarrinhoDeCompras( ){
V

= new Vector<String>( );

private void add(String[] objs){


f or(int i=O;i<objs,length;i++){
v,addEl ement(objs[i]) ;

private void remove(String[] objs){


for(int i=O;i<objs,length;i++) {
v,removeElement(objs[i]) ;

publ ic void setCmd(String s) {


cmd=s;

392 Il Desenvolvendo Aplicaes Web com JSP...

public String[] getProds( )(


String[] s =new String[v.size( )];
v.copylnto(s) ;
return s;
public void process(String[] prods) (
if (prods !=null && cmd!=null){
if (cmd. equals ("add") ) (
add (prods) ;
else{
remove (prods) ;
reset ( );

private void reset( )(


cmd = null;

As explicaes foram omitidas de seu funcionamento, pois o mesmo


serve apenas para demonstrar sua utilizao no Model 1. Evidentemente
no se trata de um carrinho de compras do mundo real, o que o tomaria
bem mais complexo. Trata-se apenas de um exemplo somente.

o MODEL 2
o Model 1 indicada para uma aplicao pequena, que contm um limitado nmero de usurios e contm pouca lgica de negcios, principalmente
por ser simples e efetiva. Porm, em uma aplicao mais complexa, onde a
lgica de negcios no s mais detalhada, mas a lgica de exibio necessria tambm significantemente grande, uma arquitetura de desenvol-

Model-View-Controller e Data Access Object l)il] 393

vimento baseada no Modelo 1 far com que seja um tanto bagunado o


montante de cdigos desenvolvidos. Voc j percebeu, em exemplos contidos nesse livro, que quando voc coloca a lgica de negcios em um modelo simples de desenvolvimento, uma repetio de cdigo acaba ocorrendo
(isso muito comum no desenvolvimento de outras linguagens de programao Web cujos conceitos de desenvolvimento no esto fortemente agregados). Isso impossibilita uma rpida manuteno e evidentemente, em um
crescimento da aplicao, no haver uma possvel extenso. E isso porque no estamos contando com o fator de testes.
Desafiado por estas desvantagens bvias, os desenvolvedores identificaram uma arquitetura mais sofisticada que usa Servlets e pginas JSP.
Esta arquitetura fora batizada de Model 2 (Modelo 2), que est baseada em
uma adaptao da arquitetura MVC. Nessa implementao, um Servlet
usado como um Controlador, recebendo pedidos do usurio, enquanto efetuando mudanas no Modelo, e fornecendo a Apresentao ao usurio.
As apresentaes ainda implementadas nesta arquitetura usam pginas JSP, mas a lgica que elas contm s a de exibir a interface ao usurio. A camada de Modelo foi encapsulada em objetos Java.

---1

Pedido

(Controller)
Servlet

RcdireciQna

Resposta

~~,

~i' . ,

(View)
J5P

~~

.1/ (Mode l) :.....-

~.v.Bean

---

Container
Servlet
Figura 20.2 - Arquitetura Model 2.

Dados

394 l\l

Desenvolvendo Aplicaes Web com JSP...

A seguir voc tem uma explicao do que acontece nesse modelo de


desenvolvimento:
1. O usurio pede para o URL de um Servlet. No pedido h uma
indicao do trabalho a ser executado. Por exemplo, no URL voc
pode ter algo como: lLivraria?action=mostrarLivros, onde action
representa o trabalho que a camada Controlador deve empreender.
2. A camada Controlador recebe o pedido e determina o trabalho
baseando-se no pedido. Essa camada executa chamadas a camada Modelo que empreende a lgica de negcios exigida.
3. A camada Modelo instruda a fornecer uma lista de objetos de
Livros pelo Controlador. Esse, nesse caso, pode acessar algum
tipo de camada de persistncia, como um banco de dados.
4. Para a camada Controlador proporcionada a lista de objetos de
Livros para exibir na camada de Apresentao. A camada
Controlador tambm determina a apresentao apropriada para
fornecer ao usurio . Usando o despachante de pedido, o Servlet
pode fornecer a lista de objetos de Livros camada de Apresentao selecionada (pgina JSP mais indicada).
5. A camada de Apresentao tem uma referncia agora aos dados
fornecidos e faz a exibio da lista conforme sua lgica definida.
O HTML gerado no resultado desse processo fornecido em resposta
ao usurio. isso que ele ver.
Para exemplificar esse Modelo , voc ir criar os exemplos a seguir:

A PGINA

PARA LOGAR (VIEW INICIAL)

Essa uma simples pgina que contm um formulrio onde os usurios


podero se entrar com informaes de usurio e senha. Caso esteja incorreta as informaes postadas, uma mensagem aparece O:
logar.jsp
<li<~.,@

page language="java"
contentType="text/htm1"
pageEncoding="ISO-8859-1"%>

Model-View-Controller e Data Access Object riJ 395


<! DOCTYPE htm1 PUBLIC
"-//W3C//DTD XHTML 1. o Transitional//EN"
xhtm11/DTD/xhtm11-transitional.dtd">

''http://www.w3 .org/TRI

<htm1 xml.ns=lhttp://www.w3.org/1999/xhtm1">
<head>
<title>Logar no Sistema</title>
</head>
<body>
<form action=ILogar" method="post">
Usurio:<input type="text" name="usuario" I><br I>
Senha: <input type="password" name="senha" I><br I>
<input type="submit" name=lbtLogar" value=ILogar" I>
</form>
<%

String msg = (String) request .getAttribute ("msg"); O


if (msg != null)

out.println( msg ); l/exibe a mensagem caso exista


%>

</body>

</htm1>

o MODEL USUARIO.JAVA
o Model Usuario.java um JavaBean que apenas fornece a possibilidade
de se capturar os dados do usurio (Iogin e senha) e se logar na aplicao.
Como voc no est trabalhando com banco de dados, esse JavaBean autoexecuta.
Usuario. j ava
package meupacote;
public class Usuario
private String usuario=null;

396 l'iI

Desenvolvendo Aplicaes Web com JSP...

private String senha=null;


public void setUsuario(String usuario)
: this.usuario = usuario;
public String getUsuario( ) (
return usuario;
public void setSenha(String senha) (
this.senha = senha;
public String getSenha( ) (
return senha;
public boolean verificaUsuario( ) (
if(this.usuario != null

&&

this.senha != null) {

if(this.usuario.equals("edson")

&&

this.senha.equals("123"))

return true;
return false;

o CONTROLLER SERVLET LOGAR


o Servlet criado a seguir demonstra a parte Controladora, que tem o objetivo de determinar qual ser a Apresentao que ir ser mostrada ao usurio
que est logando.
Logar.java

package meupacote;
import java.io.IOException;
import javax.servlet . ServletException;
import javax. servlet .. http.HttpServletRequest;
import javax.servlet .http.HttpServletResponse;

Model-View-Controller e Data Access Object

397

import javax.servlet .http . HttpSession;


import j avax. servlet . RequestDispatcher;
public class Logar extends javax . servlet.http.HttpServlet
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException

response. setHeader ("Cache- Control", "no-cache, must-revalidate");


response . setHeader ("Pragma", "no-cache");
response.setHeader("Expires", "Fri, 25 Dec 1980 00:00:00 GMT");
String usuario = request. getParameter ("usuario") ;
String senha = request.getParameter("senha");
RequestDispatcher rd = null;
Usuario user = new Usuario( );t

user . setUsuario(usuario);
user.setSenha(senha);
if(user.verificaUsuario( ))(
HttpSession sessao = request.getSession( );
sessao . setAttribute ("USER", usuario);
rd = request.getRequestDispatcher("/logado . jsp");8
rd.forward(request, response);
else{
request.setAttribute("msg", "Usurio ou Senha invlidos");@)
rd = request. getRequestDispatcher (" /logar. j sp") ;

rd .forward(request, response);

_. __ . -

-'-._-'-~-,-

_.

----

'.

398

[IiJ Desenvolvendo Aplicaes Web com JSP...

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException
doGet(request, response);

Como esse Servlet faz o controle da aplicao, a explicao em si ser


feita nele.
O O Servlet verifica atravs da chamada ao JavaBean Usuario( )
enviando o usurio e a senha digitados no formulrio se eles so
vlidos. O mtodo verificaUsuario() que se encontra dentro do
JavaBean retoma um valor booleano, como voc mesmo pode
comprovar no arquivo Usuario.java .
O usurio sendo validado, aberta uma sesso e registrado USER.
O mtodo getRequestDispatcher(String path ) recebe como
parmetro o nome da pgina que ser visualizada. O mtodo
forward(request req, response res) se responsabiliza por redirecionar para o local desejado.
Em caso contrrio, haver o registro de uma mensagem, atravs
do atributo msg que fornecer informaes ao usurio que est
tentando logar na aplicao. Novamente h um redirecionamento
de recursos, mas nesse caso, para a pgina que contm o formulrio
para logar, uma vez que no obteve sucesso em sua entrada.

A VIEW

LOGADO.JSP

Essa View demonstra o que exibido caso o usurio faa a entrada de


dados com sucesso, recuperando a sesso criada no Servlet O :
logado.jsp
<%@ page language="java"

contentType=' text/html"

Model-View-Controller e Data Access Object [Ijl]

399

pageEncoding="ISO-8859-1"
session="true"
%>
<!DOCTYPE html PUBLIC
"-!lW3C//DTD XHTML 1.0 Transitional//EN"

''http: //www.w3.org/TR/

xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Usurio autenticado</title>
</head>
<body>
Seja bem vindo <%= session.getAttribute{"USER") %>0
</body>
</html>

importante lembrar que executar esses desenvolvimentos sem um


Framework altamente desaconselhvel. Um Framework rene em si as
melhores prticas de desenvolvimento, mas a escolha deve ser criteriosa,
caso no seja recomendado por grandes empresas como a prpria Sun
Microsystems .

O Padro DAO (Data Access Object)


Quando voc desenvolveu aplicaes usando JDBC, deve ter percebido
que colocar as instrues SQL em meio os scriptlets somados ao HTML
era uma situao confusa e desordeira.
Embora aquele mtodo funcione, no o melhor meio de se desenvolver aplicaes JSP. Pensando nessas situaes, os desenvolvedores passaram a adotar padres de desenvolvimento tambm para o acesso ao banco de dados. O padro DAO (Data Access Object) o padro mais utilizado para acesso a dados contidos em um banco de dados.
Sempre que voc precisa acessar um banco de dados que est mantendo seu modelo de objetos, melhor empregar o padro DAO. O Padro
DAO fornece uma interface independente, no qual voc pode usar para
persistir objetos de dados. A idia colocar todas as funcionalidades en-

400 lll Desenvolvendo Aplicaes Web com JSP...


contradas no desenvolvimento de acesso e trabalho com dados em um s
local, tomando simples sua manuteno.
Tipicamente um DAO inclui mtodos para inserir, selecionar, atualizar e excluir objetos de um banco de dados. Dependendo de como voc
implementa o padro DAO, voc poder ter um DAO para cada classe de
objetos em sua aplicao ou poder ter um nico DAO que responsvel
por todos os seus objetos.
No exemplo dado a seguir, voc dever ter a seguinte disposio das
classes:
8 ~ Java Resources: src
l .
meupacote

[D Livros.java
meupacote.dao
(lJ [D InterfacelivrosDAO. java
(lJ .. [D livrariaDAO.java
(lJ . [lJ livrariaDAOException.java
(tJ

se
:
:
.

S
.

e meupacote.util
(lJ

[D

ConnectlonllvrarlaFactory.java

: G:1 0 ConverteDate.java
8 e meupacote.web
~

[D

livrariaServlet.java

Figura 20.3

A Fbrica de Conexo
Para entrar nesse padro, voc primeiramente ir construir a classe de conexo, mostrada a seguir, que ficar dentro do pacote meupacote.util:
ConnectionLivrariaFactory . java

package meupacote.util;
import java.sql.Connection;
import java.sql.DriverManager;
impor t java.sql.ResultSet;
import java.sql.Statement;
import meupacote.dao . LivrariaDAOException;

Model-View-Controller e Data Access Object [lj]

401

public class ConnectionLivrariaFactory {


public static Connection getConnection( ) throws
LivrariaDAOException {
try {
Class. forName ("corn.rnysql.jdbc.Driver") ;
return DriverManager.getConnection(
"jdbc:mysql://localhost/livraria", "edson", "integrator")iO

catch (Exception e) {
throw new LivrariaDAOException(e.getMessage( ));

public static void closeConnection (Connection conn,? ~


Staternent strnt, ResultSet rs) throws LivrariaDAOException
close(conn, strnt, rs);

public static void closeConnection (Connection conn , Staternent strnt)


throws LivrariaDAOException
close(conn, strnt, null);

public static void closeConnection (Connection conn)


throws LivrariaDAOException
close(conn, null, null);

t) private static void close (Connection conn,


Staternent strnt, ResultSet rs)
throws LivrariaDAOException
try {

if (rs

!=

null) rs.close( ) ;

if (strnt != null)strnt.close( ) ;
if (conn != null)conn.close( ) ;
catch (Exception e) {

402 ll

Desenvolvendo Aplicaes Web com JSP...

throw new LivrariaDAOException(e.getMessage( }};

Essa classe bem simples cria apenas uma conexo e retoma o resultado

O para quem a chamar. .

Uma exceo ser lanada toda vez que houver um erro. A classe
LivrariaDAOException ser sua classe de excees.
Mtodos chamados de c1oseConnection( )
so criados para fechar
a conexo, o ResultSet ou o Statement. Isso ocorre com a chamada do
mtodo privado c1ose() .

Convertendo o Ano do MySQL


Em exemplos anteriores, voc viu que o ano no MySQL representado por
dois ou quatro dgitos, o que na prtica, usando a ponte JDBC voc no o
tem devidamente representado em seus aplicativos Java.
Para resolver esse problema, essa aplicao desenvolvida ter que ter
uma classe utilitria que converter na representao correta o ano no
MySQL, com quatro dgitos, de acordo com o proposto pela tabela livros:
ConverteDate.java
package meupacote.util;
import java.text.*;
import java.util.Date;
public class ConverteDate
public static String formatarData(String data} throws Exception
if (data == null
return null;

II

String dataF = null;


try {

data.equals("")}

(4)

Model-View-Controller e Data Access Object [liil)

403

DateFormat df = new SimpleDateFormat ( "yyyy' ) ;


Date date = (java.util.Date)df.pars e(data);
dataF = df. format (date) ;
catch (ParseException pe)
throw pe;
return dataF;

public static java.sql.Date formatarData(Date data) throws


Exception {
if (data == null)
return nu 11 ;
java.sql.Date date = null;
date = new java.sql. Date( data . getTime( ) );
return date;
publ ic static Date strToDate(String data) throws Exception {
if (data == null)
return nu 11 ;
Date dataF = null;
try
DateFormat dateFormat =
new SimpleDateFormat ("MM/dd/ yyyy") ;
long timestamp = dateFormat.parse(data) .getTime( ) ;
dataF = new Date(timestamp);
catch (ParseException pe)
throw pe;
return dataF;

404 lll Desenvolvendo Aplicaes Web com JSP...


Essa classe tem uma funcionalidade simples, usando a classe
SimpleDateFormat(String s) como j visto em exemplos anteriores. No caso,
o mtodo formatarData(String data)O tem basicamente o papel de receber a data tipada em String, trazida pela ponte JDBC no formato YYYYMM-dd e a converter para o formato YYYY do MySQL. Fica evidente que
isso s ser possvel porque o campo do tipo YEAR, do MySQL, ser representado em seu sistema, pelo Bean, usando o tipo String e no Date .

Personalizando as Excees
Haver alguns casos, como o da fbrica de conexes, que voc poder lanar uma exceo caso haja um erro. Para isso, uma classe ser feita, estendendo java.lang.Exception :
LivrariaDAOException.java

package meupacote.dao;
public class LivrariaDAOException extends Exception
public LivrariaDAOException( ) (

public LivrariaDAOException(String arg)


super (arg) ;

public LivrariaDAOException(Throwable arg)


super (arg) ;

public LivrariaDAOException(String arg, Throwable argl) (


super (arg, argl);

Model-View-Controller e Data Access Object [)il]

405

Perceba que voc poder tanto transmitir um texto para exceo, uma
exceo ou os dois ao mesmo tempo usando essa classe.
A classe LivrariaDAOException se encontra dentro do pacote
meupacote.dao .

O Bean Livros
Mas para se comunicar com o usurio e esse ao banco de dados, voc precisar criar uma camada. O JavaBean a seguir ser o usado para enviar e
retomar os dados.
Livros.java

package rneupacote;
public class Livros irnplernents java.io.Serializable{
private String isbn;
private String titulo;
private int edicao;
private String publicacao;
private String descricao;
public Livros ( ) {}
public Livros(String isbn, String titulo, int edicao,
String publicacao, String descricao)
this.isbn=isbn;
this.titulo=titulo;
this.edicao=edicao;
this.publicacao=publicacao;
this.descricao=descricao;

public void setIsbn(String isbn) {


this.isbn = isbn;

406

[IiJ Desenvolvendo Aplicaes Web com JSP...

public String getIsbn(


return isbn;

public void setTitulo(String titulo) {


this . titulo = titulo;

public String getTitulo( ) {


return titulo;

public void setEdicao(int edicao) {


this.edicao = edicao;

public int getEdicao( ) {


return edicao;

public void setPublicacao(String publicacao)


this.publicacao = publicacao;

public String getPublicacao ( ) {


return publ icacao;

public void setDescricao(String descricao) {


this.descricao = descricao;

public String getDescricao ( )


return descricao ;

Model-View-Controller e Data Access Object ril .407

Um JavaBean simples, seguindo o padro dos demais com getters e


setters. Note que nesse JavaBean o pacote meupacote apenas.
COMO CRIAR UM CONSTRUTOR PELO ECLIPSE

No Eclipse voc tem uma ferramenta muito boa, que o ajuda a criar um
construtor com todos os atributos.
No menu Source clique no item Generate Constructor using Fields.
Na caixa de dilogo Generate Constructor using Fields voc ter todos
os atributos da classe selecionados. Em Insert point, o padro Cursor
position. Se voc tem a preferncia de onde vai ficar o seu mtodo, selecione ali a posio. Caso seja onde o cursor est, apenas certifique-se de que
o seu cursor no est dentro de um mtodo, para que o cdigo no seja
gerado com erro.
~

Generale Conslruclor using Fietds

[~

Select super construttor to Irwo!s.e:

IObjectO

,y.1

:ielect fields to ntialize:

-, 0 D
0"
0"
'- 0
0"
D

~[

I
II t;le<eIect AI I
Irjl
II
I

Isbn
t~uIo

edlcao
public:acao
descricao

Select e,I

iI

I
lnsertion poilt:

ICursor

.'!'ll

poslion

Access moditier

0~

Oprotected Oddd

Oprlyote

..

DGenerote construttor ~omments

O Qmit c/ll to dei... constructor super()


lhe formol: 01 the construttors mar bo conliQu:ed 00 lhe Code Templtos pref.,ence page.

i 5 01 5 seIected.

(
Figura 20.4

OI<

II

Coneel

408 I\l

Desenvolvendo Aplicaes Web com JSP...

Manipulando a Tabela Livros


Agora, o problema criar os mtodos necessrios para encapsular as clusulas SQL, isolando assim em um ponto, gerando uma camada.
O DAO com os mtodos necessrios para a comunicao com o banco de dados:
LivrariaDAO.java

package meupacote.dao;
import java.sql.Connection;
import java . sql.PreparedStatement;
import java.sql . ResultSet;
import java.sql . SQLException;
import java . util .ArrayList;
import meupacote . Livros;
import java.util.List;
import meupacote.util.ConnectionLivrariaFactory;
public class LivrariaDAO implements InterfaceLivrosDAO
private Connection conn;
public LivrariaDAO( ) throws LivrariaDAOException{ 4)
try
this.conn = ConnectionLivrariaFactory.getConnection( ) ;

catch( Exception e )
throw new LivrariaDAOException( "Erro: " +
" : \n" + e.getMessage( ) );

Model-View-Controller e Data Access Object [)ilJ

409

public void salvar(Livros livro) throws LivrariaDAOException{ ~


PreparedStatement ps = null;
Connection conn = null;
if (livro == null)
throw new
Li vrariaDAOException ("O valor passado no pode ser nulo') ;
try {
String SQL = "INSERT INTO livros (isbn, titulo, edicao_num,
"ano-publicacao, descricao) " +
"values (?, ?, ?, ?, ?) H;
conn = this . conn;
ps = conn.prepareStatement(SQL};
ps.setString(l, livro.getIsbn( });
ps.setString(2, livro.getTitulo( }};
ps.setlnt(3, livro . getEdicao( )};
ps.setString(4, livro.getPublicacao( }};
ps.setString(5, livro.getDescricao( }};
ps.executeUpdate( };

"+

catch (SQLException sqle)


throw new
LivrariaDAOException("Erro ao inserir dados "+ sqle);
finally {
ConnectionLivrariaFactory. closeConnection (conn , ps};

public void excluir(Livros livro) throws LivrariaDAOException


PreparedStatement ps = null;
Connection conn = null;

{~

if (livro == null)
throw new
LivrariaDAOException ("O valor passado no pode ser nulo') ;
try {

410

[il] Desenvolvendo Aplicaes Web com JSP...


conn = this.conn;
ps = conn.prepareStatement("delete from livros where isbn=?");
ps.setString(l, livro.getIsbn( ));
ps.executeUpdate( );

catch (SQLException sqle) {


throw new
LivrariaDAOException ("Erro ao excluir dados:" + sqle);
finally {
ConnectionLivrariaFactory . closeConnection (conn, ps);

public void atualizar(Livros livro)

throws LivrariaDAOException"

PreparedStatement ps = null;
Connection conn = null;
if (livro == null)
throw new
LivrariaDAOException("O valor passado no pode ser nulo");
try (
String SQL = "UPDATE livros SET titulo=?, " +
" edicao_num=?, " +
"anoJ)ublicacao=?, descricao=? " +
"where isbn=?";
conn = this.conn;
ps = conn.prepareStatement(SQL);
ps . setString(l, livro.getTitulo( ));
ps.setlnt(2 , livro.getEdicao( ));
ps.setString(3, livro.getPublicacao( ));

Model-View-Controller e Data Access Object

Il 411

ps.setString(4, livro.getDescricao( lli


ps.setString(5, livro.getIsbn( lli
ps.executeUpdate( li
catch (SQLException sqlel
throw new
Li vrariaDAOException ("Erro ao atualizar dados: "+ sqle li
finally {
ConnectionLivrariaFactory. closeConnection (conn, psl i

public List todosLivros() throws


PreparedStatement ps = nulli
Connection conn = nulli
ResultSet rs = nulli

LivrariaDAOException{~

try {
conn = this.conni
ps = conn.prepareStatement ("select * from livros" li
rs = ps.executeQuery( li
List<Livros> list
new ArrayList<Livros>( li
while( rs.next( l l
String isbn = rs.getString( 1 li
String titulo = rs.getString( 2 li
int edicao = rs.getlnt( 3 li
String publicacao = rs.getString( 4 li
String descricao = rs.getString( 5 li
list.add( new Livros(isbn, titulo, edicao,
publicacao,descricao l li

return listi

412

[1jjIJ

Desenvolvendo Apl icaes Web com JSP...

catch (SQLException sqle) (


throw new LivrariaDAOException(sqle);
finally (
ConnectionLivrariaFactory.closeConnection(conn, ps, rs);

public Livros procurarLivro(String

isbn)~

throws LivrariaDAOException
PreparedStatement ps = null;
Connection conn = null;
ResultSet rs = null;
try (
conn = this.conn;
ps = conn.prepareStatement("select * from livros where
isbn=?");
ps.setString(l, isbn);
rs = ps.executeQuery( );
i f ( ! rs . next ( ) )
throw new
LivrariaDAOException( "No foi encontrado nenhum" +
" registro com o ISBN: " + isbn );

String titulo = rs . getString( 2 );


int edicao = rs . getInt( 3 );
String publicacao = rs.getString( 4 );
String descricao = rs.getString( 5 );
return new Livros(isbn, titulo, edicao,
publicacao,descricao ) ;

Model-View-Controller e Data Access Object !I

413

catch (SQLException sqle) (


throw new LivrariaDAOException(sqle);
finally (
ConnectionLivrariaFactory. closeConnection (conn, ps, rs);

Como voc pode perceber, o desenvolvimento do DAO simplesmente isolar todas as formas de acessar os dados em 1uma classe, concentrando assim a facilidade de manuteno.
Os mtodos criados aqui so:
O O construtor que inicia a conexo com o banco de dados;
A insero de dados passados pelo JavaBean Livros;
A excluso de dados passados pelo ISBN determinado;
O A atualizao de dados passados pelo JavaBean Livros;
O mtodo que retoma todos os dados encontrados na tabela Livros, retomando um List;
O mtodo que retoma os dados de um Livro apenas, utilizandose do Bean criado .

e
o
o

A Interface
Para finalizar, uma boa prtica de programao criar uma interface dos
mtodos desenvolvidos na classe LivrariaDAO. A seguir a listagem mostra a interface na integra:
InterfaceLivrosDAO.java

package meupacote.dao;
import java . util.List;
import meupacote.Livros;
public interface InterfaceLivrosDAO

-~.

--

..

_ ....

414

[iiilj Desenvolvendo Aplicaes Web com JSP...

void atualizar(Livros livro) throws LivrariaDAOException;


void excluir(Livros livro) throws LivrariaDAOException;
void salvar(Livros livro) throws LivrariaDAOException;
List todosLivros( ) throws LivrariaDAOException;
Livros procurarLivro(String isbn) throws

LivrariaDAOException;

Utilizando o DAO
Para comear a utilizao desse padro, o DAO, voc ir criar um sistema
simples, com a possibilidade de SELECIONAR, INSERIR, ATUALIZAR
e EXCLUIR dados da tabela livros.
Primeiro voc vai criar um Servlet que acessar o DAO, seguindo o
desenvolvimento de acordo com o Model2:
LivrariaServlet.java

<linhapackage meupacote.web;
import java.io . IOException;
import java . util.List;
import javax.servlet.RequestDispatcher ;
import javax .servlet.ServletException;
import
import
import
import

javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.HttpSession;
meupacote.Livros;

import meupacote . dao.*;

Model-View-Controller e Data Access Object [\]

415

public class LivrariaServlet extends javax . servlet . http.HttpServlet

protected void service(HttpServletRequest request,


HttpServletResponse response)
throws ServletException , IOException
String cmd = request.getParameter( "cmd" );0
if (cmd==nu11 )
cmd = "principal";e

InterfaceLivrosDAO dao;
Livros livro = new Livros ( );
i f (cmd! =nu11

II

! cmd. equalsIgnoreCase ( "principal") )

(e

livro . setIsbn( request. getPararneter ("isbn") ) ;


livro. setTitulo( request.getPararneter ("titulo") );

String edicao = request . getPararneter( "edicao");


if(edicao==null)
edicao="l";
livro . setEdicao( Integer .parselnt(edicao) ) ;
li vro. setPublicacao (request . getpararnet er ( "publicacao" ) ) ;
livro . setDescricao (request. getPararne t er ("descricao") ) ;

try

dao = new LivrariaDAO( );


RequestDispatcher rd = nu ll ;
i f (cmd. equalsIgnoreCase("listar") ) {
List livrosList = dao.todosLivros( );t)

416 Ill

Desenvolvendo Aplicaes Web com JSP...


request . setAttribute( "livrosList", livrosList

)i0

rd = request . getRequestDispatcher( "I


rnostrarLi vrosCads. j sp" );

else if( crnd. equalsIgnoreCase( "addliv" ) ) (


dao . salvar( livro ) ; ~
rd = request.getRequestDispatcher(

"LivrariaServlet?crnd=listar" );

else if( crnd .equalsIgnoreCase( "exc" ) ) (


dao.excluir( livro )i~

rd = request . getRequestDispatcher(
"LivrariaServlet?crnd=listar" );

else if( crnd. equalsIgnoreCase( "atu" ) ) (


livro = dao.procurarLivro(livro . getIsbn( )) ; C)
HttpSession session=request.getSession(true) i
session.setAttribute( "livro",livro )i

rd = request.getRequestDispatcher( "I
formAtuLi vro. j sp" );

else if( crnd .equalsIgnoreCase( "atualizar" ) ) (


dao.atualizar( livro )i~

rd = request.getRequestDispatcher(
"LivrariaServlet?crnd=listar" );

Model-View-Controller e Data Access Object


else

if(

ll 417

crnd.equalsIgnoreCase( "principal" 1 )(

rd = request.getRequestDispatcher( "/index.jsp" li

rd.forward( request, response

li~

catch( Exception e )
e.printStackTrace( );
throw new ServletException( e );

Primeiramente esse Servlet tem que captar o comando (representado


pelos caracteres crnd) para que seja decidida qual ao tomar de acordo
com a chamada O.
Caso o valor seja nulo, o comando alterado para uma String chamada principalf9.
A interface do DAO criada chamada, assim como o Bean Livros, no
trecho a seguir:
InterfaceLivrosDAO dao;
Livros livro = new Livros ( );

Fazendo isso, voc pode utilizar o DAO para executar a ao desejada, assim como utilizar o Bean para modificar alguma informao existente no banco de dados ou transmitir alguma informao passada pelos formulrios que voc ainda ir criar. De qualquer forma, os dados passados
devero ser recuperados. Isso feito usando o j conhecido

request.getPararneter(String s).

418

[1jjlJ

Desenvolvendo Aplicaes Web com JSP...

Na condio de no ser nulo o comando e ser diferente de principal@), os setters so chamados do Bean Livros e atribudos a eles valores
transmitidos, seja via formulrio ou no.
Dentro de um bloco try/catch, o dao instanciado a classe
LivrariaDAO( ), tornando-o pronto para uso de seus mtodos.
try
dao = new LivrariaDAO( )i

o comando inicial do pelo Servlet o listar. Caso voc transmita a


varivel crnd com o valor listar, voc dispara o bloco ir existente em try/
catch, chamando o mtodo todosLivros( )0, responsvel por retornar um
List contendo todos os dados existentes na tabela livros.
Esse List armazenado em um atributo requerido, e no uma session,
no qual se chamar IivrosList0.
Como j visto no exemplo dado em Model 2, anteriormente nesse
captulo, cada vez que um comando executado com sucesso, uma pgina
redirecionada. No primeiro caso a pgina rnostrarLivrosCadas.jsp
chamada pelo Servlet para exibir os dados pedidos.
O segundo comando listado o de adicionar dados. Nesse caso, os
dados sero transmitidos para serem inseridos no banco de dados. Os setters
criados anteriormente sero os responsveis por capturar os dados vindos
do formulrio. Ao transmitir o formulrio, esse, alm de chamar o Servlet,
dever enviar a query string crnd=addliv.
Ao ser verificado que para adicionar os dados, o Servlet chamar o
mtodo salvar(Livros Iivro)0, que transmitir os dados enviados por esse
formulrio. Mais uma vez, aps a chamada desse mtodo, uma pgina
redirecionada para mostrar os resultados dados pela insero:
request.getRequestDispatcber( "LivrariaServlet?cmd=listar" );

O terceiro comando listado no Servlet o de excluir. Caso o Servlet


receba a query string crnd=exc, o mtodo excluir(Livros livro)O cha-

Model-View-Controller e Data Access Object ~

419

mado para eliminar uma linha no banco de dados. Nesse caso, o ISBN do
livro, tido como chave primria, enviado para a chamada da excluso.
O quarto comando listado no Servlet o utilizado para atualizao de
dados. Nessa ao, primeiramente, o que voc, atravs dos exemplos anteriores bem j sabe, ter que trazer os dados para um formulrio, preenchendo-o e ento depois, envi-los para atualizao.
A situao ocorre da seguinte maneira:
Voc enviar a query string crnd=atu, que retornar uma session chamada livro, contendo os dados do livro transmitido pelo mtodo
procurarLivro(String isbn)G). A pgina forrnAtuLivro.jsp recuperar
essa session e preencher o formulrio.
O formulrio de atualizao enviar a query string crnd=atualizar,
transmitindo todos os dados do formulrio e chamando o mtodo
atualizar(Livros Iivro)0.
Em todo caso, caso no haja o envio de uma query string, a pgina
index.jsp chamada.
O mtodo forward(HttpServletRequest request, HttpServletResponse
response)4]) utilizado para redirecionar a pgina sempre que solicitada .

As Views
As pginas de resposta ao usurio o controle que esse tem sobre a aplicao desenvolvida. As pginas a seguir faro manipulao dos dados existentes na tabela livros utilizando a lgica exercida pelo Servlet criado.
MOSTRANDO OS LIVROS CADASTRADOS

Para trazer os livros cadastrados, voc criar a pgina a seguir:


mostrarLivrosCads.jsp
< %@ page

language= "java" contentType="text/html"

pageEncoding="ISO- 8859-1"
import="java.util. * , meupaco te.Livros ,
meupacote.util.Conver teDa te "
%>

420

Desenvolvendo Aplicaes Web com JSP...

<!DOCTYPE html PUBLIC


"-//W3C//DTD XHTML 1.0 Transitional//EN" ''http://www.w3 . org/TR/
xhtmll/DTD/xhtmll-transitional.dtd">
<html xrnlns=''http://www.w3.org/1999/xhtml">
<head>
<title>Trabalhando com DAO e Model 2</title>
</head>
<body>
<table border="l" cellpadding="2" cellspacing="O">
<tr>
<th>ISBN - Atualizar</th>
<th>Ttulo</th>
<th>Publicado em</th>
<th>Excluir Livro</th>
<Itr>
<%
List livrosList = ( List )request .getAttribute( "livrosList " ) ;0
for( Iterator i=livrosList.iterator( ); i .hasNext( ); )
Livros 1 = ( Livros )i.next( )iE9
%>
<tr>
<td>
<a href= "LivrariaServlet?cmd=atu&isbn=<%=1. getIsbn ( ) %>">6)
<%=l.getIsbn( )%>)
<Ia>
</td>
<td><%=l . getTitulo( )%></td>
<td>
<%= ConverteDate.formatarData(l .getPublicacao(
</td>
<td>

) ) %> ~

<a href=" LivrariaServlet?cmd=exc&isbn=<%=l.getIsbn ( )%>">G)

Model-View-Controller e Data Access Object [1jjl]

421

Excluir

<Ia>
</td>

<Itr>
<%
}II end for
%>
</table>
<br I>
<a href="formlnserindoDados .html">Adicionar um novo livro</a>
<br I>
<a href="index.jsp">Pgina Principal< / a>

</body>
</html>

Essa pgina listar o resultado vindo do atributo livrosListO, quebrando-os pelo loop for e os distribuindo ao JavaBean Livros8, imprimindo pelos mtodos getters?existentes nesse Bean.
A primeira coluna ter a exibio do ISBN, contendo um link ao Servlet
com a query string: crnd=atu&isbn=NMERO DO ISBN@). Clicando
nesse link, voc submete ao Servlet o ISBN do livro que deseja atualizar,
junto ao comando atu, que representa a chamada do formulrio de atualizao.
A impresso do ISBN, assim como os demais campos, so feitos pelos mtodos getters, j dito anteriormente, como getIsbn( )0.
Na impresso do campo publicao, voc ter que converter a data,
para que ela seja exibida no seu formato correto, ou seja, somente caracteres
de ano (YYYY). Isso feito pelo mtodo forrnatarData( String d )0 j
explicado na criao da classe ConverteDate( ).
Para excluir um livro, o Servlet novamente deve ser chamado, enviando dois comandos: exc e o ISBN do livro que deseja remover do banco
de dados. Para executar essa ao, a query string crnd=exc&isbn=ISBN
do LIVR00 transmitida para o Servlet para que esse execute o determinado.

422 I'il Desenvolvendo Aplicaes Web com JSP...


~

...

~hteH~a

Um detalhe importante que, antes de rodar essa aplicao, voc


deve ter o driver do MySQL no diretrio lib. Lembre-se de que,
sem isso, o banco de dados no ser acessvel, gerando um erro.

o arquivo web.xrnl dever ser algo como:


web.xml

<?xml version="l.O" encoding="UTF-8 "?>


<web-app version="2 . 4" xmlns=''http://java . sun.com/xml/ns/j2ee''
xmlns:xsi=''http://www .w3 . org/2001/XMLSchema-instance''
xsi:schemaLocation= '' http : //java.sun . com/xml/ns / j2ee http://
java.sun . com/xml/ns/j2ee/web- app_2_4.xsd">
<display-name>
MeuPrimeiroOao
</display-name>
<servlet>
<display-name>LivrariaServlet</display-name>
<servlet - name>LivrariaServlet</servlet-name>
<servlet-class>meupacote .web.LivrariaServl et< / servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LivrariaServl et</servlet - name>
<url-pat t ern>/Livrari aServl et</ur l -pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file- l ist>
<welcome-fi l e>
indexo jsp
</welcome-file>
</welcome-file-list>
</web-app>

Model-View-Controller e Data Access Object riI 423

Para trazer os livros cadastrados, simplesmente digite no seu navegador:


http://localhost:BOBO/TrabCamDAO/LivrariaServlet?cmd=listar

fi Trabalhando com DAO e r"lodel2 )(

<::> '7

(IJ

<8"

http://localhost:8080/TrabComDAO/livrariaServlet?cmd=listar

ISBN Atualizar

Ttulo

Publicado
em

Excluir
Livro

118==5-=7=39:::3:::-4:::::8=:6:::-7=-I=ID:..:o:,::mm
==an::.d:.:o:. .E::.:c~lip:.::s.:..
e _ _ _ _ _12007

I~
11=8=
5-=7=39=3:::-4=9=4=-8:....:If-=0:!:.p.::
en:.::O:.:ffi::c.:.:
e.. or~g.
:. : .2.: :.0-: - W
.: . :. n: . :.t::.
: er_ _ _ ~I~
118==5-=7=3=93=-=4=95=-=6~~I.:O~p.::en:.:O::.:ffi=c:..:e.:. o~
: . rg:. .:2:.:...:..0.::B.:as:..:e_ _ _ ~I~
185-7393-519-7 IDominando NetBeans
85-7393-536-7 Tom~~t - Guia Rapido do
Adrrurustrador
185-7393-543-X Dominando.AJAX

f
006
. = .I ~
2006

Excluir
---I

Adicionar um novo livro


Pgina Principal
Figura 20.5

Cadastrar Novos Livros


Aproveitando o DAO, voc vai criar um formulrio que ir cadastrar os
dados do novo livro que deseja armazenar:
for.mInserindoDados.html

< !DOCTYPE html PUBLIC "-//W3C // DTD XHTML 1. o Transitional // EN"


''http: //www .w3. org / TR/ xhtml1 / DTD/ xhtml1-transitional.dtd''>
<html xmlns=''http: //www . w3 . org /1999 / xhtml ">
<head>
<title>Trabalhando com DAO e Model 2< / title>

424 I\l Desenvolvendo Aplicaes Web com JSP...


</head>
<body>
<form action=" Li vrariaServlet ?cmd=addliv " method= "pos t" >0
<table>
<tr>
<td>ISBN:</td><td><input type="text" name="isbn" /></td>
<Itr>
<tr>
<td>Ttulo:</td><td><input type="text" name="titulo" /></td>
<Itr>
<tr>
<td>Edio:</td><td><input type="text" name= "edicao" /></td>
<Itr>
<tr>
<td>Publicao:</td><td><input type="text" name="publicacao" /
></td>
<Itr>
<tr>
<td>Descrio:</td>
<td><textarea name="descricao" rows="S" cols="2S"></textarea></
td>
<Itr>
<tr>
<td colspan="2">
<input type="submit" name="btCadastrar" value="Enviar" />
</td>
<Itr>
</table>
</form>
</body>
</html>

Note no detalhe do atributo actiou da tag <form />0 que o mesmo


Servlet ser chamado, mas que dessa vez com um parmetro . Isso est

Model-View-Controller e Data Access Object l)jlJ 425

sendo feito para que voc no tenha que criar um Servlet novo a cada ao
executada pelo usurio .

Atualizando Livros
Na listagem para mostrar todos os livros cadastrados, o ISBN tem um link
que possibilita atualizar as informaes da sua aplicao. Claro que, como
voc bemj sabe, antes precisa de um formulrio preenchido com os dados
anteriores. O formulrio a seguir demonstra exatamente isso:
for.mAtuLivro.jsp

<%@ page language=" j ava" contentType=" text/html"


pageEncoding="ISO-8859-1"
import="meupacote.util.ConverteDate"
%>
<!DOCTYPE html PUBLIC
"-/ /W3C/ /DTD XHTML 1. o Transitional/ / EN" ''http://www.w3 .org/TR/
xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>Trabalhando com DAO e Mode l 2</title>
</head>
<body>

<jsp:useBean id="livro" scope="session"


class=lmeupacote.Livros" />

<%
String publicacao = livro.getPublicacao( );~

%>
<form action=" LivrariaServlet?cmd=atualizar " method="post">8)
<table>
<tr>
<td>ISBN:</td>
<td>
<input type="text" name="isbn"
value="${livro.isbn}" readonly="readonly" />

426 l\I Desenvolvendo Apl icaes Web com JSP.. .


</td>
<Itr>
<tr>
<td>Ttulo:</td>
<td>
<input type="text" name="titulo" value="${livro.titulo}" I>
</td>
<Itr>
<tr>
<td>Edio:</td>
<td>
<input type="text" name="edicao" value="${livro.edicao}" I>
</td>
<Itr>
<tr>
<td>Publicao:</td>
<td>
<input type="text" name="publicacao"
value="<%=ConverteDate.formatarData(publicacao)%>" I>
</td>
<Itr>
<tr>
<td>Descrio : </td>
<td>
<textarea name="descr i cao" rows="S" cols="2S">
${livro.descricao}
</textarea>
</td>
<Itr>
<tr>
<td colspan="2">
<input type="submit n name="btAtualizar" value= "Atualizar" I>
</td>
<Itr>
</table>

Model-View-Controller e Data Access Object lI 427


</ forrn>
</body>
</html>

Olhando atentamente a pgina que mostra todos os livros cadastrados, quando um clique dado no link para chamar o formulrio de atualizao, o ISBN e o comando cmd=atu so enviados em uma nica query
string, possibilitando assim fazer com que o Servlet processe os resultados
exatos do determinado livro e os coloque em uma varivel de sesso, alm
de redirecionar para o formulrio exibido. Esse formulrio por sua vez,
captura essas informaes e as distribui pelo atributo value de cada campo.
Para que essa pgina pegue os valores resultantes na session armazenada
pelo Servlet, basta chamar <jsp:useBean /> O para trazer os dados encontrados no Bean Livros em um escopo de sesso. Como o ano da publicao
precisa ser tratado, ele separado nesse ponto@.
Com a query string cmd=atualizare voc diz ao Servlet que deseja
atualizar os dados que esto indo desse formulrio. De resto, o Servlet se
encarrega de chamar o mtodo da classe DAO e atualizar os dados enviados .

Percebendo as Mudanas
Embora voc possa achar muito mais trabalhoso fazer um sistema dessa
maneira, com certeza muito mais organizado e simples de ser aplicado
depois. Perceba o quanto mais simples se tornou o desenvolvimento. Com
o aperfeioamento pessoal em lgica, o cdigo pode se tornar menor, e
com certeza muito mais lgico se adotado um bom padro de desenvolvimento.

. .. ...
Captulo
a

21
JavaServer Faces

AVAS ERVER FACES UMA TECNOLOGIA DO MUNDO DE JAVA EE e desenhado


para simplificar o desenvolvimento de aplicaes Web.
JSF toma fcil o desenvolvimento atravs de componentes de interface
de usurio (GUI) e conecta esses componentes a objetos de negcios. Tambm automatiza o processo de uso de JavaBeans e navegao de pginas .

Configurando um Projeto JavaServer Faces


Para trabalhar com o JavaServer Faces, primeiramente ser preciso configurar os arquivos e a estrutura necessria.
Como voc est acompanhando esse livro, o container Servlet usado
o Tomcat 5.5, portanto faa download no endereo http://java.sun.com/
j2ee/javaserverfaces/download.html. Como voc ir trabalhar com
JavaServer Faces voltado para um container compatvel com a tecnologia
J2EE 1.4, voc dever baixar a verso JSF 1.1, a utilizada nesse livro .
Ao baixar o arquivo, simplesmente desempacote em um diretrio de
sua escolha.
R dois modos de voc tomar o JSF e as bibliotecas de JSTL disponvel para sua aplicao Web rodando no Tomcat. Ambos necessitam por
oito arquivos do tipo JAR que esto localizados no diretrio Iib de cada
distribuio descompactada, em um local que pode ser acessado pelo servidor ou pela aplicao Web:

430

[iil] Desenvolvendo Aplicaes Web com JSP...

Quatro JARs Commons:


1. commons-beanutils.jar
2. commons-collections.jar
3. commons-digester.jar
4. commons-logging.jar,
Dois JARs JSF:
1. jsf-api.jar
2. jsf-impl.jar
Dois JARs JSTL:
1. jstl.jar
2. standard.jar
No precisa dizer que tom-los disponveis em sua aplicao simples,
bastando apenas colocar esses arquivos listados e coloc-los dentro do
diretrio lib, encontrado em WEB-INF de sua aplicao Web.
Alternativamente, se voc tiver mais de uma aplicao construda com
JSF, voc pode pr os arquivos JARs em um local comum a essas aplicaes. Para o Tomcat, o local $CATALINA_HOME/common/lib (onde
$CATALINA_ HOME o local onde voc tem instalado o seu tomcat). Se
os arquivos JARs ficarem situados no diretrio common do Tomcat, todas
as aplicaes Web correntes no servidor de aplicao tem acesso a esses
arqUIvos.
Preste ateno em reiniciar o Tomcat caso voc coloque os arquivos
JARs no diretrio common, pois ele s os reconhecer aps essa execuo .

Trabalhando com JavaServer Faces no


NetBeans
Para criar o JavaServer Faces no NetBeans 5.5, basta iniciar a criao de
um projeto. Selecione em Categories o item Web e em Projects selecione
Web Application.
Na segunda etapa voc colocar o nome do projeto e, clicando no
boto Next, na terceira etapa, marque a opo JavaServer Faces em Select
the frameworks you want to use in your web application .

JavaServer Faces I'il

E New \'Ieb Applicatioll


5teps

I.

2.
3.

Choo.. Project
Nane anel locotion
Fr"",,,woric.

431
(g)

frameworks

Seled the frameworlcs you want to use in yoor web oppIicatlon.

~-UM.M
L
O
strut, 1.2. 9

Jav._

Foce, Corik}sation

JSF ServIet Nane:

p;.;;,s;".;i;t. . ___

o Validate _

O V.rly Object,

.. M

.... M

. .M

.. M M

. . . . . . .M

...... M

. . . . . . . . . . . . . . .M _. . . . . . . .

_..

........................._. __ . .. . . ._1

Figura 21.1

Em Servlet URL Mapping voc tem por padro a configurao /


faces/*, indicando que o acesso as aplicaes escritas em JSF sero antecipadas da palavra faces/, por exemplo:
http: //localhost:8080 /MeuPro jetoJSF / faces/ pagina.jsp.

No exemplo da imagem foi mudado para *.faces, ou seja, no acesso a


suas aplicaes escritas em JavaServer Faces, a extenso .faces teria que
ser escrito, por exemplo:
http:/ / localhost:8080 /MeuProjetoJSF /pagina.faces

Ao tenninar a configurao, basta clicar no boto Finish. O NetBeans


cria uma pgina JSP nonnal e uma outra, contendo um contedo pequeno
de JavaServer Faces, chamado de welcomeJSF.jsp.
Expandindo a opo Libraries voc ver que o NetBeans colocou
todas as bibliotecas necessrias para o desenvolvimento de JSF.

432 lI Desenvolvendo Aplicaes Web com JSP...

WebPages

~... ~

Configuration Files

r'--lC8 .Server Resources


OO_~ Source Pacl<ages

$-"~

$_.eJ)

Test Packllges
Libr aries

, $--:g,

JSF 1.1 - commons-beanutils.jar

~_ ..~

JSF 1.1 - commons-collections.jar

~ ....:g, JSF 1.1 - commons-digester .jar


~....:g, JSF 1.1 - commons-Iogging .jer

$--~ JSF 1.1 - jsf-api.jer

$-":g,

JSF 1.1 - jsf-impl.jar

$. . ~

JSTL 1.1 - stllndllrd.jar

$ ":g,

JSTL 1.1 - jstl.jar


JDK 1.5 (Default)

$ ... Q]
@.. ~

GJ-l

Bundled Tomcat (5.5.17)

Test lIbr aries

Figura 21.2

Desenvolvendo com JavaServer Faces no Eclipse


Desenvolver JavaServer Faces no Eclipse exige alguns passos a mais que
no NetBeans. A primeira coisa que voc dever fazer baixar o JavaServer
Faces Tools.
Entre no endereo http://www.eclipse.org/webtools/main.html. Para
baix-lo, clique no link Download Now:

OOl'lnload

WTP 1.5.2 (October 31,2006)


[}] Download novyL
[}] Release plan 'O

WTP2.0
[}] Project plan .

Ali Oownloads
[}] The complete list of downloads
is available here .

Figura 21.3

JavaServer Faces

433

Na pgina de downloads, desa a rolagem at a seo JavaServer


Faces (JSF). Clique no primeiro link e faa download.

Java Server Faces (JSF)

This module includes the complete set of plug-in to use and develop Java Server Faces (JSF),

Status Platform

ti

Download
wtP-jSf-R-1 . 52-2006~261841 . zip

Ali

Status Platform

ti

(md5)

Download
wtp-jsf-sdk-R-1.5.2-200610261841 ,zip (md5)

Ali

Status Platform

Download

ti

wtp-jsf-Automated-Tests-R-1 .5.2-200610261841 ,zip (md5)

Ali

Figura 21.4

Ao baixar o arquivo, descompacte-o. No seu Eclipse, v ao menu


Help e clique em Find and Install.

' @ Welcome

; Help Contents
. ljfJ Search
Dynamic Help
Key Asslst...
Ctrl+Shlft+L
Tips and Tricks .. .
Cheat Sheets .. .
Software Updates

About Eclipse SDK

Figura 21.5

Na caixa de dilogo Install/Update selecione a opo Search for


new features to install e clique no boto Next.

434 fiI Desenvolvendo Aplicaes Web com JSP...


~

InstalllUpdate

Feature Updates
Choose the WlJY Vou WlJnt to search for felJtures to install

o Search for updates cf the currently Installed features


Select thls optlon if Vou want to search for updates cf the features Vou already have instaUed.

o Search for new features to install


Select this option if vou want to install new features from exstinQ ar new update sites. Some sites may already be
available. Vou can add new update site URLs to the search.

(' ' < 6ack

'''j

Next

>

I,

flni,;h

";

Cancel

Figura 21.6

Na segunda opo da caixa de dilogo, clique no boto New Local


Site. Voc ir pegar o arquivo localmente, uma vez que j foi baixado da
Internet.

JavaServer Faces li'I 435


~ InstaI!

rE)

Update sites to visit

Select upd~te sites to visit while Iooking for new fe~tures .

Stes to include in search:


~'callistO-D
-is-cov-erY-S-ite-----------------'

~Eclipse Modeling Framework Technologies (EMFT) Updates


~ The Eclipse Project Updates

INew Remote Ste ... )


I

O
O ~ Visual Editor update site
O ~Web lools PI~tform (WTP) Updates

New Local Site ...

"J

lNew Archived Site .. J


Edlt ..

Remove

Import sites . .
Export sites .. .

o Ignore features not applicable to this environment


O Automaticaly select mirrors

< B<lck

Next.,,

m
]

Cancel

Figura 21.7

Selecione o diretrio onde voc descompactou o arquivo. Veja a imagem a segUIr:

436

l\jl] Desenvolvendo Aplicaes Web com JSP...

L7Jl.8)

Procurar pasta
Select a local update site.

ll1 myfaces
ll t3 myf aces-core-l.l. 4-bin

netbeans55-geral

ll1 pentaho_demo-1.2.0.398-RC2
ll I programas gravao OVO

I quem comprou meus livros


I RECYClER

e
e
e
ll e
ll

lCl

ResourceBundleEditor_vO.7.5
Ruby on Rails
System Volume Information
temp
wtp-jsf-R-1.5.2-200610261841

8 _
ll
ll
Pasta:

:l features
:l plugins

e_c_
lip_se_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _---'

L[

_..11,1[

Criar nova pasta

.............
O_K

Cancelar

..

Figura 21.8

Assim que surgir a caixa de dilogo Edit Local Site, confirme no


boto OK.

~ EdU local SUe


Name:
URL:

(g)

Iwtp-jsfR-1.5.2200610261841/eclipse
Ifile:/D:/wtp-jsf-R-l.5.2-200610261841/eclipsel
__
O_K_""j

Figura 21.9

Cancel

437

JavaServer Faces

Um novo item aparecer selecionado na caixa de dilogo Install.


Clique no boto Finish para concluir essa caixa de dilogo.

[gJ

,. Install

Update sites to visit


Select upd~te sites to visit while Iooking for new features.

Sites to include In seMch:

._--_..

O ~callisto Discovery Site


O ~ Eclipse ModeUng Framework lechnologles (EMFl) Updates

O
O
O

_._~

~ lhe Eclipse Project Updates


~ Visual Editor update site
~Web lools Platform (WlP) Updates
~ wtp-jsf-R-l.5 . 2-2006102618~1Ieclipse

.. __

....__. , - - - - - - ,
New Remote Site.. .

I
[ New Local Site.. . I
[ New Archived Site.. . I
Edlt ...

Remove

Import sites ...


Export sites ...

o Ignore features not app!icable to this environment


O Automaticaly select mirrors

< Back

Next

>

Finlsh

JI

Cantei

Figura 21.10

A caixa de dilogo Updates aparecer. Selecione o item que vai instalar


em Select the reatures to install. Clique no boto Next para prosseguir.

438
~

[\] Desenvolvendo Aplicaes Web com

JSPo oo

lEl

Updates

Search Results
Select fe<!ltures to inst<!lll from the se<!lrch result listo

Select the features to Insta0:

fi)

~r -------------------""'-----

'Ntp-jsf-R-lo502-200&10261841!echpse

Deseled Ali

0 000 Other
Morelrcfo
Propl'-fties

ISelect ReQUired I
(,ror Dettls, .

3 of 3 selectedo

o Show the latest verson of

11

feature only

O Filter features Included In other features on the list

Fi";;'-, I

Cancel

Figura 21.11

Na segunda etapa do assistente, selecione o item I accept the terms


in the Iicense agreements e clique no boto Next.

JavaServer Faces l\I 439

Feature license
Some of the features have license aoreements that vou need to accept before proceeding with the
installation.

~JavaServer Faces TooIing (JSF) P1 Eclipse Foundation Software User Agreement


~ JavaServer Faces Tooling DoclJlm March 17, 2005
~ JavaServer Faces Tooling O.5.1 .v Usage Of Content

~
"-

lHE ECLIPSE FOUNOATION MAKES AVAILABlE SOFTWARE,


OOCUMENTATION, INFORMATION ANO/OR OTHER MATERIALS FOR
OPEN SOURCE PROJECTS (COLLECTIVELV "CONTENT"). USE OF lHE
CONlENT IS GOVERNEO BV THE TERMS ANO CONOITIONS OF THIS
AGREEMENT ANO/OR THE TERMS ANO CONOITIONS Of LICENSE
AGREEMENTS OR NOTICES INOICATEO OR REFERENCEO BELOW. BV
USING lHE CONTENT, VOU AGREE THAT YOUR USE OF THE CONTENT
I IS GOVERNEO BY THIS AGREEMENT ANO/OR lHE TERMS ANO
CONOITIONS Cf ANV APPLICABLE LICENSE AGREEMENlS OR NOTlCES

II"'TERMS
ICATEO
""'U 00ANO''''THE' ' 'TERMS
' ' m ANO
'"'
ANO ORREFERfNC'''noW.
CONOITIONS OF THIS AGREEMENl

,<[1"'"

UI

,)'

CONOITlONS OF ANV APPLICA8LE LICENSE AGREEMENlS OR NOTlCES


INOICATEO OR REFERENCEO BELOW, lHEN VOU MAV NOT USE THE

,v

o I accept the terms in the license aJreements


O I do not accept the terms in the kense agreements

< Back

I'

Next

>

Cancel

Figura 21.12

Na prxima etapa voc confirma a instalao e clica no boto Finish


para instalar.

440

lljjl] Desenvolvendo Aplicaes Web com JSP...

r8)

'= InstaI!
Installation
The foDowing features will be installed. Vou can select a Feature and change the location where the
Feature wUl be instaned.
Features to in>tal:
Feature Name
C$ Javaserver Faces 1:;...

: Feature Size ' Installation Directory

Feature Vetsion

O.~20~ .. :--~ n -

~ Java5erver Faces To ... O.5.l.v20060829-FX'\5.. .


~ Javaservet Faces To .. . O.5.0.v20060629------...

Install Location:

/c:j';Opseweb/ -

lklI<nown

IC:lec6psewebl

I.k1Icnown

IC:leclipsewebl

UnI<nown

Free spate:

5,4 GB

""

IChange Location . .1

C:\edipseweb

Required space:

.----

<: Back

t Ne~t

>

Finish

jI

Cantei

Figura 21.13

Update Manager
Installing plug-in "org.eclipse.jst.j . de/metadataJ)rocessingJramework.html

1Run in Background J I

Cancel

I [ Details >>

Figura 21.14

Aps terminar a instalao, uma caixa de dilogo surgir, pedindo


para que seja reiniciado o Eclipse. Confirme no boto Yes. Assim que o
Eclipse for reiniciado, voc poder trabalhar com o JavaServer Faces Tools.

JavaServer Faces ljl]

441

lRl

~- InstalUUpdate

lt is recommended yoo restart the Ecipse SOl< for the changes to t<'!ke effect,
bt.A: it may be possible to apply the changes to the current configuration
without restarting. Would yoo like to restart now7

Ves

..~

L.I_No_--JII Apply Changes I

Figura 21.15

Seria muito feliz em dizer que apenas isso, mas existem mais alguns
passos . V ao menu Window e clique em Preferences. Na caixa de dilogo Preferences, expanda o item Web and XML e selecione o item JSF
Libraries. Clique no boto New.

Preferences

Itype filter text

'

1iJ He!p
&! Instal/Update

ltJ Internet

Server

Team

JSF lilx'aries
JSF Lhories cortain jors with JSF c~ and tao lbraries. Some JSF Libaries (ao be
specialy mari<.ed as Inpiementatlons $O that the WebApp cao be exeated.
Oefined JSF Librarles:

&! .Java
til PIug-in Oevelopment
(jJ RLn/OebuQ
(jJ

(E)

fiJ I!!I\ JSF Imp [irnplementation .. defauIt]

New ...

EdL.

, Valdation

l WebandXl't.
ql C55 Fies
iil DTO Files
(jJ HTr-LFiles
ltJ JavaSc,ipt Files
JSF F",esConfi9 UI
JSFLh",ies
JSF V.tidation
W JSPFiles
Task Taos
WSOLFiles
XI't. CatalcQ
ql XI't. Files
XI't. Schema Files
~ Web Se,vice>

1__fiJ
__~_._x._O...oc
__I_et
.....____.....____..~
-".L_. _ _ _ ....._ _ _._......__

............__.__ .... _ .................._ ................................................__._.... _ _

OK

11

Cantei

Figura 21.16

i.

_J _____ . . . _. _____ . . _. . .

~_~_~_........

__ . . . _

442 llI

Desenvolvendo Aplicaes Web com JSP...

A caixa de dilogo Create JSF Implementation Library ir surgir.


Digite o nome que deseja em Library Name, selecione a verso suportada
em Version Supported e clique no boto Add para adicionar as bibliotecas pertencentes ao JavaServer Faces. Nesse caso, adicione apenas os arquivos jsf-api.jar e jsf-impl.jar. Marque a opo Is JSF Implementation.
Clique no boto Finish para completar.

~ Create JSF Implementation Library

r.g)

JSFLibrary
(reate a lbrary of jars that make up a JSF implementatlon library.

Lbrary Name:

IJSF Imp

Version Supported: I,--~_


i-~_-i-_ _ _ _ _ _ _ _ _
-"'_--_-_-_-.-._--_-._-_---'(.;J
"""~]
Lbrary Jars

j jsf-api.jar - D:/libsfJSF

ajsf-impl.jar - D:/libsfJSF

G:::i 15 J5F Implementaton

Finish

Cancel

Figura 21.17

Novamente na caixa de dilogo Preferences no item JSF Libraries


clique no boto New. Digite o nome para a biblioteca, que no caso se trata
das bibliotecas Commons, que voc ir adicionar. Clique no boto Finish
para concluir.

JavaServer Faces l'iI

443

rgJ

~ Create JSF library


JSFLibrary
Create a library of jars that make up a JSF component library.

Library ~me:

~erslon Supported:

ICommon JSF

~==================~
..=,,=a1

L I_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Ubrmy ;!ars

lj commons-beanutils .jar - D:/libs/JSF


lj commons-coUections.jar - D:~ibs/JSF
lj commons-digester .jar - D:/6bs/JSF
lj commons-Iogging.jar - D:~ibs/JSF

OIs JSF lmplemertation

Figura 21.18

Mais uma vez clique no boto New. Na caixa de dilogo Create JSF
Library digite o nome das bibliotecas que ir adicionar, que no caso agora
ser o JSTL. Clique no boto New e adicione as duas bibliotecas JSTL.

444

[liJ Desenvolvendo Aplicaes Web com JSP...

l8J

~ Create JSF library


JSFLibrary
Create a library of jars that make up a JSF component library.

Library Name:
I/ersion Supported:

I:=J=T
S =L==============================~

IL________________:=~=::J~!I

Library Jars

(j jstl.jar - D:/libs/JSTL
(j standard.jar - D:/libs/JSTL

OIs JSF Implementation

Finish

Cancel

Figura 21.19

Por fim voc ter uma tela similar mostrada na imagem a seguir, em
Preferences. Confirme a caixa de dilogo clicando no boto OK.

JavaServer Faces I}il] 445


~

- @rg)

Preferences

Itype filter text


Help
W InstanfUpdate
Internet
Cil Java
li) PIuQin Oevelopment
li)

i
6j

JSF Llbraries cont~n jars with J5F components and ta~ lbrarles. Some JSF Libarles eM be
specialy marked as implementatlons . 0 that the WebApp eM be executed.
Defined JSF Libr.rle.:

".

13

a\ JSF Imp (inplementation - default]

O jsf-api.jar - O:nibs/JSF/jsf-api.jar
O jsf-impI.jar - O:~s/JSF/jsf-impl.jar

. Run/DebuQ
li) 5erver

liJ Team

!
;

ffi
ffi

Validation
WebMdXML
f:t) C55 Fies
DTO Files
ll3 HTI'l. Files
ffi Java5cript File.
JSF F.cesConfig UI
JSF Librarles
JSF V.nd.tion
:i.l J5P Fies
i. TaskTaQs
W5DL Files
XML C.talo
li) XML Fies
XML 5chem. Files
Web Services
XOoclet

, ' ..;,.

JSF Ubraries

13

O convnons-beanutls.jar - D:/1lls/J5F/commons-beanutils.jar
O convnons-colledions.jar - D:/libs/JSF/commons-coRedions.jar

New ...

a\

Remove

)
)

[ Make Default

Edit ...

; . Ll
bJ

1,1

a\ Convnon JSF

I
I
I

commons-diQester.jar - D:/lbs/JSF/commons-diQester.jar
O convnons-i0cJ9in9.jar - D : ~s/JSF/commons-Ioo<.iino.jar
JSTL
O jstl.jar - D:nib./JSTL/jstl.jar
O standard.jar - O:/libs/J5TL/standard.jar

-Y'i

I i

OI(

Cancel

Figura 21.20

Inicie a criao de um novo proj eto Web, em Dynamic Web Project.


Na segunda etapa do assistente, marque a opo JavaServer Faces.
Clique no boto Next e depois em Next novamente.

-~-~~-

---'--~--

--

446

[lilJ Desenvolvendo Aplicaes Web com JSP...

LEl

f: New Dynamic Web Project


project Facets
En~bles

----:

the project to be deployed with JSF capabilities.

Configurations:

/,

<custom>

Facet_ _ _ _
-Project
21 Dynamic Web Module

_.

[ Version

2lGV

Java

2.4 .. .
5.0 .. .

O ltl

WebDoclet (XDoclet)

1.1
1.2.3 ...

o ~ .ti9@M'i;ti4i

11

I, tNlete

Save

-.

-.-

I < < Show Runtimes I


-

.._. __..

..

< Back

11

Next>

II

Finish

JI

Cancel

Figura 21.21

A nova etapa que aparece antes da instalao de JavaServer Faces


Tools no existia. Agora voc precisa configurar os arquivos para funcionar o JavaServer Faces. Note que diferente do NetBeans que j vem com
tudo instalado e configurado. Porm isso demonstra flexibilidade, onde
voc pode utilizar o JavaServer Faces padro da Sun ou de terceiros.
Na ltIma etapa tudo o que voc tem que fazer adicionar as bibliotecas Commons e JSTL. Na opo URL Mapping Patterns voc j tem a
opo *.faces. Caso queira fazer como no NetBeans, o boto Add abre
uma pequena caixa de entrada, chamada de Specify URL Pattern, onde
voc pode introduzir o novo formato. Clique no boto Finish para terminar
o assistente de criao de um novo projeto.

JavaServer Faces [liil] 447


~ New Dynilmic Web Project

rg)

JSF Capabilities
Add JSF capabmties to this Web Project

JSF Librarles:

lmplementation Library

Deploy jars to WEB-INF/lib

-"v""'1 1New .. 1

ILJs_F_Im
....:p_<_o_ef_du_lt_> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
CompooenI: Librarles

Oeploy Library Name


C ommon JSF
JSTL

0-

JSF Confi9lJl'ation FUe: I /WEB-INF{faces-confiQ.xml


JSF Servlet Name:

URL

~no

Patterns:

IFaces Servlet

__~
~

~=====================1
Ja_c_
es_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _----'

ILO.__

1---;;;; -

< Back

Finlsh

1I

Rer;\ve

Cancel

Figura 21.22

Criando um Exemplo Simples para Comear


Assim que configurado, voc apenas precisa criar um exemplo para comear a entender como funciona o JavaServer Faces.
O JavaServer Faces que voc ir criar um campo de envio de nome.
bem simples e enviar apenas o nome que voc digitar. Caso voc digite
com um valor no alfabtico, ele retomar um erro.
Caso retome o erro, alm de manter preenchido o campo onde voc
digita o nome, tambm mostrar uma mensagem, avisando do erro.

--

- --

--

-"

-'

448 lrI Desenvolvendo Aplicaes Web com JSP...

No

DIRETRIO

WEB-INF

No diretrio WEB-INF, voc dever colocar os JARs indicados anteriormente. Alm do arquivo web.xml (deployment descriptor) padro, voc
ir acrescentar um outro arquivo, chamado de faces-config.xml.
Inicialmente apenas o arquivo web.xml ser alterado:
web.xm1

<?xrnl version="l. O" encoding=HUTF-8"?>


<!OOCTYPE web-app PUBLIC
/Sun Microsystems, Inc. /lOTO Web Application 2.3/ /EN"
java.sun.com/dtd/web-app_2_3.dtd">
<web-app id= "WebApp_ID" >
<display-name>OesJSF</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>l</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
H _

"http: / /

/>
elemento
< s erv Ie t - c/ as s
declara
javax.faces.wt:.Japp.FacesServlet fazendo com que seja carregado inicialmente. O Servlet mapeado no contexto pelo elemento <url-pattern I>
para que qualquer aplicao tenha uma extenso .faces. Mai~ ,!diante voc
conhecer o arquivo face-config.xml , responsvel pf"l configurao da
sua aplicao Web escrita em JavaServer Faces.

JavaServer Faces [IiI]

ij

449

Se voc est cri ando esses exemplos usando a IDE NetBeans


ou o Ecl ipse, esse arquivo j estar alterado.

o JAVABEAN
o JavaBean mostrado a seguir ser o responsvel pela comunicao entre a
pgina inicial, que voc digitar o seu nome em um formulrio, e a pgina
que resultar na mensagem de boas vindas, caso seja enviada a pgina inicial com sucesso.
MeuBean.java

package meupacote;
import javax.faces.application.FacesMessage;
import javax. faces .context . FacesContext;

public class MeuBean {


private String nome = null;
public void setNome(String nome)
this.nome = nome;

public String getNome( ) {


return nome;
public String acao( ) {()
boolean sucesso = true;
FacesContext context =
FacesContext . getCurrentlnstance( );~

if (nome != null) {
for (int i = O; i < nome.length( ); i++)
char c = nome.charAt(i);
if (!Character.isLetter(c) &&

450 llI

Desenvolvendo Aplicaes Web com JSP...


!Character.isSpaceChar(c))
String msg=
"Digite somente caracteres alfabticos.";
FacesMessage message

new FacesMessage(msg);~
context.addMessage("fonnulario", message);

sucesso = false;
break;

else
sucesso = false;
return (sucesso? "sucesso"

"falha") ;

Esse Bean, comum como outros j vistos, tem um mtodo especial


chamado de acao( )0, que tem duas responsabilidades:
Inicialmente ele verificar se o nome transmitido no um caractere
literal- atravs do mtodo isLetter( ) - e se no um espao - atravs do
mtodo isSpaceChar( ).
Com a instncia de FacesContextf) voc obtm todas as informaes de estado por requisio usadas para o processamento de um pedido
JSF. O mtodo getCorrentInstance( ) obtm a instncia atual da classe
FacesContext.
Para adicionar uma mensagem, a classe FacesMessagef) representa
uma nica validao ou mensagem que tipicamente associada com um
componente particular na view.
Para adicionar a mensagem, o mtodo addMessage( ), da instncia
FacesContext, chamado. A mensagem anexada est associada ao componente UI, se o componente no for nulo .

JavaServer Faces li'I

451

Em outras palavras, caso o valor digitado no seja transmitido corretamente, uma mensagem retomada. Note o return no fi nal do mtodo,
onde uma String transmitida em caso de sucesso ou em caso de falha .
Essa String o objeto de navegao do exemplo. Essa navegao feita
pelo arqui vo faces-config.xml.
faces-config.xml

<?xml version="l.O " encoding= "UTF-8"?>


<!DOCTYPE faces-c onfig PUBLIC
"- // Sun Microsystems , Inc . // DTD JavaServer Faces Config l.l // EN"
''http: // java . sun.com/ dtd /web-facesconfig_l_l.dtd''>
<faces-config>
<managed-bean>
<managed-bean-name>

MeuBean
</managed-bean-name>
<managed-bean-class>

meupacote.MeuBean
</managed-bean-class>
<managed-bean-scope>

session
</managed- bean-scope>
</managed-bean>
<navigation-rule>
<fram-view-id>/trabComJSF.jsp</fram-view-id>
<navigation-case>
<fram-outcame>sucesso</fram-outcame>
<to - view- id>/boasVindas.jsp</to-view- id>
</navigation-case>
<navigation-case>
<fram-outcame >falha</fram-outcame>

452

ljl] Desenvolvendo Aplicaes Web com JSP...


<to-view-id>/trabComJSF.jsp</to-view-id>

</navigation-case>
</navigation-rule>

</ fa ces- config>

o arquivo faces-config.xmI bem simples de compreender. Primeiramente voc tem um elemento, chamado de <managed-bean I>, que voc
configura o nome do JavaBean, a classe desse Bean e o escopo (no caso
session) .
No elemento <navigation-rule I>, voc tem um elemento chamado
de <from-view-id/>, que determina a pgina vista inicialmente na sua aplicao.
O elemento <navigation-case /> determina qual a pgina dever ser
exibida. Caso receba uma mensagem, seja de sucesso ou de falha, o elemento <from-outcome /> acionado, verificando-se a palavra existente
entre esse elemento. A pgina que ser exibida determinada atravs do
elemento <to-view-id I>.
'.' faces-config.xml

=El

trabComJSF

li

boasVindas

...
11

~ ----ssucesso--........~ ~

falha

IJ

Introduction Overvlew INavigation Rule JManagedBean Component Others Source

Figura 21.23 - Representao do arquivo faces-config.xml pelo Eclipse.

o FORMULRIO QUE ENVIAR O NOME


Para que essas regras funcionem, primeiro voc tem que criar a pgina que
submeter os dados digitados e exibir a mensagem de erro:

JavaServer Faces

453

trabComJSF.jsp
<%@ page language=Hjava"
contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<~o@

taglib uri="http://java. sun.com/jsf/html"


prefix="h"%>

<%@ taglib uri="http://java.sun.com/jsf/core"


prefix="f"%>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1. o Transitional//EN"

''http : //www .w3 . org/TRI

xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=''http://www.w3 . org/1999/xhtml''>
<head>
<meta http-equiv="Content-Type" content=" text/html; charset=ISO8859-1" I>

<title>Meu Primeiro JSF</title>


</head>
<body>
<f:view>
<h: fOIlll id=lfoIlllulario">O
Digite seu nome:
<h: inputText id="nome"
value="#{MeuBean.nome} 11
required="true" 1>$
<h:commandButton
action="#{MeuBean.acao} 11
value=IEnviar"
id="submit" 1>6)
<br I>
<h:messages I>C)

454

Desenvolvendo Aplicaes Web com JSP...

</h:form>
</f:view>

</body>
</htrnl>

Assim como ocorre com outras bibliotecas de tags, o JavaServer Faces configurado atravs da diretiva taglib, onde existem as bibliotecas
que manipulam o HTML e a Core.
Para usar as tags personalizadas que representam componentes
JavaServer Faces, voc precisa das duas diretivas taglib mostradas a seguir, geralmente posicionadas no topo de cada pgina JSP, como de costume no uso dessa diretiva.
<'Yo@ taglib uri=''http://java. sun. com/jsf/htm1"
prefix="h"%>
<'Yo@ taglib uri=''http://java.sun.com/jsf/core''
prefix="f"%>

Todas as tags personalizadas, que representam os componentes JSF,


devem estar includas nas tags <f:view I> da biblioteca Core.
Dentre as tags JSF adicionadas na pgina, a tag <h:form 1>0, representa um componente UIForm e cria um formulrio para envio de dados
pelo JSF. Note o atributo id com o valor formulario, que usado no mtodo acao( ) do JavaBean criado anteriormente para determinar o local onde
ser exibida a mensagem de erro, se houver.
A tag <h:inputText I>e, representando um componente UIInput que
aceita valores de entrada, a responsvel pela gerao da caixa de texto que
receber o nome a ser digitado. O atributo id, com o valor nome, determina
o nome desse componente que, na renderizao, se toma o nome da caixa de
texto. No atributo value voc tem o EL referente ao Bean criado, dando
assim a voc o retomo garantido do valor digitado em caso de erro, ou melhor, o valor enviado retomado a caixa de texto preenchendo o atributo
value do HTML gerado. O atributo required,com o valor booleano true,
voc diz ao container que esse campo obrigatrio em seu preenchimento.

JavaServer Faces [)ilJ

455

Com a tag <h:commandButton 1>6), representando o componente


UICommand, voc cria o boto de envio, determinando sua execuo no
atributo action, que por sua vez chama o mtodo acao( ) existente no
JavaBean MeuBean. Com isso, a pgina direciona seus dados conforme
trabalho do mtodo. O atributo id determina o tipo de boto que voc est
criando e o atributo value o rtulo para o boto (como ocorre no HTML
como voc j conhece).
Por fim voc tem a tag <h:messages 1>0 que resulta em mensagem
trazidas pela API do JSF ou pela JavaBean configurado.

A PGINA

QUE RESULTA NO SUCESSO DO ENVIO

A pgina a seguir mostra o nome que voc enviou e que somente exibida se for bem sucedido o envio:
boasVindas.jsp
<%@ page language="java"
contentType="text/html"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http: // java.sun.com/ jsf / html" prefix="h"%>
<%@ taglib uri="http://java . sun.com/ jsf/core" prefix="f"%>
<!DOCTYPE html PUBLIC
"- I!W3C// DTD XHTML 1.0 Transitional // EN"
xhtml1/DTD/xhtml1-transitional . dtd">

''http: //www .w3.org/TR/

<html xmlns="http: //www . w3 . org /1999 /xhtml">


<head>
<title>Trabalhando com JSF< / title>
</head>
<body>
<f:view>
Ol <h:outputText value=I#{MeuBean.nome}"!> <br />
</f:view>
</body>
</html>

456

~ Desenvolvendo Aplicaes Web com JSP...

A sada do nome, como resultado positivo, vindo do Bean, feito pela


tag <h:outputText I>.

=El

l' r''leu Primeiro JSF X

<> ...

111 ~

Ihttp://localhost:8080/TrabComJSF/trabComJSF.faces

=:J I Enviar I

Digite seu nome: r~?~.~~.~?~9~!~~_~..

Digite somente caracteres alfabticos.

Figu ra 21.24 - Um erro sendo gerado no envio do nome .

Conhecendo Melhor o JavaServer Faces


Agora que voc j fez sua primeira aplicao em JSF, mais fcil de entender os servios que o framework JSF oferece ao desenvolvedor. Como
voc pde ver, o framework JSF responsvel por interagir com o usurio
(cliente), e fornece ferramentas para criar uma apresentao visual , a aplicao lgica e a lgica de negcios de uma aplicao Web. Porm, o escopo de JSF restringido camada de apresentao. A persistncia de banco
de dados e outras conexes de back-end esto fora do escopo de JSF.
Para melhor compreenso, a seguir voc tem um resumo de como
funciona as pginas JavaServer Faces:
A ARQUITETURA MODEL-VIEW-CONTROLLER

JSF conecta a apresentao e ao modelo. Como voc viu, um componente


de apresentao pode ser unido a uma propriedade Bean de um objeto
modelo:
<b :outputText value=I # {MeuBean.nome }"/ >

JavaServer Faces [)J 457

Alm disso, JSF opera como o controlador (controller) que reage ao


usurio processando a ao e os eventos de alterao de valores, enquanto
dirige o cdigo para atualizar o modelo ou a apresentao. Por exemplo,
voc invocou o mtodo acao( ) para conferir se um usurio havia digitado
apenas caracteres alfabticos e fez isso usando:
<h:commandButton
action="#{MeuBean.acao}"
value="Enviar"
id="submit" />

Quando o boto clicado e o formulrio enviado (submetido) ao


servidor, a implementao JSF invoca o mtodo para checar o bean do
usurio. Aquele mtodo pode entrar em ao arbitrria para atualizar o
modelo e devolver para a navegao o ID da prxima pgina a ser exibida.
CONVERSO DE DADOS

Usurios entram com os dados em um formulrio Web como texto. Os


objetos de negcios querem dados como nmeros, datas ou outros tipos de
dados. JavaServer Faces pode personalizar a regra de converso.
VALIDAO E MANIPULAO DE ERROS

JSF faz isto com regras de validao para campos como "este campo
obrigatrio". Claro que, quando os usurios entrarem com dados invlidos,
voc precisa exibir mensagens de erros mais apropriadas. Como j fora
feito anteriormente no exemplo dado.
String msg = "Digite somente caracteres alfabticos." i
FacesMessage message =
new FacesMessage(msg) i
context. addMessage ("formulario", message) i

_~-._~

_ _ _ _ _ _ _ _ ------"-___

__

~'~L"'

__

'

.~.

_._.,_

458 l\I

Desenvolvendo Aplicaes Web com JSP...

INTERNACIONALIZAO

JSF fornece suporte a internacionalizao como codificaes de caractere


e a seleo de pacotes de recursos.
COMPONENTES CUSTOMIZADOS

o desenvolvedor de componentes pode criar componentes sofisticados que


so chamados pelos designers simplesmente arrastando para suas pginas.
Alm disso, por padro, JSF produz HTML em sua sada, mas extensvel o suficiente para produzir outros tipos de sadas. Com todas essas
situaes, de se entender porque esse framework vem sendo apontado
como o melhor do mercado em matria de desenvolvimento OUI para Web
em aplicaes escritas em Java .

As Tags Padres de JavaServer Faces


Desenvolver em JavaServer Faces, como voc j pode perceber, requer
conhecimento em suas tags, o que determina sua utilizao . A seguir voc
ter um resumo dessas tags.

JSF TAGS HTML


A biblioteca de tags HTML contm elementos de ao que representam
componentes de JSF associados com renderers que trabalham como os elementos HTML. A maioria das aes nesta biblioteca representa um componente HTML padro que fornece uma interface com mtodo assessor
para a combinao das propriedades do tipo de componente genrico e os
atributos suportados pelo renderer associado .
Essas tags podem ser chamadas atravs da diretiva taglib existente
em uma pgina JSP:
<%@

taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

JavaServer Faces l\I 459

Como voc pode notar, a biblioteca HTML do JSF chamada pela


URI:
http://java.sun.cam/jsf/html

E que contm o prefixo padro h.


A tabela a seguir demonstra as tags HTML de JSF:

Tabela 21.1 - Tags HTML do JSF


Tag
Form

Descrio
Um formulrio HTML

inputText

Um caixa de texto de entrada: <input type="text" I>

inputTextarea

Uma caixa de texto de mltiplas linhas: <textarea I>

inputSecret

Uma caixa de texto de senha: <input type="password" I>

inputHidden

Campo oculto: <input type="hidden" I>

outputLabel

Rtulo de um determinado campo: <Iabel/>

outputLink

ncora HTML: <a I>

outputText

A sada de texto em uma nica linha

outputFormat

Como outputText, mas com formatos

commandButlon

Boto (submit, reset, or pushbutlon): <input type="submit" I>

commandLink

Link com ao como um pushbutton

message

Mostra a mensagem para um componente

messages

Mostra todas as mensagens

graphiclmage

Mostra uma imagem : <img I>

selectOneListbox

Caixa de listagem

selectOneMenu

Menu de seleo

selectOneRadio

Boto de rdio

selectBooleanCheckbox

Checkbox

selectManyCheckbox

Multiplos checkboxes

selectManyListbox

Multi-seleo da caixa de listagem

selectManyMenu

Multi-seleo de menu

panelGrid

Tabela HTML: <table I>

panelGroup

Dois ou mais componentes que so dispostos como um

dataTable

Tabela preenchida com informaes vindas de uma persistncia


de dados

column

Coluna em um dataTable

460

Desenvolvendo Aplicaes Web com JSP...

ATRIBUTOS SUPORTADOS PERTENCENTES AO

HTML

As tags HTML JSF suportam a maioria dos atributos que a especificao


do HTML 4.01.
Tabela 21.2 - Atributos Suportados mas Pertencentes
Tambm ao HTML
Nome do
atributo

Tipo no
Java

Descrio

accept

String

Uma lista separada por vfrgula de content types que diz ao servidor
como processar corretamente o controle do formulrio.

acceptcharset

String

alt

String

Corresponde ao atributo HTML accept-charse. Um espao e lou


uma lista separado por vrgulas de caracteres aceitos pelo servidor
no processamento do formulrio.
Texto alternativo mostrado pelo browser quando no possvel
mostrar o elemento.

border

String

O nmero em pixels do quadro ao redor da tabela.

cellpadding

String

A quantidade de espao entre o limite da clula e o contedo seu


contedo, em pixels ou em porcentagem.

cellspacing

String

A quantidade de espao entre as clulas, em pixels ou em porcentagem .

charset

String

O encode de caracteres.

coords

String

Uma lista de valores separados por vrgula indicando a posio do


elemento na tela.

dir

String

A direo do texto: Itr (Ieft-to-right) ou rtl (right-to-Ieft).

disabled

boolean

Se true, o elemento desabilitado.

enctype

String

O content type usado para o formulrio no envio de dados POSTo

frame

String

hreflang

String

Pode ser um: void, above, below, hsides, Ihs, rhs, vsides, box, ou
border. Especifica os lados visfveis de um quadro.
Usado somente com o atributo href. Especifica a linguagem do recurso referido .

lang

String

A linguagem base.

longdesc

String

onblur
onchange

String
String

A descrio de uma imagem.


Evento executado ao perder o foco do elemento no lado cliente que.

onclick

String

Evento executado quando o elemento (objeto HTML) clicado no


lado cliente .

ondblclick

String

onfocus

String

Evento executado quando o elemento recebe um duplo-clique no


lado cliente.
Evento executado quando o elemento ganha o foco. Vlido para
<aI>, <areal>, <Iabell>, <input/>, <select/>, <textareal>e <button/>.

onkeydown

String

Evento executado quando o elemento detm o foco e uma tecla


pressionada e mantida; no lado cliente.

onkeypress

String

Similar ao onkeydown, com a diferena que apenas pressionada.

Evento executado no elemento quando h uma alterao no lado


cliente. Somente vlidos para <input/>, <select/> e <textareal>.

JavaServer Faces l\l

461

Tabela 21.2 - Atributos Suportados mas Pertencentes


Tambm ao HTML (continuao)
Nome do
atributo
onkeyup

Tipo no
Java
String

onmousedown

String

Evento executado quando o elemento clicado e se mantm pressionado no lado cliente.

onmousemove

String

Evento executado quando um arraste feito pelo mouse sobre o


elemento no lado cliente.

onmouseout

String

Evento executado quando o ponteiro do mouse sai do elemento no


lado cliente.

onmouseover

String

Evento executado quando o ponteiro do mouse est sobre o elemento no lado cliente.

onmouseup

String

Evento executado quando o mouse foi pressionado e solto no lado


cliente

onreset

String

Evento somente vlido para formulrios no lado cliente. Executa reiniciando seus valores padro.

onselect

String

Evento executado quando h uma seleo no lado cliente. Para


campos <input I> e <textarea I> .

onsubmit

String

Evento no lado cliente executado quando o fonnulrio submetido.

readonly

boolean

Se true, o elemento contm um contedo somente para leitura .

rei

String

Uma lista espaos separada de tipos de links, descrevendo a relao do documento atual e do documento referenciado .

rev

String

Uma lista de espaos separados por tipos de links, descrevendo o


link reverso para o documento referido .

rules

String

Pode ser: none, groups, rows, cols ou alI. Especifica a regra de visibilidade entre clulas em uma tabela.

shape

String

Pode ser: default, rect, cirde ou poly. Especifica a fonna de uma regio.

size

String

A largura de um campo input em nmeros de caracteres visveis ou


nmero visvel de opes em uma lista de seleo.

style

String

Folhas de Estilo ( CSS ) explcito.

styleClass

String

Um ou mais nomes de classes de folhas de estilo separadas por espao. No HTML o atributo para isso class, mas que infelizmente
no pode ser usado por uma tag personalizada (customizada) do
JSP (palavra reservada). O atributo class, no HTML, utilizado para
chamar um estilo.

Descrio
Evento executado quando o elemento detm o foco e uma tecla foi
pressionada e solta no lado cliente.

summary

String

Um resumo do propsito de uma tabela.

tabindex

String

A posio do elemento ordenando em tabulao, um nmero entre


O e 32767.

target

String

O nome do quadro que devera exibir a resposta resultante do pedido disparado pelo elemento.

title

String

Usado como tool-tip (dica de tela) do elemento.

type

String

Quando usado com um elemento <a I>, uma sugesto sobre o content type do recurso referenciado .

width

String

A largura de uma tabela, em pixels ou em porcentagem sobre o espao avaliado na pgina em questo.

462

(ljlJ Desenvolvendo Aplicaes Web com JSP...

JSF T AGS

CORE

A biblioteca de tags Core contm elementos de ao que representam objetos de JSF que so independentes da linguagem de marcao da pgina,
como conversores e validadores. Essas tags podem ser chamadas atravs
da diretiva taglib existente em uma pgina JSP:
<%@ taglib uri=''http:/ /java.sun.com/ jsf/core'' prefix="f" %>

Como voc pode notar, a biblioteca HTML do JSF chamada pela URI:
http://java.sun.com/jsf/core

E que contm o prefixo padro f (no a letra c para no ter problemas com o padro JSTL) .
A tabela a seguir demonstra as tags HTML de JSF:

Tabela 21.3 - JSF Ta95 Core


Tag
view

Descrio
Cria uma view de nvel superior

subview

Cria uma subview de uma view

facet

Adiciona um facet para um componente

attribute

Adiciona um atributo (key/value) para um componente

param

Adiciona um parmetro para um componente

actionListener

Adiciona uma ao ouvinte para um componente

valueChangeListener

Adiciona um ouvinte para verificar mudanas nas propriedades de


um componente

converter

Acrescenta um conversor arbitrrio a um componente

convertDateTime

Adiciona um conversor para data e hora em um componente

convertNumber

Adiciona um conversor numrico para um componente

validator

Adiciona um validador para um componente

validateDoubleRange

Valida um intervalo double para o valor de um componente

validateLength

Valida a largura de um componente

validateLongRange

Valida um intervalo long para o valor de um componente

10adBundle

Carrega um pacote de recursos. armazena propriedades como um


Map

selectitems

Especifica itens para uma seleo ou seleciona muitos componentes

selectitem

Especifica um item para uma seleo ou seleciona muitos componentes

verbatim

Adiciona markup para uma pgina JSF

JavaServer Faces [\]

463

Ciclo de Vida do JSF


Todos os pedidos devem ser controlados pelo FacesServlet. O FacesServlet
a parte de Controller do padro MVC. Controla roteando o trfico e administrando o ciclo de vida dos beans e componentes de interface do usurio (UI) .
Os componentes UI so organizados em uma estrutura de rvore. O
componente raiz o UIViewRoot e so representados no JSP usando a tag
<f:view I>, como visto anteriormente. Cada componente pode ser associado com os mtodos e atributos de um bean. Cada componente tambm
pode ser associado com uma funo de validao ou classe.
Resumindo, um ciclo de vida do JSF composto vrias fases. Numa
requis io podemos passar por todas essas fases ou por nenhuma, dependendo do tipo de pedido, de erros que ocorrem durante as validaes, converses e do tipo de resposta.
Uma requisio e uma resposta so consideradas faces request/response
se contiverem tags JSF, assim como as que no as contm so chamadas de
non-faces request/response. Uma non-faces request pode vir de um clique
em um link, por exemplo.
Como j dito, toda requisio recebida pelo FacesServlet e prossegue a passagem pelas fases at uma resposta ser retomada ao cliente.
O FacesServlet recupera uma instncia de FacesContext do
FacesContextFactory, fornecendo uma implementao de LifeCycle. O
processamento do ciclo de vida ento delegado a interface LifeCycle, a
partir da chamada ao mtodo execute. A implementao de LifeCycle inicia as fases do ciclo de vida. Se existir algum validador associado a algum
campo do formulrio este inicializado nessa primeira fase . A rvore
armazenada pelo contexto e ser utilizada nas fases seguintes. Tambm o
estado do formulrio salvo automaticamente.
INTERNACIONALIZANDO UMA APLICAO

JSF

Para trabalhar com a internacionalizao utilizando JavaServer Faces, voc


ir fazer um exemplo similar ao visto em JSTL.

464

[)jI] Desenvolvendo Aplicaes Web com JSP...

Para isso , c ne os arquivos rotulos_pt.properties e


rotulos_en.properties como no exemplo dado no captulo sobre JSTL.
Depois, crie o JavaBean a seguir, dentro do pacote meupacote:
SessaoBean.java

package meupacote;
import java . util . Locale;
import javax . faces . component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event .ActionEvent;
public class SessaoBean (
private String locale;
public String getLocale( ) (
return locale;

public void setLocale(String locale) (


this . locale

= locale;

public void setLanguage(ActionEvent event){


String localeld = event.getComponent( }.getld( };
FacesContext context

FacesContext.getCurrentlnstance( };
UIViewRoot viewRoot = context.getViewRoot( };
viewRoot.setLocale(new Locale(localeld}};
locale = localeld;

JavaServer Faces

[1jjlJ

465

o mtodo setLanguageO criado nesse JavaBean obtm um parmetro


atravs da classe de javax.faces.event.ActionEvent. Um ActionEvent
representa a ativao de um componente de interface do usurio (como um
UICommand).
Esse mtodo se trata de um evento de ao, onde eventos so utilizados para executar um pr-processamento na prpria pgina e no fazem
parte do controle de navegao. Portanto eventos de ao so diferentes de
"aes" executadas por botes em links, onde aes controlam a execuo
de uma pgina.
Atravs do mtodo getCurrentInstance( ), de javax.faces.context.
FacesContext, voc obtm a instncia corrente de FacesContext.
FacesContext contm todas as infol'I11aes de estado por pedido relacionado ao processo de um nico pedido JavaServer Faces e a retribuio da
resposta correspondente. Isso passado para, e potencialmente modificado
por cada fase do processo de pedido do lifecycle.
O mtodo getViewRoot( ), retoma a raiz do componente no qual
associado com este pedido. A instncia da classe abstrata
javax.faces.component.UIViewRoot captura a informao e atravs do
mtodo setLocale( ) no qual voc define uma nova localizao para a
internacionalizao da sua aplicao.
Para isso, o mtodo setLanguage( ) criado receber pelo evento o
valor contido no atributo id do componente que o chamar. Esse atributo
ID ser recebido pelo mtodo getComponent.getId() e atribudo a varivel
String localeld.
Por fim voc tem a atribuio de local e com o valor existente em
localeld . Com isso, voc mantm a existncia da seleo em toda a aplicao na chamada ao mtodo getLocale( ).
Para configurar esse Bean, altere o arquivo faces-config.xml como
mostrado a seguir:
faces-config.xml
<?xml version="l.O" encoding="UTF-8"?>
<!OOCTYPE faces-config PUBLIC
"- li Sun Microsystems, Inc. I l OTO JavaServer Faces Config 1.1 11 EN"
''http: // java.sun.com/ dtd/ web-facesconfig_1_1.dtd">

466

Desenvolvendo Apli caes Web com JSP...

<faces-config>
<application>
<message-bundle>meupacote.rotulos</message-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>pt</supported-locale>
</locale-config>
</application>

<managed-bean>
<managed-bean-name>
MeuBean
</managed-bean-name>
<managed-bean-class>
meupacote .MeuBean
</managed-bean-class>
<managed-bean-scope>
session
</managed-bean-scope>
</managed- bean>
<managed-bean>
<managed-bean-name>
Sessao
</managed-bean-name>
<managed-bean-class>
meupacote.SessaoBean
</managed-bean-class>
<managed-bean-scope>
session
</managed-bean-scope>
</managed-bean>

</faces-config>

JavaServer Faces

467

o arquivo faces-config.xml agora recebe lIm novo elemento, chamado de <application/>, que contm a confi gurao do arquivo .properties
para internacionalizao. Isso feito atravs o elemento <message-bundle
I>. O elemento <Iocale-config/> define os locales disponveis na
internacionalizao da sua aplicao . O elemento <default-Iocale/> configura o locale padro da sua aplicao e o elemento <suported-Iocale/> os
locales suportados por sua aplicao. Esse segundo elemento pode se repetir diversas vezes, quantas forem necessrias para o suporte de todas as
lnguas que seu sistema atuar. Caso a lngua no sej a suportada por seu
sistema, pela sua aplicao, o locale contlgurado no elemento <defaultlocale/> entra em ao.
Mais abaixo no arquivo faces-cont1g. xml voc tem a configurao do
Bean criado para alterar o locale da sua apli cao.
O arquivo a seguir demonstra a utili zao da intemacionalizao em
ao com JavaServer Faces:
internacionalizandoComJSF.jsp
<html>
<%@ taglib uri="http://java . sun.c om/jsf/h tml" prefix="h"%>
<%@ taglib uri="http://java . sun. com/j sflcore" prefix=" f "%>
<f:view locale="#{Sessao.locale}">O
<f:loadBundle basename="m.eupacote .rotulos"
var="msgs" />9
<head>
<ti tle>
<h:outputText value="#{msgs. titulo}" I>
</title>
</head>
<body>
<h : f orm>
<h:commandLink id="en" action="nu ll"
actionListener=I#{Sessao.setLanguage}"
value="#{msgs.ingles}" I>)
<h:commandLink id="pt" action="nul l"

468 1RI Desenvolvendo Aplicaes Web com JSP...


actionListener="#{Sessao.setLanguage}"
value="#{msgs.portugues}" />

<br />
<h:outputText value="#{msgs.name}" />
<h:inputText value="#{MeuBean.nome}" />
<br />
<h:outputText value="#{msgs.email}" />
<h:inputText value="#{MeuBean.email}" />
<br />
<h:commandButton value="#{msgs.enviar}" />
<Ih : forro>

</body>
</f :view>
</htrnl>

Atravs do mtodo getLocale( )0 existente no Bean SessaoBean


voc pode capturar o locale atual da sua aplicao. Note que isso feito na
tag <f:view/>.
Com a tag <f:loadBundle/>@ voc define o arquivo properties
existente na sua aplicao, bem como a varivel que armazenar o acesso
as keys e respectivamente os valores do arquivo . Com isso, para pegar o
ttulo da aplicao, basta chamar a tag <h:outputText/> e no atributo value
utilizar o EL # {varivel.key}, que no caso ser #{msgs.titulo} .
Dois links sero criados, afinal similar ao exemplo dado com JSTL,
portanto a tag <h:commandLink/>. chamada, onde o atributo id deve
conter a informao necessria para ser passada ao evento existente no
atributo actionListener, que chama o mtodo setLanguage( ) do Bean
SessaoBean. O primeiro atributo id, da tag <h:commandLink/>, tem o
valor en, o que significa que transmitir o locale English e o segundo link
tem o atributo id com o valor pt, transmitindo o locale Portuguese. Como
j foi dito anteriormente, esses links chamam um mtodo que se trata de
um evento de ao, ActionEvent, onde eventos so utilizados para execu-

JavaServer Faces lI

469

tar um pr-processamento na prpria pgina e no fazem parte do controle


de navegao . Por isso o atributo actioD recebe um valor Dull .
Como resultado voc tem uma pgina similar a construda no exemplo de internacionalizao com JSTL:
pc InterllClOtldflZao X

<> '::.:/

111 c>

Ihttp://localhost:SOBO/TrabComJSF/internacionalizandoComJSF.faces ,,,jl !li>

~ P ortugus

N ome

C----- --

----~.~

0.----"]

E-mail i O - j

I Enviar I
Figura 21.25

Banco de Dados e JSF


A idia nesse exemplo demonstrar as principais caractersticas encontradas em uma pgina JavaServer Faces acessando um banco de dados. Para
esse exemplo voc contar com o acesso ao banco de dados MySQL, executando o famoso CRUD (Create, Read, Update and Delete).
Alm disso, o cdigo de acesso ao banco de dados no ser necessrio
refazer, uma vez que ele ser o DAO criado no Captulo 20 deste livro .
Portanto, se voc est criando um projeto novo no Eclipse ou no NetBeans,
copie os pacotes e classes referentes ao DAO desenvolvido anteriormente.

El

e. src
J 'IC?
El

meupacote

IC? dao

o InterfaceLlvrosDAO.java

: '. [1

UvrariaDAO.java

: "0

LivrariaDAOException.java

@' IC? util

" 111

.'0

ConnectionLivraril!FI!ctory. javl!
Livros,jI!va

Figura 21.26

470

[ilJ Desenvolvendo Ap li ca es Web com JSP...

O Bean de Com unicao com as Pginas JSF


Para se comunicar com as pgtnas JavaS erver Faces que voc vai construir,
um novo Bean ser desen vol vido, com o intuito de no alterar o que j
existe.
Para isso crie um pacote chamado de meupacote.controller. Nesse
pacote crie a classe mostrada li sc,..!.uir:
LivrosController.java
package meupacote. controll ..
import javax . faces .mode l. DataModel ;
import javax.faces.model .ListDat aModel;
import meupacote.Livros;
import meupacote.dao.lnterfaceLivrosDAO;
import meupacote.dao.LivrariaDAOi
import meupacote.dao.Livrari aDAOException;

public class LivrosCont rol lel


private Livros livroi)
private DataModel model;
public String novoLivro( ) ( ~
this.livro= new Livros( );
return "novo";

public Livros getLivro ( ) (


return livro;

JavaServer Faces l\l


public void setLivro(Livros livro) {
this.livro = livro;

~public

DataModel getTodos( )
throws LivrariaDAOException
InterfaceLivrosDAO idao = new LivrariaDAO( ) ;
model =
new ListDataModel(idao.todosLivros( ));C)
return model;

public Livros getLivroFromEditOrDelete( ) {@)


Livros livro =
(Livros) model.getRowData(
return livro;

);~

public String editar( ) { ~


Livros livro = getLivroFromEditOrDelete( );
setLivro ( livro) ;
return "editar";

public String update( )


throws LivrariaDAOException
InterfaceLivrosDAO idao = new LivrariaDAO( );
idao.atualizar(livro);
return "sucesso_atu";

public String excluir( )


throws LivrariaDAOException
InterfaceLivrosDAO idao = new LivrariaDAO( );
Livros livro = getLivroFromEditOrDelete( );

471

472

Desenvolvendo Aplicaes Web com JSP...

idao.excluir{livro);
return "sucesso_exc";

public String create{ )


throws LivrariaDAOException
InterfaceLivrosDAO idao = new LivrariaDAO{ );
idao.salvar{livro);
return "sucesso_ins";

A classe LivrosController ter acesso ao JavaBean LivrosO, onde


toda a manipulao dos campos existentes no JavaServer Faces ser em
tomo desse Bean.
Vrios mtodos so criados nessa classe. Esses mtodos acessam os
mtodos existentes na classe DAO desenvolvida anteriormente.
O mtodo novoLivro( )8 chama o Bean Livros para limpar todos os
dados existentes nesse bean, em caso de uma atualizao de dados, por
exemplo. O retomo desse mtodo uma String chamada novo. Essa String
ser utilizada pelo arquivo faces-config.xml para chamar o formulrio de
cadastro.
Com o mtodo getTodos( )6), voc acessa todos os livros cadastrados no banco de dados. Esse mtodo acessa o mtodo todosLivros( ) existentes na classe DAO e armazena essas informaes dentro de um
DataModel, atravs da classe ListDataModel( )0 . O retorno desse
DataModel tem o propsito de criar uma tabela de dados no JSF. Esse
DataTable ter dois links: um para atualizar e outro para excluir. Essas
informaes trafegaro por entre o DataModel, ou seja, o DataTable ir
transmitir qual a linha est sendo colocada para edio ou excluso .
O mtodo getLivroFromEditOrDelete( )0 retoma os dados encontrados no DataModel, atravs do mtodo getRowData( )0, em forma do
Bean Livros (por isso a coero).

JavaServer Faces [ljl]

473

Atravs do retomo dado pelo mtodo getLivroFromEditOrDelete(


), o mtodo editar08 pode chamar o formulrio de edio de livros, feito
em JSF, preenchendo-o totalmente para uma atualizao. A atualizao
feita depois chamando o mtodo update( )0, que trs os dados do formulrio de atualizao e chama o mtodo atualizar() criado na classe DAO.
O mtodo excluir( ), como o mtodo editare ), utiliza o retomo dado pelo
mtodo getLivroFromEditOrDelete( ) para saber exatamente qual linha
deve ser excluda do banco de dados . O mtodo excluir( )0 chama o mtodo de mesmo nome na classe DAO.
Por ltimo, o mtodo create( )4]) usado para criar um novo registro
no banco de dados. Esse mtodo chama o mtodo salvar() da classe DAO,
enviando os dados preenchidos no formulrio de cadastro JSF.
Voc pde notar que os mtodos novoLivro( ), editare ), create( ),
update( ) e excluirO tem como retomo uma String. Essa String determina
o rumo dado pelo navegador atravs do arquivo faces-config.xml.

O Problema do Ano MySQL


Quando voc construiu o exemplo do Captulo 20, um problema visto naquela situao, e em outras tambm, estava no ano exibido pelo MySQL. Voc j
sabe que o ano representado por quatro ou dois dgitos no banco de dados
MySQL, sendo que no JDBC, o ano representado como YYYY-MM-dd.
Para que esse problema seja contornado com o JavaServer Faces, voc est
usando mesma ttica do exemplo anterior, ou seja, traz e envia os dados
como uma String. O problema acontece quando voc vai exibir, onde um ano
armazenado como 2007, ficar 2007 -O 1-0 1. Para que isso no acontea, uma
nova classe dever ser criada, como a ConverteDate feita no Captulo 20,
mas com as caractersticas necessrias para funcionar no JavaServer Faces.
No pacote meupacote.util crie a classe mostrada a seguir:
ConverteAnoMySQL.java

package meupacote.u til ;


import java .tex t.DateForma t;
import java . text . Par s eException;

474

[1jjl] Desenvolvendo Aplicaes Web com JSP...

import java . text.SimpleDateFormat;


import java.util . Date;
import javax.faces.component . UIComponent;
import javax.faces.context.FacesContext;
lIIport j avax. faces. convert . Converter;

import javax.faces.convert . ConverterException;


public class ConverteAnoMySQL
implements Converter

public Object getAsObject(FacesContext context,


UIComponent component, String value)

throws ConverterException{
String formatado=null;
if(value==null)
return null;
Date date = null;
try {
DateFormat df =
new SimpleDateFormat ("yyyy") ;
date = (Date) df.parse (value);
formatado = df.format(date);
catch (ParseException pe) {
throw new
ConverterException ("Data no formato invlido");

return formatado;

publ i c String getAsString(FacesContext context,


UIComponent component, Obj ect value)

JavaServer Faces

Ill 475

throws ConverterException{
DateFormat df

new SimpleDateFormat ("yyyy")


Date date
try (

= null;

date = (Date) df.parse((String) value);


catch (ParseException ex)
ex.printStackTrace( );

String formatado

= df.format(date);

return formatado;

Aclasse ConverteAnoMySQL um conversor. Embora o JavaServcr


Faces fornea uma gama de conversores, nem sempre seus conversores se
encaixam no problema que voc tem.
A classe criada um conversor personalizado. Se voc precisa de
uma converso de tipo de dados especial para o seu aplicativo, tal como
datas no formato ano apenas (YYYY), voc pode escrever um conversor
personalizado. Entenda que no estou dizendo que no exista um conversor
de data que represente esse formato. O problema no entanto nem representar, mas em armazenar. No envio dos dados, o ano precisa estar em
formato YYYY. No s como representao, mas como tambm um padro para o armazenamento. Existem outras formas de se obter esse formato, mas um conversor ser um excelente exerccio para que voc aprenda a
personalizar um formato quando esse no existir.

476 !I Desenvolvendo Aplicaes Web com JSP...


Para escrever um conversor, voc precisa criar uma classe que
implemente a interface javax.faces.convert.Converter e depois registrar
o conversor no arquivo de configurao do aplicativo (faces-config.xml).
A interface Converter tem dois mtodos que sero chamados pela
implementao JSF: getAsObject() e getAsString() .
O mtodo getAsObject converte dados de um visualizador
apresentativo para um visualizador modelar. Sua definio :
public bj ec t getAsObject(FacesContext context,
UIComponent component,
String value)

O UIComponent passado para esse mtodo representa o componente


que emprega o conversor e a String value o valor local do componente.
O mtodo getAsString( ) tambm converte dados do visualizador
modelar para o visualizador de apresentao .
public String getAsString(FacesContext context,
UIComponent component,
Object value)

O UIComponente transmitido para esse mtodo representa o componente que usa esse conversor. O Object o objeto que precisa ser convertido.
O conversor desse exemplo pega o ano em formato texto e o converte
em uma data, aplicando o formato YYYY atravs da classe
SimpleDateFormat( ). O resultado depois reescrito em String para que o
objeto o utilize em seu formato padro .

'Configurando a Navegao
O arquivo faces-config.xml ser alterado para que voc possa utilizar as
pginas JSF com a navegao necessria da aplicao, bem como registrar
o Bean que as pginas iro trabalhar junto ao conversor criado.

JavaServer Faces Il 477


faces-config.xm1

<?xml version="1 . 0" encoding="UTF-8"?>


<!DOCTYPE faces-config PUBLIC
"-IISun Microsystems, Inc.//DTD JavaServer Faces Config 1.11/
EN"

''http://java . sun. com/dtd/web-facesconfig_l_1. dtd">

<faces-config>
<!-- Conversor ConverteAnoMySQL -->

<converter>
<converter-id>converteAnoMySQL</converter-id>
<converter-class>
meupacote.util.ConverteAnoMySQL
</converter-class>
</converter>
<!-- O Bean LivrosController -->

<managed-bean>
<managed- bean-name>livrosView</managed-bean-name>
<managed-bean-class>
meupacote.controller.LivrosController
</managed-bean-class>

<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<! - - navegacao das paginas -->

<! -- Edicao dos livros atraves da


pagina mostrarLivos.jsp

-->

<navigation-rule>
<display-name>mostrarLivros</display- name>
<from-view-id>/mostrarLivros.jsp</from-view-id>
<navigation-case>

478 l\l

Desenvolvendo Aplicaes Web com JSP...

<from-outcome>editar</from-outcome>
<to-view-id>/atuLivro.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!-- Cadastro de um novo livro -->

<navigation-rule>
<display-name>formLivros</display-name>
<from-view-id>/forrnLivros.jsp</from-view-id>
<navigation-case>
<from-outcome>sucesso_ins</from-outcome>
<to-view-id>/mostrarLivros.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!-- Chamada ao formularia de cadastro de livros -->

<navigation-rule>
<display-name>menu</display-name>
<from-view-id>/menu.jsp</from-view-id>
<navigation-case>
<from-outcome>novo</from-outcome>
<to-view-id>/forrnLivros.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!-- Sucesso da atualizacao do livro -->

<navigation-rule>
<display-name>atualizarLivros</display-name>
<from-view-id>/atuLivro.jsp</from-view-id>
<navigation-case>
<from-outcome>sucesso_atu</from-outcome>
<to-view-id>/mostrarLivros.jsp</to-view-id>
</navigation-case>
</navigation-rule>

JavaServer Faces [)il] 479


Sucesso da exclusa o do livro -->
<navigation-rule>
<display-narne>mostrarLivros< / display-narne>
<from-view-id> / mostrarLivros.jsp< / from-view-id>
<navigation-case>
<from-outcome>sucesso_exc< / from-outcome>
<to-view-id> / mostrarLivros.jsp< / to-view-id>
</ navigation-case>
</ navigation-rule>

<!--

Mostrando todos os livros -->


<navigation-rule>
<navigation-case>
<from-outcome>mostrar< / from-outcome>
<to-view-id> / mostrarLivros.jsp< / to-view-id>
</ navigation-case>
</ navigation-rule>

<!--

Adicionando um novo livro pela


pagina mostrarLivos.jsp -->
<navigation-rule>
<display-narne>mostrarLivros< / display-narne>
<from-view-id> / mostrarLivros.jsp< / from-view-id>
<navigation-case>
<from-outcome>novo< / from-outcome>
<to-view-id> / forrnLivros.jsp< / to-view-id>
</ navigation-case>
</ navigation-rule>
</ faces-config>
<!--

o conversor criado registrado no arquivo faces-config.xml atravs


do elemento <converter/>. No sub-elemento <converter-id/> o nome do
conversor registrado e em <converter-class/> voc coloca o caminho
para a classe conversora. Os demais itens se referem navegao e registro
do Bean, o que no contm nenhuma novidade do j mostrado em exemplo
anterior.

480

l)jI] Desenvolvendo Aplicaes Web com JSP...

As Pginas JSF
As pginas JSF sero as responsveis por executar o famoso CRUD da sua
aplicao.

o ARQUIVO INICIAL DA APLICAO


A pgina index.jsp apenas contm um link que aponta para o menu.faces.
Tecnicamente a extenso .faces aparecer apenas quando voc der um clique
nesse link.
index.jsp
<%@ page language=" j ava" contentType=" text/htrnl"
pageEncoding="ISO-8859-1"
%>
<htrnl>
<head>
<title>JavaServer Faces e DAO</title>
</head>
<body>
<hl>JavaServer Faces e DAO</hl>
<a bref=lmenu.faces">Mostrar Livros ou Inserir</a>
</body>
</htrnl>

o MENU DA APLICAO
o menu uma pgina simples contendo dois links: um para mostrar todos
os cadastros de livros existentes e outro para adicionar um novo registro.

JavaServer Faces [iijlJ

481

menu.jsp

<%@ page language="java" contentType="text/html"


pageEncoding="ISO-8859-1"
%>
<%@taglib uri=''http://java.sun.com/jsf/core'' prefix="f" %>
<%@taglib uri=''http://java.sun.com/jsf/html'' prefix="h" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
''http : //www.w3.org/TR/htm14/loose.dtd''>
<html>
<head>
<title> JavaServer Faces e DAO </title>
</head>
<body>
<h1>JSP Page</h1>
<f:view>
<h:form>
<h : commandLink action="#{livrosView . novoLivro}"
value="Cadastro de Livros"/ >
<br />

<h:commandLink action="mostrar"
value="Mostrar Livros Cadastrados"/>
</h:form>
</f:view>
</body>
</html>

o cadastro de um novo livro exige a chamada do mtodo novoLivro(


) existente na classe LivrosController.

482

~ Desenvolvendo Aplicaes Web com JSP...

EXIBINDO TODOS OS LIVROS CADASTRADOS

A pgina que exibe todos os livros cadastrados nada mais do que um


DataGrid. O que tem nessa tabela de dados so dois links, dentro da tabela,
aonde um ir lev-lo ao formulrio para atualizao e o outro para a excluso de dados.
mostrarLivros.jsp

<%@ page language="java" contentType="text/html"


pageEncoding="ISO-8859-1"
%>
<%@taglib uri = ''http://java . sun. com/ j sf! core" prefix=" f" %>
<%@ t aglib uri= ''http://java . sun. com/j sf!html" prefix="h" %>
<!OOCTYPE HTML PUBLIC
"-//W3C//OTO HTML 4.01 Transit i onal//EN"
''http://www .w3 . org/TR/htm14/loose . dtd''>
<html>
<head>
<t i t l e>Mostrar Livros</title>
</head>
<body>
<f :view>
<h :messages />
<h:form>
<h:dataTable value='#{livrosView.todos}'
var='item' border="1"
cel l padding="2" cellspacing="O ">
<f:facet name="header">
<h : outputText value="Mostrar Livros"/>
</f:facet>
<h:column>
<f : facet name ="header">
<h : outputText value="ISBN"/>
</f:facet>

JavaServer Faces

lI 483

<h : commandLink

action="#{livrosView . editar}

11

value="#{item.isbn}"/>

</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Titulo"/>
</f:facet>
<h:outputText value="#{item . titulo}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Publicado em"/>
</f:facet>
<h :outputText
value="#{item.publicacao}"
converter=l converteAnoMySQL" />

</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Excluir Livro"/>
</f : facet>
<h: commandLink
action=I#{1ivrosView.excluir}"
value= I Excluir"/>
</h:column>
</h:dataTable>
<h: cormnandLink
action="#{livrosView.novoLivro}"
value="Cadastrar novo livro"/>
</h:form>
</f:view>
</body>
</html>

484 l'iI Desenvolvendo Aplicaes Web com JSP...


S para lembrar, o datagrid aqui desenvolvido com a tag JSF
<h:dataTable/> recebe todos os dados existentes na tabela livros do banco
de dados atravs do mtodo getTodos( ), da classe LivrosController, no
atributo value. Com a tag <h:commandLink/> voc pode chamar os mtodos editar( ) ou excluir( ). O conversor desenvolvido chamado por seu
nome registrado no elemento <converter-id/>, existente no arquivo facesconfig.xml, atravs do atributo converter na tag <h:outputText/>.
Um ltimo link criado pela tag <h:commandLink/> est fora do
dataTable e chama o mtodo novoLivro( ) para criar um novo cadastro de
livro.
O resultado desse dataTable mostrado na imagem a seguir:

(t

Mostr ar livros X

li! ~9> http://localhost:6080IJavaServerFacesDAOlmostrarlivros.faces

r--IsBN

Mostrar Livros
Ttulo

85-7393-486-7 Dominando Eclipse

Publicad~-~-;fE~cl~~
2007

IExcluir

185-7393-494-8 10penOffice.org 2.0 Writer


12006
1Excluir
[85-7393-495-6 ro;~~~~;~~~--~--126----[Excl;--85-7393-519-7 IDominando NetBeans

12006

85-7393-536-7 ITorocat - Guia Rpido do Admirstrador [2006


85-7393-543-X IDominando AJAX
Cadastrar novo livro

12006

IExcluir
IExcluir
IExcluir
v

Figura 21.27

CADASTRANDO UM

Novo

LIVRO

Para cadastrar um novo livro voc tem que chamar o mtodo novoLivro()
existente na classe LivrosController. Esse mtodo chama o Bean Livros e
depois envia uma string de valor novo para o JSF. O arquivo faces-conf.xml
recebe essa String e direciona ao arquivo formLivros.jsp. Veja o trecho do
arquivo de configurao de JavaServer Faces:

JavaServer Faces ~

485

faces-config.xml
<navigation-case>
<from-outcome>novo</fram-outcame>
<to-view-id>/for.mLivros.jsp</to-view-id>
</navigation-case>

o arquivo a seguir cria o formulrio responsvel por cadastrar novos


livros:
formLi vros . j sp
<%@ page language="java" contentType=ntext/htrnl"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri="http://java.sun . corn/j sf!htrnl" prefix="h "%>
<%@ taglib uri="http://java. sun.com/jsf!core" prefix= "f" %>
<!DOCTYPE HTML PUBLIC
"-//W3CIIDTD HTML 4.01 TransitionalllEN"
"http://www.w3.org/TR/htrn14/1oose .dtd n>
<htrnl>
<head>
<title>Cadastro de Livros</title>
</head>
<body>
<f:view>
<h:form id="cadastro">
<h:panelGrid columns="2">
<f:facet name="header">
<h:outputText value="Cadastro de Livros" l>
</f:facet>
<h :outputText value="ISBN:" I>
<h:inputText size="15" id="isbn"
value=I#Uivrosview.livro.isbn}" I>

486 5l Desenvolvendo Aplicaes Web com JSP...


<h:outputText value="Ttulo:" I>
<h : inputText size="30" id="titulo"
value=" # {livrosView . livro. titulo}" I>
<h:outputText value="Edio:" I>
<h:inputText size="lO" id="edicao"
value="#{livrosView.livro.edicao}" I>
<h:outputText value="publicao :" I>
<h:inputText size="lO" id="publicacao"
value="#{livrosView.livro.publicacao}" I>
<h:outputText value="Descrio:" I>
<h:inputTextarea cols="20" id="descricao" rows="S"
value="#{livrosView .livro.descricao}" I>

</h:panelGrid>
<h:commandButton value="Cadastrar"
action="#{livrosView.create}" I>
<h:commandButton value="Limpar" type="reset" I>
<h:commandButton value="Cancelar" action="mostrar" I>
<Ih: form>

</f:view>
</body>
</htrnl>

Todos os campos do fonnulrio, menos a descrio, so feitos com a


tag <h:inputText/>. O atributo value de cada campo tem como valor o seu
correspondente no Bean Livros. Essa a razo da classe LivrosController
conter uma chamada ao JavaBean Livros:
private Livros livro;

JavaServer Faces

487

E conter os mtodos assessores, getter e setter do Bean:


public Livros getLivro( ) ...
public void setLivro(Livros livro)

Para uma rea de texto, representado pela tag HTML <textarea/>, voc
utiliza em JSF a tag <h:inputTextarea/>. Nesse caso os atributos rows e
cols tambm existem.
A tag <h:commandButton/> representa os botes padro HTML. No
caso, o boto aqui tem a mesma caracterstica que a tag <h:commandLinkl
>. Voc coloca no atributo action a chamada ao mtodo que acionar o
comando dado. Observe atentamente a tag <h:commandButton /> adicionada para reiniciar o formulrio. Em vez de um atributo action existe um
atributo type. O boto adicionado para cancelar o envio, no atributo action
contm apenas a String mostrar. Se voc se lembrar no arquivo facesconfig.xml, a string mostrar chama o arquivo mostrarLivros.jsp:
faces-config.xml
<navigation-rule>
<navigation-case>
<frorn-outcorne>rnostrar< / frorn-outcorne>
<to-view-id> / rnostrarLivros.jsp</to-view-id>
</ navigation-case>
</ navigation-rule>

O formulrio quando apresentado, sem valores preenchidos como


mostra a Figura 21.28 a seguir:

488

[liil] Desenvolvendo Aplicaes Web com JSP...

t' Cadastro de LIVros X

<? ";" ~ Ihttp://localhost:8080/JavaserverFaCeSDAo/ ~1 I>

11

Cadastro de Livros
ISBN:

Ttulo:

lo
~====:
Publicao: I

Edio:

~===-----,

D"m.o

Cadastrar )

]
I Limpar ) I Cancelar
v

Figura 21.28

ATUALIZANDO UM LIVRO CADASTRADO

Na pgina onde contm todos os livros cadastrados possui o cdigo do


ISBN como um link. Esse link, gerado pela tag JSF <h:commandLinkl>
contm a chamada ao mtodo editar( ) da classe LivrosController. Esse
mtodo, na sua classe de origem, chama um outro mtodo chamado de
getLivroFromEditOrDelete(), responsvel pela captura da linha em questo no OataModel. Essa linha pega pelo mtodo getRowData( ), j dito
anteriormente.
Assim que pego a linha em questo, escolhida na hora do clique sobre
o link, o mtodo editar( ) se responsabiliza de preencher o JavaBean Livros com o valores captados e envia a String editar para que a navegao
entre as pginas ocorram.
No arquivo faces-config.xml voc tem a chamada do arquivo
atuLivro.jsp, conforme o trecho mostrado a seguir:

JavaServer Faces Ill

489

faces-config.xm1
<navigation-case>
<from-outcame>editar</from-outcame>
<to-view-id>/atuLivro.jsp</to-view-id>
</navigation-case>

A pgina atuLivro.jsp nada mais do que uma pgina idntica


pgina criada para cadastrar os livros. Inclusive poderia e at de certa forma
ser a mesma. Evidentemente voc teria que programar os textos que seriam
exibidos no caso de ser uma pgina para cadastro ou para atualizao.
O cdigo listado a seguir mostra a pgina em questo:
atuLivro.jsp
<%@ page language="java" contentType="text/htrnl"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri="http://java.sun . corn/j sf/htrnl" prefix="h "%>
<%@ taglib uri="http://java.sun . corn/j sf/core" prefix=" f"%>
<!DOCTYPE HTML PUBLIC
"- //W3C/ /DTD HTML 4.01 Transi tional//EN"
"http: //www.w3.org/TR/htrn14/loose .dtd" >
<htrnl>
<head>
<title>Atualizar Livros</title>
</head>
<body>
<f:view>
<h:form id="cadastro">
<h:panelGrid columns="2">
<f:facet name="header">

490

Desenvolvendo Aplicaes Web com JSP...


<h : outputText value="Atualizar Livros"l>
</f:facet>
<h:outputText value="ISBN:" I>
<h:inputText size="15" id="isbn"
value="#{livrosView . livro . isbn}
readonly="true" I>
11

<h:outputText value="Ttulo:" I>


<h:inputText size="30" id="titulo"
value="#{livrosView.livro.titulo}" I>
<h:outputText value="Edio:" I>
<h:inputText size="lO" id="edicao"
value="#{livrosView.livro. edicao}" I>
<h : outputText value="publicao:" I>
<h:inputText size="10" id="publicacao"
value=I#{livrosView.livro.publicacao}"
converter=lconverteAnoMySQL" I>
<h:outputText value="Descrio:" I>
<h:inputTextarea cols="20" id="descricao" rows="S"
value=" # {li vrosView.li vro. descricao}" I>
</h:panelGrid>
<h:commandButton value=IAtualizar"
action=I#{livrosView.update}" I>
<h:commandButton value="Redefinir" type="reset"

I>

<h : commandButton value= "Cancelar" action="mostrar" I>


</h:form>
</f:view>
</body>

</html>

JavaServer Faces [Ijjl)

491

Similar pgina de cadastro de livros, essa pgina contm pequenas


diferenas. A primeira o ISBN. O campo que representa o ISBN deve ser
somente leitura, afinal, voc tem uma chave primria cadastrada que no
ser alterada. Por isso a tag JSF <h:inputText/> tem o atributo readonly
com a valor true.
No campo JSF que representa a publicao, voc se lembra que existe
o problema do ano sendo exibido com apenas quatro caracteres. Nesse caso,
o atributo converter chamado novamente para que o ano seja exibido
corretamente.
Por fim, o boto que enviar o formulrio para atualizao chamar o
mtodo update( ) da classe LivrosController. Esse mtodo retoma uma
String para que a navegao do seu aplicativo ocorra assim que atualizado
os dados.
EXCLUINDO UM LIVRO

Para excluir um livro, voc tem apenas um link existente no arquivo


mostrarLivros.jsp. Ao clicar no link, gerado pela tag <h:commandLinkl
>, o atributo action chama o mtodo excluir() da classe LivrosController.
O mtodo excluir( ), assim como ocorria com o mtodo editar(), chama
o mtodo getLivroFromEditOrDelete( ), que retoma a linha pelo mtodo
getRowData( ).
Assim que a linha retomada, o mtodo excluir() existente na classe
DAO chamado e a excluso da linha no banco de dados efetuado. Assim
que excludo, uma String retomada, para que a navegao ocorra.
TORNANDO UM CAMPO OBRIGATRIO NO PREENCHIMENTO

Uma das situaes muito comuns no desenvolvimento tomar um campo


obrigatrio no preenchimento.
Para fazer isso, voc precisa apenas adicionar o atributo required
com o valor true para que o mesmo passe a ser obrigatrio em seu preenchimento.
Para que uma mensagem aparea, e isso voc j pde presenciar no
primeiro exemplo deste captulo, basta adicionar a tag <h:messages/>. Agora

492

[liJ Desenvolvendo Aplicaes Web com JSP...

se voc quiser uma mensagem por campo, pode adicionar a tag <h:message/
>. A diferena que um tem o intuito de mostrar mensagens globais e o
outro, uma mensagem por campo. Isso ocorre porque a segunda tag JSF
tem um atributo chamado for, onde o valor atribudo a esse atributo deve
ser o nome indicado pelo atributo id da tag <h:inputText/>.
Veja a seguir a pgina forrnLivros.jsp modificada com a adio da
tag JSF <h:message/>:
formLi vros . j sp
<%@ page language="java" contentType=" text/htrnl"
pageEncoding="ISO-8859-1"
%>
<%@ tag1ib uri="http:/ / java.sun.com/jsflhtrnl'' prefix="h"%>
<%@ taglib uri=''http://java.sun.com/jsflcore'' prefix="f"%>
<!OOCTYPE HTML PUBLIC
"-//W3C//OTO HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/htrn14/loose .dtd''>
<htrnl>
<head>
<tit le>Cadastro de Livros</title>
</head>
<body>
<f:view>
<h:forrn id="cadastro">
<h:panelGrid columns="3" >
<f:facet narne="header" >
<h:outputText va lue="Cadastro de Livros" />
</f:facet>
<h:outputText value="ISBN:" />
<h: inputText size=" 15"
id="isbn"
value="#{livrosView.livro.isbn}"
required="true"
/>

JavaServer Faces l\l 493


<h:message for="isbn"/>

<h:outputText value="Ttulo:" />


<h : inputText
size="30"
id="titulo"
value="#{livrosView.livro.titulo} "
required="true"
/>

<h :message for="titulo"l>

<h:outputText value="Edio:" />


<h:inputText size="lO"
id="edicao"
value="#{livrosView . livro.edicao}"
/>

<h:message for="edicao"l>

<h:outputText value="publicao:" I>


<h:inputText size="lO"
id="publicacao"
value="#{livrosView.livro .publicacao}"
I>
<h:message for="publicacao"l>
<h:outputText value="Descrio:" />
<h:inputTextarea cols="20"
id="descricao" rows="5"
value="#{livrosView.livro.descricao}"
/>

<h:message for="descricao"l>

</h :panelGrid>
<h: cormnandButton value="Cadastrar"
action="#{livrosView.create}"

I>

494 llI Desenvolvendo Aplicaes Web com JSP...


<h:conunandButton value="Limpar" type="reset" />
</h:form>
</f :view>
</body>
</html>

Perceba pelos destaques que dois dos campos existentes passaram a


ser obrigatrios e em todos existe a tag <h:message/> com o atributo for
apontando para cada um dos id 's existentes nos campos representados pela
tag JSF <h:inputText/> e um da tag <h:inputTextarea/>.
Ao utilizar essa ttica, o JavaServer Faces automaticamente atribui
uma mensagem de erro quando o campo tem o atributo required com o
valor true.
O resultado de um envio mal sucedido como mostrado na Figura
21.29 a seguir:
fIt Cadastro de Livros X

<?

~, l!!!l

./J' Ihttp://localhost:8080/JavaServerFacesDAO/formLvros.faces
Cadastro de LiVl'OS

ISBN:

[:'~=:=====]

Ttulo:

[------------,1 Validation Error: "titulo": Value is required.

Edio:

lo

Publicao:

D,,,ri,,,
Cadastrar

Validation Error: "isbn": Value is required

l:=====~

=======------,

1I

:I
Limpar

1I

Cancelar

Figura 21.29

JavaServer Faces [)jlJ 495

Observe que as mensagens esto em ingls. Mas e se voc quiser personalizar isso, como fazer?

Personalizando Mensagens Padro do


JavaServer Faces
Para personalizar uma ou mais mensagens padro do JavaServer Faces,
voc precisar fazer uma pequena modificao em uma biblioteca que est
sendo utilizada por sua aplicao .
Essa biblioteca se chama jsf-imp.jar e se voc ta lembrado, essa biblioteca, junto a outras fora adicionado no diretrio lib da sua aplicao.
Dentro desse arquivo JAR, existe um pacote chamado javax.faces. Dentro
desse pacote existem as mensagens configuradas para as aplicaes JSF
em arquivos .properties.
Se voc descompactar essa biblioteca, ver diversos arquivos
Messages.properties. O padro do JSF no ter um em nosso idioma.
Alm do mais, podem existir mensagens no qual voc no se agrada. Por
esses e outros motivos que no vem ao caso, voc vai aprender a modificar
essas mensagens.

m. javax.faces

Messllges_de.propertes
Messages_es.properties
MessagesJr.properties
Messages...Pt. propertes
Messages.properties

m. META-INF

Figura 21.30

A primeira coisa a fazer descompactar o arquivo jsf-imp.jar. Voc


pode utilizar um descompactador qualquer, uma vez que a extenso JAR
nada mais do que uma compactao ZIP. Ao descompact-Io, v ao local
j indicado, em javax/faces e crie um arquivo Messages.J)t.properties,
copiando o arquivo padro existente, o Messages.properties. Se preferir
alterar diretamente o arquivo padro, fique a vontade para faz-lo.

496 iljIJ Desenvolvendo Aplicaes Web com JSP...


Existem muitas mensagens a serem traduzidas, mas para ilustrar apenas o problema desse captulo, voc ir modificar o seguinte trecho do
arqUivo:

~s# --------.-.------------- ------- -- ------- - -------.------

q6# Conlponent Et:rorz

q7# -.-------- ------.---------.-----------.----- ------ ------ ----

48

49 javax.taces . componenc.Ullnpuc.CONVERSION-(O}Erro de co nverso.


SO javax.taces . componenc.Ullnpuc.REQUIRED- Erro de Va lidao\: esse campo requerido.
S ljavax.taces.componenc.UISeleccOne . INVALID-!rro\: (O}esse valor no vl i do
SZ javax.taces.componenc . UISeleccHany . INVALID-Erro\: (O}esse valor no vlido

Figura 21.31 - Alterao do arquivo Messages_pt.properties.

Aps a alterao, hora de recompactar novamente, criando a biblioteca. Se voc estiver dentro do diretrio onde se encontram os arquivos,
por exemplo, eu descompactei em um diretrio chamado jsf-impldescompact.
Dentro desse diretrio eu tenho os diretrios com, javax e METAINF. Dentro desse diretrio, no terminal do Linux ou no prompt de comando do Windows, eu executo o comando:
jar cf jsf-ilIIp.jar

Um arquivo lAR criado. Basta substituir o existente e testar a sua


aplicao. No se esquea de que voc precisa dar um reload da aplicao
no Tomcat Manager, para que ele reconhea. Caso esteja testando e compilando no NetBeans, substitua a biblioteca. Caso seja no Eclipse, substitua
aps fech-lo e abra-o novamente.
O resultado da traduo o mostrado na Figura 21.32 a seguir:

JavaServer Faces

lI 497
=E]

P Cadastro de livros X

<>

e)

11 ""

1http://localhost:80BO/JavaServerFacesDAO/formlivros.faces

Cadastro de Livros
ISBN:
Ttulo:
Edio:

1---'

Erro de Validao: esse campo requerido.

L_......__.... _.._____._ ...I Erro de Validao: esse campo requerido.

rn=-- -I
I

Publicao:

Descrio:

Cadastrar

I1

Limpar

I[

Cancelar

Figura 21.32

Como Alterar as Mensagens sem a Necessidade


de Recompilar
Voc deve estar se perguntando: mas preciso desempacotar e reempacotar,
no existe um jeito mais fcil?
A resposta : Claro que sim.
Essa situao foi mostrada para que voc nunca mais precise se incomodar com a traduo da sua aplicao. Mas existem casos em que voc
no tem acesso a biblioteca, apenas cria as aplicaes JSF e o servidor
disponibiliza tudo. O que fazer nesse caso?
A resposta fazer os passos de forma similar ao mostrado, mas com
uma diferena. Ao traduzir as mensagens existentes no arquivo
Messages.properties, adicione em sua aplicao, em um pacote.
Por exemplo, no pacote meupacote.util, eu adicionei o arquivo
Messages~t.properties .
No arquivo faces-config.xml eu adiciono o caminho para esse arquivo, apontando assim as tradues que existem nas minhas mensagens personalizadas.

498

[\] Desenvolvendo Aplicaes Web com JSP...

faces-config.xml

<?xrnl version="l.O" encoding="UTF-B"?>


<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems , I nc.//DTD JavaServer Faces Config l.l//EN"
''http://java.sun.com/dtd/web- face sconfig_l_l .dtd''>
<!- Alterando as mensagens padrao do JSF ->

<application>
<message-bundle>meupacote.util.Messages</message-bundle>
</application>

Com o elemento <application/>, no arquivo faces-config.xml, voc


controla todas as mensagens padro existentes em uma aplicao JSF. Dentro
do sub-elemento <message-bundle/> voc coloca o pacote e o nome do
arquivo de extenso .properties para que o compilador JSP reconhea as
mensagens traduzidas. No se esquea de reiniciar a sua aplicao no Tomcat
para que as alteraes sofram efeito.
O resultado o mesmo mostrado anteriormente, mas dessa vez sem a
substituio do arquivo jsf-imp.jar .

Validando a Entrada de Valores


No campo ISBN, voc tem que avisar o usurio que o valor inserido deve
ter treze caracteres, isso no mnimo e no mximo. Para fazer isso, voc
adiciona a tag JSF <f:validateLength/>O . Essa tag contm dois atributos:
~ minimum - voc diz qual o nmero mnimo de caracteres que
devem ser digitados no campo.
~ maximum - voc define qual o nmero mximo de caracteres
que devem ser digitados no campo.
Para adicionar esse validador, basta fazer como mostra o trecho do
arquivo formLivros.jsp a seguir:

JavaServer Faces ~

499

formLivros.jsp

<h:inputText size="lS"
id="isbn"
value="#{livrosView . livro . isbn}"
required="true">
<f :validateLength minimum="13" maximum="13" />0
</h:inputText>

Com a adio da tag <f:validateLength/>O se o usurio digitar menos que treze caracteres ou mais que treze caracteres, uma mensagem de
erro aparecer.
VALIDANDO O

ISBN

o campo

de entrada do ISBN (International Standard Book Number)


contm muito mais do que apenas uma quantidade de caracteres vlidos.
Voc pode querer adicionar o formato correto. Para isso voc precisar
criar um validador personalizado.
Para criar sua validao, crie uma classe dentro do pacote
meupacote.util.
A classe a seguir demonstra como implementar a classe Validator de
JSF e criar seu prprio padro de validao.

ValidaISBN. j ava

package meupacote.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;

500

Desenvolvendo Aplicaes Web com JSP...

import javax.faces . context.FacesContext;


import javax.faces.validator.Validatori
import javax.faces.validator.ValidatorExceptioni
public class ValidaISBN implements Validator {"
public void validate (FacsContext context,
UIComponent componente, Object objeto }
throws ValidatorException
String isbnDigitado =

(String}objetoi~

Pattern p =
Pattern.compile("\\d{1,2}-\\d{3,S}-\\d{3,4}-[O-9XX] (1}")it)
Matcher m =

p.matcher(isbnDigitado)i~

boolean matchFound = m.matches(


if (!matchFound)

)i@)

{~

FacesMessage message

= new

FacesMessage( };

message.setDetail("ISBN invlido.") i
message.setSwmnary("ISBN invlido.") i
message.setSeverity(FacesMessage.SEVERITY_ERROR};
throw new ValidatorException(message} ;

o pacote javax.faces.validator contm a interface Validator que voc


implementa para escrever um validador personalizadoO. Esse pacote contm vrias classes de validadores padro.

JavaServer Faces [J

501

Como voc implementa a interface javax.faces.validator.Validator, o


mtodo validate() obrigatrio em seu desenvolvimento. Implementando
o mtodo validate( ) voc consegue pegar o valor do objeto e verificar o
que foi digitado.
O objeto sofre uma coero de tipo para String8, podendo assim ser
verificado pelo pacote java.util.regex.
As expresses regulares so muito utilizadas para localizao de informaes dentro de textos e para validao de dados textuais que devem
seguir formatos especficos, como no caso o ISBN.
Na API do Java SE, voc tem o pacote java.util.regex que contm
duas classes principais voltadas ao trabalho com expresses regulares. Essas classes so Pattern que representa uma expresso regular compilada e
Matcher que capaz de verificar se a String passada est de acordo com a
expresso regular em um objeto Pattern.
Nesse caso, o mtodo compile( )e, da classe Pattem, chamado
para que seja criada a expresso que verificar os dgitos do campo ISBN.
Para que voc entenda o que est acontecendo, os smbolos das expresses regulares sero mostrados a seguir:
~ \d - um digito de O a 9 [0-9]
~ {n} - o digito aparecer n vezes. No caso uma expresso como
\\d {2}, indica que voc ter que ter dois dgitos de zero a nove.
~ [a-zA-Z] - qualquer letra de a at z, tanto maisculas como minsculas
~ [a-z] - qualquer letra de a at z somente minsculas
~ [A-E] - qualquer letra de a at e somente maisculas
~ ? - o smbolo "?" aparece zero ou uma vez
~ - o smbolo "*,, aparece zero ou mais vezes
~ + - o smbolo "+" aparece uma ou mais vezes
~ {n,m} - o smbolo antes do {n,m} aparece no mnimo n vezes e
no mais que m vezes
~ -I\s - ou smbolo "_,, ou o "espao" poder aparecer
Ento, atravs dessa explicao, voc pode entender que o padro
definido na expresso o valor aceitvel. Para isso, um ISBN poder ser
escrito nos formatos: 99-9999-999-X, 99-999-9999-9, 9-99999-999-9 ou
99-9999-999-9. O "X" no final pode ser maisculo ou minsculo.

502

[)il] Desenvolvendo Aplicaes Web com JSP...

Com o mtodo matcher( )0 voc fica sabendo se o valor digitado


vlido. Caso no seja, a classe Matcher, atravs do mtodo matches( )0
retoma um valor booleano false.
Esse valor booleano verificado pelo bloco de if0, onde no existindo um valor true uma mensagem disparada para a pgina JSF, avisando o
usurio do ocorrido.
CONFIGURANDO O VALlDADOR

Depois de criado, esse validador deve ser configurado no arquivo facesconfig.xml antes de ser usado na sua pgina JSF.
O trecho a seguir mostra a configurao como deve ser feita:
faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE faces-config PUBLIC
"- I I Sun Microsystems, Inc. //DTD JavaServer Faces Config 1.1//
EN"

''http :/ /java.sun . comi dtd/web- facesconfig_1_1. dtd" >


<faces-config>

Alterando as mensagens padrao do JSF -->


<application>
<message-bundle>meupacote.util.Messages< / message-bundle>
</ application>
<! -- Conversor ConverteAnoMySQL -->
<converter>
<converter-id>converteAnoMySQL</converter-id>
<converter-class>
meupacote.util.ConverteAnoMySQL
</ converter-class>
</ converter>
<!-- Validador de ISBN -->

<!--

<validator>

JavaServer Faces Il

503

<validator-id>validaISBN</validator-id>
<validator-class>meupacote.util.ValidaISBN</validator-class>
</validator>

o elemento <validator/> configura seu validador, onde dentro desse


elemento se encontra dois sub-elementos:
~
~

<validator-id/> - no qual voc atribui o nome do seu validador;


<validator-class/> - onde a classe validadora configurada.

APLICANDO O VALlDADOR

Feita a configurao, basta aplicar a sua pgina JSF. O trecho a seguir


demonstra como utilizar o validador personalizado:
fOIlllLivros.jsp
<h:outputText value="ISBN:" />
<h:inputText size="15"
id="isbn"
value="#{livrosView.livro.isbn}"
required="true"
>

<f :validator validatorId="validaISBN" />


<f: validateLength minimurn=" 13" maximurn=" 13" />
</h:inputText>

Com a tag JSF <f:validator/> voc configura o validador, chamandoo pela ID configurada no arquivo faces-config.xml, utilizando o atributo
validatorld.

504

Desenvolvendo Aplicaes Web com JSP...

VALIDANDO PELO BEAN

Uma forma muito simples de fazer a validao do campo ISBN atravs


de um JavaBean. Nesse caso, voc ir adicionar o mtodo a seguir na classe LivrosController.
LivrosController.java
public void validaISBN (FacesContext context,
UIComponent componente,
bject objeto)
throws ValidatorException
String isbnDigitado

= (String)objeto;

Pattern p =
Pattern . compile (" \ \d (l, 2) - \ \d {3, 5} - \ \d {3, 4} - [Q-9xX ] {l}
Matcher m = p.matcher(isbnDigitado) ;
boolean matchFound = m.matches( );
if (!matchFound) (
((Ullnput)componente) . setValid(false);
FacesMessage message =
new FacesMessage("ISBN invlido.");
context.addMessage(
componente.
getClientld(context), message);

H )

JavaServer Faces ll

505

Nesse caso, muito similar ao mostrado no exemplo da criao da classe de validao, voc v a diferena na utilizao de um mtodo, onde a
mensagem transmitida por FacesMessage. Como j foi visto no primeiro
exemplo da utilizao de JSF a personalizao de uma mensagem, essa
explicao no ser necessria nesse caso.
Para adicionar a sua pgina JSF, basta colocar o atributo validator na
tag <h:inputText/>.
formLi vros . j sp

<h:inputText size="15"
id="isbn"
value="#{livrosView.livro. isbn}"
required="true"
validator="#{livrosView.validaISBN} " >
<f:validateLength rninirnum= "13" rnaxirnum="13" />
</h:inputText>

Dando um Estilo a sua Tabela


Um efeito muito utilizado em desenvolvimento de aplicaes, no que se
refere Web, o chamado efeito "zebra" na sua tabela de dados.
Como existem muitos dados resultantes em uma tabela de dados comum, o desenvolvedor coloca o efeito de cores alternadas para cada linha.
Isso facilita a sua leitura.
Para fazer isso em uma pgina JavaServer Faces bem mais simples
do que voc possa imaginar. Primeiramente um estilo deve ser criado. Esse
estilo deve conter classes para as linhas alternadas, no qual chamaremos de
linha_a e linha_b. Voc tambm pode definir um estilo para o cabealho
da tabela e para a tabela toda. Seguindo essas orientaes, a pgina
mostrarLivros.jsp ser modificada.
Entre as tags HTML <head/> coloque a tag <style/> e adicione o contedo como mostrado a seguir:

506 lI Desenvolvendo Aplicaes Web com JSP...


mostrarLivros . jsp
<style>
. tabela
border: solid lpx #000;

.cabecalho
text-align: center;
color: #FFF;
background: #999;

.linha_a {

background: #FFF;

.linha_b

background: #CCC;

</style>

Para quem no tem familiaridade com design Web, folhas de estilo


em cascada (CSS), so utilizadas para formataes segundo o padro regido pelo orgo W3C. Esse rgo determina as padronizaes encontradas
no desenvolvimento de uma pgina Web, onde hoje juntando essa e outras
tecnologias temos o que chamamos de WEB 2.0.
Cada estilo criado chamado, nesse caso, de classe. Uma classe, em
CSS, caracterizada pelo seu incio com o "." ponto, seguido do nome. No
bloco, o contedo que se encontra por entre as chaves, voc tem os estilos
propriamente ditos. Existem diversos estilos, e cada um faz uma mudana
nas caractersticas de uma pgina HTML, criando assim beleza e padronizao por entre as demais pginas existentes no site.

JavaServer Faces [J

507

Para aplicar na sua tag JSF <h:dataTable/>, basta utilizar os atributos


listados a seguir:
styleClass - O estilo da tabela;
headerClass - O estilo do cabealho da tabela;
rowClasses - Os estilos para as linhas;
columnClasses - Os estilos para as colunas.
A seguir voc tem a aplicao desses atributos configurados na tag
<h:dataTable/> do arquivo mostrarLivros.jsp.
mostrarLivros.jsp
<h: dataTable value=' # {livrosView. todos}' var=' i tem' border=" 1"
cellpadding="2" cellspacing="O "

styleClass="tabela"
headerClass="cabecalho"
roWClasses="linha_a, linha_b"
>

Sua aplicabilidade simples. Perceba que no atributo rowClasses, as


classes CSSs so listas com separaes por vrgula.
O resultado mostrado na Figura 21.33 a seguir:

- -- - -

--

ISBN

-----~---

--

---

Mostrar Livros

liMo
-- ----- - -

Ex,1uir Li.,o

-- -------

------

1-59059-580-7 !Pro JSF and Ajax

2006

IExclUIr

' 2'5"'"'~&~h.ir

85-7393-436-0 Dominando o JBuilder X


85-7393-486-7 IDominando Eclipse
85-7393-494-8 "OpenOflice.org 20 Wriler

[2006
'

Exchnr

f2i-='- ,&~~~-

8'j~ 7393~504:9 !;;:fficeorg 2.0 ;;;--" ,..w.r2~6 ~"IE;ci~ 85-7393-505-7 'OpenOflice.org 2.0 Draw
85 ;i393. 519-:1 lD~;;;;;:;;;;;d~ Nedleans '

.2006

IExcluir

.85-7393_...........-85-7393-536-7 Torncat Guia Rpido do A

2006

Exc1uir

06

E,:c1uir

85-7393-543-X Dominando AJAX


Cadastrar novo livro

2006

12c1uir

...m[:ioo6 ----[&cl;;;;:--

Figura 21.33

,.

508 I\l

Desenvolvendo Aplicaes Web com JSP...

Caso o efeito surtido ainda no seja de todo satisfatrio, voc ainda


pode acrescentar estilos para as colunas. Veja um exemplo:
mostrarLivros.jsp

<style>
.coluna_a {
background:

#ccc;

.coluna_b {
background: #FFF;

</style>

Na tag <h:dataTable/> do arquivo mostrarLivros.jsp voc acrescenta o atributo columnClasses:


mostrarLivros.jsp

<h: dataTable value=' # {li vrosView. todos}' var=' i tem' border=" 1"
cellpadding="2" cellspacing="O"
styleClass="tabela"
headerClass="cabecalho"
columnClasses="coluna_a, coluna_bIt
>

o resultado dessa configurao mostrado na Figura 21.34 a seguir:

JavaServer Faces 1RI

509
=

fi: r'4ostror lIVros )(

11

Figura 21.34

..... ..... .....

Captulo

22
JavaServer Faces e Hibernate

AVASERVER FACES COM CERTEZA UMA DAS MELHORES TECNOLOGIAS visuais


para construo de pginas Web atravs de componentes.
Mas somente a construo de pginas em JSF no demonstra todo o
poder que o Java se apresenta em vrias aplicaes, principalmente nos
aplicativos Web.
Uma bela e favorvel situao que se encontra ao usar Java est tambm em no trabalhar diretamente o banco de dados, como foi feito em
casos anteriores e, se possvel, facilitar o uso de acesso ao banco de dados,
tornando mais simples as classes DAOs desenvolvidas.
Pensando nessas situaes, desenvolvedores ao redor do mundo construram ferramentas de mapeamento com acesso ao banco de dados. Isso
fora necessrio principalmente devido ao paradigma que se encontrava no
desenvolvimento de aplicativos orientados a objetos. Enquanto de um lado
voc tem informaes armazenadas tabularmente, de outro voc tende a
apresent-los em formato de objetos . exatamente isso o que ocorre com o
uso do padro DAO . Voc pega as informaes advindas do banco de dados, as repassa para um Bean e vice-versa.
Dentre os mapeadores de banco de dados existentes no mercado, um
se destaca pela popularidade. Seu nome Hibernate.
Por anos a persistncia de dados foi um tpico problemtico por entre
os desenvolvedores Java. O debate era extenso, mas muitos se envolviam
em situaes como a de automatizar funes existentes no sistema armaze-

512

[iiil] Desenvolvendo Aplicaes Web com JSP...

nando-as no banco de dados e que, com mudanas no sistema, a troca de


um banco de dados causava transtornos tremendos. A palavra portabilidade
era algo fora de alcance, principalmente porque um banco de dados em
muitos casos tem um dialeto prprio. Esse problema ainda muito debatido, mas o inteno de ORMs como o Hibernate tentar fechar esse buraco
existente na construo de aplicaes que exijam portabilidade total.
Esse Captulo o introduzir na utilizao do Hibernate com o desenvolvimento de JavaServer Faces .

O Hibernate
Hibernate um projeto audacioso que procura ter uma completa soluo
para o problema de gerenciamento de dados persistentes em Java. O
Hibernate um framework que se relaciona com o banco de dados, onde
esse relacionamento conhecido como mapeamento objetolrelacional para
Java, deixando o desenvolvedor livre para se concentrar em problemas da
lgica do negcio . Sua simplicidade em configurao, d ao desenvolvedor
algumas regras para que sejam seguidas como padres de desenvolvimento
ao escrever sua lgica de negcios e suas classes persistentes. De resto, o
Hibernate se integra suavemente ao seu sistema se comunicando com o
banco de dados como se fosse diretamente feito por sua aplicao. Uma
mudana de banco de dados, nesse caso, no se torna traumtica, alterando
apenas um ou outro detalhe nas configuraes do Hibernate .

Antes de Comear
Antes de iniciar essa empreitada, voc ir reutilizar alguns arquivos j feitos do exemplo do Captulo 21. A seguir voc tem a lista dos arquivos que
sero reutilizados e os novos que ainda vo ser criados por voc:

JavaServer Faces e Hibernate


t.. PrOJ8ct Explorer
(3 - \C7

513

JavaServerFacesComHibernate

- $ - ~ Deployment Descriptor: JavaServerFacesComHibernate


~ ~ Java Resources: src
Gil

mmeupacote
-0 Livros,java
mmeupacote,controller
(tJ

- ffi 0

LivrosController ,java

I ,mmeupacote,dao

0
W0

Il

InterfaceLivrosDAO,java
LlvrosDAO,java

mmeupacote,ut~

jij,

ConnectLivrariaFactory,java
W QJ ConverteAnoMySQL,java
[!J hibernate.cfg,xml
livros.hbm,xml

, ffi a\ Libraries
rB l7 build
r3 l7 WebContent
Il

l7 META-INF

ri! l7 WEB-INF
~ atuLivro.jsp

EJJ

formLivros.jsp

~ index.jsp
~ menu,jsp
~ mostrarLivros,jsp

."

Figura 22.1

Colocando o Hibernate para Trabalhar


H muito a se falar sobre o Hibemate, mas infelizmente o foco desse captulo est no desenvolvimento de JavaServer Faces com a um ORM. Por
isso, voc vai comear pela instalao e configurao do Hibemate.
Para baixar o Hibemate, entre no endereo http://www.hibernate.org/
6.htrnI, e selecione o primeiro Iink existente em Binary Releases, o package
Hibernate Core, que no momento em que esse livro escrito, est na
verso 3.2.1.

514

Desenvolvendo Aplicaes Web com JSP...

Binary Releases
Package

Version

Release date Category

Hibernate Core

3 .2.1 GA

16.11.2006

Production

DOW~d

Hibernate Annotations

3.2.0 GA

16.10.2006

Production

Dow

Hibernate EntityManager

3.2.0 GA

16.10.2006

Production

Download

Hibernate Tools

3.2 beta 8

12 .10.2006

Development Down/oad

NHibernate

ad

1.0 .3

03.11.2006

Production

Down/oad

1.2.0 beta 2

10.11.2006

Testing

Down/oad

NHibernate Extensions

1.0.3

03.11.2006

Production

Oownload

JBoss Seam

1.0.1

18.06 .2006

Production

Oownload

Figura 22.2

Baixe o arquivo com a compactao que deseja trabalhar. Se o seu


sistema operacional for o Windows, por exemplo, selecione hibernate3.2.1.ga.zip, caso seja o Linux, selecione hibernate-3.2.1.ga.tar.gz.
Depois de baixar, descompacte-o em um diretrio. Pegue os arquivos
listados a seguir e coloque-os dentro do diretrio lib da sua aplicao:
1. antlr-2.7.6,jar
2. asm.jar
3. asm-attrs,jars
4. c3pO-O.9.0,jar
5. cglib-2.1.3,jar
6. commons-collections-2.1.1.jar
7. commons-Iogging-1.0A,jar
8. dom4j-1.6.1.jar
9. hibemate3.jar
10. jta,jar

~.tenQa~

No se esquea de utilizar os mtodos j vistos anteriormente


para trabalhar com essas bibliotecas em sua aplicao, tanto
com a IDE NetBeans como com a IDE Eclipse.

JavaServer Faces e Hibernate ~

515

Mapeando a sua Tabela


Antes de utilizar o Hibernate, voc tem que fazer um arquivo que ir mapear
as tabelas que deseja trabalhar. Como o exemplo simples, apenas uma
tabela ser mapeada aqui .
Para um banco de dados, cada linha de uma tabela contm um nome.
Na maior parte das tabelas, sempre h um campo especial, no qual se usa
uma chave, conhecida como chave primria.
Essa coluna com uma chave primria, a ID da nossa tabela, visto de
uma forma diferente no modelo orientado a objetos, onde essa identidade
no encontrada dessa forma. Em Java, voc define a identidade dos objetos utilizando um mtodo como equals(Object object), da maneira que lhe
convm. A implementao padro desse mtodo define a identidade atravs da posio de memria ocupada pelo objeto.
Como o banco de dados no entende essas informaes orientadas a
objetos, a soluo adicionar aos objetos um identificador no natural,
como os que os encontrados em banco de dados. Dessa forma, o banco de
dados e o Hibernate sero capazes de diferenciar os objetos e montar os
seus relacionamentos.
Como voc j tem um Bean Livros criado, a coisa a fazer o arquivo
que ir mape-Io. Crie o arquivo listado a seguir, colocando-o no diretrio
classes da sua aplicao. No se esquea que no NetBeans voc ir definir
esse arquivo dentro de Source Packages, fora de qualquer pacote existente
e no Eclipse dentro de src, como j visto na primeira imagem mostrada
deste captulo.
livros. hbm. xml.

<?xrn1 version="1 . 0" encoding="UTF-8"?>


<!DOCTYPE hibernate-rnapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3 . 0//EN"
''http: // hibernate.sourceforge. net/hibernate-rnapping-3.0.dtd">
<hibernate-mapping>
<class name="meupacote . Livros" table="li vros" >
<!- Identificador (PK) da classe Livros ->

516

[)jlJ Desenvolvendo Aplicaes Web com JSP...

<id name="isbn" column="isbn" type="string">


<generator class="assigned"l>
</id>
< !-

Pr opriedades da classe Li vr os

->

<property name= " titulo " type="string" I >


<property name="edicao"
column="edicao_nwn" type="integer" I>
<property name="publicacao"
column="ano-publicacao" type="string" I>
<property name ="descricao " type= "string" I>
</class>
</hibernate-mapping>

Embora no seja obrigatrio, a criao do arquivo que ir mapear a


sua tabela deve ter como boa prtica a extenso .hbm.xml.
Todos os arquivos XML que mapeiam as classes para as tabelas de
banco de dados no Hibernate possuem a estrutura bsica mostrada nesse
exemplo. O arquivo XML comea normalmente com as definies da DTD
(Definio do Tipo do Documento) e da tag raiz, o <hibernate-mapping>.
Observando o arquivo criado, no difcil entender como ele funciona. Assim que voc abre o elemento raiz <hibernate-mapping/>, um subelemento <c1ass/> criado com os atributos name, onde voc configura o
local em que se encontra o seu Bean, e table, onde configurado o nome
da tabela existente no banco de dados.
O elemento que ir identificar o campo com a chave primria na sua
tabela o <id/>, que contm os atributos:
~ name - indica o nome da coluna representado na classe.
~ column - o nome da coluna no banco de dados .
~ type - o tipo de dados usado.
Em meio a esse elemento, o <id/>, voc tem um elemento chamado
<generator/>. Este elemento guarda a informao de como o campo com a
chave primria no banco de dados gerado. Existem diversas classes de
geradores, que so definidas no atributo c1ass desse elemento. Caso o seu

JavaServer Faces e Hibernate [iI]

517

campo ID seja auto-incrementado, por exemplo, voc poderia indicar nesse


elemento, atravs do atributo class, o valor increment, que incrementa um
ao valor da chave sempre que h a insero de um novo objeto no banco.
As propriedades so indicadas logo a seguir, atravs do elemento
<property/>. Esse elemento contm os mesmos atributos mostrados no
elemento ID .

Configurando o Hibernate
Para a configurao do Hibemate, existem trs formas:
1. Instanciar um objeto de configurao, atravs de
org.hibemate.cfg.Configuration, e inserir suas propriedades de
forma programtica;
2. Criar um arquivo de configuraes com a extenso .properties e
indicar os arquivos de mapeamento programaticamente;
3. Ou criar um arquivo XML, chamado de hibernate.cfg.xml, com
as propriedades de inicializao e os caminhos dos arquivos de
mapeamento das tabelas.
No caso desse livro, a terceira opo foi escolhida por ser simples e
seguir o mesmo padro da configurao anterior, no mapeamento da tabela.
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"- / /Hibernate/Hibernate Configuration DTD 3. 0/ /EN" "http: / /
hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--Configuracao do driver do banco de dados-->
<property name="hibernate.connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<!--A URL de conexao ao banco de dados-->
<property name="hibernate.connection.url">

518

(1iil]

Desenvolvendo Aplicaes Web com JSP...

jdbc:mysql://localhost/livraria
</property>

<!--Nome do usuario-->
<property name="hibernate.connection.username">
edson
</property>
<!--A senha de acesso ao banco de dados-->
<property name="hibernate.connection.password">
integrator
</property>
<! - -O dialeto usado pelo Hibernate para conversar com o banco-->
<property name="hibernate. dialect" >
org.hibernate.dialect.MySQLDialect
</property>
<!--O arquivo que mapeia a tabela e o Bean Livros-->
<mapping resource="livros.hbm.xml."/>
</session-factory>
</hibernate-configuration>

Esse arquivo XML tambm de simples entendimento. Primeiro voc


inicia como a configurao do mapeamento da tabela, mostrado anteriormente, com as definies da DTD. Depois inicia a configurao do arquivo com o elemento raiz <hibernate-configuration/>. Dentro do elemento
<session-factory/> que se inicia o trabalho para se conectar ao banco de
dados .
As configuraes aqui esto divididas em elementos <property/>,
onde a cada um contm um atributo chamado name, indicando o que ele
faz. A seguir voc tem cada valor do atributo name listado por ordem de
apario na configurao do Hibernate:
~ hibernate.connection.driver c1ass: nome da classe do driver
JDBC do banco de dados que est sendo utili zado . No caso a confi gurao est utilizando o driver do MySQL.
~ hibernate.connection.url: a URL de conexo especfica do banco de dados que est sendo utilizado. No caso o banco de dados
livraria, o utilizado por todo o li vro .

JavaServer Faces e Hibernate


~

[1jjlJ

519

hibernate.connection.username: o nome de usurio com o qual


o Hibemate deve se conectar ao banco de dados. No caso, pela
configurao edson.
hibernate.connection.password : a senha do usurio com o qual
o Hibemate deve se conectar ao banco de dados. No caso, a senha
configurada integrator.
hibernate.dialect: o dialeto no qual o Hibemate dever utilizar
para se comunicar com o banco de dados. uma implementao
do dialeto SQL especfico do banco de dados a ser utilizado, onde
h uma identificao para as particularidades do banco de dados
em questo. Note que no caso foi utilizado o dialeto para o MySQL.
Cada banco de dados tem um dialeto prprio para usar no
Hibemate.

Alm do mais, nem todos os bancos de dados so suportados pelo Hibemate,


embora os mais populares sejam. A seguir voc tem uma listagem dos dialetos possveis de serem usados, caso voc esteja fazendo os exemplos deste livro com outro banco de dados:
DB2 - org.hibemate.dialect.DB2Dialect
HypersonicSQL - org.hibemate.dialect.HSQLDialect
Informix - org.hibemate.dialect.InformixDialect
logres - org.hibemate.dialect.IngresDialect
Interbase - org.hibemate.dialect.InterbaseDialect
Pointbase - org.hibemate.dialect.PointbaseDialect
PostgreSQL - org.hibemate.dialect.PostgreSQLDialect
Mckoi SQL - org.hibemate.dialect.MckoiDialect
Microsoft SQL Server - org.hibemate.dialect.SQLServerDialect
MySQL - org.hibemate.dialect.MySQLDialect
Oraele (any version) - org.hibemate.dialect.Orac1eDialect
Oraele 9 - org.hibemate.dialect.Oracle9Dialect
Progress - org.hibemate.dialect.ProgressDialect
FrontBase - org.hibemate.dialect.FrontbaseDialect
SAP DB - org.hibemate.dialect.SAPDBDialect
Sybase - org.hibemate.dialect.SybaseDialect
Sybase Anywhere - org.hibemate.dialect.SybaseAnywhereDialect

520

[Ijjlj Desenvolvendo Aplicaes Web com JSP...

Alm dos elementos mostrados, existe tambm o elemento <mapping/


>, no qual atravs do atributo resource voc configura o arquivo no qual
est mapeado a tabela no qual ser utilizada. Se houverem vrias tabelas,
vrios elementos <mapping/> sero configurados nesse arquivo .

Conectando-se ao Hibernate
Para trabalhar com o Hibemate, uma classe ser criada, com o mesmo nome
dado no exemplo existente no uso do DAO. Mas apenas o nome ser igual.
ConnectLivrariaFactory.java

package meupacote.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class ConnectLivrariaFactory


private static final SessionFactory sessionFactory;

private static final ThreadLocal<Session> threadLocal


new ThreadLocal<Session>{ );
static{
try{
sessionFactory = new Configuration(
. configure ("hibernate . cfg . xml." l
.buildSessionFactory( l;

catch{Throwable t){
throw new ExceptionInInitializerError{t);

JavaServer Faces e Hibernate

l'il 521

public static Session getlnstance( ){


Session session = (Session) threadLocal.get( );
session = sessionFactory.openSession( );
threadLocal.set(session);
return session;

A primeira coisa que essa classe faz iniciar uma SessionFactory,


como esttica. O objeto SessionFactory armazena os mapeamentos e configuraes do Hibemate. Dentro do bloco esttico, a SessionFactory utilizada para a chamada da configurao do Hibemate, atravs da classe
Configuration( ). Com essa classe, o mtodo configure( ) utilizado, recebendo como parmetro o arquivo XML da configurao do Hibemate.
Alm disso, o mtodo buildSessionFactory( ) chamado tambm para
retomar um objeto SessionFactory, no qual ser identificada uma "fbrica" capaz de obter e retomar objetos do tipo Session . Um objeto Session
pode ser considerado como uma sesso de comunicao com o banco de
dados atravs de uma conexo JDBC.
Esse retomo ser feito pelo mtodo getInstance( ). Observe que foi
utilizado um inicializador esttico para as configuraes, onde cada sesso
associada a um objeto threadLocal . Esse objeto permite que cada sesso
abra um processo concorrente, onde existe uma ID para cada sesso aberta.
Para seguir o padro DAO criado anteriormente, no Captulo 20 e 21,
uma classe chamada LivrosDAO criada no pacote meupacote.dao.
A seguir a listagem mostra essa classe na integra:
LivrosDAO. j ava

package rneupacote . dao ;


import java.util.List;
import meupacote . Livros;
import meupacote.util.ConnectLivrariaFactory;

522 [il] Desenvolvendo Aplicaes Web com JSP.. .


import org.hibernate.HibernateExceptioni
import org . hibernate.Sessioni
import org.hibernate . Transactioni

public class LivrosDAO implements InterfaceLivrosDAO (


private Session session;
public void salvar(Livros livro) ()
session = ConnectLivrariaFactory.getlnstance(

Transaction tx

)i

= null;

try {
tx = session.beginTransaction(

)i

session. save (livro) i


tx.commit(

)i

catch (HibernateException e) (
e.printStackTrace( );
tx. rollback ( ) i

finally (
session . close(

)i

public void excluir(Livros livro)

(E9

= ConnectLivrariaFactory.getlnstance(
Transaction tx = null;
session

try (
tx = session.beginTransaction( );
session.delete(livro) i
tx.commit( );

catch (HibernateException e) (
e.printStackTrace( );

);

JavaServer Faces e Hibernate [iijI]

523

tx.rollback( )i
finally {
session.close(

)i

public void atualizar(Livros livro)

{~

session = ConnectLivrariaFactory.getlnstance(
Transaction tx = nulli

)i

try {
tx = session.beginTransaction( )i
session.update(livro) i
tx.conunit( )i
catch (HibernateException e)
e.printStackTrace( )i
tx.rollback( ) i
finally {
session.close( )i

public List todosLivros( ) (C)


session = ConnectLivrariaFactory.getlnstance(
List list

= session.createQuery("from

)i

Livros") .list( ) i

return listi

Como mtodo da classe LivrosDAO, salvar( )0, tem a incumbncia


de annazenar novos cadastros no banco de dados. Observe que logo no
incio desse mtodo, a classe ConnectLivrariaFactory traz a sesso atravs do mtodo getInstance( ), iniciando assim uma sesso, atravs do objeto Session criado nessa classe.

524 [\J Desenvolvendo Aplicaes Web com JSP...


Esse mtodo utiliza um objeto do tipo Transaction que, quando utilizado em conjunto com um objeto Session, pennite transaes em um banco de dado relacional. Para salvar os dados vindos do objeto Livros, o
mtodo save( ) do objeto Session utilizado. A transao efetuada atravs do mtodo commit( ). Em caso de erro, a clusula catch chama o mtodo rollback( ) para desfazer a transao. Depois de utilizado, o objeto
Session fechado atravs da clusula finally, atravs do mtodo c1ose( ).
O mtodo excluir( )8 da classe, exclui um registro na tabela de livros, utilizando o mtodo delete( ) do objeto Session. Assim como no mtodo salvar( ), aqui existem transaes.
O mtodo atualizar( )e possibilita a atualizao dos dados existentes em uma linha de registro da tabela livros. A atualizao efetuada atravs do mtodo update( ) do objeto Session.
Com o mtodo todosLivros( )0, voc traz todos os registros existentes na tabela livros, em um objeto List. Esse mtodo retoma uma lista com
todos os objetos recuperados, utilizando o mtodo createQuery() do objeto Session. Esse tipo de consulta utiliza a linguagem HQL (Hibemate Query
Language), passando como parmetro uma String "from Livros", onde esse
parmetro contm o nome da Bean e no o nome da tabela.

INTERFACE UTILIZADA

A seguir voc tem a interface utilizada por pela classe LivrosDAO.


InterfaceLivrosDAO.java
package meupacote.dao;
import java.util.List;
import meupacote.Livros;
public interface InterfaceLivrosDAO
public abstract void salvar (Livros livro);

JavaServer Faces e Hibernate [)ilJ

525

publi c abstrac t void exc l ui r( Livr os l ivro );


public abstract vo id atuali zar (Livr os livr o );
public abstract List t odosLivro s( ) ;

Para a Aplicao Funcionar


Parece incrvel, mas como a didtica desse exemplo segue fielmente o exemplo dado no Captulo 20 e 21, o restante do cdigo similar.
A classe LivrosController.java chamado pelas pginas JavaServer
Faces e no h alteraes nesse seguimento. O resultado idntico ao visto
no Captulo 21, sendo assim, no h mais o que explicar.

Hibernate Annotations
Como opo, o Hibernate usa as anotaes (annotations) existentes no JDK5
para o mapeamento objeto/relaciona!. Com anotaes, o Hibernate fica bem
mais simples e voc acaba usando menos o XML, em relao ao
mapeamento de tabelas.
Esses metadados agora sero representados atravs de anotaes EJB
3.0, para mostrar a diferena da configurao original como vista anteriormente.
Adicionando o Hibernate Annotations
Alm dos arquivos listados anteriormente nesse Captulo, voc vai precisar adicionar mais dois . Mas antes voc precisar baixar o pacote do
Hibernate Annotations.
Na rea de downloads do site www.hibernate.org, voc tem o link
para baixar o pacote Hibernate Annotations, que se encontra na verso
3.2.0 GA no momento em que esse livro escrito. A regra a mesma j
vista anteriormente no incio desse captulo, onde voc tem o formato .zip
ou .tar.gz.

526

~ Desenvolvendo Aplicaes Web com JSP...

Binary Releases
package

Version

Release date

Category

Hibernate Core

3.2.1 GA

16.11.2006

Production

Hibernate Annotations

3.2.0 GA

16.10.2006

Production

Hibernate EntityMl!nl!ger

3.2.0 GA

16.10.2006

Production

Hibernate Tools

3 .2 betl! 8

12.10.2006

Development Down/oad

NHibern/lte

1.0 .3

03.11.2006

production

Down/oBd

1.2.0 beta 2 10.11 .2006

Testing

Down/oad

NHibernate Extensions

1.0.3

03.11.2006

Production

Download

JBoss Seam

1.0.1

18.06.2006

Production

Down/oad

Download

~~ad

Dow

Figura 22.3

Ao baixar o arquIvo, descompacte-o e pegue o arquivo chamado


hibernate-annotations.jar e dentro do diretrio Iib, desse pacote, pegue o
arquivo ejb3-persistence.jar.
Esses dois arquivos devero ficar no diretrio Iib da sua aplicao,
junto com os demais j usados. Ao final, voc ter os seguintes arquivos
JARs pertencente ao Hibemate com as anotaes:
HIBERNATE

1. antlr-2.7.6,jar
2. asm.jar
3. asm-attrs,jars
4. c3pO-0.9.0,jar
5. cglib-2.1.3,jar
6. commons-collections-2.l.l,jar
7. commons-logging-1.0A,jar
8. dom4j-1.6.1.jar
9. hibemate3.jar
10. jta.jar

JavaServer Faces e Hibernate [ilJ 527


ANNOTATIONS

11. hibernate-annotations.jar
12. ejb3-persistencejar

O Conceito da Nova API de Persistncia


At a verso J2EE 1.4, a platafonna Java no possua uma fonna simples
de mapear objetos em um banco de dados. Uma fonna mais complexa podia ser utilizada, exigindo um container EJB . Com o JPA (Java Persistence
API), definida na JSR-220 (Enterprise JavaBeans, Version 3.0), padroniza
o mapeamento de objetolrelacional na platafonna Java. Apesar de descrita
na especificao do novo EJB, na verso 3, a JPA no depende de um
container para funcionar, sendo possvel usar e testar solues apenas com
o Java SE.
AJPA baseada no conceito POJO (Plain Old Java Object), algo como
"Bom e Velho Objeto Java", que incorpora idias de renomados frameworks
de persistncia para padronizar o mapeamento O/R em Java.
Na JPA, os objetos persistentes so denominados entidades (Entities).
Uma entidade um objeto simples (POJO), que representa um conjunto de
dados persistido no banco. Como entidades so definidas por classes Java
comuns, sem relao com frameworks ou bibliotecas, elas podem ser abstratas ou herdar de outras classes, sem restries.
A chave primria, indicada como um conceito importante nas entidades, possuem uma identificao e estado, sendo seu ciclo de vida independente do tempo de vida da aplicao.
Para que uma entidade se tome persistente, necessrio associa-la a
um contexto de persistncia. Esse contexto fornece a conexo entre as instncias e o banco de dados.
As classes e interfaces da JPA esto localizadas no pacote
javax.persistence. Com isso, voc pode fazer o mapeamento da sua aplicao, utilizando anotaes. Graas a isso, voc pode dispensar os descritores
XML para cada uma das entidades da aplicao.
Por isso, uma entidade rotulada com a anotao @Entity, sendo ela
uma classe Java comum.

528

l1filI Desenvolvendo Aplicaes Web com JSP...

Uma tabela representada pela anotao @Table e a chave primria


pela anotao @Id. Cada coluna especificada pela anotao @Column.
Para o suporte as anotaes, a biblioteca ejb3-persistence.jar foi adicionada no seu projeto.
Java Annotation, o que isso?
Java Annotation (Anotaes Java) so tipos especialmente definidos com o
intuito de simplificar tarefas em Java com uma simples anotao, colocada
em frente (ou acima de) elementos de programa Java como classes, mtodos, campos e variveis.
Quando um elemento do programa anotado, o compilador l a informao contida nessa anotao e pode reter essa informao nos arquivos
de classe ou dispor disso de acordo com o que foi especificado na definio
de tipo da anotao. Quando retiver nos arquivos de classe os elementos
contidos na anotao podem ser examinados em runtime por uma API baseada em reflexo. Dessa forma, o NM (Java Virtual Machine) ou outros
programas podem olhar esse metadata para determinar como interagir com
os elementos do programa ou alterar seus comportamentos.
Anotaes uma oposio rigidez da herana, enriquecendo uma
classe com comportamentos de forma muito mais granular.
Uma anotao precedida por um smbolo de @ seguida de uma
meta-anotao (seja ela personalizada ou no).
As anotaes foram introduzidas a partir do Java SE 5 e atualmente
fazem parte do Java EE 5, em especial do EJB3 .

Configurando sua Aplicao para Utilizar


Annotations
Agora que sua aplicao pode suportar anotaes, altere o Bean Livros
como mostrado a seguir, na integra:
Li vros . j ava
package meupacote;
lIlport javax.persistence.Column;
lIlport j avax. persi stence . Enti ty;

JavaServer Faces e Hibernate (1i] 529


import javax.persistence . Idi
import javax.persistence.Tablei
@Entity
@Table(name = "livros")
@SuppressWarnings("serial")

public class Livros implements java.io.Serializable{


private String isbn;
private String titulo;
private int edicao;
private String publicacao;
private String descricao;

public Livros( ) ( )
public Livros(String isbn, String titulo, int edicao ,
String publicacao, String descricao)
this.isbn=isbn ;
this.titulo=titulo;
this.edicao=edicao;
this .publicacao=publicacao;
t his.descricao=descricao;

public void setIsbn(String isbn) (


this.isbn = isbn;

@Id
@Column(name="isbn")

public String getIsbn( ) (


return isbn;

publ ic void setTitulo(String titulo) {


this. t itulo = titulo;

.~

_.~

--"

--"'---

-~--

~-

530

Desenvolvendo Ap licaes Web com JSP...

@Column(name="titulo")

public String getTitulo( ) (


return titulo ;

public void setEdicao(int edicao) (


this . edicao = edicao;

@Column(name="edicao_num")

public int getEdicao( ) (


return edicao;

public void setPublicacao(Str ing publicacao)


this.publicacao = publicacao;

@Column(name="ano-publicacao")

public String getpublicacao()


return publicacao;

public void setDescricao(String descricao) (


this.descricao = descricao;

@Column(name="descricao")

public String getDescricao( ) {


return descricao;

JavaServer Faces e Hibernate [)il]

531

Como voc pde perceber, criar anotaes em um arquivo Java muito


simples. A seguir voc tem uma tabela contendo as anotaes utilizadas
nesse arqUivo como um resumo:

Tabela 22.1
Anotao

Descrio

@Entity

A entidade. Indica que essa classe uma entidade (entity bean), que
nada mais do que um POJO, representando um objeto de negcio.
Sem a definio de um parmetro adicional, assumido que o valor
padro ser o nome da classe .

@Table

Mapeia o nome da tabela . Caso no seja utilizado o parmetro name,


o valor padro assumido o nome da classe.

@Id

o identificador da entidade. Normalmente se refere a chave primria


da tabela relacional.

@Column

Mapeia o nome da coluna existente na tabela relacional. t: importante


frisar que o Hibernate assume os atributos da classe como os mesmos nomes dos campos da tabela existente no banco de dados. A
utilizao dessa anotao com o atributo name se faz necessrio
nesse caso, uma vez que existem campos de nomes diferentes no
modelo relacional com relao classe .

A CONEXO ATRAVS DAS ANOTAES

A conexo feita anteriormente com a utilizao padro do Hibemate tambm sofrer uma pequena modificao, pois agora ele est trabalhando com
anotaes .
Nesse caso, a classe ConnectLivrariaFactory ser alterada nos destaques
para aceitar as anotaes:
ConnectLivrariaFactory.java
package meupacote.util;
import org .hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;4)

532 l\I Desenvolvendo Aplicaes Web com JSP...


public class ConnectLivrariaFactory {
private static final SessionFactory sessionFactory;
private static final ThreadLocal<Session> threadLocal
new ThreadLocal<Session>();
static{
try{
sessionFactory = new AnnotationConfiguration(
. configure ("hiberna te. cfg . xml")
.buildSessionFactory( )i

)~

o uso da classe AnnotationConfiguration() ser necessria para que


o arquivo hibernate.cfg.xml aponte corretamente para as anotaes existentes na classe Livros.
CONFIGURANDO O HIBERNATE PARA ACEITAR ANOTAES

o que por fim, voc dever ter uma alterao no arquivo hibernate.cfg.xml
para apontar corretamente para as anotaes. Nesse caso, o arquivo criado
para o mapeamento da tabela livros no mais necessrio. O arquivo
mostrado na integra a seguir:
hibernate.cfg.xml

<?xml version="l.O" encoding="utf-8"?>


<!DOCTYPE hibernate-configuration PUBLIC

"- I IHibernate/Hibernate Configuration DTD 3. OI IEN"


''http:/ / hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--Contiguracao do driver do banco de dados-->
<property narne="hibernate.connection.driver_class">

org.gjt.mm .mysql . Driver


</ property>

JavaServer Faces e Hibernate

lI 533

<!--A URL de conexao-->


<property name="hibernate.connection.url">
jdbc:mysql://localhost/livraria
</property>

<!--Nome do usuario-->
<property name="hibernate.connection.username">
edson
</property>

<!--A senha de acesso ao banco de dados-->


<property name="hibernate.connection.password">
integrator
</property>
<!--O dialeto usado pelo Hibernate-->

<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--O arquivo que mapeia a tabela e o Bean Livros-->

<mapping class="meupacote.Livros" />


</session-factory>
</hibernate-configuration>

Nesse caso, o elemento <mapping/> contm o atributo class que aponta para o Bean Livros, onde contm as anotaes .

Log4J em um Projeto Utilizando Hiberna.te

o Log4j

um projeto open source desenvolvido pelo Projeto Jakarta da


Apache e consiste em um framework de logging de mensagens para indicar
o comportamento de determinada aplicao.
Para configurar o Log4J em sua aplicao, o Hibemate traz dentro do
diretrio lib encontrado no arquivo hibernate-3.2.1.ga.X, um JAR chamado log4j-1.2.11.jar. Pegue esse JAR e coloque junto aos outros existentes
no diretrio lib da sua aplicao.

534

[1jjl] Desenvolvendo Aplicaes Web com JSP...

CONFIGURANDO O ARQUIVO LOG4J.PROPERTIES

Depois de instalado no Tomcat o Log4J, voc precisa configur-lo para que


ele lhe d logs com as formataes desejadas. Voc ir criar um arquivo
chamado de log4j.properties e ir coloc-lo junto ao arquivo
hibernate.cfg.xml.
Dentro desse arquivo, voc o configurar da seguinte forma:
log4j.properties
log4j.rootLogger= INFO, destino
log4j.appender. destino =org.apache.log4j.ConsoleAppender
log4j.appender. destino.layout =org.apache.log4j.PatternLayout
log4j.appender. destino.layout.ConversionPattern= %d %-5p %-5c{3} %x
->

%m%n

Ao iniciar a chamada de sua aplicao, aps o reinicio do contexto,


voc ter sadas de log no console.
Isso o ajuda a depurar possveis problemas que podem estar ocorrendo na comunicao entre a sua aplicao e o Hibemate ou entre o Hibemate
e o banco de dados.
NVEIS DE LOGGING

Os nveis de logging, definidos em log4j.rootLogger, esto em ordem decrescente na hierarquia: ALL, DEBUG, INFO, WARN, ERROR, FATAL,
eOFF.
Em um nvel muito baixo, voc pode ter perda de performance. Em
um nvel muito alto, voc pode perder informaes cruciais. Vale lembrlo que isso deve ser sempre analisado para que no haja problemas para
uma possvel depurao.
logger est configurado como INFO, portanto, sero exibidos todos
os logs FATAL, WARN, ERROR e INFO.

JavaServer Faces e Hibernate

lI 535

LAYOUTS

o layout o fonnato de como ser exibida a mensagem de log em Log4J. O


layout definido em Esse layout definido em log4j.appender.destino.layout
do seu arqu i \ '0 log4j.properties. Atravs de log4j.appender. destino.layout.
ConversionPattern voc personaliza a sada.

o PatternLayout
Fonnata a sada do log baseado em um padro de converso. O PattemLayout
retoma uma String que pode ser modificada pela converso de padres
(log4j.appender. destino.layout.ConversionPattern). A Tabela a seguir
demonstra as principais possibilidades que voc pode usar em PatternLayout.
Tabela 22.2 - Principais caracteres de converso
Caractere

Descrio

Exibe o nome da classe. No Tomcat, isto exibe o componente que fez a


entrada no log.

Exibe a data do evento no log, que pode ser seguida por um formato de
data includo entre chaves. Por exemplo, %d{HH:mm:ss} ou
%d{dd/MM/yyyy HH:mm:ss}.

O nome do arquivo onde o pedido de logging foi emitido.

Mostra o mtodo que chamou o evento de log. A informao de localizao depende da implementao do JVM, mas normalmente consiste no
nome completamente qualificado do mtodo chamado, seguido pelo
nome do arquivo e nmero de linha entre parnteses. Por exemplo:
org.apache.jk.server,JkMain.start(JkMain.java:355).

O nmero da linha onde o evento de log foi requisitado.

Exibe a mensagem associada ao evento de logging.

O nome do mtodo em que o evento de log foi requisitado.

O nvel do evento de log.

O nmero de milissegundos passados desde o incio da aplicao at a


criao do evento de logging.

Usado para exibir o nome da thread que gerou o evento de logging.

Quebra de linha.

%%

A seqncia produz um nico sinal de porcentagem.

536 Ill

Desenvolvendo Aplicaes Web com JSP...

Usando a Sada no Console


A sada feita no console utilizando o padro:
log4j.appender.destino=org.apache.log4j.ConsoleAppender

Um Pouco mais de JSF e Hibernate


Nessa seo voc ir acrescentar alguns mtodos que iro dar a uma pgina
JSF a possibilidade de fazer uma consulta de ttulos atravs do Hibernate.
Na classe LivrosDAO adicione o mtodo mostrado a seguir:
LivrosDAO. j ava
public List consultarTitulos(String titulo)
session = ConnectLivrariaFactory.getlnstance();
Query query = session.createQuery(
"frem Livros 1 where 1. titulo like : titulo" );
List list = query.setString("titulo", "%"+titulo+"%") .list( );
return list;

Esse mtodo muito parecido com o utilizado para mostrar todos os


livros. A diferena se encontra na linguagem HQL. Uma caracterstica especfica, herdada do JDBC, o uso de parmetros nas queries.
Com algumas adies a query HQL, o cdigo da query ficou from
Livros I where I.titulo Iike, onde o "I" um alias de Livros. O parmetro
de passagem em uma consulta deve ser iniciado com ":" (dois pontos) para
que o Hibernate saiba que ' isso um parmetro que vai ser inserido na
query. Lembra do parmetro "?" usado nos exemplos com JDBC?
Voc insere um parmetro nomeado, usando o mtodo com incio set
correspondente ao tipo de parmetro (no caso setString( ) por ser uma
String). O primeiro valor o nome com o qual ele foi inserido como
parmetro na query e o ~utro parmetro o valor que deve ser colocado.

JavaServer Faces e Hibernate [ljl]

537

Como uma consulta com a clusula Iike, a varivel titulo foi concatenada
com o caractere curinga da SQL "%". O resultado pode ser uma ou mais
linhas, por isso esse mtodo devolve um List.
Altere a Interface
A interface dever ser alterada tambm, adicionando esse mtodo:
InterfaceLivrosDAO.java

public abstract List consultarTitulos(String titulo);

CLASSE CHAMADA PELO

JSF

A classe LivrosController ter a adio de um atributo e de alguns mtodos para que sejam acessveis por suas pginas JSF.
LivrosController.java

private String keysearch;


public String getKeysearch( ) (
return keysearch;

public void setKeysearch(String keysearch)


this.keysearch = keysearch;

public DataModel getBuscarLivro( ) (


InterfaceLivrosDAO idao = new LivrosDAO( );
model =
new ListDataModel(idao. consultarTitulos(keysearch));
return model;

538

[il] Desenvolvendo Aplicaes Web com JSP...

Com o atributo keysearch voc pode enviar a palavra chave para que
o mtodo getBuscarLivro( ) pegue os resultados vindos do mtodo
consultarTitulos( ) e retorne um DataModel. Dessa forma, voc monta
uma belo DataTable, podendo fazer outras coisas alm de exibir as informaes pesquisadas.
As Pginas JSF
Voc criar duas pginas JSF. Uma contendo o campo de formulrio que
enviar a palavra chave e a outra contendo o DataTable que mostrar os
resultados encontrados na pesquisa.
busca. jsp
<%@ page language="java" contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<%@taglib uri=''http://java.sun.com/jsf/core'' prefix="f" %>
<%@taglib uri=''http://java.sun.com/jsf/html'' prefix="h" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional //EN"
''http://www .w3.org/TR/htm14/loose.dtd''>
<html>
<head>
<title>Busca com JSF e Hibernate</title>
</head>
<body>
<f:view>
<h:form id="buscar">
<h:panelGrid columns="2">
<f:facet name="header">
<h:outputText value="Busca de Livros"/>
</f:facet>
<h:outputText value="Ttulo:" />
<h:inputText size="30" id="titulo"

539

JavaServer Faces e Hibernate


value=I#{livrosView.keysearch}" />
</h:panelGrid>
<h:commandButton value=IBuscar" action="pesquisado" />
</h:form>
</f:view>
</body>
</html>

Essa pgina simplesmente criar um formulrio com uma caixa de


texto e um boto.
--------------------=-El
~i

Busca com JSF e Hlbernate X

(1'

<;:J

c:>

fi) f:!,)0>

Ihttp://localhost:8080/JavaServerFacesHibernateAnnotationsIbusca.faces v;1

Busca de Livros

Ttulo: Dominando

I Buscar I
Figura 22.4

A pgina seguinte a que mostrar os resultados da pesquisa.


mostrarLivrosPesquisado.jsp
<%@ page language=" j ava" contentType=" text/html"
pageEncoding="ISO-8859-1"%>
<%@taglib uri=''http://java.sun.com/jsf/core'' prefix="f"%>
<%@taglib uri=''http://java.sun.com/jsf/html'' prefix="h"%>
<!OOCTYPE HTML PUBLIC
"-/ /W3C/ /OTO HTML 4.01 Transi tional/ /EN"
''http://www.w3.org/TR/htm14/loose.dtd">
<html>

540

[J Desenvolvendo Aplicaes Web com JSP...

<head>
<title>Resultado de livros pesquisados </title>
</head>
<body>
<f:view>
<h :messages I>
<hl>Livros Encontrados</hl>
<h:form>
<h:dataTable value= ' # {livrosView.buscarLivro },
var= ' item' border="l "
cellpadding="2" cellspacing="O">
<h : column>
<f: facet name="header">
<h:outputText value= "ISBN" I>
</ f : f acet>
<h:outputText value= "#{item .i sbn}" I>
</h:column>
<h:column>
<f: facet name ="header">
<h : outputText value="Ttulo" I>
</f:facet>
<h:outputText value="#{item.titulo}" I>
</h:column>
<h : column>
<f:facet name="header">
<h:outputText value= "Publicado em" I>
</f:facet>
<h:outputText val ue=#{item.publicacao}"
converter="converteAnoMySQL" I>
</h:column>
</h:dataTable>
<Ih: form>
</f:view>
</body>
</html>

JavaServer Faces e Hibernate l\I

541

o mtodo getBuscarLivro( ) da classe LivrosController montar a


tabela atravs da tag JSF <h:dataTable/>.
O resultado dessa pgina como mostra a Figura 22.5 a seguir:
P Resultado de MOS pesquisdos x

Livros Encontrados

Figura 22.5

Mas s Isso?
Sei que voc, caro leitor, deve estar se perguntando: Mas s isso?
No que se refere ao desenvolvimento bsico sim, mas o
aprofundamento da utilizao do Hibernate nesse livro apenas recriaria um
novo. O assunto Hibernate extenso e existem diversos livros no mercado
que o tratam exclusivamente. Alm do mais, na Internet existem diversos
tutoriais que, com esse conceito, voc consegue acompanhar, certo de que
seu aprofundamento questo de uma boa leitura e treino.

.. .. .....
... ...

Captulo

23
JavaServer Faces e a API de
Persistncia EJB 3

JavA PERSISTENCE API J TEVEUMA INTRODUO no Captulo anterior, onde


voc foi obrigado a utiliz-la com as anotaes criadas no Hibernate.
Agora, voc conhecer um pouco sobre outro mapeador de objetorelacional, que tambm suporta a API de persistncia EJB 3, trabalhando
com JavaServer Faces.
Como voc j sabe, a JPA, definida recentemente, padroniza o
mapeamento de objetolrelacional na plataforma Java.
Antes, o desenvolvedor simplesmente poderia criar um objeto persistente como qualquer outro objeto de Java, sem estar atento a tecnologia
que estava persistindo. No era preciso implementar qualquer tipo de
interface ou estender uma classe especial. Graas ao uso de objetos Java
regulares, esse modelo de persistncia ficou conhecido como POJO.
Mas o tempo passou, e uma necessidade maior no desenvolvimento
de aplicaes que exigiam um mapeamento mais sofisticado cresceu.
Nesse cenrio, duas APls de persistncia se destacaram, entre outras
existentes: TopLink e Hibernate.
No mundo comercial, TopLink, um pacote ORM, fornece um poderoso e flexvel framework para trabalhar com objetos Java que se relacionam
com banco de dados. Sua histria um pouco antiga (diga-se de passagem,
que a palavra "antiga" em informtica algo de dez anos). TopLink foi
originalmente desenvolvido por The Object People, em Smalltalk, nos anos
90. As iniciais Top, de TopLink, um acrnimo de The Object People. Em

544

Desenvolvendo Aplicaes Web com JSP...

95 e 96, o produto foi reescrito em Java e renomeado para TopLink for


Java.
Em 2002, a Oracle Corporation adquiriu o TopLink e deu continuidade ao seu desenvolvimento.
TopLink Essentials uma RI (Reference Implementation) de EJB 3.0
Java PersistenceAPI e uma edio da comunidade open-source do produto Oracle's TopLink.
Hibemate, como voc j sabe, um framework open-source e muito
poderoso. Ambos dividem a comunidade de desenvolvimento Java no que
se refere ao mapeamento de objeto/relacional.
Esse Captulo o levar a conhecer um pouco sobre o TopLink Essentials
e definir a sua escolha no que se refere a mais nova implementao Java
EE 5.

!Ioftl
~

O termo POJO (Plain Java Old Object) foi criado por Martin Fowler,
Rebecca Parsons e Josh Mackenzie em 2000, devido aos objetos de Java simples que no estavam atrelados a ferramentas
ou frameworks .

Mas o que Vem a Ser EJB?

o EJB ou Enterprise JavaBeans um componente servidor que roda em


um container para EJB do servidor de aplicao. Considerado como um
dos principais componentes da plataforma Java EE (Java Enterprise
Edition), o EJB tem como principais objetivos da tecnologia fornecer rpido e simplificado desenvolvimento de aplicaes Java baseadas em componentes, distribudas, transacionais, seguras e portveis.
Infelizmente essa no foi bem a realidade. A tecnologia EJB, especialmente os conhecidos Entity Beans, foram sempre acusados de baixa eficincia, alta complexidade e dificuldade de uso.
O Tomcat no suporta EJB. Sendo assim, um outro Container deveria
ser utilizado, com suporte a essa tecnologia, caso essa fosse questo. Esse
captulo no trata diretamente de toda a tecnologia envolta em EJB, o que

JavaServer Faces e a API de Persistncia EJB 3

!J 545

por si s daria um li vro inteiro, e sim uma parte dessa tecnologia, a persistncia. Nesse caso, a persistncia EJB 3 independente de um container
EJB, o que possibilita o uso de um container J2EE 1.4 como o Tomcat.
Embora o suporte e utilizao do EJB3 j tenha tido uma abordagem no
captulo anterior, com o uso do Hibemate, aqui novamente ser tratado
desse assunto, mas com o uso do TopLink Essentials .

Baixando e Configurando o TopLink


Esse captulo essencialmente baseado em anotaes para a persistncia
de dados com o TopLink.
Mas antes de comear, voc precisa baixar o TopLink Essentials. Para
baix-lo, entre no endereo http://www.oracle.com/technology/products/
ias/toplinkljpa/index.html. Clique no link Download.

TopLinkJPA
The Enlerprise JavaBeans (EJB) 3.0 specificalion includes an addilional persislence specificalion
called lhe Java Persistence API (JPA). II is an API for creating, removing and querying across
lightweight Java objects and can be used bolh wilhin a complianl EJB 3.0 Conlainer and a standard
Java SE 5 environment.
TopLink Essentials is lhe opensource community edilion Df Oracle's TopLink product. II provides lhe
JPA funclionality for the EJB 3.0 Reference Implementatioll.

Dowgad

~
Tutori ais

Examples

Discussion

Figura 23.1

Na pgina seguinte, o primeiro link mostrado, a ltima verso do


TopLink Essentials . Por isso, clique no link que est em destaque. No momento em que este livro era escrito, a verso era v2 .b25.

546

~ Desenvolven do Aplicaes Web com JSP...

TopLink JPA: Downloads


Dow nloading TopLink Essentials

,f-; ' f-D~;';-~d' V~~~ ' 2-Build-25 '-----'- 'r~ce ~rR~~ i~;~;~ iW---<{5= _ : - - lOpao I~sues""""""""_"""",,
!Oownload Verslon 2 Bulld 16
!

'r =
,I ~

l:::~Jv"rslOn used 10 SonDo 2.0 R:!


,:,,1

~ "ReSOlved Issues

Oownload Versioll 1 Build 48


Vcrsmn

u S l~ d In

t:JfJ l .O Re1mtmce hnplml1cntotlOn

Figura 23 . 2

Assim que baixar, voc vai notar que o arquivo se encontra em formato l AR. Para descompact-Io, execute o comando a seguir no terminal do
Linux ou no prompt de comando do Windows:
j ava -jar glassfish-persistence-installer-v2-b25.jar

Um caixa de dilogo com um termo de licena ir aparecer. Desa a


rolagem para ler e no final, o boto Accept ficar ativo. Confirme clicando.
~

" Ucellse Agreement

As between Initial Developer and the Contributors, each party i3


responsible for claims and damages arising, directly or indirectl
y, out of its utilization of rights under this License and Vou ag
ree to work with Initial Developer and Contributors to distribute
such responsibility on an equtable bas i s. Nothing herein is int
ended or shall be deemed to constitute any admission o f l1abil1ty

NOTI CE PURSUANT TO SECTION 9 OF THE COHHON DEVELOPHENT AND DISTRI


BUTI ON LICENSE (CDDL)
The GlassFish c ode released under the CDDL shall be governed by t
he laws of the Stata of California (exclud ing conflict-of-law pro
v1s10ns) . Any litigat10n relating to this License shall be subjec
t to the jurisdiction of the Federal Courts of the Northern Distr
ict of California and the state co urts of the State of Californ1a
, with venue lying in Santa Clara County, Cal1forn1a.

,.:'

I
Figura 23.3

Accef\ J [ Decline

JavaServer Faces e a API de Persistncia EJB 3

lI 547

Um diretrio chamado glassfish-persistence aparecer no local da


descompactao. O arquivo que voc vai precisar o toplink-essentials.jar.
Como voc bem j sabe, esse arquivo dever ficar dentro do diretrio lib
da sua aplicao .

Iniciando em TopLink
Para iniciar, voc recriar o exemplo dado nos Captulos anteriores, onde o
Bean Livros contm os exemplos principais.
Como esse livro foi elaborado com o intuito de mudar apenas o DAO,
em todos os exemplos, praticamente seria isso que voc faria com relao
ao mostrado no Captulo sobre o Hibemate.
Mas a idia agora mostrar outros Beans, baseados em outras tabelas
e relaciona-los.

A CRIAO

DO BANCO DE DADOS

At o momento, somente a tabela livros havia sido criada para exemplificar


o trabalho com banco de dados e as aplicaes escritas em Java, em seus
mais diversos tipos.
Agora, com o conhecimento adquirido, voc est pronto para criar as
demais tabelas e o relacionamento .,
A Figura 23.4 a seguir demonstra as demais tabelas que sero criadas
e como elas se relacionam.
autores
'f autoU:J: INTEGER

o nome: VARCHAR(lOO)
O email: VARCHAR(lOO)
O dt ,",se: DATE

MOS

't isbn: VARCHAR(13)

o -titlJci -; VARCHAR(sQj
O

edicao_run: TINYINT(2)

O ano...P<bicacao : YEAR
O desericao: TEXT

toraJd: rriTEGER

..1.

-li

..L

_ ._..._..._._. ___... A ......_....__...._


pcticacao

<'~ PUbIocaeaoi,iiNTEGER-[.. I < autor Jd:


(FK)
ecltora_k:l :
I

O
O
O

~bn:

VARCHAR(13) (FK)
INTEGER
INTEGER (FK)

-- -I ~

edti:..no;ne, VAACHR{i(XJ)

Figura 23.4 - Modelo de Entidade Relacional.

548 ll Desenvolvendo Ap licaes Web com JSP.. .


A listagem a seguir demonstra a SQL para criar as demais tabelas e
inclusive colocar o relacionamento.
Listagem das tabelas encontradas no banco de dados livraria
CREATE TABLE autores (
autor_id int(lO) unsigned NOT NULL auto_increment ,
nome varchar(lOO) default NULL,
email varchar(lOO) default NULL,
dt_nasc date default NULL,
PRlMARY KEY (autor_id)
ENGlNE=InnoDB;
CREATE TABLE editora
editora_id int(lO) unsigned NOT NULL auto_increment,
editora_nome varchar(lOO) default NULL,
PRlMARY KEY (editora_id)
ENGINE=InnoDB;
CREATE TABLE publicacao
publicacao_id int(ll) NOT NULL auto_increment,
isbn char(13) default NULL,
autor_id int(lO) unsigned default NULL,
editora_id int(lO) unsigned default NULL,
PRlMARY KEY (publicacao_id),
KEY fkJ)ub (isbn),
KEY fkJ)ub2 (editora_id),
CONSTRAINT fkJ)ub
FOREIGN KEY (isbn)
REFERENCES livros (isbn)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fkJ)ub2
FOREIGN KEY (editora_id)
REFERENCES editora (editora_id)
ON DELETE CASCADE
ON UPDATE CASCADE
ENGlNE=InnoDB;

JavaServer Faces e a API de Persistncia EJB 3 [J

549

A Modelagem do Sistema
Os Beans que voc ir criar se relacionam entre si, como a anlise feita a
pouco no relacionamento das tabelas.
Na anlise, utili zando UML, foi construdo o diagrama de classes,
conforme pode ser visto na Figura 23 .5 a seguir:
Ineup acote

I
l

l-

Ed itora

edikn: strl'lg
-edtorJ6ctlrtt.ger

editora

l ivros
~ecNString

- deSa1ellCX

_w

Sb'ng

-isbn Stri'lg
!ttO:Stmg

.....

._

,>
Autores

Publicacao

.~s:.tdotes

..

~-<. t.editor.Edilora
.horos:t.Jotro.

M.tore.s

--.torktlnl . .

'.>'-' ......................... - . __ Sltng

_Mscimer1o Dele
.norne: gr~

Figura 23.5 - Diagrama de Classes da Livraria.

Neste diagrama, observa-se uma classe para cada elemento identificado do domnio da aplicao . Voc tem Livros, Editora, Autores e
Publicacao, onde cada um contm seus atributos especficos. Note que h
um sinal de "_" antes do nome de cada atributo . Isso indica que esses atributos so protegidos e sero, portanto, encapsulados (get e set). Aps os
nomes de cada atributo, separado por ":" (dois-pontos), existe o tipo de
cada um.
Para construir esses Beans, voc tambm se valer do uso de anotaes. Observe que todos esses mapeamentos sero criados dentro do pacote meu pacote, que poder ser substitudo pelo seu nome de pacote.

o MAPEAMENTO DOS LIVROS


O primeiro mapeamento ser dos livros. O cdigo a seguir demonstra como
ser o Bean Livros, mas omitindo os getters e setters (uma vez que voc j
sabe o que fazer).

550

[11il]

Desenvolvendo Aplicaes Web com JSP...

Livros. j ava

package meupacote ;
import java.util.Collectioni
import javax.persistence . CascadeTypei
import javax.persistence.Columni
import javax.persistence.EntitYi
import j avax. persistence. Idi
import j avax. persi stence. OneToMany i
import javax.persistence.Tablei
@Entity
@Table(name = "livros")

@SuppressWarnings("serial")
public class Livros implements java.io.Serializable{
@Id
@Column(name="isbn")

private String isbn;


@Column(name="titulo")

private String titulo;


@Column(name="edicao_num")

private int edicao;


@Column(name="ano-publicacao" )

private String anopublicacao;


@Column(name="descricao")

private String descricao;


@OneToMany (cascade=CascadeType . ALL, mappedBy=" livros" )

private Collection<Publicacao> publicacao;


Ii ... getters e setters omitidos. Faa refactor

JavaServer Faces e a API de Persistncia EJB 3

551

Embora no existam muitas novidades com relao ao j apresentado


em exemplo anterior, utilizao de anotaes bem maior nesse daqui.
Analisando o cdigo da entidade voc ver as j conhecidas anotaes
@Entity, @Id e @Co lumn . Mas uma nova anotao surgiu:
@OneToMany. Essa anotao usada para indicar o relacionamento entre
as entidades (como ocorre nos relacionamentos entre tabelas em um banco
de dados relacional). A anotao @OneToMany indica o relacionamento
Um-Para-Muitos, comum em banco de dados. Esse relacionamento significa que, haver um livro, mas que podero existir mais de uma publicao.
Evidentemente isso um caso raro, uma vez que o caso considera uma
outra edio um novo livro. Mas em contrapartida, um mesmo livro poder
ter mais de um autor. Nesse caso, a publicao indicaria isso. Voc poderia
quebrar essa situao em mais partes, normalizando melhor o banco de
dados, mas o caso foi feito com apenas essas tabelas para no estender
demais o assunto.
Dois atributos esto contidos dentro dessa anotao, utilizada no
mapeamento:
1. cascade=CascadeType.ALL - indica que as alteraes na entidade Livros sero refletidas automaticamente nas entidades relacionadas (no caso Publicacao).
2. mappedBy="livros" - indica que na classe Publicacao existe uma
propriedade denominada livros, mapeando o livro do relacionamento (mais adiante na criao da classe Publicacao isso ficar
mais claro).

o MAPEAMENTO DA EDITORA
o

mapeamento da tabela editora no diferente da usada em livros. O


cdigo a seguir demonstra a entidade Editora.

Editora.java
package meupacote;
import java.util.Collectioni
import javax.persistence.CascadeTypei

552

(ljjlJ Desenvolvendo Aplicaes Web com JSP...

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import j avax. persistence. GenerationType;
import javax.persistence.ld;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "editora")

@SuppressWarnings("serial")
public class Editora implements java.io.Serializable{
@Id
@Column(name="editora_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)

private Integer editorald;


@Column(name="editora_nome")

private String editora;


@OneToMany (cascade=CascadeType . ALL, mappedBy=" edi tora" )

private Collection<Publicacao> publicacao;


Ii ... getters e setters omitidos. Faa refactor

Uma nova anotao surge nessa entidade, a chamada


@GeneratedValue. Essa anotao indica que o campo chave editorald
ser gerado automaticamente pelo banco de dados, onde se voc olhar no
cdigo da SQL para gerar as tabelas, notar que o campo editora_id da
tabela editoras auto-increment, a auto-numerao do MySQL.

JavaServer Faces e a API de Persistncia EJB 3 l\i'I

553

o MAPEAMENTO DE AUTORES
o mapeamento da tabela autores segue o padro dos demais . O cdigo a
seguir demonstra a entidade Autores.
Autores. j ava

package meupacote;
import j ava. util. Collection;
import java.util . Date;
import javax.persistence.CascadeType;
import j avax. persistence . Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import j avax. persi stence . Id;
import j avax. persistence. OneToMany;
import j avax. persistence. Table;
import javax.persistence. Temporal;
import j avax. persistence. Temporal Type;
@Entity
@Table(name = "autores")

@SuppressWarnings("serial")
public class Autores implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="autor_id")

private Integer autorld;


@Column(name="nome")

private String nome;


@Column(name="email")

554

!li'] Desenvolvendo Aplicaes Web com JSP...

private String email;


@Temporal(TemporalType.DATE)
@Column(name="dt_nasc")

private Date nascimento;


@OneToMany(cascade=CascadeType.ALL, mappedBy=" autores")

private Collection<Publicacao> publicacao;


Ii ... getters e setters omitidos. Faa retactor

A anotao @Temporal nova com relao s outras entidades, uma


vez que voc ainda no havia visto.
As anotaes que contm @Temporal so tipos baseados em informaes armazenadas relativas ao tempo. A lista de tipos temporais incluem trs tipos java.sql como java.sqI.Date,
java.sql.Time e java.sqI.Timestamp, e inclui dois tipos java.util
como o java.util.Date e java.utiI.Calendar.
O uso dessa anotao inclui um atributo chamado de TemporalType
com um valor enumerado. Esses valores so: DATE , TIME e
TIMESTAMP para representar os tipos de java.sql.

o MAPEAMENTO DE PUBLICA0
O mapeamento de publicacao tem algumas diferenas com relao aos
demais criados.
Publicacao. j ava
package meupacote;
import j avax. persistence. Column;
import j avax. persistence. Enti ty;
import javax.persistence.ld;
import j avax .persistence. JoinColumn;
lIlport javax.persistence . ManyToOne;

JavaServer Faces e a API de Persistncia EJB 3 lI


import j avax. persistence. NamedQueries i
import j avax. persistence . NamedQuery i
import javax . persistence . Tablei
@Entity
@Table(name = "publicacao")
@SuppressWarnings ("serial")
@NamedQueries({
@NamedQuery(name="Publicacao . listarPorPublicacao",
query="SELECT p FROM Publicacao p") ,
@NamedQuery(name="Publicacao . listarPorLivrosEditora",
query="SELECT l.isbn ,1.titulo , e.editora, a.nome " +
"FROM Publicacao p JOIN p.editora e " +
"JOIN p.livros 1 " +
"JOIN p.autores a ")
})

public class Publicacao implements java.io.Serializable {


@Id
@Colwnn(name = "publicacao_id", nullable = false)
private int publicacaold;
@ManyToOne
@JoinColwnn(name="isbn", nullable=false)
private Livros livros;
@ManyToOne
@JoinColwnn(name = "editora_id", nullable = false)
private Editora editora;
@ManyToOne
@JoinColwnn(name = "autor_id", nullable = false)
private Autores autores;

Ii . . . getters e setters omitidos . Faa refactor

555

556 riJ

Desenvolvendo Aplicaes Web com JSP...

Nesse mapeamento, voc encontra outras anotaes ainda no utilizadas nesse livro. As anotaes @ManyToOne definem uma relao de "muitos-para-um" do utilizado em banco de dados relaciona!. Isso significa que
havero muitas publicaes relacionadas a um livro, editoras ou autor.
As anotaes @JoinColumn so usadas para especificar a coluna que
contm a chave estrangeira de cada relacionamento. Dessa forma, um relacionamento com a tabela de livros seria definido com a seguinte anotao:
@ManyToOne
@JoinColurnn (name=" isbn", nullable=false)

private Livros livros;

o importante no se esquecer de que as propriedades livros, editora e autores so referenciadas nas entidades "pai" da relao (Livros,
Editora e Autores), com os atributos mappedBy encontrados nas anotaes @OneToMany.
A entidade Publicacao possui ainda uma propriedade prpria, em relao s outras descritas, no qual se refere a sua chave primria.
Alm da anotao citada, existem outras duas, no comeo da entidade, que representa a criao de querys para serem executadas.
A anotao @NamedQueries usada para agrupar todas as consultas
existentes na entidade (consultas estticas), no qual so descritas individualmente pela anotao @NamedQuery.
A anotao @NamedQuery fica "pr-compilada" e tem o atributo
name no qual voc define o nome da sua consulta. Com o atributo query
tem a consulta propriamente dita. Cada consulta, definida por essa anotao, deve ser separada por "," vrgula, umas das outras, dentro da anotao
@NamedQueries.

A JAVA

PERSISTENCE

QL

A Java Persistence API (JPA) suporta duas linguagens de consultas (querys)


para recuperar entidades e outros dados persistentes do banco de dados. A
linguagem primria a Java Persistence Query Language (JPQL). Essa
uma linguagem de consultas independente de banco de dados e opera no

JavaServer Faces e a API de Persistncia EJB 3

557

modelo de entidades lgicas ao contrrio do modelo de dados fsico. As


consultas tambm podem ser expressas em SQL. No caso desse exemplo, a
query criada est na linguagem JPQL.
Para que voc compreenda melhor uma consulta lPQL, ser criada
uma classe e uma pgina com o intuito de voc testar algumas querys e
aprender um pouco mais.
Antes de criar essa classe, baixe a biblioteca Apache Jakarta
Commons-Lang . Para baix-lo, entre no endereo http://
j akarta.a pache.org/si te/ downloads/ downloads _ commons-lang.cgi e
pegue o arquivo .zip ou .tar.gz. At o momento em que esse livro est
sendo escrito, a verso atual 2.2. Descompacte e coloque o lAR commonslang-2.2.jar dentro do diretrio lib da sua aplicao.
O exemplo a seguir foi adaptado do livro Pro EJB3 Persistence, da
editora Apress.
TestandoQuerys.java
package meupacote.util;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org. apache. commons. lang.builder. *;
public class TestandoQuerys
private String query=
"<h3 >Query : ";
private EntityManagerFactory emf;
private String erro=null;
private String resultados=
"<h4>Resultado encontrados:< / h4>";

558

[li] Desenvolvendo Aplicaes Web com JSP.. .


public String getQuery( } {
return query;

public void setErro(String erro} {


this.erro = erro;
public String getErro( } {
return erro;

private EntityManager getEntityManager( }


return

emf.createEntityManager( };

public TestandoQuerys( } (
emf =
Persistence.createEntityManagerFactory("livraria");

public void setQuery(String query} {


this.query += query+"</h3>";
String resultado="";
EntityManager em = getEntityManager( };
try {
List result =
em.createQuery(query} .getResultList( };
if (result.size( ) > O}
for (Object o : result)
resultado = mostrarResultado(o};
} else {
setErro("Dados no encontrados"};
} catch (Exception e) {

JavaServer Faces e a API de Persistncia EJB 3 l\I 5 .C;


setErro ("Existe um erro na sua consulta") ;
e.printStackTrace( );
this.query += resultado;

private String mostrarResultado(Object objeto) throws


Exception {
if (objeto == null) {
setErro ( "NULL") ;
else if (objeto instanceof Object[]) {
Object [ ] row = (Object[]) objeto;
for (int i = O; i < row.length; i++)
mostrarResultado(row[i]);
else if (objeto instanceof Long II
objeto instanceof Double
objeto instanceof String
objeto instanceof Date) {
resultados+="<br />"+objeto.getClass( ) .
getName ( ) +
": " + objeto;
} else {
resultados+=ReflectionToStringBuilder.
toString(objeto,
ToStringStyle.SHORT_PREFIX_STYLE)+
"<br />";
return resultados+"<br />";

II
II

560

Desenvolvendo Aplicaes Web com JSP...

Essa classe o ajudar a desenvolver as suas querys que sero executadas a partir de uma pgina WEB .
A pgina Web para executar esse exemplo mostrada logo a seguir:
querys.jsp

<%@ page language="java"


contentType=" text/html"
pageEncoding="ISO-88S9-1"%>
<%@ taglib uri="http: // java.sun. com/j sp /j stl/core" prefix=" c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<!DOCTYPE html PUBLIC
"- / /W3C/ /DTD HTML 4.01 Transi tional//EN"
"http://www.w3.org/TR/htm14/loose.dtd">
<html>
<head>
<title>JPQL</title>
</head>
<body>
<form action="" method="post">
<table border="O ">
<tr>
<td valign="top">Query:</td>
<td>
<textarea rows="S" cols="40" name="query">
<c:out value="${param .query}" />
</textarea>
</td>
<td colspan="2" valign="bottom">
<input type="submit" value="Consultar" />
</td>
</table>
</form>
<c:if test="${pageContext.request.method=='POST'}">

JavaServer Faces e a API de Persistncia EJB 3 l\l

561

<jsp:useBean id="rs" scope="page"


class=lmeupacote.util.TestandoQuerys" I>

<jsp:setProperty name="rs" property="query"


value=" $ {param . query} "I>
<jsp:getProperty name="rs" property="query"l>
<c:out value="${rs.erro}" I>
</c:if>
</ body>
</htrnl>

Essa pgina no conter explicao, assim como o Bean criado, uma


vez que est sendo apenas para execuo dos exemplos das querys dadas.
CONFIGURANDO O TopLINK

Para configurar o TopLink Essentials, crie um arquivo persistence.xml


dentro de um diretrio chamado META-INF na raiz de seus pacotes.

fi. Pro)ect Explorer

Navlgator

f;). 1!:7 JavaServerFacesCom Toplink

!ti

'@J Deployment Descriptor: JavaServerFacesComToplink

E3 ~ Java Resources : src


Gl
meupacote
!ti [1) Autores.java
!ti [1) Editora.java
!ti [1) Livros.java
. !ti [1) Publcacao.java
ffi meupacote.controller
ctJ
meupacote.dao
meupacote.util
8 CC? META-INF
persistence. xml
ffi e\ Libraries
!ti l27 build
!ti l27 WebContent

ta

ta
ta
ta

lRl

Figura 23.6

1.
,

562

Desenvolvendo Aplicaes Web com JSP...

o contedo desse arquivo listado logo a seguir:


persistence.xml.

<persistence 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
persistence_l_O.xsd"
version="l.O">
<persistence-unit name="livraria"
transaction-type=IRESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>meupacote.Livros</class>
<class>meupacote.Editora</class>
<class>meupacote.Autores</class>
<class>meupacote.Publicacao</class>
<properties>
<property name="toplink.logging.level" value=IFlNE" />
<property name="toplink. jdbc .driver"
value=lcom.mysql.jdbc.Driver" />
<property name="toplink. jdbc. url"
value=ljdbc:mysql://localhost:3306/livraria" />
<property name="toplink. jdbc .password"
value="integrator" />
<property name="toplink.jdbc.user" value="edson" />
</properties>
</persistence-unit>
</persistence>

No Bean TestandoQuerys, o mtodo crea"i:eEntityManagerFactory(


), da classe Persistence, l as configuraes existentes da persistence unit,
do arquivo persistence.xml. Esse arquivo possui as configuraes necessrias para a conexo com o banco de dados MySQL atravs do uso da
biblioteca TopLink Essentials.

JavaServer Faces e a API de Persistncia EJB 3 lI 563

o elemento <persistence-unit/> contm o elemento name, que utilizado pelo mtodo createEntityManagerFactory( ) para pegar as configuraes dadas para acesso s entidades e banco de dados.
Com o elemento <provider/> voc configura o TopLink. Os elementos <c1ass/> definem os mapeamentos criados.
No elemento <properties/> voc tem os elementos <property/> onde
cada um contm um atributo name. O valor de cada atributo name se refere
desde a configurao do Driver do banco de dados at usurio e senha. No
atributo value voc define a configurao determinada pelo atributo name.
Por exemplo, para configurar o usurio, o elemento <property!> fica assim:
<property name=" toplink.jdbc.user " value="edson" />

..

Depois de configurado, no se esquea de que a biblioteca do

~.ten~a~ MySQL deve estar tambm no seu diretrio lib, assim como as
demais j citadas.

FAZENDO QUERYS

JPQL

Com tudo configurado, basta seguir os exemplos e coloc-los na sua pgina querys.jsp. Considere o primeiro exemplo:
SELECT

FROM Editora

Se voc observar, muito parecido com a SQL normal. lPQL usa uma
sintaxe SQL similar onde possvel dar ao desenvolvedor experiente com
SQL a vantagem de escrever as querys. A diferena fundamental entre SQL
e lPQL est na seleo de uma tabela, onde a entidade do modelo da aplicao especificada ao invs da tabela propriamente dita.

564 li'I Desenvolvendo Aplicaes Web com JSP...

~
<> < li!~~======================-~Q~i
.;y [h;tP:I~o'.,;jhost:808o/J~vaserverFac:scomToPlinklquerys.jsP
"-t;1EI> 11
Query: SELECT e
fROI1 Editora e

L -_ _ _ _ _ _ _ _ _ _ _ _ _ _.......--J" [

Consultar

Query: SELECT e FROM Editora e


Resultado encontrados:
Editora[ editoraId=2,editora=Ciencia Moderna,publicacao=( ([meupacote.Publicacao@a415a3,
meupac ote .Publicacao@2a987d, meupacote.Publicacao@7a36a2,
meupacote.Publicacao@12d8ecd, meupacote.Publicacao@1716faO)} } )

Figura 23.7

Voc tambm pode consultar somente alguns campos, como em consultas normais a uma tabela de um banco de dados:
SELECT a.nome, a.nascimento
FROM Autores a

Comeando com um alias (apelido), voc pode navegar pela entidade


usando o operador ponto, seguido dos campos separados por vrgula. Nesse caso, as consultas so feitas colocando-se os campos existentes na entidade persistente.
A segunda query existente na entidade Publicacao contm dados existentes em mais de uma entidade, portando temos que criar "junes" entre
as entidades.
Como query join voc pode combinar resultados de mltiplas entidades, as junes JPQL so logicamente equivalentes s junes SQL.
Assim como na SQL, existe mais de um tipo de juno. No caso, voc
criou um inner join, onde os resultados gerados devem satisfazer os campos chaves coincidentes encontrados nas entidades.

JavaServer Faces e a API de Persistncia EJB 3 [)jlJ

565

Por exemplo, uma query que faz um JOIN nas entidades Livros e
Publicacao ficaria da seguinte forma :
SELECT 1
FROM Publicacao p JOIN p.livros 1

Onde sua equivalncia na SQL seria:


SELECT 1.*
FROM livros 1 INNER JOIN publicacao p
ON l.isbn = p.isbn

Caso voc tenha o costume de criar junes na clusula WHERE da


SQL, voc pode faz-la de forma equivalente na JPQL, como mostrado a
segUIr:
SELECT DISTINCT 1
FROM Publicacao p, Livros 1
WHERE p.livros = l.isbn

Voc tambm pode dar condies WHERE como na SQL, como por
exemplo:
SELECT l.isbn, l.titulo
FROM Livros 1
WHERE l.titulo LlKE 'daminando%'

Existem outras querys que podem ser feitas, mas o assunto abordado
aqui da utilizao do TopLink Essentials com a tecnologia JavaServer
Faces, portanto, no haver mais aprofu!!rl amento sobre JPQL.

566 lI Desenvolvendo Aplicaes Web com JSP...

Desenvolvendo seu Projeto


Da mesma forma que os demais exemplos criados nesse livro, a idia
migrar de uma tecnologia para outra, no que se refere persistncia de
dados, sem ter que mudar os cdigos das pginas JSF j criadas.
Como voc j tem uma experincia com isso, saiba que todos os arquivos utilizados nos exemplos anteriores permanecero os mesmos aqui.
A classe LivrariaConnectionFactory no mais existir. A JPA simplifica muito os cdigos desenvolvidos em aplicaes que envolvem entidades de acesso a dados.
No pacote meupacote.dao, a interface e a classe LivrariaDAO sero
modificadas. A seguir voc tem o cdigo da interface na integra:
InterfaceLivrosDAO.java

package meupacote.dao;
import java.util.List;
import meupacote.Livros;
public interface InterfaceLivrosDAO
public abstract void salvar(Livros livro);
public abstract void excluir(Livros livro);
public abstract void atualizar(Livros livro);
public abstract List todosLivros( );
public abstract List consultarTitulos(String titulo);
public abstract List todosLivrosComAutoresEditora( );
public abstract Livros consultarISBN(String isbn);

JavaServer Faces e a API de Persistncia EJB 3

ll 567

A classe LivrosDAO tambm ser modificada para dar acesso ao banco


de dados criado no MySQL.
A seguir voc tem o cdigo na integra:
LivrosDAO. j ava
package meupacote.dao;
import meupacote.Livros;
import java.util.List;
import javax.persistence.EntityManager;
import javax . persistence.EntityManagerFactory;
import javax . persistence.Persistence;
import javax.persistence.Query;
import meupacote.dao.lnterfaceLivrosDAO;
public class LivrosDAO implements InterfaceLivrosDAO{
private EntityManagerFactory

emfi

private EntityManager getEntityManager( 1


return emf.createEntityManager( li"
}

public LivrosDAO{ ) (
emf =
Persistence.createEntityManagerFactory("livraria"li8

public void salvar {Livros livro) { ~


EntityManager em = getEntityManager( li
try {
em.getTransaction( l.begin( li
em.persist(livroli
em. getTransaction ( l.commit{ li

568

Desenvolvendo Aplicaes Web com JSP...


catch (Exception ex) (
em . getTransaction( ) .rollback( )i

finally {
em. close ( ) i

public void excluir {Livros livro) (C)


EntityManager em = getEntityManager{ );
try (
em. getTransaction { ) . begin{ );
livro = em.merge(livro)i
em. remove (livro) i

em. getTransaction { ) .commit{ );


catch (Exception ex)
em. getTransaction { ) .rollback{ ) ;
finally (
em.elose{ );

public void atualizar {Livros livro)

(~

EntityManager em = getEntityManager{ );
try (
em. getTransaction { ) . begin { );
em.merge ( livro) i

em. getTransaction ( ) .cammit(

)i

catch (Exception ex)


em.getTransaction{ ) .rollback{ );
finally {
em. elose ( );

JavaServer Faces e a API de Persistncia EJB 3

ll 569

public List todosLivros ( } (


EntityManager em = getEntityManager( ) ;
try{
Query q =
em.createQuery("select object(l) from Livros as 1");
return q.getResultList( );
finally {
em . close ( ) ;

publ ic List consultarTitulos (String titulo} (G)


EntityManager em = getEntityManager( };
try{
Query q = em.createQuery("select object(lv) "+
"from Livros as lv "+
"where lv.titulo like ?1" ).
setParameter(l,"%"+titulo+"%");

re t urn q.getResultList( };
finally {
em. close ( ) ;

public List todosLivrosCamAutoresEditora ( } { ~


EntityManager em = getEntityManager( };
Query query =
em.createNamedQuery("Publicacao.listarPorLivrosEditora");
return query.getResultList( };

570

[)jl] Desenvolvendo Aplicaes Web com JSP...

public Livros consultarISBN (String isbn) { ~


EntityManager em = getEntityManager( );
try{
Query q = em.createQuery("select 1 "+
"from Livros 1 "+
"where l.isbn= ?1" ).
setParameter(l,isbn) i
return (Livros) q . getSingleResult(

)i

finally {
em.close( );

Para executar o CRUD desses exemplos e outras consultas, voc precisa se comunicar com o TopLink.
A interface EntityManagerO a responsvel pelas operaes de persistncia. A criao de instncia desse gerenciador feita pela classe abstrata EntityManagerFactory8. Essa classe criada pela classe
Persistence, que l as configuraes existentes em persistence.xml, atravs do atributo name dado no elemento <persistence-unit/> encontrado
nesse arqUIvo.
na classe EntityManager que voc encontra os principais mtodos
para incluir, localizar, atualizar e excluir informaes no banco de dados
atravs das entidades.
O mtodo criado nessa classe, de nome salvar( )6), recebe o objeto
EntityManager atravs do mtodo getEntityManager( ).
Para se criar uma transao, o mtodo getTransaction( ) utilizado em
todos os mtodos que iro se utilizar de incluses, excluses e atualizaes.
O mtodo begin( ), de getTransaction( ), inicia o processo de transao.

JavaServer Faces e a API de Persistncia EJB 3 [liil)

571

Atravs do mtodo persist( ), voc pode fazer inseres e atualizaes. Se tudo ocorrer bem, o mtodo commit( ), de getTransaction( ),
realiza as alteraes no banco de dados.
Caso uma exceo seja disparada, o mtodo rollback( ), de
getTransaction( ), desfaz a operao.
Em todos os mtodos com transaes, existe a clusula finally, que
chama o mtodo close(), de EntityManager, para fechar a sesso com o
banco de dados.
O mtodo excluir()O tem o objetivo de remover a lin};,.. no ~anco de
dados. O mtodo remove( ), de EntityManager, excluir ~s l.lformaes
contidas na entidade.
O mtodo atualizar( )0 atualiza os dados existentes na entidade.
Perceba o uso novamente do mtodo merge(), j explanado anteriormente.
Uma query simples feita pelo mtodo todosLivros( ), que retoma
um List. Esse retomo feito pelo mtodo getResultList( ), da interface
Query.
Em consultarTitulos( )0 voc observa a utilizao de uma query
com parmetro. Nesse caso a clusula LlKE fora utilizada para que a consulta possa trabalhar com qualquer informao passada a esse mtodo. Nessa
consulta, o parmetro determinado pelo smbolo de "?" interrogao,
seguido do nmero um. Cada parmetro passado deve ser numerado nesse
caso, sendo o primeiro" 1", o segundo "2" e assim por diante.
Como se trata de uma clusula LlKE, no mtodo setParameter( ),
usado para transmitir o parmetro para a consulta, voc tem a varivel
concatenada com os sinais coringas da SQL "%" porcentagem.
O mtodo todosLivrosComAutoresEditora( )8 voc tem a chamada a query criada na entidade Publicacao. Essa chamada feita atravs do
mtodo createNamedQuery(), de EntityManager.
A ltima consulta da classe LivrosDAO a do mtodo consultar
ISBN( )0. Esse mtodo tambm tem apenas um parmetro, mas como o
resultado de somente uma linha, seu tipo Livros e o resultado gerado
pelo mtodo getSingleResult( ).
Com o planejamento do livro, voc no precisa alterar os arquivos
JavaServer Faces graas a classe com o qual as pginas JSF se comunicam:
LivrosController.

572 l'il Desenvolvendo Aplicaes Web com JSP... .

Um JOIN em uma Pgina JSF


A classe LivrosController chamar o mtodo todosLivrosComAutores
Editora( ) para gerar uma tabela.
O mtodo dever ser feito no final da classe, como mostrado a seguir:
LivrosController.java
public DataModel getTodosComAutorEditora( ){
InterfaceLivrosDAO idao

= new

LivrosDAO( );

model =
new ListDataModel(idao.todosLivrosComAutoresEditora( ));
return model;

Retomando um DataModel voc agora pode cham-lo por sua pgina JSF. Ser omitida a navegao para essa pgina, uma vez que voc j
tem bastante experincia at aqui . A pgina JSF que representar os resultados advindos do mtodo getTodosComAutorEditora( ) mostrada na
integra a seguir:
mostrarLivrosComEditorasEAutores.jsp
<%@ page language="java" contentType= "text / html"
pageEncoding="ISO- 8859 -1 "
%>
<%@tag l ih uri=''http : //java.sun . com/ j sflcore " pre f ix= " f " %>
<%@ . 19l i b uri= '' http : //java.sun. com/ j sf/html '' prefi x= "h" %>
~ !DOCTYP E

HTML PUBLIC

"-//W3C//DTD HTML 4.01 Trans itional//EN"


''http://www.w3 . or g/TR/htm14/loose.dtd''>

JavaServer Faces e a API de Persistncia EJB 3 [Iiil]

573

<html>
<head>
<title>Mostrar Livros</title>
</head>
<body>
<f:view>
<h:messages />
<h: form>
<h:dataTable
value="#{livrosView.todosComAutorEditora} "
var="item" border="l"
cellpadding="2" cellspacing="">
<f: facet name="header">
<h:outputText value="Mostrar Livros, Editora e Autores" / >
</ f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="ISBN" / >
</ f:facet>
<h:outputText value=" #{item[O]} "/ >
</ h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Titulo" / >
</ f:facet>
<h:outputText value=" #{item[l]} "/ >
</ h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Editora" / >
</ f : facet>
<h:outputText
value=" #{item[2]} " / >

</ h:column>
<h:column>

574

[1iil] Desenvolvendo Aplicaes Web com JSP...

<f:facet name="header" >


<h:outputText va lue=" Aut or " />
</f :facet>
<h : ou tputText
value="#{item[3]}" />
</h :column>
</h :dataTable>
</h: f orrn>
</f :view>
</body>
</htrnl>

interessante a diferena dessa pgina que utiliza a tag JSF


<h:dataTable/>. O retomo dado pela entidade Publicacao, na consulta prestabelecida, vem em um formato de matriz, e portando deve ser acessvel
dessa maneira.
A consulta est assim na entidade Publicacao, para simples conferncia:
SELECT l.isbn ,l.titulo , e.editora, a.nome
FROM Publicacao p
JOIN p.editora e
JOIN p.livros 1
JOIN p.autores a

Note que so pesquisados em todas as entidades e o retomo de apenas trs campos. Dessa forma, o campo isbn, retomado dessa consulta ser
acessado pelo dataTable como o primeiro item, representado em Array
pelo zero: #{ item [O]} . Os demais seguem a seqncia at o ltimo campo.
O resultado dessa pgina JSF mostrado na imagem a seguir:

575

JavaServer Faces e a API de Persistncia EJB 3

f' Nostr ar livros )(

<;:.

c".

liiI

'!.><:;,

!http://localhost:8080/JavaServerFacesComToplink/mostrarLivrosComEditorasEAutores.faces

.~ ~

. . . . . . . . . . . .....Mostr~ii~~;;Edit~;~~Autores ... . .......mm_1

I Editora I Autor I
ICiencia Moderna IEdson Gonalves i
85-7393-536-7 ITomcat: Guia Rpido do Administrador ICiencia Moderna lEdson Gonalves !
ICiencia Moderna IEdson Gonalves I
185-7393-519-7 IDominando N etBeans
ISBN

Ttulo

85-7393-486-7 IDominando Eclipse

185-7393-494~8 1 OpenOffice.org 2.0 Writ~-;------rCi;~~~-M~d~~~rT~~~R~~h;1

!Ci:~~_Mo..:t.:~_~ ITarcizjo da Roc_ha l

185-7393-495-6 !Base

Figura 23.8

Paginando Resultados Utilizando JSF


Uma das grandes sacadas no uso de JSF est na paginao de dados. Voc
tem duas maneiras de faz-lo, uma seria utilizando a JPA e a outra a prpria
tecnologia JSF. O uso da JPA interessante quando voc tem que paginar um
volume muito grande de dados. J em JSF fcil e rpido para um pequeno
volume de dados. O exemplo mostrado aqui ser feito atravs do uso de JSF.
ADICIONANDO

Novos

MTODOS

A primeira alterao ser feita na interface, mostrada a seguir em destaque.


Perceba que o arquivo est na integra:
InterfaceLivrosDAO.java
package meupacote.dao;
import java.util.List;
import meupacote.Livros;
public interface InterfaceLivrosDAO
public abstract void salvar(Livros livro};

576 li'I Desenvolvendo Apl icaes Web com JSP.. .


public abstract void excluir(Livros livro);
public abstract void atualizar(Livros livro);
public abstract List todosLivros( );
)ublic abstract List consultarTitulos(String titulo);
public abstract List todosLivrosComAutoresEditora( );
public abstract Livros consultarISBN(String isbn);
public abstract int totalDeLivros(

)i

No precisa nem dizer que esse mtodo ser criado na classe que
implementa essa interface: LivrosDAO.
A seguir voc tem a listagem com o mtodo que ser criado:
LivrosDAO. j ava
public int totalDeLivros( ) {
EntityManager em = getEntityManager( );
try{
int total = ((1ong)
em.createQuery("select count(l) from Livros 1") .
getSingleResult( )).
intValue( )i
return totali
finally {
em. close ( );

JavaServer Faces e a API de Persistncia EJB 3 [\J 577

o mtodo int totalDeLivros(), criado na classe LivrosDAO, contm


uma query que realiza a contagem de todos os registros encontrados na
entidade Livros. O resultado ser nico e como valor inteiro. Para que o
resultado seja um nmero inteiro, o mtodo intValue( ) foi utilizado.
Na classe LivrosController, voc criar os seguintes mtodos:
LivrosController.java
private int maxPorPagina=3i)
private int

paginaAtual=Oi~

public int getTotal(

){EB

InterfaceLivrosDAO idao = new LivrosDAO(


return idao.totalDeLivros( )i

)i

public void setMaxPorPagina(int maxporpagina}


this.maxporpagina=maxporpagina;

public int getMaxPorPagina( ) {


return maxporpaginai

public int getPaginaAtual( ) {


return paginaAtuali

public String pprimeirapagina( ) {


paginaAtual = O;
return "mostrar";

578 llI Desenvolvendo Aplicaes Web com JSP...


public String pPaginaAnterior( ) {
paginaAtual

-=

rnaxporpagina;

if (paginaAtual
paginaAtual = O;

<

O) {

return "mostrar ";

public String pproximapagina( ) {


paginaAtual += rnaxporpagina;
if (paginaAtual >= getTotal( )) {
paginaAtual = getTotal( ) - rnaxporpagina;
if (paginaAtual
paginaAtual = O;

<

O) {

return "mostrar" ;

public String pUltimaPagina( ) {


paginaAtual = getTotal( ) - rnaxporpagina;
if (paginaAtual
paginaAtual = O;

<

return "mostrar ";

O) {

JavaServer Faces e a API de Persistncia EJB 3 ll 579

Esse trecho, acrescentado classe LivrosController, o possibilitar


de fazer a paginao utilizando os recursos encontrados nas pginas JSF.
O atributo privado maxPorPaginaO determina, atravs de um valor
inteiro, o mximo de itens a serem exibidos por uma pgina.
Com o atributo paginaAtual@, voc determina qual o estado atual
da paginao. Esse nmero comea com zero, onde seria a primeira pgina, e a cada chamada a uma nova pgina, esse atributo que ser modificado, sempre dizendo em que pgina o navegador do cliente est agora.
O mtodo getTotal( )8 pega os resultados encontrados no mtodo
totalDeLivros( ), criado na classe LivrosDAO. A idia sempre saber
qual a quantidade total de linhas encontradas no banco de dados, para que
seja possvel dividi-la por entre pginas. Exemplo: se voc tem um total de
12 resultados e vai dividir por 3 resultados por pgina, voc ter ento 4
pginas para navegar pela paginao.
Os mtodos pblicos getMaxPorPagina( ) e getPaginaAtual( )
retornam os valores encontrados nos atributos privados maxPorPagina
(linhas mximas por pgina) e paginaAtual (o estado atual da sua paginao). Ser atravs desses mtodos que voc poder, na pgina JSF, dizer se
os links de navegao esto ou no na primeira ou na ltima pgina.
O mtodo pPrimeiraPagina() zera o valor do atributo paginaAtual,
colocando tecnicamente o cursor da sua navegao na primeira pgina.
Observe que um mtodo pblico e de retorno String. S para voc se
lembrar, o retorno da palavra mostrar foi configurado, em captulos anteriores na construo do arquivo faces-config.xml, para chamar a pgina
JSF mostrarLivros.jsp.
O mtodo pPaginaAnterior( ) um pouco mais complexo. Sua inteno subtrair o valor do atributo paginaAtual pelo maxPorPagina.
Isso feito para que voc desloque de trs para frente. Exemplo: tomemos
o caso anterior, onde o nmero mximo por pginas 3 e o total de 12
linhas. O atributo paginaAtual est com o valor 6. Isso significa que a sua
paginao est na terceira pgina, num total de quatro pginas - o valor
assumido por paginaAtual seria: O: primeira, 3: segunda, 6: terceira e 9:
quarta pgina. Em uma subtrao, paginaAtual voltaria para a segunda
pgina, pois o atributo maxPorPagina tem um valor fixo e somente pode
subtrair trs por vez.

580 l\I

Desenvolvendo Aplicaes Web com JSP...

Uma condio criada, pois se isso no fosse feito, haveria subtrao


infinita e o resultado seria negativo. Para que isso no ocorra, a condio
verifica se paginaAtual tem um valor menor que zero . Tendo esse valor,
paginaAtual tem o seu valor recolocado para zero.
O mtodo pProximaPagina( ) contm uma lgica mais complexa. A
prxima pgina ocorre em uma soma da pgina atual sobre o valor mximo
por pgina, o inverso visto no mtodo pPaginaAnterior( ). Nesse caso, uma
condio deve ser feita, pois a soma ficaria, assim como ocorre com a subtrao, infinita. Portanto, a condio estabelece que, se o valor do atributo
paginaAtual for maior ou tiver um valor igual ao total de linhas encontradas
na tabela, o valor recolocado subtraindo o total de linhas pelo mximo de
linhas por pgina. Tomando o exemplo dado, isso significa que, o atributo
paginaAtual somente pode chegar a 9, pois a ltima pgina resulta em mais
trs linhas, totalizando 12. Mas se paginaAtual fosse maior ou igual ao total,
doze, os resultados dados no data table seriam vazios, pois haveria a necessidade de ter 12+3 para exibio, resultando em 15, mas isso trs a mais que
o total de linhas encontradas na tabela do banco de dados.
O mtodo pUltimaPagina( ) contm o atributo paginaAtual recebendo o valor da subtrao do total de linhas pela quantidade mxima de
linhas em uma pgina. Isso evidente, pois a regra dada na explicao
anterior, do mtodo pProximaPagina( ), demonstra o cenrio do porque
ser assim, na ltima pgina.
APLICANDO A SUA PGINA

JSF

Para aplicar a paginao na tag JSF <h:dataTable/>, voc contar com o


auxlio de dois atributos encontrados nessa tag: first e rows.
Vej a c omo fi c ar ento a alterao proposta no arquivo
mostrarLivros.jsp , no trecho listado a seguir:
mostrarLivros.jsp
<h: dataTable
value="# {livrosView.todosLivr os }"
var="item" border="l "

JavaServer Faces e a API de Persistncia EJB 3 [iijl]

581

cellpadding="2" cellspacing="O"
first="#{livrosView.paginaAtual}"
rows="#{livrosView.maxPorPagina}" >

Observe que o atributo first recebe as informaes contidas do mtodo getPaginaAtual( ), onde o retorno determina o estado atual do seu cursor
no que diz respeito em qual pgina voc se encontra.
O atributo rows recebe o nmero mximo de itens que podem ser
exibidos em uma pgina, sendo um valor sempre fixo.
Para paginar, voc ainda precisar contar com os links de primeiro,
anterior, prximo e ltimo.
Para isso, basta adicionar o contedo mostrado a seguir, tambm referente pgina mostrarLivros.jsp .
interessante dizer, antes, que voc pode colocar esses links tanto
abaixo como acima da tabela, isso ficar por sua conta.
mostrarLivros.jsp
<h:commandLink action="#{livrosView.pPrimeiraPagina}"
value=" Primeira"
rendered="#{ livrosView.paginaAtual != D}" />&nbsp;
<h:commandLink action="# {livrosView.pPaginaAnterior}"
value="Anterior"
rendered="#{ livrosView.paginaAtual != D}"/>&nbsp;
<h: commandLink action=" # {l i vrosView. pproximapagina} "
value="Prxima"
rendered="# {livrosview. paginaAtual +
livrosView.maxPorPagina<livrosView.total}" />
&nbsp;
<h:commandLink action="#{livrosView.pUltimaPagina}"
value="ltima"
rendered=" # {li vrosView. paginaAtual +
livrosView.maxPorPagina<livrosView.total }"/>

582

~ Desenvolvendo Aplicaes Web com JSP...

Bom, como j era de se esperar, os mtodos criados para a paginao se


encontram no atributo action da tag JSF <h:commandLink/>. Mas voc
tambm est notando um novo atributo, chamado rendered. Esse atributo
renderiza o link ou no. Para que seja renderizado o link (leia-se ser criado),
um valor booleano deve existir: true aparece e false no. Para que a paginao tenha o efeito desejado, voc quer que, na primeira pgina no aparea
os links Primeira e Anterior, uma vez que voc j est na primeira pgina.
O contrrio tambm ocorre, ou seja, os links Prxima e ltima tambm no
aparecero. Para isso, o EL usado cria uma condio, onde voc bem lembra
que, o retomo true ou false em uma situao como essa. Essa condio
tem o seguinte critrio: Primeira e Anterior - se a pgina atual for diferente
de zero, Prxima e ltima - se a pgina atual somado ao valor do mximo
de linhas em uma pgina for menor que o total de linhas resultantes.

fi

t40strar livros X

Cadastrar novo livro

12006

IExcluir

----l

185-7393-536-7 ITomcat Guia Rpido do Administrador 12006

IExcluir

85-7393-53 1-6 ICorelDRAW X3


Primeira Anterior Proxima ltima

Figura 23.9

Paginando Resultados Atravs da JPA


Fazer uma paginao utilizando a JPA, atravs do framework TopLink, ao
invs do uso do JavaServer Faces pode ocorrer em situaes no qual o resultado encontrado no banco de dados seja muito grande. Evidentemente voc
retomaria muitas linhas e isso demoraria em um carregamento de pgina.
Agora imagina um cenrio onde a pgina est sofrendo uma grande concor-

JavaServer Faces e a API de Persistncia EJB 3

ll 583

rncia de acessos. Para essas situaes, a paginao feita diretamente no banco de dados mais indicada. A JPA oferece mtodos que o auxiliam em sua
paginao, independente do banco de dados que est sendo usado.
Para criar essa paginao, voc ir criar um novo mtodo. Na interface,
crie o mtodo mostrado em destaque:
InterfaceLivrosDAO.java
public interface InterfaceLivrosDAO

public abstract List todosLivros(int m, int

a)i

Na classe LivrosDAO, voc criar o mtodo com o contedo a seguir:


LivrosDAO. j ava
public List todosLivros(int maximo, int atual) {
EntityManager em = getEntityManager( );
try{
Query q =
em.createQuery("select 1 from Livros 1").
setMaxResults(maximo).
setFirstResult(atual) i
return q.getResultList( );
finally {
em. elose ( );

584

(li1] Desenvolvendo Aplicaes Web com JSP...

A interface Query fornece suporte para paginao utilizando os mtodos setFirstResult( ) e setMaxResults( ). Esses mtodos especificam o
primeiro resultado (iniciado com zero) e o nmero mximo de linhas
retomadas para aquela pgina. A idia aqui similar utilizada na paginao feita diretamente pela pgina JSF.
O segundo mtodo todosLivros() contm nesse caso dois parmetros
inteiros, que sero passados para determinar o nmero mximo de linhas
na pgina, assim como o estado atual de paginao.
CONTROLANDO A PAGINAO

Na classe LivrosController voc apenas ter que criar os mtodos necessrios para a paginao. Alguns itens sero similares ao j feito na paginao de resultados com JSF.
LivrosController.java

private int maxporpagina=3;


private int paginaAtual=O;

public DataModel getTodos( ) ( C)


InterfaceLivrosDAO ldao = new LivrosDAO( );
model =
new ListDataModel(
ldao.todosLivros(maxPorPagina,
paginaAtual)
);

return rnodel;

public String primeiraPagina( ) {


paginaAtual

= O;

JavaServer Faces e a API de Persistncia EJB 3 [jl]


return "mostrar ";

public String ultimaPagina( ) ( ~


int rest = getTotal( ) % maxporpagina ;
if( rest !=o )
paginaAtual = getTotal( ) - rest;
else
paginaAtual = getTotal( ) - maxporpagina;
return "mostrar ";

public int getPaginaAtual( ) (


return paginaAtual;

public int getTotal( ) (


InterfaceLivrosDAO idao = new LivrosDAO( );
return idao.totalDeLivros( );

public int getProximaPagina( ) ( ~


int total = getTotal( );
int soma = paginaAtual + maxPorPagina;
int proxima = ( soma > total )? total: soma;
return proxirna;

public int getMaxPorPagina( ) {


return rnaxporpagina;

585

586

~ Desenvolvendo Aplicaes Web com JSP...

public String proxima( )

(C)

int soma = paginaAtual + maxporpaginai


if ( soma < getTotal( ) )
paginaAtual += maxporpaginai
return "mostrar ";

public String anterior( ) (@)


paginaAtual

-= maxporpaginai

if (paginaAtual < O) paginaAtual = Oi


return "mostrar ";

Muito parecido com a paginao feita diretamente em JSF, essa paginao diretamente no banco, como j foi dito, auxilia no bom desempenho
da exibio dos resultados na tela do usurio.
O mtodo getTodos( )0, modificado com relao ao seu original,
passa a retornar um model criado a partir do mtodo todosLivros( ), que
recebe os dois parmetros necessrios para que o resultado no seja totalitrio.
Foram recriados quase todos os mtodos de paginao, com nomes
diferentes, para que voc possa diferenci-los dos anteriores feitos.
O mtodo ultimaPagina( )8 utiliza uma lgica um pouco diferente
para ir at a ltima pgina resultante da paginao. Primeiramente uma
varivel chamada rest recebe o resto da diviso feita entre o total de linhas
encontradas pelo mximo de linhas que podem ser exibidas. A idia simples: digamos que o total de linhas retornadas sejam 13 e o mximo que
pode ser exibido na tela seja de apenas 3 linhas. Uma diviso entre esses
valores resultaria em um resto, ou seja, um valor sobraria. Como houve um
resto na diviso, ele passar pela condio que verifica se o resto diferen-

JavaServer Faces e a API de Persistncia EJB 3 l?l

587

te de zero. No caso, voc teria o valor 1 como resto dessa diviso. A pgina
atual, gerenciada pelo j conhecido atributo paginaAtual receber o valor
do total de linhas geral subtrado do resto. Para esclarecer ainda mais a
situao, significa que a ltima pgina ter apenas uma linha a ser exibida,
onde o total 13 subtrado de 1 no que resulta em 12 linhas j exibidas,
faltando apenas uma que ser mostrada como pgina final.
Caso a diviso no resulte em resto, o total subtrado do mximo de
linhas que podem ser exibidas por pgina, onde sempre se obter na ltima
pgina, nesse caso, a quantidade de trs linhas para serem exibidas. Perceba que essa subtrao deve ser feita, pois paginaAtual deve obrigatoriamente se deslocar uma quantidade X de linhas para se encontrar na ltima
pgina e no apenas ter uma atribuio direta de maxPorPagina.
O mtodo getProximaPagina()8 resultar sempre no valor da prxima pgina. Isso ser necessrio para que voc utilize no j conhecido
atributo de renderizao da tag <h:commandLink/>, junto a outros valores, para saber se pode ou no ser exibido o link em questo (voc ver isso
mais adiante).
Com o mtodo proxima( )0 voc j percebe que se trata de um mtodo que trabalhar como action do link gerado por JSF. Sua tarefa somar
o valor de paginaAtual ao valor de maxPorPagina, deslocando assim o
ponteiro dentro do banco de dados para exibir as novas linhas (de .. . at ... ).
Novamente a condio dada para evitar que o valor somado seja
maior que o total encontrado no banco de dados, o que resultaria em valores inexistentes para uma chamada da paginao.
O mtodo anterior( )0 executa a j conhecida subtrao do valor de
paginaAtual de maxPorPagina. A subtrao tambm verificada, uma
vez que o valor poderia ser subtrado infinitamente. Nesse caso, chegando
a valores abaixo de zero o valor de paginaAtual atribudo a O.
PAGINANDO OS RESULTADOS

Diferente do exemplo que fazia a paginao pela tag JSF <h:dataTable/>,


esse caso apenas requer os links de paginao. Portanto NO haver os
atributos first e rows da tag citada.

588 lI

Desenvolvendo Aplicaes Web com JSP...

mostrarLivros.jsp
<h: conunandLink action=" # {livrosView. primeirapagina}"
value="primeira"
rendered="#{livrosView.paginaAtual != D}" />&nbsp;
<h:conunandLink ac t ion="#{livrosView . anterior }"
value="Anterior"
rendered="#{livrosView.paginaAtual != D}" />&nbsp ;
<h:conunandLink action="#{livrosView .proxima}"
value="Prxima"
rendered=" # {li vrosview . proximaPagina < li vrosview . total}" / >
&nbsp ;
<h:conunandLink action="#{livrosView.ultimaPagina}"
value="ltima"
rendered="#{livrosView.proximaPagina< livrosView. total}" />

Os links para Primeira e Anterior no sero explicadas, uma vez que


seguem o mesmo sistema utilizado na paginao em JSF para verificar se a
pgina atual est diferente de zero.
Sem sombra de dvida bem mais simples de conferir se deve ou no
ser renderizada a tag. Os links que representam Prxima e ltima recebem ap enas a v eri ficao para sab er se o valor do m todo
getProximaPagina( ) menor que o valor resultante do mtodo getTotal(
). Caso sejam maiores, os links desaparecero.

.... .... ....

Captulo

24
AJAX

AJAX SU RGIU EM FEVEREIRO 2005, por Jesse James Garrett de


Adaptive Path, LLC, onde publicou um artigo on-line intitulado, "Ajax:
A New Approach to Web Applications". O artigo se encontra em ingls e
pode ser lido no endereo bttp://www.adaptivepath.com/publications/
essays/archives/000385. php.
AJAX a sigla de Asynchronous JavaScript and XML, e como j
foi dito, no uma tecnologia e sim o uso de tecnologias incorporadas que
tem as principais o JavaScript e o XML, onde juntos so capazes de tornar
o navegador mais interativo, utilizando-se de solicitaes assncronas de
informaes. sim um conjunto de tecnologias; cada uma com a sua forma de exibir e interagir com o usurio. O AJAX se compe de:
~ HTML/XHTML e CSS: juntos compem a apresentao visual
da pgina Web;
~ DOM (Document Object Model): exibe e interage com o usurio;
~ XML e XSLT: fazem o intercmbio e manipulam dados;
~ XMLHttpRequest: recupera dados de forma assncrona;
~ JavaScript: a linguagem de scripts do lado cliente que une essas
tecnologias .
Em um modelo clssico de desenvolvimento para a Web, voc envia
informaes ao servidor atravs de links ou formulrios, no qual o servidor
se encarrega de devolver o contedo solicitado. Nos sites atuais, a maior
parte do contedo devolvido, digamos assim, o contedo principal, coloTERM O

590 lI Desenvolvendo Aplicaes Web com JSP...


cado em um servidor de banco de dados, ou seja, est armazenado em um
sistema que gerencia o contedo, e o layout da pgina o mesmo que voc
est visualizando. O que o servidor faz trazer para esse layout o novo
contedo solicitado, processando os dados e os tornando aceitveis em
qualquer navegador.
A idia do Ajax tornar isso mais simples, ou seja, se voc j est
com o layout carregado, porque no carregar apenas o contedo, que o
objeto da sua solicitao.
O Ajax funcional porque a maior parte dos browsers modernos existentes esto habilitados para suportar essas tecnologias que o incorporam .

Como o Ajax Trabalha


Em vez do modelo de aplicao Web tradicional, onde o prprio
browser responsvel por iniciar os pedidos e processar os pedidos do
servidor Web, o modelo Ajax prov uma camada intermediria para controlar esta comunicao. O Ajax contm um mecanismo que na realidade
um conjunto de funes escritas em JavaScript que so chamadas sempre
que uma informao precisa ser pedida ou enviada ao servidor. Em vez do
modelo tradicional, onde existe um link que liga a pgina atual a outros
recursos (como outra pgina Web), a chamada ao servidor fica por conta
desse mecanismo conhecido agora como Ajax, onde ele se encarrega de
transmitir para, e receber as informaes do servidor.
O servidor, que antes serviria HTML, imagens, CSS ou JavaScript
tradicionalmente, agora configurado para devolver dados que o mecanismo do Ajax pode usar. Estes dados podem ser textos simples, XML, ou
qualquer outro formato de dados do qual voc pode precisar. A nica exigncia que o mecanismo do Ajax deve entender para poder interpretar os
dados recebidos.
Quando o mecanismo do Ajax recebe a resposta do servidor, entra em
ao a anlise dos dados, onde sofrem vrias mudanas para trazer a informao de forma agradvel ao usurio.
Como voc pode ver na Figura 24.1 a seguir, toda vez que o usurio
interage com o site, um outro documento enviado para o navegador, onde
na maioria das vezes o contedo do assunto muda, mas menus, cabealhos

AJAX [liil)

591

e outras infonnaes de layout pennanecem o mesmo. Como o navegador


no compreende bem essa situao, ele retira os dados exibidos anteriormente e insere o novo contedo.

Tradicional Modelo de aplicao Web

BrowserWeb

r::---

HTML. JavaScript.
CSS. imagens, etc

I -----P-~-i-dO----
HTIP

Servidor Web

,:

~
I

Dados

~==~.

e.oco de Dedos

Dados
requisitados

Modelo de Aphcaao Web Aiax

- _.-.
D
_

Browser 'Neb

HTML, CSS

Chamada do
JavaScript

Ajax

engine

Servidor Web

Dados
Pedido
HTIP

' ~
. ~-.~.~
-

Dados
requisitados

Figura 24.1

Quando o usurio deseja sair, ele sai do navegador e em uma nova


entrada, o processo reiniciado novamente.
Em uma aplicao contendo Ajax, uma parte da lgica da aplicao
movida para o navegador. Quando o usurio entra na pgina, um documento mais complexo entregue ao navegador, onde muita das infonnaes
so scripts em JavaScript. Enquanto o usurio no fechar o browser, ele
pennanecer com essa parte lgica por toda a sesso, ainda que ele resolva
provavelmente alterar sua aparncia consideravelmente.
evidente que nesse novo cenrio o desenvolvedor deve prever todas
as situaes que ele deseja fazer em sua aplicao Web.
Fica tambm evidente que o trfego tem a sua maior intensidade no
incio, onde todas as infonnaes que sero necessrias para que o navegador tenha toda a interatividade com o servidor deve ser previamente carregada. Depois do carregamento inicial, as demais chamadas ao servidor sero muito mais eficientes, pois o trfego ser menor, j que os dados carregados sero em menor quantidade do que em uma aplicao Web comum.

592 llI Desenvolvendo Aplicaes Web com JSP...

Preparando-se para Trabalhar com Ajax


Se voc deseja conhecer o desenvolvimento com Ajax a fundo, so necessrios conhecimentos profundos na construo de sites Web, utilizando suas
principais tecnologias: (X)HTML, DOM, CSS e JavaScript. Alm dessas,
o conhecimento de XML e XSLT tambm so necessrios para um bom
desempenho em suas aplicaes.
Evidentemente esse livro no tem o foco de ensin-lo como essas
tecnologias interagem entre si, mas como trabalhar utilizando Ajax em aplicaes escritas com a linguagem Java.
Dessa forma, o foco nesse captulo a utilizao de frameworks Ajax,
especificamente preparados para se criar aplicaes rapidamente sem a necessidade de um grande conhecimento em nenhuma das tecnologias listadas.
Mas como preparo voc iniciar criando um exemplo do uso de Ajax
sem frameworks.

Ajax Bsico
Capturar as respostas de uma aplicao Web dinmica, requer em Ajax duas
formas, responseText e responseXML. Na primeira, responseText, voc
captura respostas em texto, e a segunda, responseXML, em formato XML.

Os Pedidos XMLHttp
Tudo comeou com a Microsoft, quando em seu browser Internet Explorer
na verso 5.0, introduziu uma forma rudimentar de suporte ao XML, com
uma biblioteca ActiveX, chamada de MSXML.
O objeto de XMLHttp, o objeto disponvel na biblioteca MSXML, foi
criado para permitir ao desenvolvedor de fazer pedidos via HTTP via JavaScript.
A inteno era de que estes pedidos devolvessem os dados em formato XML.
Dessa forma, o objeto XMLHttp colocou um modo fcil de acessar essas informaes na forma de um documento XML. Como era um controle ActiveX,
XMLHttp no s poderia ser usado em pginas Web, mas tambm em qualquer aplicao desktop baseada unicamente na plataforma Windows.
Com a popularidade dessa tcnica, ficava evidente que deveria haver
uma portabilidade para outros browsers, mas sem o controle ActiveX, pois

AJAX

ll 593

isso limitaria os navegadores de somente utilizarem esse recurso em uma


plataforma Windows. Pensando nisso, a Mozilla Foundation criou a mesma funcionalidade da biblioteca XMLHttp para o uso em seus browsers,
como o famoso Mozilla Firefox. Logo em seguida houve a mesma
implementao nos browsers Safari (verso 1.2) e Opera (verso 7.6) .

Ajax na Prtica
Voc ir comear desenvolvendo um exemplo simples, que trar dados via
mtodo GET utilizando o Ajax. Esse exemplo no possui o uso de
frameworks Ajax. Esse caso utilizar dados de texto simples para sua melhor compreenso .

Configurando seu Projeto


Antes de comear, voc pode criar o seu projeto. Nesse caso, se desejar
separar os exemplos de Ajax com Frameworks dos mostrados aqui, saiba
que alguns dos itens listados a seguir sero os mesmos ao longo do desenvolvimento deste captulo.
No diretrio Iib dever ter a biblioteca toplink-essentials.jar e mysqlconnector-java-5.0.3-bin.jar. Antes de continuar, a Figura 24.2 demonstra
como ficar organizado o seu projeto.
1".. Prolect Explore,
13

lO

TrabComA)4xSemFramework
...
~ Deployment Descriptor: TrabComAjax5emFramework -

13 ~ Java Resources: src


8
meupacote

[[) Autores.java
meupacote.controller
EE [[) AutoresController.java
8
meupacote .web
Itl [[) ServletAjax.java
8 i' META-INF
persistence .xml
. !!I\ Lbraries

til

til i' buid


8

i' WebContent
EE i' META-INF
ill i' WE8 INF

index ,html
Figura 24.2

594 Ill Desenvolvendo Aplicaes Web com JSP...


CONFIGURANDO AS CLASSES

No pacote meupacote coloque o Bean Autores, criado no Captulo 23,


retirando apenas o vnculo com o Bean Publicacao.
No pacote meupacote.controller, crie a classe AutoresController
como listada a seguir:
AutoresController.java
package meupacote.controller;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import meupacote.Autores;
public class AutoresController {
priva te EntityManagerFactory emf;
private EntityManager getEntityManager( } {
return emf.createEntityManager( };

public AutoresController( } {
emf =
Persistence.createEntityManagerFactory("livraria");

public void salvar(Autores autor} {


EntityManager em = getEntityManager( };
try {
em. getTransaction ( } .begin( };

AJAX ~
em.persist(autor);
em. getTransaction ( ) .commit( ) ;
catch (Exception ex)
em . getTransaction ( ) .rollback( );
finally {
em . close ( );

public void excluir(Autores autor) (


EntityManager em = getEntityManager( );
try (
em. getTransaction ( ) . begin( );
autor = em.merge(autor);
em. remove (autor) ;
em. getTransaction ( ) . commit ( ) ;
catch (Exception ex)
em. getTransaction ( ) . rollback ( );
finally (
em.close( );

public void atualizar(Autores autor) (


EntityManager em = getEntityManager( );
try (
em. getTransaction ( ) .begin( );
em.merge(autor) ;
em . getTransaction ( ) .commit( );
catch (Exception ex)
em.getTransaction( ) .rollback( );
finally {
em . close ( );

595

5 96

Desenvolvendo Aplicaes Web com JSP...


public List todosAutores() (

EntityManager em = getEntityManager( );
try{
Query q
em.createQuery( "select a from Autores a");
return q.getResultList( );
finally {
em. close ( );

public Autores getAutorPorld(Integer id)


EntityManager em = getEntityManager( );
try{
String query=" SELECT a FROM Autores a "+
WHERE a.autorld=?1";
Query q =
em.createQuery(query) .
setParameter(l, id);
return (Autores) q.getSingleResult( );
finally {
em. close ( );

Esta classe no ser explicada, pois se trata de situaes j conhecidas no desenvolvimento de exemplos vistos em captulos anteriores.

AJAX [ilJ 597


CONFIGURANDO A PERSISTNCIA

o arquivo de configurao persistence.xml, deve estar dentro do diretrio


META-INF, na raiz de onde se encontram seus pacotes, como voc bemj
sabe.
o nome da persistncia ser livraria. Repare que a classe Autores
dever estar configurada.
persistence.xml.

<persistence 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
persistence_l_O.xsd"
version="l . O">
<persistence-unit name="livraria">

<provider>
oracle.toplink.essentials.PersistenceProvider
</ provider>
<class>meupacote.Autores</class>

<properties>
<property name="toplink.logging .level" value="FINE" / >
<property name=" toplink . j dbc . dri ver"
value=" com .mysql. jdbc. Driver H I >
<property name="toplink . jdbc. url"
value=Hjdbc:mysql: l/ localhost:3306 / livraria" / >
<property name="toplink . jdbc.password" value="integrator" I>
<property name=" toplink . jdbc . user" value=" edson" I >
</ properties>
</ persistence-unit>
</ persistence>

598 !Iil

Desenvolvendo Aplicaes Web com JSP...

CRIANDO O SERVLET

o primeiro exemplo da utilizao de Ajax sem o uso de frameworks ser


atravs de um Servlet.
O cdigo do Servlet listado a seguir:
ServletAjax . java
package meupacote.web;
import java.io . IOException;
import java.io . PrintWriter;
import java.util . lterator;
import java . util . List;
import javax . servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ht t p.HttpServletResponse;
import meupacote.Autores;
import meupacote.controller .AutoresController;
public class ServletAjax extends javax.servlet.http.HttpServlet
protected void doGet(HttpServletRequest request ,
HttpServletResponse response)
throws IOException

String dados="" i
try{
List autoresList = ( List ) listarAutores (
for( Iterator i=autoresList.iterator(
Autores a = ( Autores )i.next(

)i

)i

i.hasNext(

)i

dados+="\n Cdigo: "+ a.getAutorld( )+

)i

){

AJAX

l\J 599

"\n Nome: "+ a.getNome( )+


"\n E-mail: "+ a.getEmail( )+
"\n Nascimento: "+ a.getNascimento( )+
"\n";
}catch(Exception e){
response. setContentType ("text/plain;charset=ISO-8859-1") ;
response.setHeader("Cache-Control", "no-cache");
response. setHeader (" pragma", "no-cache");
response.setDateHeader("Expires", -1);
PrintWriter writer = response.getWriter( );
writer.print(dados);
writer.close( );

protected List listarAutores( ) throws Exception{


AutoresController
return

PGINA

ac = new AutoresController( );

ac.todosAutores();

HTML

QUE RECEBER OS DADOS

A pgina listada a seguir demonstra como trazer os dados do Servlet usando Ajax, via mtodo GET:
index.htm1
<!DOCTYPE htrnl PUBLIC
"- //W3C//DTD HTML 4 . 01 Transitional//EN"
''http://www.w3.org/TR/htrn14/loose.dtd">
<htrnl>

600

Desenvolvendo Aplicaes Web com JSP...

<head>
<title>Utilizando AJAX sem o uso de Frameworks</title>
<script language="JavaScript">
function dados ( ){
var ajax = false;
if (window.XMLHttpRequest ) { Ii Mozilla, Safari, . ..
ajax = new XMLHttpRequest( ) ;
else if (window.ActiveXObject ) { Ii IE
ajax = new ActiveXObject("Microsoft.XMLHTTP");
if(ajax) {
ajax. open( "GET ", "ServletAjax " , true) ;
ajax .onreadystatechange = function( ) {
if (ajax. readyState == 4) {
if (ajax. status == 200) {
alert(ajax. responseText );
else {
alert('Houve um problema ao carregar. ');

ajax. send( null ) ;


</ script>
</ head>
<body>
<a href="#" onclick= " dados ( ) ">Trazer Dados</a>
</ body>
</ html>

Ao clicar no link Trazer Dados, o resultado ser esse mostrado na


Figura 24.3 a seguir:

601

AJAX l\I

,,~

c::> IIJ ~<;"

Trazer Dados

Ihttp://localhost:8080/TrabComAjaxSemFramework/index.html#

\~I ~

l8J

Microsoft Internet Explorer


Cdigo: 1

Nome: Edson Gonalves


E-mail: edson@integrator.com.br
Nascimento: Tue Apr 11 00:00:00 GMT-03:oo 1978
Cdigo: 3
Nome: Tardzio da Rocha
E-ma~: tarcizio@gnux.com.br
Nascimento: Mon May 25 00:00:00 GMT -03:00 1970
Cdigo: 17
Nome: Andr Gonalves
E-mail: andre@integrator.com.br
Nascimento: Fri Nov 11 00:00:00 GMT -03:00 1983

OK

Figura 24.3

Nesse exemplo voc tem na pgina index.html dois objetos: um para


trabalhar com o Internet Explorer e outro para Mozilla, Safari e etc.
Para trabalhar com um objeto cross-browser, voc utiliza o
XMLHttpRequest em:
ajax = new XMLHttpRequest( }i

Voc deve usar esse objeto em browsers baseados no Mozilla como


Netscape 7.1 e Firefox 2.0 (como tambm em Safari 2.0 e Opera 8.5). Esse
objeto est disponvel como uma propriedade do objeto window. A referncia para este objeto em cdigo JavaScript window.XMLHttpRequest.
Por isso voc verifica se ele existe da seguinte forma:
if (window.XMLHttpRequest )

.,

I_

__

rO

0&

...

~.

_~~

__

--'

602 lI Desenvolvendo Aplicaes Web com JSP...


Graas ao controle de ActiveX, voc tem que usar o objeto proprietrio Microsoft ActiveXObject em JavaScript, para trabalhar com o objeto
da Microsoft:
ajax = new ActiveXObject("Microsoft.XMLHTTP") i

Esta linha cria a primeira verso do objeto de XMLHttp (o que trabalha com o IE 5.0). O problema que houve vrias novas verses liberadas
e, com cada liberao da biblioteca MSXML, houve uma melhoria na estabilidade e velocidade das requisies e respostas. claro que voc vai
querer usar as mais recentes quando o browser puder lhe dar essa possibilidade, assim sendo, as diversas verses existentes so:
~ Microsoft.XMLHttp
~ MSXML2.XMLHttp
~ MSXML2.XMLHttp.3.0
~ MSXML2.XMLHttp.4.0
~ MSXML2.XMLHttp.5.0
~ MSXML2.XMLHttp.6.0
O melhor modo de verificar isso seria usar um bloco try... catch em
JavaScript. Por ser este um controle ActiveX, qualquer fracasso para criar um objeto lanar um erro.
Voc pode construir da seguinte forma:
var versoes = [ "MSXML2. XMLHt tp. 6 . O" , "MSXML2 . XMLHttp. 5 . O" ,
"MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0",
"MSXML2. XMLHttp" , "Microsoft. XMLHttp"
);

for (var i = O; i < versoes.length; i++) {


try {
var objetoXMLHttp = new ActiveXObject(versoes[i));
} catch (ex) {
/ / nada aqui

AJAX [)]

603

A melhor forma seria criar um mtodo para que ele retome o objeto,
podendo assim voc ter acesso ao melhor objeto para o seu IE em questo:
function criarObjMSXMLHttp( )(
var versoes = [ "MSXML2 .XMLHttp. 6. O", "MSXML2 .XMLHttp. 5. O",
"MSXML2 .XMLHttp. 4. O", "MSXML2 .XMLHttp. 3. O",
"MSXML2. XMLHttp" , "Microsoft . XMLHttp"

1;
for (var i = O; i < versoes .length; i++) {
try (
var objetoXMLHttp = new ActiveXObject (ver soes [il );
return objetoXMLHttpi

} catch (ex) {
/ / nada aqui

return false;

A lista a seguir define as propriedades existentes pelos objetos definidos pela maioria dos principais browsers, como Internet Explorer 5.0 e
superior, Safari 1.3 e 2.0, Netscape 7, e as mais recentes verses do Opera
(como Opera 8.5). O objeto do Mozilla Firefox tem propriedades adicionais e mtodos no compartilhados pelos objetos de outros browsers, mas
a grande maioria suporta:
onreadystatechange: Funo callback; a funo nomeada a esta
propriedade chamada sempre que h mudanas em readyState.
readyState: Possui cinco possveis valores:
~ O(No iniciado): O Objeto foi criado mas o mtodo open() ainda
no foi chamado
~ 1 (Carregando): O mtodo open( ) foi chamado mas o pedido
ainda no foi enviado. 2 (Carregado): O pedido foi enviado.
~ 3 (Interativo): Uma parte da resposta foi recebida
~ 4 (Completo): Todos os dados foram recebidos e a conexo est
fechada.

604

Desenvolvendo Aplicaes Web com JSP...

responseText: Resposta vem em texto simples.


responseXML: Resposta vem em fonnato de XML. Voc ver mais
adiante.
status: A resposta do servidor: 200 (ok) ou 404 (no encontrado)
statusText: string; o texto associado com status da resposta em HTTP.
Voc tambm tem outros mtodos como:
aborte ): void; cancela o pedido HTIP.
getAlIResponseHeaders( ): string; retoma todas as respostas de cabealho em uma string pr-fonnatada.
getResponseHeader(string header): string; retoma o valor do cabealho especificado.
open (string metodo, string url, boolean asynch): void; prepara o
pedido HTIP e especifica se assncrono ou no .
send(string): void; envia o pedido HTIP.
setHeader(string header,string value): void; conjunto de cabealhos pedidos, mas voc tem que chamar open( ) primeiro.
Neste exemplo, voc viu o mtodo open( ) em ao, onde foi submetido uma chamada ao Servlet ServletAjax pelo mtodo GET, detem1inando
que o fosse de fonna assncrona, adicionando no terceiro parmetro o true:
ajax .open("GET", "ServletAjax", true);

Toda vez a propriedade de readyState muda de um valor para outro,


o evento de readystatechange dispara e o manipulador de evento
onreadystatechange chamado . Por causa de diferenas em
implementaes de diferentes browsers, o nico readyState seguro avaliado para desenvolvimento cross-browser O, 1 e 4. Na maioria dos casos,
porm, voc poder verificar somente no valor 4:
if (a j ax .readyState == 4 )

Geralmente, voc dever se assegurar que o status da resposta 200,


indicando que o pedido foi completamente carregado com xito. A propriedade de readyState tem em seu valor 4, mesmo se um erro de servidor ocorrer (como pgina no encontrada), o que significa que essa verificao so-

AJAX Ill

605

mente no o suficiente. Neste exemplo, mostrada a propriedade


responseText se status for 200; caso contrrio, a mensagem de erro exibida.
O ltimo passo chamar o mtodo send() que de fato envia o pedido.
Este mtodo aceita um nico argumento, que uma string para envio. Se o
no houver envio (o mtodo GET no requer um corpo de dados), voc tem
que passar nesse caso null :
ajax.send(null);

No Servlet desenvolvido, o MIME type do documento dever passar


ao arquivo a informao de que se trata de um texto plano, com caracteres
latinos, atravs da linha:
response.setContentType("text/plain;charset=ISO-8859-1");

Um outro detalhe importante est no cache do browser. Alguns


browsers como o Internet Explorer podem criar cache do resultado dos
dados anteriores. Para que isso no acontea, voc deve acrescentar as trs
linhas no seu cdigo:
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response. setDateHeader ("Expires", -1);

A resposta feita pelo Servlet uma simples sada de dados que voc
faria como em qualquer outra ocasio, diretamente no browser. A nica
diferena est que, ao invs de sair diretamente no Browser, como de costume em uma aplicao comum, a sada capturada pelo JavaScript, que a
trata e depois o exibe ao usurio.
ENVIANDO PELO MTODO

POST

O mtodo POST para envio de dados via Ajax praticamente a mesma


coisa que o mtodo GET, com a diferena de que voc deve enviar os dados do formulrio atravs do mtodo send( ).

606

Desenvolvendo Aplicaes Web com JSP...

Os dados do formulrio devem ser enviados como uma query string


no seguinte formato:
dados=nomel=valorl&nome2=valor2&nome3=valor3

O primeiro argumento de open() nesse caso ser POST, em vez de


GET, e o segundo o nome da pgina no qual voc enviar as informaes,
como anteriormente. Quando um formulrio postado do browser para um
servidor, o content type do pedido deve ser application/x-www-formurlencoded . A maior parte das linguagens de servidor usa essa codificao
para analisar gramaticalmente os dados de POST, assim muito importante que voc fixe esse valor. Isso deve ser feito usando o mtodo
setRequestHeader( ):
setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");

O mtodo send( ) nesse caso recebe os dados do formulrio como


parmetro:
oXMLHttp. send(dados);

A seguir voc tem um exemplo utilizando o envio de dados via mtodo POST utilizando Ajax, onde primeiro voc criar um Servlet chamado
ServletCadastroAjax que receber os dados e os tratar.
ServletCadastroAjax.java

package meupacote.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text .ParseException;
import java.text.SimpleDateFormat;

AJAX [IjI]

607

import java . util . Date;


import javax.servlet.http . HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import meupacote .Autores;
i mport meupacote.controller.AutoresController;
public class ServletCadastroAjax extends
javax . servlet .http .HttpServlet (
private static Date strToDate (String data) throws Exception {
if (data == null)
return null;
Date dataF
try (

null;

DateFormat dateFormat =
new SimpleDateFormat ("MJ.If/dd/yyyy") i
long timestamp
dataF

= dateFormat.parse(data).getTime(

= new Date (timestamp) i

catch (ParseException pe) (


throw pe;
return dataF;

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws IOException{

--

._,..--------"----~----_.,

----'-~

)i

608 l\l Desenvolvendo Aplicaes Web com JSP...


String nome = request. getParameter ("nome") ;
String email = request. getParameter ("email") ;
String nascimento = request. getParameter ("nascimento") ;
int id=O;
Date data=null;
try{

if(!nascimento.equals(""}}{
data = strToDate(nascimento);

Autores a = new Autores ( };


AutoresController ac = new AutoresController( };
a.setAutorld(id} ;
a. setNome (nome) ;
a.setEmail(email} ;
a.setNascimento(data};
ac . salvar ( a );
response.setContentType("text/plain ; charset=ISO-8859-1"} ;
response.setHeader("Cache-Control", "no-cache"};
response. setHeader ("pragma", "no-cache");
response. setDateHeader ( "Expires", -1);
printWriter writer = response.getWriter( };
writer.print ("Cadastrado com sucesso") ;
writer.close( };
}catch(Exception e} {e.printStackTrace( };}

Esse Servlet no contm nenhum segredo pelo j visto at o momento. A nica coisa a ser feita de especial aqui o tratamento da Data. Como
voc bem sabe, a data de nascimento do Autor est temporariamente com o

AJAX ril

609

tipo java.utiI.Date. O formulrio que voc preenche envia a data no formato dd/MM/yyyy, mas que dever ser armazenado como yyyy-MM-dd
devido a forma usada pelo MySQL. Alm disso, a principio voc receber
a data como uma String e precisar convert-la para Date.
exatamente o que o mtodo strToDate( ) faz, converte do tipo String
para Date.
O cadastro de autores via mtodo POST utilizando Ajax mostrado
na listagem a seguir:
<!DOCTYPE html PUBLIC
"- I IW3C I I rtrD XHTML 1. O Transitional ll EN"
''http: // www . w3 . org ITR / xhtml1 / rtrD / xhtml1-transi tional. dtd" >

<html xrnlns=''http: //www . w3. org/1999 / xhtml ">


<head>
<title>Cadastro de Autores usando Ajax sem Frameworks</title>
<script language="JavaScript">
function objXMLHttp( ){
if (window.XMLHttpRequest) { Ii Mozilla, Safari,
var objetoXMLHttp = new XMLHttpRequest( );
return objetoXMLHttp;
} else if (window. ActiveXObj ect) { Ii IE
var ver soes = [
"MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.5 . 0" ,
"MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0" ,
"MSXML2. XMLHttp" , "Microsoft. XMLHttp"
];

for (var i = O; i < versoes.length ; i++) {


try {
var objetoXMLHttp = new ActiveXObject(versoes[i));
return objetoXMLHttp;
catch (ex) {

Ilnada aqui

610 l\I Desenvolvendo Aplicaes Web com JSP.. .

return false ;
function enviar (formulario )
var dados = "nome="+formulario.nome.value;
dados += "&email="+formulario.email.value;
dados += "&nascimento="+formulario.nascimento.value;

var oXMLHttp

= objXMLHttp(

);

oXMLHttp.open("POST", "ServletCadastroAjax", true);


oXMLHttp.setRequestHeader("Content-Type", "application/x-wwwform-urlencoded");

oXMLHttp.onreadystatechange = funct i on ( ) {
if (oXMLHttp.readyState

==

4) {

if (oXMLHttp.status == 200) {
rnensagem(oXMLHttp . responseText);
else {
rnensagem("Ocorreu o erro: "+ oXMLHttp.statusText);

};

oXMLHttp.send(dados);

return false;
function mensagem(msg) {
document.getElementByld('msg').innerHTML=msg;

</ script>
</ head>
<body>

AJAX

l'il 611

<form id="forml" name="forml" method="post" action=""


onsubmit=" return enviar (this) i " >
<f i eldset>< l egend>Cadastro de Autores</legend>
<p>Nome:
<input name= "nome" type="text" id="nome" />
<br / ><br / >
E-mail:
<input name="email" type="text" id="email" />
<br / ><br / >
Nascimento:
<input name="nascimento" type="text" i d="nascimento" size="8" />
<br / >
</ p>
<p>
<input type="submit" name="Submit" value="Enviar" / >
</p>
<div id=" msg ">< / div>
</fieldset>
</form>
</body>
</html >

Em seu script, para capturar os dados transmitidos pelo formulrio ,


voc adicionou uma varivel chamada dados, dentro da funo enviar( ).
var dados = "nome="+formulario.nome.valuei
dados += "&email=" +formulario. ema i 1. valuei
dados += "&nasclIIento="+formulario.nasclIIento.valuei

Graas a isso, cada valor de cada campo do formulrio ser submetido, onde voc tem o nome do campo (por exemplo nome), seguido do igual
"=" e o valor, concatenado "+" com formulario .nome.value.
Note que formulario um parmetro do mtodo enviar( ) e se refere
ao formulrio que est submetendo os dados .
Para pegar o valor de cada campo, voc usou a propriedade value.

612 lll Desenvolvendo Aplicaes Web com JSP...


A ltima linha do mtodo enviare ) contm um return false. Isso
acontece porque, no formulrio, esse mtodo chamado pelo tratador de
eventos onsubmit. O tratador de eventos onsubmit espera um retorno do
mtodo, que sem o false enviaria o formulrio, gerando o "reload":
onsubnit="return enviar(this);"

O this passado como parmetro para o mtodo enviare ), fazendo


referncia ao prprio formulrio .

!Ioftl
~

Caso voc queira se aprofundar nesse assunto, eu recomendo


meu livro Dominando Ajax, no qual o assunto abordado com
profundidade e exemplos que vo do bsico ao avanado .

Utilizando Frameworks Ajax


A utilizao de Ajax sem o uso de frameworks complicada e extremamente penosa na construo e depurao da aplicao.
Os exemplos mostrados anteriormente so pequenos e j necessitam
de uma grande quantidade de linhas, contendo muitos cdigos que tratam
apenas do envio e recebimento de dados. Imagine se voc tivesse que desenvolver uma interface bem elaborada, com o intuito de criar um CRUD.
Pensando nessas situaes, muitos desenvolvedores ao redor do mundo comearam a se unir e desenvolver boas prticas no desenvolvimento
de JavaScript, que mais tarde houve um maior destaque graas ao foco em
Ajax. Muitos criaram pacotes no qual envolvem muitos mtodos e classes
que podem ser chamadas de forma simples, contendo solues para diversas questes. Para esses pacotes chamamos de frameworks Ajax.
Existem dezenas de frameworks Ajax espalhados na Internet, alguns
pagos e outros de uso livre.
Esses frameworks possuem no s envio e recebimento via Ajax j
configurados, mas tambm tratamentos de erros com relao ao uso do
JavaScript, problemas comuns e outros at mesmo incomuns.

AJAX [il]

613

H tambm alguns frameworks que fornecem muito mais que isso,


dando a voc uma gama de aplicativos criados com o uso de DHTML que
interagem com o usurio. Isso minimiza ainda mais o trabalho que voc
teria no uso de Ajax em seus projetos.
O que voc ver agora so alguns exemplos utilizando alguns
frameworks Ajax, famosos no desenvolvimento, para que voc possa dar
os primeiros passos e escolher a melhor opo .

Dojo Toolkit
Dojo Toolkit um toolkit (ou biblioteca) modular escrito em JavaScript,
desenhado para desenvolvimento rpido e fcil de aplicaes Web baseados somente em JavaScript ou totalmente Ajax, independente de plataforma servidora.
Seu desenvolvimento foi iniciado em 2004, por Alex Russell e at o
momento em que esse livro escrito est na verso 0.4.1.
Nos dias atuais voc tem a organizao Dojo Foundation, designada
para promover a adoo do toolkit. Empresas como IBM e Sun Microsystems
j anunciaram oficialmente suporte para Dojo, incluindo contribuies.
VANTAGENS DE UTILIZAR O DOJO TOOLKIT

Alm do suporte de grandes empresas como IBM e Sun Microsystems,


esse framework tem diversas bibliotecas, que podem ser utilizadas para
facilitar o desenvolvimento de aplicaes Web que necessitam de um alto
grau de interatividade utilizando JavaScript. Desde o tratamento com strings,
at suporte ao boto Voltar do browser com AJAX, o Dojo realmente tem
uma grande quantidade de atrativos ao usurio.
Esse toolkit tambm no est atrelado uma nica plataforma, no
sendo obrigatrio seu uso em apenas aplicaes Web escritas em Java. Outro
detalhe importante que esse framework Open Source, alm de possuir
muitos bons exemplos.

614

[iijl] Desenvolvendo Aplicaes Web com JSP...

DESVANTAGENS DE UTILIZAR O DOJO TOOLKIT

Uma desvantagem est em sua API, que como grande, possui uma curva
de aprendizado extensa. Outro detalhe est em sua documentao, mesmo
sendo melhor que muitos outros existentes no mercado Open Source da
categoria, ainda assim fraca.
Outra desvantagem est relacionada ao seu tamanho. Quando utilizada certas bibliotecas em conjunto, esse toolkit pode ficar com muitos scripts,
tornando o aplicativo pesado. Sem o devido conhecimento do que voc
deseja utilizar, o carregamento de todos os scripts chega a vrios megas, o
que torna desconfortvel para um iniciante nesse framework.
BAIXANDO E CONFIGURANDO O DOJO TOOLKIT

Para baixar esse framework, entre no endereo http://www.dojotoolkit.org/


e clique em click to download. O arquivo compactado tem pouco mais de
4MB, contendo os exemplos, o arquivo principal, dojo.js e o diretrio SRC,
contendo as bibliotecas para estender suas aplicaes.
Aps baixar o arquivo, descompacte-o e pegue apenas o dojo.js . Crie
um diretrio na raiz do seu sistema, chamado de script e coloque esse
arquivo l.
CRIANDO UM CADASTRO COM DOJO TOOLKIT

Voc ir utilizar o mesmo Servlet trabalhado no exemplo anterior para


fazer o cadastro de autores via mtodo POST com Ajax sem o uso de
frameworks.
O arquivo listado a seguir demonstra o mesmo formulrio utilizado
anteriormente, com a diferena de que dessa vez o Dojo Toolkit quem
envia os dados:
utilizandoDojoToolkit.htm1

<%@ page language ="j ava " contentType ="text/h t ml"


pageEncodi ng= "ISO- 88 59-1" %>
<! OOCTYPE html PUBLIC

AJAX [il]
"-//W3C//DTD HTML 4.01 Transitional//EN"
''http://www.w3.org/TR/htm14/loose.dtd''>
<html>
<head>
<title>Usando Ajax com Dojo Toolkit</title>
<script type="text/javascript" src="script/dojo . js"></script>
<script type="text/javascript">
dojo.require("dojo.io.*")iO
function doPost( ) (
x = new

dojo . io . FormBind({~

formNode: "dojoform",6)
load: function(type, data, e)

(~

dojo.byld("msg") . innerHTML = datai


form = doj o. byld ("doj oform") i
form.autorld.value="" i
form.nome. value='''' i
form.email.value="" i
form.nascimento . value="" i
})i

x.onSubmit = function(form) {
if(form.nome.value == "

)(

alert('Digite o nome do autor') i


form.nome.focus( )i
return falsei

return truei
}

dojo.addOnLoad(doPost)i~

615

616

[Ijlj Desenvolvendo Aplicaes Web com JSP...

</scri pt>
</ head>
<body>
<div id="dojo">
<f orm i d=" dojoform" method=" post " ac ti on=" ServletCadastroAjax ">
<fi eldset>
<legend id="tituloForm">Cadastro de Autores</legend>
<label for="nome">Nome:</label>
<input type="text" name="nome " id= "nome" size="20" />
<br />
<label for="ema il" >E-mail:</label>
<input type="text" name="email" id="email" size="20" />
<br />
<l abel for="nascimento">Data de Nasc. : </label>
<input type="text" name="nascimento" id="nascimento" size="lO" />
<br />
<span id= "msg "></span>
<br />
<br />
<input type="hidden" i d="autorld" name="autorld" />
<input type="submit" name="btEnviar " id="enviar" value="Envi ar"
/>

</fieldset>
</form>
</di v>
</body>
</html >

Antes de comear a sua aplicao com Ajax utilizando Dojo Toolkit,


a chamada ao script dojo.js necessria. Isso feito utilizando a tag <script/>,
pertencente ao (X)HTML, atravs do atributo src.
Para trabalhar com a comunicao baseada em Ajax, o Dojo contm o
pacote dojo.io. Perceba que o seu formato de pacote tem sua semelhana
com a linguagem Java, o que no mera coincidncia. Esse pacote o mais

AJAX [jIJ

617

famoso, poderoso e fcil de usar. Para cham-lo, basta utilizar


dojo.require("dojo.io.*")O. O mtodo require() chama dinamicamente
o JavaScript e o carrega na pgina. Um mtodo chamado doPost( ) foi
criado para que voc possa chamar o seu formulrio e envi-lo devidamente para o seu destino . Atravs da classe dojo.io.FormBinde, voc pode
capturar o formulrio com o seu contedo etransmiti-Io direto para o servidor sem o "reload" de pgina. FormBind permite que voc transmita formulrios baseados em Web 1.0 para o servidor de forma assncrona.
O envio ao servidor ocorre com a utilizao do argumento formNode
Esse argumento, no caso, contm o nome dado ao formulrio pelo atributo id, existente na tag <form/>. Com o argumento loadO, a resposta
emitida pelo servidor capturada. Com o mtodo byld( ), da biblioteca
Dojo, voc substitui o document.getElementByld do XHTML, possibilitando assim uma manipulao de objetos DOM. Existem vrias rotinas que
manipulam seus objetos em pginas atravs de DOM. A mensagem recebida do servidor transmitida para o atributo data, de load, que impressa
na pgina atravs de innerHTML. Para uma limpeza dos campos do formulrio aps a resposta positiva, voc atribui value a vazio, com a seguinte
linha:

e.

form.nome.value="" i

Como voc atribuiu uma varivel de nome "x" a FormBind, seu script
tambm pode usufruir de uma caracterstica existente nessa funo . O evento
onSubmit pode ser chamado utilizando a funo de mesmo nome, no Dojo,
possibilitando assim, antes de uma chamada ao servidor, de verificar se o
seu campo, ou campos, do formulrio esto preenchidos corretamente, fazendo uma validao similar as j existentes em prticas comuns no desenvolvimento Web contendo JavaScript para suas verificaes.
Para a leitura do mtodo doPost( ), o mtodo addOnLoad( )0, do
Dojo, se responsabiliza pelo carregamento. Seu nome j demonstra sua
equivalncia no JavaScript, onde temos o evento onload, colocado na tag
XHTML <body/>, ou tambm window.onload, ambos utilizados para carregar inicialmente um mtodo de um script interno ou externo.

618

[jl] Desenvolvendo Aplicaes Web com JSP...

Um detalhe interessante nesse exemplo est em seu formulrio. Observe que nele no h nenhum JavaScript, onde o atributo action, inclusive, determina para onde ser submetido esse formulrio .

ODWR
DWR, acrnimo para Direct Web Remoting, um framework Ajax desenvolvido para aplicaes escritas em Java. Com caractersticas que simplificam o desenvolvimento na hora de construir aplicaes que utilizam
Ajax, tem como principal caracterstica a integrao com as classes Java
de dentro do prprio JavaScript. Com isso, voc executa mtodos das suas
classes dentro do JavaScript, no necessitando de uma grande quantidade
de scripts para serem desenvolvidos.
VANTAGENS DE UTILIZAR DWR

Embora esse captulo no tenha a inteno de denegrir nenhum framework,


o DWR uma excelente escolha para quem desenvolve aplicativos Web
utilizando a linguagem Java. Alm de ser Open Source, esse framework
tambm contm boas prticas no desenvolvimento.
Como trabalha dinamicamente gerando JavaScript baseado em classes Java, voc pode utilizar o padro MVC em sua aplicao que o DWR
pode se integra facilmente como uma nova camada. Alm, o DWR vem
com integrao para os principais frameworks do mercado Java: Spring,
Struts, Web Works, Hibemate e etc.
Outro detalhe que DWR tambm trabalha com Annotations, uma
prtica cada vez mais utilizada por desenvolvedores Java e uma necessidade na nova arquitetura Java EE 5.
DESVANTAGENS DE UTILIZAR DWR

A maior desvantagem com certeza de se utilizar DWR est no uso de somente em aplicaes Java. Mas esse framework tambm tem uma documentao mais fraca e possui poucos exemplos, em comparao a outros
utilizados no mercado.

AJAX [ijjl) 619


BAIXANDO E CONFIGURANDO

DWR

Para baixar esse framework, entre no endereo http://getahead.ltd.ukJdwr/


e clique em Download.
A verso utilizada, no momento em que esse livro escrito, 2.0
RC 1. O arquivo que voc precisa baixar para colocar em sua aplicao
dwr.jar.

Latest and Greatest: Version 2 release candidate 1


DWR 2.0 is neorly production st able. We are currently on release
candida t e 1 w tiicl, is useful now for development and t es t ing. It
inc ludes Rever-se Ajax and a lorge number of other enhancements.
For de tails of t he changes see the release not es for version 2.
j

Download Version 2.0 RC 1 Size


----_.----- ---(377Kb)

WAR File:

dWtr

dw. or

(1 .3Mb)

Sources:

clwr-2.0.rc l -src.zip

(17. 72Mb)

JAR File:

Figura 24.4

Aps baixar o lAR, coloque-o, como de costume, no diretrio Iib da


sua aplicao.
CRIANDO UM

CRUD

COM AJAX E

DWR

Para esse framework voc ter um exemplo mais complexo, criando um


CRUD. Para comear, voc criar uma classe que ser chamada pela sua
aplicao Ajax.
A seguir voc tem a Figura 24.5 do projeto completo:

620 I\l

Desenvolvendo Aplicaes Web com JSP.. ,

t.. Pro)ect Explorer

Navigator

13 li;;> TrabComDWR
cA..
. (t) ..
Deployment Descriptor: Tr abComDWR

'h

S ~ Java Resources : src

s mmeupacote
i

ffi [l)

Autores ,java

$ m meupacote.controller
(j:J... [l) AutoresController. java

S m meupacote.dwr

(t) . [l) AjaxFacade,java


(2:; f'lETA-INF
;... (!J persistence, xml

I;l

, r.e\ libraries
{j:J . (2:; build

13 ' (C, WebContent


$(2:; css
estilos,css
lJ(2:; imagens
lJ(2:; META-INF
$(2:; script
! ..
date ,js

, :. Illil

.pJ

. ' . $J script. js

S (2:; WEB-INF
; .(C, lib

lRl

dwr ,xml
web,xml
index,jsp

(!J

.@J

Figura 24.S

Dentro do pacote meupacote.dwr crie a classe AjaxFacade, como


listada a seguir:
Aj axF acade . j ava
package meupacote.dwr;

import java.util.Date;
import java.util.List;
import meupacote.controller.AutoresController;
import meupacote.Autores;

AJAX

l\l 621

public class AjaxFacade {


private Autores autor;
public void setAutor(Autores autor} {
this.autor = autor;

public Autores getAutor( } {


return autor;

public String salvar{int id, String nome, String email, Date


nascimento} throws Exception{
AutoresController ac = new AutoresController( };
setAutor(new Autores ( }};
getAutor( } .setNome( nome };
getAutor{ } . setEmail ( email };
getAutor( } .setNascimento{ nascimento };
if(id!=O}{
getAutor( } .setAutorld{id};
ac.atualizar(getAutor( }} ;
}else ac.salvar{getAutor( }};
return "sucesso";

public Autores selecionarAutor(int id} throws Exception{


AutoresController ac = new AutoresController{ };
setAutor{ac.getAutorPorld(id}};
return getAutor( };

622

[ii] Desenvolvendo Aplicaes Web com JSP...

public String deleteAutor(int id) throws Exception{


AutoresController ac = new AutoresController( );
setAutor(new Autores ( ));
getAutor( ) .setAutorld(id);
ac.excluir(getAutor( ));
return "sucesso";

public List listarAutores( ) throws Exception{


AutoresController ac

= new

AutoresController( );

return ac.todosAutores( );

Como havia sido tido na explicao sobre DWR, atualmente esse


framework suporta Annotations.
Mas o exemplo que voc ir construir no possui o uso de anotaes.
Como voc mesmo pode comprovar, a classe AjaxFacade simplesmente
uma chamada aos mtodos encontrados dentro da classe AutoresController
para Inserir, Atualizar, Visualizar e Excluir, portanto no haver explicaes, pois algo j comum no desenvolvimento ao longo deste livro .

Configurando o DWR
Para configurar o framework DWR, voc precisa criar um arquivo para
mapear as classes Java para que elas possam ser reconhecidas e utilizadas
no JavaScript.
Esse arquivo deve estar dentro da pasta WEB-INF junto ao deployment
descriptor web.xml.

AJAX ll

623

dwr.xml
<?xml version="l.O" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"- // GetAhead Limited // DTD Direct Web Remoting l.O // EN"
''http: //www . getahead.ltd.uk/dwr/dwrlO.dtd''>
<dwr>

<init>
<converter id="date"
class="org.directwebremoting.convert.DateConverter"/>
</init>
<allow>
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"l>
</create>
<create creator="new" javascript="AjaxFacade">
<param name="class" value="meupacote.dwr.AjaxFacade"l>
</create>
<convert converter="date" match="java. util. Date" I>
<convert converter="bean" match="meupacote.Autores" I>
</allow>
</dwr>

o arquivo dwr.xml criado, voc tem os seguintes elementos, na raiz


<dwr/> :
~ <init/>: Esse elemento opcional inicializa uma determinada classe.
~ <allow I>: Este elemento onde voc define qual classe ser
mapeada para o JavaScript desenvolvido pelo framework.
~ <create I>: Um sub-elemento de <allow/>, define o tipo e o nome
do objeto JavaScript. Nesse elemento voc encontra os atributos:

624

[iIJ Desenvolvendo Aplicaes Web com JSP...

creator - Tipo creator do objeto JavaScriptlJava. O creator


new utilizado indica que o JavaBean usa um construtor sem
argumento, que todo JavaBeans deve ter.
javascript - Nome do objeto JavasScriptlJava.
<param/>: Sub-elemento de <create/>, onde voc especifica a
classe que deseja utilizar. Nesse elemento voc possui os atributos:
na me - Tipo.
value - Endereo da sua Classe, incluindo o pacote, claro.
<con~ert/>: Sub-elemento de <allow/>, com essa tag voc define os beans que sero utilizados em seu JavaScript. Esse elemento
possui os seguintes atributos :
converter - Tipo.
Match - Endereo do pacote ou o JavaBean.

Aps configurar e entender o que faz o arquivo dwr.xml, voc precisa adicionar alguns elemento no deployment descriptor para disponibilizar o uso
do framework em sua aplicao:
web.xrnl
<?xml version="l . O" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2 . 4"
xrnlns="http://java.sun.com/xrnl/ns/j2ee"
xrnlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xrnl/ns/j2ee http://
java.sun.com/xrnl/ns/j2ee/web-app_2_4.xsd">
<display-name>TrabComDWR</display-name>
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>

AJAX

ll 625

</servlet>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

o elemento <servlet/> usado aqui para chamar o Servlet DwrServlet,


atravs do sub-elemento <servlet-c1ass/>, o que no passa de uma configurao normal de Servlet, como j visto em outros captulos. Com o elemento <init-pararn/>, voc pode habilitar debug, atravs do sub-elemento <param-name/>, para depurar possveis erros.

o RECONHECIMENTO DA CLASSE JAVA PELO DWR


Depois de configurado, voc pode acessar os scripts gerados pelo framework
DWR no navegador. Basta digitar o endereo da sua aplicao e colocar /dwr:
http://localhost:8080/TrabCamDWR/dwr/
=

fi OWR Test lndex X

<> ,

111

<!;),

Ihttp://localhost:8080/TrabComOWR/dwr/index.html

",' , ~

Classes known to DWR:


AjaxFacade (meupacote.dwr.AjaxFacade)
IDate (java.util.Date)
DWRSystem (org. directwebremoting.remoted.DwrSystem)

Figura 24.6

626 lI Desenvolvendo Aplicaes Web com JSP...

o DWR reconhece a sua classe Java, criando o acesso atravs de uma


classe JavaScript, de mesmo nome da existente em Java, contendo os mtodos desenvolvidos. No link AjaxFacade voc vai visualizar todos os
mtodos existentes no script gerado. Graas a essa caracterstica do
framework, antes mesmo de trabalhar na sua aplicao, voc pode testar e
ver se tudo est funcionando conforme o planejado.

Methods For: AjaxFacade (meupacote.dwr.AjaxFacade)


To use this e1ass in your javascript you will need the foUowing script includes:
<script type='texe/javascripe' src-'/TrabCornDWR/dwr/1ntertace/AlaxFacade.ls'></scr1pt>
<~cript

type-'text/javascript'

~rc-'/TrabComDWR/dwr/engine.j~'></script>

In addition there is an optional utility script:


<script type-'texe/javascript'

~rc'/TrabComDWR/dwr/util.j~'></scr1pt>

Replies from DWR are shown with a yeUow background ifthey are simple or in an alert box otherwise.
The inputs are evaluated as J avascript so strings must be quoted before cxecubon.
There are 15 declared methods:

); Execute I
selAutor(
getAutor(); Execute I
); Execute I
salvare O
); Execute I
selecionarAutor( O
); Execute I
deleteAutor( O
listarAutores(); Execute I
haihC,)(JeU i::: f;vt i:..f~-cl()t,.le l..;lcthods Jefu,t>d U1 Jav:" JiolJ.g ()bject are Ilc-l a~(:e~$lt:..1t
gt!t;.~b-::s0 1$ n0t u...allt:.ble: hreth.,)(.:h~ deuneJ J! )il,va.lang.0b,lcct ilC :,,(,t at:ce:s:able

Figura 24.7

Observe que, por exemplo, voc quiser visualizar todos os autores


existentes no seu banco de dados, basta clicar no boto Execute, do lado
direito do mtodo listar Autores(), que uma caixa de mensagem JavaScript
surgir listando os autores existente.
Caso voc queira selecionar um autor, basta digitar o cdigo do autor
(lD) na caixa ao lado o mtodo selecionaAutor e clicar no boto Execute
que novamente uma caixa de dilogo surgir mostrando o autor selecionado.

627

AJAX

o mesmo

aplicado aos mtodos salvare ) e deleteAutor( ), onl1e


podero ser testados tanto a insero ou atualizao de um autor como
tambm a sua excluso.
Outro detalhe est na incluso de tags <scriptJ> na sua aplicao. Para
que isso venha a funcionar devidamente em sua pgina Web, ser necessrio incluir os JavaScripts listados no comeo dessa pgina de testes de
mtodos.
ADICIONANDO JAVASCRIPT A SUA APLICAO

Agora que voc j tem certeza de que a sua aplicao est se comunicando
com o servidor atravs de JavaScript, ser necessrio desenvolver o que
ser feito com os mtodos gerados pelo DWR.
Por se tratar de Ajax, fica evidente que o uso de JavaScript ser necessrio em sua aplicao, uma vez que esse framework exige isso.
O JavaScript listado a seguir executar duas situaes, uma a do
envio dos dados relativos ao formulrio que voc criar. A outra ser a
exibio das informaes em uma tabela paginada.
Em meio a isso, voc ter funes relativas ao DWR mescladas as de
JavaScript desenvolvidas especialmente para esse exemplo.
Esse script dever ser salvo no diretrio script, encontrado na raiz da
sua aplicao.
script.js
function Paginacao( ){})
function limparCampos( ) (
$( 'msg') .innerHTML=";
$('tituloForm') . innerHTML= 'Cadastro de Autores';
$('autorld') .value=";
$('nome') .value=";
$('email') .value= ";
$('nascimento') .value=";

___

~.-

__""'-

____ .__ _________ . .


~

___

~-_o.....-

_-' ____

&_

......

__

628 Il Desenvolvendo Aplicaes Web com JSP...


function salvar( ) ( ~
if($('nome') .value=="){
alert( 'Preencha o Nome do Autor') ;
$('nome') .focus( );
return;

DWRUtil.setValue ('msg', 'Enviando o cadastro ... ') ;~

$('msg') .style.color = '#FFOOOO';


var retorno = function(ret){
if(ret=='sucesso'){
DWRUtil . setValue('msg', 'Operao executada com sucesso! ') ;
$('msg') .style.color = ' #000 ' ;
limparCampos ( );
Paginacao.refresh( );
}else{
D.vRUtil.setValue( 'msg', ret);

AjaxFacade . salvar ($('autorId') .value, $( ' nome') .value,


$('email') .value ,parseDate( $( ' nascimento') .value ) , retorno ); C)

Paginacao.maximoLinhas
Paginacao.numero = O;
Paginacao.dados = null;
Paginacao.atual = -1;
Paginacao.numeroPaginas

3;

= O;

Paginacao.setDados = function(dt){

this.dados = dt;
this.nurneroPaginas = Math.ceil(this.dados.length/
this.maximoLinhas) ;

AJAX [iiiI]

629

Paginacao.show = function(numero) {

var inicio = numero*this.maximoLinhas;


var fim = inicio+this .maximoLinhas;
if(fim>this.dados.length) {
fim = this . dados.length;

var pageData = new Array( );


for(var i=inicio, j=O;i<fim;i++, j++) {
pageData[j) = this.dados[i);

DWRUtil.removeAllRows( 'autoresBody' ) ; 6)
var funcoes = [
function(reg)
return reg.nome; },
return reg.email; },
function(reg)
function(reg)
var nascimento='OO/OO/OOOO';
if(reg.nascimento!=null)
var nascimento = formatDate( reg.nascimento, 'dd/MM/yyyy' ) ;
return nascimento;

lo
function(reg)
return '<a href="#" title="Editar Autor"
orlclick=" Paginacao .edit ( '+reg. autorld+' ) ; ">
<img src="imagens/edit.gif" border="O" /></a>';
lo
function(reg) {
return '<a href=H#" title="Excluir Autor"
onclick=" Paginacao.deleteRow( ' +reg. autorld+' ) ; ">
<img src=Himagens/delete.gif" border="O" /></a>';

630

Desenvolvendo Aplicaes Web com JSP...

];

DWRUtil.addRows( 'autoresBody ' , pageData, funcoes ) ; ~

this.atual = numero;
DWRUtil.setValue( 'pagin~.tual' ,

'Pgina '+(this.atual+l)+' de

'+this.numeroPaginas ) ;

Paginacao.first

function ( ) {

this . show (O) ;


Paginacao.last = function( ){
this . show(this.numeroPaginas-l);
Paginacao.next = function( ){

var numero = this . atual+l;


if(! (numero<this.numeroPaginas)) {
numero = this . numeroPaginas - l;
this.show(numero) ;
Paginacao.previous = function( ) {

var numero = this . atual - l;


if(numero<O){
numero = O;
this.show(numero) ;
Paginacao.deleteRow = function(id) {

if(confirm('Deseja exc l ui r esse autor?')){


var r e t orno = function( r et) {
if(ret=='sucesso'){
Pagi nacao.refresh( );
al er t ('Autor exc ludo com sucesso');
limparCampos( );

AJAX l)il]

631

AjaxFacade.deleteAutor (id, retorno); ~

Paginacao.refresh = function( ) (

var callback = function(ret) (


Paginacao.setDados(ret);
Pag i nacao.first( );
AjaxFacade.listarAutores(callback) ; ~

Paginacao.view = function( ) (

var fct = function( ) (


Paginacao.refresh( );
DWREngine.setPostHook(function( ) (});

Paginacao.autor = ( id:O, nome:null, email:null, nascimento:null };


Paginacao.fillForm = function(aautor)

this.autor =aautor;
DWRUtil.setValues(this.autor);
if(this.autor.nascimento!=null)(
var bd = formatDate( this . autor . nascimento, 'dd / MM / yyyy' ) ;
DWRUtil. setValue ( 'nascimento', bd ) ;

Paginacao.edit = function(id) (

$('tituloForm') .innerHTML='Editar Autor ' ;


AjaxFacade.selecionarAutor(tbis.fillForm, id ) ; CD

Paginacao.refresh( ) ;

632

[ljjl] Desenvolvendo Aplicaes Web com JSP...

Esse script contm uma classe chamada PaginacaoO. Embora parea estranho, primeira vista, para um desenvolvedor Java, o JavaScript
tem uma forma toda particular de criar classes.
A classe Paginacao possuir todos os mtodos necessrios tanto para
a elaborao da tabela como tambm para que voc possa pagin-la.
exatamente o que voc est lendo, paginar uma tabela com JavaScript.
Evidentemente isso no Ajax, mas sim DHTML. Damos o nome de
DHTML quando misturamos XHTML, JavaScript e CSS.
A princpio, voc tem um mtodo JavaScript normal, chamado de
IimparCampos( ), que simplesmente faz o que seu nome diz, limpa os
campos do formulrio. Um detalhe importante nesse mtodo est em um
mtodo utilizado, pertencente ao DWR, chamado de $(). Esse mtodo substitui o document.getElementByld, exatamente como ocorre no framework
Dojo, no mtodo byld( ).
O mtodo salvar( )8 ser o responsvel por transportar os dados do
seu formulrio para a insero ou atualizao de dados.
De inicio, um exemplo de verificao de formulrio feito, em apenas um campo, o de nome do autor, para que seja preenchido. O mtodo
setValue( )6), pertencente ao DWR em sua biblioteca DWRUtil, tem o
poder de adicionar valores a objetos XHTML, como o caso mostrado,
onde aparecer uma mensagem em uma tag <span /> que ficar na sua
pgina XHTML, com o atributo id contendo o valor msg. O mtodo
setValue( ) no precisa ser utilizado apenas para esse fim, como voc ver
mais adiante.
A chamada ao mtodo salvar( )0 criado na classe AjaxFacade, do
seu Java, feito pelo script de mesmo nome, que como voc bem sabe, o
DWR o criou automaticamente para que voc possa utiliza-lo em seus
scripts.
Como esse JavaScript orientado a objetos, digo o criado pelo DWR,
o nome da classe AjaxFacade deve ser chamada antes do mtodo salvar(
), na estrutura similar ao Java, com a separao entre um e outro atravs do
"." Ponto.
O mtodo salvar( ) cri ado pelo DWR contm a passagem dos
parmetros do mtodo que o originou, em Java, e mais um, que d o retorno gerado remotamente pelo servidor.

AJAX

633

A classe AjaxFacade, criada em Java, retoma um valor, em String,


contendo a palavra sucesso. A chamada a retorno, no mtodo salvar( ),
gerado pelo DWR, um mtodo.
O mtodo retorno possui um parmetro, que o possibilita verificar se
o trabalho com o servidor foi feito perfeitamente. Isso ocorrendo, msg muda
de mensagem, possibilitando assim fazer umfeedback com o usurio.
Continuando no entendimento do script, atributos so criados para
determinar o nmero mximo de linhas a serem exibidas pela tabela, o
nmero inicial, a pgina atual e o nmero de pginas.
Paginacao .maximoLinhas = 3;
Paginacao .numero = O;
Paginacao. dados = null;
Paginacao. atual = -1;
Paginacao .numeroPaginas = O;

O mtodo setDados( ), de Paginacao, faz o clculo do nmero de


pginas que ter a sua paginao. Isso feito atravs do total de linhas
encontradas no banco dividido pelo nmero mximo de linhas que podero
ser exibidas por pgina.
O mtodo removeAlIRows( )0, de DWRUtil, pega todas as linhas
da tabela indicada por seu ID, passado como parmetro, e as remove.
Para preencher as linhas da tabela, com os dados vindos do banco de
dados, capturados em Ajax pelo DWR, var funcoes, agrupa uma srie de
mtodos com os valores que sero utilizados para preencher a tabela. Observe que no nascimento, um mtodo JavaScript chamado formatDate ( )
usado. Esse mtodo faz parte de uma biblioteca de scripts que voc dever adicionar, contendo converses do formado java.util.Date para o formato de data que desejarmos.
A tabela conter tambm duas clulas, onde uma ser um link para
editar, e a outra ser um link para excluir os dados, ambos representado por
uma imagem.
Para adicionar as linhas criadas pelo DWR, voc utilizar o mtodo
addRows( )0, de DWRUtil. Esse mtodo utiliza trs parmetros, onde
um o local onde sero adicionadas as linhas, o segundo parmetro os

634 l'iI

Desenvolvendo Aplicaes Web com JSP...

dados que sero adicionados e o terceiro as funes que recebero as informaes e as transformaro.
Os mtodos first, last, next e previous fazem paginao. Eles no
sero explicados, pois possui lgica similar a utilizada em uma paginao
criada para JSF.
O mtodo deleteRow possui um parmetro que recebe o ID do autor
e o enviar para remoo. Essa remoo feita atravs do mtodo
deleteAutor( )8, da classe AjaxFacade criada no JavaScript gerado por
DWR como tambm pela classe de mesmo nome criada em Java por voc.
O mtodo refresh, de Paginacao, chamado em muitas partes do script,
possui a chamada ao mtodo listarAutores( )0, no qual recebe os dados
existentes no banco de dados. Tanto se voc remover, editar ou adicionar
um novo autor, esse mtodo deve ser chamado para que a tabela gerada por
JavaScript esteja atualizada.
O DWR se integra aos dados existentes na sua aplicao Java. muito simples trazer os dados da tabela que ser gerada para o formulrio, que
ser utilizado tanto para inserir novos autores como tambm para editar.
Com o mtodo edit, de Paginacao, voc captura o ID do autor, passado atravs do link criado nas linhas geradas por JavaScript e chama o mtodo selecionarAutor( )0, tanto do JavaScript gerado por DWR, como
tambm pelo mtodo de mesmo nome da classe Java que voc desenvolveu. O mtodo gerado por DWR, retoma o valor para um mtodo que voc
dever criar, em JavaScript.
O mtodo fillForm, de Paginacao, capta os valores existentes,
retomados por selecionarAutor( ), converte o formato da data para o nosso idioma, atravs do mtodo formatDate( ), da biblioteca script que voc
ir ainda adicionar ao seu projeto.
TRANSFORMANDO A DATA ATRAVS DO JAVASCRIPT

Para medi ficar o formato de data, obtido pelo DWR, atravs da data do
nascimento, retomado pelo Bean Autores, voc no precisar construir
nenhum mtodo especfico. J existe um conjunto de mtodos em um script
que voc pode baixar livremente.

AJAX [)jlJ

635

Entre no endereo http://www.mattkruse.com/javascript/date/


index.html e clique no link Source. Baixe o arquivo date.js.
Coloque esse arquivo no diretrio script da sua aplicao, como feito
no caso do JavaScript gerado anteriormente por voc.
Um outro detalhe dessa pgina que voc tem a possibilidade de
testar os mtodos existentes, para utilizar em suas aplicaes.
A PGINA FINAL DA SUA APLICAO

Com todos os requisitos necessrios desenvolvidos ou adicionados para a


sua aplicao, nada mais falta alm de desenvolver a pgina que receber
as informaes, podendo fazer um CRUD com seus dados.
index.jsp
<%@ page language="java" contentType="text/html"
pageEncoding="ISO-8859-1'%>
<!DOCTYPE html PUBLIC
"-/ /W3C // DTD HTML 4.01 Transitional // EN" ''http: //www.w3.org / TR/
htm14 / 1oose.dtd H>
<html>
<head>
<title>Desenvolvendo com Ajax e DWR</title>
<script src="/TrabComDWR/dwr/interface/AjaxFacade.js">
</script>
<script src=" /TrabComDWR/dwr /engine.js "></script>
<script src=" /TrabComDWR /dwr/util.js "></script>
<script src="/TrabComDWR/dwr/interface/JDate.js">< / script>
<script type=" text/j avascript" src=" script/date. js ">< / script>
<script f1Pe=" text/j avascript" src=H script/script. js "></script>
<link href="css /estilos . css" rel=" stylesheet" />
</head>
<body>
<di v id="dwr">

636 !Iil

Desenvolvendo Aplicaes Web com JSP...


<form id=" dwrform" method="post" action="">
<fieldset>
<legend id=" tituloForm" >Cadastro de Autores</legend>
<label for="nome">Nome : </label>
<input type="text" name="nome" id= "nome"
class="campo" size="20"

I>

I>

<br

<label for= .. email .. >E-mail: </label>


<input type="text" name="email" id="email"
class="campo" size="20"
<br

I>

I>

<label for="nascimento">Data de Nasc. : </label>


<input type="text" name="nasc i mento"
id="nascimento" class="campo" s i ze="lO"
<br

I>

I>

<span id="msg"></span>

I>
<br I>
<br

<input type="hidden" id="autorld" name="autorld"


value="O"

I>

<input type="button" name="btEnviar"


id="enviar" value="Enviar" onclick=" salvar( ) ;"
</fieldset>
</form>

</div>
<table class="grid">
<thead>
<tr>
<th colspan="5">Autores Cadastrados</th>
<Itr>

<tr>
<th>Nome</th>

<th>E-mail</th>
<th>Nascimento</th>

I>

AJAX l\l
<th>Atualizar</th>
<th>Excluir</th>
<Itr>

</thead>
<tbody id= "autoresBody">
</tbody>
<tfoot>
<tr>
<td>
<i.mg src="imagens/first . gif"

onclick="javascript:Paginacao.first( );"
style="cursor:pointer" I>
<img src=" imagens Iprevious . gif"

onclick="javascript:Paginacao . previous( );"


style="cursor:pointer" I>
<i.mg src="imagens/next.gif"

onclick="javascript:Paginacao . next( );"


style="cursor:pointer" I>
<i.mg src="imagens/last . gif"

onclick="javascript:Paginacao.last( );"
style="cursor:pointer" I>

<span id=" paginaAtual "></span>


</td>
<Itr>

</tfoot>
</table>
</body>
</html>

637

638

[ilJ Desenvolvendo Aplicaes Web com JSP, ..

No incio da pgina, voc j define a incluso dos JavaScripts relacionados ao DWR e tambm o desenvolvido junto ao da manipulao de
data.
<script src="/TrabComDWR/dwr/interface/AjaxFacade.js ">
</ script>
<script src=" /TrabComDWR/dwr/engine.js" ></script>
<script src="/TrabComDWR/dwr/util.js "></script>
<script src="/TrabComDWR/dwr/interface/JDate.js "></script>
<script type="text/javascript" src="script/date.js"></script>
<script type="text/javascript" src=" script/script.js" ></script>

Um formulrio ento criado, contendo todos os campos existentes


no Bean Autores.
Em destaque voc v uma tag <span/> que contm o atributo id tendo
seu valor msg. Se voc bem lembra, no JavaScript, esse ID chamado
algumas vezes para exibir mensagens avisando da incluso ou atualizao
do autor.
<span id= "msg 11 ></ span>

Observe que o boto de envio contm o atributo oncIick chamando o


mtodo salvar() que voc desenvolveu. O tratador de evento onclick, aqui
tido como um atributo da tag <input/>, o indicado para chamar mtodos
JavaScript que requerem a captura do clique efetuado pelo usurio.
<input type="button" narne="btEnviar"
id="enviar" value="Enviar" onclick=" salvar( ) ;" />

Mais abaixo, na pgina desenvolvida, voc v uma tabela. Essa tabela


ser onde aparecero os autores cadastrados. Ela no contm muito contedo, pois voc o faz via ajax, atravs do script Paginacao desenvolvido
anteriormente. Note a tag <tbody/>, que contm o atributo id com o valor
autoresBody. Esse atributo chamado pelo JavaScript por voc desenvol-

AJAX [Iijl]

639

vi do com o intuito de montar as linhas com os valores resultantes do banco


de dados.
<tbody id=" autoresBody" >

Quase ao fim da sua pgina, existem trs imagens, que representam


paginao. Cada imagem faz chamada a classe Paginacao seguido do
mtodo que a representa, atravs do evento onclick.
O ltimo item encontrado na tabela, que tambm no menos importante, a tag <span/>, com seu atributo id contendo o valor paginaAtual.
Essa tag receber o texto indicador da situao da sua paginao.
<span id=" paginaAtual "></span>

O resultado de todo esse trabalho mostrado na Figura 24.8 a seguir:


,.. Deseovolvendo com Ajax e OWR X

<?

,e:'

111

<8'

Ihttp://1ocalhost:8080/TrabComOWR/

v~1 1>

11

Cadastro de Autores
Nome:

E.me.i.1:
Data de Nasc.:

No_
Edson Gonalves

edsoll@inteptor.colt\.br 0411111978

Tarcizio da Roeha

tarcizio@g)\ux.comhr

1011011970

rJI
rJI

Andr Gonalves

andre@i1Iteptor.combr 1111111982

r:?I

~~~~

Pgina 1 de 1
v

Figura 24.8

640

~ Desenvolvendo Aplicaes Web com JSP...

JavaServer Faces e Ajax


Como voc j aprendeu em captulos anteriores, estender o JavaServer Faces uma tarefa muito simples.
Evidentemente se conclui que adicionar Ajax tambm uma dessas
tarefas. Tanto voc pode criar uma pgina JavaServer Faces adicionando
Ajax, criando seus prprios componentes ou simplesmente utilizar uma
biblioteca j feita. Existem muitas bibliotecas espalhadas pela internet, que
adicionam Ajax a suas aplicaes JSF. Algumas dessas bibliotecas so gratuitas e outras pagas. Falar sobre como criar uma aplicao JSF estendendo-a com Ajax, sem o uso de uma dessas bibliotecas, vai muito alm deste
livro.
UTILIZANDO O FRAMEWORK AJAX4JSF

Um dos mais populares frameworks JSF que estendem suas aplicaes para
utilizar Ajax o Ajax4jsf.
Ajax4jsf um framework open souce que adiciona Ajax em suas aplicaes escritas em JSF sem a necessidade de JavaScript. Foi desenvolvido
por uma empresa chamada Exadel, Inc e liberado para a comunidade. Esse
framework inclui: ciclo de vida, validao, facilidade de converso e
gerenciamento de recursos estticos e dinmicos. Sua capacidade de criar
componentes com a incluso de suporte a ajax e de se incorporar a aplicaes j feitas com JSF de forma simples o tomou muito popular rapidamente.
VANTAGENS DE UTILIZAR O AJAX4JSF

A maior vantagem com certeza de se utilizar esse framework reside na


possibilidade de incorpor-lo a suas aplicaes JSF sem uma linha de cdigo JavaScript e sem ter que alterar grandes coisas para adicionar Ajax.
Contm uma boa documentao, o que facilita muito o seu uso e compreenso.
Esse framework tambm Open Souce, o que garante a possibilidade
de uso livre e tambm adaptao, caso haja necessidade.

AJAX [)il]

641

DESVANTAGENS DE UTILIZAR O AJAX4JSF

A maior desvantagem deste framework reside na sua utilizao. Ele foi


feito especialmente para ser utilizado com JSF. O que significa que utilizalo em outras aplicaes escritas em Java sem o uso de JSF nem pensar.
BAIXANDO E CONFIGURANDO O AJAX4JSF

Para baixar esse framework, entre no endereo https://


ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.htmI e clique em
ajax4jsf-1.0.5-binary.zip. At o momento em que esse livro escrito, a
verso do framework 1.0.5. O arquivo possui 1.18 MB.

Ajax4jsf - Open Source Framework. Download Page


License Common Development and Dislribulion License
Latest Verslon: 1.0.5, released December 13, 2006

Binary and Source Code Oistributiolls


~f.1.0.5.binary.Zill'

Binary Distribution

Figura 24.9

Aps baixar o arquivo, descompacte-o e coloque os arquivos


ajax4jsf.jar e oscache-2.3.2.jar, no diretrio lib da sua aplicao.
CRIANDO UM CRUD COM AJAX4JSF

Assim como no framework DWR, voc ter um exemplo criando um CRUD.


A grande diferena, felizmente, estar no cdigo.
Para comear, voc seguir o mesmo contexto que j vem utilizando
nos exemplos anteriores deste captulo, acrescentando apenas alguns novos itens. Portanto a conexo, bem como as classes Autores e
AutoresController permanecem as mesmas.

642

l)il] Desenvolvendo Aplicaes Web com JSP...

co

Project Explorer ~

13- ~ TrabComAjax4jsF
Gil \~ Oeployment Oescriptor: TrabComAjax4jsf

~I

s~ Java Resources: src

mmeupacote
[[] Autores.java
8 mmeupacote. controller

13

(B [[]

AutoresController.java

8 m meupacote.web
Gil .. [[] AutoresAjax4jsf. java
!2:7 META-INf
. persistence.xml
(B
Libr aries
(B !2:7 build
8 !2:7 WebContent
W !2:7 META-INf
13 !2:7 WEB-INf
!2:7 lib
!

00

faces-conFig.xml
... ~ web.xml

~ form.jsp

~_____~~in_d_
ex~.js~p______________

~I

Figura 24.10

Dentro do pacote meupacote.web crie a classe AutoresAjax4jsf, como


listada a seguir:
AutoresAjax4jsf
package meupacote.web;
import javax.faces.application.FacesMessage;
import javax .faces . context .FacesContext;
import javax.faces.model.DataModel;
import javax.faces .model.ListDataModel;
import meupacote.Autores;
import meupacote.controller.AutoresController;
public class AutoresAjax4jsf {

AJAX I\l
private Autores autor

new Autores ( );

private DataModel model;


private boolean atualizando=false ;
public void novoAutor( ) (
this.autor = new Autores ( );

public void setAutor(Autores autor) (


this.autor = autor;

public Autores getAutor( ) (


return autor;

public String salvar( ) (


AutoresController ac = new AutoresController( ) ;
if (atualizando) (
aC.atualizar(autor) ;
addMessage ("Autor atualizado com sucesso!") ;
atualizando=false;
else{
ac. salvar (autor) ;
addMessage ("Cadastro efetuado com sucesso!") ;

novoAutor( );
return "OK";

public static void addMessage (String msg) {

643

644

[)jl] Desenvolvendo Aplicaes Web com JSP...

FacesContext.getCurrentlnstance( ).
addMessage(null, new FacesMessage(msg)) i

public DataModel getTodosAutores( ) (


AutoresController ac = new AutoresController( };
model =
new ListDataModel(
ac.todosAutores(
};

return model;

public String excluir( ) (


AutoresController ac = new AutoresController( };
Autores autor = (Autores) model.getRowData( );
aC . excluir(autor);
addMessage ("Autor excludo com sucesso!") ;
return "OK";

public String prepararPAlterar( ) (


autor = (Autores) model.getRowData( );
atualizando=true;
return "OK";

Para voc que j est acostumado com JavaServer Faces, no h novidades no desenvolvimento mostrado na classe AutoresAjax4jsf.

AJAX

ll 645

Como um CRUD ser gerado, voc deve ter mtodos para cadastrar
um novo autor, um para visualizar, outro para atualizar e tambm para excluir. Todos esses mtodos j existem na classe AutoresController, mas a
sua adaptao para a utilizao em JavaServer Faces precisa ser feita. Dessa forma, a classe criada foi feita exatamente para isso, executar as tarefas
bsicas de manipulao com banco de dados utilizando mtodos que
retomam valores para a sua pgina JavaServer Faces.
A idia da pgina criar um formulrio na parte superior, onde voc
possa preencher os dados do autor, ou atualiza-los e depois t-los exibidos
na parte inferior da mesma pgina, em uma tabela.
O mtodo salvar( ) ter o papel de cadastrar novos autores bem como
atualizar um autor. Para que isso seja possvel, um atributo booleano chamado atualizando indicar sempre, em escopo de sesso, se o item que
est sendo postado pelo formulrio , ou no, uma atualizao.
Em ambos os casos, sendo ou no, uma mensagem ser enviada a
pgina JSF, indicando assim ao usurio se o resultado foi obtido com sucesso. Como so mtodos String, o retomo deve ser uma string qualquer.
Para mostrar todos os autores, o mtodo getTodosAutores( ) entra
em ao. Como j era de se esperar, na construo de uma tag JSF
<h:dataTable/> fora utilizado um DataModel.
O mtodo excluir() elimina uma informao do banco de dados, chamado atravs de um link gerado na tabela por JSF.
Para uma alterao, voc precisa dizer qual na linha da tag
<h :dataTable/> foi chamada para alterao. Nesse caso, o mtodo
prepararPAlterar() faz exatamente isso, atravs do mtodo getRowData(
) da classe DataModel. Alm disso, o atributo atualizando precisa ser alterado para true, assumindo assim que os dados em questo, no formulrio,
so de informaes que sero atualizadas e no inseridas, o que de fundamental importncia para o mtodo salvar( ), como j dito a pouco .

Configurando o Ajax4jsf
Configurar o framework Ajax4jsf uma tarefa simples, bem mais fcil do que
visto em outros casos. Voc precisa adicionar alguns elementos no deployment
descriptor para disponibilizar o uso do framework em sua aplicao:

646

[ljjlJ Desenvolvendo Aplicaes Web com JSP...

web.xml.

<filter>
<display-narne>Ajax4jsf Filter</display-narne>
<filter-narne>ajax4jsf</filter-narne>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-narne>ajax4jsf</filter-narne>
<servlet-narne>Faces Servlet</servlet-narne>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-narne>ajax4jsf</filter-narne>
<url-pattern>/*</url-pattern>
</fi lter-mapping>

Com os elementos <filter/> e <filter-mapping/>, voc determina em


quais locais suas pginas JSF tero suporte a Ajax4jsf.
Com apenas essa configurao, suas aplicaes j esto prontas para
trabalhar com o framework.
CONFIGURANDO FACES-CONFIG.XML

o arquivo faces-config.xml dever ter sua configurao normalmente como


em qualquer pgina JSF que voc j tenha feito. Adicione a classe que ser
chamada pela sua pgina e, caso haja, coloque as regras de navegao e
pronto.

--~----

- .......... -._-

AJAX [\] 647


faces-config.xml

<faces-config>
<rnanaged-bean>
<rnanaged-bean-narne>autores </rnanaged-bean-narne>
<rnanaged-bean-class>
meupacote.web.AutoresAjax4jsf

</rnanaged-bean-class>
<rnanaged-bean-scope>
session
</rnanaged-bean-scope>
</rnanaged-bean>
<navigation-rule>
<navigation-case>
<frorn-outcorne>forrn</frorn-outcorne>
<to-view-id>/forrn.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

A PGINA FINAL DA SUA APLICAO

Simplesmente aps a adio dessas configuraes, basta criar sua pgina


JSF. O mais impressionante de tudo que, em momento algum, voc precisou utilizar JavaScript. Isso no algo preocupante, pois o Ajax4jsf se encarregar de gerar o script necessrio para a comunicao com o servidor.
form.jsp

<%@ page language="java" contentType="text/htrnl"


pageEncoding="ISO-8859-1"%>
<%@ taglib uri=''http://java.sun.com/jsf/htrnl'' prefix="h"%>

648

(1iil]

Desenvolvendo Aplicaes Web com JSP...

<%@ taglib uri=''http://java . sun.com/jsf/core'' prefix="f"%>


<%@ taglib uri="https: / /ajax4j sf .dev. java.net/ajax" prefix="a4j"%>

<!DOCTYPE html PUBLIC


"-//W3C//DTD HTML 4.01 Transitional//EN"
''http://www.w3 . org/TR/htm14/loose.dtd''>
<html>
<head>
<title>Cadastrando Autores com Ajax4Faces</title>
<link href="css/estilos.css" rel="stylesheet" />
</head>
<body>
<f:view>
<a4j:region>
<a4j:outputPanel id="msg">

<h:messages />
</a4j:outputPanel>
<a4j:outputPanel id="saida" >

<h:form id="cadastro">
<h :panelGrid columns="2">
<f:facet name="header">
<h:outputText value="Cadastro de Autores" />
</f:facet>
<h :outputText value="Nome:" />
<h:inputText size="15" id="nome"
value="#{autores.autor . nome}" styleClass="campo"/>
<h:outputText value="E-mail:" />
<h:inputText size="30" id="emai l "
value="#{autores.autor.email}" styleClass="campo" />
<h:outputText value="Nascimento:" />
<h:inputText size="10" id="nascimento"
value="#{autores.autor.nascimento}" styleClass="campo">
<f: convertDateTime pattern="dd/MM/yyyy" />

</h:inputText>
</h:panelGrid>

AJAX [lil)
<a4j :commandButton value=ISalvar"
action="#{autores.salvar}" reRender=lsaida,msg" />

<h:dataTable
value="#{autores.todosAutores}"
var="itern" border="O"
cellpadding="2" cellspacing="O"
styleClass="grid"
colurnnClasses="" ,centro,centro"
>

<f:facet narne="header">
<h: outputText value="Autores Cadastrados" />
</f:facet>
<h:colurnn>
<f : facet narne="header">
<h:outputText value="Norne"/>
</f:facet>
<h:outputText value="#{itern.norne}"/>
</h:colurnn>
<h:colurnn>
<f:facet narne="header">
<h:outputText value="E-rnail"/>
</f:facet>
<h:outputText value="#{itern.ernail}"/>
</h:colurnn>
<h:colurnn>
<f : facet narne="header">
<h:outputText value="Nascirnento"/>
</f : facet>
<h:outputText
value="#{itern . nascirnento}">
<f:convertDateTime pattern="dd/MM/yyyy" I>

</h:outputText>
</h:colurnn>

649

650

[\] Desenvolvendo Apl icaes Web com JSP...

<h:column>
<f:facet name="header">
<h:outputText value="Excluir" / >
</f : facet>
<a4j:commandLink id="excluir"
action="#{autores.excluir}"
reRender=lsaida,msg">
<h: graphiclmage value=" imagens/delete. gif"
alt="Clique aqui para excluir o Autor"
styleClass="imagem"
/>

<a4j:ajaxListener
type=lorg.ajax4jsf.ajax.ForceRender" />
</a4j:commandLink>

</ h:column>
<h:column>
<f : facet name="header">
<h :outputText value="Alterar" / >
</ f:facet>
<a4j:commandLink id="alterar"
action=I#{autores.prepararPAlterar}"
reRender=lsaida,msg">
<h:graphiclmage value="imagens / edit.gif"
alt="Clique aqui para alterar o Autor"
styleClass="imagem"
/>

<a4j:ajaxListener
type=lorg.ajax4jsf.ajax.ForceRender" />
</a4j :commandLink>

</ h:column>
</ h:dataTable>

AJAX [\]

651

<Ih: forrn>

</a4j:outputPanel>
</a4j:region>

</ f:view>
</body>

</htrnl>

Para incluir tags Ajax4jsf, a chamada a biblioteca feita pela diretiva


taglib:
<'Yo@

taglib uri="https: / /ajax4jsf .dev .java.net/ajax" prefix="a4j"%>

Observe que o prefixo usado nesse caso a4j, possibilitando assim, a


chamada de tags especficas a esse framework.
Voc percebe que ao longo de sua pgina JSF, elementos Ajax4jsf
aparecem, alterando assim o comportamento normal que a pgina teria.
A tagAjax4jsf <a4j:region /> define uma parte da rvore JSF no qual
ser modificada no servidor durante o pedido processado em Ajax. Observe que essa tag envolve toda a estrutura JSF desse exemplo.
Com a tag <a4j :outputPanel/> voc habilita o Ajax em uma parte da
pgina. O atributo id ter em seu valor a chamada pelas tags de envio,
respondendo pelo pedido. No caso, quando houver uma mensagem dada
pelo servidor, o id com o valor msg mostrar na tela do browser a mensagem transmitida. Nos casos do formulrio e da tabela, em cada insero ou
atualizao, ambos devem ser chamados para refletir a mudana. Uma insero limpa o formulrio, enquanto que uma chamada para atualizao
preenche o formulrio . Na tabela, uma insero adiciona mais uma linha,
uma atualizao modifica seu contedo e uma excluso a remove.
A tag <a4j:commandButton/> tem o comportamento similar ao
<h:commandButton/> de JSF, mas com a diferena de estar trabalhando
de forma assncrona. O atributo reRender, usado na tag, chama os id que
deseja refletir as respostas trazidas do servidor. Dessa forma, no exemplo,
tanto sada como msg sero chamados.
Apenas para comentar, como no caso do Autor voc tem uma data, o
formato em JSF foi alterado para que voc possa digit-lo como manda

652 Il Desenvolvendo Aplicaes Web com JSP...


nosso idioma. Isso foi feito utilizando a tag JSF <f:convertDateTirne/>
adicionando o atributo pattern.
Uma outra tag, tambm similar a utilizada em JSF a <a4j:cornrnand
Link/>, que possui praticamente as mesmas caractersticas que a tag
<h:commandLink/>. Novamente a diferena est no atributo reRender,
que transmite pgina a resposta do servidor, sem o "reload" do navegador, claro.
Um detalhe que chama a ateno est na tag <a4j:ajaxListener/>,
possuindo o atributo type com o valor org.ajax4jsf.ajax.ForceRender.
Essa tag foi colocada por entre a tag <a4j:commandLink/>, dentro da tabela gerada por <h:dataTable/>. A razo de essa tag estar ali est no problema
da gerao de diversas linhas criadas dinamicamente. Tags como
<h:dataTable/> ou <ui:repeat/> possuem a criao de id's dinmicos para
componentes filhos durante a fase de renderizao. Dessa forma, o link
precisa saber de qual linha est tratando quando h um clique, seja para
atualizar como tambm para excluir.
O resultado desse pequeno trabalho um belssimo CRUD sem a necessidade de uma linha sequer de JavaScript:
f'I

= Ell

Cadastrando Autores com Ajax4Faces X

.';:.> t:;~ li

<:)C;

,vJI ~

http://localhost:8080/TrabComAlax4Isf/form.faces

Cadastro de Autores
Nome:

E-mai1:
Nascimento:
[ Selver

I
N8J1Ul
Edson Gonalves

Are. CadutlUo.
E-mail
NucbnelltD F.lIrhdr Alterar
edson@integrator.com.br 0411111978

T arcizio d4 Rocha tarcizio@gnux.com.br

1011011910

Andr Gonalves

andze@integrator.com.br

11/1111983

Edne. Gonalves

edna@integrator.com.br

31JlJ3I1980

Figura 24.11

O
O
O
O

Glt
rlI
rlI
Glt

..... ..... .....

Apndice

A
Um Pouco sobre Java

E VOC INI CIANTE NA LINGUAGEM e escolheu este livro como seu ponto de
partida nesse mundo fascinante, seja bem vindo.
Este apndice estar dedicado total e exclusivamente aos conceitos
de Java .

O Princpio Bsico de Java


Os aplicativos Java automaticamente comeam executando em maio . Os
parnteses depois de maio indicam que ele um bloco de construo do
programa, chamado de mtodo.
O mtodo' maio o executor Java, e sempre que o seu cdigo tiver
que ser executado como um programa, ele deve constar no cdigo-fonte.
A palavra void indica que esse mtodo executar a tarefa a ele definido . Os mtodos so capazes de realizar uma tarefa ou retomar informaes
quando completam suas tarefas.
A chave esquerda "{", indica o incio de um bloco, o corpo da definio do mtodo. Uma chave direita 'I} "deve ser ento colocada para finalizar o bloco.

654 l\I Desenvolvendo Aplicaes Web com JSP...


SVSTEM.OUT.PRINTLN("OL MUNDO!");

Instrui mquina virtual Java que seu programa quer exibir os caracteres
que esto entre aspas . Na verdade, esto entre aspas porque so strings, e
toda string fica entre aspas.
Note tambm que na finalizao de uma linha, voc deve colocar um
ponto-e-vrgula ( ; ).
A linha inteira, incluindo o ponto-e-vrgula, chamada de instruo .

Variveis e Operadores
As variveis devem ser sempre declaradas, isso porque cada uma pode
conter um tipo de dados, primitivos ou objetos.
O tipo de dados importante para que o compilador saiba quantos
bytes de memria devem ser reservados varivel.
Os tipos de dados podem ser primitivos, como os encontrados na
maioria das linguagens existentes .

Tipos de Dados Inteiros


Existem quatro diferentes tipos de dados inteiros e podem armazenar valores dentro dos seguintes intervalos numricos:
Tabela A.1 - Tabela de Tipo de Dados Inteiros
Tipo

Armazenamento

Extenso

int

4 bytes

-2,147,483,648 2,147,483,647

short

2 bytes

-32,768 32,767

long

8 bytes

-9,223,372,036,854,775,808 9,223,372,036,854,775,807

byte

1 byte

-128 127

Em Java os tipos inteiros so sempre capazes de armazenar tanto valores positivos como negativos.

Um Pouco sobre Java [)iI]

655

Tipos de Dados em Ponto Flutuante


Existem dois tipos de representaes para valores numricos em ponto flutuante que se diferenciam pela preciso oferecida.
Tabela A.2 - Tabela de Tipo de Dados em Ponto Flutuante
Tipo

Armazenamento

Extenso

float

4 bytes

Aproximadamente 3.40282347E+38F (6-7 dgitos decimais


significativos)

double

8 bytes

Aproximadamente 1 .79769313486231570E+308 (15 dgitos


decimais significativos)

o nome double refere-se ao fato

de ter os nmeros duas vezes mais

preciso que o tipo float.

Tipo de Dados de Caractere

o tipo de dados char denota caracteres segundo o padro Uni co de de representao. Enquanto uma String representado por valores entre aspas"valor"; o tipo char representado por valores entre aspas simples - 'valor'.
Como o padro Unicode foi projetado para lidar com todos os tipos de
caracteres em todos os idiomas, ele tem um cdigo de 2 bytes, ocupando 16
bits, sem sinal, o que lhe permite representar at 32.768 caracteres diferentes.
Alguns caracteres so considerados especiais pois no possuem uma
representao visual, sendo que em sua maioria so caracteres de' controle
e outros so de uso reservado pela linguagem.
Esses caracteres podem ser especificados dentro dos programas como
indicado na tabela a seguir, precedidos pela barra invertida '\ ' :
Tabela A.3 - Tabela de Tipo de Dados de Caractere
Caractere

Nome

Significado

\b
\t

Backspace

Retrocesso

Tab

Tabulao

\n

Linefeed ou NewLine

Nova linha

\r

Carriage return

Retorno de carro

\"

Double quote

Aspas

\'

Single quote

Apstrofo

\\

Backslash

Barra invertida

656 l'iI Desenvolvendo Aplicaes Web com JSP...

Tipo de DADOS LGICO


Em Java o tipo lgico o boolean, capaz de assumir valores como false
(falso) ou true (verdadeiro) .

Declarao de Variveis
Uma varivel um nome dado pelo programador uma informao no
qual se deseja armazenar alguma informao. Essa informao pode ser
definida pelo seu tipo primitivo, ou seja, caractere ou no, ou pode ser um
objeto.
Uma varivel em Java pode ser um caractere ou uma seqncia de
caracteres, que devem ser alfabticos e numricos, obrigatoriamente iniciado com um valor literal ou por um caractere '_' de sublinhado (underscore)
ou '$' (cifro).
Como Java faz diferena entre letras maisculas e minsculas, variveis como Teste e teste so consideradas diferentes.
Precedendo a varivel, em sua declarao, voc deve colocar seu tipo.
Por exemplo:
int teste;
double total;

Alm dessas regras bsicas, voc tambm deve tomar cuidado com as
palavras que so reservadas pela linguagem, que obviamente, so de uso da
linguagem ou se encontrar reservadas para uma futura incluso na linguagem Java.
Portanto, evite declarar variveis como: for, new, class, do, final,
operador, rest, varo
Tambm possvel declarar variveis de mesmo tipo separados por
vrgula:
double total, valorl, valor2;

Um Pouco sobre Java

657

Comentrios
Como toda linguagem de programao, voc pode fazer comentrios em
seu cdigo-fonte tomando assim uma forma de documentar os cdigos deixados, que poder ser utilizado por outra pessoa, pela equipe de desenvolvimento ou at mesmo por voc, afinal, se voc levar muito tempo para
rever um cdigo desenvolvido, pode ser que voc nem se lembre de como
foi desenvolvido.
O Java aceita trs tipos de comentrios: de linha, representado por
duas barras (lI), o de mltiplas linhas, representado por barra asterisco e
finalizado por asterisco barra (1* *1), e um terceiro que se assemelha ao
comentrio de mltiplas linhas, que tem o propsito de documentar o programa.
1i Esse um comentrio de apenas uma linha
1* Este um comentrio de bloco que
pode ser feito usando mltiplas
linhas. *1
1**Comentrio de documentao
* que pode ser feito em muitas linhas
@author Edson Gonalves
@since 10109 / 2006
*1

Este ltimo comentrio no compilado pelo javac, mas sim por outra aplicao, o javadoc. O javadoc copia os comentrios e compila determinadas tags gerando vrias pginas HTML.
O comentrio de documentao posicionado imediatamente antes
do elemento a ser documentado e tem seu contedo extrado automaticamente pelo utilitrio javadoc fornecido juntamente com o JDK, encontrado dentro do diretrio bin da instalao do JDK.
Como so geradas pginas HTML o desenvolvedor pode adicionar
cdigos HTML na documentao, pois elas sero copiadas e faro o seu

658

[li] Desenvolvendo Aplicaes Web com JSP...

papel no arquivo HTML gerado. O JavaDoc compila somente as tags de


documentao, iniciadas pela arroba "@", para melhorar o visual e padronizar a documentao . Entre as tags de documentao, voc tem as mais
freqentes que so as mostradas na tabela a seguir:

Tabela A.4
Nome

Descrio

@author

Atribui uma classe ou mtodo a um autor

@since

Data da escrita do cdigo

@version

Verso de determinada classe ou mtodo

@see

Indicao de veja mais a respeito

@param

Parmetro de um mtodo

@return

Retorno de um mtodo

@throws

Possveis excees lanadas

@deprecated

Componente deve ser removido nas prximas verses

Operadores
A linguagem Java oferece um conjunto muito amplo relacionado a operadores destinados a realizar operaes aritmticas, lgicas, relacionais ou
de atribuio.

Tabela A.S - Tabela de Operadores Aritmticos


Operadores

Significado

Exemplo

Adio ou sinal positivo

Subtrao ou sinal negativo

a - b ou-a

Multiplicao

a*b

Diviso

a/b

Resto da diviso

a%b

++

Incremento unitrio

++a ou a++

--

Decremento unitrio

--a ou a--

a + b ou +a

Um Pouco sobre Java !ll

659

Tabela A.6 - Tabela de Operadores Relacionais


Operadores

Significado

- -

Igual

Exemplo
a==b

1=

Diferente

a 1= b

>

Maior que

a >b

<

Menor que

a<b

>=

Maior ou igual a

a >= b

<=

Menor ou igual a

a <= b

Tabela A.7 - Tabela de Operadores Lgicos


Operadores

Significado

Exemplo

&&

E lgico (and)

a&& b

II

OU lgico (or)

allb

No (not)

la

o operador de atribuio em Java o sinal de '='.


PALAVRAS CHAVE E IDENTIFICADORES

A linguagem Java possui cinqenta e uma palavras que so classificadas


entre palavras-chave ou palavras reservadas. Estas palavras no podem ser
utilizadas como identificadores em programas Java (identificador uma
palavra utilizada para nomear uma varivel, mtodo, classe ou um label).

Tabela A.8 - Palavras Reservadas


abstract

boolean

break

const

continue

default

do

double else

extends

false

final

finally

float

for

goto

if

implements

impor!

instanceof

int

interface

long

native

new

null

package

private

protected

public

retum

short

static

strictfp

super

throw

throws

transient

true

try

switch

synchronized

this

void

volatile

while

byte

case

catch

char

class

660

Desenvolvendo Aplicaes Web com JSP...

Estruturas de Controle
Em algumas circunstncias, quase que inmeras vezes, voc precisa naturalmente executar instrues de um programa baseado em condies, no
qual podem ser baseados para acessar informaes somente se a condio
for satisfeita ou at mesmo repetir uma determinada quantidade de vezes a
mesma instruo at satisfazer uma condio.
A linguagem Java possui diversas estruturas de controle destinadas ao
controle do fluxo de execuo.
As estruturas de controle de execuo esto divididas em:
~ Estruturas de desvio de fluxo - if...else if...else; switch
~ Estruturas de repetio condicional - for, while, dO ... while
~ Estruturas de controle de erros - try... catch ... finally
~ Mecanismo de modularizao - mtodos

A Estrutura if ... else if. .. else


A conhecida instruo de desvio de fluxo de execuo, o if.. .else if.. .else
permite a seleo entre dois ou mais caminhos distintos em uma execuo,
dependendo sempre do resultado avaliado na estrutura, que retoma verdadeiro ou falso em uma expresso lgica.
EstruturaDeControlelf.java

public class EstruturaDeControlelf


public static void main(String[) args}
if( Integer.parselnt( args[O) }

>

Integer.parselnt( args[l)

} }(

System.out.println("O valor inicial maior que o valor


final") ;
else if( Integer.parselnt( args[O) } < Integer.parselnt(
args [1) } } {
System.out . println("O valor inicial menor que o valor
final"} ;

Um Pouco sobre Java

lI 661

else(
System.out.println("O valor inicial igual ao valor
final") ;

Aps terminar o programa, voc poder compil-lo usando o comando javac:


shell# javac EstruturaDeControlelf.java

E para executar voc utilizar:


shell# java EstruturaDeControlelf 1 2

Esse procedimento o mesmo para os demais exemplos

A Estrutura switch
A estrutura switch aceita uma varivel e a compara com uma lista de constantes, executando uma linha de cdigo (ou um bloco) quando encontrar
uma correspondncia.
muito empregada na avaliao de uma seqncia de testes, como
ocorre com a instruo if...else if...else. Porm, essa estrutura limitada,
pouco usada em um cdigo Java.
Da mesma forma que no exemplo anterior, crie uma nova classe, com
o nome de EstruturaDeControleSwitch e adicione o cdigo mostrado a
seguir em destaque:
EstruturaDeControleSWitch.java
public class EstruturaDeControleSwitch
public static void main(String args[ ])
int valor;

662 I'il Desenvolvendo Aplicaes Web com JSP...


valor = Integer.parselnt( args[Oj );
switch( valor) {
case 1:
case 2: System.out.println("O valor 1 ou 2") ;break;
case 3: System.out.println("O valor 3"); break;
case 4: System.out.println("O valor 4"); break;
default: System.out.println("O valor maior que 4");

Para compilar:
shell# javac EstruturaDeControleSWitch.java

Para executar:
shel1# java EstruturaDeControleSWitch 1

A Estrutura de Repetio For


As estruturas de repetio condicionais, mais conhecidas como loops, so
tambm muito teis no desenvolvimento de sistemas, pois permitem que
um determinado trecho do seu cdigo seja executado diversas vezes, baseados em uma condio.
O loop for composto por trs sees: inicio, onde voc d a ele um
valor inicial para comear a execuo, a condio, onde feito um teste no
qual ele verificar sempre em uma nova repetio, se foi ou no, satisfeita
a condio; e a atualizao (incrementol decremento), onde o loop adicionar ou remover um valor, enquanto a condio no for satisfeita.
Essas sees so opcionais, ou seja, podem ou no ser preenchidas. O
que normalmente no acontece.

Um Pouco sobre Java [\)

663

EstruturaDeControleFor.java

public class EstruturaDeControleFor


public static void main(String args[ ]) {
for (int contar = O; contar < 10; contar++)
System.out.println("O valor da varive l contar : "+contar);

Para compilar:
shell# j avac EstruturaDeControleFor . j ava

Para executar:
shell# j ava EstruturaDeControleFor

O loop While
A estrutura de repetio while no possui uma seo para inicializao e
nem para atualizao. Esse loop apenas testa a expresso lgica e executa
um comando ou bloco de instrues enquanto ela resultar num valor verdadeiro em sua condio. A inicializao e a atualizao da varivel que controla o loop devem ser feitas uma fora do loop e a outra dentro do bloco de
instrues respectivamente.
Crie uma nova classe e a chame de EstruturaDeControleWhile.
EstruturaDeControleWhile.java

public class EstruturaDeControleWhile


public static void main(String args[])
int contador=O;
while(contador<lO) {
System.out.println("O valor da varivel contador :

664 lll Desenvolvendo Aplicaes Web com JSP...


"+contador} ;
contador++;

Da mesma forma que no exemplo do loop for, esse exemplo no possui argumentos. Para compilar:
shell# javac EstruturaDeControleWhile.java

Para executar:
shell# java EstruturaDeControleWhile

O loop dO ... while

o loop do ... while usado

em situaes onde voc precisa executar pelo


menos uma vez mesmo que a condio no seja satisfatria.
Semelhante ao loop while a inicializao e a atualizao da varivel
da expresso de controle so separados. O teste da condio realizado no
fim do loop, aps a execuo do contedo existente no bloco.
EstruturaDeControleDoWhile.java

public class EstruturaDeControleDoWhile


public static void main(String args[]} {
int contador=10;
do{
System.out.println("O valor da varivel contador :
"+contador} ;
contador++;
}while(contador<10};

Um Pouco sobre Java l\l

665

Para compilar:
shell# j avac EstruturaDeControleDoWhile. j ava

Para executar:
shell# j ava EstruturaDeControleDoWhile

A Estrutura try... catch ... finally

Java fornece uma importante estrutura de controle de erros, no qual


gerencia excees. Voc protege o cdigo que contm o mtodo que poderia levantar uma exceo dentro do bloco try.
Caso ocorra a exceo, automaticamente o Java desvia para a clusula catch.
Agora, suponha que exista alguma ao no seu cdigo que seja absolutamente necessria, no importa o que acontea. Isso costuma ser usado
para liberar recursos de memria, fechar um arquivo que foi aberto, por
exemplo. Isso voc faz com a clusula -finally .
Voc pode usar a clusula fiI1ally junto a exceo catch. Mas essa
clusula muito til fora das excees.
EstruturaTryCatch.java

public class

EstruturaTryCatch

public static void rnain(String args[]}


int valor=120;
try{
while(valor>Integer.parselnt(args[O]}} {
Systern.out.println(valor};
valor-

catch(ArraylndexOutOfBoundsException erro} {

666 lI Desenvolvendo Aplicaes Web com JSP...


System. out. println ("Voc no forneceu um argumento")

catch(NumberFormatException erro) {
System . out. println ("Voc no forneceu um numero inteiro")

Quando executar, voc dever passar argumentos. Execute com nenhum argumento ou uma letra para ver a exceo. Para compilar:
shell# javac EstruturaTryCatch.java

Para executar:
shell# java ZstruturaTryCatch a

o formato finally ficaria assim:


try{
l/ diretiva normal

finally{ l/diretiva de erro}

Excees mais Comuns


ArithmeticException - int i = 12 / o
NullPointerException - ocorre quando utilizo um objeto que no foi
instanciado.
NegativeArraySizeException - ocorre quando atribudo um valor nulo
para um array.
ArraylndexOutOffioundsException - ocorre quando tento acessar um
elemento do array que no existe.

Um Pouco sobre Java ll

667

Categorias das Excees


H trs grandes categorias de excees em Java. De fato, a classe
Java.lang.Throwable age como uma classe pai, para que todos os objetos
disparados possam ser pegos nas exceptions.
Deve-se evitar usar a classe Throwable, procure usar uma das trs
classes descritas seguir:
~ Erro - indica um problema srio de recuperao difcil, se no
impossvel;
~ RuntimeException - problema ocorrido durante a implementao;
~ Outra exceo - indica uma dificuldade durante a implementao
que pode acontecer razoavelmente por causa de efeitos ambientais
e pode se manipulado.

Declare ou Manipule a sua Exceo


Na construo de um cdigo em Java, o programador deve prever mtodos
para tratar possveis erros. Existem duas maneiras de o programador satisfazer esta exigncia. A primeira com o uso da declarao try e catch, como
foi visto anteriormente, e a segunda maneira indicando que a exceo no
dirigida para este mtodo, sendo ento jogado para o mtodo chamador.
public void troublesome( ) throws IOException

Mtodos
Um mtodo uma funo que representa um conjunto de aes que um
programa deve executar. Criamos um mtodo quando desejamos que essas
aes sejam reutilizadas em diversas partes do seu programa. Com isso evitamos a repetio de um mesmo conjunto de procedimentos sem necessidade.
DesenvMetodos.java

public class DesenvMetodos


void metodoUm( ){

668 ll Desenvolvendo Aplicaes Web com JSP...


System.out.println("Esse um mtodo sem argumento");

int metodoDois( )(
int valorl=lO,valor2=13;
int total = valorl*valor2;
return total;

double metodoTres(int argl, int arg2) (


double total;
total=(double)argl/(double)arg2;
return total;

public static void main(String[ 1 args) (


DesenvMetodos desM = new DesenvMetodos( );
desM.metodoUm( );
System.out.println(desM.metodoDois( ));
double total=desM.metodoTres(lO,5);
System.out.println(""+total);

Os mtodos sempre so seguidos de seu tipo, int e double por exemplo, podem passar ou no argumentos, podem retomar ou no valores.
O primeiro mtodo, metodoUm, no retoma valor algum, por isso
voc encontra no incio do mtodo a palavra void.
O segundo mtodo, metodoDois, retoma um valor, voc encontra o
tipo do mtodo em seu incio e a palavra return no final do mtodo.
O terceiro mtodo, metodoTres, tambm retoma um valor, mas tambm aceita argumentos, ou seja, voc pode definir novos valores todas as
vezes em que chamar esse mtodo.

Um Pouco sobre Java lI 669

Todo mtodo que no for void deve ter o retorno de um valor,


utilizando a palavra returno Cada mtodo s pode retornar um
valor.

Fundamentos da Orientao a Objetos


Um dos grandes diferenciais da programao orientada a objetos em relao a outras formas de programao que tambm permitem a definio de
estruturas e operaes sobre essas estruturas est no conceito de herana,
mecanismo atravs do qual definies existentes podem ser facilmente estendidas. Juntamente com a herana deve ser enfatizada a importncia do
polimorfismo, que permite selecionar funcionalidades que um programa
ir utilizar de forma dinmica, durante sua execuo .

Classes
A definio de classes e seus inter-relacionamentos o principal resultado
da etapa de projeto de software.
Uma classe um gabarito para a definio de objetos. Atravs da
definio de uma classe, descreve-se que propriedades - ou atributos --o
objeto ter .
Alm da especificao de atributos, a definio de uma classe descreve tambm qual o comportamento de objetos da classe, ou seja, que funcionalidades podem ser aplicadas a obj etos da classe.
Essas funcionalidades so descritas atravs de mtodos, como voc j
viu anteriormente. Um mtodo nada mais que o equivalente a um procedimento ou funo, com a restrio que ele manipula apenas suas variveis
locais e os atributos que foram definidos para a classe.
Uma vez que estejam definidas quais sero as classes que iro compor uma aplicao, assim como qual deve ser sua estrutura interna e comportamento, possvel criar essas classes em Java.
O nome da classe um identificador para a classe, que permite referencila posteriormente, por exemplo, no momento da criao de um objeto.

670

~ Desenvolvendo Aplicaes Web com JSP...

o conjunto de atributos descreve as propriedades da classe. Cada atributo identificado por um nome e tem um tipo associado. Em uma linguagem de programao orientada a objetos, o tipo o nome de uma classe.
Em Java voc tem um grupo de tipos primitivos, como inteiro, real e
caractere, que podem ser usados na descrio de atributos. O atributo pode
ainda ter um valor padro opcional, que especifica um valor inicial para o
atributo.
Os mtodos definem as funcionalidades da classe, ou seja, o que ser
possvel fazer com os objetos dessa classe. Cada mtodo especificado por
uma assinatura, composta por um identificador para o mtodo (o nome do
mtodo), o tipo para o valor de retomo e sua lista de argumentos, sendo
cada argumento identificado por seu tipo e nome.
Atravs do mecanismo de sobrecarga (overloading), dois mtodos de
uma classe podem ter o mesmo nome, desde que suas assinaturas sejam
diferentes. Tal situao no gera conflito pois o compilador capaz de
detectar qual mtodo deve ser escolhido a partir da anlise dos tipos dos
argumentos do mtodo. Nesse caso, diz-se que ocorre a ligao prematura
(early binding) para o mtodo correto.
O modificador de visibilidade pode estar presente tanto para atributos como para mtodos. Em princpio, trs categorias de visibilidade podem ser definidas:
public - nesse caso, o atributo ou mtodo de um objeto dessa classe
pode ser acessado por qualquer outro objeto(visibilidade externa total);
private - o atributo ou mtodo de um objeto dessa classe no pode
ser acessado por nenhum outro objeto(nenhuma visibilidade externa);
protected - o atributo ou mtodo de um objeto dessa classe poder
ser acessado apenas por objetos de classes que sejam derivadas dessa atravs de herana.
A tabela a seguir mostra os modificadores de acesso do Java. A ordem
de declarao dos modificadores no importa.

Um Pouco sobre Java [lil]

671

Tabela A.9
Palavra-chave

Visibilidade
Em uma classe

Em um mtodo

Em um atributo
Acesso total

public

Acesso total

Acesso total

private

No aplicvel

Acesso pela classe

Acesso pela classe

protected

No aplicvel

Acesso pelo pacote

Acesso pelo pacote

default

Somente pacote

Acesso pelo pacote

Acesso pelo pacote

abstract

No instncia

Deve ser sobrescrito

No aplicvel

final

Sem herana

No pode ser sobrescrito

CONSTANTE

static

No aplicvel

Acesso pela classe

Acesso pela classe

native

No aplicvel

Indica cdigo nativo

No aplicvel

transient

No aplicvel

No aplicvel

Cache

synchonized

No aplicvel

Sem acesso simultneo .

No aplicvel

Objetos
Objetos so instncias de classes. atravs deles que quase todo o
processamento ocorre em sistemas implementados com linguagens de programao orientadas a objetos.
Um objeto um elemento que representa, no domnio da soluo,
alguma entidade (abstrata ou concreta) do domnio de interesse do problema sob anlise. Objetos similares so agrupados em classes.
No paradigma de orientao a objetos, tudo pode ser potencialmente
representado como um objeto. Sob o ponto de vista da programao orientada a objetos,um objeto no muito diferente de uma varivel normal. Por
exemplo, quando define-se uma varivel do tipo int em uma linguagem de
programao como C ou Java, essa varivel tem:
~

Um espao em memria para registrar o seu estado(valor);


Um conjunto de operaes que podem ser aplicadas a ela, atravs
dos operadores definidos na linguagem que podem ser aplicados a
valores inteiros.

672 l\I Desenvolvendo Aplicaes Web com JSP...


Da mesma forma, quando se cria um objeto, esse objeto adquire um
espao em memria para armazenar seu estado (os valores de seu conjunto
de atributos, definidos pela classe) e um conjunto de operaes que podem
ser aplicadas ao objeto( o conjunto de mtodos definidos pela classe).
As tcnicas de programao orientada a objetos recomendam que a
estrutura de um objeto e a implementao de seus mtodos devem ser to
privativos como possvel. Normalmente, os atributos de um objeto no
devem ser visveis externamente. Da mesma forma , de um mtodo deve ser
suficiente conhecer apenas sua especificao, sem necessidade de saber
detalhes de como a funcionalidade que ele executa implementada.
Encapsulao o princpio de projeto pelo qual cada componente de
um programa deve agregar toda a informao relevante para sua manipulao como uma unidade (uma cpsula). Aliado ao conceito de ocultamento
de informao, um poderoso mecanismo da programao orientada a
objetos.
OcuItamento da informao o princpio pelo qual cada componente deve manter oculta sob sua guarda uma deciso de projeto nica.
Para a utilizao desse componente, apenas o mnimo necessrio para sua
operao deve ser revelado (tomado assim pblico).
Na orientao a objetos, o uso da encapsulao e ocultamento da informao recomenda que a representao do estado de um objeto deve ser
mantida oculta. Cada objeto deve ser manipulado exclusivamente atravs
dos mtodos pblicos do objeto, dos quais apenas a assinatura deve ser
revelada.
O conjunto de assinaturas dos mtodos pblicos da classe constitui
sua interface operacional.

Herana
O conceito de encapsular estrutura e comportamento em um tipo no
exclusivo da orientao a objetos; particularmente, a programao por tipos abstratos de dados segue esse mesmo conceito. O que toma a orientao a objetos nica o conceito de herana.
Herana um mecanismo que permite que caractersticas comuns a
diversas classes sejam herdadas em uma classe base, ou superclasse. A

Um Pouco sobre Java [)J

673

partir de uma classe base, outras classes podem ser especificadas. Cada
classe derivada ou subclasse apresenta as caractersticas (estrutura e mtodos)
da classe base e acrescenta a elas o que for definido de particularidade .

Polimorfismo
Polimorfismo o princpio pelo qual duas ou mais classes derivadas de
uma mesma superclasse podem invocar mtodos que tm a mesma identificao (assinatura) mas comportamentos distintos, especializados para cada
classe derivada, usando para tanto uma referncia a um objeto do tipo da
superclasse. Esse mecanismo fundamental na programao orientada a
objetos, permitindo definir funcionalidades que operem genericamente com
objetos, abstraindo-se de seus detalhes particulares quando esses no forem necessrios.
Para que o polimorfismo possa ser utilizado, necessrio que os mtodos que estejam sendo definidos nas classes derivadas tenham exatamente a mesma assinatura do mtodo definido na superclasse; nesse caso, est
sendo utilizado o mecanismo de redefinio de mtodos (overriding). Esse
mecanismo de redefinio muito diferente do mecanismo de sobrecarga
de mtodos, onde as listas de argumentos so diferentes.

.. ... ....
.Apndice

Contexto de Desenvolvimento
Web em Java

ARA DESENVOLVER OS EXEMPLOS DAS APLICAES WEB escritas em Java,


voc primeiro precisa criar um contexto de desenvolvimento de sua
aplicao Web, para que tudo funcione perfeitamente.
Crie um diretrio chamado de Site no local que desejar. Para que
voc no tenha dvidas, se voc estiver usando o Windows crie, por exemplo, no drive C. No Linux pode ser criado dentro do diretrio home do seu
usurio. Dentro desse diretrio, crie os demais diretrios como apresentados:
Site/

WEB-INF/
classes/
lib/

Note que dentro do diretrio Site existe o diretrio WEB-INF. No


diretrio WEB-INF, existem dois diretrios, um chamado de classes e outro de lib .

No Diretrio WEB-INF
No diretrio WEB-INF adicione o arquivo web.xml:

676 llI

Desenvolvendo Aplicaes Web com JSP...

web.xml

<?xml version=" 1. O" encoding=" I50-8859-1"?>


<web-app xmlns=''http://java.sun.com/xml/ns/j2ee''
xmlns:xsi=''http://www.w3.org/2001/XML5chema-instance''
xsi: schemaLocation= ''http://java . sun . corn/xml/ns/j 2ee http: / /
java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2 . 4">
<display-narne>Texto mostrado no manager</display-narne>
<description>
Descritor do contexto de desenvolvimento.
</description>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

o arquivo WEB-INF/web.xml o descritor de contexto de uma aplicao web, segundo a especificao Java Servlet/J2EE. As informaes
nele contidas so as configuraes especficas da aplicao .
Instalando uma Aplicao Web em Outro Local
Talvez voc queira criar uma aplicao Web em um caminho diferente do
habitual webapps do Tomcat. Nesse caso, voc dever configurar um arquivo de contexto, contendo o nome da aplicao e o caminho onde se
encontra:

Contexto de Desenvolvimento Web em Java

677

context.xml
<Context path="/Site" docBase="c:\Site"
debug="O">
<!- Link to the user database we will get roles from ->
<ResourceLink narne="users" global="UserDatabase"
type="org. apache . catalina.UserDatabase"/>
</Context>

No atributo docBase voc coloca o caminho fsico da sua aplicao


Web, no Windows, como mostrado a seguir ou no Linux, por exemplo:
docBase="/var/www/Si te".
No URL do navegador, di gite como mostrado a seguir, nos exemplos:

No Windows
http://localhost/manager/deploy?path=/Site&config=file:/C:/Site/
context.xml

No Linux
http://localhost/manager/deploy?path=/Site&config=file:/hame/Site/
context.xml

A mensagem a seguir ser mostrada no navegador, o que indicar que


a aplicao foi configurada com sucesso:
OK - Deployed application at context path /Site

.- - ..

.. ....
Apndice

C
Trabalhando com Datas

M PROBL EMA CO MUM NO DESE NVOLVIM ENTO DE APLI CA ES W EB a


fonnatao de Datas, que pela complexidade da mesma, contm diversas fonnas de trabalho.
Para fonnatar a representao de um objeto Date voc pode utilizar a
classe SimpleDateFormat. Essa classe fornece um conjunto de caracteres
padro para fonnatao do objeto Date. Veja a seguir uma tabela retirada
da documentao do Java onde cada campo de uma data tem uma representao String.

Tabela C.1
Significado

Smbolo

Exemplo

Apresentao

Era

(Text)

AO

ano

(Number)

1996

Ms no ano

(Text & Number)

July & 07

Dia no ms

(Number)

10

Hora em am/pm (1-12)

(Number)

12

Hora em um dia (0-23)

(Number)

minute in hour

(Number)

30

segundos

(Number)

55

milissegundos

(Number)

978

Dia em uma semana

(Text)

Tuesday

680

Desenvolvendo Aplicaes Web com JSP...

Tabela C.1 (continuao)


Smbolo

Significado

Exemplo

Apresentao

Dia em um ano

(Number)

189

Dia da semana no ms

(Number)

2 (2nd Wed in July)

Semana no ano

(Number)

27

Semana no ms

(Number)

am/pm

(Text)

PM

Hora (1-24)

(Number)

24

Hora em am/pm (0-11)

(Number)

time zone

(Text)

Pacific Standard Time

Para melhor entendimento, voc tem a seguir alguns exemplos de


formataes de datas:
dd/MM/yy == 10/09/06
dd/MMM/yyyy == 23/MAV2006
At 3 dgitos voc tem um valor resumido, acima de quatro a representao de strings sem abreviao .
Neste exemplo abaixo voc pode conferir como simples utilizar o
objeto SimpleDateFormat para melhorar a sada dos seus programas Java:

Date hoje == new Date( );


SimpleDateFormat formato == new SimpleDateFormat("dd/MM/yyyy");
System.out.println("A data formatada : "+ formato.format(hoje)) ;
fOlmato == new SimpleDateFormat("EEEE, dd de MMMM de yyyy") ;
System.out.println("Hoje : "+ formato.format(hoje)) ;
A sada da execuo deste programa :
A data de hoje : Suo Sep 1022:56:13 GMT-03:00 2006
A data formatada : 10/0912006
Hoje : Domingo, 10 de Setembro de 2006

Trabalhando com Datas ~

681

A classe SimpleDate pode ser usada para formatar a representao de


um objeto Date para a data do seu usurio.
O trecho de cdigo a seguir apresenta a utilizao dessa classe:
Locale brasil = new Locale ("pt","BR");
DateFormat df= DateFormat.getDatelnstance(DateFormat.LONG, brasil);
System.out.println("Brasil: "+ df.format(hoje));
df= DateFormat.getDatelnstance(DateFormat.LONG, Locale.US);
System.out.println("USA: "+ df.format(hoje));
Aps criar um objeto Locale que representa o Brasil, voc pode instanciar
um objeto DateFormat e utilizar os mtodos para formatao representando a localidade.

.. .. ..
a

Apndice

1.)

OXHTML

HTML uma famlia de mdulos e documentos atuais e futuros que


reproduzem, englobam e ampliam o HTML 4. Os documentos da famlia XHTML so baseados em XML e modemamente tm sido projetados
para trabalhar em conjunto com aplicaes XML de usurios.
XHTML 1.0 (a presente especificao) o primeiro tipo de documento da famlia XHTML. uma reformulao dos trs tipos de documentos
HTML 4 como aplicaes de XML 1.0. Foi concebida para ser uma linguagem de contedos em conformidade com XML e seguindo algumas diretrizes simples ser tambm compatvel com aplicaes de usurios em HTML 4 .

O HTML4
HTML 4 uma aplicao SGML (Standard Generalized Markup Language)
em conformidade com a Intemational Standard ISO 8879, e est mundialmente reconhecida como a linguagem padro para publicao World Wide
Web.
SGML uma linguagem para descrever linguagem de marcao, particularmente aquela linguagem utilizada para troca, gerenciamento e publicao eletrnica de documentos. HTML um exemplo de linguagem
definida em SGML.
SGML tem sido usada, desde os meados dos anos 80 e tem permanecido uma linguagem estvel. Est estabilidade deve-se ao fato de SGML

684

[ljjlJ Desenvolvendo Aplicaes Web com JSP...

ser ao mesmo tempo diversificada e flexvel. Contudo esta flexibilidade


tem seu pro, e o preo est no alto nvel de complexidade da linguagem,
o que tem inibido sua adoo em diversos ambientes, incluindo a a World
Wide Web.
HTML, foi concebida originariamente para ser uma linguagem destinada ao trfego de documentos de carter cientfico e tcnico, adaptada
para ser usada por no especialistas naqueles tipos de documentos. HTML
contorna o problema da complexidade do SGML especificando um pequeno conjunto de tags com caractersticas estruturais e semnticas adaptadas
para gerenciar documentos relativamente simples. Alm de simplificar a
estrutura dos documentos HTML adicionou suporte para HiperTexto. As
facilidades de multimdia foram acrescidas posterionnente.

Uma Introduo Linguagem HTML


HTML (HyperText Markup Language - Linguagem de Fonnatao de
Hipertexto) fruto do "casamento" dos padres HyTime e SGML. ;

HyTime - Hypermedia/Time-based Document


Structuring Language
Hy Time (ISO 10744:1992) - padro para representao estruturada de
hipenndia e infonnao baseada em tempo . Um documento visto como
um conjunto de eventos concorrentes dependentes de tempo (udio, vdeo,
etc.), conectados por webs ou hiperlinks.
O padro HyTime independente dos padres de processamento de
texto em geral. Ele fornece a base para a construo de sistemas hipertexto
padronizados, consistindo de documentos que alocam os padres de maneira particular

SGML - Standard Generalized Markup Language


Padro ISO 8879 de fonnatao de textos: no foi desenvolvido para
hipertexto, mas toma-se conveniente para transfonnar documentos em hiperobjetos e para descrever as ligaes.

o XHTML

685

SGML no padro aplicado de maneira padronizada: todos os produtos SGML tm seu prprio sistema para traduzir as etiquetas para um
particular formatador de texto.
DTD - Document Type Definition - define as regras de formatao
para uma dada classe de documentos. Um DTD ou uma referncia para um
DTD deve estar contido em qualquer documento conforme o padro SGML.
Portanto, HTML definido segundo um DTD de SGML.

Como so as Marcaes HTM L?


As marcaes do HTML - tags - consistem do sinal ), (o smbolo de "menor que"), seguida pelo nome da marcao e fechada por ( ("maior que").
De um modo geral, as tags aparecem em pares, por exemplo, <h1>
Cabealho</h 1>. O smbolo que termina uma determinada marcao igual
quele que a inicia, antecedido por uma barra (I) e precedido pelo texto
referente.
No exemplo, a tag <h1> avisa ao cliente Web para iniciar a formatao
do primeiro nvel de cabealho e </h1> avisa que o cabealho acabou.
H excees a esse funcionamento em pares das marcaes. A tag que
indica quebra de linha - <br I> - tambm no precisa de uma correspondente, e outras tais como <hr I> por exemplo .

Documento Bsico e seus Componentes


A estrutura de um documento HTML apresenta os seguintes componentes:
<htm1>
<head><title>Titulo do Documento </title></head>
<body>
texto,
imagem,

links,
</body>
</html>

686

Desenvolvendo Aplicaes Web com JSP...

As tags HTML no so sensveis letras maisculas e minsculas


(case sensitive). Traduzindo: tanto faz escrever <htrnL>, <Htrnl>, <htrnl>,
<HtMI>, ...
Mas por conveno, o HTML sempre dever ser escrito em minsculo, isso devido ao novo modelo XHTML.
Os documentos se dividem em duas sees principais: <head /> e
<body I>.

A tag <head I>


A tag <head /> contm informaes sobre o documento; a tag <title I>, por
exemplo, define um ttulo, que mostrado no alto da janela do browser.
Nesta pgina, por exemplo, est definido assim:
<head>
<title>Exempl o de documento em HTML</title>
</head>

Todo documento WWW deve ter um ttulo; esse ttulo referenciado


em buscas pela rede, dando uma identidade ao documento.

A tag <body I>


Tudo que estiver contido na tag <body /> ser mostrado na janela principal
do browser, sendo apresentado ao leitor. A tag <body /> pode conter cabealhos, pargrafos, listas, tabelas, links para outros documentos, e imagens.

Quebra de Linha
Quando voc quer mudar de linha, usamos a tag <br I>. Isso s necessrio se voc precisar de uma quebra de linha em determinado ponto, pois os
browsers j quebram as linhas automaticamente para apresentar os textos.
Com sucessivas tags <br /> podemos inserir diversas linhas em branco nos documentos.

o XHTML

687

Pargrafos
Voc pode criar pargrafos usando a tag <p />. Um pargrafo se distingue
de uma quebra de linha por pular uma linha, deixando-a em branco.

Formatao de Textos
Existem diversas tags HTML que voc pode usar para formatar textos existentes em sua pgina.
Veja algumas dessas tags logo a seguir:

Formatando em Negrito
A tag de negrito representada por <strong I>. Assim, se voc precisar
colocar uma palavra ou um trecho de texto em destaque, voc far a seguinte forma:
<strong> Esse texto est em negrito </strong>

FORMATANDO EM ITLICO

A tag de itlico representada por <em I>. Assim, se voc precisar colocar
uma palavra ou um trecho de texto em destaque, como no caso do negrito,
voc far a seguinte forma:
<em> Esse texto est em itlico </em>

Ligando um Documento com Links


A tag anchor <a /> a responsvel por ligaes de hipertexto entre uma
pgina e outra. Para criar um link voc dever fazer da seguinte forma:
<a href=lnome_daJ)agina.jsp">Esse um eXeIll>lo de link</a>

688 l\I Desenvolvendo Aplicaes Web com JSP...

Tabelas
As tabelas so representadas pela tag <table /> e tem como sua funcionalidade principal organizar informaes em uma pgina.
muito usada para organizar objetos de formulrio em pginas HTML.
Sua sintaxe :
<table border="l">
<tr>
<th>Clula de Cabealho l</th><th>Clula de Cabealho 2</th>
<I tr>
<tr>
<td>Clula l< / td><td>Clula 2</td>
<I tr>
</ table>

As tags que criam linhas so representadas por <tr I>. J as colunas


ou divises so representadas pelas tags <td I>.
As tags que representam colunas de cabealho so representadas por
<th I> .

Formulrios
Os formulrios so usados para transmitir dados, sejam apenas textos ou
tambm, arquivos em geral.
As tags de formulrio so definidas por <form I>.
<forrn method="post" action="pagina-para_recbimento.jsp">
<label for="nome">Nome:</label>
<input type="text" name="nome" id="nome" / >
<input type="submit" name="btEnviar"
id="btEnviar" value="Enviar" />
</forrn>

o XHTML

689

A tag <form /> contm alguns atributos, como no caso method que
representa a forma de envio dos dados, sejam POST ou GET.
O atributo action define o local para onde voc enviar os dados do
formulrio.
Um formulrio pode ser formado de diversas outras tags, onde cada
uma representa uma forma de transmitir informaes.
OUTROS ATRIBUTOS DA TAG <FORM

/>

A tag < form /> tambm pode apresentar um outro atributo:


ENCTYPE

Indica o tipo de codificao dos dados enviados atravs do formulrio . O


tipo default application/x-www-form-urlencoded .
Caso seja necessrio enviar arquivos, voc deve definir a codificao
multipart/form-data.
<form acti on= "recebe .jsp " method=" post"
enctype="multipart / f orm-data" name="forml" id="forml" >
</ f orm>

Entrando com Dados


Os formulrios podem conter qualquer tipo de formatao. Como padro
colocamos tabelas dentro da marcao de formulrios para organizar seus
campos. Dentro da marcao da tag <form /> voc pode colocar tags de
campos de entrada e botes, onde as tags mais comuns so: <input I>,
<select I>, <textarea /> e <label I>.
Todos os campos de entrada de dados tm um atributo chamado name
, ao qual associamos um nome, utilizado posteriormente por um script,
tanto no lado cliente, para validao de dados, como por exemplo o
JavaScript como no lado servidor, que ser o responsvel por captar as
informaes adicionadas e depois trat-las.

690

[Iil] Desenvolvendo Aplicaes Web com JSP...

TAGS Responsveis por Entrada e Envio de Dados


INPUT
A tag <input /> tem um atributo principal chamado type, ao qual atribumos
seis valores diferentes que geram seis tipos diferentes de entrada de dados.
CAMPOS DE ENTRADA DE TEXTO

o mais comum dos tipos de entrada de dados o text.


<forrn action="recebe.jsp" method="post">
Nome: <input type ="text" name = "nome" />
</ forrn>

CAMPO DE DADOS SENHA

Entrada de texto onde os caracteres so mascarados, impedindo a sua


visualizao real na tela, disfarando geralmente com asteriscos ou bolinhas (XP Theme)
<forrn action="login. jsp" method="post">
Login: <input type="text" name="login" /><br />
Senha: <input type="password" name="senha" />
</forrn>

Outros Atributos

VALUE
Pode ser usado para dar um valor inicial a um campo de tipo texto ou
senha. Desse modo, se o usurio no preencher este campo, ser adotado
este valor padro.
Login: <input type="text" name="login" value="aprendarapido" />

o XHTML

691

SIZE
Especifica o tamanho visual para o campo do formulrio. S vlido para
campos text e password . O valor padro Z.O.
<forro action="login.jsp" method="post">
Login: <input type="text" name="login" size="15" /><br />
Senha: <input type="password" name="senha" size="15 n />
</forro>

MAXLENGHT
Nmero de caracteres mximo aceito em um campo de dados. Este atributo s vlido para campos de entrada text e password.
<forro action="cadastro.jsp" method="post">
e-mail: <input type="text" name="email"
size="35" maxlenght ="lOO" />
<br />
UF: <input type="text" name="uf" size="5" maxlenght="2" />
</forro>

NAME
Assim como type um atributo chave. Como j dito anteriormente, esse
atributo usado por scripts para recepo de dados ou para validao.
importante salientar que nesse atributo voc no pode colocar caracteres
especiais nem acentos.

ID
Assim como em outros elementos HTML, o atributo id muito importante
nas especificaes do XHTML. Tambm possui uma ligao fundamental
com a tag <label /> que ser vista posteriormente.

692

Desenvolvendo Aplicaes Web com JSP...

Caixas de Checagem (Checkbox)

CHECKBOX
Insere um boto de escolha de opes. Pode ser escolhida mais de uma
alternativa.
<forrn action="musicas.jsp" method="post" name="forrnl">
Selecione os estilos de msica que mais gosta:<br />
<input type="checkbox" name="rock" />ROCK <br />
<input type="checkbox " name="pop" /> POP <br />
<input type="checkbox" name="dance" /> DANCE <br />
</forrn>

Botes de Rdio

RADIO
Insere um boto de rdio, onde voc tem vrias opes mas somente uma
alternativa entre elas pode ser escolhida.
<forrn action="cadastro.jsp" method="post" name="forrnl">
<input type="radio" name="sexo" value="masculino" />Masculino
<br />
<input type="radio" name="sexo" value="feminino" /> Feminino
</forrn>

Note que o atributo name o mesmo nas duas opes. Isso ocorre porque,
se os nomes fossem diferentes, voc poderia marcar mais de uma opo. O
que difere um boto de rdio do outro o atributo value.

CHECKED
Atributo comum entre os dois ltimos tipos acima, colocando essa opo,
a caixa de checagem ou boto de rdio fica marcado por padro.
<input name="sexo" type="radio" value="masculino" checked="checked" />

o XHTML

693

Botes de Ao
SUBMIT

o boto tem o comportamento de enviar dados (submeter) ao servidor.


<form action="login.jsp" rnethod="post">
Login: <input type="text" narne="login" size="15" /><br />
Senha: <input type="password" narne="senha" size="15" /><br />
<input type="subrnit" narne="enviar" value="Entrar" />
</form>

o atributo value nesse caso tem o comportamento de rtulo no boto .


RESET
Restaura os valores iniciais dos campos existentes no formulrio, limpado
qualquer entrada que voc tenha feito ou selecionado.
<form action="login.jsp" rnethod="post">
Login: <input type="text" narne="login" size="15" /><br />
Senha: <input type="password" narne="senha" size="15" /><br />
<input type="subrnit" narne="enviar" value="Entrar" />
<input type="reset" narne="lirnpar" value="Lirnpar" />
</form>

BUTTON
Boto sem ao padro alguma. Muito usado pelos desenvolvedores para
chamada de scripts que rodam do lado cliente, como o JavaScript.
<form action="login.jsp" rnethod="post">
<input type="button" value="Charna script" onclick= " enviar ( )" />
</form>

694

fIiilJ Desenvolvendo Aplicaes Web com JSP...

IMAGE
Boto que contm as caractersticas de envio semelhante ao SUBMIT mas
que no lugar de um boto comum voc tem uma imagem inserida.
<forro action="login.jsp" method="post">
<input type="image" name="enviar" src="imagem.gif" />
</forro>

Caixas de Seleo
Comuns em programas desktop, as caixas de seleo servem, assim como
os botes de rdio, para restringir as opes do usurio escolhendo uma
entre as opes.
<forro action="cadastro.jsp" method="post">
Estado:
<select name = "estado" >
<option value="SP" >So Paulo</option>
<option value="RJ">R:o de Janeiro< /opt ion>
<option value="MG">Minas Gerais</option>
<option value="Q" selected="selected">
Selecione o Estado
</option>
</select>
</forro>

As caixas de seleo contm mltiplas opes geradas com a tag


<option /> e os valores (VALUE) so atribudos nessa TAG.

SELECTED
Atribu to que seleciona uma opo como padro, similar ao checked das
tags <checkbox /> e <radio I>.

o XHTML

lll 695

SIZE
Atributo que amplia a quantidade de opes visveis no campo:
<forro action="cadastro.jsp" method="post">
Estado:
<select name= "estado" size="4" >
<option value="SP">So Paulo</option>
<option value="RJ">Rio de Janeiro</option>
<option value="MG">Minas Gerais</option>
<option value="Q" selected="selected">
Selecione o Estado
</option>
</select>
</forro>

Nesse caso, os quatro itens da caixa sero mostrados.

MULTIPLE
Com esse atributo, a caixa de seleo passa a ter a capacidade de poder ter
mltiplas selees, que podero ser feitas com a tecla SHIFT pressionada
para uma seleo uniforme ou com a tecla CTRL para uma seleo aleatria.
<forro action="cadastro .jsp" method="post">
Estado:
<select name= "estado" size="4" lIIUltiple="lIIUltiple" >
<option value="SP">So Paulo< /opt ion>
<option value="RJ">Rio de Janeiro</option>
<option value="MG">Minas Gerais</option>
<option value="Q" selected="selected">
Selecione o Estado
</option>
</select>
</forro>

696

Desenvolvendo Aplicaes Web com JSP...

Agrupando Opes
<optgroup / >

elemento <optgroup /> serve para criar grupos de opes, dentro de


uma lista select, formando listas hierrquicas. O texto exibido pelo optgroup
apenas um rtulo (gerado pelo atributo LA BEL) e no pode ser selecionado, ou seja, no uma opo vlida da lista.
<form action="cadastro.jsp" method="post">
Estado :
<select name= "estado" size="4" multiple="multiple" >
<optgroup label=" SUDESTE" >
<option value="SP">So Paulo</option>
<option value="RJ">Rio de Jane iro</option>
<option value="MG ">Minas Gerai s</option>
<opt i on value="O" selected="sel ec t ed">
Selecione o Estado
</ option>
</optgroup>
</ select>
</ form>

reas de Texto
<textarea / >

Uma rea para entrada de texto, utilizada para grande quantidade de informaes.
<form act i on="cadastro. j sp" method="post ">
<textar ea co l s="40" r ows="5 " name="comentario">
Co l oque aqui seu coment ri o
</ textar ea>
</ form>

o XHTML ll 697
COlS

o atributo COLS

detennina a quantidade de caracteres na horizontal que

sero exibidos.

ROWS
Com esse atributo voc tem a quantidade de linhas que sero exibidas.

WRAP

o atributo WRAP define se a mudana de linha ser automtica durante a


digitao ("on"), ou somente quando for pressionado ENTE R ("off').
O parmetro WRAP pode assumir tambm uma das seguintes opes:
VIRTUAL - o texto digitado sofre o efeito na tela de quebra de linha,
porm o texto enviado numa nica linha;
PHYSICAL - o texto digitado sofre o efeito na tela de quebra de linha, e tambm o texto enviado com as quebras de linha;

Rtulos
<label />

Utilizado como rtulo de uma caixa de entrada, boto de checagem


ou de seleo, tem como principal caracterstica possibilitar o usurio de
clicar em seu rtulo e esse por sua vez jogar o foco na caixa de texto ou
marcar uma opo.
<fonn action="cadastro . jsp" method="post" narne="fonnl">
<input type="radio" narne="sexo" value="masculino" id="m" />
<label for="m">Masculino </label><br />
<input type="radio" narne="sexo" value="feminino" id="f" />
<label for="f">Feminino</label> <br />
</fonn>

698

Desenvolvendo Aplicaes Web com JSP...

No caso acima, clicando no rtulo, por exemplo em Masculino, a tag


<Ia bel /> localizar o atributo ID com o valor m, e o selecionar .

Campo Oculto
HIOOEN
Existem campos que, de certa forma, voc quer passar valores, mas no
quer que o usurio final no os veja. Isso muito comum no uso de programao servidora e voc aprender nos cursos de PHP, ASP ou JSP.
<form action="l ogin.jsp" method="post">
Login: <inpu t type="text" name="login" size="15" I><br I>
Senha: <input type="password" name="senha" size="15" I><br I>
<input type=" hidden" name="oculto"
value="valor oculto ao usurio na pgina" I>
<input type=" submit" name="enviar" value="Entrar" I>

</ form>

Campo de Arquivos
FILE

o campo FILE transporta arquivos para o servidor, o chamado UPLOAD.


O atributo enctype="multipartlform-data" deve ser definido na declarao
do formulrio.
<form action="recebe_arquivo.jsp" method="post"
enctype="multipart / form-data" name="forml" id="forml">
<input name= " arquivo " type="file" id="arquivo" I>
</ form>

o XHTML

[)jI]

699

Botes de Formulrio Especiais


Eu os chamo de especiais por conter caractersticas inovadoras e interessantes introduzidas no HTML. importante salientar que nem todos os
browsers podem suportar todos, mas que os principais e atuais o suportam.

BUTTON
Existem trs tipos de botes: SUBMIT, RESET e BUTTON:
<fonn action="login.jsp" method="post">
<button type="submit" name="enviar" value="Enviar">
<img src="enviar .gif" /> Enviar
</button>
</fonn>

o boto acima aparece com uma imagem e um rtulo escrito Enviar.


Seu comportamento similar ao boto do SUBMIT visto anteriormente.
Abaixo voc tem o RESET e o BUTTON, que possuem as mesmas caractersticas vistas anteriormente nos controles INPUT.
<fonn action=" login. j sp" method="post">
<button type="reset " name="limpar" value="Limpar">
Limpar
</button>
<button type="button" name="nada" value="Nada">
Nada
</button>
</fonn>

700

[liJ Desenvolvendo Aplicaes Web com JSP...

Somente Leitura e Desabilitado


READONLV
Esse atributo toma o campo somente leitura em seu contedo.
<form action="cadastro.jsp" method="post">
e-mail: <input type="text" narne="ernail"
size="35" readonly="readonly"
value="aprendarapido@aprendarapido.com.br" />
</form>

DISABLED
Esse atributo desabilita um campo, no podendo nem sequer selecionar seu
contedo.
<form action="cadastro . jsp" method="post">
e-mail: <input type="text" narne="email" size="35"
disabled="disabled"
value="aprendarapido@aprendarapido.com.br" />
</form>

FIELDSET
Um rtu lo especia l, que envolve um conjunto de campos, geralmente usados para agrupar certos pontos do formulrio ou botes de rdio ou de
checagem. Um ttulo aparece na parte superior e uma linha envolve a rea.
<form ac tion="musicas.jsp" method="post" narne="forml">
<fieldset style="width: 50%;">
<legend title="Qual msica voc mais gosta">
Qual msica voc mais gosta
</legend>
<input type="checkbox' narne="rock" id="rock" />

o XHTML

701

<label for="rock">ROCK <!1abel><br />


<input type="checkbox" name="pop" id="pop" />
<label for="pop">POP<!1abel> <br />
<input type="checkbox" name="dance" id="dance" />
<label for="dance">DANCE< /label>
</fieldset>
</fonn>

Tecla de Acesso
ACCESSKEY

o atributo accesskey associa uma tecla de acesso a um elemento. Uma


tecla de acesso deve ser um nico caractere. Quando a tecla de acesso
ativada (no Windows, combinada com ALT), o controle correspondente
recebe o foco. Os seguintes elementos suportam o atributo accesskey: button,
input, label, legend e textarea, alm dos elementos HTML.
<fonn action="enviar.jsp" method="post">
e-mail: <input type="text" name="email" size="35" accesskey="m" />
</fonn>

No caso acima, voc pode colocar o foco no componente apenas pressionando a tecla ALT em conjunto com a tecla m .

As Diferenas entre o HTML 4 e o XHTML


REQUISITOS DE CONFORMIDADES PARA DOCUMENTOS

Esta verso da XHTML define as conformidades de documentos em modo


XHTML 1.0 "strict", os quais esto restritos a elementos e atributos XML
e XHTML 1.0 namespaces. 3.1.1. Requisitos de conformidades para documentos no modo "strict"
Um documento "strict" conforme com XHTML um documento XML
que atende somente as facilidades descritas como mandatrias nesta

702 lI Desenvolvendo Aplicaes Web com JSP...


especificao. Documentos nestas condies devem satisfazer os seguintes
critrios:
1. Estar conforme com as declaraes contidas em uma das trs DTDs
2. O elemento raiz do documento deve ser html.
3. O elemento raiz do documento deve conter uma declarao xmlns
para o namespace em XHTML . O namespace em XHTML definido como: http://www.w3.org/1999/xhtml. Abaixo, um exemplo
de elemento raiz:
<html xmlns=''http:/ / www.w3.org/1999/xhtml'' xml:lang="en" lang="en">

4. Deve haver no documento, uma declarao OOCTYPE que precede o elemento raiz do documento. A declarao de identificador
pblico contida no DOCTYPE deve referenciar-se a uma das trs
OTDs encontradas em DTDs atravs do uso do respectivo Formal
Public Identifier (Identificador Pblico Formal). O sistema
identificador adaptar-se- s caractersticas do sistema local.
< !OOCTYPE html
PUBLIC "- I IW3C I l OTO XHTML 1. O Strict! IEN"
''http: //www.w3.org / TR/ xhtml1 / OTO/xhtml1-strict.dtd''>
<!OOCTYPE html
PUBLIC "- I IW3C I l OTO XHTML 1. O Transitional//EN"
''http: //www.w3.org / TR/ xhtml1 / OTO/ xhtml1-transitional.dtd''>
< !OOCTYPE html
PUBLIC "- I IW3C I l OTO XHTML 1. O Frameset! IEN"
''http: // www.w3.org / TR/ xhtml1/OTO/ xhtml1-frameset.dtd''>

5. O subconjunto das DTD no deve ser usado para sobrescrever


entidades parmetros nas DTO.
Uma declarao XML no requerida em todo documento XML, contudo
recomenda-se que os autores de documentos XHTML usem a declarao

o XHTML

703

XML nos seus documentos. Tal declarao requerida quando a codificao


de caracteres do documento for outra que no a codificao default UTF-8
ou UTF-16 e nenhuma codificao for determinada por um protocolo de
nvel superior.

Diferenas para o HTML 4


ESTA SEO INFOR MATIVA

Dado ao fato de que XHTML uma aplicao XML, certas prticas que
so legais em HTML 4 baseado em SGML [HTML4] devem ser modificadas.

Os Documentos devem ser bem Formados


Bem formado um conceito novo introduzido por [XML]. Em essncia,
isto significa que todos os elementos devem ter suas tags de fechamento ou
serem escritos com uma sintaxe especial ( descrita adiante) e ainda, que
todos os elementos devem estar convenientemente aninhados.
Embora "overlapping" seja ilegal em SGML, amplamente tolerado
pelos navegadores em uso.
CORRETO: elementos aninhados.
<p>aqui, um pargrafo em <em>negrito< / em>.< / p>

INCORRETO: elementos em "overlapping"


<p>aqui, um pargrafo em<em>negrito.< / p>< / em>

Elementos e Nomes de Atributos devem ser em


Letras Minsculas
Documentos XHTML devem usar minsculas para todos os elementos do
HTML, bem como para nomes de atributos. Esta diferena necessria
porque XML case-sensitive (sensvel a caracteres maisculos e minscu-

704 lI Desenvolvendo Aplicaes Web com JSP...


los). Por exemplo, <li> e <LI> so tags diferentes. Isso no decorrer do
curso deve ser observado e que foram colocados os elementos, bem como
atributos, em maisculo para melhor assimilao do cdigo e contedo,
mas que devem seguir as especificaes normativas .

O USO de Tags de Fechamento Obrigatrio


Em SGML - HTML 4 permitido para determinados elementos, omitir-se
a tag de fechamento. XML no permite omisso de qualquer tag de fechamento . Todos os elementos excetuados aqueles vazios declarados nas DTD,
tem que ter tag de fechamento. Os elementos vazios declarados nas DTD
podem ter tag de fechamento ou usar uma abreviao para elemento vazio .
[LEMENTOS VAZIOS

Elementos vazios devem ter uma tag de fechamento ou a tag de abertura


deve terminar com I>. Como exemplo: <br /> ou <hr I>.
CORRETO: Elementos vazios com terminao
<br /><hr />

INCORRETO: Elementos vazios sem terminao


<br><hr>

Os Valores de Atributos devem Estar entre


Aspas
Todos os valores de atributo devem ser declarados entre aspas, mesmo aqueles valores com caracteres numricos.
<td rowspan=" 3" >

o XHTML

705

A SINTAXE PARA ATRIBUTOS DEVE SER ESCRITA POR COMPLETO

XML no suporta abreviaes na sintaxe para atributos. Valores de atributos devem ser escritos por completo. Nomes de atributos tais como readonly
e checked no podem ocorrer em elementos sem que seus respectivos valores sejam declarados.
<input name="rock" type= " checkbox " id="rock" checked="checked" />

ELEMENTOS VAZIOS

Inclua um espao antes de / > (barra-sinal de maior) nos elementos vazios.


Por exemplo, <br I>, <hr /> e <img src="imagem.jpg" alt="Minha Imagem" I>. Use a sintaxe de tag simplificada para elementos vazios.

.. ..a a..
Apndice

E
o MySQL

YSQL 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.

.'

Vl
RI

f\~ A propsito, parte "AS" do nome da companhia o acrnimo


vt 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 AS. Elas esto
localizadas nos EUA e Alemanha, respectivamente.

708 llI Desenvolvendo Aplicaes Web com JSP...

O que um Banco de Dados Relacional?


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:
PARA INICIAR O SERViO:
net start mysql

o MySQL [\] 709


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.rprn - para instalar o servidor mysqld
rio Linux
MySQL-client-[verso ].i386.rprn - 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:
Shel l> r pm - i vh MySQL-server-5.0 .1 . i3 86.rpm MySQL- client 5. 0. 1.i3 86.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/./rnysql start - para iniciar o servidor MySQL
Shell>/etc/init.d/./rnysql stop - para parar o servidor MySQL

Acessando o Banco de Dados MySQL


No

WINDOWS

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

710

[)jlJ Desenvolvendo Aplicaes Web com JSP...

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 r oo t -p

Tecle ENTER e receber o pedido de senha:


password

Digite a senha que voc configurou na instalao e tecle ENTER novamente.

~
~

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.

No Linux
Se voc utilizou a instalao binria, em rpm (recomendado), basta abrir o
terminal e digitar a seqncia:
shell>mysql -u r oo t -p

Se j estiver logado como root, no seu sistema operacional, no h


necessidade de colocar o -u root -p depois do comando mysql.

Os Comandos CREATE e DROP


Quando pensar nos comandos CREATE e DROP, voc deve imaginar
equipamentos de terraplanagem, caminhes basculantes e guindastes, porque so ferramentas que voc utiliza para criar o seu banco de dados. Esses
comandos, embora raramente utilizados, so os mais importantes.

o MySQL

llI 711

O Comando CREATE
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

livraria;

Note que no foi utilizado acentuao e em casos de palavras compostas no insira espaos, se for o caso insira sublinhado" _ " .

O Comando USE
Depois de confirmado a criao do banco de dados, voc dever utilizar o
comando USE para utilizar o banco de dados livraria.
USE livraria;

Um ponto importante que o MySQL no toma ativo o banco de


dados que voc criou, isso deve ser implcito.

O Comando DROP

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.

712

(1il] Desenvolvendo Aplicaes Web com JSP...

s ir at o prompt de comando e no monitor do MySQL e digitar:


mysql> DROP DATABASE livraria;

Isso excluir o banco de dados veculos e tudo o que estiver nele .

Criando Tabelas
Criar tabela no MySQL uma tarefa relativamente fcil. Para se criar uma
tabela basta usar a seqncia:
shell>mysql -u root

Aps estar no monitor do MySQL digite a seguinte seqncia:


mysql> CREATE DATABASE livraria;
mysql> USE livraria;
mysql> CREATE TABLE autores(
-> autor_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_ INCREMENT,
->

nome VARCHAR(lOO),

-> email VARCHAR(lOO) ,


->

dt_nasc DATE);

O Comando SHOW
Assim que criada sua primeira tabela. Para ver o resultado digite a seqncia:

SHOW TABLES FROM

LIVRARIA;

Para ver as colunas que existem na sua tabela digite:


SHOW COLUMNS FROM livros;
Ou DESCRIBE.

o MySQL [il]

713

O Comando OESCRIBE
Se preferir, o comando DESCRIBE faz a mesma coisa que SHOW, mostrando as colunas existentes em sua tabela.

DESCRIBE livros;
Ou simplesmente:

DESC livros;

IF NOT EXISTS
Uma maneira de se ter certeza de se no est criando uma tabela novamente fazer o comando IF NOT EXISTS:
mysql> CREATE TABLE IF NOT EXISTS livros(
- > isbn CHAR(13) NOT NULL PRlMARY KEY,
->

titulo VARCHAR(SO) ,

->

edicao_num TINYINT(2) ,

->

ano-publicacao YEAR,

->

descricao

TEXT)i

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:

Alterando o Nome da Coluna


Usando a clusula CHANGE voc pode alterar o nome da coluna da sua
tabela:

ALTER TABLE livros CHANGE titulo titulo do livro


VARCHAR(50);

714 lll Desenvolvendo Aplicaes Web com JSP...

Alterando o Tipo de Coluna

o tipo pode ser alterado usando a clusula MODIFY:


ALTER TABLE livros
MODIFY titulo_do_livro VARCHAR(30) NOT NULL;

Renomeando uma Tabela


Renomear o nome de uma tabela, tambm se usa ALTER TABLE, mas
com a clusula RENAME:
ALTER TABLE livros RENAME Iivros2;

Excluindo I Adicionando Colunas e Tabelas


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.

Eliminando Tabelas e Colunas

o comando

DROP tambm utilizado para eliminar as colunas de uma

tabela.
Para excluir uma tabela existente execute a seguinte seqncia:
DROP TABLE Iivros2;
Para excluir somente uma coluna execute a seguinte seqncia:
ALTER TABLE Iivros2 DROP editora_id;
Isso excluir a coluna e todas as informaes que voc armazenou .

Adicionando Colunas

o comando ADD o responsvel pela insero de uma nova coluna.


ALTER TABLE livros2 ADD editoraJd INT; #Onde ADD adicionar

o MySQL

lI 715

Adicionando Colunas Aps uma Outra


Determinada

o comando AFTER adiciona a nova coluna na tabela aps o nome mencionado.


ALTER TABLE Iivros2 ADD editora_id INT AFTER edicao_num;

Utilizando ndices
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.

Decidindo quais Colunas Incluir no ndice


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.

Criando um ndice
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 livros ADD INDEX idx_tituloJtitulo);

716 riI Desenvolvendo Aplicaes Web com JSP...

Excluindo ndices
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;

~
'/Ioftl

Se voc estiver usando uma coluna com AUTO_INCREMENT,


voc. ~o excluir a chave primria enquanto no retirar esse
modificador.

Tipos de Tabelas
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 t es t e (
i d I NT NOT NULL,

nome VARCHAR (3 O) NOT NULL,


PRI MARY KEY (i d)
ENGINE =My I SAM ;

No comando criado, o tipo da tabela, indicado em TYPE=MyISAM,


significa que voc est criando uma tabela com o tipo MyISAM, que o

o MySQL [IilJ

717

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):

O Tipo MylSAM
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 .

O Tipo InnoDB
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:

718

~ Desenvolvendo Aplicaes Web com JSP...


~

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 .

Alterando o Tipo de uma Tabela


Com o comando ALTER TABLE no possvel alterar o tipo da tabela,
por isso, voc pode alterar da seguinte maneira:
ALTER TABLE livros ENGINE=INNODB;

Tipo de Dados
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 qualquer
uma das outras categorias.

o MySQL

llI 719

Tipos Numricos
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 1aO?
Lembre-se: voc s deve pagar pelo que vai usar.
Tabela E.1 - Armazenamento Numrico
Espao na memria

Nome do tipo

TINYINT
SMALLlNT
MEDIUMINT
INT
BIGINT

1 byte
2 bytes
3 bytes
4 bytes
8 bytes
4 bytes
8 bytes
O valor de b es 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 O a 255. Declarando
dessa forma voc faz com que essa coluna tenha somente valores positivos.
Tabela E.2 -Tipos Numricos
Nome do tipo

_.

Sem sinal

Intervalo de valor

TINYINT

-128 a 127

0 - 255

SMALLlNT

-32768 a 32767

0-65535

MEDIUMINT

-8388608 a 83888607

0-16777215

INT

-2147483648 a 2147483647

o- 4294967295

BIGINT

-9223372036854775808 a
9223372036854775807

0-18446744073709550615

FLOAT(lnteiro,Decimal)

Varia dependendo dos valores

DOUBLE(lnteiro,Decimal)

Varia dependendo dos valores

DECIMAL(lnteiro,Decimal)

Varia dependendo dos valores

.~.

. --

-'

.&.

_.

720

[IiiI] Desenvolvendo Aplicaes Web com JSP...

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.

Modificadores AUTO_INCREMENT, UNSIGNED e


ZEROFILL
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.

o MySQL

721

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);

Tipos de Caractere ou de Dados de String

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.o 255 . Qualquer
valor pode ser armazenado em um tipo de dados de string.
Tabela E.3 - Tipos String
Nome de tipo
CHAR(X)

Tamanho mximo
255 bytes

Espao de armazenamento
X bytes

VARCHAR(X)

255 bytes

X + 1 byte

TI NYTEXT

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

CHAR

e VARCHAR

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

722

(liIJ Desenvolvendo Aplicaes Web com JSP...

MySQL preenche esse valor para ajustar o tamanho que foi declarado. O
tipo VARCHAR faz o contrrio. Se voc declara um VARCHAR(lO) 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.

TEXTe BlOB
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.

- - . TIpOs Variados--_________ _________


H basicamente trs tipos variados; os tipos ENUM, SET e DATE/ TIME .

Tipo ENUM
O tipo ENUM uma lista ENUMerada. Significa que essa coluna pode
armazenar apenas um dos valores que esto declarados na lista dada.

o MySQL ['ijl]

723

Voc pode ter at 65.535 itens em sua lista enumerada. uma boa
escolha para caixas de combinao.

Tipo SET

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.

Tipos de Data e Hora (DATElTIME)


O MySQL suporta vrios tipos de data e hora. Esses so mostrados na tabela a seguir:
Tabela E.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


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[(214)]

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.

como

Modificadores Adicionais de Coluna


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 .

724 l'iI Desenvolvendo Aplicaes Web com JSP...


Tabela E.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

PRIMARYKEY

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.
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 UNIQ\. 'f" impe a regra que todos os dados dentro da
coluna declarada devem ser nicos, mas aceita valores nulos .
Sintaxe Bsica da Sal
A primeira coisa que devemos fazer quando criamos um banco de dados e

dep :" uma tabela e utiliz-la inserindo dados .

o MySQL

ll 725

Comando INSERT

o comando INSERT INTO adiciona dados em uma tabela. A sua sintaxe :


rnysql> INSERT IN'l'O livros VALUES

-> '85-7585-120-5',
->'Core Java Fundamental',

-> 6,

->'2004',
->'Desenvolva Java com vrios exemplos');

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 IN'1'O namedatahela(colunas) VALUES ('valores inseridos 1'),
-> ( 'valores

inseridos 2'),

->(' e assim por diante');

Comando SELECT
A instruo SELECT provavelmente a mais utilizada de todas as instrues de SQL. A instruo SELECT somente retomar 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:


rnysql>SELECT

FROM livros; # o asterisco indica

todas as colunas

726

[1jjlJ

Desenvolvendo Aplicaes Web com JSP...

A Clusula WHERE
Com a clusula WHERE voc filtra infonnaes de acordo com a condio
passada:
mysql>SELECT

FROM livros WHERE ISBN='85-7585-120-5';

Nesse caso foi colocada uma condio que dentre todos os registros
s dever aparecer os dados ONDE a coluna ISBN for igual '85-7585120-5' .
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 a seguir esto listadas as mais
utilizadas por voc:
Tabela E.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 !=O

Testa se um valor diferente do outro

IN

cidade in ('So
Paulo', 'Minas
Gerais')

Testa se o valor est em um conjunto


particular

NOTIN

cidade not in
('So Paulo',
'Minas Gerais')

Testa se o valor no est em um conjunto particular

ISNOT

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 ANO 350

Testa se o campo tem valores entre


um e outro

o MySQL

727

Funes que Trabalham com a Instruo SELECT


Vistas ao longo desse livro, sejam aplicadas ou comentadas, voc tem a
explicao mais detalhada a seguir:

LlMIT
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.

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.

~ Em caso de fazer a contagem em ca mpo de valor NULL a con~ ta gem ser diferente da no valor tota l.

728

Desenvolvendo Aplicaes Web com JSP...

ORDER BV
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.

ORDER BV ... DESC


SELECT

* FROM

tabela ORDER BY coluna DESC;

Coloca os dados selecionados em ordem decrescente pela coluna.

LlKE
Usado para filtrar dados em uma coluna que armazena strings (varchar,
text e etc . . .). Sua sintaxe como mostrada a seguir:
mysql> SELECT

FROM livros WHERE titulo LlKE 'Java%';

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 titulo LlKE '%Java%';

Colocando a % no incio e no fim, com um valor no meio, possvel


buscar todos os valores que contenham as letras Java, seja no comeo,
meio ou fim.

o MySQL

729

Comando UPDATE

o comando UPDATE permite editar os valores de dados existentes. A sintaxe para modificar os valores :
UPDATE t abela SET coluna= 'val or ' WHERE colu.na= ' valor ';

Atualiza os dados da coluna determinada em SET na condio passada em WHERE.

Comando DELETE
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 WRERE coluna=' val oy';

Trabalhando com Junes


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 JUNA-O 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.

Criando uma Juno com INNER JOIN


A seguinte sintaxe cria uma juno:
SELECT tabelal . coluna , tabela2. coluna FROM tabelal INNER JOIN tabela2
on
tabelal. coluna_de_val oy_iden t ico=tabela2 . coluna_de_val oy_identico;

730

[1iilJ

Desenvolvendo Aplicaes Web com JSP...

INNER JOIN's 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 .

Chaves Variadas do MySQL

O QUE UMA

CHAVE?

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.
COMO AS CHAVES FUNCIONAM

Uma chave existe como uma tabela extra no banco de dados, embora pertena sua tabela pai. Ela ocupa espao fisico no disco rgido (ou outras
reas de armazenamento) do banco de dados. Pode ser to grande quanto a
tabela principal e, teoricamente, at maior.
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.
BENEFCIOS DE USAR UMA CHAVE

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.

o MySQL

I\l 731

SUPORTE DE CHAVES DO MvSQL

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 PRlMARY 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 [, ... J),.
CREATE UNIQUE INDEX [nome_do_ndice] ON nome_tabela

(nome_da_coluna [, ... J) ,.
CREATE PRlMARY 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)),.

Chaves Primrias (Primary Key)


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.

732

Desenvolvendo Aplicaes Web com JSP...

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.

* 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.

Chaves Estrangeiras (Foreign Key)


As chaves estrangeiras no so atualmente suportadas no MySQL pelas
tabelas do tipo Mylsam. A mais usada e recomenda para transaes chamada de InnoDB.
A seguir voc tem o comando necessrio para criar uma chave estrangeira no seu banco de dados:
ALTER TABLE publicacao ADD CONSTRAINT FK-publicacao
FOREIGN KEY (isbn) REFERENCES
livros (isbn) ON DELETE CASCADE ON UPDATE CASCADE;

Excluindo uma Chave Estrangeira


Para excluir uma chave estrangeira, use o comando:
ALTER TABLE publicacao DROP FOREIGN KEY FK---'publicacao;

Administrando o MySQL
Um sistema de MySQL pode ter muitos usurios. O usurio root geralmente deve ser utilizado somente para propsitos de administrao, por razes

o MySQL l)il]

733

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 .

Entendendo o Sistema de Privilgios do MySQL

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
conj unto de privilgios para especificar o que ele pode e no pode fazer
dentro do sistema .

Configurando Usurios
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)

As clusulas entre colchetes so opcionais.


Para conceder privilgios ao um usurio no banco livraria, voc deve
criar um usurio com os seguintes privilgios:

734

Desenvolvendo Aplicaes Web com JSP...

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.

Confirmando o Novo Usurio


Para confirmar a criao do novo usurio, voc deve executar o comando a
segUIr:
flush privileges;

Revogando Privilgios
Para revogar esse privilgio voc deve fazer o seguinte comando:
mysql> revoke all
->

on livraria. *

-> from edson;

Obtendo Informaes com SHOW


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;

--

o MySQL l)jl)

Bibliografia

REFERNCIAS

INTERNACIONAIS

Pro EJB 3 - Java Persistence API


KEITH, MIKE
SCHINCARIOL, MERRICK
Apress
Beginning Java EE 5
From Novice to Professional
MUKHAR, KEVIN / ZELENAK, CHRIS
WITH WEAVER, JAMES L. AND CRUME, JIM
Apress
Pro JSP 2
Fourth Edition
BROWN, SIMON / DALTON, SAM / JEPP, DANIEL /
JOHNSON, DAVID / LI, SING / RAIBLE, MATT
EDITED BY MUKHAR, KEVIN
Apress
Apache Jakarta Commons: Reusable Java Components
IVERSON, WILL
Prentice Hall PTR
Core JavaServer Faces
GEARY, DAVID / HORSTMANN, CAY
Addison Wesley
JavaServer Faces
BERGSTEN, HANS
O 'Reilly
POJOs in Action
RICHARDSON, CHRIS
Manning
Ajax in Action
CRANE, DAVE / PASCARELLO, ERIC
Manning Publications

735

736 I\l

Desenvolvendo Aplicaes Web com JSP...

Ajax Patterns and Best Practices


GROSS, CHRISTOPHER
Apress
Manual de referncia do MySQL, baixado no site da MySQL AB.
www.mysql.com

REFERNCIAS NACIONAIS

Java para Web com Servlets, JSP e EJB


KURNIAWAN, BUDI
Cincia Moderna
Java Server Pages Avanado
DAVIDM. GEARY
Cincia Moderna
Dominando Eclipse
GONALVES, EDSON
Cincia Moderna
Dominando NetBeans
GONALVES, EDSON
Cincia Moderna
Tomcat - Guia rpido do administrador
GONALVES, EDSON
Cincia Moderna
Dominando AJAX
GONALVES, EDSON
Cincia Moderna

Outras obras do mesmo autor

Dominando Eclipse
Autor: Edson Gonalves

326 pginas
ISBN : 85-7393-486-7

Aprenda a desenvolver aplicativos em Java


Swing, desde a utilizao dos seus componentes mais simples
at a utilizao dos mais sofisticados layouts.

Conhea o Java SWT, a linguagem que est revolucionando o desenvolvimento

para desktops .
Crie aplicaes rapidamente utilizando o Visual Editor, o plug-in mais utilizado
para o

desenvolvimento de aplicaes visuais no estilo WYSIWYG para desktop

na plataforma Eclipse .
Desenvolva uma agenda completa, tanto em Swing como em SWT, utilizando
passo-a-passo o Visual Editor, com acesso a banco de dados MySQL.
Depure seus programas rapidamente usando o poderoso depurador da IDE.
Construa poderosos relatrios utilizando a biblioteca JasperReports, com uma
abordagem indita da utilizao do plug-in JasperAssistant.
E mais, os principais assuntos do livro abordados em vdeos, incluso no CO,
mostrando do desenvolvimento bsico distribuio do seu aplicativo.

venda nas melhores livrarias.

~~ EDITORA

~\70 CINCIA MODERNA

Tomcat - Guia Rpido do


Administrador
Autor: Edson Gonalves
384 pginas
ISBN: 85-7393-536-7

Se voc est comeando a desenvolver


aplicaes Web escritas em Java, programador
ou analista de sistemas responsvel pelo desenvolvimento
de aplicaes voltadas para a Internet, ou at mesmo um administrador
de redes interessado em obter conhecimento sobre como manter uma infraestrutura de servidores de aplicao Web baseados em Java, este o seu
manual.
Com o intuito de ajudar na administrao e configurao do Tomcat,
esta obra traz as principais caractersticas existentes desse incrvel container
Servlet.
E mais, voc ainda tem a integrao do Tomcat com as duas IDE 's mais
usadas do mercado: Eclipse e NetBeans.

venda nas melhores livrarias.


"'~ EDITORA

~VD CINCIA MODERNA

Ul'sl'n\oh l'ndo .\plil'aiil's \\dl com .JSP. Sl'n kts. ,h"aSl'rH'r


Facl's. lIihl'rnatl'. E.JB -' Pl'rSistl'nel'l'\ja\ l' umli\TO sohn' as tl'Clwlogias
mais usadas no ml'rcado. com ml'todos l'ficil'ntt.'s <Im' ajudaro iniciantl'
a programar aplicaiil's \\dl l'scritas l'm ,h" a com simplicidadl' . .h
tl'clwlogias ahordadas pl'rmitl'm ao kitol- dl'sl'l1\oh l'r <ksdl' simpks
aplil'athos atl' os mais cOmpll'\OS sistl'mas l'\igidos por grandl's
co rpo ral's.
Comuma alwrdagl'm no l'stilo "Ih 1'0 dl' n'cl'itas". o kitor apn'll<kr::
Os fundaml'ntos do dl'sl'l1\ohiml'nto \\dl com ,Ia\a, como
instalao l' configurao dl'um contl'illl'r Sl'n kt:
Ul'sl'n\ohiml'nto com Sl'n kts. niao dl' cookil's l' Sl'SSI-'l'S. l'n\iar
l' n'el'hl'r dados, assim como puhlil'-Ios:
Criao dl' pginas .Ja\aSl'r\ l'r Pagl's (,ISP), .Ja\ alkans l' cOIll'\o
com o hanco dl' dados:
Ul'Sl'n\ ohiml'nto dl' pgillas utili/ando ,1ST!.. Ctl'itom Tags l'
,J:"aSl'nl'r Facl's:
Os padnks U.\O l' " , ( .

,,~

EDITORA

'-YJ CINCIA MODERNA


www.lcm.com.br

Você também pode gostar