Você está na página 1de 142

Java

Aplicaes
Web

Paulo Henrique Cayres


A RNP Rede Nacional de Ensino
A RNP Rede
e Pesquisa Nacional de Ensino
qualificada como
e Pesquisa
uma qualificada
Organizao Social como
(OS),
uma
sendoOrganizao Social (OS),
ligada ao Ministrio da
sendo ligada ao Ministrio da
Cincia, Tecnologia e Inovao
Cincia,
( M C T I ) Tecnologia
e r e s p o n s e vInovao
el pelo
(Programa
M C T I ) e Interministerial
responsvel p elo
RNP,
Programa Interministerial
que conta com a participaoRNP,
dos
que
ministrios da Educao (MEC),dos
conta com a participao da
ministrios
Sade (MS)dae Educao (MEC),
da Cultura da
(MinC).
Sade (MS)
Pioneira no e da Cultura
acesso (MinC).
Internet no
Pioneira no acesso
Brasil, a RNP planeja eInternet
mantmno
a
Brasil, a RNP planeja e mantm
rede Ip, a rede ptica nacional a
rede Ip, a de
acadmica rede
altoptica nacional
desempenho.
acadmica
Com Pontos de de
altoPresena
desempenho.nas
Com Pontosdade
27 unidades Presena
federao, nas
a rede
27
temunidades
mais deda 800
federao, a rede
instituies
tem mais So
conectadas. de aproximadamente
800 instituies
conectadas. So
3,5 milhes de aproximadamente
usurios usufruindo
3,5
de milhes de usurios usufruindo
uma infraestrutura de redes
de uma infraestrutura de redes
avanadas para comunicao,
avanadas
computaopara comunicao,
e experimentao,
computao
que contribuiepara
experimentao,
a integrao
que
entrecontribui parade
o sistema a integrao
Cincia e
entre
Tecnologia, Educao Cincia
o sistema de e
Superior,
Tecnologia, Educao Superior,
Sade e Cultura.
Sade e Cultura.
Java
Aplicaes Web

Paulo Henrique Cayres


Java
Aplicaes Web

Paulo Henrique Cayres

Rio de Janeiro
Escola Superior de Redes
2017
Copyright 2017 Rede Nacional de Ensino e Pesquisa RNP
Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ

Diretor Geral
Nelson Simes

Diretor de Servios e Solues


Jos Luiz Ribeiro Filho

Escola Superior de Redes

Coordenao
Leandro Marcos de Oliveira Guimares

Edio
Lincoln da Mata

Coordenador Acadmico da rea de Desenvolvimento de Sistemas


John Lemos Forman

Equipe ESR (em ordem alfabtica)


Adriana Pierro, Alynne Pereira, Celia Maciel, Edson Kowask, Elimria Barbosa, Evellyn Feitosa,
Felipe Nascimento, Lourdes Soncin, Luciana Batista, Luiz Carlos Lobato, Renato Duarte
e Yve Marcial.

Capa, projeto visual e diagramao


Tecnodesign

Verso
1.1.0

Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encon-
trado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de
contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e
Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a
pessoas ou bens, originados do uso deste material.
As marcas registradas mencionadas neste material pertencem aos respectivos titulares.

Distribuio
Escola Superior de Redes
Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ
http://esr.rnp.br
info@esr.rnp.br
Sumrio

1. Soquets
Exerccio de nivelamento Soquets1

Protocolos de comunicao1

Soquetes3

Socket TCP (stream)6

Socket UDP6

Raw Sockets6

Conexes6

Implementao de soquetes TCP8

Implementao do socket servidor8

Implementao do socket cliente9

Sockets UDP10

Multicast13

Raw Sockets15

Exerccios de fixao Socket16

2. RMI Remote Method Invocation


Introduo17

Arquitetura RMI20

Implementao de uma Aplicao RMI21

Executando uma aplicao RMI25

Exerccios de fixao RMI26

iii
3. Applets
Exerccio de nivelamento Applets27

Introduo27

Ciclo de vida de um applet29

Um primeiro exemplo de applet30

A classe applet30

Executando um applet31

Uso de parmetros em applets34

Converso de aplicao em applet35

Manipulao de eventos no applet36

Outros mtodos disponveis para um applet37

Restries de segurana40

4. Servlets
Definio41

Arquitetura Servlets42

Um exemplo de Servlet43

Estrutura de uma aplicao web46

Arquivo web.xml47

Executando um Servlet47

Servlet com passagem de parmetros48

Exerccios de fixao Servlets50

Atividades Prticas50

5. JSP (Java Server Pages)


Introduo51

Elementos sintticos52

Diretivas53

Aes54

Elementos de script54

Exemplos JSP56

Objetos implcitos57

iv
Objeto page59

Objeto config60

Objeto request61

Objeto response62

Objeto session65

Objeto application66

Objeto pageContext67

Objeto exception69

Exerccios de fixao JSP70

Atividades Prticas 70

6. JSP e banco de dados


JDBC 71

Padronizando a conexo ao BD74

DAO e JavaBean75

Arquitetura MVC78

Definio da interface grfica com o usurio78

Exemplo JSP Listagem geral81

Exemplo JSP Excluso82

Exemplo JSP alterao82

Ferramenta de relatrio JasperReport84

Exerccios de fixao JSP e banco de dados86

7. Taglib e JSTL
Taglib 87

JSTL90

Estrutura JSTL91

Expression Language92

Core taglib93

Sada bsica94

Acesso a parmetros94

Manipulao de variveis95

Deciso simples95

Deciso mltipla96

v
Repetio96

Tokenizao97

Incluso de pginas (import, redirect e catch)97

Internacionalizao97

Internacionalizao98

Formatao98

SQL99

SQL com DAO100

Exerccios de fixao Taglib e JSTL100

8. Cookie e session
Cookies101

Session105

Exerccio de fixao Cookie e session108

9. Javabeans
Componentes de software109

JavaBeans110

Criando um JavaBean113

JavaBeans no IDE (Netbeans)115

JSP com JavaBeans116

Exerccio de fixao JavaBeans120

10. Deployment de aplicao Java Web


Apache Tomcat121

Deployment123

Deployment de arquivo WAR123

Deployment automtico do arquivo WAR124

Deployment manual124

Exerccios de fixao Deployment125

vi
Escola Superior de Redes
A Escola Superior de Redes (ESR) a unidade da Rede Nacional de Ensino e Pesquisa
(RNP) responsvel pela disseminao do conhecimento em Tecnologias da Informao
e Comunicao (TIC).

A ESR nasce com a proposta de ser a formadora e disseminadora de competncias em


TIC para o corpo tcnico-administrativo das universidades federais, escolas tcnicas e
unidades federais de pesquisa. Sua misso fundamental realizar a capacitao tcnica
do corpo funcional das organizaes usurias da RNP, para o exerccio de competncias
aplicveis ao uso eficaz e eficiente das TIC.

A ESR oferece dezenas de cursos distribudos nas reas temticas: Administrao e Pro-
jeto de Redes, Administrao de Sistemas, Segurana, Mdias de Suporte Colaborao
Digital e Governana de TI.

A ESR tambm participa de diversos projetos de interesse pblico, como a elaborao


e execuo de planos de capacitao para formao de multiplicadores para projetos
educacionais como: formao no uso da conferncia web para a Universidade Aberta do
Brasil (UAB), formao do suporte tcnico de laboratrios do Proinfo e criao de um con-
junto de cartilhas sobre redes sem fio para o programa Um Computador por Aluno (UCA).

A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na
aprendizagem como construo do conhecimento por meio da resoluo de problemas
tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de
natureza terico-prtica so otimizados, pois o instrutor, auxiliado pelo material did-
tico, atua no apenas como expositor de conceitos e informaes, mas principalmente
como orientador do aluno na execuo de atividades contextualizadas nas situaes do
cotidiano profissional.

A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema


semelhantes s encontradas na prtica profissional, que so superadas por meio de an-
lise, sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo
do problema, em abordagem orientada ao desenvolvimento de competncias.

Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno
para as atividades em laboratrio. At mesmo a apresentao da teoria no incio da ses-
so de aprendizagem no considerada uma simples exposio de conceitos e informa-
es. O instrutor busca incentivar a participao dos alunos continuamente.

vii
As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das
atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas
de estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de
atuao do futuro especialista que se pretende formar.

As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de


tempo para as atividades prticas, conforme descrio a seguir:

Primeira etapa: apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos).


O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema
da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor
levanta questes sobre o contedo dos slides em vez de apenas apresent-los, convidando
a turma reflexo e participao. Isso evita que as apresentaes sejam montonas e que
o aluno se coloque em posio de passividade, o que reduziria a aprendizagem.

Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos).


Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assn-
crona e realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades
proposto no livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar
dvidas e oferecer explicaes complementares.

Terceira etapa: discusso das atividades realizadas (30 minutos).


O instrutor comenta cada atividade, apresentando uma das solues possveis para
resolv-la, devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so
convidados a comentar as solues encontradas e o instrutor retoma tpicos que tenham
gerado dvidas, estimulando a participao dos alunos. O instrutor sempre estimula os
alunos a encontrarem solues alternativas s sugeridas por ele e pelos colegas e, caso
existam, a coment-las.

Sobre o curso
O curso tem como principal caracterstica a prtica em laboratrio para desenvolvimento
de aplicaes em Java voltadas para a web/internet. So abordados desde o uso de sockets
e RMI, passando pela utilizao de applets, servlets e JSP (incluindo a manipulao de
banco de dados com JSP) at a implementao do gerenciamento de sesses e uso de
cookies. So abordados ainda a TagLib e JSTL, finalizando com o processo de Deployment
de aplicaes em servidores Web.

A quem se destina
O curso destina-se aos desenvolvedores de sistemas que j tenham conhecimentos relacio-
nados com programao em Java e que queiram aprender funcionalidades e tcnicas espec-
ficas para o desenvolvimento de aplicaes que iro funcionar na web/internet. um curso
de nvel intermedirio que demanda um bom conhecimento dos fundamentos da linguagem
Java e prtica de programao.

viii
Convenes utilizadas neste livro
As seguintes convenes tipogrficas so usadas neste livro:

Itlico
Indica nomes de arquivos e referncias bibliogrficas relacionadas ao longo do texto.

Largura constante

Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da


sada de comandos.

Contedo de slide
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.

Smbolo
Indica referncia complementar disponvel em site ou pgina na internet.

Smbolo
Indica um documento como referncia complementar.

Smbolo
Indica um vdeo como referncia complementar.

Smbolo
Indica um arquivo de adio como referncia complementar.

Smbolo
Indica um aviso ou precauo a ser considerada.

Smbolo
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao
entendimento do tema em questo.

Smbolo
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou
mesmo uma observao.

Permisses de uso
Todos os direitos reservados RNP.

Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra.
Exemplo de citao: TORRES, Pedro et al. Administrao de Sistemas Linux: Redes e Segurana.
Rio de Janeiro: Escola Superior de Redes, RNP, 2013.

ix
Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao:
Escola Superior de Redes RNP
Endereo: Av. Lauro Mller 116 sala 1103 Botafogo
Rio de Janeiro RJ 22290-906
E-mail: info@esr.rnp.br

Sobre os autores
Paulo Henrique Cayres possui graduao no curso Superior de Tecnologia em Proces-
samento de Dados pela Universidade para o Desenvolvimento do Estado e da Regio do
Pantanal (UNIDERP), especializao em Anlise de Sistemas pela Universidade Federal de
Mato Grosso do Sul (UFMS) e mestrado em Cincias da Computao pela Universidade Fede-
ral do Rio Grande do Sul (UFRGS). Atuou como coordenador curso de Bel. em Sistemas de
Informao e Superior de Tecnologia em Redes de Computadores na Faculdade da Indstria
do Sistema FIEP, onde tambm coordenou as atividades do SGI - Setor de Gesto de Informa-
es. Atualmente coordenador do Ncleo de Educao a Distncia - NEaD da Faculdade da
Indstria do Sistema FIEP. Scio-diretor da CPP Consultoria e Assessoria em informtica Ltda.
Tem experincia na rea de Cincia da Computao, com nfase em Engenharia de Software,
atuando principalmente nos seguintes temas: linguagens de programao, engenharia de
software, modelagem de sistemas, desenvolvimento de aplicaes para web e gerncia de
projetos. Professor titular em cursos de graduao e ps-graduao ministrando disciplinas
de desenvolvimento de sistemas desde 1995. Instrutor de treinamento na linguagem Java de
programao junto ao CITS em Curitiba e na ESR-RNP.

John Lemos Forman Mestre em Informtica (nfase em Engenharia de Software) e


Engenheiro de Computao pela PUC-Rio, com ps-graduao em Gesto de Empresas pela
COPPEAD/UFRJ. vice-presidente do Sindicato das Empresas de Informtica do Rio de Janeiro
TI RIO, membro do Conselho Consultivo e de normas ticas da Assespro-RJ e Presidente
do Conselho Deliberativo da Riosoft. scio e Diretor da J.Forman Consultoria e atua como
especialista em desenvolvimento de sistemas para a Escola Superior de Redes da RNP.
Acumula mais de 30 anos de experincia na gesto de empresas e projetos inovadores, com
destaque para o uso das Tecnologias da Informao e Comunicao na Educao, Sade e
Gesto Pblica e Privada. Mais recentemente vem desenvolvendo projetos que fazem uso de
Cincia de Dados e Aprendizagem de Mquina (Machine Learning).

x
1
objetivos
Soquets
Apresentar aos alunos o processo de desenvolvimento de aplicaes distribudas por
meio de comunicao via socket entre programas cliente utilizando a linguagem de
programao Java.

conceitos
Protocolos de comunicao; Modelo OSI; TCP/IP; Socket TCP (stream); Socket UDP,
Raw Socket; Conexes; Portas e MultiCast.

Exerccio de nivelamento e
Soquets
Voc j desenvolveu aplicaes distribudas? Que recurso e/ou linguagem de programao
voc j utilizou para desenvolvimento?

Protocolos de comunicao
Utilizado para tratar detalhes da camada de comunicao. q
11 Entre aplicaes.

Tipos de protocolos de aplicao.

11 FTP, SMTP, DNS, HTTP e TCP/IP.

Implementados via processos.

11 Interagem usando o modelo cliente-servidor.

11 Usam os servios da camada de transporte.

11 Interagem por meio de APIs.

Para que exista comunicao em rede, faz-se necessrio o uso de um protocolo de comuni-
cao. Um protocolo funciona como linguagem entre computadores em rede e para validar
essa comunicao preciso que os computadores utilizem o mesmo protocolo.

Existem diversos tipos de protocolos, tais como FTP, SMTP, DNS, HTTP e TCP/IP.

Camada de aplicao. q
Captulo 1 - Soquets

11 Implementada por meio de processos.

22 Representao para programas em execuo no SO.

11 Arquitetura TCP/IP.

22 Uma aplicao apenas um programa em execuo.

22 Padro de interao denominado modelo cliente-servidor.

1
11 Demais camadas. q
22 Implementadas diretamente no kernel do SO.

Modelo de Referncia OSI

Aplicao

Apresentao

Sesso

Transporte

Rede

Enlace de dados Figura 1.1


Representao
do modelo de
Fsica Referncia OSI.

O TCP/IP , na realidade, um conjunto de protocolos. Os mais conhecidos do justamente o


nome desse conjunto: TCP (Transmission Control Protocol, Protocolo de Controle da
Transmisso) e IP (Internet Protocol), que operam nas camadas de transporte e internet,
respectivamente.

O TCP/IP atualmente o protocolo mais usado em redes locais. Isso se deve, basicamente,
popularizao da internet. Uma das grandes vantagens do TCP/IP em relao aos outros
protocolos existentes que ele rotevel, isto , foi criado pensando em redes grandes e de
longa distncia, onde pode haver vrios caminhos para o dado atingir o computador receptor.

TCP-IP: q
11 Protocolo mais usado em redes locais.

22 Popularizao da internet.

22 Protocolo rotevel > redes grandes e de longa distncia.

22 Arquitetura aberta.

11 Servidor escolhe uma determinada porta e fica aguardando conexes.

22 No precisa conhecer a porta utilizada pelo cliente.

22 Descobre a porta somente aps receber a requisio.

11 O cliente deve saber previamente qual a mquina servidora (HOST ou IP) e a porta
que o servidor est aguardando conexes para solicitar uma conexo.

Outro fato que tornou o TCP/IP popular que ele possui arquitetura aberta e qualquer fabri- lTodos os fabricantes
cante pode adotar a sua prpria verso de TCP/IP em seu Sistema Operacional. de Sistemas Operacio-
nais adotaram o TCP/IP,
Na transmisso de dados com o protocolo TCP/IP, este divide as informaes que sero
JAVA Aplicaes Web

transformando-o em
transmitidas atravs da rede em pacotes de dados. Todo pacote que for enviado do servidor um protocolo universal,
possibilitando que
para o cliente, ou vice-versa, ter, alm dos dados que esto sendo enviados, uma srie de
todos os sistemas
dados de controle, tais como o nmero do pacote, cdigo de validao dos dados e tambm o possam comunicar-se
nmero da porta que o software utiliza. Quando o pacote chega a seu destinatrio, o sistema entre si sem dificul-
dade.
l no pacote o nmero da porta e sabe para qual aplicativo vai encaminhar o pacote. Esses
controles so conferidos ao chegarem outra ponta, pelo protocolo do receptor.

2
Isso garante que um dado qualquer chegue a outro ponto da mesma forma que foi transmi-
tido. Sendo assim, a integridade dos dados mantida, independente do meio utilizado na
transmisso, seja ele por linha telefnica, canal de dados, canais de voz, satlite ou qualquer
outro meio de transmisso, j que o controle feito nas pontas. Se na transmisso ocorre
algum erro, o protocolo deve envi-los novamente at que cheguem corretamente.

Portas Portas

2001 2002 2001 2002


Network
Server

2003 2004 2003 2004 Client

Figura 1.2 O servidor fica em um loop aguardando novas conexes e gerando sockets para atender as
Servidores, clientes solicitaes de clientes. Os segmentos TCP so encapsulados e enviados em pacotes de dados.
e portas.
Uma forma de visualizar o funcionamento de socket TCP seria compar-lo a uma ligao
telefnica onde algum faz uma ligao para outra pessoa e, quando essa atende, criado
um canal de comunicao entre os dois falantes.

Soquetes
Essencialmente uma conexo de dados transparente entre dois computadores q
em uma rede.

11 Um dos computadores chamado servidor.

22 Abre um socket e presta ateno s conexes.

11 Demais computadores denominam-se clientes.

22 Chamam o socket servidor para iniciar a conexo.

Um socket uma representao interna do SO para um ponto de comunicao.

11 Identificado pelos endpoints local e remoto.

11 Utilizados para representar a comunicao entre um programa cliente e um pro-


grama servidor.

As aplicaes de sockets so feitas baseadas no protocolo TCP/IP.

Cada endpoint representado pelo par: IP e porta.

Primeiro o socket do servidor aberto e fica monitorando as conexes, depois o socket do


cliente chama o socket do servidor para iniciar a conexo.
Captulo 1 - Soquets

Figura 1.3
Interface Socket.

3
As operaes em rede envolvem a capacidade de estabelecer conexes do aplicativo cliente
ou aplicativo servidor atravs da rede. Essas operaes na tecnologia Java envolvem as
classes do pacote java.net, que oferecem abstraes entre plataformas para operaes
comuns em rede, como a conexo e recuperao de arquivos utilizando protocolos comuns
da web e criando soquetes bsicos como os do UNIX (tm).

Originalmente proposta para sistema Unix e linguagem C. q


Passou a ser amplamente utilizada.

Exemplos:

11 Winsocket em SO Windows.

11 Socket, DatagramSocket, ServerSocket.

22 Classes Java.

Quando os processos se comunicam por uma rede, a linguagem Java utiliza novamente o
modelo de fluxos. Nesse caso, um soquete contm dois fluxos: um de entrada e outro de
sada. Um processo envia dados para outro processo atravs da rede simplesmente gra-
vando no fluxo de sada associado ao soquete. O processo l os dados que foram gravados
pelo processo na outra extremidade da conexo pela simples leitura do fluxo de entrada
associado ao soquete. A figura 1.4 apresenta a hierarquia de classes do pacote java.net.
JAVA Aplicaes Web

4
java.lang ContentHandler java.net

DatagramPocket

DatagramSocket MulticastSocket

Object
DatagramSocketImpl
ContentHandlerFactory
InetAddress
SocketImplFactory
ServerSocket
URLStreamHandlerFactory
Socket
FileNameMap
java.io
SocketImpl

Serializable URL

URLConnection HttpURLConnection

URLEncoder

URLStreamHandler

MalformedURLException
IOException

ProtocolException BindException

SocketException ConnectException

UnknownHostException NoRouteToHostException

UnknownServiceException

KEY CLASS ABSTRACT CLASS FINAL CLASS extends


Captulo 1 - Soquets

INFREQUENTLY USED implements


INTERFACE

Figura 1.4
Hierarquia de
classes pacote
java.net.

5
Os computadores em rede direcionam os streams de dados recebidos da rede para pro-
gramas receptores especficos, associando cada programa a um nmero diferente, que a
porta do programa. Da mesma forma, quando o trfego de sada gerado, o programa de
origem recebe um nmero de porta para a transao. Determinados nmeros de porta so
reservados no TCP/IP para protocolos especficos, por exemplo, 80 para HTTP.

O protocolo TCP/IP oferece os seguintes modos de utilizao de sockets:

11 Socket TCP (stream): modo orientado a conexo, que funciona sobre o protocolo TCP.

11 Socket UDP: modo orientado a datagrama, funciona sobre o protocolo UDP, que fica na
camada de transporte do protocolo TCP/IP.

11 Raw Socket: forma mais rstica que faz uso do Internet Control Message Protocol (ICMP).
Essa interface de socket no fornece servio ponto-a-ponto tradicional.

Socket TCP (stream)


O processo de comunicao entre aplicativos no modo orientado conexo ocorre da
seguinte forma: o servidor escolhe uma determinada porta e fica aguardando conexes
dessa porta. O cliente deve saber previamente qual a mquina servidora (HOST ou IP) e a
porta que o servidor est aguardando conexes para solicitar uma conexo.

Socket UDP
O User Datagram Protocol (UDP) usado por alguns programas, em vez de TCP para o trans-
porte rpido de dados entre HOSTS dentro de uma rede TCP/IP. Em UDP no se estabelece
conexo, pois a comunicao ocorre apenas com o envio de dados. Nesse tipo de socket,
uma mensagem um datagrama, que composto por um remetente, um destinatrio ou
receptor e a mensagem. Caso o destinatrio no esteja aguardando uma mensagem, ela
perdida, pois esse protocolo no realiza a verificao de transmisso de dados.

Raw Sockets
Envia o pacote sem utilizar as camadas de transporte. Como foi visto anteriormente, usada
de forma mais rstica na camada de rede (IP) e na Internet Control Message Protocol (ICMP).
Essa interface de socket no fornece servios ponto-a-ponto tradicional.

Conexes
Para que seja efetuada a comunicao em rede atravs de sockets, necessrio ter conheci-
mento do nmero de IP ou HOST do computador e o nmero de porta do aplicativo ao qual
se quer realizar a conexo.

O endereo IP identifica uma mquina especfica na internet e o nmero de porta uma maneira
de diferenciar os processos que esto sendo executados no mesmo computador. exatamente a
combinao do IP com o nmero de porta do aplicativo que se denomina sockets.

Aps a conexo ser estabelecida, utilizar os fluxos associados a essa conexo no muito
JAVA Aplicaes Web

diferente de utilizar qualquer outro fluxo, como mostra a figura 1.5.

6
Figura 1.5 Socket Socket
Comunicao
Server Network
cliente/Servidor
via socket.
Client

Para estabelecer a conexo, uma mquina deve estar executando um programa que
aguarda a conexo e a outra extremidade deve tentar alcanar a primeira. Tal como um
sistema de telefonia, uma parte deve efetuar a chamada enquanto a outra parte deve
aguardar junto ao fone quando a chamada efetuada, conforme ilustrado na figura 1.6.

Ao efetuar uma ligao telefnica, necessrio conhecer o nmero a ser discado. Ao estabe-
lecer uma conexo de rede, necessrio conhecer o endereo ou o nome da mquina remota.
Alm disso, uma conexo de rede exige o nmero de uma porta, que voc pode associar a
um ramal. Aps conectar-se ao computador apropriado, necessrio identificar um objetivo
em particular para a conexo. Portanto, da mesma forma que voc utiliza um determinado
nmero de ramal para conversar com o departamento de contabilidade, possvel utilizar um
determinado nmero de porta para se comunicar com o programa de contabilidade.

Portas Portas

2001 2002 2001 2002


Network
Server

2003 2004 2003 2004 Client

q
Figura 1.6
Estabelecimento Nmeros de porta em sistemas TCP/IP.
de conexo.
11 So nmeros de 16 bits, no intervalo de 0-65535.

11 Nmeros de porta a seguir de 1024 so reservados para servios predefinidos.

22 No devem ser utilizados, a menos que deseje se comunicar com um desses ser-
vios (p.e., TELNET, correio SMTP, FTP e outros).

necessrio que os dois programas cheguem a um acordo com antecedncia, tanto o


cliente que inicia a conexo quanto o servidor que aguarda o telefonema. Se os nmeros
de porta utilizados pelas duas partes do sistema no estiverem de acordo, a comunicao
no ocorrer.

O servidor atribui o nmero de uma porta. Quando o cliente requisita uma conexo, o ser-
vidor abre a conexo do soquete com o mtodo accept().

Connection Client
Figura 1.7 request
Port Listen Port
Servidor aguarda
Captulo 1 - Soquets

uma solicitao Server


de conexo.

O cliente estabelece uma conexo com o host na porta port_number.

7
Client
Port Listen Port
Connection Figura 1.8
Server Cliente usa Socket
para se comunicar
com o servidor.

O cliente e o servidor se comunicaro por meio de um InputStream e um OutputStream.

Implementao de soquetes TCP


Basicamente, temos de nos preocupar com as tarefas descritas a seguir para realizar a
implementao de uma aplicao que vai utilizar-se de soquets para possibilitar a comuni-
cao entre mquinas clientes e servidor:

Tarefas da mquina servidora: q


11 Criar um socket de escuta (LISTENING), em uma determinada porta.

11 Processar requisies de conexes.

11 Processar pedido de fluxo.

11 Utilizar o fluxo, conversa com a outra mquina.

11 Fechar o fluxo.

11 Fechar o socket.

Tarefas da mquina cliente:

11 Criar a conexo, socket cliente e socket servidor.

11 Criar um fluxo de comunicao no socket.

11 Utilizar o fluxo, conversa com a outra mquina.

11 Fechar o fluxo.

11 Fechar o socket.

Implementao do socket servidor


Os aplicativos servidores TCP/IP baseiam-se nas classes de operao em rede ServerSocket
e Socket disponibilizadas pela linguagem Java. A classe ExServidor01 tem a maior parte da
responsabilidade no estabelecimento da conexo.

O cdigo para implementar esse modelo simples mostrado a seguir.

