Escolar Documentos
Profissional Documentos
Cultura Documentos
NelBeans
EDSON G ONALVES
."
. . EDITORA
Agradecimentos
Sumrio
2
3
4
5
7
8
9
10
15
17
18
18
23
23
24
O Torncat ......................................................................................
Servlets e JSP .. ........... ...... ........ .......... .. ............. ....... ... ........ .........
XVIII
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
o Eclipse ......................................................................................
Obtendo a IDE. ........................................ ...... ....................... ........
53
53
54
55
64
70
72
Qual a Melhor IDE? .... ........ .. ...... .............. .... .. ............ ..............
73
A CLASSE
75
75
79
80
82
87
87
91
93
95
97
97
98
100
102
107
109
111
113
113
XX lI
10
115
115
117
117
117
117
118
119
119
120
121
122
125
127
128
130
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..........................................................................
12
13
JAVABEANS ..........................................................................................
14
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
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
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
265
266
266
267
268
269
269
269
270
270
270
271
271
272
274
276
278
XXIV
281
282
282
282
308
310
311
311
313
314
314
18
ENTENDENDO CUSTOM
Sumrio
lll XXV
19
361
361
365
370
370
373
375
378
380
382
384
20
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
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
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
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
614
614
618
618
618
619
619
622
625
627
634
635
640
640
640
641
641
641
645
646
647
ApNDICES
653
653
654
654
654
655
655
656
656
657
658
Sumrio [ilJ
XXXI
659
660
660
661
662
663
664
665
666
667
667
Mtodos.................... ............... .. .... .... ........... ......... .. ...... ... ... ........ .
Fundamentos da Orientao a Objetos .................. .......................
Classes....... ............... .. .................. ................ ................................
Objetos .. .......................................................................................
667
669
669
671
Herana ................................... ... ........... .... .... ....... .. ....... .... .......... . 672
Polimorfismo ............. .......... .............. .... ......... ... ........ ........ ..... ...... 673
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
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
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
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
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]
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
Introduo
IX
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:
~
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
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.
1:
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
3:
4:
5:
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
CAPTULO
7:
HTTPSERVlETREQUEST
8:
COOKIES E SESSES
9:
10:
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
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
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:
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:
XIV
16:
17:
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:
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
CAPTULO
24:
AJAX
Uma introduo linguagem Java no que diz respeito aos seus mais bsicos conceitos, ideal para quem nunca trabalhou com a linguagem.
ApNDICE
B:
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
E: O
MvSQL
Introduo
CAPTULO
20:
xv
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
22:
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?
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:
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
f\I 3
Host: www.integrator.com.br
User-Agent: Mozilla / 5.0 (Windows; U; Windows NT 5.1; pt-BR;
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>
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.
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
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.
10 lI
Figura 2 .1
0[A~~~.J~~Li[I~~nSe ~~.I!!Jl..e$
Mext
>
Caneel
Figura 2 . 2
V"
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
[L' r:::J
=,-_.j-_dk_1._5._
~_;_'''_
-_-_-'~_-__
-~~==_
--_.
_____.!~~.JJ:2J
I d1
Eolder name:
OK
J[
Cancel
Figura 2.4
13
Status:
.....
In~'l5hie!d-----------------------
Ne>t>
Figura 2.5
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
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
Vou may change the settings later In the Java(TM) Contro! Pane!.
InstaI!Sh : e ! d - - - - - - - -- - - - - - - - -- - - - - - -
< Back
I'
Next
>
JI
Cancel
Figura 2.7
A Linguagem Java
(1jjl]
15
Installation Completed
.: Back
Finish
Figura 2.8
16
Proprit'dadcs do sistema
Avanado
Pala tia!' o mlcino Pfoveito destas ekCfo6eS. prccito lCf IClto Iogon como
_bm.
Oes:err()enho
Peths: de llluilrlO
seu Iogon
lricial:!aoo o re~a:SO
I~Ofmaaet
sobre riciaizalo
depuoJo
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)
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
J2SDK
18
c\
IIElEl
Prolllpt de comando
:,>
Figura 2.11
EM
WINDOWS VERSO
9x
NO LINUX
A Linguagem Java lI 19
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
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):
Figura 2.14
jdk1 . 5 . 0_10
/ usr !loca1/
--.
o)
Figura 2.15
;:dit
~ew
Ierrninal T3bs
' !
~elp
II
I
Figura 2.16
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
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
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
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
26
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
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
No
LINUX
Parando o Tomcat
Assim como voc inicia, voc tambm pode parar o Tomcat.
No
27
WINDOWS
No
LINUX
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
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
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'
Figura 3.1
4
Introduo aos Servlets
30
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( );
out.close( );
32
Inicializando
Inicializado
serviceO
Servindo os
-destroyO~
Pedidos
Coletando o
lixo e
Finalizando
~
~
33
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
34 l'iI
G.l
rG Tomcat 5.5
;) bin
El
rG common
~ classes
fi::) endorsed
10 i18n
:llll
Figura 4.3
GJ@rg)
Q :
Figura 4.4
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:
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
_ _ _ _ _ _ _ _ _- -
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>
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 .
!lI:! EJ
Figura 4.6
40
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
:',
.........
. . ,
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
42
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.
cr-
Figura 5.2
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.
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.
Figura 5.4
44
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
45
-4
r~_
TT_
~_
._
ST_AA
_T_
.D____~__~ 1 ~i_
.R~
T~
~l~
B
~.
~.~
~~
~~__________~__~____
.. c.tting Started
" WhM'.Hew
- lotroductJon to J
fE'
'-
Addon Pack.
" Profller
.. Enterprl
- VisualWeb
- oc ...
~ ~ ._
1!1."'!1of.;e
Web
Enterprl
o SHOW OM ST ARTUP
Figura 5.5
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
[8J
E New Project
Step.
I.
Choo.e Project
2.
...
Choole ProJect
CoteQorles:
::15
!
~; -""---'-,
...._-
Web
Enterprlse
~_ Neteeaos PiuQ-in Mod.ies
meJ
Projects:
liJ
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
(gJ
steps
I.
Proje<t Nome:
I MeuPrinolroProjeto
Proje<t Locatlon:
Project FoIder:
['C:iCu;;et;;;(j-5ei~EdSOO\MeUPfiffiei;C;P;:oito
2.
Choose Project
Name and location
3.
F,amewor1<s
Server:
Java EE Version:
Context Poth:
I
II
Browse ...
---1
i.",,;j
[:;w.;;;...--.--...--_.._....--"".-.,..".. ,..-...._-_......------V]
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
: 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
$ "lfl
Test p(lckages
s ~
Libraries
~. Q] JDK 1.5 (Default)
. Illi
W ~ Test Libraries
Figura 5.9
lI 49
l8.l
Choose f ~e Type
I.
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,
-&)
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
f) New Servlet
'
Steps
l.
2.
3.
.
..
N~~m~e,,=n~dL~o~c,,~tio~
n
_ _ __ _ _ _ __ _ _ __ _ _ __
1500',0Paci<.aQes
vJ
padcaoe:
Figura 5.11
51
Steps
1.
2.
3.
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
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
lluhlic c lass
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
'"\,
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
WTP 1.5.2
(October
31.2006)
'"
o
WTP 2.0
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
Windows
{5
Status Platform
Download
ri
Linux (x86/GTK 2)
Status Platform
Download
ti
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.
No
55
LINUX
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
56
(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:
v ; [ Browse ...
,I [
Cancel
Figura 5.18
Quando o Eclipse carregar, voc ver uma tela de boas vindas, como
ocorre com o NetBeans:
Figura 5.19
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
58 lI
ij
59
1RI
f New Project
Select a wizard
Wizards:
<>
:.*
Java Project
Java Project from ExistinQ Ant 6uildf~e
1tJ,(O General
~(O
cvs
... t1.
Figura 5.21
60
lEl
< Back
li
Next
>
II
Finish
II
New,.,
(ancel
Figura 5.22
61
__
- -- _-_._--_._._- .
....
...
_-_..._._.........__._._._._--
s tC7 Apache
. !j
!j
. !j
.!j
--
tC7
.:.....
tl
-
,'V
<.: Back
Next
>
Finish
Cancel
Figura 5.23
62
Torncat Serve r
Specify the installation directory
Nllme:
t..:lC:.:.:\!..:.Tom
=c.:.:at-=s,::,s~_ _ _ _ _ _ _ _ _ _ _---l1 [
Browse ...
JRE:
L:.llr..:.,
e.;,..
1._
s ....:
0_=O_
9
____________
< 13ack
~
v~1 !lnstalled JRES ...
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.
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:
I [I Disagree I
Figura 5.25
64
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
. . ~ MANIFEST .MF
f.d. WEB-INF
!27 lib
web.xml
Figura 5.27
65
Select a wizard
Create a new Servlet
Wizards:
~I
$(2:> web
~ CSS
r~ Dynamic Web Project
..
HTML
~1 JavaScript
~ JSP
~
0 Q
ffi
07 _Web Services
!...
..: Back
' I,
ti o Next>
I ,------,
j t_.o ~insh
__ ! ____
Ca_n_ce_l--.J
Figura 5.28
'/Ioftl
~
66
~ 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""[
name:
Ir~ervIetsco-m-Eclipse--------------'I '
BtOwse ...
1-----------------------------------------------------"
< Back
I'
Next >
JI
Finish
I[
Cancel
Figura 5.29
: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
68
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~
~nit
DtoString
o getServletInfo
~doPost
DdoPut
DdoDelete
~destroy
~doGet
< Back
1_ r~ext >
Finish
1[
Cancel
69
~~
~~
.53
54
5S-
56
out
G Create da 'Prrtwrt....
); , - - - - - - - -- -- ----1
.~,
"va.io.lOExc~ion.'
Lt
r~: ,..
.>"
~rt java.io.PrintWriter.
2, _.
Figura 5.33
70
lcl.
!'1
.<lJC
--l\(,
~ ;--=~",,=:l
t~
,,_,8t . _
Figura 5.34
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.
~ Run On Serve r
71
~
~ 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
jVA
l1Installed Runtmes ... 1
<6ack
Next
>
I'
finish
I[
Cancel
Figura 5.36
72
, li <" http://Iocalhost:8080/PrineiroProjetoUsandoEclpse/ServletsColli'dipse
,v
I ~ 11
Figura 5.37
[g]
f..- hpOft
WAR Export
ExPQft web ~ject to the local Ue syst .
~)
Figura 5.38
.. ....
. .
Captulo
6
A Classe HttpServlet
76
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( );
77
78
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
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
80
<br I >
<a href="TrabComGetServlet ?empresa=Integrator "> fi}
Minha empresa
</ body>
</ html>
o-
e-
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
"</body></html>";
response. setContentType (" text/html" ) ;
PrintWriter writer = response. getWriter ( );
writer.print(html);
writer.close( );
"
'
"
"
..... _ _
__
_ _ _ _ _ _ _ _ _ "-
_ , __
___
__
__
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..=..- _
__ _
<>
~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
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
84
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
85
= "<htrnl><head>"+
Esse Servlet no ter explicao, pois seu contedo no tem nenhum tipo
de novidade.
..
..... ..... ..
Captulo
7
,
Praticando os Mtodos
Considere a seguinte situao:
88
<! 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" / >
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
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( };
90
html+="</body></html>";
response. setContentType ( "text/html") ;
PrintWriter writer = response. getWriter ( };
writer.print(html};
writer.close( };
o-
<
"" 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>
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>
92 liI
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( );
)i
C)
!I 93
writer.print(html) ;
writer.close( );
o-
e-
package meupacote;
import java.io.IOException;
94
import
import
import
import
import
java . io . PrintWriter;
java.util.Enurneration;
javax . servlet.ServletException;
javax.servlet.http.HttpServletRequest ;
javax.servlet.http.HttpServletResponse;
throws ServletException (
html+= "</body>" +
"</html>" ;
printWriter out = response . getWriter( );
out.print(html);
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
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
else{
response. sendRedirect ( "uBuario_ inv. btml" ) ;
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>
- .- .
.Captulo
.-
Cookies e Sesses
no mundo
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
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
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;
99
import javax.servlet.http.HttpServletResponse;
public class CriandoCookie extends javax.servlet.http . HttpServlet
{
100
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
Cookies e Sesses lI
protected void doGet(HttpServletRequest request,
HttpServletResponse response}
throws ServletException, IOException (
Cookie listaCookies[] = request.getCookies( )i 4)
101
102
(t \lsuahzando um CooWe X
I http://localhost:8080/ServletsComCookies/VisualizaCookie
Lv. .1 ~
Figura 8.1
~~tenQaa~
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.
103
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( );
104
[iiilJ
e.
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( };
105
106 l\J
html += "</body></htrnl>";
response.setContentType("text/html");
PrintWriter writer = response.getWriter( );
writer .print(html);
writer.close( );
e.
~ ~
Ii!l ~<},
http://loc.!llhost:8080/ServletsComSession/ServletSessionPagDois fv
Sua ID :7CBB6AD986A89B6D53D7B887FF600F6D
E seu nome : Edson
Figura 8.2
Cookies e Sesses ll
107
if (nome! =null) (
html += "Sua ID :<strong>" + sessao.getId( ) +
"< /strong><br />"+
"E seu nome : <strong>"+nome+"</strong><br />"+
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
"</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( };
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
Figura 8.3
= request.getSession(true);
o
49
..,
Figura 8.4
1 12
EB
N
)
Cookies e Sesses
113
<session-config>
<session-timeout>5</session-timeout>
</session-config>
</web-app>
114
[iiilJ
...............
~
~
ServletFecharSessao.java
............
Captulo
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 .
116
%>
</body>
</html>
117
118
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.
119
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
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.
lI 121
step.
I.
2.
Choose file
Proj.<t:
Tr""
I@TrobComJSP
Fie Types:
Cate<ples:
'-- :) Web
! ib Etterprise
f--
, :)
Java Classes
JavaBeans Objeds
Jlk1It
;~
,<
..................
..
t!)
@
~ HTML
~:, <>.1I"I("MP~ntArt~Mt~
.",
@ 5ervlet
@ Flter
I@ Web Appicatioo Liste".r
~.
i -ib Persistence
f-- Web 5ervices
i SUl ReSOU'teS
;
~-
>11
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
122
(8]
I.
Z.
~IpaQI
~'''''=JSP~==========~
JSPFleNome:
Proje<t:
1 TrobCamJSP
~====================~~
L-I
W_eb_pOQe
-,,s _ _ _ _ _ _ _ _ _ _-'--"
"',1
Locotlon:
FoIder:
0ptI0ns:
Des<riptlon:
JSP fie usinQ JSP stondard synta>:.
Figura 9.2
123
Select a wizard
Create a new JavaServer Page
1-____________
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __
_
0
Wizards:
;.
: m HTML
~ JavaScript
:.
00
:' ~ FII
o ~ Servlet
li;
< Back
Next
> J
Finlsh
11
Cancel
Figura 9.3
rEl
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
IAdvanced I
<Back
li
Next
>
1I
Finish
11
Cancel
Figura 9.4
125
(RJ
........._........_.._.._---_.. _ - - - - ,
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
page language="java"
contentType="text/htm1"
pageEncoding="ISO-8859-1"
info="Escrito por Edson Gonalves"
126
%>
%>
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.
127
Ihttp://localhost:8080/CriandoJSPComEclipse/data,jsp ,v]1liiJo
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" %>
rodape. html
<strong>Esse texto faz parte do rodap</strong>
128
''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
<%@
<%@
</body>
</html>
Figura 9.7
taglib
Tags Personalizadas ou Customizadas so comuns no desenvolvimento de
pginas dinmicas escritas em Java. Ao longo dos anos dois tipos de tags
129
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.
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 .
131
132 l\l
TrabCornTaglib . tld
<?xml version="l.O" encoding="ISO-8859-l"?>
<!DOCTYPE taglib PUBLIC "- I ISun Microsystems, Inc.IIDTD JSP Tag
Library 1.1 //
EN"
<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>
133
C)
/WEB-INF/tld/TrabComTaglib.tld
</taglib-location>
</taglib>
</web-app>
134 !i'I
e/ h3>
e/body>
e/html >
135
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 %>
.. ....
. ..
Captulo
10
Comparando JavaServer Pages
com Servlets
recebe.jsp
&&
senha.equals("123")) {
139
%>
</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 .
141
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
lnport=ljava.net.URLEncoder"
%>
< !DOCTYPE html PUBLIC "-//W3CIIDTD XHTML 1. O Transitional//EN"
''http://www . w3 . org/TR/xhtml1/DTD/xhtml1-transitional. dtd" >
URLEncoder.encode("Cidado&Joo l ,"ISO-8859-1");
%>
<a href=" recCaractEspeciais. j sp?dados=<%=queryString %>" > 6)
Envia Caracteres Especiais
<Ia>
</body>
</html>
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 / >
</ body>
</html>
144
envDivOpc.jsp
%>
<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>
145
e,
>
fi}
;Jj>
Ihttp://Iocalhost:8080/CompJspComServlets/envDivOpc.jsp
I r;;;.
NetBeans
BrOffice.org
~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-
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
;-.::" !!li
<8'
Ihttp://localhost:6080ITratandoErrosITrabComErros
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>
151
-->
</html>
152
....teH~~
<error-page>O
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/erro_ae.html</location >
</error-page>
<context-param>
Controlando Erros
153
ilegal,
uma
/>
o informe
154
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>
ij
~
~
155
%>
< !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
contentType="text/html"
pageEncoding="ISO-8859-1"
errorPage="error-page.jsp"
%>
CAPTURAN DO O ERRO
contentType="text/html;"
pageEncoding= "ISO-8859-1 "
isErrorPage="true"
%>
< ! DOCTYPE html PUBLIC "- /!W3 CI lOTO XHTML 1. O Transi tionall IEN"
157
</ 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
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
"-, .:;> 11 ~~
Ihttp://localhost:8080/TratandoErros/EnviandoErros
:.mmJJWillil Access to the specfled resource (Voc no tem permisso) has been forbldden.
Figura 11.2
160 lI
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
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
505
1.1
..... .....
....
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
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 .
<%
String texto
= "Esse
out.println( texto) ;
%>
Actions
ll 165
</title>
</head>
<body>
<j sp: include page="topo. j sp" I>
</body>
</html>
<%
String texto = request.getParameter("texto");
out.println(texto);
%>
index.jsp
</title>
</head>
<body>
<h3>
<jsp:include page="topo.jsp" >
<jsp:param name="texto" value="Esse texto do topo"l>
</jsp:include>
</h3>
</body>
</html>
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>
-_.
-'-
.-
~......
...... .
'-
.......
- --- . -
---
168
</jsp:forward>
</body>
</ html>
redirecionado.jsp
</ body>
</ html>
Actions [lil]
169
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.
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 .
172
package meupacotei
public class MeuPrimeiroJavaBean
private String mensagem = ""i
public String getMensagem{ } {
return mensagem i
public void setMensagem {String mensagem}
this. mensagem = mensagem i
173
steps
1.
Z.
anel Locatlon
ClassNome: ~
imelro)a.'::..~~ __________ ....._.._____.._. _ _ _ _ _ _ _ _ _
Proleet:
ITrobComJavolleans
Lcxollon:
15ou'ce PeckaQes
P~ :
~ot.
Figura 13."
174
f. @:::Me'rineiroJaVaIlean.java
li <? +
~ ~ ~ 'i ; '
ElJ-S
-.J
package .eup"cote;
li ;1 ElPubl~:i~::" S::~~;1::~::~::::~~:~____
I~
. . -~:,1.~_.
Go To
Select n
Enterpris. Resoure.s
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
Extraet Supere"'ss .. .
,--..--....- - -.................--_..--.-............_-----I~'-""'type ~'.:_~ossib~.:._._._. _______
Code FoIds
Safely Defete.. .
!Jndo
U_
Redo
............_......._......-
.: : : : :~j
Figura 13.2
175
'ti
. ,: Create Getter
~ getMensagem
mensagem
Fields' Visibi~ty:
!private
Accessors' Visibility:
!publiC
~ setMensagem
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
li'.1i
~ @ TrabComJavaBeans
--=- s,,8,
, 0 1m Source Packages
8 . ~ mmeupacote
~
s. ~ h MeuPrimeiroJavaSean
'*
t, . 0
~
Do Refadoring I)j
I Cantei I
Figura 13.4
176
L8J
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
Add .. .
I_~~-j
O Generate comments
Finish
Figura 13.5
j'
Cancel
177
Encapsulate Field
Satter name:
IgetMensagam
IsetMensagem
Access modifier:
Getter name:
_.._-=:1
Preview
> Ik
OK
~I
Cancel
Figura 13.6
contentType=Htext/html H
pageEncoding="ISO-8859-1"
%>
< ! OOCTYPE
178
[liilJ
''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"/>
%>
</strong>
</body>
</html>
lI 179
,,':0-:")
Iil ~<!;;
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( );
C)
181
TrabComDatas.jsp
<body>
<jsp:useBean id="data " class="meupacote.FormatandoDatas"/>
<% data. setFormato ("dd/MM/yy"); %>
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
Descrio da Regra
Construtor
Persistncia
Atributos
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" / >
<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>
<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>
package meupacote;
public class Interagi ndoBean
private String nome ;
public String
return nome;
getNome( ) {
185
e.
Tipo da Propriedade
boolean ou Boolean
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)
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:
187
Tabela 13.3
Escopo
Descrio
page
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
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 .
d) llvros.)ava )(
1 package
m~upacot~;
'-' 0
import
java . util.Dat~;
'I
<
Figura 13.8
"'
Irg]
tE . ~
D
D
lB" ~
lB~
ll~
descricao
edicao
isbn
publicacao
titulo
I
[ Select Setters I
[ Select Getters
Insertlon point:
ICursor position
'cl
Sort by:
.VJI
Access modifer
0public
Oprotected
o final
O synchronzed
Odefauft
Oprivate
10 of 10 selected.
<1>
Figura 13.9
OK
I[
Cancel
.. ..
...
Captulo
14
Fazendo Upload de Arquivos
e para fazer
Trabalhar com arquivos em Java no uma tarefa fcil. Mas voc pode
utilizar uma biblioteca de terceiros, ajudando-o assim nessa tarefa .
190
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
DiskFileltemFactory( };
191
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(
);
) ;~
192
}catch (FileUploadException e) {
e.printStackTrace( );
}catch (Exception e) {
e.printStackTrace( );
return true;
193
e.
fazendoUploadComJsp.jsp
<%@ page language="java"
194
<%
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
195
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 .
: Projects .,
I B .. @
x : files
: Runtime
UploadComfileUpload
e '(Q
Web Pages
, "".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
r:::- ,rQ)r:g)
Project
Select Ali
Oe:;"lect Ali
Add JARs .. .
~<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.
197
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;
new
198
199
null) {
String path
try
sfu.setSizeMax(getSize( ) * MS);
200
(!filename.equals(""))) {
filename
= (new
File(filename)) . getName( );
if(isPermission(filename)) {
}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;
C)
201
while(st.hasMoreTokens( )) {
if (lowerCaseName.endsWith("."+st.nextToken( )))
return true;
return false;
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
.. ..
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]
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.
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
20 7
208
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
~
'/lo/ti
No
LINUX
209
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;
210
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
TEXT
- > );
O Comando SHOW
Assim que criada sua primeira tabela. Para ver o resultado basta digitar a
seqncia:
SHOW TABLES FROM livraria;
211
Configurando Usurios
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)
->
212
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.
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.
Descrio
java.sql.DriverManager
javax.sql. DataSource
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=?".
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
215
TipoJDBC
String
CHAR,VARCHARoulONGVARCHAR
java.math .BigDecimal
NUMERIC
Boolean
BIT
Integer
INTEGER
long
BIGINT
Float
REAL
Double
DOUBlE
byteD
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
Valor retornado de
GetColumnClassName
BIT
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
SMALLlNT[(M)] [UNSIGNED)
SMALLlNT [UNSIGNED)
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
CHAR(M)
CHAR
VARCHAR(M) [BINARY]
VARCHAR
java./ang.Boo/ean
217
Valor retornado de
GetColumnClassName
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
218
[iijlJ
trabComDBusandoJSPeJDBC.jsp
%>
<!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
219
%>
<t r >
<%
} / / end while
f inally {
if (rs != null) rs.close(
)i
)i
)i
%>
</ t body>
</ t able>
</ body>
</ html>
220
221
=El
\:;::, .:;>
li)
$'
Ihttp://localhost:8080!TrabComJDBC!trabComDBusandoJSPeJDBCjsp v I ~
- Ttulo
-------
Figura 15.1
Inserindo Dados
contentType="text/html; "
pageEncoding="ISO-8859-1"
import="java.sql.*"
%>
<%
= 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.executeUpdate{ );
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 .
Descrio
clearParameters( )
'/loto
~
227
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
trabComStoredProcedure.jsp
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
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
e,_
e.
contentType="tex t / html"
pageEncoding="ISO-88 59-1"
import=" j ava . sql. * "
%>
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();
232 l'il
%>
</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( )) {
%>
233
<tr>
<td><%= rs.getString("isbn") %></td>
<td><%= rs.getString("titulo") %></td>
<td>
</td>
<td>
</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 )(
Ihttp://localhost:8080/TrabComJDBC/trabComDBusandoJSPeJDBC.jsp
Ttulo
Excluir
1 Atualizar
--------[Cliq~e ag~;lQlig~-;;;:qci
Figura 15.2
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.
235
null;
try {
Class. forNarne ("com. mysql. jdbc. Driver") . newlnstance ( );
conn =
DriverManager.getConnection("jdbc:mysql://localhost/
livraria" ,
"edson", "integrator") ;
%>
<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
/>
</ 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
}// end if
%>
</body>
</html>
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 {
[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
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 .
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
Atributo
Descrio
driverClassName
maxActive
maxldle
maxWait
Em milissegundos, indica o mximo de espera para uma conexo, gerando aps uma exceo.
username
Nome do usurio
password
Senha
url
validationOuery
242
<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>
243
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 .
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
...
a
Captulo
16
JavaServer Pages Expression
Language
.....
~-
--
--
--
250 lI
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}
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
String
Ponto
Flutuante
Inteiros
Qualquer nmero de inteiro positivo ou negativo (-20, 10, 1250, e assim por diante).
Null
Um valor nulo
251
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
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)
O Operador empty
253
Valorempty
String
Varivel
NULL
Array
Sem elementos
Map
Sem elementos
List
Sem elementos
254
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
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
l\J 255
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"]}
Objeto Implcito
applicationScope
cookie
header
headerValues
initParam
pageContext
O objeto PageContext.
pageScope
param
paramValues
requestScope
sessionScope
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>
258
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
package meupacote;
public class UmSimplesJavaBean
private String nome;
private String email;
260
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:
261
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>
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
<jsp-config>
<jsp-property-group>
<url-pattern>apenasEssaPagina.jsp</url-pattern>
<el-ignored>true</el -ignored>
</jsp-property-group>
< / j sp-config>
</web-app>
<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
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
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 .
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).
: Runtime
8 -.. @ DesenvolvendoComJ5TL
, L....~
index.jsp
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
II
Figura 17.2
JSTL no Eclipse
Siga o mesmo procedimento do Captulo 14.
Help
267
268 l\I
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.
269
Entendendo o JSTL
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
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
~
~
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:
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
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
~.
'-
---
-------_.~--
272
[1jjlJ
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
/>
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>
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 />
275
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
A ACTION <C:FORToKENS
/>
''http://www.w3.org/TR/
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>
<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>
278 l\I
fi A action forTokens )(
<>
;'>
111 t!;;~
Ihttp://localhost:8080/DesenvolvendoComJSTL/varrendoComForTokens.jsp l~1
SI>
I Enviar I
IPalavra l lIntegrator
IPalavra Z ITechnology
IPalavra 3 !and
IPalavra 4 1Design
------,
Figura 17.3
279
capturandoExcecoes.jsp
''http://www.w3.org/TR/
/>
<c:if test="${e==null}">
Caso no tenha exceo
</c:if>
</body>
</html>
o
e
280
/>
Descrio
Especifica a URL bsica que ser usada para solucionar uma URL
relativa dada pelo atributo url.
scope
varo O padro
url
var
A ACTION
<C:URL
/>
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
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:
282
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
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" />
283
/>
E <FMT:SETBuNDLE
/>
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>
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
/>
titulo=Internationalization
ingles=English
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
da linguagem em portugus
286 lI
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
Copy
Ctrl+C
Ctr!+"
Test libr-- - - - - - - - l
Delete
Delete
J5P ...
~ Servlet. ..
~ HTMl ...
Rename ...
2..
Nameandloc_n
~
Name and locatlon
fio Nome:
l!_~~_
m _
_ _ . . . .
.............___...............1
Prolect:
FoIder:
Isrc\jov.\meupacote
Figura 17.5
mJ
.. 'I
I I~Br-aws-e.-
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)
'-~_ _ _ _ _ _ _ _ _ _ _ _ _
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
288 l\J
: Runtime
S @ Oesenvolvendo(omJSTL
$J . fG
Configuratlon Files
t. . ijg
Server Resources
$H:m
Source Pacl<.ages
. . mmeupacote
8 . . ~ rotulos .properties
$ '. defaultlanguage
rt: ...
1iJ. fiiB
~...t)
GHi:j}
Test Pacl<.ages
Libraries
Test Libr aries
Figura 17.7
!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:
( EJB
(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
, 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
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
_ ~r.gJ
,. Preferences
~!~t~;t-----=
I I fie Assoclatlons
~:II
8 General
fii Appearance
c.pobiitle,
Comp",e/patch
content Type,
8 Editor,
11
k.l
~ ' ,propertles
tI ,serVet
- Search
~"shtl!'l
anel Shutdown
WebBrowser
Wekome
III Workspace
Itl Ant
Gl Data
startup
~ ' , sqI
8 Editor de Resourc_
De,empenho
Adcl. ..
ForrnataSo
fi) Help
III Instal/Upddle
Gj- Internet
lava
pUa-;,
_..
'---~I I
-QJ ',j>aQe
Develooment.______
1I
'---"DK"'--....
C5lCeI
Figura 17.10
__
_.
_ _ '---'..L ___
_._
....
_ _
___
'_~_--"'-----""'--.~_
292
,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.
""""
""
""
""
inQles
nome
portugues
titulo
~ Propriedades
L_
portugus (8r asi!)
293
"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>
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 .
<> ,,;
,v,1
I
~
~ P ortuguese
==:J
Name:1
E_mai1:'r=1======;1
I Send I
v
Figura 17.13
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
296
''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
297
<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>
- _.. .... ..
~...
. -
298 lli'I
';::; co" IJ
'<f;><:"
Ihttp:/nocalhost:8080/DesenvolvendoComJSTL/diversasActionsDeFormatacao.jsp
_~I ~
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:
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
<sQL:sETDATASouRcE
/>
_ _
._
---A. _
..
. . &...-1_ ....
300 l\I
Descrio
driver
scope
A varivel de escopo definida pelo atributo varo Por padro esse atributo
page.
url
user
/>
301
xhtmll/DTD/xhtmll-transitional . dtd">
<html xmlns=''http://www.w3.org/1999/xhtml''>
<head>
<title>Usando instrues SQL com JSTL</title>
</head>
<body>
<table border="l">
<tr>
302
<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.
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
/>
/>
E <SOL:OATEPARAM
/>
''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
305
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>
</ 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>
Ill 307
atualizaJSTL.jsp
''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} " >@
308
</ body>
</ html >
o
e
A ACTION
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>
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
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>
310 I\l
~.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
/>
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.
<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
<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>
<html>
<head>
<title>Manipulando o XML atravs de JSTL</title>
</head>
<body>
lI 313
314 lll
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
/>
</x:if>
</x :forEach>
I>,
<X:WHEN
/>
E <X:OTHERWISE
/>
315
<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>
r----'-ISi3N---- r-----
-a ~
- ~~
Ttulo
ominando AJAX
12006
Figura 17.15
316 !\l
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">
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
,,'::. <>
r>
Ihttp:/nocalhost:6060/DesenvolvendOComJSTL/usandoXSLTcomXMLeJSTL.jsp .., I ~
Livros Cadastrados
ISBN
Titulo
dio
'----==
;:::1
~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~
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,
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
321
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;
= rnaxLength;
323
324
{~
return SKIP_BODY;
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;
{~
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
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-
327
<tag>
<name>inputTag</name>~
<tagclass>meupacote.InputTag</tagclass>~
<bodycontent>empty</bodycontent>)
<attribute>
<name>type</name>
<required>true</required>
</attribute>
<attribute>
328
[liilJ
<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>
329
da biblioteca "
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
331
~ c;> li ~C:,
Usurio:
Ihttp://focalhost:8080lTrabComBib~otecaDeTaos/index.lsp
IVJI
F ====::::::;--l
Senha: I
I Enviar I
Figura 18.1
''http:/ / www.w3.org/TR/
{~
riI 333
try {
contar
= Integer.parselnt(cont);
} catch(NurnberFormatException nfe)
contar
= 1;
{~
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
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.
</body>
</html>
Repetindo
Repetindo
Repetindo
Repetindo
cinco vezes
cinco vezes
cinco vezes
cinco vezes
Figura 18.2
337
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;
= flag;
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);
}
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.
340
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};
}
return(SKIP_BODY};
o
e
lI 341
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()) {
return(SK1P_BODY) ;
Criando o TLD
Novamente voc ir criar um arquivo com a extenso tld e adicionar o
contedo mostrado a seguir:
TagsCondicionais.tld
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.lfThenTag< / tagclass>
<bodycont ent>JSP< / bodycontent>
</ tag>
<tag>
<name>else</name>
<tagclass>meupacote.lfElseTag< / tagclass>
<bodycontent>JSP< / bodycontent>
</ tag>
</ t aglib>
344
usandolfThenElse.jsp
</ body>
</ html>
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
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
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)
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.
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
Como a configurao a mesma das tags simples, no haver comentrios sobre a mesma.
UTILIZANDO A TAG SIMPLES
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>
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
nome;
350 llI
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>~
351
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"%>
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
... _ ._ L _"
_.
~.~
.~.L_
.......
~~
_ .. _ ---"
_ _
352 l'iI
utilizandoTagFiles . jsp
</form>
</ body>
</ html>
353
tagdinamica.tag
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>
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
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>
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 *
358
"
lia
Prompt de comando
zadas .j a l'" *
Figura 18.4
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.
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
360 l'il
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
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
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.
Figura 19.1
Envio de E-mail
[1iil]
363
11iJE!
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?
plain:4555
Figura 19.2
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>
Envio de E-mail ~
365
Tabela 19.1
Comando
Descrio
help
Mostra a ajuda.
listusers
countusers
verify [usurio]
deluser [usurio]
shutdown
quit
Fecha a conexo.
366
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
Figura 19.4
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>
<%
Session s = Session.getDefaultlnstance(props,
newAutenticar("edson@integratorjava.com.br","integrator")0
)i
368
369
Message.RecipientType.TO
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;
~.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 .
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 {
371
372
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
Transport.send(message}
catch (MessagingException e)
throw new Exception(e.getMessage( }}i
catch(Exception e}{
e.printStackTrace( }i
== -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
e,
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
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>
376
[IjlJ
<%
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);
Ii cria a Multipart
Multipart mp = new MimeMultipart( ); ~
Ii adiciona o contedo
MimeBodyPart conteudo= new MimeBodyPart( );
EB
377
mp.addBodyPart(conteudo); t)
378
_'n
..
~l1UnQaa~
~ : !!izal ,rin
379
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") ;
%>
<h2>Envi ando e-mail com Common Email</h2>
</body>
</html>
380 llI
e.
)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>
e,
382
Envio de E-mail
ll 383
"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
email. send ( );
%>
<h2>Enviando e-mail com Cornrnon Ernail e HTML< / h2>
</body>
</html>
Captulo
20
Mode/- View-Contro//er e Data
Access Object
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
387
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
r;;:=
1
'r-
J5P
Pedido
OJ
;;O
pages
Resposta
:E
VI
.-...__..1" -
N'
;;O
r' , -
Q,ava
Be~
.......
I
Container
Servlet
Dados
contentType=" text/htrnl H
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 :
''http : //www.w3.org/TR/
<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
%>
<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>
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>( );
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-
---1
Pedido
(Controller)
Servlet
RcdireciQna
Resposta
~~,
~i' . ,
(View)
J5P
~~
~.v.Bean
---
Container
Servlet
Figura 20.2 - Arquitetura Model 2.
Dados
394 l\l
A PGINA
page language="java"
contentType="text/htm1"
pageEncoding="ISO-8859-1"%>
''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>
<%
</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
&&
this.senha != null) {
if(this.usuario.equals("edson")
&&
this.senha.equals("123"))
return true;
return false;
package meupacote;
import java.io.IOException;
import javax.servlet . ServletException;
import javax. servlet .. http.HttpServletRequest;
import javax.servlet .http.HttpServletResponse;
397
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
A VIEW
LOGADO.JSP
contentType=' text/html"
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>
[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;
401
catch (Exception e) {
throw new LivrariaDAOException(e.getMessage( ));
if (rs
!=
null) rs.close( ) ;
if (strnt != null)strnt.close( ) ;
if (conn != null)conn.close( ) ;
catch (Exception e) {
402 ll
Essa classe bem simples cria apenas uma conexo e retoma o resultado
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() .
II
data.equals("")}
(4)
403
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( ) (
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;
406
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.
~
[~
IObjectO
,y.1
-, 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
..
i 5 01 5 seIected.
(
Figura 20.4
OI<
II
Coneel
408 I\l
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( ) );
409
"+
{~
if (livro == null)
throw new
LivrariaDAOException ("O valor passado no pode ser nulo') ;
try {
410
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( ));
Il 411
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
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 );
413
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
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;
415
InterfaceLivrosDAO dao;
Livros livro = new Livros ( );
i f (cmd! =nu11
II
(e
try
416 Ill
)i0
"LivrariaServlet?crnd=listar" );
rd = request . getRequestDispatcher(
"LivrariaServlet?crnd=listar" );
rd = request.getRequestDispatcher( "I
formAtuLi vro. j sp" );
rd = request.getRequestDispatcher(
"LivrariaServlet?crnd=listar" );
if(
ll 417
crnd.equalsIgnoreCase( "principal" 1 )(
rd = request.getRequestDispatcher( "/index.jsp" li
li~
catch( Exception e )
e.printStackTrace( );
throw new ServletException( e );
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
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
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
pageEncoding="ISO- 8859-1"
import="java.util. * , meupaco te.Livros ,
meupacote.util.Conver teDa te "
%>
420
) ) %> ~
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.
...
~hteH~a
<::> '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
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
<%
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" />
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
430
I.
2.
3.
Choo.. Project
Nane anel locotion
Fr"",,,woric.
431
(g)
frameworks
~-UM.M
L
O
strut, 1.2. 9
Jav._
Foce, Corik}sation
p;.;;,s;".;i;t. . ___
o Validate _
O V.rly Object,
.. M
.... M
. .M
.. M M
. . . . . . .M
...... M
. . . . . . . . . . . . . . .M _. . . . . . . .
_..
........................._. __ . .. . . ._1
Figura 21.1
WebPages
~... ~
Configuration Files
$-"~
$_.eJ)
Test Packllges
Libr aries
, $--:g,
~_ ..~
$-":g,
$. . ~
$ ":g,
$ ... Q]
@.. ~
GJ-l
Figura 21.2
OOl'lnload
WTP2.0
[}] Project plan .
Ali Oownloads
[}] The complete list of downloads
is available here .
Figura 21.3
JavaServer Faces
433
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
Ali
Figura 21.4
' @ Welcome
; Help Contents
. ljfJ Search
Dynamic Help
Key Asslst...
Ctrl+Shlft+L
Tips and Tricks .. .
Cheat Sheets .. .
Software Updates
Figura 21.5
InstalllUpdate
Feature Updates
Choose the WlJY Vou WlJnt to search for felJtures to install
'''j
Next
>
I,
flni,;h
";
Cancel
Figura 21.6
rE)
O
O ~ Visual Editor update site
O ~Web lools PI~tform (WTP) Updates
"J
Remove
Import sites . .
Export sites .. .
< B<lck
Next.,,
m
]
Cancel
Figura 21.7
436
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
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[
.............
O_K
Cancelar
..
Figura 21.8
(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
[gJ
,. Install
._--_..
O
O
O
_._~
.. __
....__. , - - - - - - ,
New Remote Site.. .
I
[ New Local Site.. . I
[ New Archived Site.. . I
Edlt ...
Remove
< Back
Next
>
Finlsh
JI
Cantei
Figura 21.10
438
~
JSPo oo
lEl
Updates
Search Results
Select fe<!ltures to inst<!lll from the se<!lrch result listo
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
11
feature only
Fi";;'-, I
Cancel
Figura 21.11
Feature license
Some of the features have license aoreements that vou need to accept before proceeding with the
installation.
~
"-
II"'TERMS
ICATEO
""'U 00ANO''''THE' ' 'TERMS
' ' m ANO
'"'
ANO ORREFERfNC'''noW.
CONOITIONS OF THIS AGREEMENl
,<[1"'"
UI
,)'
,v
< Back
I'
Next
>
Cancel
Figura 21.12
440
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 Vetsion
O.~20~ .. :--~ n -
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
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
..~
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
'
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)
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
r.g)
JSFLibrary
(reate a lbrary of jars that make up a JSF implementatlon library.
Lbrary Name:
IJSF Imp
j jsf-api.jar - D:/libsfJSF
ajsf-impl.jar - D:/libsfJSF
Finish
Cancel
Figura 21.17
443
rgJ
Library ~me:
~erslon Supported:
ICommon JSF
~==================~
..=,,=a1
L I_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Ubrmy ;!ars
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
l8J
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
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.
- @rg)
Preferences
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
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
-~-~~-
---'--~--
--
446
LEl
----:
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
-.
-.-
.._. __..
..
< Back
11
Next>
II
Finish
JI
Cancel
Figura 21.21
rg)
JSF Capabilities
Add JSF capabmties to this Web Project
JSF Librarles:
lmplementation Library
-"v""'1 1New .. 1
ILJs_F_Im
....:p_<_o_ef_du_lt_> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
CompooenI: Librarles
0-
URL
~no
Patterns:
IFaces Servlet
__~
~
~=====================1
Ja_c_
es_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _----'
ILO.__
1---;;;; -
< Back
Finlsh
1I
Rer;\ve
Cancel
Figura 21.22
--
- --
--
-"
-'
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
"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.
ij
449
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;
if (nome != null) {
for (int i = O; i < nome.length( ); i++)
char c = nome.charAt(i);
if (!Character.isLetter(c) &&
450 llI
new FacesMessage(msg);~
context.addMessage("fonnulario", message);
sucesso = false;
break;
else
sucesso = false;
return (sucesso? "sucesso"
"falha") ;
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
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
</navigation-case>
</navigation-rule>
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
JavaServer Faces
453
trabComJSF.jsp
<%@ page language=Hjava"
contentType="text/html"
pageEncoding="ISO-8859-1"
%>
<~o@
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>
454
</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"%>
455
A PGINA
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">
456
=El
<> ...
111 ~
Ihttp://localhost:8080/TrabComJSF/trabComJSF.faces
=:J I Enviar I
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
INTERNACIONALIZAO
Descrio
Um formulrio HTML
inputText
inputTextarea
inputSecret
inputHidden
outputLabel
outputLink
outputText
outputFormat
commandButlon
commandLink
message
messages
graphiclmage
selectOneListbox
Caixa de listagem
selectOneMenu
Menu de seleo
selectOneRadio
Boto de rdio
selectBooleanCheckbox
Checkbox
selectManyCheckbox
Multiplos checkboxes
selectManyListbox
selectManyMenu
Multi-seleo de menu
panelGrid
panelGroup
dataTable
column
Coluna em um dataTable
460
HTML
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
border
String
cellpadding
String
cellspacing
String
charset
String
O encode de caracteres.
coords
String
dir
String
disabled
boolean
enctype
String
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
onclick
String
ondblclick
String
onfocus
String
onkeydown
String
onkeypress
String
461
Tipo no
Java
String
onmousedown
String
onmousemove
String
onmouseout
String
onmouseover
String
Evento executado quando o ponteiro do mouse est sobre o elemento no lado cliente.
onmouseup
String
onreset
String
Evento somente vlido para formulrios no lado cliente. Executa reiniciando seus valores padro.
onselect
String
onsubmit
String
readonly
boolean
rei
String
Uma lista espaos separada de tipos de links, descrevendo a relao do documento atual e do documento referenciado .
rev
String
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
style
String
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
tabindex
String
target
String
O nome do quadro que devera exibir a resposta resultante do pedido disparado pelo elemento.
title
String
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
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:
Descrio
Cria uma view de nvel superior
subview
facet
attribute
param
actionListener
valueChangeListener
converter
convertDateTime
convertNumber
validator
validateDoubleRange
validateLength
validateLongRange
10adBundle
selectitems
selectitem
verbatim
463
JSF
464
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;
= locale;
FacesContext.getCurrentlnstance( };
UIViewRoot viewRoot = context.getViewRoot( };
viewRoot.setLocale(new Locale(localeld}};
locale = localeld;
JavaServer Faces
[1jjlJ
465
466
<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"
<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>
JavaServer Faces lI
469
<> '::.:/
111 c>
~ P ortugus
N ome
C----- --
----~.~
0.----"]
E-mail i O - j
I Enviar I
Figura 21.25
El
e. src
J 'IC?
El
meupacote
IC? dao
o InterfaceLlvrosDAO.java
: '. [1
UvrariaDAO.java
: "0
LivrariaDAOException.java
" 111
.'0
ConnectionLivraril!FI!ctory. javl!
Livros,jI!va
Figura 21.26
470
~public
DataModel getTodos( )
throws LivrariaDAOException
InterfaceLivrosDAO idao = new LivrariaDAO( ) ;
model =
new ListDataModel(idao.todosLivros( ));C)
return model;
);~
471
472
idao.excluir{livro);
return "sucesso_exc";
473
474
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;
JavaServer Faces
Ill 475
throws ConverterException{
DateFormat df
= null;
String formatado
= df.format(date);
return formatado;
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.
<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 -->
-->
<navigation-rule>
<display-name>mostrarLivros</display- name>
<from-view-id>/mostrarLivros.jsp</from-view-id>
<navigation-case>
478 l\l
<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>
<!--
<!--
480
As Pginas JSF
As pginas JSF sero as responsveis por executar o famoso CRUD da sua
aplicao.
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.
481
menu.jsp
<h:commandLink action="mostrar"
value="Mostrar Livros Cadastrados"/>
</h:form>
</f:view>
</body>
</html>
482
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>
(t
Mostr ar livros X
r--IsBN
Mostrar Livros
Ttulo
Publicad~-~-;fE~cl~~
2007
IExcluir
12006
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>
</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>
JavaServer Faces
487
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>
488
11
Cadastro de Livros
ISBN:
Ttulo:
lo
~====:
Publicao: I
Edio:
~===-----,
D"m.o
Cadastrar )
]
I Limpar ) I Cancelar
v
Figura 21.28
489
faces-config.xm1
<navigation-case>
<from-outcame>editar</from-outcame>
<to-view-id>/atuLivro.jsp</to-view-id>
</navigation-case>
490
I>
</html>
491
492
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"
/>
<h:message for="edicao"l>
<h:message for="descricao"l>
</h :panelGrid>
<h: cormnandButton value="Cadastrar"
action="#{livrosView.create}"
I>
<?
~, l!!!l
./J' Ihttp://localhost:8080/JavaServerFacesDAO/formLvros.faces
Cadastro de LiVl'OS
ISBN:
[:'~=:=====]
Ttulo:
Edio:
lo
Publicao:
D,,,ri,,,
Cadastrar
l:=====~
=======------,
1I
:I
Limpar
1I
Cancelar
Figura 21.29
Observe que as mensagens esto em ingls. Mas e se voc quiser personalizar isso, como fazer?
m. javax.faces
Messllges_de.propertes
Messages_es.properties
MessagesJr.properties
Messages...Pt. propertes
Messages.properties
m. META-INF
Figura 21.30
48
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
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---'
rn=-- -I
I
Publicao:
Descrio:
Cadastrar
I1
Limpar
I[
Cancelar
Figura 21.32
498
faces-config.xml
<application>
<message-bundle>meupacote.util.Messages</message-bundle>
</application>
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
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
(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~
)i@)
{~
FacesMessage message
= new
FacesMessage( };
message.setDetail("ISBN invlido.") i
message.setSwmnary("ISBN invlido.") i
message.setSeverity(FacesMessage.SEVERITY_ERROR};
throw new ValidatorException(message} ;
JavaServer Faces [J
501
502
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
<!--
<validator>
JavaServer Faces Il
503
<validator-id>validaISBN</validator-id>
<validator-class>meupacote.util.ValidaISBN</validator-class>
</validator>
APLICANDO O VALlDADOR
Com a tag JSF <f:validator/> voc configura o validador, chamandoo pela ID configurada no arquivo faces-config.xml, utilizando o atributo
validatorld.
504
= (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>
.cabecalho
text-align: center;
color: #FFF;
background: #999;
.linha_a {
background: #FFF;
.linha_b
background: #CCC;
</style>
JavaServer Faces [J
507
styleClass="tabela"
headerClass="cabecalho"
roWClasses="linha_a, linha_b"
>
- -- - -
--
ISBN
-----~---
--
---
Mostrar Livros
liMo
-- ----- - -
Ex,1uir Li.,o
-- -------
------
2006
IExclUIr
' 2'5"'"'~&~h.ir
[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
2006
Exc1uir
06
E,:c1uir
2006
12c1uir
...m[:ioo6 ----[&cl;;;;:--
Figura 21.33
,.
508 I\l
<style>
.coluna_a {
background:
#ccc;
.coluna_b {
background: #FFF;
</style>
<h: dataTable value=' # {li vrosView. todos}' var=' i tem' border=" 1"
cellpadding="2" cellspacing="O"
styleClass="tabela"
headerClass="cabecalho"
columnClasses="coluna_a, coluna_bIt
>
509
=
11
Figura 21.34
Captulo
22
JavaServer Faces e Hibernate
512
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:
513
JavaServerFacesComHibernate
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
514
Binary Releases
Package
Version
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
~.tenQa~
515
516
Pr opriedades da classe Li vr os
->
517
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]
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>
[1jjlJ
519
520
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;
catch{Throwable t){
throw new ExceptionInInitializerError{t);
l'il 521
Transaction tx
)i
= null;
try {
tx = session.beginTransaction(
)i
)i
catch (HibernateException e) (
e.printStackTrace( );
tx. rollback ( ) i
finally (
session . close(
)i
(E9
= ConnectLivrariaFactory.getlnstance(
Transaction tx = null;
session
try (
tx = session.beginTransaction( );
session.delete(livro) i
tx.commit( );
catch (HibernateException e) (
e.printStackTrace( );
);
523
tx.rollback( )i
finally {
session.close(
)i
{~
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
= session.createQuery("from
)i
Livros") .list( ) i
return listi
INTERFACE UTILIZADA
525
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
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
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
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
11. hibernate-annotations.jar
12. ejb3-persistencejar
528
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;
@Id
@Column(name="isbn")
.~
_.~
--"
--"'---
-~--
~-
530
@Column(name="titulo")
@Column(name="edicao_num")
@Column(name="ano-publicacao")
@Column(name="descricao")
531
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
@Id
@Column
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)
)~
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
lI 533
<!--Nome do usuario-->
<property name="hibernate.connection.username">
edson
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--O arquivo que mapeia a tabela e o Bean Livros-->
Nesse caso, o elemento <mapping/> contm o atributo class que aponta para o Bean Livros, onde contm as anotaes .
o Log4j
534
%m%n
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.
lI 535
LAYOUTS
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 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}.
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).
Quebra de linha.
%%
536 Ill
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
JSF
A classe LivrosController ter a adio de um atributo e de alguns mtodos para que sejam acessveis por suas pginas JSF.
LivrosController.java
538
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
(1'
<;:J
c:>
fi) f:!,)0>
Ihttp://localhost:8080/JavaServerFacesHibernateAnnotationsIbusca.faces v;1
Busca de Livros
Ttulo: Dominando
I Buscar I
Figura 22.4
540
<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>
541
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
544
!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 .
!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 .
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
546
,f-; ' f-D~;';-~d' V~~~ ' 2-Build-25 '-----'- 'r~ce ~rR~~ i~;~;~ iW---<{5= _ : - - lOpao I~sues""""""""_"""",,
!Oownload Verslon 2 Bulld 16
!
'r =
,I ~
~ "ReSOlved Issues
u S l~ d In
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
,.:'
I
Figura 23.3
Accef\ J [ Decline
lI 547
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
o nome: VARCHAR(lOO)
O email: VARCHAR(lOO)
O dt ,",se: DATE
MOS
o -titlJci -; VARCHAR(sQj
O
edicao_run: TINYINT(2)
O ano...P<bicacao : YEAR
O desericao: TEXT
toraJd: rriTEGER
..1.
-li
..L
O
O
O
~bn:
VARCHAR(13) (FK)
INTEGER
INTEGER (FK)
-- -I ~
edti:..no;ne, VAACHR{i(XJ)
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 . .
_Mscimer1o Dele
.norne: gr~
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.
550
[11il]
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")
551
o MAPEAMENTO DA EDITORA
o
Editora.java
package meupacote;
import java.util.Collectioni
import javax.persistence.CascadeTypei
552
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)
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")
554
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;
555
556 riJ
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)
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
557
558
emf.createEntityManager( };
public TestandoQuerys( } (
emf =
Persistence.createEntityManagerFactory("livraria");
II
II
560
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
561
Navlgator
!ti
ta
ta
ta
ta
lRl
Figura 23.6
1.
,
562
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" />
..
~.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.
~
<> < 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
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
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
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.
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);
ll 567
emfi
public LivrosDAO{ ) (
emf =
Persistence.createEntityManagerFactory("livraria"li8
568
finally {
em. close ( ) i
(~
EntityManager em = getEntityManager{ );
try (
em. getTransaction { ) . begin { );
em.merge ( livro) i
)i
ll 569
re t urn q.getResultList( };
finally {
em. close ( ) ;
570
)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.
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.
= 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
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
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
<;:.
c".
liiI
'!.><:;,
!http://localhost:8080/JavaServerFacesComToplink/mostrarLivrosComEditorasEAutores.faces
.~ ~
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
185-7393-495-6 !Base
Figura 23.8
Novos
MTODOS
)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 ( );
paginaAtual=Oi~
){EB
)i
-=
rnaxporpagina;
if (paginaAtual
paginaAtual = O;
<
O) {
<
O) {
return "mostrar" ;
<
O) {
580 l\I
JSF
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}" />
<h:commandLink action="# {livrosView.pPaginaAnterior}"
value="Anterior"
rendered="#{ livrosView.paginaAtual != D}"/>
<h: commandLink action=" # {l i vrosView. pproximapagina} "
value="Prxima"
rendered="# {livrosview. paginaAtual +
livrosView.maxPorPagina<livrosView.total}" />
<h:commandLink action="#{livrosView.pUltimaPagina}"
value="ltima"
rendered=" # {li vrosView. paginaAtual +
livrosView.maxPorPagina<livrosView.total }"/>
582
fi
t40strar livros X
12006
IExcluir
----l
IExcluir
Figura 23.9
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
a)i
584
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
return rnodel;
= O;
585
586
(C)
-= maxporpaginai
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-
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
588 lI
mostrarLivros.jsp
<h: conunandLink action=" # {livrosView. primeirapagina}"
value="primeira"
rendered="#{livrosView.paginaAtual != D}" />
<h:conunandLink ac t ion="#{livrosView . anterior }"
value="Anterior"
rendered="#{livrosView.paginaAtual != D}" />  ;
<h:conunandLink action="#{livrosView .proxima}"
value="Prxima"
rendered=" # {li vrosview . proximaPagina < li vrosview . total}" / >
  ;
<h:conunandLink action="#{livrosView.ultimaPagina}"
value="ltima"
rendered="#{livrosView.proximaPagina< livrosView. total}" />
Captulo
24
AJAX
AJAX [liil)
591
BrowserWeb
r::---
HTML. JavaScript.
CSS. imagens, etc
I -----P-~-i-dO----
HTIP
Servidor Web
,:
~
I
Dados
~==~.
e.oco de Dedos
Dados
requisitados
- _.-.
D
_
Browser 'Neb
HTML, CSS
Chamada do
JavaScript
Ajax
engine
Servidor Web
Dados
Pedido
HTIP
' ~
. ~-.~.~
-
Dados
requisitados
Figura 24.1
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
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 .
lO
TrabComA)4xSemFramework
...
~ Deployment Descriptor: TrabComAjax5emFramework -
[[) Autores.java
meupacote.controller
EE [[) AutoresController.java
8
meupacote .web
Itl [[) ServletAjax.java
8 i' META-INF
persistence .xml
. !!I\ Lbraries
til
i' WebContent
EE i' META-INF
ill i' WE8 INF
index ,html
Figura 24.2
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");
AJAX ~
em.persist(autor);
em. getTransaction ( ) .commit( ) ;
catch (Exception ex)
em . getTransaction ( ) .rollback( );
finally {
em . close ( );
595
5 96
EntityManager em = getEntityManager( );
try{
Query q
em.createQuery( "select a from Autores a");
return q.getResultList( );
finally {
em. close ( );
Esta classe no ser explicada, pois se trata de situaes j conhecidas no desenvolvimento de exemplos vistos em captulos anteriores.
<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
CRIANDO O SERVLET
String dados="" i
try{
List autoresList = ( List ) listarAutores (
for( Iterator i=autoresList.iterator(
Autores a = ( Autores )i.next(
)i
)i
i.hasNext(
)i
)i
){
AJAX
l\J 599
PGINA
ac = new AutoresController( );
ac.todosAutores();
HTML
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
<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. ');
601
AJAX l\I
,,~
Trazer Dados
Ihttp://localhost:8080/TrabComAjaxSemFramework/index.html#
\~I ~
l8J
OK
Figura 24.3
.,
I_
__
rO
0&
...
~.
_~~
__
--'
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"
);
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
AJAX Ill
605
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
606
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
null;
DateFormat dateFormat =
new SimpleDateFormat ("MJ.If/dd/yyyy") i
long timestamp
dataF
= dateFormat.parse(data).getTime(
--
._,..--------"----~----_.,
----'-~
)i
if(!nascimento.equals(""}}{
data = strToDate(nascimento);
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" >
Ilnada aqui
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.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
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.
!Ioftl
~
AJAX [il]
613
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
614
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
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)
(~
x.onSubmit = function(form) {
if(form.nome.value == "
)(
return truei
}
dojo.addOnLoad(doPost)i~
615
616
</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 >
AJAX [jIJ
617
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
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
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.
DWR
WAR File:
dWtr
dw. or
(1 .3Mb)
Sources:
clwr-2.0.rc l -src.zip
(17. 72Mb)
JAR File:
Figura 24.4
CRUD
COM AJAX E
DWR
620 I\l
Navigator
13 li;;> TrabComDWR
cA..
. (t) ..
Deployment Descriptor: Tr abComDWR
'h
s mmeupacote
i
ffi [l)
Autores ,java
$ m meupacote.controller
(j:J... [l) AutoresController. java
S m meupacote.dwr
I;l
, r.e\ libraries
{j:J . (2:; build
, :. Illil
.pJ
. ' . $J script. js
S (2:; WEB-INF
; .(C, lib
lRl
dwr ,xml
web,xml
index,jsp
(!J
.@J
Figura 24.S
import java.util.Date;
import java.util.List;
import meupacote.controller.AutoresController;
import meupacote.Autores;
AJAX
l\l 621
622
= new
AutoresController( );
return ac.todosAutores( );
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>
624
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>
<> ,
111
<!;),
Ihttp://localhost:8080/TrabComOWR/dwr/index.html
",' , ~
Figura 24.6
type-'text/javascript'
~rc-'/TrabComDWR/dwr/engine.j~'></script>
~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
627
AJAX
o mesmo
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.....-
_-' ____
&_
......
__
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) {
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
];
this.atual = numero;
DWRUtil.setValue( 'pagin~.tual' ,
'Pgina '+(this.atual+l)+' de
'+this.numeroPaginas ) ;
Paginacao.first
function ( ) {
AJAX l)il]
631
Paginacao.refresh = function( ) (
Paginacao.view = function( ) (
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) (
Paginacao.refresh( ) ;
632
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
634 l'iI
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
636 !Iil
I>
I>
<br
I>
I>
I>
I>
<span id="msg"></span>
I>
<br I>
<br
I>
</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.last( );"
style="cursor:pointer" I>
</tfoot>
</table>
</body>
</html>
637
638
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>
AJAX [Iijl]
639
<?
,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
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
AJAX [)il]
641
Binary Distribution
Figura 24.9
642
co
Project Explorer ~
13- ~ TrabComAjax4jsF
Gil \~ Oeployment Oescriptor: TrabComAjax4jsf
~I
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
AJAX I\l
private Autores autor
new Autores ( );
novoAutor( );
return "OK";
643
644
FacesContext.getCurrentlnstance( ).
addMessage(null, new FacesMessage(msg)) i
return model;
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
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>
--~----
- .......... -._-
<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>
648
(1iil]
<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
<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>
= Ell
.';:.> 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
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 .
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 .
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.
655
Armazenamento
Extenso
float
4 bytes
double
8 bytes
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
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;
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
Tabela A.4
Nome
Descrio
@author
@since
@version
@see
@param
Parmetro de um mtodo
@return
Retorno de um mtodo
@throws
@deprecated
Operadores
A linguagem Java oferece um conjunto muito amplo relacionado a operadores destinados a realizar operaes aritmticas, lgicas, relacionais ou
de atribuio.
Significado
Exemplo
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
659
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
Significado
Exemplo
&&
E lgico (and)
a&& b
II
OU lgico (or)
allb
No (not)
la
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
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
>
Integer.parselnt( args[l)
} }(
lI 661
else(
System.out.println("O valor inicial igual ao valor
final") ;
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;
Para compilar:
shell# javac EstruturaDeControleSWitch.java
Para executar:
shel1# java EstruturaDeControleSWitch 1
663
EstruturaDeControleFor.java
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
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
665
Para compilar:
shell# j avac EstruturaDeControleDoWhile. j ava
Para executar:
shell# j ava EstruturaDeControleDoWhile
public class
EstruturaTryCatch
catch(ArraylndexOutOfBoundsException erro} {
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
667
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
int metodoDois( )(
int valorl=lO,valor2=13;
int total = valorl*valor2;
return 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.
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
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.
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
protected
No aplicvel
default
Somente pacote
abstract
No instncia
No aplicvel
final
Sem herana
CONSTANTE
static
No aplicvel
native
No aplicvel
No aplicvel
transient
No aplicvel
No aplicvel
Cache
synchonized
No aplicvel
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:
~
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
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
WEB-INF/
classes/
lib/
No Diretrio WEB-INF
No diretrio WEB-INF adicione o arquivo web.xml:
676 llI
web.xml
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:
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 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
.- - ..
.. ....
Apndice
C
Trabalhando com Datas
Tabela C.1
Significado
Smbolo
Exemplo
Apresentao
Era
(Text)
AO
ano
(Number)
1996
Ms no ano
July & 07
Dia no ms
(Number)
10
(Number)
12
(Number)
minute in hour
(Number)
30
segundos
(Number)
55
milissegundos
(Number)
978
(Text)
Tuesday
680
Significado
Exemplo
Apresentao
Dia em um ano
(Number)
189
Dia da semana no ms
(Number)
Semana no ano
(Number)
27
Semana no ms
(Number)
am/pm
(Text)
PM
Hora (1-24)
(Number)
24
(Number)
time zone
(Text)
681
.. .. ..
a
Apndice
1.)
OXHTML
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
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.
links,
</body>
</html>
686
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>
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>
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
/>
690
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
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
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
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>
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>
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
Agrupando Opes
<optgroup / >
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
sero exibidos.
ROWS
Com esse atributo voc tem a quantidade de linhas que sero exibidas.
WRAP
Rtulos
<label />
698
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 XHTML
[)jI]
699
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>
700
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
Tecla de Acesso
ACCESSKEY
No caso acima, voc pode colocar o foco no componente apenas pressionando a tecla ALT em conjunto com a tecla m .
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''>
o XHTML
703
Dado ao fato de que XHTML uma aplicao XML, certas prticas que
so legais em HTML 4 baseado em SGML [HTML4] devem ser modificadas.
o XHTML
705
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
.. ..a a..
Apndice
E
o MySQL
.'
Vl
RI
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
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
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
~
~
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
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;
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
Criando Tabelas
Criar tabela no MySQL uma tarefa relativamente fcil. Para se criar uma
tabela basta usar a seqncia:
shell>mysql -u root
nome VARCHAR(lOO),
dt_nasc DATE);
O Comando SHOW
Assim que criada sua primeira tabela. Para ver o resultado digite a seqncia:
LIVRARIA;
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
o comando
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 MySQL
lI 715
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.
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);
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
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,
o MySQL [IilJ
717
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
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
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
_.
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)
DOUBLE(lnteiro,Decimal)
DECIMAL(lnteiro,Decimal)
.~.
. --
-'
.&.
_.
720
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 (
->
->
) 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
o outro grupo
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
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.
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
Intervalo
Descrio
DATE
1000-01-01 a 9999-12-31
TIME
-838:59:59 a 838:59:59
DATETIME
1000-01-01 00:00:00 a
9999-12-31 23 :59:59
TIMESTAMP[(F)]
1970-01-01 00:00:00
YEAR[(214)]
70-69 (1970-2069)1901-2155
como
Tipos aplicveis
AUTO INCREMENT
BINARY
CHAR,VARCHAR
DEFAULT
NOT NULL
Todos os tipos
NULL
Todos os tipos
PRIMARYKEY
Todos os tipos
UNIQUE
Todos os tipos
UNSIGNED
Tipos numricos
ZEROFILL
Tipos numricos
o MySQL
ll 725
Comando INSERT
-> '85-7585-120-5',
->'Core Java Fundamental',
-> 6,
->'2004',
->'Desenvolva Java com vrios exemplos');
inseridos 2'),
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;
todas as colunas
726
[1jjlJ
A Clusula WHERE
Com a clusula WHERE voc filtra infonnaes de acordo com a condio
passada:
mysql>SELECT
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
>
maior que
Quantidade> 50
<
menor que
Quantidade < 50
>=
maior ou igual a
Quantidade >= 50
<=
menor ou igual a
Quantidade <= 50
!= ou <>
diferente de
Quantidade !=O
IN
cidade in ('So
Paulo', 'Minas
Gerais')
NOTIN
cidade not in
('So Paulo',
'Minas Gerais')
ISNOT
Endereo no
nulo
IS NULL
Endereo nulo
promocao is null
BETWEEN
Quantidade entre
um valor e outro
valor BETWEEN
200 ANO 350
o MySQL
727
LlMIT
Funo que limita resultados exibidos na tela.
SELECT
* FROM
tabela LIMIT 2;
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;
~ Em caso de fazer a contagem em ca mpo de valor NULL a con~ ta gem ser diferente da no valor tota l.
728
ORDER BV
Ordena os resultados de acordo com a coluna estabelecida (crescente ou
decrescente) :
SELECT
* FROM
* FROM
LlKE
Usado para filtrar dados em uma coluna que armazena strings (varchar,
text e etc . . .). Sua sintaxe como mostrada a seguir:
mysql> SELECT
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
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 ';
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';
730
[1iilJ
O QUE UMA
CHAVE?
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
INDEX) nome_do_ndice
(nome_da_coluna [, ... ] ) ,.
ALTER TABLE nome_tabela ADD PRlMARY KEY nome_do_ndice
(nome_da_coluna [, ... ]) ,.
(nome_da_coluna [, ... J) ,.
CREATE PRlMARY KEY ON nome_tabela (nome_da_coluna, ... ),.
NOT
732
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.
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 .
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)
734
on livraria.*
->
Revogando Privilgios
Para revogar esse privilgio voc deve fazer o seguinte comando:
mysql> revoke all
->
on livraria. *
--
o MySQL l)jl)
Bibliografia
REFERNCIAS
INTERNACIONAIS
735
736 I\l
REFERNCIAS NACIONAIS
Dominando Eclipse
Autor: Edson Gonalves
326 pginas
ISBN : 85-7393-486-7
para desktops .
Crie aplicaes rapidamente utilizando o Visual Editor, o plug-in mais utilizado
para o
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.
~~ EDITORA
,,~
EDITORA