package visao;
import java.net.ServerSocket;
import java.net.Socket;
public class ExServidor01 {
public static void main(String argv[]) {
JAVA Aplicaes Web

while (true) {
try {
ServerSocket socketRecepcao = new ServerSocket(3000);
System.out.println(Servidor esperando conexo na porta 3000);
Socket socketConexao = socketRecepcao.accept();

8
System.out.println(Conexo estabelecida na porta +
socketConexao.getPort());
socketConexao.close();
socketRecepcao.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

O primeiro passo criar o server socket: ServerSocket serverSocket = new ServerSocket


(3000). O segundo passo implementar a instruo que vai aguardar conexes de clientes:
Socket clientSocket = serverSocket.accept (); na sequncia a aplicao pode implementar
streams de entrada e sada para comunicao com o cliente:

DataInputStream inbound = new DataInputStream(clientSocket.getInputStream());


DataOutputStream outbound = new DataOutputStream(clientSocket.getOutputStream());

O prximo passo o uso dos streams de entrada e sada para realizar a troca de informa-
es entre clientes e servidor.

int k = inbound.readInt( );
String s = inbound.readUTF() ;
outbound.writeInt( 3 );
outbound.writeUTF( Hello );

Para finalizar, devemos providenciar o fechamento dos streams e socket do cliente e do


servidor:

inbound.close ();
outbound.close ();
clientSocket.close();
serverSocket.close();

Implementao do socket cliente


J o lado cliente de um aplicativo TCP/IP baseia-se na classe Socket. Novamente, muito do tra-
balho envolvido no estabelecimento das conexes foi realizado pela classe Socket. Esse cliente
se conecta ao servidor por meio da especificao do seu nome ou IP e da porta de conexo.
A classe ExCliente01 exemplifica a implementao de uma classe cliente que vai se comunicar
com o servidor implementado na classe ExServidor01, apresentada anteriormente.

package visao;
import java.net.Socket;
public class ExCliente01 {
public static void main(String argv[]) throws Exception {
Captulo 1 - Soquets

Socket socketCliente = new Socket(localhost,3000);


System.out.println(Socket cliente criado e finalizando...);
socketCliente.close();
}
}

9
A primeira linha implementada no mtodo main() da classe ExCliente01 vai instanciar um
objeto da classe Socket. Esse objeto o responsvel por estabelecer a conexo com o ser-
vidor, sendo este recebido pelo mtodo accept() da classe ServerSocket. A partir dessa linha,
o programa cliente identificado pelo programa servidor e esses podero realizar opera-
es de envio e recepo de informao como, por exemplo, o envio de uma mensagem,
leitura de um arquivo em disco, entre outras operaes desejadas entre o cliente e servidor.

Ou seja, o primeiro passo a abertura de uma conexo por meio da instncia de um objeto da
classe Socket: Socket clientSocket = new Socket (localhost, 3000). Em seguida, o cliente pode
se utilizar de streams de entrada e sada para realizar a troca de informaes com o servidor

DataInputStream inbound = new DataInputStream(clientSocket.getInputStream());


DataOutputStream outbound = new DataOutputStream(clientSocket.getOutputStream());

O passo seguinte o uso dos mtodos dos objetos de streams enviar ou receber informa-
es do servidor.

outbound.writeInt( 3 );
outbound.writeUTF( Hello );
int k =inbound.readInt( );
String s =inbound.readUTF() ;

Para finalizar, devemos providenciar o fechamento dos streams e socket do cliente e do


servidor:

inbound.close();
outbound.close();
clientSocket.close();

Percebam que o processo de criao das aplicaes cliente/servidor basicamente o


mesmo, com a diferena que o servidor deve utilizar um objeto da classe ServerSoket para
poder especificar um canal de comunicao que fica espera de uma solicitao de conexo

lAs chamadas
de possveis clientes.

Sockets UDP telefnicas garantem a


existncia de uma
Enquanto o TCP/IP um protocolo orientado a conexo, User Datagram Protocol um proto- comunicao sncrona:
colo sem conexo. As diferenas entre esses dois protocolos so semelhantes s diferenas as mensagens so
enviadas e recebidas na
entre uma chamada telefnica e uma correspondncia postal ou, o envio de uma mensagem
ordem pretendida. A
em uma garrafa, como mostra a figura 1.9. conversao atravs de

UDP (User Datagram Protocol): q cartes postais


enviados por correio
no garantida: as
11 Usado para o transporte rpido de dados entre HOSTs dentro de uma rede TCP/IP.
mensagens podem ser
11 No se estabelece conexo. recebidas fora de
ordem, se forem
11 A comunicao ocorre apenas com o envio de dados. recebidas.

11 Uma mensagem um datagrama.

22 Composto de um remetente, um destinatrio ou receptor e a mensagem.


JAVA Aplicaes Web

11 No realiza a verificao de transmisso de dados.

O User Datagram Protocol suportado por meio de duas classes Java, DatagramSocket e
DatagramPacket. O pacote uma mensagem autossuficiente que inclui informaes sobre
o remetente, a prpria mensagem e seu comprimento. As principais aplicaes do UDP so
aplicaes como transmisses de vdeo, Skype, VOIP etc.

10
Figura 1.9
Conexo UDP
protocolo sem
conexo.

A classe DatagramPacket possui dois construtores: um para receber e outro para enviar
dados, descritos a seguir:

11 DatagramPacket (byte[] recvBuf, int readLength): utilizado para definir uma matriz
de bytes para receber um pacote UDP. A matriz de bytes est vazia quando passada ao
construtor e a varivel int definida com o nmero de bytes a serem lidos (e tambm no
pode ser maior que o tamanho da matriz de bytes).

11 DatagramPacket(byte[] sendBuf, int sendLength, InetAddress iaddr, int iport): utili-


zado para definir um pacote UDP para transmisso. sendLength no pode ser maior que
a matriz de bytes sendBuf.

J a classe DatagramSocket utilizada para ler e gravar pacotes UDP. Essa classe possui trs
construtores que permitem especificar a que porta e endereo da internet deve ser vinculada:

11 DatagramSocket(): vincular a qualquer porta disponvel no host local.

11 DatagramSocket(int port): vincular porta especificada no host local.

11 DatagramSocket(int port, InetAddress iaddr): vincular ao nmero de porta especifi-


cado no endereo especificado.

O cdigo a seguir exemplifica a implementao de uma classe java criada para receber uma
mensagem por meio do protocolo UDP:

package visao;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceptor {
public static void main(String[] args) {
try {
//Argumento inteiro (numero da porta)
int port = 1234;
//Cria o DatagramSocket para aguardar mensagens, nesse momento o
// mtodo fica bloqueando at o recebimente de uma mensagem
DatagramSocket dsReceptor = new DatagramSocket(port);
System.out.println(Ouvindo a porta: + port);
//Preparando o buffer de recebimento da mensagem
byte[] msg = new byte[256];
//Prepara o pacote de dados
Captulo 1 - Soquets

DatagramPacket pkg = new DatagramPacket(msg, msg.length);


//Recebimento da mensagem
System.out.println(Pronto para receber mensagem.);
dsReceptor.receive(pkg);
javax.swing.JOptionPane.showMessageDialog(null,new
String(pkg.getData()).trim(),Mensagem recebida,1);

11
System.out.println(Mensagem recebida.);
dsReceptor.close();
}
catch(IOException ex) {
System.out.println(ex.toString());
}
}
}

Quando executada, a classe vai produzir a seguinte sada no console:

Figura 1.10
Execuo do
receptor UDP
Socket no console.

Isso indica que a classe criada para receber uma mensagem UDP est em execuo e o
mtodo receive() da classe DatagramSocket est espera do pacote de dados. Aps a
execuo desse mtodo, a seguinte sada ser gerada:

Figura 1.11
Mensagem escrita
na interface UDP
receptora.

O cdigo a seguir exemplifica a implementao de uma classe java criada para enviar uma
mensagem por meio do protocolo UDP:

package visao;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPRemetente {
public static void main(String[] args) {
try {
//Primeiro argumento o nome do host destino
InetAddress addr = InetAddress.getByName(localhost);
int port = 1234;
byte[] msg = Exemplo de Socket UDP.getBytes();
JAVA Aplicaes Web

//Monta o pacote a ser enviado


DatagramPacket pkg =
new DatagramPacket(msg,msg.length, addr, port);

// Cria o DatagramSocket que ser responsvel por enviar a mensagem


DatagramSocket ds = new DatagramSocket();

12
//Envia a mensagem
ds.send(pkg);
System.out.println(Mensagem enviada para: +
addr.getHostAddress() + \n + Porta: + port + \n +
Mensagem: + Exemplo de Socket UDP);
//Fecha o DatagramSocket
ds.close();
}
catch(IOException ex) {
System.out.println(ex.toString());
}
}
}

Quando executada, a classe vai produzir a seguinte sada no console:

Figura 1.12
Execuo do
remetente UDP
Socket no console.

Multicast
Tcnica que possibilita enviar datagramas para um grupo de clientes conectados q
na rede.

11 suportado pelo UDP.

11 O que consiste em mais uma diferena em relao ao TCP.

11 Java implementa a classe MulticastSocket do pacote java.net.

22 Assemelha-se bastante com um socket datagram.

22 Capacidades adicionais, como formao de grupos multicast.

11 Endereos reservados.

22 Classe D.

22 Entre 224.0.0.0 e 239.255.255.255.

22 Endereos com prefixo 239 reservados para uso em intranets. Veja a seguir o
cdigo para implementar um servidor MultiCast.

Veja a seguir o cdigo para implementao de um Servidor MultiCast.

import java.io.IOException;
Captulo 1 - Soquets

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ExMultCastSocketServer {

public static void main(String[] args) {

13
//Criando um grupo
// MULTICAST Classe D (224.0.0.0 - 239.255.255.255)

try {
byte[] b = javax.swing.JOptionPane.showInputDialog(Digite uma
mensagem: ).getBytes();
InetAddress addr = InetAddress.getByName(239.0.0.1);
DatagramSocket ds = new DatagramSocket();
DatagramPacket pkg = new DatagramPacket(b, b.length, addr, 12347);
ds.send(pkg);
} catch (IOException ex) {
System.out.println(ex.toString());
}
}
}

E tambm o cdigo para implementao de um cliente MultiCast.

import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ClienteMulticast {
public static void main(String[] args) {
while(true) {
try {
MulticastSocket mcs = new MulticastSocket(12347);
InetAddress grp = InetAddress.getByName(239.0.0.1);
mcs.joinGroup(grp);
byte rec[] = new byte[256];
DatagramPacket pkg = new DatagramPacket(rec, rec.length);
mcs.receive(pkg);
String data = new String(pkg.getData());
System.out.println(Dados recebidos: + data);
}
catch(Exception e) {
System.out.println(Erro: + e.getMessage());
}
}
}
}

Quando executada, a classe vai produzir a seguinte sada no console:


JAVA Aplicaes Web

14
Figura 1.13
Execuo
do cliente MultCast
no console.

Raw Sockets
Envia o pacote sem utilizar as camadas de transporte. q
11 Utiliza a forma mais rstica na camada de rede (IP) e na Internet Control Message
Protocol (ICMP).

11 Essa interface de socket no fornece servios ponto-a-ponto tradicionais.

11 Permite que voc manipule o TCP/IP no mais baixo nvel.

22 Atravessando as camadas normais de encapsulamento/desencapsulamento na


pilha do TCP/IP.

22 Quando um pacote TCP/IP enviado ele no est processado.

22 um pacote cru (RAW).

11 A aplicao que est usando o pacote agora responsvel por examinar os cabea-
lhos e retir-lo, analisando o pacote, e todo o material que est na pilha de TCP/IP.

Um socket Raw um socket que faz exame de pacotes, contorna o TCP/IP normal proces-
sado e emite-o aplicao que o quer.

Muito usado para:

11 Escrever aplicaes farejadoras snifers.

11 Dar pings, traceroute.

Examinando onde o cabealho IP constitudo.

Tambm pode ser usado para:

11 Escrever Aplicaes Gerenciadoras de Rede.

11 Monitoramento de erros ICMP (Internet Control Message Protocol).

Java no suporta Raw Sockets diretamente.

11 Elimina a possibilidade de se criar pacotes ICMP.

11 Elimina implementao de rotinas que realizem as operaes de um ping.

11 Uma soluo para esse problema est no uso de chamada a mtodos nativos.

11 A criao de mtodos nativos nesse caso no parece ser complicada.

Raw sockets sobre ICMP s podem ser criados por administradores.

11 Nas chamadas o SO verifica se o usurio possui direito de administrador ou no.


Captulo 1 - Soquets

11 Se no possuir tais direitos chamada ao SO, retorna erro e o raw sockets no


criado.

15
Exerccios de fixao e
Socket
Qual a diferena entre socket TCP e UDP?

Atividades Prticas
JAVA Aplicaes Web

16
2
RMI Remote Method Invocation
Apresentar aos alunos a estrutura da linguagem de programao Java utilizada no
objetivos

desenvolvimento de aplicaes que possibilitam o acesso a mtodos de objetos


remotamente como se fossem objetos locais em um ambiente de rede distribudo.

conceitos
Arquitetura RMI; registry; interfaces remotas; stubs; skeletons; camada de transporte;
Classe naming; rebind(); lookup().

Introduo
O que ? Para que serve? q
11 Remote Method Invocation: RMI

11 API que permite que programas Java chamem mtodos de objetos remotos como se
fossem objetos locais.

11 Unio da:

22 Natureza distribuda do Java.

22 Capacidade de carregamento dinmico de classes.

11 Compreendem frequentemente dois programas separados.

22 Um servidor e um cliente.

RMI (Remote Method Invocation) habilita a chamada remota de mtodos. Tambm possi-
bilita que o mtodo de um objeto, em uma mquina virtual, chame um mtodo de outro
objeto, em outra mquina virtual. Isso feito com a mesma sintaxe e facilidade de uma
invocao de objetos locais. Com RMI um programa cliente pode invocar um mtodo em um
Captulo 2 - RMI Remote Method Invocation

objeto remoto da mesma forma que faz com um mtodo de um objeto local. Todos os deta-
lhes de conexo de rede esto ocultos, permitindo assim que o modelo de objetos tenha sua
interface pblica mantida atravs da rede, sem necessitar expor detalhes irrelevantes como
conexes, portas ou endereos.

RMI trabalha basicamente com um programa servidor, um programa cliente e um programa


de interface, responsvel pela interligao entre o cliente e o servidor. O computador ser-
vidor utilizado para definir o corpo de cada um dos mtodos que podero ser executados
remotamente. Um passo importante para que esse mtodo seja executado com eficincia
propiciar o registro de um ou mais objetos com o rmiregistry, que dever estar presente no
servidor. Com isso, o cliente poder acessar os mtodos dos objetos das aplicaes ativas no
servidor. Nesse processo indispensvel a definio de uma interface que especifique quais
os mtodos podero ser executados remotamente pelo cliente no servidor.

17
Servidor: q
11 Tipicamente cria alguns objetos remotos e torna a referncia a esses objetos acessveis.

Cliente:

11 Obtm a referncia remota de um ou mais objetos disponveis no servidor.

11 Invoca a execuo de mtodos remotos.

Tal aplicao muitas vezes referenciada como uma aplicao de objetos distribudos

A figura 2.1 ilustra o esquema de funcionamento de uma aplicao RMI.

RMI

RMI Client rmiregistry


RMI
RMI
RMI server
URL URL
protocol protocol
Web server Figura 2.1
Esquema de
URL Web server funcionamento de
protocol uma aplicao RMI.

Aplicaes de objetos distribudos disponibilizam mecanismos para: q


11 Localizao de objetos remotos.

11 Comunicao com objetos remotos.

11 Carregar definies de classes de objetos remotos.

Caractersticas centrais e singulares de RMI:

11 A capacidade de baixar a definio de classe de um objeto se a classe no est defi-


nida na mquina virtual Java do cliente.

11 Todos os tipos e comportamentos de um objeto, anteriormente disponvel apenas em


uma nica mquina virtual Java, pode ser transmitida para outra mquina virtual Java,
possivelmente remota.

11 RMI passa objetos por suas classes reais, de modo que o comportamento dos objetos
no se altera quando eles so enviados para outra mquina virtual Java.

Vantagens da leitura dinmica de cdigos:

11 Essa capacidade permite que novos tipos e comportamentos possam ser introdu-
zidos mquina virtual Java cliente.

11 Aumento dinmico do comportamento de uma aplicao.

Aplicaes distribudas RMI so desenvolvidas como qualquer outra aplicao Java, fazendo
uso de interfaces, classes e objetos.

Interfaces: q
JAVA Aplicaes Web

11 Declaram assinaturas de mtodos.

Classes:

11 Implementam os mtodos declarados na interface.

11 Podem conter mtodos adicionais.

18
Objetos: q
11 Seus mtodos podem ser invocados por meio da JVM.

11 Conhecidos como objetos remotos.

Figura 2.2 Em Java as classes e interfaces que permitem a implementao de RMI esto todas reunidas
Pacote Java RMI. em um pacote que pode ser visto na figura 2.2, a seguir.

java.lang java.rmi

MarshalledObject Remote AccessException

Object
Naming ConnectIOException

MarshalException
SecurityManager RMISecurityManager

NoSuchObjectException

AlreadyBoundException
ServerError

NotBoundException
ServerException

java.io ServerRuntimeException

Serializable
StubNotFoundException

IOException RemoteException UnexpectedException

UnknownHostException

UnmarshalException

Exception RuntimeException SecurityException RMISecurityException


Captulo 2 - RMI Remote Method Invocation

KEY CLASS ABSTRACT CLASS FINAL CLASS extends

DEPRECATED
implements
INTERFACE

Cabe destacar que Objetos Remotos se tornam remotos por meio da implementao de
uma interface remota. Cada mtodo da interface declara java.rmi.RemoteException na sua
clusula throws, conforme pode ser visto no trecho de cdigo a seguir.

19
public interface Calculadora extends java.rmi.Remote {
public long add(long a, long b) throws java.rmi.RemoteException;
public long sub(long a, long b) throws java.rmi.RemoteException;
public long mul(long a, long b) throws java.rmi.RemoteException;
public long div(long a, long b) throws java.rmi.RemoteException;
}

Arquitetura RMI
O sistema RMI consiste em trs camadas: q
11 A camada de stub/skeleton:

22 stubs do lado cliente (proxies).

22 skeletons do lado servidor.

11 A cama de referncia remota comportamento de referncia remota (como invo-


cao para um nico objeto ou para um objeto reproduzido).

11 A camada de transporte configura a gerencia, conexo e localizao do objeto


remoto.

A figura 2.3 mostra uma representao dessa arquitetura.

Objeto cliente Objeto servidor

Stub Skeleton

Gerenciador de Gerenciador de
Referncias Remotas Referncias Remotas

Figura 2.3
Camada de transporte RMI Arquitetura RMI.

Quando se utiliza a RMI, no cliente disponibilizada uma classe chamada Stub e, no servidor,
uma classe chamada Skeleton. Essas duas classes so geradas por um programa fornecido
como parte do JDK (Java Developers Kit). A classe Stub aparece para o cliente como se fosse
um objeto real, permitindo a chamada a cada um de seus mtodos. Quando um mtodo
chamado via Stub, os parmetros so passados ao servidor via serializao e chegam at a
classe Skeleton, que tem a finalidade de pegar os valores passados e efetuar a chamada de
funo do objeto real. O retorno do objeto real transmitido do Skeleton para o Stub, e o
cliente no faz a menor ideia de que o objeto est em outro local.

Ao se utilizar a RMI: q
11 No cliente disponibilizada uma classe chamada Stub.
JAVA Aplicaes Web

22 Aparece para o cliente como se fosse um objeto real, permitindo a chamada a cada
um de seus mtodos.

11 No servidor, uma classe chamada Skeleton.

22 Quando um mtodo chamado via Stub, os parmetros so passados ao servidor


via serializao e chegam at a classe Skeleton, que tem a finalidade de pegar os
valores passados e efetuar a chamada de funo do objeto real.

20
O retorno do objeto real transmitido do Skeleton para o Stub, e o cliente no faz a q
menor ideia de que o objeto est em outro local.

Essas duas classes so geradas por um programa fornecido como parte do JDK (Java
Developers Kit), o rmic.

Como primeira etapa para a criao de uma classe acessada via RMI, precisa-se de inter-
faces para o objeto remoto. Essa classe deve possuir a interface pblica e todos os seus
mtodos tm de lanar uma RemoteException(). Alm disso, a interface da classe definida
deve ser estendida da classe Remote(), parte da arquitetura RMI. Criadas e implementadas
as Interfaces, deve-se compilar os cdigos e gerar os arquivos.class. Estes sero utilizados
pelo utilitrio RMIC para a criao de classes Skeleton e Stub.

O compilador utiliza-se dos arquivos compilados e, por isso, eles so necessrios.

Cada objeto a ser partilhado deve passar por um processo especial no servidor, onde dever
ser registrado e receber um nome. O programa que gerencia todo o registro e acesso de
nomes no servidor o rmiregistry. Ele deve estar em execuo (modo stand by) quando o
servidor tentar registrar o objeto, bem como quando o objeto for acessado. Se algum objeto
for solicitado ao servidor, ele cria, executa, registra e termina a execuo desse objeto
instanciado atravs de uma chamada feita pelo cliente. Este, por sua vez, deve seguir a
conveno de uma URL (Uniform Resource Locator), onde o protocolo RMI deve fornecer um
servidor e o nome do mtodo a ser executado remotamente pelo cliente no servidor.

A seguir sero apresentados cada um dos passos necessrios para construir uma aplicao
RMI (considerando que o sistema RMI est corretamente configurado em sua mquina).

Implementao de uma Aplicao RMI


Deve ser realizada seguindo os seguintes passos:

11 1: Escrever e compilar o cdigo java para as interfaces. q


11 2: Escrever e compilar o cdigo java para as classes de implementao.

11 3: Gerar os arquivos com as classes stubs e skeletons geradas a partir das classes de
implementao.

11 4: Escrever o cdigo java para o servio remoto do programa host.

11 5: Desenvolver o cdigo java para o programa cliente RMI.


Captulo 2 - RMI Remote Method Invocation

Passo 1: Escrever e compilar o cdigo java para as interfaces


Esse primeiro passo tem como objetivo escrever e compilar o cdigo java para o servio de
interface. A classe de interface Calculadora define todas as caractersticas remotas ofere-
cidas por esse servio.

public interface Calculadora extends java.rmi.Remote {

public long add(long a, long b) throws java.rmi.RemoteException;

public long sub(long a, long b) throws java.rmi.RemoteException;

public long mul(long a, long b) throws java.rmi.RemoteException;

public long div(long a, long b) throws java.rmi.RemoteException;

}
21
Passo 2: Escrever e compilar o cdigo java para as classes de implementao
Esse segundo passo determina quais sero as instrues a serem executadas remotamente,
quando o cliente solicitar um servio para o servidor. Os mtodos aqui implementados so
herdados da classe de interface implementada anteriormente (Calculadora).

public class CalculadoraImp extends java.rmi.server.UnicastRemoteObject


implements Calculadora {

// Implementations must have an


//explicit constructor
// in order to declare the
//RemoteException exception

public CalculadoraImp() throws java.rmi.RemoteException {


super();
}

public long add(long a, long b) throws java.rmi.RemoteException {


long resp = a + b;
System.out.println(\nResultado da Adio de +a+ + +b+ eh +resp);
return a + b;
}

public long sub(long a, long b) throws java.rmi.RemoteException {


long resp = a: b;
System.out.println(\nResultado da Subtrao de+a+: +b+ e +resp);
return a: b;
}

public long mul(long a, long b) throws java.rmi.RemoteException {


long resp = a * b;
System.out.println(\nResultado da Multiplicao de
+ a + * + b + eh + resp);
return a * b;
}

public long div(long a, long b) throws java.rmi.RemoteException {


long resp = a / b;
System.out.println(\nResultado da Diviso de
+ a + / + b + eh + resp);
return a / b;
}
JAVA Aplicaes Web

22
Passo 3: Gerar os arquivos com as classes stubs e skeletons geradas a partir das clas-
ses de implementao
Nesse ponto sero gerados os arquivos com as classes stubs e skeletons. Isso possvel
atravs do uso do compilador RMI, o rmic. Depois de executar o compilador RMI sero
criados os arquivos <classname>_Stub.class e <classname>_Skel.class, onde <classname>
corresponde ao nome da classe de interface. A instruo para a gerao dessas classes :
rmic CalculadoraImp. A compilao feita na linha de comando e no deve ser realizada no
diretrio onde se encontra o arquivo.class. Sendo assim, retorne um nvel na estrutura de
diretrio e execute o comando rmic calculadora.CalculadoraImp, onde calculadora indica o
pacote onde a implementao da classe de interface se localiza.

A figura a seguir mostra os arquivos j criados no diretrio calculadora.

Figura 2.4
Arquivos com as
classes stubs e
skeletons.

Passo 4: Escrever o cdigo java para o servio remoto do programa host


Servios remotos via RMI devem ser hospedados em um servidor. A seguir, o cdigo que
implementa o servio remoto.

import java.rmi.Naming;

public class CalculatorServer {

public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
Naming.rebind(rmi://localhost/CalculatorService, c);
Captulo 2 - RMI Remote Method Invocation

// CalculadoraServer pronta!
} catch (Exception e) {
System.out.println(Trouble: + e);
}
}

public static void main(String args[]) {


new CalculatorServer();
}
}

23
Cabe destacar que a classe Naming fornece mtodos para armazenar e obter referncias a
objetos remotos, em um registro remoto do objeto. J rebind(name, obj) religa o nome especi-
ficado para um novo objeto remoto. Qualquer vinculao existente para o nome substituda.

Passo 5: Desenvolver o cdigo java para o programa cliente RMI


No trecho de cdigo a seguir, podemos ver a interface da aplicao que ser acessada pelo cliente.

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class CalculatorClient {

public static void main(String[] args) {


try {
Calculator c = (Calculator)
Naming.lookup(rmi://localhost/CalculatorService);
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
}
catch (MalformedURLException murle) {
System.out.println();
System.out.println(MalformedURLException);
System.out.println(murle);
}
catch (RemoteException re) {
System.out.println();
System.out.println(RemoteException);
System.out.println(re);
}
catch (NotBoundException nbe) {
System.out.println();
System.out.println(NotBoundException);
System.out.println(nbe);
}
}
}

O mtodo lookup(name) retorna uma referncia (ao stub) para o objeto remoto associado ao
nome especificado. Ele liga o stub ao skeleton, sendo necessrio realizar downcast. Tambm
libera execuo de mtodos remotos.
JAVA Aplicaes Web

24
Executando uma aplicao RMI
Agora que todos os arquivos do projeto foram criados e devidamente compilados, estamos
prontos para rodar o sistema! Voc precisar abrir trs diferentes consoles PROMPT-DOS no
seu Windows, ou outro, caso utilize um Sistema Operacional diferente.

3 Consoles: q
11 O RMI Registry.

11 O programa servidor java <classe_servidor>.

11 O programa cliente java <classe_cliente>.

Em um dos consoles vai rodar o programa servidor; no outro o cliente e no terceiro o RMI
Registry. Inicie com o RMI Registry. Voc deve estar no mesmo diretrio em que esto gra-
vados seus arquivos para rodar o aplicativo. Execute a seguinte linha de comando:

start rmiregistry

Isso vai iniciar o RMI Registry e rod-lo. O resultado da execuo desse comando pode ser
visto na figura 2.5, a seguir.

Figura 2.5
rmiregistry
em execuo.
No segundo console, vamos executar o programa servidor. Voc deve estar no mesmo diretrio
em que esto gravados seus arquivos para rodar o aplicativo. Execute o seguinte comando:

start java calculadora.CalculadoraServer

Isso vai iniciar, carregar a implementao na memria e esperar pela conexo cliente. Veja o
resultado na figura 2.6.
Captulo 2 - RMI Remote Method Invocation

25
Figura 2.6
Servidor da
calculadora em
execuo.

Finalmente, no ltimo console, rode o programa cliente. Voc deve estar no mesmo diretrio
em que esto gravados seus arquivos para rodar o aplicativo. Excute o comando:

java calculadora.CalculadoraClient

Imediatamente, voc ter os resultados dos clculos sendo visualizados no console do


cliente, bem como mensagens dando conta da realizao dos clculos que esto sendo reali-
zados remotamente no servidor, conforme a figura 2.7.

Figura 2.7
Interface cliente
executando
mtodo remoto.

Os passos descritos nos possibilitam criar um sistema utilizando a tecnologia RMI. Apesar de
voc ter rodado os programas na mesma mquina, o RMI usa a pilha de rede TCP/IP para se
comunicar entre as trs diferentes instncias da JVM.

Exerccios de fixao e
RMI
Quantos e quais so os passos para implementao de uma aplicao Java RMI?
JAVA Aplicaes Web

Atividades Prticas

26
3
Applets
Apresentar aos alunos o processo de desenvolvimento de aplicaes com Applets Java
objetivos

que utilizam elementos de interface grfica para a interao com o usurio final,
atravs de aplicaes que executam remotamente por meio de navegadores internet.

conceitos
Applet; java-enabled; javapowered; ciclo de vida do applet; tag <applet> e tag <object>.

Exerccio de nivelamento e
Applets
Voc j desenvolveu aplicaes para internet? Que recurso e/ou linguagem de programao
voc j utilizou para desenvolvimento?

Introduo
Applet: q
11 Tipo especial de programa Java.

22 Browser com suporte tecnologia Java dito Java-enabled.

22 Pode ser baixado pela internet.

22 Appletviewer: aplicativo do Java para testar a execuo de applets.

11 Estende as funcionalidades do browser.

22 Adiciona som, animao etc.

22 Proveniente de URLs locais ou remotas.

22 Cada pgina html pode conter uma ou mais applets.

22 A cada mudana de pgina, os applets associados so automaticamente destrudos.

22 Uma pgina HTML contendo applets dita Javapowered.

Os applets so aplicaes Java que utilizam recursos da mquina virtual Java dentro de nave-
gadores web com algumas limitaes de segurana. Quando um usurio visualiza uma pgina
HTML que contm um applet, o cdigo do applet baixado para a mquina do usurio.
Captulo 3 - Applets

Um applet um programa em Java que executado em um browser. Um applet pode ser


uma aplicao Java totalmente funcional, pois tem toda a API Java sua disposio.

27
Normalmente embutido em uma pgina web. q
executado no contexto do browser.

Subclasse: java.applet.Applet ou javax.swing.JApplet.

Applet ou JApplet fornece a interface padro (entre o applet e browser).

11 Apresentam GUIs (AWT ou Swing).

Plug-in Java.

11 Instalado no browser.

11 Gerencia o ciclo de vida de um applet.

11 JVM que interpreta o bytecode.

O desenvolvimento ou no de programas em Java sob a forma de applets depende do obje-


tivo da aplicao. Sua execuo necessita de um navegador e pode ser disponibilizada para
execuo via internet.

Applets sempre executam nos clientes web, nunca nos servidores. importante considerar
que a carga das classes pode levar algum tempo.

Existem algumas diferenas importantes entre um applet e uma aplicao Java standalone,
conforme mostrado na tabela a seguir:

Aplicaes Applets
11Programa autnomo. 11Executada por um navegador.
11Executa em uma JVM autnoma. 11O navegador fornece a JVM.
11Ponto de entrada o mtodo main( ), 11Vrios pontos de entrada so chamados
chamado pelo carregador de classes. pelo navegador como init( ).
11Geralmente contm construtores. 11Construtores tendem a ser vazios.
11Acesso a todos os recursos do ambiente. 11Acesso limitado por razes de segurana.
11Pode ser grfica. 11So sempre grficas.
11Funcionalidades plenas: menus, dilogos, 11Devem fornecer uma classe que estenda
arquivos... applet. Tabela 3.1
11Janela base da aplicao extende de 11Janela base da aplicao extende de Diferenas entre
Frame ou JFrame. applet ou Japplet. aplicaes Java e
11Carregador de classes remotas. applets.

Uma vez que um applet executado a partir de um browser web, ele tem a vantagem de j
ter uma janela e a capacidade de responder aos eventos da interface com o usurio, por
meio do browser. Tambm pelo fato de os applets serem projetados para uso em redes, Java
muito mais restritivo nos tipos de acesso que os applets podero ter no seu sistema de
arquivos do que com os aplicativos que no esto necessariamente rodando em rede.
JAVA Aplicaes Web

28
Ciclo de vida de um applet
Todo applet passa por diferentes estgios, desde a sua criao at o fim das suas atividades,
estgios esses que podem ser visualizados na figura 3.1.

start()

init() destroy()

Figura 3.1 stop()


Ciclo de Vida
de um applet.
Na verdade, cada um desses estgios pelo qual passa um applet corresponde a um mtodo
da classe applet, que disponibiliza o framework necessrio a partir do qual podemos
construir o cdigo Java que executado em um browser. So eles:

init(): chamado pelo browser quando o applet carregado. q


11 Responsvel pela inicializao do applet.

11 Faz processamento de parmetros.

11 Criao e adio de componentes de interface.

star(): chamado pelo browser para informar que o applet deve iniciar sua execuo.

11 Aps a chamada ao mtodo init().

11 Executado toda vez que o usurio retorna pgina.

stop(): chamado pelo browser para informar que o applet deve interromper sua execuo.

11 Navegao entre pginas.

11 Antes da destruio de um applet.

11 Atividades que foram interrompidas com stop() so retomadas com start().

destroy(): chamado pelo browser quando do seu encerramento.

11 Libera recursos alocados para o Applet (via garbage colector).

11 Fechamento da pgina HTML que contm o applet.

Um applet vai trabalhar de forma coordenada com o HTML (a linguagem de marcao de


hipertexto) e que vai descrever o layout de uma pgina da web. O HTML simplesmente um
veculo para indicar elementos de uma pgina de hipertexto. Por exemplo, <TITLE> indica o

l
ttulo da pgina e todo texto aps essa tag se torna o ttulo da pgina. Voc indica o final do
ttulo com a tag </TITLE>.
Deve-se mencionar
ainda que o mtodo
paint(), do java.awt,
deve ser invocado logo
aps o mtodo start(),
e sempre que o applet
precisar se redesenhar
Captulo 3 - Applets

no prprio navegador.

29
Um primeiro exemplo de applet
A seguir apresentamos um cdigo Java simples que implementa um applet que vai escrever
a mensagem Primeiro exemplo de Applet Java no browser quando a pgina HTML que ele
estiver inserido for acessada.

Para criar um applet: q


11 1: cria-se uma sub-classe de Applet.

11 2: redefine-se certos mtodos:.

22 init( ), start( ), stop( ), destroy( ), paint( ) e update( )

A seguir, podemos ver o cdigo desse primeiro exemplo:

import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet
{
public void paint (Graphics g)
{
g.drawString (Primeiro exemplo de Applet Java , 25, 50);
}
}

As declaraes de importao trazem as classes para o mbito da nossa classe applet.


Sem essas declaraes de importao, o compilador Java no reconheceria a classe applet,
e tampouco os objetos visuais grficos que a classe do applet referencia. Vamos descrever
em seguida a classe applet com mais detalhes. Para ajudar nesse detalhamento, apresen-
tamos na figura 3.2 a hierarquia de classes em um applet.
Figura 3.2
Hierarquia
java.lang.Object de classes em
um applet.
java.awt.Component

java.awt.Container

java.awt.Panel

java.applet.Applet

javax.swing.JApplet

A classe applet
Cada applet uma extenso da classe java.applet.Applet ou da classe javax.swing.applet.
JApplet. A classe Applet base fornece mtodos que uma classe Applet derivada pode chamar
para obter informaes e servios a partir do contexto do browser.

Mtodos da Classe Applet permitem: q


11 Iniciar, controlar ou terminar a execuo de uma aplicao em um browser.
JAVA Aplicaes Web

11 Obter a localizao de rede do arquivo HTML que contm o applet e do diretrio da


classe do applet.

11 Obter parmetros de applet.

11 Imprimir uma mensagem de status no navegador.

11 Buscar e executar componentes de som e imagem.

11 Redimensionar o applet.
30
Alm disso, a classe applet fornece uma interface pela qual o usurio ou o navegador obtm
informaes sobre o applet e controla sua execuo.

A interface permite: q
11 Pedir informao sobre o autor, a verso e o copyright do applet.

11 Solicitar uma descrio dos parmetros que o applet reconhece.

11 Inicializar o applet.

11 Comear ou interromper a execuo do applet.

11 Destruir o applet.

A classe applet fornece implementaes padro de cada um desses mtodos. Essas imple-
mentaes podem ser substitudas quando necessrio. Veja que o applet apresentado como
um primeiro exemplo em 3.2 est completo, tal como est. O nico mtodo nele substitudo
o mtodo de pintura paint().

O pacote java.applet fornece as classes para criar applets e permitir que applets se comuni-
quem com seu contexto.

Contexto de um applet: q
11 Uma aplicao que responsvel por carregar e executar applets.

22 Exemplo: navegadores e appletviewer.

11 O cdigo HTML que a contm e as demais applets contidas no mesmo documento.

Executando um applet
Fazendo novamente referncia ao ciclo de vida de um applet exibido na figura 3.1, no custa
reforar cada uma das etapas observadas no seu processo de execuo, listadas a seguir.

Acesso pgina que contm um applet: q


11 Carrega o applet e executa o mtodo init().

Applet carregada e o browser pode chamar:

11 O browser pode chamar start(), paint(), stop().

O browser sai da pgina atual:

11 Ocasiona a chamada de stop() ou destroy().

A estrutura geral de um applet pode ser vista no trecho de cdigo a seguir.

package visao;
import java.applet.Applet;
import java.awt.Graphics;
public class ExemploApplet extends Applet {
@Override
public void init( ){
// Inicializa a applet
}
Captulo 3 - Applets

@Override
public void start( ){
// Dispara a execuo de uma applet
}
@Override

31
public void stop( ){
// Para a execuo de uma applet
}
@Override
public void destroy( ){
// Destri definitivamente uma applet
}

@Override
public void paint(Graphics g){
//...
}
} // fim da classe

Um segundo exemplo de cdigo de um applet, que corresponde ao arquivo ExemploApple-


tAWT.java no diretrio de exemplos desta sesso, pode ser visto a seguir:

package visao;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Label;
public class ExemploAppletAWT extends Applet{
//Executado quando o applet for carregado no browser.
@Override
public void init() {
setSize(250, 100);
Label lbl = new Label(Exemplo java.applet.Applet,Label.CENTER);

setLayout(new BorderLayout());
add(lbl,BorderLayout.CENTER);
}
}

O que no mostramos ainda como fazer para associar um applet a uma pgina web. A
ideia muito simples! preciso fazer com que a pgina HTML diga ao navegador quais
applets devem ser carregados e, ento, onde colocar cada applet na pgina da web.

Logo que os applets foram inventados, era utilizada uma tag especial capaz de dizer ao
navegador exatamente isso: onde esto os arquivos de classe e como o applet se posiciona
na pgina da web (tamanho, localizao etc.).

<APPLET code=visao.ExemploAppletAWT.class width=350 height=200></APPLET>

A tag <applet> a base para a incorporao de um applet em um arquivo HTML. neces-


srio utilizar o atributo code (cdigo) do tag <applet>. Ele especifica a classe applet a ser
executada. Tambm necessrio indicar a largura (width) e a altura (height) de modo a
JAVA Aplicaes Web

especificar o tamanho inicial do painel em que o applet executado. A diretiva applet deve
ser fechada com a tag </applet>.

A seguir, mostramos o cdigo HTML do arquivo ExemploAppletAWT.html, tambm dispo-


nvel no diretrio de exemplos desta sesso.

32
<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
<H3><HR WIDTH=100%>Applet HTML Page<HR WIDTH=100%></H3>
<P>
<APPLET code=visao.ExemploAppletAWT.class width=350 height=200></APPLET>
</P>
<HR WIDTH=100%><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>
</HTML>

Outros atributos que podem ser usados com a tag <applet> podem ser vistos na figura 3.3.

<APPLET
<!-- Obrigatrios -->
CODE = appletFile <!- Fornece o nome da classe que contm a applet -->
WIDTH = pixels <!- Fixa a largura inicial da applet em pixels -->
HEIGHT = pixels <!- Fixa a altura inicial da applet em pixels -->

<!-- Opcionais -->


[ CODEBASE = codebaseURL ] <!- Define a base URL da classe do applet -->
[ ALT = alternateText ] <!- Permite exibir uma mensagem para o browser -->
[ NAME = appletInstanceName ] <!- Fornece a instncia de uma applet em
uma pgina HTML, de modo a estabelecer uma
comunicao entre applets -->
[ ALIGN = alignment ] <!- Posicionamento de uma applet em uma pgina HTML. Os
valores permitidos so: left, right, top, texttop, middle,
absmiddle, baseline, bottom, absbottom. -->
[ VSPACE = pixels ] <!- Nmero de pixels (vertical) entre a applet e o resto
da pgina HTML -->
[ HSPACE = pixels ] <!- Nmero de pixels (horizontal) entre a applet e o resto
da pgina HTML -->
>
<!-- nico modo de passar argumentos a uma applet -->
[ < PARAM NAME = appletParameter1 VALUE = value >]
[ < PARAM NAME = appletParameter2 VALUE = value >]
</APPLET>

Figura 3.3 Convm lembrar que o navegador procura o cdigo do applet na mesma URL do arquivo
Atributos que HTML. Para especificar um local diferente, preciso usar o atributo CODEBASE, conforme
podem ser usados
com a tag <applet>. mostrado:

<applet codebase=http://amrood.com/applets
code=HelloWorldApplet.class width=320 height=120>
Captulo 3 - Applets

Se um applet for implementado em um pacote diferente do padro, o caminho para esse


pacote dever ser especificado no atributo CODE, usando o caractere ponto (.) para separar
os componentes do pacote/classe. Por exemplo:

<applet code=mypackage.subpackage.TestApplet.class
width=320 height=120>

33
Navegadores no habilitados para Java no processam as tags <applet> e </applet>. Por-
tanto, qualquer coisa que aparece entre as tags, no relacionada com o applet, visvel em
navegadores no habilitados para Java.

Convm esclarecer tambm que houve um movimento para unificar a forma de


referenciar dados externos a uma pgina HTML atravs da tag OBJECT. Assim, o W3C
chegou a recomendar que no fosse mais utilizada a tag APPLET, mas os browsers
mais antigos habilitados para Java no reconheciam a nova tag OBJECT. Os navega-
dores mais novos reconhecem as duas tags, o que acabou contribuindo para a tag
APPLET nunca ter realmente sado de uso, razo pela qual continuaremos a us-la
neste curso. O HTML5 reforou essa tendncia ao adotar novas tags AUDIO e VIDEO
e mantendo o uso de IMG (tags essas que poderiam ser substitudas por OBJECT).

Finalmente, alm do applet em si, a pgina da web pode conter todos os outros elementos
HTML disponveis: mltiplas fontes, listas com bullets, elementos grficos, links etc. Os applets
so apenas uma parte da pgina de hipertexto.

sempre interessante lembrar que a linguagem de programao Java no uma ferramenta


para projetar pginas HTML; ela uma ferramenta para dar vida a elas. Isso no quer dizer
que os elementos de projeto de GUI em um applet Java no so importantes, mas que eles
devem trabalhar com (e, na verdade, so subservientes a) o projeto HTML subjacente da
pgina da web.

Uso de parmetros em applets


Veja que se um applet precisar usar parmetros, estes podem ser passados atravs do uso
do atributo PARAM na pgina HTML. No exemplo a seguir passado o parmetro nmero
contendo o valor 10 para o applet VerificarParImparApplet.class.

<HTML>
<HEAD>
<TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>
<APPLET codebase=classes code=visao/VerificarParImparApplet.class width=350
height=200>
<PARAM name=numero value=10>
</APPLET>
</BODY>
</HTML>

Os parmetros especificados em uma pgina HTML sero repassados ao applet que


podero trat-los para executar alguma funcionalidade desejada. Durante a escrita do
cdigo Java no applet, o programador dever se preocupar com a converso dos parme-
tros, que so Strings, para o tipo necessrio para utilizao dessa informao.
JAVA Aplicaes Web

O cdigo Java do applet precisa estar preparado para receber e trabalhar com parmetros.
Isso pode ser feito no mtodo init() ou no mtodo paint(). No entanto, melhor receber os
valores e prepar-los para o uso logo no incio, em vez de fazer isso a cada atualizao ao
applet. No apenas mais conveniente, como tambm mais eficiente.

34
Veremos a seguir como o mtodo Applet.getParameter () usado para receber um par-
metro, que chega sempre como um string.

package visao;
import java.awt.BorderLayout;
import javax.swing.JApplet;
import javax.swing.JLabel;
public class VerificarParImparApplet extends JApplet {

//Executado quando o applet for carregado no browser.


@Override
public void init() {
setSize(250, 100);
JLabel lbl =
new JLabel(Exemplo com passagem de parmetros,JLabel.CENTER);
setLayout(new BorderLayout());
add(lbl,BorderLayout.CENTER);

int num = Integer.parseInt(getParameter(numero));

if(num%2 == 0)
javax.swing.JOptionPane.showMessageDialog(rootPane, num+
um nmero par!,Mensagem,
javax.swing.JOptionPane.INFORMATION_MESSAGE);
else
javax.swing.JOptionPane.showMessageDialog(rootPane, num+
um nmero impar!,Mensagem,
javax.swing.JOptionPane.INFORMATION_MESSAGE);
}
}

Veja que getParameter() indica o mesmo nome do parmetro definido na tag <PARAM>,
presente na chamada <APPLET> na pgina html. O mtodo Integer.parseInt (Classe Wrapper)
converte o string e retorna um nmero inteiro.

Na sequncia, o applet realiza um teste de condio e chama o mtodo showMessage-


Dialog() de javax.swing.JOptionPane para exibir uma mensagem informando se o nmero
par ou mpar. Note que estamos utilizando os mesmos componentes visuais grficos
utilizados para desenvolver aplicativos desktop em Java.

Converso de aplicao em applet


fcil converter um aplicativo Java grfico (isto , um aplicativo que usa o AWT ou SWING)
em um applet que voc pode inserir em uma pgina web. Basta seguir os passos a seguir:

11 Criar uma pgina HTML com a tag <APPLET></APPLET> apropriada para carregar o q
Captulo 3 - Applets

cdigo Java.

11 Fornecer uma subclasse da classe JApplet. Essa subclasse deve ser declarada como
pblica (seno, o applet no poder ser carregado).

11 Eliminar o mtodo principal na aplicao e tambm a construo do seu Frame (j


que a aplicao ser exibida dentro do navegador).

35
11 Mover qualquer cdigo de inicializao do construtor para o mtodo init() do applet. q
No preciso construir explicitamente uma instncia do objeto para o navegador. O
applet vai instanci-lo automaticamente atravs da chamada ao mtodo init() quando
o applet for carregado pela pgina HTML contendo a tag <APPLET> correspondente.

11 Retirar a chamada para setSize(). O dimensionamento dos applets feito com a espe-
cificao da largura e altura como atributos da tag <APPLET> no arquivo HTML.

11 Retirar a chamada para setDefaultCloseOperation(). Um applet no pode ser fechado.


Sua execuo termina quando o usurio navega para uma prxima pgina ou fecha o
navegador.

11 Eliminar a chamada para o mtodo setTitle(). Um applet no pode ter barras de ttulo
(mas pode utilizar o ttulo da prpria pgina web).

11 Eliminar a chamada para o mtodo setVisible(true). O applet exibido automatica-


mente durante a carregamento da pgina HTML.

Manipulao de eventos no applet


Applets herdam um grupo de mtodos da classe Container de manipulao de eventos. A
classe Container define vrios mtodos, tais como processKeyEvent processMouseEvent,
bem como mtodos para o tratamento de tipos particulares de acontecimentos.

Para possibilitar o controle de eventos, um applet deve implementar a classe de interface


especfica do evento apropriado e reescrev-lo para atender as particularidades da apli-
cao em desenvolvimento.

O cdigo a seguir implementa a interface MouseListener para controlar eventos do mouse


no applet:

package visao;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JApplet;
public class ExemploControleEventoMouseApplet extends JApplet implements
MouseListener {
StringBuffer strBuffer;
public void init() {
addMouseListener(this);
strBuffer = new StringBuffer();
addItem(initializing the apple );
}
public void start() {
addItem(starting the applet );
}
public void stop() {
JAVA Aplicaes Web

addItem(stopping the applet );


}
public void destroy() {
addItem(unloading the applet);
}
void addItem(String word) {

36
System.out.println(word);
strBuffer.append(word);
repaint();
}
public void paint(Graphics g) {
//Draw a Rectangle around the applets display area.
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
//display the string inside the rectangle.
g.drawString(strBuffer.toString(), 10, 20);
}

@Override
public void mouseClicked(MouseEvent e) {
addItem(mouse clicked! );
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
addItem(mouse entered! );
}
@Override
public void mouseExited(MouseEvent e) {
addItem(mouse exited! );
}
}

Outros mtodos disponveis para um applet


Um mtodo que pode ser bastante til o resize(), que como o nome indica, permite rede-
finir o tamanho do applet na janela do navegador.

Muitos applets fazem uso do mtodo getImage(), que retorna um objeto Image que pode ser
exibido na tela pelo mtodo paint. Podem ser exibidas imagens nos formatos GIF, JPEG, BMP
e outros. Mas para exibir uma imagem preciso usar o mtodo drawImage() encontrado na
classe java.awt.Graphics. O exemplo a seguir implementa um applet com todos os passos
necessrios para visualizar imagens:
Captulo 3 - Applets

37
package visao;
import java.applet.AppletContext;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JApplet;
public class ExemploImgApplet extends JApplet {
private Image image;
private AppletContext context;
public void init() {
context = this.getAppletContext();
String imageURL = this.getParameter(image);
if(imageURL == null) {
imageURL = alert.gif;
}
try {
URL url = new URL(this.getDocumentBase(), imageURL);
System.out.println(url);
image = context.getImage(url);
} catch(MalformedURLException e) {
e.printStackTrace();
// Display in browser status bar
context.showStatus(Could not load image!);
}
}

public void paint(Graphics g) {


context.showStatus(Displaying image);
g.drawImage(image, this.getWidth()/2,
this.getHeight()/2, 33, 34, null);
repaint();
}
}

Um applet pode tambm reproduzir um arquivo de udio atravs da interface AudioClip no


pacote java.applet. A interface AudioClip tem trs mtodos:

11 public void play(): reproduz o clipe de udio uma vez, desde o incio.

11 public void loop(): faz com que o clipe de udio seja reproduzido continuamente.

11 public void stop(): para a reproduo do clipe de udio.

Para obter um objeto AudioClip, voc deve chamar o mtodo da classe Applet getAudioClip ().
O mtodo getAudioClip () retorna imediatamente, ou no resolve a URL para um arquivo de
JAVA Aplicaes Web

udio real. O arquivo de udio no baixado at que seja feita uma tentativa de reproduzir o
clipe de udio.

O mecanismo de som que reproduz os clipes de udio suporta vrios formatos de arquivo
de udio, incluindo:

38
11 Formato de arquivo Sun Audio (.au). q
11 Windows wave (.wav).

11 Macintosh AIFF (.aif ou .AIFF).

11 Musical Instrument Digital Interface MIDI (.mid ou .rmi).

Segue-se o exemplo mostrando todos os passos para ter um udio:

package visao;
import java.applet.AppletContext;
import java.applet.AudioClip;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JApplet;
public class ExemploAudioApplet extends JApplet {

private AudioClip clip;


private AppletContext context;
public void init() {
context = this.getAppletContext();
String audioURL = this.getParameter(audio);
if(audioURL == null) {
audioURL = teste.wav;
}
try {
URL url = new URL(this.getDocumentBase(), audioURL);
clip = context.getAudioClip(url);
} catch(MalformedURLException e) {
e.printStackTrace();
context.showStatus(Could not load audio file!);
}
}

public void start() {


if(clip != null) {
clip.loop();
}
}

public void stop() {


if(clip != null) {
clip.stop();
}
}
}
Captulo 3 - Applets

Existem tambm mtodos para obter informaes relacionadas com o applet, como por
exemplo, getAppletInfo() que retorna um string com informaes sobre este. Outro mtodo
o getParameterInfo(), que retorna um array de string com informaes sobre os parme-
tros recebidos applet.

39
Restries de segurana
De modo a garantir a segurana no uso de aplicaes remotas, existem uma srie de res-
tries em relao ao que um applet Java pode ou no fazer em uma mquina cliente. Por
default, uma applet no pode:

11 Acessar arquivos na mquina local. q


11 Chamar outro programa na mquina local.

11 Comunicar-se com nenhuma outra mquina, a no ser a que contm a pgina HTML
em questo (servidor).

Essas limitaes podem ser ocasionalmente autorizadas por meio de um arquivo especial
(policy file), atravs do qual definido o que permitido para um cdigo-fonte particular.
Acesse o AVA e veja os links para esta sesso.

Atividades Prticas
JAVA Aplicaes Web

40
4
Servlets
objetivos

Apresentar aos alunos o processo de desenvolvimento de aplicaes web com o uso


de Servlets, tecnologia disponibilizada para o processo de desenvolvimento de
aplicaes Java que utilizam a internet como base para seu funcionamento.

conceitos
Servlets; ServletRequest; ServletResponse; anotao @WebServlet; mtodos
GET e POST.

Definio
um componente da web, administrado por um programa que gera um contedo de q
pgina web dinmica.

Possui classes da linguagem de programao Java independentes de plataforma.

11 bytecode que pode ser dinamicamente carregado em um servidor web.

Interage com clientes web.

11 Modelo pedido-resposta (request-response).

11 Baseado no comportamento do protocolo de comunicao HTTP.

Os servlets so programas em Java usados para estender as funcionalidades de um servidor


web. Servlets so pequenos e possuem classes da linguagem de programao Java independentes
de plataforma, que, quando compilados, geram o byte-code que pode ser dinamicamente
carregado em um servidor web.

l Servlets interagem com clientes da web por um pedido-resposta implementado no programa


Servlets so para o
servidor, enquanto que Servlet. Esse modelo de pedido-resposta baseado no comportamento do protocolo de
applets so para comunicao HTTP (Hypertext Transfer Protocol), como ilustrado na figura 4.1.
o cliente.
Um Servlet define um conjunto de mtodos, sem interface grfica para usurio, que trabalha
juntamente com o Servlet Engine, ambiente escrito por uma distribuio de um servidor
web de acordo com a especificao Java Servlet API, que roda no servidor web, e que por sua
Captulo 4 - Servlets

vez trata das requisies e respostas aos clientes.

O programa cliente qualquer programa (escrito em Java), capaz de fazer conexes e


requisies ao servidor web. Essa requisio processada pela Servlet. Depois de feita a
requisio do cliente para Servlet Engine, ela retorna uma resposta ao Servlet. Aps isso, o
Servlet envia uma resposta dentro do protocolo HTTP para o cliente.

41
Load
Server Servlet Code

Client
Servlet Code
Handle Client
Requests
Server
Client

Unload Figura 4.1


Servlet Code Estrutura de
execuo de
Server
um Servlet.

Servlet controlado pelo conteiner WEB onde foi implementado. q


11 Quando uma requisio solicitada ao servlet, o conteiner WEB executa os
seguintes passos:

11 Se a instncia do servlet no existir.

22 Carrega a classe do servlet.

22 Cria uma instncia da classe do servlet.

22 Inicializa a instncia do servlet chamando o mtodo init().

22 Chama o mtodo processRequest().

22 Passa como parmetros os objetos request e respose.

22 Funcionalmente, Servlets esto entre programas CGI e extenses servidoras


proprietrias NSAPI. Entre as vantagens de usar Servlets, destacamos:

11 Fornecem uma maneira de gerar documentos dinmicos que so fceis de escrever e


rpidos para executar.

11 So mais rpidos que scripts CGI.

11 Usam uma API padro que suportada por muitos servidores web.

11 Possuem todas as vantagens da linguagem Java, incluindo facilidade de desenvolvi-


mento e independncia de plataforma.

11 Podem ter acesso a um grande nmero de APIs disponveis para a plataforma Java.

No cdigo, o ciclo de vida de um Servlet definido pela interface javax.servlet.Servlet


(disponvel aps instalao do JSDK), sendo que todos os Servlets devem implementar direta
ou indiretamente essa interface que roda no Servlet Engine.

Arquitetura Servlets
O Servlet Engine instancia e carrega um Servlet. A instanciao e carregamento geral-
mente acontecem quando a Servlet Engine inicia ou quando necessrio um Servlet para
responder por uma requisio. Ele pode carregar um Servlet oriundo de um sistema de
arquivos local ou remoto. A figura 4.2 apresenta os estgios de execuo de um Servlet.

Quando um Servlet aceita a chamada de um cliente, ele recebe dois objetos como q
JAVA - Aplicaes Web

parmetros:

11 ServletRequest:

22 Encapsula as mensagens do cliente para o servidor.

11 ServletResponse:

22 Encapsula as mensagens do servidor para o cliente.

42
Quando um Servlet aceita a chamada de um cliente, ele recebe dois objetos como parmetros:
o ServletRequest e o ServletResponse. O primeiro encapsula as mensagens do cliente para o
servidor, e o segundo encapsula as mensagens do servidor para o cliente. Existem subclasses
das classes j citadas que permitem a manipulao de dados mais especficos para determinados
protocolos, como o caso das classes HttpServletRequest e HttpServletResponse.

Servlet Engine

ServletCong

Servlet

ServletCong Init(...)

Request

ServletRequest

Response service(...)

ServletResponse

Figura 4.2
Estgios de destroy()
execuo de
um Servlet.

A interface ServletRequest permite que o Servlet acesse informaes como os nomes dos
parmetros enviados pelo cliente. Ainda provido do ServletInputStream, atravs do qual o
Servlet pode obter dados do cliente, utilizando os mtodos POST e PUT do protocolo HTTP.
J a interface ServletResponse d ao Servlet a capacidade de responder ao cliente. De forma
anloga, provido um objeto de sada ServletOutpuStream e outro objeto, Writer, pelos
quais os dados so respondidos.

Interface ServletRequest: permite que o Servlet acesse informaes enviadas pelo cliente. q
11 Nomes e contedos de parmetros enviados.

11 O protocolo que est sendo usado.

11 Nome do host remoto que fez a requisio, entre outras.

Interface ServletRespose: d ao Servlet a capacidade de responder ao cliente.

11 Permite que o Servlet especifique o tipo de dado que ser enviado.

11 Prov um objeto de sada ServletOutpuStream e outro objeto, Writer, pelos quais os


dados so respondidos.

Um exemplo de Servlet
O cdigo Java a seguir implementa uma classe Servlet Java, que apresenta alguns mtodos
Captulo 4 - Servlets

criados por default.

@WebServlet(name = NewServlet, urlPatterns = /NewServlet)


public class NewServlet extends HttpServlet {
protectedvoidprocessRequest(HttpServletRequestrequest,
HttpServletResponseresponse)
throws ServletException, IOException {} @Override

43
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throws ServletException, IOException {}
@Override
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo(){
return Short description;
}
}

Cabe destacar os seguintes trechos do cdigo:

@WebServlet: uma anotao que define um componente Servlet em uma aplicao web. q
11 Substitui a necessidade de referenciar o Servlet no descritor de implantao (web.xml)

processRequest(): mtodo padro para realizar a codificao da pgina de resposta


ao cliente.

doGet(): processa requisio do cliente com mtodo de submio GET.

11 Tamanho limitado de informao a ser submetida.

11 Segurana comprometida > Informaes podem ser visualizadas.

doPost(): processa requisio do cliente com mtodo de submio POST.

11 Tamanho ilimitado de informao a ser submetida.

11 Mais Seguro > Informaes ocultas.

getServletInfo(): retorna uma string com uma breve descrio sobre o Servlet.

Cada mtodo tem suas vantagens e desvantagens. GET tem um tamanho limitado para a
informao que submetida, tornando-se fcil de anexar na ltima URL do seu Java Servlet.
Por sua vez, POST no tem nenhuma limitao no tamanho da informao enviada, sendo
que a informao fica oculta a partir da URL.

Por exemplo, GET exibir algo como:

http://localhost:8084/ExemploServlet/ServMsg?nome=Paulo&idade=40

J POST no exibir o nome e a idade no final da URL, gerando algo como:

http://localhost:8084/ExemploServlet/ServMsg

obvio que GET pode impactar a segurana, uma vez que podemos claramente ver infor-
mao enviada para o Java Servlet. POST seria a melhor opo, mas s vezes prefervel
usar GET para tornar o desenvolvimento mais fcil. O mais comum utilizar o GET na
JAVA - Aplicaes Web

criao de links dinmicos para a navegao da aplicao web em desenvolvimento.

44
No trecho de cdigo a seguir, temos a implementao de requisies tanto via GET como POST.

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = NewServlet, urlPatterns = /NewServlet)


public class ExemploServlet01 extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(text/html;charset=UTF-8);
PrintWriter out = response.getWriter();
try {
/* TODO output your page here. You may use following sample */
out.println(<html>);
out.println(<head>);
out.println(<title>Servlet ExemploServlet 01</title>);
out.println(</head>);
out.println(</body>);
out.println(</html>);
} finally {
out.close();
}
}
/** Handles the HTTP <code>GET</code> method.
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
Captulo 4 - Servlets

}
/** Returns a short description of the servlet.
*/
@Override
public String getServletInfo() {
return Short description;
}// </editor-fold>
} 45
Estrutura de uma aplicao web
Qualquer aplicao em Java deve ser organizada de forma que seus recursos possam ser
facilmente identificados e utilizados durante o desenvolvimento e execuo de um deter-
minado projeto. A figura 4.3 ilustra a estrutura de diretrios criada para uma aplicao web
atravs do netBeans.

Figura 4.3
Estrutura de
diretrios de uma
aplicao web no
netBeans.

A pasta Pginas Web o diretrio-raiz (document root) da aplicao em desenvolvimento.


Na raiz dessa pasta dever estar o arquivo de inicializao da aplicao quando essa for
executada no browser. Esse arquivo conhecido como welcome file e geralmente recebe o
nome de index, sendo que no NetBeans ele tambm recebe a extenso.jsp por padro.

Pginas Web: q
11 Contm arquivos com a interface para o cliente.

11 META-INF.

22 Armazena arquivos de configurao necessrios para a execuo dos recursos


disponveis na aplicao.

22 Geralmente so encontrados o arquivo context.xml e manifest.mf.

11 WEB-INF.

22 Especialmente importante por ser o local da aplicao em desenvolvimento onde


sero armazenados os Servlets e JavaBeans.

Pacotes de Cdigos-Fonte:

11 Contm os cdigos Java que sero executados pelas requisies do cliente.

Bibliotecas:

11 Recursos adicionais necessrios execuo do projeto.


JAVA - Aplicaes Web

11 Driver de acesso ao banco de dados.

11 Biblioteca para gerao de relatrios (p.e. JasperReport).

A pasta WEB-INF especialmente importante por ser o local da aplicao em desenvolvimento


no qual sero armazenados os Servlets e JavaBeans. A pasta META-INF armazena arquivos de
configurao necessrios para a execuo dos recursos disponveis na aplicao. Geralmente
so encontrados o arquivo contexto.xml e manifest.mf.

46
Arquivo web.xml
O arquivo web.xml utilizado para se definir as configuraes das aplicaes em desenvol-
vimento, como por exemplo, o nome do Servlet, a localizao da classe, o url-pattern e o
timeout de sesso. A seguir apresentamos o contedo de um arquivo web.xml:

<?xml version=1.0 encoding=UTF-8?>


<web-app version=3.0 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://
www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/
javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd>
<servlet>
<servlet-name>ExemploServlet01</servlet-name>
<servlet-class>servlets.ExemploServlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ExemploServlet01</servlet-name>
<url-pattern>/ExemploServlet01</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

Executando um Servlet
possvel executar um Servlet diretamente na barra de endereos do browser, bastando
indicar a URL + <url-pattern>. Seria algo como:

http://localhost:8084/sessao04/exemplo01

O mais comum, contudo, usar uma pgina HTML para fazer uma referncia a um Servlet
que foi mapeado no arquivo web.xml. A seguir, mostramos um exemplo de pgina HTML
com essa referncia.

<html>
<head>
<title></title>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
</head>
<body>
<p align=center>&nbsp;</p>
<p align=center>Um Exemplo de Execuo de Servlets</p>
<p align=center>&nbsp;</p>
<p align=center><a href=ExemploServlet01>Clique aqui para executar o
Captulo 4 - Servlets

Servlet</a></p>
</body>
</html>

47
A pgina HTML apresentada faz referncia a <url-pattern> do <servlet-mapping>, definida
dentro do arquivo web.xml. A referncia a ExemploServlet01 possibilita o link necessrio
para que a aplicao em desenvolvimento consiga identificar um Servlet e coloc-lo em
execuo. A figura 4.4 procura demonstrar essas relaes.

<html>

<head>

<title><title)

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

</head>

<body>

<p align="center">&nbsp;</p>

<p align="center">Um Exemplo de Servlets</p>

<p align="center">&nbsp:</p>

<p align="center"><a href="exemplo01">Clique aqui para executar o Servlet</a></p>

</body>

</html>

Figura 4.4
Servlet com passagem de parmetros Servlet
referenciado via
Vimos nos exemplos anteriores que podemos chamar um Servlet em uma pgina HTML. pgina HTML.

As pginas HTML disponibilizam vrios recursos que podem ser utilizados para o desenvolvi-
mento de interfaces amigveis com o usurio, sendo essas acessveis em browsers. Entre eles
temos a possibilidade de criar um formulrio para entrada de dados e posterior envio desses
dados ao servidor. Para isso devemos utilizar a tag html <form> e configurar o mtodo de
submisso e o Servlet que vai receber os valores para que possam ser processados de acordo
com a necessidade da aplicao em desenvolvimento.

O cdigo HTML, a seguir, ilustra a criao de uma pgina que possibilita o envio de dados
do cliente para que possam ser processados por um Servlet no lado servidor da aplicao
em desenvolvimento. A execuo desse cdigo em um browser tem como resultado o que
exibido na figura 4.5.

<html>
<head>
<title></title>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
</head>
<body>
JAVA - Aplicaes Web

<form method=POST action=ExemploServlet02>


Digite uma frase: <input name=frase value=>
<br><br>
<input type=submit value=Enviar>
</form>
</body>
</html>
48
Figura 4.5
Formulrio HTML
de entrada
de dados.

Servidor: q
11 Uso do doPost().

11 Uso do request.getParameter(String param).

11 Uso de Wrappers e casting.

A seguir, apresentamos o mtodo doPost() da classe Servlet, que vai receber os valores enviados
do formulrio HTML e realizar o processamento das informaes. As classes responsveis pela
comunicao entre cliente e servidor so: HttpServletRequest e HttpServletResponse.

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);

response.setContentType(text/html;charset=UTF-8);
PrintWriter out = response.getWriter();
try {
/* TODO output your page here. You may use following sample code. */
out.println(<html>);
out.println(<head>);
out.println( <title>Servlet ExemploServlet02</title>);
out.println(</head>);
out.println( <body>);
out.println( <center>);
out.println( A frase digitada foi: <b> + request.
getParameter(frase) + </b>);
out.println( <br><br><a href=exemplo02.html>Voltar</a>);
out.println( </center>);
out.println( </body>);
out.println(</html>);
} finally {
out.close();
}
}

O objeto criado a partir da interface HttpServletRequest encapsula todos os dados referentes


solicitao do usurio. Esses dados so posteriormente acessados pelo mtodo da prpria
interface, bem como mtodos herdados da interface ServletRequest.

O objeto criado a partir da interface HttpServletResponse realiza o caminho inverso da


Captulo 4 - Servlets

interface HttpServletRequest. O objeto gerado a partir da instanciao dela envia dados


encapsulados ao usurio em resposta solicitao do cliente.

Figura 4.6
HTML resultante
do processo de
Servlet.

49
Exerccios de fixao e
Servlets
Qual a diferena entre applet e Servlet?

Atividades Prticas
JAVA - Aplicaes Web

50
5
JSP (Java Server Pages)
objetivos

Apresentar aos alunos os mecanismos de controle de aplicaes Java para internet


com o uso de scriplets JSP, tecnologia utilizada no desenvolvimento de pginas
dinmicas acessveis por meio de navegadores internet.

conceitos
JSP; dados estticos; elementos sintticos e objetos implcitos.

Introduo
JSP (Java Server Pages) uma tecnologia para desenvolvimento de aplicaes web semelhante
ao Microsoft Active Server Pages (ASP), porm tem a vantagem da portabilidade de plataforma
podendo ser executado em outros Sistemas Operacionais alm daqueles oferecidos pela
Microsoft. Permite ao desenvolvedor de sites produzir aplicaes que acessam banco de dados
ou arquivos-texto, que captem informaes a partir de formulrios, quem captem informaes
sobre o visitante ou sobre o servidor, o uso de variveis e loops, entre outras coisas.

JavaServer Pages (JSP). q


11 Tecnologia que ajuda os desenvolvedores de software a criarem pginas web geradas
dinamicamente.

11 Baseadas em HTML, XML e outros tipos de documentos.

Lanada em 1999 pela Sun Microsystems.

11 Similar ao PHP e ASP, mas usa a linguagem de programao Java.

No oferece nada que voc no possa conseguir com os servlets puros.

11 Vantagem de ser facilmente codificado, facilitando assim a elaborao e manuteno


Captulo 5 - JSP ( Java Server Pages)

de uma aplicao.

Quem conhece servlets ver que o JSP no oferece nada que voc no possa conseguir com os
servlets puros. O JSP, entretanto, oferece a vantagem de ser facilmente codificado, facilitando
assim a elaborao e manuteno de uma aplicao. Alm disso, essa tecnologia permite separar
a programao lgica (parte dinmica) da programao visual (parte esttica), facilitando o
desenvolvimento de aplicaes mais robustas, onde programador e designer podem trabalhar
no mesmo projeto, mas de forma independente. Outra caracterstica do JSP produzir contedos
dinmicos que possam ser reutilizados.

51
Quando uma pgina JSP requisitada pelo cliente atravs de um browser, essa pgina
executada pelo servidor, e a partir da ser gerada uma pgina HTML que ser enviada de
volta ao browser do cliente. A figura 5.1 ilustra esse funcionamento.

Cliente Response

Request JSP Engine Response


&
WEB Server
Response
JSP
Request
File
Component
Figura 5.1
Request Funcionamento da
arquitetura JSP.

Quando o cliente faz a solicitao de um arquivo JSP, enviado um object request para
a JSP engine. A JSP engine envia a solicitao de qualquer componente (podendo ser um
JavaBeans component, servlet ou enterprise Bean) especificado no arquivo. O componente
controla a requisio possibilitando a recuperao de arquivos em banco de dados ou outro
dado armazenado e, em seguida, passa o objeto response de volta para a JSP engine. A JSP
engine e o web server enviam a pgina JSP revisada de volta para o cliente, onde o usurio
pode visualizar os resultados atravs do browser. O protocolo de comunicao usado entre
o cliente e o servidor pode ser HTTP ou outro protocolo.

Por definio, JSP usa Java como sua linguagem de scripts. Por esse motivo, O JSP se apre-
senta mais flexvel e mais robusto do que outras plataformas baseadas simplesmente em
JavaScripts e VBScripts.

Dificuldades no uso de servlets: q


11 Problemas de manuteno.

11 Legibilidade do cdigo.

11 Cdigo Java misturado com cdigo HTML.

Vantagens do JSP:

11 Utilizao de forma direta no HTML.

11 Possibilita a incluso de instrues Java.

Elementos sintticos
A sintaxe JSP especifica a presena de dois tipos genricos de dados para a formao de uma
pgina JSP:

11 Dados estticos.

11 Os prprios elementos sintticos.


JAVA - Aplicaes Web

Os dados estticos so todos os que no podem ser interpretados por serem desconhecidos
da sintaxe JSP, como texto, HTML e XML.

Os elementos sintticos so os prprios componentes da sintaxe JSP, aqueles que podem


ser interpretados por um servidor web que processe cdigos JSP.

52
A sintaxe JSP especifica a presena de dois tipos genricos de dados para a formao de q
uma pgina JSP:

11 Dados estticos: no podem ser interpretados por serem desconhecidos da sintaxe


JSP

22 Textos, HTML e XML.

11 Os prprios elementos sintticos: podem ser interpretados.

22 Os elementos do tipo diretiva.

22 Os elementos do tipo ao.

22 Os elementos do tipo scripting.

Diretivas
As diretivas so elementos vitais para a fase de traduo da pgina JSP. Por meio das dire-
tivas so obtidas informaes globais e que no dependem de qualquer solicitao, como,
por exemplo, a incluso de uma classe Java, a especificao de que a pgina JSP faz parte de
uma sesso, entre outras. Por isso, sempre so conceitualmente vlidas. A sintaxe bsica :

<%@ diretiva %>

Diretivas formato de uso. q


11 <%@ nome-da-diretiva [nome-do-atributo = valor-do-atributo]%>

Diretivas disponveis:

11 <%@ page lista-de-atrubutos %>

11 <%@ include file=url-relativa

11 <%@ taglib uri=url-relativa-biblioteca-tags prefix=prefixo-tags %>

A seguir, mostramos um trecho de cdigo exemplificando o uso da diretiva page.

<%@ page contentType=text/html pageEncoding=ISO-8859-1%>


<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>JSP Page</title>
</head>
<body>
<title>Exemplo diretiva page</title>
</body>
</html>
Captulo 5 - JSP ( Java Server Pages)

No exemplo anterior, a diretiva page contentType usada para definir o tipo MIME do contedo
a ser enviado na resposta da execuo de uma pgina JSP, sendo o seu valor padro text/html.
J a diretiva pageencoding utilizada para definir o conjunto codificador de caracteres para a
pgina JSP. Nesse exemplo, estamos utilizando o conjunto de caracteres Latin 1.

J no exemplo a seguir, definimos o contetType como sendo um arquivo Excel. Desta forma,
o contedo a ser processado na pgina ser disponibilizado para visualizao ou download
como sendo uma planilha Excel e no como um conjunto de tags HTML a ser interpretada
pelo browser.

53
<%@ page contentType=application/vnd.ms-excel pageEncoding=ISO-8859-1%>
<html>
<head>
<title>Exemplo diretiva page-contentType</title>
</head>
<body>
</body>
</html>

O arquivo de exemplo ExemploContentType.jsp ilustra a utilizao do contentType que


indica o tipo de arquivo planilha Excel, fazendo com que o Sistema Operacional abra uma
janela de dilogo j identificando o tipo do arquivo, conforme pode ser visto na figura 5.2.

Figura 5.2
Janela de dilogo
usando informao
definida no atributo
contentType.

Aes
As informaes fornecidas pelas aes so empregadas na fase de execuo. Por estar
ligada fase de solicitao, a interpretao de uma ao depende diretamente dos detalhes
da solicitao recebida. A seguir, podemos ver a sintaxe desse tipo de elemento com alguns
exemplos prticos.

<jsp:<identificador-da-ao>/> q
11 <jsp:include page={ relativeURL | <%= expression %> } />

11 <jsp:forward page={ relativeURL | <%= expression %>} />

Elementos de script
Os elementos de script estabelecem um mecanismo que une os dados estticos e os
dados dinmicos.

Existem trs tipos de elementos de script: q


11 Declaraes
JAVA - Aplicaes Web

22 <%! declarao; %>.

11 Scriplets

22 <% cdigo; %>.

11 Expresses

22 <%= expresso; %>.

54
Um quarto tipo de elemento de scripting o comentrio, que serve para documentar o
cdigo JSP e que no so enviados para as solicitaes realizadas pelos browsers clientes.
Comentrios podem usar as seguintes sintaxes: <!-- comentrio -->, <%-- comentrio --%>
e <% /* comentrio */ %>. A ltima alternativa utilizada dentro da pgina atravs de um
scriplet, usando a sintaxe de comentrio nativa da linguagem Java de criao de scripts.

As Declaraes so empregadas na declarao de mtodos e variveis a serem utilizados


pela pgina JSP, conforme exemplificado a seguir.

<%-- Exemplo de Declarao de variveis --%>


<%!
private String mensagem=Exemplo de vriveis e mtodos;
Date agora = new Date();
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
%>
<%-- Exemplo de Declarao de mtodo --%>
<%!
public String getMensagem(){
return this.mensagem;
}
%>

Os scriplets so empregados com cdigos de programao que sero executados a cada


nova solicitao da pgina. Fazem uso da estrutura da linguagem de programao Java con-
forme podemos ver no trecho de cdigo a seguir.

<%-- Uso de scriplet --%>


<%
out.println(<hr>+this.getMensagem());
int num = 25;
if( num % 2 == 0)
out.println(num + par!);
else
out.println(num + impar!);
%>

Expresses, por sua vez, so empregadas na gerao de dados a serem exibidos ao usurio
na resposta. Assim como os scriplets, as expresses so executadas a cada nova solicitao.
Veja o exemplo:

<%-- Uso de expresses --%>


<hr>
<%= this.getMensagem() %>
Captulo 5 - JSP ( Java Server Pages)

<hr>
Essa pgina foi acessada em <%= df.format(agora) %>

O resultado da execuo do arquivo declarandovariaveis.jsp, contendo os exemplos anterior


e disponvel no diretrio de exemplos desta sesso, pode ser visto na figura 5.3.

55
Figura 5.3
Resultado da
execuo de
declarando
variaveis.jsp.

Exemplos JSP
O cdigo JSP a seguir apresenta uma pgina que ser construda dinamicamente com dados
que sero enviados a ela por meio de uma pgina HTML com um formulrio de entrada de
dados. O valor enviado ser processado por meio do elemento de script <%={expresso}%>.
Nesse exemplo, utilizamos o elemento implcito request para capturar o valor submetido
pelo mtodo getParameter().

<%@page contentType=text/html pageEncoding=UTF-8 language=java%>


<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSP Page</title>
</head>
<body>
<center>
<h1>A frase digitada foi: <%= request.getParameter(frase) %></h1>
</center>
</body>
</html>

O cdigo HTML a seguir utilizado para possibilitar a digitao de uma frase e seu posterior
envio pelo scriplet JSP apresentado anteriormente para processamento no servidor.

<html>
<head>
<title>Executando um jsp</title>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
</head>
<body>
<form action=mensagem.jsp method=POST>
<p>Digite uma Frame:<input type=text size=20 name=frase></p>
<p align=center>
<input type=submit name=B1 value=Enviar>
<input type=reset name=B2 value=Limpar>
JAVA - Aplicaes Web

</p>
</form>
</body>
</html>

56
J nesse outro exemplo mostramos como proceder para receber e alterar o tipo bsico de
um parmetro enviado atravs de uma requisio web. Assim possvel realizar clculos,
tirando proveito da classe parser Integer para realizar a converso do parmetro, que por
definio textual, para inteiro.

<%@page language=java
import=java.io.*
%>
<HTML>
<HEAD>
<TITLE>Teste JSP</TITLE>
</HEAD>
<BODY>
<%int num = Integer.parseInt(request.getParameter(num)); %>
<center>
<h1>Tabuada do nmero <%= request.getParameter(num) %> </h1><br>
</center>
<% for(int i = 1; i <= 10; i++){
out.print(<br>+num+ * +i+ = +(num*i));
} %>
<br><br>
<center>
<a href=javascript:history.back();>voltar</a>
</center>

</BODY>

</HTML>

Objetos implcitos
Podemos criar, dentro de scriptlets na pgina JSP, instncias de uma classe Java e manipul-las
a fim de produzir contedo dinmico. Por exemplo, podemos criar um objeto de uma classe
que acessa uma base de dados e ento usar mtodos desse objeto para exibir na pgina uma
consulta ou transao com a base de dados. Atravs da manipulao desse objeto, quer seja
acessando seus mtodos ou suas variveis, podemos gerar contedo dinmico para a pgina JSP.

Alm de objetos como esses, que esto completamente sob o controle do programador, o
container JSP se encarrega de instanciar automaticamente, durante a execuo de uma pgina
JSP, alguns objetos. Tais objetos podem ser usados dentro da pgina JSP e so conhecidos
como Objetos Implcitos.

11 O container JSP se encarrega de instanciar automaticamente, durante a execuo q


Captulo 5 - JSP ( Java Server Pages)

de uma pgina, alguns objetos.

11 Tais objetos podem ser usados dentro da pgina JSP e so conhecidos como
Objetos Implcitos.

11 Um Objeto Implcito sempre uma instncia de uma classe ou interface pertencente


ao container JSP.

57
Assim como todo objeto em Java, cada objeto implcito uma instncia de uma classe ou
interface e segue uma API correspondente. A tabela 5.1 apresenta um resumo dos objetos
implcitos disponveis em JSP, suas respectivas classes ou interfaces e uma pequena
descrio do objeto.

Objeto Classe ou interface Descrio

Page javax.servlet.jsp.HttpJspPage Instncia de servlet da pgina.

Config javax.servlet.ServletConfig Dados de configurao de servlet.

Request javax.servlet.http.HttpServletRequest Dados de solicitao, incluindo parmetros.

Response javax.servlet.http.HttpServletResponse Dados de resposta.

Out javax.servlet.jsp.JspWriter Fluxo de sada para contedo da pgina.

session javax.servlet.http.HttpSession Dados de sesso especficos de usurio.

Dados compartilhados por todas as pginas de


application javax.servlet.ServletContext
aplicao.

pageContext javax.servlet.jsp.PageContext Dados de contexto para execuo da pgina.

exception javax.lang.Throwable Erros no capturados ou exceo.

q
Tabela 5.1
Objetos implcitos
Pginas JSP no so executadas diretamente.
de JSP e suas APIS
JSP convertido em servlets. para aplicaes de
HTTP.
11 Na primeira chamada ao JSP.

11 O que ocorre: servlet gerado com o uso das marcaes JSP.

Em tempo de execuo.

11 No existe interpretao de pginas JSP.

11 Somente cdigo servlet executado.

Os nove objetos implcitos acima listados so analisados em maior detalhe a seguir.

Tipos de Objetos Implcitos: q


11 Objetos relacionados ao servlet.

22 page e config.

11 Objetos relacionados ao input e output de pginas.

22 request, response e out.

11 Objetos contextuais (acesso ao contexto da pgina JSP).

22 application, session, request e pageContext.

11 Objetos relacionados a diferentes tipos de erro.

22 exception
JAVA - Aplicaes Web

Comeamos com os objetos relacionados ao servlet da pgina, que so o page e config.


Eles se baseiam na implementao da pgina JSP como um servlet.

Depois seguimos com os objetos relacionados com o input (entrada de dados) e com o
output (sada de informao) de uma pgina JSP, que so o request, response e out.

58
Temos tambm os objetos contextuais application, session, request e pageContext. Esses
objetos fornecem pgina JSP o acesso ao contexto dentro do qual ela est respondendo.
Todos eles tm a capacidade de armazenar e recuperar valores de atributos. Os atributos de
pgina armazenados no objeto pageContext duram apenas enquanto o processamento de uma
nica pgina ocorre. Os atributos de solicitao, armazenados no objeto request, tambm tm
pouca durao, mas podem ser transferidos entre pginas quando for transferido o controle.

Os atributos de sesso, armazenados no objeto session, duram enquanto o usurio conti-


nuar a interagir com o servidor da web. Os atributos de aplicao, armazenados no objeto
application, so mantidos enquanto o container JSP mantiver uma ou mais pginas de uma
aplicao carregada na memria (enquanto o container JSP estiver rodando).

A tabela 5.2 apresenta os mtodos comuns a esses quatro objetos implcitos e que so
usados para armazenar e recuperar valores de atributos.

Mtodos Descrio

void setAttribute(String key, Object value) Associa um valor de atributo com um nome.

Enumeration getAttributeNames() Recupera os nomes de todos os atributos associados com o objeto.

Object getAttribute(String key) Recupera o valor de atributo associado com a chave.

void removeAttribute(String key) Remove o valor de atributo associado com a chave.

Tabela 5.2 Finalmente, temos o objeto que resultante de diferentes tipos de erro: o objeto exception.
Os mtodos Ele tem por propsito permitir o tratamento de erros dentro de uma pgina JSP.
comuns aos objetos
contextuais. Conforme j mencionado, cada um desses objetos implcitos ser apresentado em mais
detalhes a seguir.

Objeto page
Representa a prpria pgina JSP ou, mais especificamente, uma instncia da classe de q
servlet na qual a pgina foi traduzida.

Implementa as interfaces.

11 javax.servlet.jsp.HttpJspPage.

11 javax.servlet.jsp.JspPage.

No trecho de cdigo a seguir, temos um exemplo utilizando o objeto implcito page.

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


pageEncoding=ISO-8859-1
info = Autor: Paulo Henrique Cayres
%>
Captulo 5 - JSP ( Java Server Pages)

<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Exemplo Objeto Page</title>
</head>
<body>
<%= ((javax.servlet.jsp.HttpJspPage)page).getServletInfo() %>
</body>
</html>

59
Objeto config
O objeto config armazena dados de configurao do servlet: na forma de parmetros de
inicializao: para o servlet na qual uma pgina JSP compilada. Pelo fato de as pginas
JSP raramente serem escritas para interagir com parmetros de inicializao, esse objeto
implcito raramente usado na prtica. O objeto config uma instncia da interface javax.
servlet.ServletConfig.

Objeto config: q
11 Armazena dados de configurao de servlet para o servlet na qual uma pgina JSP
compilada.

22 Faz isso na forma de parmetros de inicializao.

11 Esse objeto implcito raramente usado na prtica.

22 Pginas JSP raramente so escritas para interagir com parmetros de inicializao.

11 uma instncia da interface javax.servlet.ServletConfig.

Os mtodos fornecidos por essa interface para recuperar parmetros de inicializao de


servlet esto listados a seguir:

Mtodos Descrio

Enumeration getInitParameterNames() Recupera os nomes de todos os parmetros de inicializao.

String getInitParameter(String name) Recupera o valor do parmetro de inicializao a partir de um nome.

Apresentamos um exemplo do uso desse tipo de objeto implcito a seguir. Tabela 5.3
Mtodos do objeto
<%@page import=java.util.Enumeration%> config.
<%@page contentType=text/html pageEncoding=UTF-8%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSP Page</title>
</head>
<body>
<%
Enumeration temp = getInitParameterNames();
while (temp.hasMoreElements()){
String name = (String)temp.nextElement();
out.println(name + = + getInitParameter(name)+<br>);
}

%>

</body>

</html>
JAVA - Aplicaes Web

A figura 5.4 apresenta o resultado da execuo do servlet.

60
Figura 5.4
Exemplo do
uso do objeto
implcito config.

Objeto request
Representa a solicitao que requisitou a pgina. q
Implementa a interface javax.servlet.http.HttpServletRequest.

11 Uma subinterface de javax.servlet.ServletRequest.

Tambm classificado como um objeto contextual.

11 um dos mais complexos e mais utilizados na construo de pginas JSP.

Podemos dividir os mtodos desse objeto em quatro categorias:

11 Armazenar e Recuperar valores de atributos.

11 Recuperar parmetros de solicitao e cabealho de HTTP.

11 Recuperar cabealhos de solicitao e cabealhos de HTTP.

11 Outros mtodos diversos.

Por ser um dos objetos mais utilizados em pginas JSP vale a pena mostrar os principais
mtodos a ele associados, agrupados de acordo com as categorias recm-listadas.

Mtodo Descrio

void setAttribute
Associa um valor de atributo com um nome.
(String key, Object value)

Enumeration Recupera os nomes de todos os atributos associados com o


getAttributeNames() objeto.

Tabela 5.4 Object getAttribute


Recupera o valor de atributo associado com a chave.
Mtodos do objeto (String key)
request: armazenar
e recuperar valores void removeAttribute
Remove o valor de atributo associado com a chave.
de atributos. (String key)

Mtodos Descrio

Enumeration Retorna os nomes de todos os parmetros


getParameterNames() de solicitao.
Tabela 5.5
Mtodos do objeto
String getParameter Retorna o primeiro valor (principal) de um nico
request: recuperar
(String name) parmetro de solicitao.
parmetros de
Captulo 5 - JSP ( Java Server Pages)

solicitao e String[] Recupera todos os valores para um nico


cabealho de HTTP. getParameterValues(String name) parmetro de solictao.

61
Mtodos Descrio

Enumeration Recupera os nomes de todos os cabealhos associados


getHeaderNames() com a solicitao.

String getHeader Retorna o valor de um nico cabealho de solicitao,


(String name) como uma cadeia.

Enumeration getHeaders Retorna todos os valores para um nico cabealho de


(String name) solicitao.

int getIntHeader Retorna o valor de um nico cabealho de solicitao, com Tabela 5.6
(String name) um nmero inteiro. Mtodos do objeto
request: recuperar
long getDateHeader Retorna o valor de um nico cabealho de solicitao,
cabealhos de
(String name) como uma data.
solicitao e
cabealhos de
Cookies[] getCookies() Recupera todos os cookies associados com a solicitao.
HTTP..

Mtodos Descrio

String getMethod() Retorna o mtodo de HTTP (e.g, POST, GET etc.) para a solicitao.

String getRequestURI() Retorna a URL de solicitao (no inclui a cadeia de consulta).

Retorna a cadeia de consulta que segue a URL de solicitao, se


String getQueryString()
houver algum.

Recupera os dados da sesso para a solicitao (i.e, o objeto


HttpSession getSession()
implcito session).

Recupera os dados da sesso para a solicitao (i.e, o objeto implcito


HttpSession getSession(boolean flag)
session), opcionalmente criando-o se ele ainda no existir.

RequestDispatcher
Cria um dispatcher de solicitao para o URL local indicado.
getRequestDispatcher(String path)

String getRemoteHost() Retorna o nome totalmente qualificado do host que enviou a solicitao.

String getRemoteAddr() Retorna o endereo de rede (IP) do host que enviou a solicitao.

String getRemoteUser() Retorna o nome do usurio que enviou a solicitao, se conhecido.

O trecho de cdigo a seguir apresenta um exemplo da utilizao do objeto implcito request Tabela 5.7
na construo de scriplets JSP para pginas dinmicas. Mtodos do objeto
request: outros
..... mtodos diversos.

Seu IP :<%= request.getRemoteAddr() %><br>


Seu Host :<%= request.getRemoteHost() %><br>
.....

Objeto response
Representa a resposta que ser enviada de volta para o usurio como resultado do q
JAVA - Aplicaes Web

processamento da pgina JSP.

Implementa a interface javax.servlet.http.HttpServletResponse.

11 uma subinterface de javax.servlet.ServletResponse.

Podemos dividir os mtodos desse objeto em quatro categorias:

11 Especificar o tipo de contedo e codificao da resposta.

62
11 Definir cabealhos da resposta. q
11 Definir cdigos de resposta.

11 Reescrita da URL.

Por ser tambm um dos objetos mais utilizados em pginas JSP, vamos igualmente mostrar
os principais mtodos a ele associados, agrupados de acordo com as categorias anterior-
mente listadas.

Tabela 5.5 Mtodos Descrio


Mtodos do
objeto response: void setContentType Define o tipo MIME e, opcionalmente, a codificao
especificar o tipo (String type) de caracteres do contedo da resposta.
de contedo e
codificao da Retorna o conjunto de estilos de codificao de
String getCharacterEncoding()
resposta. caracteres para o contedo da resposta.

Mtodos Descrio

void addCookies
Adiciona o cookie especificado.
(Cookie cookie)

boolean containsHeader
Verifica se a resposta inclui o cabealho.
(String name)

void setHeader(String name, Atribui o valor definido pela varivel value ao


String value) cabealho especificado por name.

void setIntHeader Atribui o valor de nmero inteiro especificado por


(String name, int value) value ao cabealho especificado por name.

void setDateHeader Atribui o valor de data especificado por value ao


(String name, long date) cabealho especificado por name.

void addHeader Adiciona o valor definido por value ao cabealho


(String name, String value) especificado por name.

Tabela 5.8
void addIntHeader Adiciona o valor de nmero inteiro especificado por
(String name, int value) value ao cabealho especificado por name.
Mtodos do objeto
response: Definir
void addDateHeader Adiciona o valor de data especificado por value ao
cabealhos da
(String name, long date) cabealho especificado por name.
resposta.

O exemplo a seguir ilustra uma das utilidades desse objeto. Vrios cabealhos so definidos
para evitar que a pgina seja armazenada em cache por um navegador.

<%
response.setHeader(Expires, 0);
response.setHeader(Pragme, no-cache);
if(request.getProtocol().equals(HTTP/1.1)){
Captulo 5 - JSP ( Java Server Pages)

response.setHeader(Cache-Control, no-cache);
}
%>

Esse script primeiro define o cabealho Expires para uma data no passado. Isso significa
que o contedo da pgina j expirou, como uma dica que seu contedo no deve ser
armazenado em cache.

63
Mtodos Descrio

Define o cdigo de status para a resposta


void setStatus(int code)
(para circunstncias sem erro).

void sendError Define o cdigo de status e mensagem de erro para


(int status, String msg) a resposta. Tabela 5.9
Mtodos do
Envia uma resposta para o navegador indicando que objeto response:
void sendRedirect(String url) definir cdigos de
ele deveria solicitar uma URL alternativa (absoluto).
resposta.

Mtodos Descrio

String Codifica uma URL para uso com o mtodo sendRedirect()


encodeRedirectURL(String url) para incluir informaes de sesso. Tabela 5.10
Mtodos do objeto
Codifica um URL usado em um link para incluir informa- response: Reescrita
String encodeURL(String url)
es de sesso. da URL.

Objeto out
11 Esse objeto representa o fluxo de sada para a pgina. q
11 O contedo ser enviado para o navegador com o corpo de sua resposta.

11 uma instncia da classe javax.servlet.jsp.JspWriter.

11 Implementa todos os mtodos print() e println() definidos por java.io.Writer.

11 Pode ser usado dentro de um script para adicionar contedo pgina gerada.

Vejamos um exemplo do uso do objeto out:

<%
int i = (int)(Math.random()*10);
if(i%2==0){
out.print(O Nmero escolhido + i + par!);
}
else {
out.print(O Nmero escolhido + i + impar!);
}
%>

Esse objeto muito utilizado para gerar contedo dentro do corpo de um script, sem ter de
fech-lo temporariamente para inserir contedo de pgina esttica. Contudo, deve-se evitar usar
os mtodos print() ou println() para inserir cadeias de caracteres muito grandes. No prximo
exemplo, mais aconselhvel fechar o script e inserir o contedo esttico. Veja o resultado:

<%-- No Aconselhvel: --%>


<%
if(i %2 == 0){
JAVA - Aplicaes Web

out.print(<h6>+
<font face=verdana>+
O nmero par.+
</font>+
</h6>);

64
}
%>
<%-- Aconselhvel: --%>
<% if(i == 1) {%>
<h6>
<font face=verdana>
O nmero par
</font>
</h6>
<% } %>

O segundo exemplo do quadro anterior utiliza tags HTML sem realizar a concatenao de
string atravs de cdigo Java. Isso torna a criao e resposta da pgina HTML dinmica para
o cliente solicitante mais rpida, uma vez que o cdigo dinmico se restringe apenas ao teste
de condio if. J o primeiro exemplo tem-se o gasto de processamento de concatenao de
string alm do j mencionado teste de condio.

Objeto session
Representa a sesso atual de um usurio individual e armazena informaes sobre ela. q
11 Todas as solicitaes feitas por um usurio so consideradas parte de uma sesso.

11 Aps um perodo de tempo sem receber qualquer nova solicitao do usurio, a


sesso expira.

Implementa a interface javax.servlet.http.HttpSession.

Um de seus principais usos armazenar e recuperar valores de atributos para transmitir


as informaes especficas de usurios entre as pginas.

A seguir, um exemplo que armazena dados na sesso, na forma de um objeto que ins-
tncia de uma classe hipottica Usuario:

<%
Usuario u = new Usuario(nome, senha);
session.setAttribute(usuario, u);
%>

Uma vez que um objeto tenha sido armazenado atravs do mtodo setAttibute(), ele pode
ser recuperado na mesma pgina ou em outra acessada pelo usurio. O cdigo a seguir
ilustra a recuperao do objeto armazenado no cdigo anterior.

<%
Usuario u = (Usuario)session.getAttribute(usuario);
.....
Captulo 5 - JSP ( Java Server Pages)

%>

Perceba que o mtodo getAttribute() retorna um objeto da classe Object, portanto, necessrio
fazermos um cast para converter o objeto retornado em uma instncia da classe desejada.

A seguir, os principais mtodos utilizados por esse objeto, alm daqueles descritos anteriormente
na tabela 5.2:

65
Mtodos Descrio

Object getAttibute(String nome) Recupera o objeto identificado por nome.

String getId() Retorna o Id da sesso.

long getCreationTime() Retorna a hora na qual a sesso foi criada.

Retorna a ltima vez que uma solicitao associada com a sesso foi
long getLastAccessedTime()
recebida.

Retorna o tempo mximo (em segundos) entre solicitaes pelo qual a


int getMaxInactiveInterval()
sesso ser mantida.

Define o tempo mximo (em segundos) entre solicitaes pelo qual a


void setMaxInactiveInterval(int time)
sesso ser mantida.

Retorna se o navegador do usurio ainda no tiver confirmado o ID de


boolean isNew()
sesso.

Descarta a sesso, liberando quaisquer objetos armazenados como


boolean invalidate()
atributos.

Tabela 5.11
Objeto application Mtodos do objeto

q
session.
11 Representa a aplicao qual a pgina JSP pertence.

11 uma instncia da interface javax.servlet.ServletContext.

11 Os containers JSP tipicamente tratam do primeiro nome de diretrio em uma URL


como uma aplicao.

11 Podemos dividir os mtodos desse objeto em quatro categorias:

22 Recuperar informaes de verso do container servlet.

22 Interagir com arquivos e caminhos no servidor.

22 Suporte para log de mensagens.

22 Acessar parmetros de inicializao.

Exemplo:

http://localhost:8080/curso/index.jsp
http://localhost:8080/curso/jsp/ex01/index.jsp
http://localhost:8080/curso/jsp/excalc/index.jsp
Tabela 5.12
No exemplo anterior, todas as pginas JSP so consideradas parte da mesma aplicao, no Mtodos do
objeto application
caso, a aplicao curso. Recuperar
informaes de
Alm dos mtodos descritos na tabela 5.2, o objeto application tambm apresenta os verso do container
seguintes outros mtodos que podem ser divididos em quatro categorias: servlet.

Mtodo Descrio

String getServerInfo() Retorna o nome e verso do container servlet.


JAVA - Aplicaes Web

int getMajorVersion() Retorna a verso principal da API do servlet para o container servlet.

int getMinorVersion() Retorna a verso secundria da API do servlet para o container servlet.

66
Mtodo Descrio

String getMimeType Retorna o tipo MIME para o arquivo indicado, se


(String filename) conhecido pelo servidor.

Traduz uma cadeia especificando uma URL em


URL getResource
um objeto que acessa os contedos das URLs,
(String path)
localmente ou na rede.

InputStream Traduz uma cadeia especificando uma URL em um


getResourceAsStream(String path) fluxo de entrada para ler seu contedo.

Traduz uma URL local em um nome de caminho no


Tabela 5.13 String getRealPath(String path)
sistema de arquivo local.
Mtodos do
objeto application ServletContext getContext Retorna o contexto de aplicao para a URL local
Interagir (String path) especificada.
com arquivos
e caminhos no RequestDispatcher Cria um dispacher de solicitao para a URL local
servidor. getRequestDispatcher(String path) indicada.

Mtodo Descrio
Tabela 5.14
void log(String message) Grava a mensagem o arquivo de log.
Mtodos do objeto
application
void log(String message, Grava a mensagem no arquivo de log, junto com a trilha
Suporte para log de Exception e) de pilha para a exceo especificada.
mensagens.

Mtodo Descrio

Tabela 5.15 Enumerations Recupera os nomes de todos os parmetros de


Mtodos do objeto getInitParameterNames() inicializao.
application
Acessar parmetros String getInitParameter Recupera o valor do parmetro de inicializao como
de inicializao. (String name) o nome dado.

Objeto pageContext
O objeto pageContext fornece vrias facilidades como gerenciamento de sesses, atributos,
pginas de erro, incluses e encaminhamento de requisies de fluxo de resposta. O objeto
pageContext uma instncia da classe javax.servlet.jsp.PageContext.

Objeto pageContext: q
11 Fornece vrias facilidades, tais como o gerenciamento de sesses, atributos, pginas
de erro, incluses e encaminhamento de requisies de fluxo de resposta.

11 uma instncia da classe javax.servlet.jsp.PageContext.


Captulo 5 - JSP ( Java Server Pages)

11 Podemos dividir os mtodos desse objeto em trs categorias:

22 Acessar outros objetos implcitos de JSP.

22 Envio de solicitaes de uma pgina JSP para outra.

22 Acessar atributos atravs de mltiplos escopos.

67
Alm dos mtodos descritos na tabela 5.2, os principais mtodos desse objeto podem ser
divididos em trs categorias:

Mtodo Descrio

Retorna a instncia de servlet para a pgina atual


Object getPage()
(objeto implcito page).

Retorna a solicitao que iniciou o processamento


ServletRequest getRequest()
da pgina (objeto implcito request).

Retorna a resposta para a pgina (objeto


ServletResponse
implcito response).

Retorna o fluxo de sada atual para a pgina


JspWriter getOut
(objeto implcito out).

Retorna a sesso associada com a solicitao


HttpSession getSession() da pgina atual, se houver alguma (objeto
implcito session).

Retorna o objeto de configurao de servlet


ServletConfiggetServletConfig()
(objeto implcito config).
Tabela 5.16
Retorna o contexto no qual o servlet da pgina Mtodos do objeto
ServletContext getServletContext()
roda (objeto implcito application). pageContext
Acessar outros
Para pginas de erro, retorna a exceo passada objetos implcitos
Exception getException()
para a pgina (objeto implcito exception). de JSP.

Tabela 5.17
Mtodo Descrio Mtodos do objeto
pageContext
Encaminha o processamento para outro URL local
void forward(String path) Envio de
dado pela String path.
solicitaes de uma
pgina JSP para
void include(String path) Inclui o output do processamento de outro URL local.
outra.

Mtodo Descrio

void setAttribute(String key, Associa o valor do atributo obj com a


Object obj, int scope) chave key no escopo scope.

Enumeration getAttributeNamesInScope Recupera os nomes de todos os atributos


(int scope) associados com key no escopo scope.

Object getAttribute Recupera o valor de tributo associado com


(String name, int scope) name no escopo scope.

removeAttribute Remove o valor de atributo associado com


(String name, int scope) name no escope scope. Tabela 5.18
Mtodos do objeto
Procura em todos os escopos pelo atributo pageContext
Object findAttribute(String name)
associado com name. Acessar atributos
atravs de
Retorna o escopo no qual o atributo mltiplos escopos.
int getAttributesScope(String name)
JAVA - Aplicaes Web

associado com name est armazenado.

Os mtodos Object findAttribute(String name) e int getAttributesScope(String name)


permitem a procura, atravs de todos os escopos definidos, por um atributo associado com
uma String passada como parmetro. Nos dois casos, o objeto pageContext vai realizar uma
busca atravs dos escopos na seguinte ordem: pageContext, request, session e application.

68
A tabela anterior traz mtodos que recebem parmetros para especificar o escopo. A classe
javax.servlet.jsp.PageContext fornece variveis estticas para representar esses quatro
escopos diferentes. A tabela a seguir resume essas variveis:

Varivel Descrio

PAGE_SCOPE Escopo para atributos armazenados no objeto pageContext.

Tabela 5.19 REQUEST_SCOPE Escopo para atributos armazenados no objeto request.


Objeto pageContext
variveis para SESSION_SCOPE Escopo para atributos armazenados no objeto session.
representao de
escopo. APPLICATION_SCOPE Escopo para atributos armazenados no objeto application.

O exemplo a seguir ilustra o uso do mtodo getAttribute e das variveis estticas descritas
na tabela anterior:

<%
User uPag=(User)pageContext.getAttibute(user,pageContext.PAGE_SCOPE)
//Recupera o object usuario do escopo pageContext
User uReq=(User)pageContext.getAttibute(user,pageContext.REQUEST_SCOPE)
//Recupera o object usuario do escopo request

User uSes=(User)pageContext.getAttibute(user,pageContext.SESSION_SCOPE)
//Recupera o object usuario do escopo session

User uApp=(User)pageContext.getAttibute(user,pageContext.APPLICATION_SCOPE)
//Recupera o object usuario do escopo application
%>

Objeto exception
O objeto exception no est automaticamente disponvel em todas as pginas JSP. Esse
objeto est disponvel apenas nas pginas que tenham sido designadas como pginas de
erro, usando o atributo isErrorPage configurado com true na diretiva page. O objeto excep-
tion uma instncia da classe java.lang.Throwable correspondente ao erro no capturado
que fez com que o controle fosse transferido para a pgina de erro.

Objeto Exception. q
11 No est automaticamente disponvel em todas as pginas JSP.

22 Disponvel apenas nas pginas que tenham sido designadas como pginas de erro.

22 Uso do atributo isErrorPage configurado com true na diretiva <@ page %>.

11 uma instncia da classe java.lang.Throwable.


Captulo 5 - JSP ( Java Server Pages)

22 Correspondente ao erro no capturado.

22 Faz com que o controle seja transferido para a pgina de erro.

Os principais mtodos da classe java.lang.Throwable que so utilizados dentro das pginas


JSP so listados na tabela a seguir:

69
Mtodo Descrio

Retorna a mensagem de erro descritiva associada com a exceo


String getMessage()
quando ela foi lanada.

Imprime a pilha de execuo em funcionamento quando a exceo foi


void printStackTrace(PrintWriter out)
lanada para o fluxo de sada especificado pelo parmetro out.

Retorna uma cadeia combinando o nome da classe da exceo com sua


String toString()
mensagem de erro, se houver alguma.

Tabela 5.20
O trecho a seguir ilustra o uso do objeto exception em uma pgina de erro JSP: Mtodos do objeto
exception.
<@ page isErrorPage=true %>
<h1>Erro Encontrado</h1>
O seguinte erro foi encontrado:<br>
<b><%= exception %></b><br>
<% exception.printStackTrace(out); %>

O resultado do printStackTrace(out) pode ser visto na figura 5.5.

org.apache.jasper.JasperException: An exception occurred processing JSP page /ExemploObjetoException.jsp at line 19


16: <body>
17: O seguinte erro foi encontrado:<br>
18: <b><%= exception %></b><br>
19: <% exception.printStackTrace(); %>
20: </body>
21: </html>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
root cause
java.lang.NullPointerException
org.apache.jsp.ExemploObjetoException_jsp._jspService(ExemploObjetoException_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

Figura 5.5
JAVA - Aplicaes Web

Exerccios de fixao e Resultado do


printStackTrace
JSP (out).

Quais so os trs elementos sintticos disponibilizados em JSP?

Atividades Prticas

70
6
JSP e banco de dados
Apresentar aos alunos o mecanismo de desenvolvimento de aplicaes Java para
objetivos

internet com o uso de scriplets JSP que possibilitam a manipulao de banco de


dados com o uso da tecnologia Java JDBC e os padres de projeto DAO,
ConnectionFactory e MVC.

conceitos
JDBC; Processamento em duas ou trs camadas; Design Pattern; ConnectionFactory;
Properties; JavaBeans; DAO; MVC; HTML DOM; Ferramenta de Relatrios.

JDBC
Como foi visto na sesso 5, JSP uma tecnologia para desenvolvimento de aplicaes web
que permite ao desenvolvedor ter acesso a arquivos-texto, captar informaes a partir de
formulrios, usar variveis, estruturas de controle e muito mais.

Nesta sesso, vamos tratar do uso de JSP para acessar informaes armazenadas em
bancos de dados. Para isso, faremos uso da tecnologia Java JDBC.

JDBC (Java Database Connectivity). q


API que contm um conjunto de classes e interfaces necessrio para que uma aplicao
Java possa acessar SGBDRs.

11 Acesso a qualquer tipo de fonte de dados (BDRs, planilhas e arquivos de dados).

11 Acesso ao BD baseado em SQL.

composta pelos pacotes java.sql e javax.sql.

Auxilia na escrita de aplicativos Java que gerenciam trs atividades de programao:


Captulo 6 - JSP e banco de dados

11 Ligao a uma fonte de dados.

11 Envio de consultas e instrues de atualizao para a fonte de dados.

11 Recupera e processa os resultados recebidos do banco de dados em resposta


sua consulta.

O JDBC permite o processamento de informaes em duas ou trs camadas, conforme


ilustrado nas figuras 6.1 e 6.2.

71
Figura 6.1
Modelo de
processamento em
duas camadas.

Figura 6.2
Modelo de
processamento em
trs camadas.

Para tanto, o JDBC faz uso de uma arquitetura que apresentada na figura 6.3.

Figura 6.3
Arquitetura JDBC.
JAVA - Aplicaes Web

72
Essa arquitetura tem duas partes principais: JDBC API e JDBC Driver Manager. A primeira
uma API java-based pura, ou seja, construda com a prpria linguagem de programao
Java. J a JDBC Driver manager usada para se comunicar com drivers especficos de fabri-
cantes de BD/SGBD.

O uso do JDBC pressupem os seguintes passos:

11 Carregar o driver do BD/SGBD. q


11 Conectar ao BD.

11 Especificar a operao SQL.

11 Manipular os resultados obtidos.

A figura 6.4 demonstra o uso em conjunto de JSP com JDBC.

Cliente Response

Request JSP Engine Response


&
WEB Server
Response
JDBC
JSP
Request
File
Component Instruo SQL

Request

Figura 6.4
SGBD
JSP e JDBC.

Neste curso, o banco de dados que ser utilizado em todos os exemplos o PostGreSQL. Por
conta disso, ser necessrio fazer a importao da biblioteca de classes especfica para esse
SGBD, que a biblioteca postgresql-9.0-801.jdbc4.jar (disponvel no subdiretrio lib do
diretrio de exemplos da sesso 6).

Vamos tambm fazer uso da tabela curso, cujo script SQL para sua criao pode ser visto a
seguir.

CREATE TABLE curso


(
idcurso serial NOT NULL,
nome character varying(30) NOT NULL,
CONSTRAINT curso_pkey PRIMARY KEY (idcurso)
Captulo 6 - JSP e banco de dados

)
WITH (
OIDS=FALSE
);
ALTER TABLE curso
OWNER TO postgres;

73
Padronizando a conexo ao BD
Cabe lembrar que no desejvel fazer a conexo ao BD no meio do cdigo, podendo inclusive
ser repetitivo caso essa conexo for feita sempre que se precisar acessar o banco. O melhor
fazer isso uma nica vez, e para tanto podemos utilizar um Design Pattern, ou padro de
projeto, que um mtodo para resolver problemas que so comuns (e por isso mesmo repeti-
tivos). No nosso caso, vamos utilizar um Design Pattern chamado Connection Factory.

Por que criar uma ConnectionFactory? q


11 Controlar o nmero de conexes requeridos pela aplicao.

11 Controlar melhor as excees de conexo com o banco de dados (em um nico lugar).

22 desejvel configurar a conexo com o BD externamente ao cdigo.

22 Podemos utilizar arquivos de configurao:

33 No Netbeans: Novo Arquivo / Outro / Arquivo de Propriedades.

33 Preencha o nome do arquivo como BD.properties.


l
Java disponibiliza uma classe onde podemos especificar algumas configuraes que podem Um exemplo seria um
ser acessadas por uma determinada aplicao. A classe Proporties possibilita a leitura de programa que conecta
a um banco de dados e
valores por meio de campos-chave que esto armazenados em um arquivo de propriedades precisa de dados para
separado da aplicao. O arquivo de propriedades uma tima opo para passar configu- realizar a conexo, sem
que o cdigo-fonte
raes para uma determinada aplicao que necessita de configuraes externas.
deste seja alterado.
O arquivo de propriedade um arquivo simples salvo com a extenso.properties, que deve
fazer parte da estrutura do projeto em desenvolvimento. Nos exemplos que vamos estudar, o
arquivo de propriedades estar dentro do pacote til. A seguir, apresentamos a estrutura do
arquivo de propriedades BD.properties com um par de identificador e valor que sero lidos
pela aplicao java que necessita dessas informaes externas para seu funcionamento.

Figura 6.5
Estrutura
do arquivo
DB.properties.

Uma vez criado o arquivo de propriedades, uma aplicao Java pode acess-lo e realizar a
leitura de cada um dos valores dos identificadores nele armazenados. Para isso, devemos
utilizar o mtodo getProperty() da classe Properties, conforme o exemplo a seguir:

public class ConnectionFactoryComProperties{

public Connection getConnection() {


try {
// Criao de um objeto de propriedades
Properties prop = new Properties();
// leitura/carga do arquivo texto com as propriedades
JAVA - Aplicaes Web

prop.load( getClass().getResourceAsStream(
../util/bancoDeDados.properties));

// obtem o valor de cada parmetro atravs do mtodo getProperty


String dbDriver = prop.getProperty(db.driver);
String dbUrl = prop.getProperty(db.url);

74
String dbUser = prop.getProperty(db.user);
String dbPwd = prop.getProperty(db.pwd);

Class.forName(dbDriver);
return DriverManager.getConnection(dbUrl, dbUser, dbPwd);

} catch (ClassNotFoundException | IOException | SQLException ex) {


throw new RuntimeException(ex);
}
}
}

DAO e JavaBean
Veremos a seguir duas alternativas para a implementao do acesso ao banco de dados,
ambas dentro do paradigma de orientao a objetos.

JavaBeans q
11 Classes que possuem o construtor sem argumentos e mtodos de acesso do tipo get
e set para acesso aos seus atributos (e serializvel).

DAO (Data Access Object)

11 Pattern que separa o acesso ao banco de dados da lgica de negcios.

JavaBean so classes que possuem o construtor padro (sem argumentos) e mtodos de


acesso getters e setters, podendo ser serializvel ou no. A serializao depende da fonte de
dados utilizada. O cdigo Java a seguir apresenta a estrutura do JavaBean para a tabela curso.

package modelo;
public class Curso {

private int idcurso;
private String nomeCurso;
public Curso() {
super();
// TODO Auto-generated constructor stub
}
public Curso(int idcurso, String nomecurso) {
super();
this.idcurso = idcurso;
this.nomeCurso = nomecurso;
}
Captulo 6 - JSP e banco de dados

public Curso(String nomeCurso) {


super();
this.nomeCurso = nomeCurso;
}
public Curso(int idcurso) {
this.idcurso = idcurso;
}
public int getIdcurso() {
return idcurso;

75
}
public void setIdcurso(int idcurso) {
this.idcurso = idcurso;
}
public String getNomeCurso() {
return nomeCurso;
}
public void setNomeCurso(String nomecurso) {
this.nomeCurso = nomecurso;
}
}

O padro Data Access Object ou padro DAO usado para separar a camada de acesso
ao banco de dados da regra de negcio da aplicao, ficando responsvel por gerenciar a
conexo com a fonte de dados.

O DAO deve implementar os mecanismos de acesso fonte de dados que se deseja mani-
pular na interface da aplicao em desenvolvimento. Os detalhes de sua implementao
no so de conhecimento do cliente. O cdigo Java a seguir apresenta a estrutura da classe
DAO para a tabela curso.

package controle;
import java.sql.*;
import java.util.ArrayList;
import modelo.Curso;
public class CursoDAO {
private Connection con;
public CursoDAO() throws Exception {
this.con = new ConnectionFactoryComProperties().getConnection();
}
public void inserirCurso(Curso c){
try{
PreparedStatement stmt = this.con.prepareStatement(
insert into curso (nome) values(?));
stmt.setString(1, c.getNomeCurso());
stmt.execute();
} catch(SQLException e){
System.out.println(incluirCurso(): +e.toString());
}
}
public Curso consultarCurso(int cod){
try{
PreparedStatement stmt = this.con.prepareStatement(
select * from curso where idcurso = ?);
JAVA - Aplicaes Web

stmt.setInt(1, cod);
ResultSet res = stmt.executeQuery();
if(res.next())
return new Curso(res.getInt(idcurso),res.getString(nome));
else
return null;

76
} catch(SQLException e){
System.out.println(consultarCurso(): +e.toString());
}
return null;
}
public void atualizarCurso(Curso c){
try{
PreparedStatement stmt = this.con.prepareStatement(
update curso set nome=? where idcurso=?);
stmt.setString(1, c.getNomeCurso());
stmt.setInt(2, c.getIdcurso());
stmt.executeUpdate();
} catch(SQLException e){
System.out.println(atualizarCurso(): +e.toString());
}
}
public void excluirCurso(Curso c){
try{
PreparedStatement stmt = this.con.prepareStatement(
delete from curso where idcurso=?);
stmt.setInt(1, c.getIdcurso());
stmt.executeUpdate();
} catch(SQLException e){
System.out.println(excluirCurso(): +e.toString());
}
}
public ArrayList<Curso> getCursos(){
try{
PreparedStatement stmt = this.con.prepareStatement(
select * from curso order by nome);
ResultSet res = stmt.executeQuery();
ArrayList<Curso> dados = new ArrayList<Curso>();
while(res.next()) {
Curso temp = new Curso(res.getInt(idcurso),
res.getString(nome));
dados.add(temp);
}
stmt.close();
return dados;
} catch (SQLException e) {
Captulo 6 - JSP e banco de dados

System.out.println(getCursos(): +e.toString());
}
return null;
}
}

77
Arquitetura MVC
Vamos aproveitar esta sesso para tambm tratar da organizao dos componentes da
aplicao web a partir da arquitetura MVC (Model-View-Controller), que constituda das
camadas modelo, viso e controle.

A figura 6.6 apresenta a estrutura de diretrios que ser utilizada no desenvolvimento da


aplicao web.

Figura 6.6
Estrutura de
diretrios da
aplicao web.

Camada viso: q
11 Ser construda dentro da pasta Pginas Web.

11 Disponibiliza as GUIs a que o usurio ter acesso.

Camada modelo.

11 Ser construda dentro de Pacotes de Cdigos-Fonte.

11 Um pacote de classes (new package).

11 Conter os JavaBeans do projeto.

Camada controle:

11 Um pacote de classes (new package).

11 Disponibilizar as classes Java com recursos para criao de conexo com o banco
de dados.

11 Interface DAO que vai possibilitar a manuteno de registro.

O pacote til uma extenso.

11 Define o arquivo com as propriedades necessrias para a realizao da conexo com


o banco de dados.

Definio da interface grfica com o usurio


O primeiro passo para a criao da aplicao JSP que possibilita a manipulao de banco de dados
a criao de uma interface grfica com o usurio. Vamos utilizar pginas HTML como a porta
de entrada para a construo de GUIs, tomando como referncia o modelo DOM (Document
Object Model) que foi padronizado pelo W3C. Nesse modelo, um documento qualquer pode
JAVA - Aplicaes Web

ser descrito por uma estrutura de rvore, conforme o exemplo mostrado na figura 6.7.

Essas pginas vo possibilitar a interao dos usurios com informaes armazenadas em


um banco de dados, bem como o desenvolvimento de uma aplicao web no padro MVC.

78
Figura 6.7
DOM: Document
Object Model.

O cdigo HTML a seguir ilustra a criao de uma GUI com um formulrio de entrada de
dados que ser utilizado pelo usurio da aplicao.

<html>
<head>
<title>Cadastro de Curso</title>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
</head>
<body>
<form name=cadcurso action=cadCurso.jsp method=POST>
Nome do curso:
<input type=text name=nome size=50>
<br>
<input type=reset name=b1 value=Limpar>
<input type=submit name=b2 value=Enivar>
</form>
</body>
</html>

Esse cdigo HTML vai produzir a pgina HTML apresentada na figura 6.8. O endereo
localhost:8084/sessao06/CadCurso.html possibilitar ao usurio a visualizao do cdigo
HTML j interpretado pelo browser.

Figura 6.8
Pgina HTML para
entrada de dados.
Captulo 6 - JSP e banco de dados

79
Dentro dessa pgina HTML temos um link com o scriplet JSP que vai receber os valores digi-
tados no formulrio e fazer a interao com a camada de modelo e controle da aplicao para
possibilitar a instncia de um objeto da classe curso, a conexo com o banco de dados e exe-
cuo do mtodo de insero do registro no BD descrito na classe DAO para a tabela curso.

O scriplet JSP a seguir ilustra o processo de integrao da camada de viso com as camadas
modelo e controle da aplicao.

<%@page contentType=text/html
pageEncoding=UTF-8
import=controle.CursoDAO, modelo.Curso
language=java
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Cadastro de Curso</title>
</head>
<body>
<%
CursoDAO dao = new CursoDAO();
Curso c = new Curso(request.getParameter(nome));
dao.inserirCurso(c);
%>
<center>Curso ${param.nome} gravado com sucesso!!!</center>
<hr>
<a href=index.jsp>Voltar</a>
</body>
</html>

No scriplet JSP apresentado, destacamos a clusula import na diretiva page que informa
os recursos adicionais necessrios para a instncia dos objetos para executar a opo de
gravao de um novo registro no banco de dados. Na sequncia, devemos utilizar um ele-
mento scriplet para escrever a codificao Java necessria para instncia e uso dos objetos Figura 6.9
para efetivar a ao de gravao de um registro no banco de dados. A figura 6.9 apresenta o Pgina HTML
dinmica produzida
resultado da execuo da pgina JSP cadCurso.jsp. por cadCurso.jsp.
JAVA - Aplicaes Web

80
Exemplo JSP Listagem geral
O script JSP a seguir ilustra uma soluo para a construo de uma pgina HTML dinmica
com os dados dos cursos cadastrados na tabela curso.

<%@page import=java.util.ArrayList%>
<%@page contentType=text/html
pageEncoding=ISO-8859-1
import=modelo.Curso, controle.CursoDAO%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Lista de cursos cadastrados</title>
</head>
<body>
<center>
<table width=20%>
<tr><td>Cdigo</td><td>Nome</td><td></td><td></td></tr>
<%
CursoDAO dao = new CursoDAO();
ArrayList<Curso> cursos = dao.getCursos();
String tabela=;
for(Curso temp : cursos){
tabela += <tr><td>+temp.getIdcurso() + </td><td> +
temp.getNomeCurso()+</td>;
tabela += <td><a href=alterarCurso.jsp?id= +
temp.getIdcurso()+ ><img src=img/edit.png
alt=Editar width=22 height=22
border=0></a></td>;
tabela += <td><a href=excluirCurso.jsp?id= +
temp.getIdcurso()+><img src=img/editdelete.png
alt=Excluir width=22 height=22
border=0></a></td>;
tabela += </tr>;
}
out.println(tabela);
%>
</table>
<hr>
<a href=index.jsp>Voltar</a>
Captulo 6 - JSP e banco de dados

</center>
</body>
</html>

O mtodo getCursos() da classe DAO de cursos foi construdo para realizar uma consulta
SQL que retorna todos os registros existentes na tabela em um objeto ArrayList. Isso possi-
bilita que o desenvolvedor da GUI no se preocupe com as instrues de programao Java
necessrias para acessar o banco de dados, manipular e retornar um objeto ResultSet a ser
trabalhado na GUI.

81
Em vez disso, o mtodo retorna um ArrayList j com os objetos da classe Curso instan-
ciados. Isso facilita o processamento das informaes durante o processo de construo
da pgina dinmica.

Para finalizar, criamos dois links que sero utilizados para ao de alterao e excluso de
registros gravados no banco de dados. Esse um exemplo de utilizao de mtodo GET,
onde passamos os valores das variveis aberto aps a URL. A figura 6.10 ilustra a execuo
do script JSP que monta a listagem de cursos dinamicamente.

Figura 6.10
Pgina HTML
dinmica
Listagem geral
de cursos.

Exemplo JSP Excluso


A seguir, o script JSP ilustra a codificao das instrues necessrias para realizar a excluso
de um registro no banco de dados.

<%@page import=modelo.Curso%>
<%@page import=controle.CursoDAO%>
<%@page contentType=text/html pageEncoding=ISO-8859-1%>
<%
CursoDAO dao = new CursoDAO();
Curso c = new Curso(Integer.parseInt(request.getParameter(id)));
dao.excluirCurso(c);
%>
<jsp:forward page=listarCursos.jsp></jsp:forward>

Esse script est acessvel pelo link de excluso de registro presente na listagem geral de
cursos, conforme pode ser visto na figura 6.10 acima. Com isso, o usurio tem uma facilidade
maior na hora de realizar a excluso de um registro.

Exemplo JSP alterao


A alterao de um registro existente deve ser feita em duas etapas. A primeira colocar
o registro que se deseja alterar para edio. A segunda atualizar o registro no banco de
dados com as novas informaes fornecidas pelo usurio da aplicao.

O script JSP a seguir ilustra a primeira etapa. A tela que disponibiliza os dados do curso para
edio est acessvel pela listagem geral de cursos.
JAVA - Aplicaes Web

82
<%@page import=modelo.Curso%>
<%@page import=controle.CursoDAO%>
<%@page contentType=text/html pageEncoding=ISO-8859-1%>
<!DOCTYPE html>
<%!
Curso c;
%>
<%
CursoDAO dao = new CursoDAO();
c = dao.consultarCurso(Integer.parseInt(request.getParameter(id)));
%>
<html>
<head>
<title>Alterar Curso</title>
meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
</head>
<body>
<form name=altcurso action=updateCurso.jsp method=POST>
<input type=hidden name=id value=<%= c.getIdcurso() %>>
Nome do curso:
<input type=text name=nome size=50 value=<%=c.getNomeCurso()%>>
<br>
<input type=submit name=b2 value=Enivar>
</form>
</body>
</html>

Esse script recebe o id do curso que se deseja alterar, instancia o objeto e utiliza seus
mtodos getters para escrever os valores atualmente gravados no banco de dados na GUI.
Tomamos o cuidado de deixar o cdigo, que chave primria, escondido. Ele s ser neces-
srio na segunda etapa do processo de atualizao do registro em edio.

O script JSP a seguir apresenta a codificao necessria para proceder com a atualizao do
registro em edio, usando os novos dados fornecidos pelo usurio na GUI.

<%@page import=modelo.Curso%>
<%@page import=controle.CursoDAO%>
<%@page contentType=text/html pageEncoding=ISO-8859-1%>
<%
CursoDAO dao = new CursoDAO();
Curso c = new Curso(Integer.parseInt(request.getParameter(id)),
Captulo 6 - JSP e banco de dados

request.getParameter(nome));
dao.atualizarCurso(c);
%>
<jsp:forward page=listarCursos.jsp></jsp:forward>

83
A figura 6.11 ilustra a janela exibida para o usurio quando da edio do registro.

Figura 6.11
Pgina HTML para
edio do registro.

Ferramenta de relatrio JasperReport


Interface amigvel para gerao de relatrios. q
Escrita em Java.

Capaz de usar dados provenientes de qualquer tipo de fonte de dados.

11 Atualmente considerada o mecanismo de relatrios mais popular do mundo open


source.

Arquivos fonte com extenso.jrxml.

O layout do relatrio definido em um arquivo XML.

11 Todas as informaes de formatao do relatrio.

11 Todos os campos de dados a serem preenchidos pela fonte de dados.

Aps a construo do relatrio dentro da interface do iReport, voc dever fazer a incluso
desse novo recurso dentro do projeto da aplicao java em desenvolvimento. Para isso,
voc dever copiar o arquivo.jasper resultante do processo de criao dentro do iReport e
importar as bibliotecas do JasperReports para dentro projeto em desenvolvimento.
As bibliotecas do JasperReports so:

11 commons-digester-2.1.jar

11 commons-beanutils-1.8.2.jar

11 commons-collections-3.2.1.jar

11 commons-javaflow-20060411.jar

11 commons-logging-1.1.jar

11 groovy-all-1.7.5.jar

11 jasperreports-4.7.0.jar

11 iText-2.1.7.jar

Esses arquivos encontram-se dentro da pasta ireport\modules\ext no diretrio de insta-


lao da interface iReport.

Lembre-se de importar a biblioteca de acesso ao banco de dados PostGRESql, para que o


relatrio possa estar acessando a fonte de dados que foi informada durante o processo de
desenvolvimento. Aps a importao das bibliotecas, voc dever desenvolver um pro-
grama Java e nele fazer a chamada ao relatrio referenciado pelo arquivo com a extenso.
jasper (resultante do processo de criao dentro da interface iReport).
JAVA - Aplicaes Web

O script JSP a seguir representa uma estrutura genrica para gerao e visualizao de rela-
trios no formato PDF tendo como base o JasperReport.

84
<%@page import=controle.ConnectionFactoryComProperties%>
<%@page import=net.sf.jasperreports.engine.JasperRunManager%>
<%@page import=java.io.File%>
<%@page import=java.util.HashMap%>
<%@page contentType=text/html pageEncoding=ISO-8859-1%>
<%
try{
//map para passagem de parmetros
HashMap map = new HashMap();
//endereo para o arquivo jasper
File reportFile =
new File(application.getRealPath(/reports/relCurso.jasper));
byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),
map, new ConnectionFactoryComProperties().getConnection());
response.setContentType(application/pdf);
response.setContentLength(bytes.length);
ServletOutputStream outStream = response.getOutputStream();
outStream.write(bytes, 0, bytes.length);
outStream.flush();
outStream.close();

} catch (Exception e) {
javax.swing.JOptionPane.showMessageDialog(null, Erro: +
e.getMessage());
}
%>

Fechando a srie de exemplos, sugerimos que seja acessado, no diretrio de exemplos da


sesso, o arquivo recursos.jsp, que ao ser executado vai exibir a tela que reproduzida na
figura 6.12, a seguir.

Captulo 6 - JSP e banco de dados

Figura 6.12
Aplicao JSP
Cursos.

85
Exerccios de fixao e
JSP e banco de dados
Qual foi o padro de projeto utilizado para a construo dos exemplos desta sesso?
Onde devero estar localizados cada um dos seus recursos dentro da estrutura do projeto?

Atividades Prticas
JAVA - Aplicaes Web

86
7
Taglib e JSTL
objetivos

Apresentar aos alunos os mecanismos de desenvolvimento e uso de tags personalizadas


no processo de desenvolvimento de aplicaes Java para internet, bem como o uso da
JSTL no processo de construo de pginas dinmicas sem a presena de cdigo Java.

conceitos
Taglib; tag personalizada; JSLT e expression language (EL).

Taglib
O grande objetivo de taglib possibilitar o uso de tags personalizadas entre pginas JSP.
As tags personalizadas, implementadas por bibliotecas de tags, foram desenvolvidas com
base na sintaxe XML. Isso significa que possvel desenvolver conjuntos de bibliotecas de
tags virtualmente ilimitados, pois como so baseadas na sintaxe XML, no fazem restrio
alguma quanto ao nome e nmero de tags que podem ser desenvolvidas.

11 Possibilita o uso de tags personalizadas dentro de pginas JSP. q


11 So implementadas por bibliotecas de tags.

11 Desenvolvidas com base na sintaxe XML, mas diferente de um simples documento XML.

11 No existe restrio alguma quanto ao nome e nmero de tags que podem


ser desenvolvidas.

11 Usadas para otimizar o cdigo JAVA, em especial das aplicaes JAVA J2EE.

11 Vrios frameworks utilizam.

22 Struts, SpringMVC, JSTL etc.

Mas diferentemente de um simples documento XML, as tags personalizadas JSP no so


meros elementos de marcao; elas so de fato elementos que implementam aes nas
pginas. Podemos concluir ser possvel a criao de verdadeiras sublinguagens que fornecero
funcionalidade s pginas JSP.

q
Captulo 7 - Taglib e JSTL

A diretiva <@taglib @> permite indicar quais bibliotecas de tags podero ser utilizadas
pela pgina.

11 Faz uso dos atributos uri e prefix.

Aps ser carregada, uma biblioteca de tags no ser carregada novamente.

11 O trabalho de carreg-la s ser realizado uma nica vez pelo continer.

11 Nas prximas ocasies em que for necessrio utiliz-la, ela j estar disponvel.

87
Uma mesma pgina JSP pode conter diversar ocorrncias da diretiva taglib, significando q
que vrias bibliotecas podem ser carregadas para a mesma pgina.

Cada ocorrncia da diretiva taglib pode carregar uma biblioteca por vez.

Uma tag personalizada , portanto, um elemento de linguagem JSP definida pelo usurio.
O contedo da tag personalizada traduzido em um servlet, sendo a tag convertida para
operaes em um objeto chamado de manipulador de tag.

O continer da web chama essas operaes quando o servlet da pgina JSP executado. q
Utilize arquivos de tag para criar tags JSP personalizadas.

11 Autores de arquivos de tag no so obrigados a saber como criar classes Java

Localizao:

11 Devem ser colocados a seguir do diretrio /WEB-INF/tags.

Dispensa

11 Descritor de biblioteca de classes.

A implementao das tags requer que os arquivos com tags personalizadas sejam colocados
a seguir do diretrio /WEB-INF/tags da aplicao web em desenvolvimento, conforme
ilustrado na figura 7.1.

Figura 7.1
Sugesto de
estrutura de
diretrio para
aplicaes JSP
com taglibs.

Depois de configurado o ambiente para que as pginas JSP possam trabalhar com taglibs
(tags personalizadas) podemos criar, por exemplo, uma pgina JSP que faa uso de uma
taglib dentro de sua estrutura, como ilustra o trecho de cdigo JSP:

<%@page contentType=text/html pageEncoding=UTF-8%>


<%@taglib prefix=exemplo uri=WEB-INF/tlds/extag_library.tld %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>Exemplo TagLib com TLD</title>
</head>
<body>
<exemplo:Mensagem />
</body>
</html>
JAVA - Aplicaes Web

No exemplo anterior, preciso definir a tag personalizada <exemplo:Mensagem />.


Para tanto, ser preciso estender a classe SimpleTagSupport, reescrecer o mtodo
doTag() e colocar seu cdigo para gerar contedo para a tag. Isso pode ser visto no
trecho de cdigo a seguir.
package com.extaglib;
import java.io.IOException;

88
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ExemploTagLib extends SimpleTagSupport {

@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println(Exemplo de classe java como taglib e uso de tld!);
}
}

O prximo passo a criao do descritor da biblioteca de tags atravs de um arquivo.tld em


WEB-INF/tlds. O trecho do contedo do arquivo extag_library.tld pode ser visto a seguir.

<?xml version=1.0 encoding=UTF-8?>


<taglib version=2.1 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://
www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/
javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd>
<tlib-version>1.0</tlib-version>
<short-name>extag_library</short-name>
<uri>/WEB-INF/tlds/extag_library</uri>
<tag>
<name>Mensagem</name>
<tag-class>com.extaglib.ExemploTagLib</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

O resultado da execuo da nova tag personalizada pode ser visualizada na figura 7.2:

Figura 7.2
Nova Tag
Mensagem.

Nesse outro exemplo a seguir, temos o cdigo JSP do arquivo DataAtual.tag com a codificao
de uma nova tag personalizada.

<%@tag import=java.io.IOException%>
<%@tag import=java.text.SimpleDateFormat%>
<%@tag import=java.util.Calendar%>
<%@ tag pageEncoding=ISO-8859-1%>
Captulo 7 - Taglib e JSTL

<%
try {
String formatoLong = EEEEEE, dd de MMMM de yyyy;
SimpleDateFormat formatter = new SimpleDateFormat(formatoLong);
String horaAtual = formatter.format(Calendar.getInstance().getTime());
out.print(horaAtual);

89
} catch (IOException e) {
throw new JspException(e.getMessage());
}
%>

Vejamos ento como essa tag referenciada em uma pgina JSP.

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


pageEncoding=ISO-8859-1%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Data Atual</title>
</head>
<body>
<%@ taglib prefix=aux tagdir=/WEB-INF/tags %>
<aux:DataAtual />
</body>
</html>

Nesse exemplo, a diretiva <@taglib que utilizada para informar a localizao dos controla-

l
dores de tags continua a fazer uso do atributo prefix atravs do qual se define uma refe-
rncia (namespace) para referenciar a tag dentro da pgina JSP.
Para prover algum grau
J o atributo uri utilizado para indicar a localizao do arquivo da taglib quando este de padronizao, a SUN
implementado em Java atravs de uma subinterface de javax.servlet.jsp.tagext.JspTag, ou Microsystem props a
criao de uma
como um tagfile JSP puro (arquivo.tld). Mas no exemplo anterior o atributo uri foi substitudo
biblioteca padro que
pelo atributo tagdir, que faz referncia a tagfiles JSP disponveis em /WEB-INF/tags (ou subdi- fornece tags prontas
retrios) e que no podem ser Classes Java. para atividades comuns
em aplicaes web, tais
De qualquer modo, aps ser informada a localizao e referncia da taglib DataAtual.tag, a como execuo de
laos, controle de
mesma referenciada por <aux:DataAtual /> dentro da pgina em desenvolvimento. Isso
deciso, formatao de
faz com que o fluxo de interpretao seja transferido para a taglib que vai incorporar o seu texto, entre outros
contedo pagina JSP em execuo. recursos. Com isso
surgiu a JSTL ( JSP
Com a disponibilizao desse mecanismo na linguagem Java, houve uma enorme proliferao Standard Tag Library).

de taglibs, destinadas a uma grande variedade de objetivos.

Enorme Proliferao de taglibs. q


11 Duplicao de funcionalidades.

11 Incompatibilidade entre taglibs.

JSTL
JAVA - Aplicaes Web

JSTL o acrnimo de Java Server Pages Standard Template Library. E consiste em uma
coleo de bibliotecas, tendo cada uma um propsito bem definido.

Java Server Pages Standard Tag Library. q


11 Desenvolvido pela SUN.

11 Coleo de bibliotecas, cada uma com um propsito bem definido.

11 Cobrem a maioria das funcionalidades bsicas de uma aplicao JAVA J2EE.

90
Permitem escrever pginas JSP sem scriplets (sem cdigo Java). q
11 Aumento da legibilidade do cdigo.

11 Interao entre desenvolvedores e web designers.

usado como framework bsico para usar a API nativa da SUN.

Surgiu para padronizar bibliotecas sendo criadas por diversos grupos.

11 Atender necessidades de mercado.

Uma pgina JSTL uma pgina JSP contendo um conjunto de tags JSTLs. Cada tag JSTL
realizar um determinado tipo de processamento equivalente a um possvel cdigo Java
dentro de uma pgina JSP.

API que encapsula funcionalidades para pginas web em tags simples. q


11 Controle de fluxo.

22 For, if-else.

11 Manipulao.

22 Banco de dados, XML, Colees.

11 Internacionalizao de aplicaes.

Estrutura JSTL
A JSTL est dividida em quatro bibliotecas correspondentes s suas reas funcionais bsicas.

Core: q
11 Tags destinadas s tarefas comuns (sada, repetio, tomada de deciso e seleo).

Database Access:

11 Tags que oferecem acesso a banco de dados.

Formatting:

11 Contm tags destinadas internacionalizao e formatao de dados.

XML processing:
Tabela 7.1 11 Destinadas ao processamento de documentos XML.
Estrutura da
biblioteca JSTL A tabela 7.1 apresenta a estrutura geral do JSLT com um pouco mais de informao.

Biblioteca JSTL Prefixo URL Tipos de uso Exemplo de tag

core c http://java.sun.com /jstl/core 11Acessar e modificar <c:forEach>


dados em memria
11Comandos
condicionais
11Loop

Processamento de x http://java.sun.com /jstl/xml 11Parsing (leitura) de <x:forEach>


XML documentos
11Impresso de partes de
Captulo 7 - Taglib e JSTL

documentos XML
11Tomada de deciso
baseado no contedo
de um documento XML

91
Biblioteca JSTL Prefixo URL Tipos de uso Exemplo de tag

Internacionalizao fmt http://java.sun.com /jstl/fmt 11Leitura e impresso de <fmt:formatDate>


e formatao nmeros
11Leitura e impresso de
datas
11Ajuda a sua aplicao
funcionar em mais de
uma lngua

Acesso a banco de sql http://java.sun.com /jstl/sq 11Leitura e escrita em <sql:query>


dados via SQL banco de dados

Instalao
Tabela 7.1 (cont.)
Alguns servidores de aplicaes j trazem a biblioteca JSTL em sua distribuio. Em outros Estrutura da
biblioteca JSTL
casos, necessrio realizar a instalao da JSTL para que seus web containers JavaEE
possam utilizar a JSP.

Instalando o JSTL: q
11 Fazer o download de uma implementao da JSTL.

22 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

11 Fazer o download do arquivo contendo a implementao.

22 jakarta-taglibs-standard-1.1.2.zip

11 Descompacte o arquivo.

11 Localize os arquivos jstl.jar e standard.jar na pasta bin e os adicione no projeto em


desenvolvimento.

11 V em bibliotecas, clique com o boto direito e selecione a opo adicionar JAR/Pasta.

11 Localize os arquivos.jar na sua estrutura de diretrio e clique em abrir.

Expression Language
A EL (expression. Language) foi introduzida na JSTL verso 2.0 e permite a realizao de
operaes aritmticas e lgicas, bem como efetuar a leitura de propriedade de JavaBeans.
Seu propsito facilitar o acesso a informaes, pois sua sintaxe mais simples do que a
empregada nas tags-padro e, usualmente, no requer associao com cdigo Java.

Introduzida na JSTL verso 2.0. q


Permite:

11 A realizao de operaes aritmticas e lgicas.

11 Efetuar a leitura de propriedade de JavaBeans.

Propsito de facilitar o acesso a informaes.

11 Sintaxe mais simples do que a empregada nas tags-padro.

11 Usualmente no requer associao com cdigo Java.


JAVA - Aplicaes Web

As expresses EL so delimitadas pelos smbolos ${ }.

O contedo dessa estrutura interpretado no momento da execuo da pgina e


imediatamente avaliado, ou seja, o valor de qualquer expresso pode ser acessado da
seguinte forma: ${<expresso>}.

92
A tabela 7.2 ilustra o uso dos operadores suportados na EL e o resultado que estes
produzem quando aplicados em expresses EL.

Operador Descrio Exemplo Resultado

== Igualdade ${5 == 5} true


eq

!= Desigualdade ${5 != 5} false


ne

< It Menor que ${5 < 7} true

> Maior que ${5 > 7} false


gt

<= Menor ou igual que ${5 le 5} true


le

>= Maior ou igual que ${5 ge 6} false


ge

empty Checa se um parmetro est vazio ${user.lastname} depende

and E ${param.month == 5 depende


&& and param.day == 25}

or OU ${param.month == 5 or depende
II param.month == 6}

+ soma ${4 + 5} 9

Tabela 7.2 ! Negao ${not true} false


Operadores EL. not

Core taglib
Como j vimos, essa taglib inclui tags de propsito geral.

Entre os tags da Core podemos destacar: q


11 Sada bsica.

11 Manipulao de variveis.

11 Aes condicionais.

11 Estruturas de repetio.

11 Manipulao de URLs.

11 Incluso e redirecionamento de pginas.

So identificadas pelo prefixo c.

Declarao.

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

Apresentaremos a seguir uma srie de exemplos que ilustram o uso de Core taglib na cons-
truo de pginas JSP.
Captulo 7 - Taglib e JSTL

93
Sada bsica
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib prefix=c uri=http://java.sun.com/jsp/jstl/core %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSTL Core - Sada Bsica</title>
</head>
<body>
<c:out value=Exemplo JSTL Core - Sada Bsica />
<br>
<c:out value=${nome} default=Nome no foi informado! />
<br>
<c:out value=${15*3} />
</body>
</html>

Acesso a parmetros
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib prefix=c uri=http://java.sun.com/jsp/jstl/core%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSTL Core - Acesso a Parmetros</title>
</head>
<body>
<form method=POST action=exJSTL-CoreAcessoParametros.jsp>
Digite seu nome:
<input type=text name=nome size=50>
<br>
<input type=submit value=Enviar Dados>
</form>
<hr>
Nome digitado: <c:out value=${param.nome}
default=Nenhum nome digitado ainda! />
<br>
Nome digitado: ${param.nome}
<hr>
Parmetros da Pgina:
<br>
JAVA - Aplicaes Web

${paramValues}
</body>
</html>

94
Manipulao de variveis
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib prefix=c uri=http://java.sun.com/jsp/jstl/core%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSTL Core - Manipulao de Variveis</title>
</head>
<body>
<!--declarando e exebindo contedo de variveis -->
<c:set var=centigrados value=${param.centigrados} />
<br>Graus centgrados: <c:out value=${centigrados} default=0 />
<c:set var=fahrenheit value=${centrigrados*5/9 + 32} />
<br>Graus Fahrenheit: <c:out value=${fahrenheit} />

<!--removendo variveis -->


<c:remove var=centigrados />
<c:remove var=fahrenheit />

<!--Tentativa de exebio de contedo de variveis -->


<br>Graus centgrados: <c:out value=${centigrados}
default=Varivel Removida! />
<br>Graus Fahrenheit: <c:out value=${fahrenheit}
default=Varivel Removida! />
</body>
</html>

Deciso simples
<%@ page language=java contentType=text/html; charset=ISO-8859-1
pageEncoding=ISO-8859-1%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>JSTL Core - Deciso Simples</title>
</head>
<body>
<c:if test=${param.idade >= 18 }>
Captulo 7 - Taglib e JSTL

${param.nome }, voc maior de idade!


</c:if>
<c:if test=${param.idade < 18 }>
${param.nome }, voc menor de idade!
</c:if>
</body>
</html>

95
Deciso mltipla
<%@ page language=java contentType=text/html; charset=ISO-8859-1
pageEncoding=ISO-8859-1%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>JSTL Core - Deciso Simples</title>
</head>
<body>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<c:choose>
<c:when test=${param.numero < 0 }>
O nmero ${param.numero } negativo!
</c:when>
<c:when test=${param.numero >= 0 }>
O nmero ${param.numero } positivo!
</c:when>
<c:otherwise>
<!-- trecho de cdigo caso nenhuma tag c:when seja vlida-->
</c:otherwise>
</c:choose>
</body>
</html>

Repetio
<%@ page language=java contentType=text/html; charset=ISO-8859-1
pageEncoding=ISO-8859-1%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Tabuada do nmero ${param.numero }</title>
</head>
<body>
<center>Tabuada do nmero ${param.numero}
<br><br>
<c:forEach var=i begin=1 end=10>
${param.numero} * ${i} = ${param.numero * i}<br>
JAVA - Aplicaes Web

</c:forEach>
</center>
</body>
</html>

96
Tokenizao
<%@ page language=java contentType=text/html; charset=ISO-8859-1
pageEncoding=ISO-8859-1%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html;>
<title>Manipulao de Tokens</title>
</head>
<body>
<br><br>
<ul>
<c:forTokens var=i delims=, items=Maria,Pedro,Ana,Jos>
<li><c:out value=${i}/></li>
</c:forTokens >
</ul>
</body>
</html>

Incluso de pginas (import, redirect e catch)


<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html>
<c:catch var=excecao>
<c:import url=/algo.jsp context=/ />
</c:catch>
<c:if test=${not empty excecao}>
<c:redirect url=/erro.jsp />
</c:if>

Internacionalizao
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@ page import=java.io.*,java.util.Locale %>
<%@ page import=javax.servlet.*,javax.servlet.http.* %>
<!DOCTYPE html>
<%
//capturando informaes do Locale do cliente
Locale locale = request.getLocale();
Captulo 7 - Taglib e JSTL

String language = locale.getLanguage();


String country = locale.getCountry();
%>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>Internacionalizao</title>

97
</head>
<body>
<h1>Informaes de localizao (Locale)</h1>
<%
out.println(Idioma : + language + <br />);
out.println(Pas : + country + <br />);
%>
<hr>
</body>
</html>

Internacionalizao
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@ page import=java.io.*,java.util.Locale %>
<%@ page import=javax.servlet.*,javax.servlet.http.* %>
<%@ page import=java.text.NumberFormat,java.util.Date %>
<%
String title = Formatao monetria por localidade;
//Get the clients Locale
Locale locale = request.getLocale( );
NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
String formattedCurr = nft.format(1000000);
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align=center>
<p>Valor monetrio formatado: <% out.print(formattedCurr); %></p>
</div>
</body>
</html>

Formatao
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib uri=http://java.sun.com/jsp/jstl/fmt prefix=fmt%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
JAVA - Aplicaes Web

<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>JSTL - Internacionalizao e Formatao </title>
</head>
<body>

98
<jsp:useBean id=agora class=java.util.Date/>
<br>
Data Verso Curta: <fmt:formatDate value=${agora} />
<br><br>
Data Verso Longa: <fmt:formatDate value=${agora} dateStyle=full/>
<br><br>
Nmero: <fmt:formatNumber value=12345.6789 pattern=#,#00.00 />
<br><br>
Moda Corrente: <fmt:formatNumber value=123.67 type=currency />
<br><br>
Nmero: <fmt:formatNumber value=123.6 type=number
minFractionDigits=2 />
</body>
</html>

SQL
<%@page contentType=text/html pageEncoding=UTF-8%>
<%@taglib uri=http://java.sun.com/jsp/jstl/sql prefix=sql%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html>
<sql:setDataSource url=jdbc:postgresql://localhost:5432/sessao08
driver=org.postgresql.Driver
user=postgres
password=123456
var=dtSource />
<sql:query var=resultado dataSource=${dtSource}>
select * from curso order by nome
</sql:query>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8>
<title>JSTL Core - SQL</title>
</head>
<body>
<h1>Listagem de cursos</h1>
<table border=1>
<tr>
<th>Cdigo</th>
<th>Nome Curso</th>
</tr>
<c:forEach var=reg items=${resultado.rows}>
Captulo 7 - Taglib e JSTL

<tr>
<th><c:out value=${reg.idcurso} /></th>
<th><c:out value=${reg.nome} /></th>
</tr>
</c:forEach>
</table>
<hr>

99
<i>Total de registros: ${resultado.rowCount}</i>
</body>
</html>

SQL com DAO


<%@ page language=java contentType=text/html; charset=ISO-8859-1
pageEncoding=ISO-8859-1%>
<%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1>
<title>Listagem de Cursos Cadastrados</title>
</head>
<body>
<jsp:useBean id=dao class=controle.CursoDAO></jsp:useBean>
<table border=1 width=40%>
<c:forEach var=temp items=${dao.cursos}>
<tr>
<td>${temp.idcurso}</td>
<td>${temp.nomeCurso}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

Exerccios de fixao e
Taglib e JSTL
Cite as principais vantagens que voc consegue identificar no uso de taglib e JSTL no desen-
volvimento de aplicaes WEB com Java.

Atividades Prticas
JAVA - Aplicaes Web

100
8
Cookie e session
objetivos

Apresentar aos alunos os mecanismos para controle dos objetos cookies e session,
geralmente utilizados no processo de identificao e permisso de acesso a reas
restritas de aplicaes web.

conceitos
Cookies e sessions.

Cookies
Cookie um mecanismo padro fornecido pelo protocolo HTTP que permite gravarmos
pequenas quantidades de dados persistentes de um usurio no navegador. Tais dados
podem ser recuperados posteriormente. Esse mecanismo usado quando queremos recu-
perar informaes de algum usurio. Com os cookies, podemos reconhecer quem entra em
um site, de onde vem, com que periodicidade costuma voltar.

um mecanismo padro fornecido pelo protocolo HTTP. q


11 Permite gravao de pequenas quantidades de dados.

22 Persistentes no navegador de um usurio.

11 Podem ser recuperados posteriormente pelo navegador.

Uso:

11 Recuperar informaes de algum usurio.

11 Reconhecer quem entra em um site, de onde vem, com que periodicidade costuma voltar.

Para se ter uma ideia de como eles fazem parte da sua vida, d uma olhada na sua mquina.

Se voc usa o Internet Explorer no Windows 7, v pasta C:\Users\Usurio\AppData\Roaming\


Microsoft\Windows\Cookies. No Firefox, os cookies ficam dentro de um lugar chamado
Captulo 8 - Cookie e session

pasta do perfil. Ela diferente da pasta onde o Firefox est instalado. Para visualizar os
cookies, v em Ajuda > Dados para Suporte. Na pgina que abrir, clique em Abrir Pasta.
Eis os arquivos do seu perfil. Eles armazenam suas extenses, cookies, senhas, favoritos,
histrico e preferncias. Os cookies esto armazenados no arquivo cookies.sqlite.

101
Onde esto armazenados? q
11 IE 7:

22 Na pasta C:\Users\Usuario\AppData\Roaming\Microsoft\Windows\Cookies

11 Firefox:

22 Dentro de um lugar chamado pasta do perfil (diferente da pasta onde o Firefox


est instalado).

22 Para visualizar, acesse Ajuda > Dados para Suporte e clique em Abrir Pasta.

33 Armazenam suas extenses, cookies, senhas, favoritos, histrico e preferncias.

22 Os cookies esto armazenados no arquivo cookies.sqlite.

Os cookies em si no atrapalham ningum, se propriamente usados. Como padro, os cookies


expiram to logo o usurio encerra a navegao naquele site. Porm, podemos configur-los
para persistir por vrios dias. Alm dos dados que ele armazena, um cookie recebe um nome,
atravs do qual pode ser posteriormente identificado. Um servidor pode definir mltiplos
cookies, sendo que cada cookie associados URL da pgina que o manipula.

Expiram to logo o usurio encerra a navegao no site, mas podem ser configurados q
para persistir por vrios dias.

So definidos por um servidor da web.

11 Recebem um nome.

11 Associados URL da pgina que os manipulam.

So enviados de volta para o servidor quando o usurio solicita a URL a qual estejam
associados.

Quando um usurio solicita uma URL cujo servidor e diretrio correspondam queles de um
ou mais de seus cookies armazenados, os cookies correspondentes so enviados de volta
para o servidor. As pginas JSP acessam os seus cookies associados atravs do mtodo Tabela 8.1
getCookies() do objeto implcito request. De forma similar, as pginas JSP podem criar ou Mtodos para
gerenciamento de
alterar cookies atravs do mtodo addCookie() do objeto implcito response. Esses mtodos cookies.
so resumidos na tabela a seguir:

Objeto implcito Mtodo Descrio

Request getCookies() Retorna uma matriz de cookies acessveis da pgina.

response addCookie() Envia um cookie para o navegador para armazenagem/modificao.

A classe cookie
Manipulamos um cookie atravs de instncias da 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.

Manipulao de um cookie. q
JAVA - Aplicaes Web

Instncia da classe javax.servlet.http.Cookie.

11 Fornece apenas um tipo de construtor.

11 Recebe duas variveis do tipo String, representando o nome e o valor do cookie

Sintaxe.

11 Cookie cookie = new Cookie(nome do cookie, valor do cookie).

102
A seguir, apresentamos os mtodos fornecidos pela classe cookie:

Mtodo Descrio

getName() Retorna o nome do cookie

getValue() Retorna o valor armazenado no cookie

getDomain() Retorna o servidor ou domnio do qual o cookie pode ser acessado

getPath() Retorna o caminho de URL do qual o cookie pode ser acessado

getSecure() Indica se o cookie acompanha solicitaes HTTP ou HTTPS

setValue() Atribui um novo valor para o cookie

setDomain() Define o servidor ou domnio do qual o cookie pode ser acessado

setPath(nome do path) Define o caminho de URL do qual o cookie pode ser acessado

setMaxAge(inteiro) Define o tempo restante (em segundos) antes que o cookie expire

setSecure(nome) Retorna o valor de um nico cabealho de solicitao como um nmero inteiro

Tabela 8.2 Depois de construir uma nova instncia ou modificar uma instncia recuperada atravs do
Mtodos da mtodo getCookies(), necessrio usar o mtodo addCookie( ) do objeto response, com a
classe cookie.
finalidade salvar no navegador do usurio as alteraes feitas no cookie.

Para apagar um cookie, utilizamos a seguinte tcnica: chamamos o mtodo setMaxAge(0)


com valor zero e depois mandamos gravar chamando o mtodo addCookie(). Isso faz com
que o cookie seja gravado e imediatamente expire (aps zero segundos).

Exemplos de uso de cookies


O primeiro passo para usar um cookie dentro de uma pgina defini-lo. Isso feito criando
uma instncia da classe cookie e chamando os mtodos sets para definir os valores de
seus atributos. O script JSP a seguir apresenta o cdigo de uma pgina JSP utilizada para
gerar cookies.

<%
String email = request.getParameter(email);
String cookieName = Exemplocookie;

Cookie Excookie = new Cookie(cookieName, email);


//define o tempo de vida como 7 dias (604800 segundos)
Excookie.setMaxAge(7 * 24 * 60 * 60);
//verso 0 da especificao de cookie
Excookie.setVersion(0);
//indica que o cookie deve ser transferido pelo protocolo HTTP padro
Captulo 8 - Cookie e session

Excookie.setSecure(false);
//insere um comentrio para o cookie
Excookie.setComment(Email do visitante);
//grava o cookie na mquina do usurio
response.addCookie(Excookie);
%>

103
O cdigo da pgina HTML a seguir possui um formulrio com chamada atravs de um input
submit ao script JSP que vai criar o cookie.

<html>
<body>
<form action=criacookie.jsp>
<input type=text name=email>
<input type=submit value=ok>
</form>
</body>
</html>

O cdigo JSP, visto anteriormente, tem a finalidade de receber um valor (email) passado
atravs de um formulrio de uma pgina HTML. Esse valor armazenado de forma per-
sistente em um cookie e pode ser acessado por outras pginas JSP que compartilham o
domnio e o caminho originalmente atribudo ao cookie.

O trecho de cdigo a seguir demonstra a recuperao do valor de um cookie.

<%
String cookieName = Exemplocookie;

Cookie listaPossiveisCookies[] = request.getCookies();


Cookie Excookie = null;

if (listaPossiveisCookies != null) {
//Se no existem cookies associados o mtodo getCookies() retorna null
int numCookies = listaPossiveisCookies.length;

for (int i = 0 ; i < numCookies ; ++i) {


//procura pelo cookie
if (listaPossiveisCookies[i].getName().equals(cookieName)) {
Excookie = listaPossiveisCookies[i];
break;
}
}
}
%>

Esta pgina HTML demonstra o resultado obtido quando da recuperao do cookie:

<html>
<body>
<h1>L Cookie</h1>
<% if (cookieJSP != null) { %>
A pagina criacookie.jsp gravou o email: <%= Excookie.getValue() %>
JAVA - Aplicaes Web

<% }
else { %>
O cookie no gravou ou o prazo do cookie expirou.
<% } %>
</body>
</html>

104
Consideraes finais sobre cookies
Apesar da praticidade de se utilizar os cookies oferecidos pelo protocolo HTTP, devemos
fazer algumas consideraes quanto sua utilizao.

O tamanho dos dados armazenados (nome e valor) no devem ultrapassar 4K. q


O navegador pode armazenar mltiplos cookies.

11 Armazena at 20 cookies por configurao de domnio.

11 Armazena 300 cookies em geral.

11 Se qualquer um desses dois limites forem alcanados, espera-se que o navegador


exclua cookies menos utilizados.

Configurao do domnio atribudo a um cookie.

11 Mtodo setDomain(nome do domnio).

11 Quando nenhum domnio especificado na sua criao, o cookie s poder ser lido
pelo host que originalmente o definiu.

Session
Session um mecanismo padro fornecido pelo protocolo HTTP que permite gerenciar o
acesso a pginas restritas de uma determinada aplicao web. Tambm serve para manter
objetos de classes de objetos dentro das pginas HTML. Para que o controle de pginas res-
tritas tenha maior segurana, preciso que se configure um tempo mximo para que esta
expire. Isso dar a uma determinada aplicao a segurana de acesso a pginas restritas
e, quando estas forem acessadas, tero um tempo limite de controle da sua no utilizao.
Caso esse tempo seja ultrapassado, o usurio ser obrigado a acess-la novamente. Esse
acesso geralmente feito atravs de pginas de login.

Mecanismo padro fornecido pelo protocolo HTTP.


q
11 Permite:

22 Gerenciar o acesso a pginas restritas.

22 Manter objetos de classes de objetos dentro das pginas.

11 Para que o controle de pginas restritas tenha maior segurana:

22 Configurar tempo mximo para que ela expire.

22 Caso o tempo limite seja ultrapassado, o usurio ser obrigado a acess-la novamente.

22 Acesso geralmente feito por meio de pginas de login.

O objeto session representa a sesso atual de um usurio individual. Todas as solicitaes


feitas por um usurio so consideradas parte de uma sesso. Desde que novas solicitaes
por aqueles usurios continuem a ser recebidas pelo servidor, a sesso persiste. Se, no
entanto, um certo perodo de tempo passar sem que qualquer nova solicitao do usurio
Captulo 8 - Cookie e session

seja recebida, a sesso expira.

Representa a sesso atual de um usurio individual. q


11 Todas as solicitaes feitas por um usurio so consideradas parte de uma sesso.

Persistente:

11 Desde que novas solicitaes do usurio continuem a ser recebidas pelo servidor

105
Expira: q
11 Se um certo perodo de tempo passa sem que qualquer nova solicitao do usurio
seja recebida.

O objeto session armazena informaes a respeito da sesso. Um dos principais usos para o
objeto session armazenar e recuperar valores de atributos, a fim de transmitir as informa-
es especficas de usurios entre as pginas.

A seguir, um exemplo que armazena dados na sesso, na forma de um objeto que ins-
tncia de uma classe hipottica IdSessao.

<%@ page import=IdSessao session=true%>


<%! IdSessao idsession = new IdSessao(); %>
<%
session.setMaxInactiveInterval(5);
idsession.setIdSessao(123456789);
pageContext.setAttribute(atSession,idsession,pageContext.SESSION_SCOPE);
%>

No exemplo anterior, estamos utilizando a diretiva page para importar a classe IdSessao e
tambm fazemos o uso de atributo session com o valor igual a TRUE. Esse atributo especi-
fica que a pgina faz parte da sesso atual. Caso ainda no exista uma sesso, uma nova
l
Lembramos que o
ser criada. Em seguida, ocorre a declarao de um objeto da classe IdSessao e depois so intervalo mximo de
definidos valores para esse objeto. inatividade padro de
15 minutos, que
O mtodo setMaxInactiveInterval() define, em segundos, o tempo mximo que a sesso equivale a 900
segundos. Isso no
pode permanecer inativa. A sesso ser perdida caso a pgina fique inativa por mais tempo
quer dizer que no se
do que o informado pelo mtodo setMaxInactiveInterval(). possa trabalhar com
um tempo maior.
Vejamos agora o exemplo de cdigo de um formulrio de login.

<form method=post action=validaUsuario>


<table width=30% border=0 align=center>
<tr>
<td colspan=2 align=center>Efetuar Logon</td>
</tr
<tr>
<td width=40%>Usurio:</td>
<td width=60%><input type=text name=usuario></td>
</tr>
<tr>
<td width=40%>Senha:</td>
<td width=60%><input type=password name=senha></td>
</tr>
<tr>
<td colspan=2 align=center>
<input type=submit name=b1 value=Efetuar Logon></td>
JAVA - Aplicaes Web

</tr>
</table>
</form>

J no trecho de cdigo a seguir, podemos ver o servlet de autenticao da sesso.

106
@WebServlet(name=/LoginUsuario, urlPatterns=/validaUsuario)
public class LoginUsuario extends HttpServlet {

/** */
public LoginUsuario() {

/** */
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

/** */
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
UsuarioDAO dao = new UsuarioDAO();
Usuario u = dao.validarUsuario(request.getParameter(usuario),
request.getParameter(senha));
if (u != null){
request.getSession().setMaxInactiveInterval(30);
request.getSession().setAttribute(atUsuario, u);
response.sendRedirect(menu.jsp);
}
else
response.sendRedirect(login.jsp?msg=Erro ao tentar efetuar logon!
Favor verificar usurio e senha.); }
}
}

O exemplo de pgina JSP a seguir ilustra como podemos desenvolver pginas que tenham
controle de acesso por sesso. Nesse exemplo, a pgina espera por um objeto j definido
para a sesso atual, ou seja, ela espera que seja enviado um objeto da classe IdSessao para
que este seja validado, dando, assim, acesso aos recursos dessa pgina. Uma mensagem de
erro ser retornada para o usurio caso este tente o acesso direto a essa pgina. Isso ocor-
rer devido a especificao do atributo errorPage, da diretiva page, onde se define a pgina
que ser retornada caso ocorra algum erro durante o processamento dos scriplets.

<%@ page import=IdSessao session=true%>


<%@ page errorPage=erro.htm%>
<html>
<head>
<title>Teste de validade da sesso</title>
</head>
Captulo 8 - Cookie e session

<body>
<%
IdSessao atRecuperado = new IdSessao();
String ID = null;
atRecuperado = (IdSessao)pageContext.getAttribute(atSession,
pageContext.SESSION_SCOPE);
ID = atRecuperado.getIdSessao();

107
if (ID == null) { %>
A sesso foi perdida.<br>
<a href=ExemploJSP15.jsp>Voltar</a>
<% } else { %>
Dados da sesso recuperada a partir do escopo SESSION:<br>
ID: <%= ID %><br>
Tempo mximo de vida desta sesso:<%= session.getMaxInactiveInterval()%>
<% } %>
</body>
</html>
Finalmente, apresentamos trecho do arquivo ListarCursos.jsp, onde feita a validao de
uma sesso.

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


<c:if test=${empty sessionScope.atUsuario.nome}>
<c:redirect
url=login.jsp?msg=Sesso expirou! Fazer logon novamente.>
</c:redirect>
</c:if>
<jsp:useBean id=dao class=controle.CursoDAO></jsp:useBean>
<center>Listagem de Cursos Cadastrados</center>
<hr>
<table border=0 width=60% align=center>
<thead>
<tr>
<td>Cdigo</td>
<td>Nome</td>
</tr>
</thead>
<c:forEach var=temp items=${dao.cursos}>
<tr>
<td>${temp.idcurso}</td>
<td>${temp.nomeCurso}</td>
</tr>
</c:forEach>
</table>
<hr>
<a href=menu.jsp>Voltar</a>

Exerccio de fixao e
Cookie e session
Cite as principais diferenas entre uso de cookies e sessions que voc consegue identificar.
JAVA - Aplicaes Web

Atividades Prticas

108
9
Javabeans
objetivos

Apresentar aos alunos os mecanismos de criao e uso de componentes no processo


de desenvolvimento de software e o uso desses em ferramentas RAD.

conceitos
Componente de software, bean, API e JAR.

Componentes de software
Peas de software. q
11 Aderem a uma especificao definida.

11 Podem ser distribudos e usados em diversas aplicaes.

Transformar classe em componente.

11 Adicionar algumas funcionalidades.

11 Respeitar convenes.

So interligados de modo a construir uma aplicao.

11 Desenvolvidos com um objetivo especfico.

11 No para uma aplicao especfica.

A definio oficial de bean, conforme dada na especificao JavaBeans, : Um bean um


componente de software reutilizvel, baseado na especificao JavaBeans da Sun, que pode
ser manipulado visualmente em uma ferramenta construtora.

Modelo. q
11 Define um conjunto de interfaces e classes.

22 Sero utilizadas de forma determinada.

11 Especifica como sero expostos.

22 Propriedades, mtodos e eventos.


Captulo 9 - Javabeans

11 JavaBean.

22 Para construo de aplicao de forma visual.

11 Enterprise JavaBeans (EJB).

22 Modelo de componentes para arquitetura distribuda.

109
11 JavaBean e EJB. q
22 Os modelos no so relacionados.

22 EJB no uma extenso de JavaBean.

Os programadores com experincia em Windows sabero imediatamente por que os beans


so to importantes. Atualmente, as ferramentas RAD (Rapid Application Development) so
um bom ponto de apoio para o desenvolvimento de aplicaes nas principais linguagens
visuais existentes no mercado. Alguns exemplos podem ser citados, como Visual Studio,
Delphi, VisualAge, Android Studio, entre outros.

Nestas ferramentas voc tem a possibilidade de trabalhar com componentes j desen-


volvidos, em sua maioria pelo prprio fornecedor da linguagem, atravs do processo de
construo de interfaces soltando componentes sobre a aplicao em construo. Cada um
desses componentes j traz consigo suas particularidades a serem trabalhadas, tais como
caractersticas visuais ou eventos que respondem a estmulos do usurio (clique do mouse,
digitao no teclado etc.).

JavaBeans
JavaBeans o nome de um projeto JavaSoft para definir um conjunto de componentes de
software padro acessveis atravs de uma API (Interface de Programao de Aplicativos)
para a plataforma Java.

Nome de um projeto JavaSoft. q


Define um conjunto de componentes de software padro.

11 Reutilizveis.

API (Interface de Programao de Aplicativos) para a plataforma Java.

11 Facilitam aos desenvolvedores a ligao entre modelos de componentes existentes.

22 ActiveX da Microsoft, OpenDoc da Apple...

JavaBeans a tecnologia Java que lhe permite escrever programas Java e convert-los
em Beans que podero ser utilizados por programadores em suas atividades de
desenvolvimento de aplicativos.

Descreve uma arquitetura. q


11 Componentes para Java baseado em classes Java.

11 Definem regras.

22 Possibilita a criao de classes configurveis e reutilizveis.

22 Possibilita o uso por diferentes ferramentas.

11 Definem classes e mtodos.

22 Possibilita a obteno de informaes sobre os componentes.

11 Padres definem convenes.

22 Nomes de atributos e mtodos.


JAVA - Aplicaes Web

Uma vez que voc tenha construdo um bean, os usurios de qualquer ambiente compatvel
com a tecnologia JavaBeans podem us-lo prontamente. Eles podem inclusive ser usados
em outros ambientes, como o Visual Studio ou o Delphi, atravs da Ponte Beans para
ActiveX (Beans to ActiveX Bridge).

110
Caractersticas: q
11 Baseados em programas Java normais.

11 Bean pode ser visto como um componente de software.

11 Podem ser incorporados em ambientes RAD que suportam JavaBeans.

11 Padronizar.

22 Nomes de mtodos para aceitao comercial (getters e setters).

22 Nome da classe sempre com a primeira letra maiscula.

22 Nome de mtodos com a primeira letra minscula.

22 Atributos com a primeira letra minscula.

22 Documentao de todas as funcionalidades (javadoc).

11 Acessvel para usurios no especialistas atravs de ferramentas visuais.

11 Possibilidade de uso em uma ampla variedade de contextos.

22 Local, distribuda, web, dispositivos mveis, objetos visuais grficos etc.

11 Ter um construtor padro.

11 Ser serializvel.

Escrever beans em Java no uma tarefa tecnicamente difcil. Existem apenas algumas
classes e interfaces novas para serem dominadas. Em particular, o tipo mais simples de
bean nada mais do que uma classe da plataforma Java que segue algumas convenes de
atribuio de nomes bastante restritas.

Por outro lado, como um mesmo bean pode ser usado em uma ampla variedade de contextos,
eles podem se tornar bastantes complexos. Por exemplo, um controle grfico popular em
mdia apresenta 60 propriedades, 14 mtodos, 47 eventos e 178 pginas de documentao.
Alm disso, os beans devem ter um construtor padro (ou nenhum construtor no caso em que
um construtor padro fornecido automaticamente) e devem ser serializveis. Isso permite
aos ambientes instanciar novos beans e salvar beans entre sesses.

A seguir, mostramos um trecho de programa que corresponde a um cdigo Java para um bean.

import java.io.*;

import java.swing.*;

public class TesteBean implements Serializable{

private String filename = ";

public void setFileName(String f){

fliname = f;

}
Captulo 9 - Javabeans

public String getFileName(String f){

return fliname;

111
A classe TesteBean um exemplo de bean onde podemos citar algumas convenes de
atribuio de nomes, principalmente para mtodos pertencentes s classes. Nesse caso, a
classe possui um atributo, o filename, que precisa ser acessado pelo programador que estar
utilizando-a. Para tanto, foram implementados os mtodos getFileName() e setFileName()
que, respectivamente, vo retornar ou atribuir o nome de um arquivo informado ao atributo
filename. Note tambm que a classe implementa a interface Serializable, respeitando a
necessidade de ser um objeto serializvel para poder ser utilizado em mais de uma sesso.

Iremos, agora, preparar a classe TesteBean para ser um JavaBean. A princpio, faremos
algumas modificaes que permitiram utilizar a classe como um JavaBean. Primeiro, vamos
adicionar uma instruo package (linha 1) ao arquivo TesteBean.java. Normalmente, as
classes que representam um bean so colocadas em pacotes. A segunda modificao
a implementao da interface Serializable (linha 3), j mencionada anteriormente. Como
resultado, temos a classe TesteBean, apresentada a seguir:

package aulabeans;

import java.io.*;
public class TesteBean implements Serializable {
private String filename="";

public TesteBean(){
this.setFileName(teste.txt");
System.out.println(Nome do Arquivo: +this.getFileName());
}
public void setFileName(String f){
filename = f;
}

public String getFileName(){


return filename;
}

public static void main(String args[]){


TesteBean tb = new TesteBean();
}
} // End of Class TesteBean

Agora temos de compilar a classe TesteBean.java. A instruo de compilao :

javac d.TesteBean.java

A opo -d indica que o arquivo .class dever ser criado dentro do diretrio de pacotes de
classes criado. A opo . representa o diretrio em que o pacote ordenadir deve ser
colocado, sendo, nesse caso, o diretrio atual. Como resultado da compilao, teremos um
subdiretrio na pasta onde esse arquivo TesteBean.java se encontra com o nome do package
JAVA - Aplicaes Web

informado no arquivo TesteBean.java. Esse diretrio vai conter o arquivo TesteBean.class,


indicando que esse um diretrio de pacotes de classes Java.

112
Criando um JavaBean
Para utilizar uma classe como um JavaBean, ela deve primeiro ser colocada em um Java
ArchiveFile (arquivo JAR).

Classes beans. q
11 Organizadas em pacotes de classes (package).

Implementam a interface Serializable.

Criar o arquivo .jar correspondente.

11 Utilitrio JAR do JDK.

11 Descreve o contedo do arquivo JAR.

Criar arquivo de manifesto.

11 manifest.tmp

O primeiro passo seria criar um arquivo chamado manifest.tmp. Esse arquivo utilizado
pelo utilitrio jar para descrever o contedo do arquivo JAR. Quando um arquivo JAR
contendo um JavaBean carregado em um IDE, este examina o arquivo de manifesto para
determinar as classes no JAR que representam JavaBeans e disponiliz-las para o progra-
mador de uma maneira visual. As instrues do arquivo de manifesto manifest.tmp so:

Main-Class: aulabeans.TesteBean
Name: aulabeans\TesteBean.class
Java-Bean: True

arquivo manifest.tmp q
11 Main-Class

22 Descreve a classe principal do arquivo JAR.

22 Mtodo main() quando necessrio.

11 Name

22 Especifica o nome do arquivo contento a classe bean.

22 Incluir a extenso .class

11 Java-Bean

22 indica se a classe indicada por Name , de fato, um JavaBean.

22 True | False

A seguir, criamos o arquivo JAR para o bean TesteBean atravs do utilitrio jar com a
seguinte linha de comando:

jar cvfm ButtonRelatorio.jar relatorio\manifest.tmp relatorio\*.*


Captulo 9 - Javabeans

113
Gerar o arquivo .jar q
11 Utilizar o utilitrio jar do JDK.

11 No comando, cvfm:

22 criao de um arquivo JAR.

22 verbose mostra na tela o que est acontecendo.

22 file, o nome do arquivo JAR a ser criado.

22 manifest, o arquivo de manifesto.

33 Utilizado para a gerao do MANIFEST.MF

33 Includo no diretrio META-INF do arquivo JAR

As diretiva v, de verbose, e t, de table, so usadas para visualizar o contedo de um arquivo


.jar qualquer, podendo ser usadas juntamente com outras diretivas. Ainda no comando
anterior, relatorio\manifest.tmp o caminho/nome do arquivo .tmp, enquanto que rela-
torio\*.* indica que todos os arquivos nesse diretrio devem ser includos no arquivo JAR.
Na figura 9.1, podemos ver a estrutura dos arquivos gerados aps a execuo do comando.

Figura 9.1
Estrutura de
diretrios aps
criao do
arquivo.jar.

Podemos utilizar pacotes de classes externas. q


11 Devem ser disponibilizados no projeto em construo.

22 Importar .jar em bibliotecas.

22 JavaBean e classes externas.


JAVA - Aplicaes Web

114
Figura 9.2
Pacotes externos
importados
para o diretrio
Bibliotecas.

JavaBeans no IDE (Netbeans)


O uso de Javabeans no Netbeans pode ser configurado atravs de Ferramentas/Paletas/
Componentes Swing/AWT, conforme pode ser visto na figura 9.3.

Arquivo .jar do JavaBean q


11 Pelo gerenciador de paletas.

22 Adicionar.

22 Remover.

11 Em qualquer patela.

11 Criar novas.

11 Preferencialmente.

22 Paleta Beans.

Captulo 9 - Javabeans

115
Figura 9.3
Gerenciador
de paletas do
Netbeans.

JSP com JavaBeans


O atributo ao da tag page possibilita a realizao de tarefas complexas. Embora se
obtenha resultados equivalentes com o uso de cdigo Java dentro de scriptlets, o uso das
tags de aes promove reusabilidade de seus componentes e aumenta a capacidade de
manuteno da pgina.

Uso do atributo ao da tag <@page /> permite: q


11 Instanciao de objetos.

11 Comunicao com recursos do lado do servidor como pginas JSP e servlets.

11 Sem a necessidade de cdigo Java.

Resultado equivalente com o uso de cdigo Java dentro de scriptlets.

Uso das tags de aes.

11 Promove reusabilidade de seus componentes.

11 Aumenta a capacidade de manuteno da pgina.

A tecnologia de componentes para JSP baseada em componentes JavaBeans. Antes de


acessar um bean dentro de uma pgina JSP, necessrio identificar o bean e obter uma
referncia dele.
JAVA - Aplicaes Web

116
Tecnologia de componentes para JSP. q
11 Baseada em componentes JavaBeans.

11 Identificar o bean.

22 Antes de acess-lo dentro de uma pgina JSP.

22 Necessrio identificar e obter sua referncia.

11 tag <jsp:useBean />

22 Tenta obter uma referncia de um bean que j esteja criado.

22 Depende do escopo em que ele foi definido.

33 scope=page | request | session | application

Por exemplo:

<jsp:useBean id="user" class="Global" scope="session"/>

id q
11 id=beanInstanceName

class

11 class=package.class

scope

11 scope=page | request | session | application

beanName

11 beanName={package.class | <%= expression %>}

Type

11 type=package.class

A tag acima instanciar um objeto que ser identificado por user, a partir da classe Global.
A definio do escopo depende muito do projeto em questo. No exemplo anterior, esse
objeto criado ser compartilhado por toda sesso que ser mantida com o usurio. Caso
encontre-se uma nova tag de criao de um objeto da classe Global, o objeto j instanciado
ser usado, no havendo a necessidade de criao de outro.

Passos para a criao do objeto: q


11 Tentativa de localizar o objeto.

11 Baseado nas informaes (id, scope).

11 Inspeo feita sincronizada.

11 Definir a varivel de script identificado por id.

11 Objeto encontrado.

22 A varivel inicializada com a referncia localizada e ento realizado um


casting para o tipo especfico.
Captulo 9 - Javabeans

11 Se o Cast falhar:

22 Uma exceo do tipo java.lang.ClassCastException vai ocorrer e o

processamento da tag acaba.

117
11 Objeto no encontrado no escopo e a classe no pode ser localizada: q
22 Uma exceo do tipo java.lang.InstantiationException vai ocorrer e o processa-
mento da tag acaba.

11 Objeto no encontrado no escopo e a classe for encontrada com um construtor


padro (sem argumentos):

22 O objeto instanciado e relacionado com a varivel de scriplet identificada por id.

11 Se um construtor sem argumentos no for encontrado:

22 Ento uma exceo do tipo java.lang.InstantiationException ocorrer e o


processamento da tag acabar.

Caso o processamento do corpo da tag venha a ser realizado, ele poder realizar algumas
inicializaes desejadas, como no exemplo a seguir, onde o objeto clientes instanciado
com as propriedades nome e telefone.

<jsp:useBean id="clientes" class="Clientes" scope="page">


<jsp:setProperty name="clientes" property="nome" value="Rafael dos Santos">
<jsp:setProperty name="clientes" property="telefone" value="648-2343"/>
</jsp:useBean>

Cabe entender melhor os escopos possveis para a definio de um bean. So eles:

11 page: objetos so vistos apenas pela pgina onde ele foi criado. As referncias para q
esses objetos so armazenados no objeto pageContext.

11 request: objetos so vistos nas pginas usadas para responder a requisio do


usurio. Se uma pgina redirecionada para outra, esses objetos so preservados,
uma vez que fazem parte da mesma requisio. As referncias para esses objetos so
armazenadas no objeto implcito request.

11 session: objetos so acessveis por pginas que fazem parte da mesma sesso.
As referncias para esses objetos so armazenadas no objeto session.

11 application: objetos so acessveis por toda aplicao JSP em questo e so armaze-


nados no objeto implcito application.

Vejamos um exemplo de uso de JSP com JavaBeans. No cdigo JSP a seguir, realizada a
chamada a um JavaBean que a classe Global. Atravs da tag <jsp:useBean> criado um objeto
chamado user, que ser utilizado ao longo do cdigo para realizar chamadas aos mtodos
implementados para essa classe. Podemos citar a linha do comando user.checkUser(); como
exemplo de execuo de um mtodo da classe Global dentro do cdigo JSP.

<html>
<head>
<title>Pgina Principal</title>
</head>

<%@ page import = Global" %>


JAVA - Aplicaes Web

<jsp:useBean id="user" scope="page" class="Global" />


<jsp:setProperty name="user" property="login" />
<jsp:setProperty name="user" property="password" />

<body>

118
<% user.checkUser();

if (!(user.getUser().equals(adm"))) { %>
<jsp:forward page="nopermition.jsp" />
<% } %>
<h1>Seo de Administrador</h1><br><br>
<center>
Bem Vindo!!! Administrador.
</center>
<br><a href="javascript:history.back()">Voltar</a><br>
</body>
</html>

Nesse outro exemplo, comeamos mostrando o cdigo HTML de um formulrio de entrada


de dados.

<!DOCTYPE html>
<html>
<head>
<title>JSP e JavaBean</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<form method="post" action="ex01UseBean.jsp">
Digite seu nome:
<input type="text" name="nome" size="50" />
<br />
Selecione o sexo:
<select name="sexos">
<option value="Feminino">Feminino</option>
<option value="Masculino">Masculino</option>
</select>
<br />
<input type="reset" name="b1" value="Limpar" />
&nbsp;&nbsp;
<input type="submit" name="b2" value="Enivar" />
</form>
</body>
</html>

O cdigo do bean a ser utilizado o seguinte.

<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>


<jsp:useBean id="pessoa" class="modelo.Pessoa" />
<jsp:setProperty name="pessoa" property="nome" />
Captulo 9 - Javabeans

<jsp:setProperty name="pessoa" property="sexo" />


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>JSP e JavaBean</title>

119
</head>
<body>
<h1>Informaes do objeto instanciado do Bean</h1>
<hr>
Nome: ${pessoa.nome}
<br>
Sexo: ${pessoa.sexo}
<hr>
<a href="ex01UseBean.html">Voltar</a>
</body>
</html>

Uma alternativa utilizar o bean com atribuio genrica, conforme podemos ver no trecho
de cdigo a seguir.

<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>


<jsp:useBean id="pessoa" class="modelo.Pessoa" />
<jsp:setProperty name="pessoa" property="*"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>JSP e JavaBean</title>
</head>
<body>
<h1>Informaes do objeto instanciado do Bean</h1>
<hr>
Nome: ${pessoa.nome}
<br>
Sexo: ${pessoa.sexo}
<hr>
<a href="ex02UseBean.html">Voltar</a>
</body>
</html>

Exerccio de fixao e
JavaBeans
Para voc, qual a principal caracterstica e como JavaBeans pode auxiliar no processo de
desenvolvimento de sofwares?
JAVA - Aplicaes Web

Atividades Prticas

120
10
Deployment de aplicao Java Web
objetivos

Apresentar aos alunos os passos necessrios para a organizao de um projeto de


aplicao web a ser colocado em ambiente de produo no servidor web
Apache TomCat.

conceitos
Deployment.

Apache Tomcat
Neste curso, vamos apresentar o Deployment de aplicao Java WEB no Apache Tomcat.
O Apache Tomcat Servlet/JSP Container uma implementao rpida e eficiente da especifi-
cao dos servlets, de um web container que suporta servelts e aplicaes JSP ou JSF.

oriundo do projeto Jakarta da ASF (Apache Software Fundation), originalmente criado para
desenvolver tecnologias server-side baseadas na plataforma Java, tendo recebido um grande
impulso quando a Sun resolveu doar sua implementao de referncia dos servlets e JSP.

Tomcat Servlet/JSP Container. q


11 Implementao rpida e eficiente da especificao dos servlets.

11 Web container que suporta servlets e aplicaes JSP ou JSF.

22 Composto por trs elementos principais:

11 Catalina: web container que fornece a infraestrutura para a execuo e gerencia-


mento dos servlets.
Captulo 10 - Deployment de aplicao Java Web

11 Jasper: compilador que transforma pginas JSP em servlets equivalentes, compi-


lando-os em bytecode.

11 Connectors: elementos de conexo entre o Tomcat e outros servidores.

22 Possibilita integrao com outros servidores web.

33 Apache HTTPd ou MS IIS.

A instalao do Tomcat bastante simples e pode ser realizada seguindo o roteiro


disponvel no AVA.

121
Aps a instalao, de modo a verificar o correto funcionamento do Tomcat, acesse o
seguinte endereo atravs do navegador/browser:

http://localhost:8080

Se estiver tudo Ok, dever ser exibida a tela reproduzida na figura 10.1, a seguir.

Figura 10.1
Pgina inicial
do Tomcat.

O gerenciamento das aplicaes hospedadas pelo Tomcat pode ser feito atravs do manager
webapp, acessvel atravs do link que aparece no canto inferior esquerdo na figura 10.1, logo
a seguir do ttulo Managing Tomcat. Essa aplicao pode ser tambm acessada direta-
mente atravs da URL:

http://localhost:8080/manager/html

Qualquer que tenha sido a opo escolhida, caso tenha sido definido um login/senha para o
administrador do Tomcat durante o seu processo de instalao, essas informaes tero de
ser corretamente fornecidas para que o sistema exiba a tela que reproduzida na figura 10.2.
JAVA - Aplicaes Web

122
Figura 10.2
Gerenciador
de aplicaes
Deployment
do Tomcat. O deployment ou instalao web no Tomcat bastante simples e pode ser realizado de trs
formas:

11 Deployment de arquivo WAR. q


11 Deployment automtico do arquivo WAR.

11 Deployment manual.

Deployment de arquivo WAR


O deployment de arquivo WAR pode ser realizado pelo gerenciador de aplicados do Tomcat,
mais especificamente atravs da sesso Deploy, exibida mais para baixo na pgina, aps a
lista de aplicaes disponveis. Essa sesso pode ser visualizada na figura 10.3.

11 No Manager Webapp. q
11 Seo Deploy.

22 WAR file to deploy.

22 Selecione o arquivo.war com a aplicao a ser instalada.


Captulo 10 - Deployment de aplicao Java Web

22 Clique no boto Deploy.

123
A nova aplicao passar a figurar entre as aplicaes disponveis no Tomcat. Figura 10.3
Ativao/Deploy
de aplicaes com
Deployment automtico do arquivo WAR arquivos war.

Quando o Tomcat inicializado, quaisquer arquivos WAR presentes em seu diretrio


wabapps so automaticamente instalados, tornando-se aplicaes web disponveis.

11 Ao ser inicializado, o Tomcat automaticamente disponibiliza todas as aplicaes cujos q


arquivos WAR estejam em seu diretrio webapps.

11 Novos arquivos WAR colocados no diretrio wabapps so tambm automaticamente


instalados e disponibilizados se o Tomcat estiver em modo autodeploy.

11 O modo autodeploy pode ser configurado atravs do arquivo server.xml (configu-


rao do Tomcat).

22 Localizado no diretrio conf.

22 Propriedade do Host.

Destacamos a seguir o trecho do arquivo server.xml onde o AutoDeploy configurado:

<Host name=localhost appBase=webapps umpackWARs=true autoDeploy=true


xmlValidation=false xmlNamespaceAware=false>

Deployment manual
O deployment manual bem mais trabalhoso.

11 Toda a estrutura de diretrios da aplicao dever ser criada manualmente: q


JAVA - Aplicaes Web

11 Raiz do contexto, WEB-INF, classes, lib etc.

11 Os arquivos de cada diretrio devero ser copiados manualmente.

11 A aplicao s se tornar disponvel aps a reinicializao do Tomcat.

124
11 Bibliotecas Adicionais 2 alternativas: q
22 Adicionando o arquivo JAR em um subdiretrio lib a ser criado no subdiretrio
WEB-INF da aplicao.

33 Ser empacotado e distribudo por meio do arquivo WAR da aplicao web.

33 O deployment da aplicao a tornar completamente ativa, sem necessidade


de configuraes adicionais.

22 Adicionando o arquivo JAR no subdiretrio lib do Apache Tomcat.

33 Disponveis para todas as aplicaes instaladas.

33 O Apache Tomcat dever ser reiniciado para que os novos JAR se tornem disponveis.

Exerccios de fixao e
Deployment
Qual sua impresso sobre o processo de deploy de aplicao Java WEB no Apache Tomcat?

Atividades Prticas

Captulo 10 - Deployment de aplicao Java Web

125
JAVA - Aplicaes Web

126
Paulo Henrique Cayres possui gradu-
ao no curso Superior de Tecnologia
em Processamento de Dados pela
Universidade para o Desenvolvimento
do Estado e da Regio do Pantanal
(UNIDERP), especializao em Anlise
de Sistemas pela Universidade Federal
de Mato Grosso do Sul (UFMS) e mestrado em Cincias da
Computao pela Universidade Federal do Rio Grande
do Sul (UFRGS). Atualmente coordenador do Ncleo de
Educao a Distncia - NEaD da Faculdade da Indstria do
Sistema FIEP. Scio-diretor da CPP Consultoria e Assessoria
em informtica Ltda. Tem experincia na rea de Cincia da
Computao, com nfase em Engenharia de Software.
Professor titular em cursos de graduao e ps-graduao
ministrando disciplinas de desenvolvimento de sistemas
desde 1995. Instrutor de treinamento na linguagem Java
de programao junto ao CITS em Curitiba e na ESR-RNP.
O curso tem como principal caracterstica a prtica em
LIVRO DE APOIO AO CURSO

laboratrio para desenvolvimento de aplicaes em Java


voltadas para a web/internet. So abordados desde o uso
de sockets e RMI, passando pela utilizao de applets,
servlets e JSP (incluindo a manipulao de banco de da-
dos) at a implementao do gerenciamento de sesses
e uso de cookies. So abordados ainda a TagLib e JSTL,

em servidores Web.