Escolar Documentos
Profissional Documentos
Cultura Documentos
Servlet JSP PDF
Servlet JSP PDF
Online
Java Web - Servlet e JSP - On-Line
AVISO DE RESPONSABILIDADE
Alfamdia Prow
http://www.alfamidia.com.br
2
Java Web - Servlet e JSP - On-Line
Sumrio
Captulo 1 Introduo ...................................................................................... 7
Captulo 2 HTTP ............................................................................................. 9
URI .......................................................................................................................................... 10
URI, URL e URN ................................................................................................................ 10
Sintaxe ................................................................................................................................. 11
Parmetros ........................................................................................................................... 11
URIs Absolutos ................................................................................................................... 11
URIs Relativos .................................................................................................................... 12
Request .................................................................................................................................... 12
Mtodos ............................................................................................................................... 12
Cabealhos .......................................................................................................................... 13
Response ................................................................................................................................. 16
Cdigo de Resposta ............................................................................................................. 16
Cabealhos .............................................................................................................................. 20
Captulo 3 Ambiente de Desenvolvimento ................................................... 24
JDK JRE ............................................................................................................................... 25
Ambiente Integrado de Desenvolvimento ............................................................................... 25
Servidor de Aplicao ............................................................................................................. 25
Web Container..................................................................................................................... 25
EJB Container ..................................................................................................................... 26
Captulo 4 Aplicaes Web ........................................................................... 27
A Web Esttica ........................................................................................................................ 27
A Web Dinmica ..................................................................................................................... 27
CGI .......................................................................................................................................... 28
A Resposta da Sun .................................................................................................................. 28
Servlets ................................................................................................................................ 29
JSPs ..................................................................................................................................... 29
Uma Aplicao Web em Java ................................................................................................. 29
Criando Uma Aplicao Java Web com o NetBeans .......................................................... 29
Captulo 5 Servlets ........................................................................................ 32
A API de Servlets .................................................................................................................... 32
A Interface Servlet .............................................................................................................. 32
A Classe GenericServlet...................................................................................................... 33
3
Java Web - Servlet e JSP - On-Line
4
Java Web - Servlet e JSP - On-Line
O Operador [ ........................................................................................................................ 64
Usando Arrays ..................................................................................................................... 64
Usando Lists ........................................................................................................................ 65
Usando Maps e Beans ......................................................................................................... 65
Objetos Implcitos ................................................................................................................... 66
Lidando com os Parmetros da Requisio ............................................................................. 67
Operadores .............................................................................................................................. 67
Captulo 9 MVC ............................................................................................ 69
Uma Aplicao Web Sem MVC ............................................................................................. 69
Variaes Sobre um Mesmo Tema ......................................................................................... 71
MVC Modelo 1 ................................................................................................................... 71
MVC Modelo 2 ................................................................................................................... 71
Uma Aplicao Web com MVC ............................................................................................. 71
Os Componentes da Arquitetura MVC ................................................................................... 72
Model .................................................................................................................................. 72
View .................................................................................................................................... 73
Controller ............................................................................................................................ 73
Mquina de Estados ................................................................................................................ 73
Uma Aplicao Web Como Uma Mquina de Estados....................................................... 73
Design-Patterns ....................................................................................................................... 76
O Design-Pattern Command ............................................................................................... 76
O Design-Pattern Abstract Factory ..................................................................................... 77
Captulo 10 JSTL .......................................................................................... 81
Namespaces ............................................................................................................................. 81
Colaborao Entre Tags .......................................................................................................... 82
Colaborao Implcita ......................................................................................................... 82
Colaborao Explcita ......................................................................................................... 83
O Namespace Core .................................................................................................................. 83
Suporte s Variveis ............................................................................................................ 83
Controle de Fluxo ................................................................................................................ 84
Gerenciamento de URLs ..................................................................................................... 86
Tags Variadas ...................................................................................................................... 87
Internacionalizao ................................................................................................................. 88
Preparando os Resource Bundles ........................................................................................ 88
Exibindo Mensagens ........................................................................................................... 89
5
Java Web - Servlet e JSP - On-Line
Formatao .............................................................................................................................. 90
Formatando Valores ............................................................................................................ 90
Captulo 11 Custom Tags .............................................................................. 93
A Anatomia de uma Tag ......................................................................................................... 93
Atributos .............................................................................................................................. 94
Corpo ................................................................................................................................... 94
Tag Handler............................................................................................................................. 94
O Descritor da Biblioteca de Tags .......................................................................................... 95
Criando o Arquivo TLD com o NetBeans........................................................................... 96
Tags Clssicas ......................................................................................................................... 98
Classes da API de Tags Customizadas Clssicas ................................................................ 98
O Ciclo de Vida das Tags Clssicas .................................................................................... 99
Implementando Uma Tag Clssica ................................................................................... 102
Tags Simples ......................................................................................................................... 108
Classes da API de Tags Customizadas Simples ................................................................ 109
Implementando Uma Tag Simples .................................................................................... 111
Arquivos de Tags .................................................................................................................. 114
Implementando Um Arquivo de Tag................................................................................. 114
6
Java Web - Servlet e JSP - On-Line
Captulo 1 Introduo
O mundo dos negcios no seria o mesmo sem a World Wide Web. Em especial, a tecnologia
das aplicaes web libertou as empresas das dores-de-cabea e custos de se manter uma
aplicao atualizada em centenas de computadores: hoje em dia, com um click do mouse
possvel ter uma aplicao sempre atualizada e imediatamente disponvel para todos os seus
usurios, quer ele estejam na outra sala ou no outro lado do mundo.
Neste curso exploraremos as principais tecnologias oferecidas pela plataforma Java para a
criao de aplicaes web de nvel corporativo, em especial a plataforma Java Enterprise
Edition.
A Java Enterprise Edition (Java EE, anteriormente conhecida como Java 2 Enterprise Edition ou
J2EE) uma plataforma bastante usada para o desenvolvimento de aplicaes de lado servidor
na linguagem de programao Java. A Plataforma Java EE difere do Java SE por adicionar uma
srie de bibliotecas que oferecem funcionalidades para a criao de aplicaes tolerantes a
falhas, distribudas e multi-camadas, baseadas em componentes modulares sendo executados em
um servidor de aplicaes.
A seguir vemos um pequeno apanhado das tecnologias que compe a Java EE, bem como seu
histrico de verses.
Verso Data JSR Principais APIs
J2EE 1.2 12/12/1999 - Enterprise JavaBeans 1.1
JavaServer Pages 1.1
Java Servlet 2.2
Java Data Base Conectivity 2.0
J2EE 1.3 24/09/2001 JSR-58 Enterprise JavaBeans 2.0
JavaServer Pages 1.2
Java Servlet 2.3
Java Data Base Conectivity 2.1
J2EE 1.4 11/11/2003 JSR-151 Enterprise JavaBeans 2.1
JavaServer Pages 2.0 [JSR-152]
JavaServer Pages Standard Tag Library 1.1
[JSR-52]
Java Servlet 2.4
Java Data Base Conectivity 3.0
7
Java Web - Servlet e JSP - On-Line
8
Java Web - Servlet e JSP - On-Line
Captulo 2 HTTP
Se a sua aplicao vai funcionar por meio da World Wide Web, ento ela precisa se ater s
regras da web. Em especial, precisamos compreender e saber como utilizar o principal
protocolo da web, o http.
O Hyper Text Transfer Protocol (HTTP, protocolo de transferncia de hiper-texto) foi criado
por Tim Berners-Lee quando trabalhava no CERN, em 1989.
um protocolo baseado em requisio-resposta, usado para computao cliente-servidor.
O cliente envia uma requisio ao servidor;
O servidor trata a requisio do cliente e lhe envia uma resposta.
Esta resposta pode conter algum contedo a ser exibido/armazenado pelo cliente ou algum tipo
de mensagem de status, indicando as possveis razes pela solicitao ter falhado.
Experimente voc mesmo:
Abra uma janela do DOS e digite a seguinte linha:
telnet www.alfamidia.com.br 80
Quando o comando conseguir conectar com o servidor da Alfamdia a tela ficar preta.
Digite o seguinte request (o cursor se mover, mas voc no ver o que digita na tela, ento
tome cuidado para no errar):
GET /index.html HTTP/1.1
Host: www.alfamidia.com.br
9
Java Web - Servlet e JSP - On-Line
URI
Um Uniform Resource Identifier (URI, ou "identificador uniforme de recurso") uma cadeia de
caracteres usada para identificar um nome ou recurso na Internet.
Este identificador possibilita a interao com recursos (documentos ou mesmo programas)
usando protocolos especficos.
No uso popular e at mesmo em documentos tcnicos e discusses verbais, os termos URI e
URL so frequentemente usados intercambiadamente.
Mas existem diferenas, como veremos a seguir.
Um Uniform Resource Locator (URL, "localizador uniforme de recurso") um URI que
especifica onde um recurso identificado est disponvel e que mecanismo deve ser usado para
recuper-lo:
http://www.google.com/
Um Uniform Resource Name (URN, "nome uniforme de recursos) serve para identificar um
recurso independentemente do local onde ele est armazanado.
Um URN funciona como o nome de uma pessoa enquanto um URL funciona como o endereo
daquela pessoa. Em outras palavras, um URN define a identidade do tem, enquanto que um
URL prov um meio de encontr-lo.
10
Java Web - Servlet e JSP - On-Line
Sintaxe
No exemplo abaixo vemos um URI apontando para um determinado recurso armazenado na
World Wide Web.
[http://<servidor>][:<porta>][/<urn>][#<fragmento>][?<parametro-
1>=<valor-1>&<parametro-2>=<valor-2>]
O elemento servidor indica o nome ou IP do servidor onde o recurso est
hospedado;
O elemento porta indica a porta (ou servio rodando no servidor) que atende quele
tipo de solicitao (se no for passado, para URIs do tipo HTTP o padro 80);
O elemento urn indica o caminho (seja real ou fictcio) at o recurso desejado;
O elemento fragmento indica uma determinada seo dentro do documento;
Os elementos parametro-1 e parametro-2 indicam parmetros adicionais a
serem adicionados na requisio, enquanto que os elementos valor-1 e valor-2
indicam os valores dos respectivos parmetros. Voc pode ter quantos parmetros
quiser em um URI.
Por exemplo, veja o URI de uma pesquisa no Google:
http://www.google.com/search?q=http
No exemplo:
www.google.com indica o nome do servior;
/search indica a URN do recurso;
q=http indica o nome e valor de um parmetro.
Parmetros
Os parmetros so informaes adicionais fornecidas ao se criar um URI (ou ao preencher um
formulrio na web) e que so enviadas ao servidor juntamente com a requisio.
O Google, por exemplo, usa o parmetro q para indicar qual a expresso de busca o usurio
informou na caixa de busca.
Estes parmetros ficam disposio do documento ou aplicao apontado pela requisio, e
podem ser usados para afetar o seu comportamento. Assim o Google consegue devolver ao
cliente apenas as pginas que atendem ao critrio de buscas.
URIs Absolutos
Chamamos de URI absoluto um URI que indica um servidor e recurso na rede, sem
ambiguidades.
11
Java Web - Servlet e JSP - On-Line
http://www.alfamidia.com.br
http://www.alfamidia.com.br/default.aspx
http://www.alfamidia.com.br/imgs/logo.png
URIs Relativos
Por outro lado existem URIs em que se aponta para um recurso de maneira relativa ao
documento que se est vendo no momento.
O cdigo fonte do documento http://www.alfamidia.com.br/default.aspx pode
se referenciar imagem logo.png apenas ao indicar como URI o seguinte texto:
/imgs/logo.png
Neste caso cabe ao browser resolver a ambiguidade por adicionar o prefixo (protocolo, host,
porta...) a partir da localizao do documento corrente.
Request
As requisies do protocolo HTTP so basicamente linhas de texto que identificam o mtodo
da requisio, o endereo do recurso desejado e eventuais informaes adicionais a respeito do
cliente e das suas capacidades.
Veja um exemplo:
GET /index.html HTTP/1.1
Host: www.alfamidia.com.br
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101
Firefox/4.0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Mtodos
O protocolo HTTP define nove mtodos usados para indicar a ao que se deseja executar no
recurso apontado. O que este recurso representa (dados pr-existentes ou gerados
dinamicamente) depende apenas da implementao do servidor, mas normalmente o recurso
corresponde a um arquivo fsico ou sada de um programa que reside no servidor.
Mtodo Descrio
HEAD Solicita uma resposta idntica quela que seria
retornada pelo mtodo GET, porm sem o
corpo.
GET Solicita uma representao do recurso
indicado (normalmente uma pgina HTML).
POST Envia dados para serem processados pelo
recurso indicado. Os dados estaro includos
no corpo da requisio.
12
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
PUT Envia uma representao do recurso.
DELETE Apaga o recurso especificado.
TRACE Ecoa a requisio recebida, de forma que o
cliente possa ver alteraes que foram feitas
por servidores intermedirios.
OPTIONS Retorna os mtodos HTTP que o servidor
suporta para um dado recurso.
CONNECT Converte a conexo de request em um tnel
TCP/IP, normalmente utilizado para facilitar
trfego SSL.
PATCH usado para aplicar pequenas correes em
um recurso.
Cabealhos
Os cabealhos da requisio so as linhas de texto enviadas logo abaixo da linha de request, e
podem ser usados para identificar o cliente e as suas capacidades, bem como para definir os
parmetros da transao HTTP.
Os cabealhos se apresentam no formato <cabealho>: <valor>, cada um em uma linha.
Em HTTP/1.1 todos os cabealhos exceto o cabealho Host so opcionais.
O final dos cabealhos demarcado por uma linha em branco.
Cabealho Descrio Exemplo
Accept Indica os Content-Types Accept: text/plain
aceitos pelo cliente.
Accept-Charset Indica os conjuntos de Accept-Charset: utf-8
caracteres aceitos pelo
cliente.
Accept-Encoding Indica os encodings Accept-Encoding: <compress | gzip |
aceitos pelo cliente. deflate | sdch | identity>
Accept-Language Indica as lnguas aceitas Accept-Language: en-US
pelo cliente.
Authorization Credenciais de Authorization: Basic
autenticao para a QWxhZGRpbjpvcGVuIHNlc2FtZQ==
autenticao HTTP.
Cache-Control As diretivas que devem Cache-Control: no-cache
ser atendidas por todos os
mecanismos de cache
dentro da cadeia de
request/response.
Connection O tipo de conexo Connection: close
preferida pelo cliente.
13
Java Web - Servlet e JSP - On-Line
14
Java Web - Servlet e JSP - On-Line
15
Java Web - Servlet e JSP - On-Line
Response
As respostas HTTP representam o contedo que o atendimento da requisio previamente
enviada pelo cliente gerou.
Elas consistem de algumas linhas de cabealho seguidas de uma linha em branco e o contedo
propriamente dito, tipicamente um arquivo HTML ou algum outro recurso, como um arquivo de
imagem ou PDF, por exemplo.
Veja um exemplo:
HTTP/1.1 200 OK
Date: Mon, 11 Apr 2011 19:44:37 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 23404
Cdigo de Resposta
A primeira linha de uma resposta HTTP chamada de linha de status, e serve para indicar o
sucesso ou falha da operao.
As linhas de status vem no formato <verso-do-protocolo> <cdigo-de-status>
<razo>, como por exemplo:
HTTP 1.1 404 Not Found
O primeiro dgito do cdigo de status indica a classe do status, e sozinho j pode nos dar uma
indicao se a requisio foi bem-sucedida ou no.
Classes
Classe Descrio
1xx Informacional A requisio foi recebida, continuando com o
processo.
2xx Sucesso A requisio foi recebida, compreendida e
aceita pelo servidor.
3xx Redirecionamento O cliente deve tomar aes adicionais para
completar a requisio.
4xx Erro do Cliente Aparentemente o cliente errou ao fazer a
requisio, seja por indicar um recurso
inexistente ou por no estar autorizado a ver o
mesmo.
5xx Erro do Servidor O servidor no conseguiu atender uma
requisio aparentemente vlida.
1xx Informacional
Os cdigos de status do grupo 1xx indicam que a requisio foi recebida e que o servidor est
continuando com o processo de atendimento.
16
Java Web - Servlet e JSP - On-Line
2xx Sucesso
As mensagens de status do grupo 2xx indicam que a requisio foi recebida, compreendida e
aceita pelo servidor.
Cdigo de Status Descrio
200 OK A requisio foi bem-sucedida.
201 Created A requisio foi bem sucedida e resultou na
criao de uma nova entidade.
202 Accepted A requisio foi aceita, mas o processamento
ainda no se completou.
203 Non-Authoritative Information O servidor processou a requisio, mas est
retornando informaes que podem ser de
outra fonte.
204 No Content O servidor processou a requisio, mas no
tem contedo para enviar.
205 Reset Content O servidor processou a requisio, mas no
tem contedo para enviar, porm, diferente do
status 204, o cliente precisa re-enviar a
requisio.
206 Partial Content O servidor est enviando apenas parte do
contedo, atendendo solicitao Range.
207 Multi-Status A mensagem de resposta que se segue est em
XML e pode conter mltiplos status (um para
cada sub-request).
226 IM Used O servidor atendeu solicitao GET, e a
resposta representa uma ou mais
manipulaes de instncia aplicadas ao
contedo.
17
Java Web - Servlet e JSP - On-Line
3xx Redirecionamento
As mensagens do grupo 3xx indicam que o servidor no conseguiu atender na sua plenitude a
solicitao, e que o cliente deve tomar aes adicionais para v-la atendida.
Cdigo de Status Descrio
300 Multiple Choices Existem mltiplas opes para o recurso
indicado pelo cliente.
301 Moved Permanently Esta e todas as futuras requisies devem ser
enviadas para um novo URI.
302 Found A resposta pode ser encontrada em outro URI.
Status fora do padro.
303 See Other A resposta pode ser encontrada em outro URI.
304 Not Modified O recurso no foi modificado desde a ltima
requisio.
305 Use Proxy O recurso deve ser solicitado por meio de um
proxy.
306 Switch Proxy Este status no mais usado.
307 Temporary Redirect Nesta ocasio a requisio deve ser
redirecionada para outro URI, mas futuras
requisies podem continuar usando a URI
original.
18
Java Web - Servlet e JSP - On-Line
19
Java Web - Servlet e JSP - On-Line
Cabealhos
Os cabealhos da resposta so as linhas de texto enviadas logo abaixo da linha de status, e so
usados para identificar as capacidades do servidor ou meta-dados a respeito do contedo sendo
retornado, bem como para definir os parmetros da transao HTTP.
Assim como ocorre com os cabealhos da requisio, os cabealhos da resposta se apresentam
no formato <cabealho>: <valor>, cada um em uma linha.
Cabealho Descrio Exemplo
Accept-Ranges Os tipos de contedo Accept-Ranges: bytes
parcial que este
servidor suporta.
Age O tempo que o objeto Age: 12
ficou no proxy ou
cache, em segundos.
Allow Aes vlidas para um Allow: GET, HEAD
determinado recurso.
20
Java Web - Servlet e JSP - On-Line
21
Java Web - Servlet e JSP - On-Line
22
Java Web - Servlet e JSP - On-Line
23
Java Web - Servlet e JSP - On-Line
Captulo 3 Ambiente de
Desenvolvimento
24
Java Web - Servlet e JSP - On-Line
JDK JRE
Voc provavelmente j tem isso instalado, mas no custa lembrar... Para executar toda e
qualquer aplicao Java voc vai precisar ter o JRE instalado.
O JRE pode ser obtido atravs do seguinte link:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Para aplicaes Java EE voc precisa exatamente do mesmo JRE. No h nenhum download
especial de run-time para o Java EE exceto pelos demais componentes descritos aqui (o IDE e o
Servidor de Aplicaes).
Numa mquina de desenvolvimento voc vai precisar tambm do JDK. Numa mquina
servidora, a qual voc no usar para compilar suas aplicaes, voc precisa apenas do JRE. J
seus usurios precisaro apenas de um browser (sequer o JRE necessrio, uma vez que todo o
cdigo Java ocorre no lado servidor).
Servidor de Aplicao
Um Servidor de Aplicao (AS, de Application Server) basicamente um servidor web com
capacidade de executar aplicaes Java EE.
Existem basicamente duas variantes deste modelo:
Web Container
EJB Container
Web Container
Um Web Container um servidor de aplicaes cujas funcionalidades se restringem a servir
documentos JSP e Servlets.
o conjunto mnimo de requisitos para que um software seja considerado um Servidor de
Aplicao Java.
25
Java Web - Servlet e JSP - On-Line
EJB Container
J o termo EJB Container se refere queles servidores de aplicao que tem capacidade de
executar aplicaes Java EE mais complexas, incluindo a os Enterprise Java Beans, transaes,
segurana e distribuio.
Dentre os EJB Containers podemos citar:
GlassFish
http://glassfish.java.net/
JBoss
http://www.jboss.org/jbossas/
Apache Geronimo
http://geronimo.apache.org/
IBM WebSphere
http://www-01.ibm.com/software/webservers/appserv/was/
Oracle WebLogic
http://www.oracle.com/us/products/middleware/application-server/index.html
26
Java Web - Servlet e JSP - On-Line
A Web Esttica
Quando foi concebida, no final dos anos 80, a Web era um lugar que seria usado apenas para
hospedar documentos acadmicos. Naquela poca ainda no se antevia a necessidade de se
criar interfaces para a criao de contedos dinmicos; ela foi criada basicamente para
armazenar documentos de pesquisa ou publicaes, palavras congeladas no tempo.
Neste contexto, um Servidor Web era apenas um software capaz de identificar que documento
estava sendo solicitado e entreg-lo ao cliente. basicamente isso que o Apache HTTPd Server
faz ainda hoje.
A Web Dinmica
No entanto no demorou muito para que as pessoas comeassem a antever as possibilidades:
Que tal um site que mostrasse os resultados das partidas de futebol?
Cotaes do mercado em tempo real?
Aplicaes cliente-servidor, porm baseadas na web?
27
Java Web - Servlet e JSP - On-Line
CGI
Em 1993 a web ainda era um lugar bem pequeno, mas muito frtil. Alguns dos principais
desbravadores discutiam a respeito das possibilidades na www-talk, uma lista de discusses
hospedada pela NCSA.
Na poca foi proposto que se criasse um padro para chamar arquivos executveis direto do
browser. Tais programas poderiam ser escritos em qualquer linguagem, desde que seguissem
convenes bem simples sobre como obter parmetros e gerar os seus resultados:
O prprio servidor web prepararia variveis de ambiente antes de chamar o aplicativo;
O aplicativo consumiria estas variveis de ambiente (que lhe serviriam de parmetros de
configurao ou, quem sabe, fontes de dados) e geraria sua sada em HTML, a qual
seria simplesmente capturada pelo servidor web e repassada ao cliente.
Nascia o padro CGI (Common Gateway Interface).
A Resposta da Sun
J em 1995 James Gosling imaginava algum tipo de API Java que pudesse ser usada para gerar
contedo web dinamicamente a partir de aplicaes Java.
Com a linguagem ainda no seu nascedouro a ideia foi posta de lado, apenas para ser retomada
mais tarde. Pavani Diwanji usou o conceito para conceber algo que acabou se transformando no
Java Web Server, um servidor web completamente escrito em Java.
A especificao dos Servlets foi publicada em Junho de 1997. Algum tempo depois Anselm
Baird-Smith criou o que viria a se tornar a tecnologia JSP, cuja especificao foi posteriormente
escrita por Satish Dharmaraj.
Tanto os Servlets quanto os JSPs acabaram se tornando parte da distribuio Java 2 Enterprise
Edition (J2EE), lanada em Agosto de 1999.
28
Java Web - Servlet e JSP - On-Line
Servlets
Como visto antes, os Servlets nasceram antes do que os JSPs, e na sua essncia se parecem
muito com os scripts CGI apresentados anteriormente. A diferena mais marcante que os
Servlets tem um ciclo de vida diferente:
Eles no so instanciados a cada nova requisio, mas sim mantidos em um cache a
partir da primeira requisio;
Cada nova requisio gera uma nova thread, e no um processo, o que acaba aliviando a
carga do servidor (uma thread consome menos recursos do que um processo, por no
requisitar uma rea isolada de memria);
Os Servlets requerem um container, um aplicativo servidor especial cuja tarefa
principal manter o ciclo de vida dos Servlets.
A API de Servlets j passou por muitas verses. A ltima verso disponvel a 3.0, lanada em
Dezembro de 2009 como parte da plataforma Java EE 6.
JSPs
JavaServer Pages o nome da especificao que visa criar documentos para a web baseados em
Java.
JSPs podem ser encarados como uma abstrao de alto nvel dos Servlets:
Uma pgina JSP escrita como um arquivo HTML com cdigo Java embutido (os
scriptlets);
O cdigo Java responsvel pela gerao do contedo dinmico da pgina;
O container web converte a pgina JSP em um Servlet e, a partir da, passa a tratar
aquele documento como um Servlet.
Do ponto de vista do desenvolvedor, entretanto, o documento JSP muito mais fcil de
codificar, pois existe uma clara separao entre a markup e o cdigo Java.
29
Java Web - Servlet e JSP - On-Line
Comece selecionando Arquivo > Novo Projeto e voc cair na tela mostrada acima. Ali
selecione Java Web e Aplicao Web.
Agora indique um nome para o seu projeto. interessante tambm marcar o checkbox Usar
pasta dedicada para armazenar bibliotecas.
30
Java Web - Servlet e JSP - On-Line
Nesta janela selecione o container e a verso de Java EE que deseja utilizar, bem como o
prprio nome do contexto.
Nesta janela simplesmente clique em Finalizar. Ainda no vamos usar qualquer dos
frameworks disponveis.
Pronto, sua primeira aplicao Web est pronta. O NetBeans j cria at um documento JSP para
voc, ento j possvel execut-la no seu browser para ver o que acontece. Experimente
utilizar uma URI parecida com esta, claro que adequando-a ao nome da sua aplicao:
http://localhost:8080/AloMundoServlet/
31
Java Web - Servlet e JSP - On-Line
Captulo 5 Servlets
Grosso modo podemos facilmente entender um Servlet como a contra-parte Java de uma
aplicao CGI escrita em Perl ou C, por exemplo: um Servlet simplesmente uma classe Java
capaz de atender solicitaes HTTP e de gerar sada HTML, a qual ser enviada de volta ao
browser do usurio.
Assim como acontece com os programas CGI, tudo o que nosso Servlet mandar imprimir ser
redirecionado para o cliente. Mas o interessante que, sendo o Servlet uma classe Java, pode
desfrutar de toda a poderosa API da linguagem e com um custo de implementao bem baixo.
verdade! Implementar um Serlvet em Java to fcil quanto estender uma classe e gerar
alguns System.out.println(). Vamos dar uma olhada na hierarquia da API e voc logo
vai perceber.
A API de Servlets
A API de Servlet composta por um conjunto de interfaces e classes dentro do pacote
javax.servlet que so usadas para criar aplicaes que atendem a requisies.
A Interface Servlet
O componente mais bsico da API interface Servlet, a qual define o comportamento bsico
de um Servlet.
Esta interface serve como base para as classes GenericServlet e HttpServlet, as quais
vo, aos poucos, acrescentando novos recursos que ficam disponveis para nossos Servlets.
Veja abaixo a hierarquia de classes:
Servlet
GenericServlet
HttpServlet
32
Java Web - Servlet e JSP - On-Line
Eis alguns dos mtodos mais importantes definidos pela interface Servlet:
Mtodo Descrio
void destroy() Chamado pelo container web quando o
Servlet estiver sendo retirado de servio.
ServletConfig getServletConfig() Retorna um objeto do tipo ServletConfig, o
qual contm os parmetros de inicializao
para este Servlet.
String getServletInfo() Retorna informaes a respeito deste Servlet,
como por exemplo o seu autor, verso e data.
void init(ServletConfig config) Chamado pelo container quando o Servlet
estiver sendo posto em servio.
void service(ServletRequest req, Chamado pelo container para permitir que um
ServletResponse res) Servlet atenda a uma requisio.
A Classe GenericServlet
A classe javax.servlet.GenericServlet define um Servlet independente de
protocolo. No comum de a usarmos diretamente, pois na maioria das vezes o que queremos
um Servlet capaz de atender requisies HTTP.
Mtodo Descrio
void destroy() Chamado pelo container web quando o
Servlet estiver sendo retirado de servio.
String getInitParameter(String name) Retorna o valor do parmetro de inicializao
indicado, ou null se ele no existir.
Enumeration<String> Retorna os nomes dos parmetros de
getInitParameterNames() inicializao deste Servlet como uma
Enumeration de Strings.
ServletConfig getServletConfig() Retorna o objeto que representa a
configurao deste Servlet.
ServletContext getServletContext() Retorna o objeto que representa o contexto
onde este Servlet est sendo executado.
String getServletInfo() Retorna informaes a respeito deste Servlet,
como por exemplo o autor, verso e data.
String getServletName() Retorna o nome deste Servlet.
void init() Um mtodo de convenincia, de forma que
voc no precise chamar super.init(config).
void log(String msg) Escreve a mensagem indicada no log do
Servlet.
void log(String message, Throwable t) Escreve uma mensagem explicative e um
stack-trace no arquivo de log do Servlet.
abstract void service(ServletRequest req, Chamado pelo container para permitir que o
ServletResponse res) Servlet trate uma requisio.
33
Java Web - Servlet e JSP - On-Line
A Classe HttpServlet
A classe abstrata javax.servlet.HttpServlet foi especialmente projetada para lidar
com o protocolo HTTP. desta classe que voc herdar ao criar seus Servlets.
Voc provavelmente precisar sobrescrever pelo menos um dos mtodos doGet() e
doPost(). Opcionalmente pode sobrescrever tambm o mtodo getServletInfo(), se
quiser retornar informaes a respeito do seu Servlet para o ambiente.
Os demais podem ficar inalterados, as verses declaradas em HttpServlet devem cobrir o
bsico.
Servlets rodam em ambientes multithreaded, ento tome cuidado ao lidar com recursos
compartilhados como instncias de objetos, conexes com banco de dados ou de rede.
Mtodo Descrio
void doGet(HttpServletRequest req, Chamado pelo container para permitir que o
HttpServletResponse res) Servlet trate uma requisio do tipo GET.
void doPost(HttpServletRequest req, Chamado pelo container para permitir que o
HttpServletResponse res) Servlet trate uma requisio do tipo POST.
void doPut(HttpServletRequest req, Chamado pelo container para permitir que o
HttpServletResponse res) Servlet trate uma requisio do tipo PUT.
void doDelete(HttpServletRequest req, Chamado pelo container para permitir que o
HttpServletResponse res) Servlet trate uma requisio do tipo DELETE.
void init(ServletConfig config) Chamado pelo container ao inicializar o
Servlet.
void destroy() Chamado pelo container ao destruir o Servlet.
String getServletInfo() Retorna informaes a respeito deste Servlet,
como o nome do autor, a data e verso.
A Interface ServletConfig
A interface javax.servlet.ServletConfig usada pelo container para passar
informaes a um Servlet durante a sua inicializao.
Mtodo Descrio
String getInitParameter(String name) Retorna o valor do parmetro de inicializao
indicado, ou null se ele no existir.
Enumeration<String> Retorna os nomes dos parmetros de
getInitParameterNames() inicializao deste Servlet como uma
Enumeration de Strings.
ServletContext getServletContext() Retorna o objeto que representa o contexto
onde este Servlet est sendo executado.
String getServletName() Retorna o nome deste Servlet.
34
Java Web - Servlet e JSP - On-Line
A Interface ServletContext
A interface javax.servlet.ServletContext define um conjunto de mtodos que um
Servlet pode usar para se comunicar com o container, como por exemplo para obter o MIME
type de um arquivo, despachar uma requisio ou escrever no arquivo de log.
Este objeto est contido no ServletConfig que o container passa ao Servlet no momento
que o inicializa.
Mtodo Descrio
Object getAttribute(String name) Retorna o atributo do container com o nome
indicado, ou null se ele no existe.
Enumeration<String> getAttributeNames() Retorna uma Enumeration com os nomes dos
atributos existentes neste ServletContext.
ServletContext getContext(String uripath) Retorna o ServletContext que corresponde
URL indicada.
String getContextPath() Retorna o nome do diretrio da aplicao
corrente.
int getEffectiveMajorVersion() Retorna o nmero de verso da especificao
Servlet que este contexto utiliza.
int getEffectiveMinorVersion() Retorna o nmero da subverso da
especificao Servlet que este contexto utiliza.
String getInitParameter(String name) Retorna o valor do parmetro de inicializao
indicado, ou null se ele no existir.
Enumeration<String> Retorna os nomes dos parmetros de
getInitParameterNames() inicializao deste Servlet como uma
Enumeration de Strings.
int getMajorVersion() Retorna o nmero de verso da especificao
Servlet suportada por este container.
String getMimeType(String file) Retorna o MIME type do arquivo indicado, ou
null se ele for desconhecido.
int getMinorVersion() Retorna o nmero da subverso da
especificao Servlet suportada por este
container.
String getRealPath(String path) Retorna o diretrio real correspondente ao
diretrio virtual (URI) indicado.
String getServletInfo() Retorna informaes a respeito deste Servlet,
como o nome do autor, a data e verso.
void log(String msg) Escreve a mensagem indicada no log do
Servlet.
void log(String message, Throwable t) Escreve uma mensagem explicativa e um
stack-trace no arquivo de log do Servlet.
void removeAttribute(String name) Remove deste ServletContext o atributo de
nome indicado.
35
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
void setAttribute(String name, Object object) Associa o objeto ao nome de atributo indicado
dentro deste ServletContext.
boolean setInitParameter(String name, String Atualiza o parmetro de inicializao de nome
value) indicado dentro deste ServletContext.
A Classe HttpServletRequest
Toda vez que um Servlet requisitado o container instancia um objeto do tipo
javax.servlet.HttpServletRequest e o repassa ao Servlet. Este objeto carrega os
dados da requisio, como seus cabealhos e parmetros.
Mtodo Descrio
String getContextPath() Retorna a poro do URI de request que
indica o contexto desta request.
Cookie[] getCookies() Retorna um array contendo todos os cookies
que o cliente enviou com esta request.
long getDateHeader(String name) Retorna o valor do cabealho especificado
como um long que representa uma data.
String getHeader(String name) Retorna o valor do cabealho especificado
como uma String.
Enumeration getHeaderNames() Retorna uma Enumeration com todos os
nomes de cabealho desta request.
Enumeration getHeaders(String name) Retorna todos os valores do cabealho
indicado como uma Enumeration de Strings.
int getIntHeader(String name) Retorna o valor do cabealho indicado como
um int.
String getMethod() Retorna o nome do mtodo HTTP usado para
gerar esta requisio.
String getParameter(String name) Retorna o valor do parmetro indicado como
uma String, ou null se ele no existir.
Enumeration getParameterNames() Retorna uma Enumeration de Strings
contendo os nomes dos parmetros recebidos
nesta requisio.
String[] getParameterValues(String name) Retorna um array de Strings com todos os
valores do parmetro indicado, ou null se ele
no existir.
String getRemoteUser() Retorna o login do usurio responsvel por
esta requisio, se ele fez login, ou null se no
fez.
String getRequestSessionId() Retorna a SessionId especificada pelo cliente.
HttpSession getSession() Retorna a Sesso associada com esta
requisio, ou se a requisio no tem uma
sesso cria uma.
36
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
HttpSession getSession(boolean create) Retorna a sesso associada com esta
requisio. Se no existe sesso e create
true, cria uma.
A Classe HttpServletResponse
Assim como acontece com os dados da requisio, cada vez que o servlet chamado o container
instancia um objeto do tipo javax.servlet.HttpServletResponse e o popula com os
dados da resposta.
Voc deve estar se perguntando Como assim, que dados da resposta? Eu ainda no enviei
nada..., mas verdade, o container j prepara uma resposta vazia e a entrega para o seu
servlet. Tudo o que voc precisa fazer preencher os espaos em branco.
Ocorre que uma resposta HTTP cheia de meandros... Imagine ter que preparar voc mesmo
todos aqueles cabealhos necessrios para que a resposta seja bem entendida pelo browser e
voc ver o quanto importante o trabalho do container: ele lhe entrega uma resposta pr-
cozida, quase pronta para ser entregue ao cliente. Voc s precisa gerar o HTML que ser
enviado.
Em outras palavras, voc pode imaginar o objeto response como um envelope carregando uma
carta pronta para ser enviada ao seu destinatrio (o browser). Tudo o que voc precisa fazer
pegar esta carta em branco e escrever sua mensagem (o seu cdigo HTML). O container faz o
resto.
Mtodo Descrio
void addCookie(Cookie cookie) Adiciona o cookie indicado resposta.
void addDateHeader(String name, long date) Adiciona o cabealho do tipo data indicado
resposta.
void addHeader(String name, String value) Adiciona o cabealho do tipo String
resposta.
void addIntHeader(String name, int value) Adiciona o cabealho do tipo inteiro
resposta.
boolean containsHeader(String name) Verifica se o cabealho j contm o elemento
indicado.
String getContentType() Obtm o tipo de contedo MIME usado para
enviar esta resposta.
String encodeRedirectURL(String url) Codifica a URL especificada para ser usada
com o mtodo sendRedirect().
String encodeURL(String url) Codifica a URL especificada, adicionando o
SessionId.
String getHeader(String name) Obtm o valor do cabealho de resposta
indicado.
Collection getHeaderNames() Obtm os nomes de todos os cabealhos nesta
resposta.
37
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
Collection getHeaders(String name) Obtm todos os valores do cabealho
indicado.
int getStatus() Retorna o status corrente desta resposta.
PrintWriter getWriter() Obtm um objeto do tipo PrintWriter que
pode ser usado para enviar dados de volta ao
cliente.
void sendError(int sc) Envia uma resposta de erro para o cliente
usando o status code informado.
void sendError(int sc, String msg) Envia uma resposta de erro para o cliente
usando o status code informado.
void sendRedirect(String location) Envia um redirecionamento temporrio para o
cliente usando a URL informada.
void setContentLength(int len) Define o tamanho do corpo desta resposta
(i.e., define o cabealho Content-Length).
void setContentType(String type) Define o tipo de contedo da resposta sendo
enviada para o cliente (i.e., define o cabealho
Content-Type).
38
Java Web - Servlet e JSP - On-Line
Nesta janela voc indicar o tipo de arquivo que quer criar. Selecione Web e Servlet e
clique em Prximo.
39
Java Web - Servlet e JSP - On-Line
40
Java Web - Servlet e JSP - On-Line
O Deployment Descriptor
Mas criar o cdigo do Servlet no tudo. Precisamos dizer ao container a URL qual queremos
associar esta classe.
Para fazer isso usamos o deployment descriptor (descritor de implantao), um arquivo XML
que armazena as informaes a respeito de todos os servlets que temos em nossa aplicao.
O arquivo fica em /WEB-INF/web.xml.
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>AloMundoServlet</servlet-name>
<servlet-class>AloMundoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AloMundoServlet</servlet-name>
<url-pattern>/AloMundoServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
41
Java Web - Servlet e JSP - On-Line
30
</session-timeout>
</session-config>
</web-app>
A tag <servlet> define um servlet, ento voc pode ter mltiplas tags deste tipo dentro do
seu arquivo web.xml. L dentro voc encontrar outras duas tags. A primeira, <servlet-
name>, indica um nome lgico para o seu servlet, o nome pelo qual voc vai se referir a ele
dentro deste arquivo. J a segunda, <servlet-class>, o nome plenamente qualificado da
classe que implementa o seu servlet (ou seja, o nome da classe precedido pelos nomes dos seus
pacotes, como por exemplo br.com.alfamidia.agenda.Servlet).
A outra tag, <servlet-mapping> define as URLs que sero utilizadas para invocar seu
Servlet. L dentro voc encontrar outras duas tags: <servlet-name> repete o nome lgico
do Servlet conforme voc definiu em <servlet> (criando assim um vnculo entre as tags
<servlet> e <servlet-mapping>, o que nos permite saber qual URL est associada a
qual classe Java); <url-pattern> indica o padro de URL que voc gostaria de usar para
invocar seu Servlet. Voc pode usar qualquer coisa como um padro de URL: se colocar por
exemplo /servlet, toda vez que o usurio informar no browser uma URL terminando com
aquele valor invocar o seu Servlet:
<url-pattern>/servlet</url-pattern>
Por exemplo:
http://localhost:8080/WebApp1/servlet
Voc tambm pode utilizar o wildcard *, indicando que parte do texto irrelevante, desde que a
outra parte siga o padro:
<url-pattern>/*.servlet</url-pattern>
Este padro casar com qualquer coisa que termine com .servlet, como por exemplo:
http://localhost:8080/WebApp1/qualquercoisa.servlet
Usando o padro certo voc pode at fingir que est carregando um arquivo JPG...
http://localhost:8080/WebApp1/arquivo.jpg
42
Java Web - Servlet e JSP - On-Line
out.println("<html>");
out.println(" <head>");
out.println(" <title>Echo</title>");
out.println(" </head>");
out.println(" <body>");
out.println(" <h1>Echo Servlet em "
+ request.getContextPath() + "</h1>");
out.println(" <h2>Dados da Requisio</h2>");
out.println(" <h3>Dados Gerais</h3>");
out.println(" contextPath: "
+ request.getContextPath() + "<br />");
out.println(" localAddr: "
+ request.getLocalAddr() + "<br />");
out.println(" localName: "
+ request.getLocalName() + "<br />");
out.println(" localPort: "
+ request.getLocalPort() + "<br />");
out.println(" method: "
+ request.getMethod() + "<br />");
out.println(" protocol: "
+ request.getProtocol() + "<br />");
out.println(" remoteAddr: "
+ request.getRemoteAddr() + "<br />");
out.println(" remoteHost: "
+ request.getRemoteHost() + "<br />");
out.println(" requestURI: "
+ request.getRequestURI() + "<br />");
out.println(" serverName: "
+ request.getServerName() + "<br />");
out.println(" servletPath: "
+ request.getServletPath() + "<br />");
out.println(" serverPort: "
+ request.getServerPort() + "<br />");
out.println(" <h3>Cabealhos</h3>");
Enumeration<String> cabecalhos = request.
getHeaderNames();
while (cabecalhos.hasMoreElements()) {
String nomeDoCabecalho = cabecalhos.nextElement();
String valorDoCabecalho = request.getHeader(
nomeDoCabecalho);
out.println(" " + nomeDoCabecalho + ": "
+ valorDoCabecalho + "<br />");
}
out.println(" <h2>Parmetros</h2>");
Enumeration<String> parametros = request.
getParameterNames();
while (parametros.hasMoreElements()) {
String nomeDoParametro = parametros.nextElement();
String valorDoParametro = request.getParameter(
nomeDoParametro);
out.println(" " + nomeDoParametro + ": "
+ valorDoParametro + "<br />");
}
43
Java Web - Servlet e JSP - On-Line
44
Java Web - Servlet e JSP - On-Line
Captulo 6 JSPs
A API de JSPs
Servlets so realmente muito teis, mas so complicados demais para se manter, pois criar
pginas longas fica praticamente invivel, j que o cdigo HTML e o cdigo Java ficam
misturados. Entre outras coisas isso faz com que seja difcil delegar o design para uma equipe
especializada, j que voc teria que entregar seu cdigo Java junto (voc no quer designers
mexendo no seu cdigo Java, quer?).
As JavaServer Pages vieram para inverter esta perspectiva:
O cdigo principal HTML, ao invs de Java.
Usando beans e JSTL fica muito mais fcil separar forma de contedo.
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.Date"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<meta http-equiv="Refresh" content= "1; URL=index.jsp">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<%= new Date() %>
</body>
</html>
Por mais que os dois paream to diferentes, JSPs e Servlets no esto to distantes assim. Na
verdade eles so muito parecidos. Se voc parar para pensar, um Servlet s um JSP virado ao
avesso.
De fato, arquivos JSP so convertidos para Servlets em tempo real: toda vez que chega uma
requisio para um JSP o container verifica se j o conhece. Se ainda no, ento recupera o
cdigo fonte do JSP, valida e gera um Servlet que o representa. Todo o cdigo Java usados no
documento JSP vira trechos de cdigo no mtodo _jspService(HttpServletRequest
request, HttpServletResponse response) no Servlet gerado. O servlet ento
compilado e executado, e seu resultado enviado de volta para o cliente. Ao mesmo tempo, o
45
Java Web - Servlet e JSP - On-Line
Servlet gerado guardado em cache, para que no seja necessrio refazer a compilao na
ocasio de uma nova requisio.
Tags JSP
Um documento JSP mistura HTML e Java. No entanto precisamos de uma maneira para marcar
claramente onde o cdigo Java comea, pois o container precisa saber como diferenciar o
cdigo que precisa apenas ser copiado para a sada (o HTML) daquele que precisa ser executado
(o Java).
Para isso foram criadas cinco tags especiais:
Diretivas;
Declaraes;
Expresses;
Scriptlets;
Comentrios.
Diretivas
Diretivas so mensagens para o container JSP, e servem para definir atributos ou especificar
dependncias, de forma que o container possa gerar um cdigo compilvel.
A sintaxe geral :
<%@ diretiva atributo=valor [atributo2=valor2 ...] %>
Ou, na sintaxe XML:
<jsp:directive.diretiva atributo=valor [atributo2=valor2 ...] />
A Diretiva page
A diretiva page permite definir atributos da pgina como o seu tipo de contedo, tamanho do
buffer ou a lista de classes que precisam ser importadas para que o documento JSP seja
compilado com sucesso.
A sintaxe geral :
<%@ page atributo=valor [atributo2=valor ...] %>
Ou, na sintaxe XML:
<jsp:directive.page atributo=valor [atributo2=valor ...] />
Atributo Descrio
import=package.class Permite importar classes necessrias ao
ou arquivo JSP, da mesma maneira que uma
import=package.class[, package.class ...] instruo import atua em um cdigo fonte
Java.
contentType=tipo-mime Especifica o tipo MIME de sada.
isThreadSafe=true | false Indica se seguro executar mais de uma
instncia deste JSP simultaneamente.
session=true | false Indica se queremos trabalhar com a varivel
implcita session ou no. Caso negativo o
objeto implcito no ser declarado.
46
Java Web - Servlet e JSP - On-Line
Atributo Descrio
buffer=size-in-kBytes Indica o tamanho do buffer a ser usado
enquanto esta pgina gerada.
autoFlush=true | false Indica se o container deve enviar o contedo
do buffer quando este estiver cheio.
info=mensagem Define uma String que pode ser recuperada
com getServletInfo().
errorPage=url Aponta para uma URL que deve ser chamada
no caso da ocorrncia de um erro.
isErrorPage=true | false Indica se esta uma pgina de tratamento de
erros.
language=Java Define a linguagem na qual esta pgina foi
escrita.
A Diretiva include
A diretiva include permite incluir arquivos no momento em que a pgina JSP convertida
em um Servlet.
Assim, se temos um trecho de cdigo HTML ou JSP que se repete em muitas pginas, podemos
coloc-lo em um arquivo em separado e inclu-lo nos arquivos que precisam, evitando a
redundncia e facilitando a manuteno.
A sintaxe geral :
<%@ include file=URL relativa %>
Ou, na sintaxe XML:
<jsp:directive.include file=URL relativa />
Veja o exemplo:
<%@ include file=/meu-arquivo.html %>
Declaraes
Uma declarao permite definir atributos ou mtodos que sero inseridos no corpo do Servlet
gerado a partir de um documento JSP.
A sintaxe geral :
<%! Declarao em Java %>
Ou, na sintaxe XML:
<jsp:declaration> Declaraes em Java </jsp:declaration>
Veja os exemplos:
<%! private int numeroDeAcessos = 0 %>
<jsp:declaration>
private void sayHello() {
out.println(Hello world !);
}
</jsp:declaration>
47
Java Web - Servlet e JSP - On-Line
Evento de Inicializao
Ocorre na primeira vez em que o container JSP recebe uma solicitao para uma determinada
pgina.
public void jspInit()
Voc pode declarar este mtodo para gerenciar recursos dos quais precisar durante a execuo
da pgina, como por exemplo efetuar conexes ao banco de dados ou estabelecer conexes de
rede.
Evento de Destruio
Ocorre quando o container JSP est prestes a descarregar uma pgina JSP, seja porque o
container est sendo desligado ou porque a pgina no tenha sido usada recentemente e o
container precisa reclamar os recursos.
public void jspDestroy()
Voc pode declarar este mtodo para liberar os recursos alocados durante a execuo do mtodo
jspInit().
Expresses
Tags de expresses avaliam o seu contedo e exibem o resultado dentro do HTML gerado.
A Sintaxe geral :
<%= expresso Java %>
Ou, na sintaxe XML:
<jsp:expression> expresso Java </jsp:expression>
Veja os exemplos:
<%= request.getMethod() %>
Ou ento:
<jsp:expression> new java.util.Date() </jsp:expression>
Scriptlets
Scriptlets so provavelmente as tags mais usadas nos documentos JSP, especialmente enquanto
ainda estamos aprendendo a tecnologia. Eles so usados para incluir cdigo Java arbitrrio
dentro de um documento JSP. Este cdigo ser portado sem modificaes para dentro do
mtodo _jspService() do Servlet gerado.
A sintaxe geral :
<% cdigo Java %>
Ou, na sintaxe XML:
<jsp:scriptlet> cdigo Java </jsp:scriptlet>
Veja um exemplo:
<%
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
out.print(i);
out.println(<br>);
}
48
Java Web - Servlet e JSP - On-Line
}
%>
Comentrios
Tags de comentrio evitam que o seu corpo seja processado e levado para dentro do Servlet.
A sintaxe :
<%-- comentrio --%>
Veja o exemplo:
<%-- Este cdigo est desabilitado:
out.print(new java.util.Date());
out.println(<br>);
--%>
claro que voc ainda pode usar comentrios HTML (<!-- comentrio -->), mas isso
no vai evitar que eventual cdigo JSP presente dentro dele seja processado.
Objetos Implcitos
O container JSP disponibiliza muitos dos seus objetos para o desenvolvedor JSP. Estes objetos
so chamados de implcitos porque a sua disponibilizao nas pginas JSP automtica.
Os objetos implcitos do acesso a algumas funes do container e nos possibilitam armazenar
informaes que sero utilizadas entre mltiplas chamadas.
Objeto Classe Descrio
page javax.servlet.jsp.HttpJspPage Instncia do Servlet da
pgina.
config javax.servlet.ServletConfig Dados de configurao do
Servlet.
request javax.servlet.http.HttpServletRequest Dados da requisio,
incluindo seus
parmetros.
response javax.servlet.http.HttpServletResponse Dados da resposta.
out javax.servlet.jsp.JspWriter Fluxo de sada para o
contedo da pgina.
session javax.servlet.http.HttpSession Dados da sesso
especfica de usurio.
application javax.servlet.ServletContext Dados compartilhados por
todas as pginas da
aplicao.
pageContext javax.servlet.PageContext Dados de contexto para
execuo da pgina.
exception java.lang.Throwable Uma exceo que ocorreu
em um documento JSP.
49
Java Web - Servlet e JSP - On-Line
Gerenciando Atributos
Quatro dos objetos implcitos possuem como caracterstica em comum a habilidade de
armazenar e recuperar dados arbitrrios:
pageContext
request
session
application
Podemos utilizar estes objetos, ento, como espao de armazenamento temporrio ou mesmo
para transferir informaes entre pginas diferentes, ou mesmo entre usurios diferentes.
Mtodo Descrio
Object getAttribute(String name) Retorna o valor do atributo indicado, ou null
se o atributo no existe no contexto indicado.
Enumeration getAttributeNames() Retorna uma Enumeration contendo os nomes
de todos os atributos disponveis no contexto
indicado.
void removeAttribute(String key) Remove o atributo indicado do contexto
indicado.
void setAttribute(String name, Object value) Cria ou substitui o atributo nomeado, dando-
lhe o valor indicado.
Armazenando um Objeto
Para que voc possa armazenar uma informao em qualquer um dos contextos citados voc
usar o mtodo setAttribute(String key, Object value). Este mtodo recebe
dois argumentos, uma chave (que representa um identificador nico para o objeto que se deseja
armazenar) e um valor (o dado em questo). Veja o exemplo:
<%
String nomeDoUsuario = "mvfm";
session.setAttribute("login", nomeDoUsuario);
%>
No exemplo acima armazenamos a informao contida na varivel nomeDoUsuario dentro
do contexto de sesso, sob a chave login. Quando quisermos recuperar esta informao, seja
na mesma pgina, seja em outra para a qual o usurio navegou, devemos utilizar a mesma
chave.
Recuperando um Objeto
Quando precisarmos recuperar uma informao a partir de um dos objetos de contexto
precisaremos usar o mtodo getAttibute(String key), o qual recebe como parmetro o
identificador nico do objeto que se deseja recuperar. Este identificador nico, obviamente, tem
que ser o mesmo que foi usado quando colocamos a informao no contexto. Veja o exemplo:
<%
String login = (String) session.getAttribute("login");
%>
Note que o mtodo getAttribute() sempre retorna um dado do tipo Object, ento
precisamos fazer o cast para que possamos dispor do dado em seu estado original.
50
Java Web - Servlet e JSP - On-Line
O Objecto pageContext
O objeto pageContext uma instncia da classe javax.servlet.jsp.PageContext,
e alm de ser capaz de armazenar dados arbitrrios, oferece mtodos para acessar os demais
contextos e seus atributos, bem como ferramentas para encaminhar a requisio corrente para
outras pginas ou incluir arquivos externos na sada.
Alm disso, pageContext ainda fornece acesso ao JspWriter usado para gerar a sada,
embora tipicamente voc no precise fazer isso de maneira explcita, j que a API j oferece o
objeto out automaticamente.
Mtodo Descrio
void forward(String relativeUrlPath) Encaminha os objetos request e response
correntes para outra pgina na mesma
aplicao.
Exception getException() Retorna o valor corrente do objeto implcito
exception.
Object getPage() Retorna o valor corrente do objeto page (o
Servlet gerado para este documento JSP).
ServletRequest getRequest() Recupera o valor corrente do objeto implcito
request.
ServletResponse getResponse() Recupera o valor corrente do objeto implcito
response.
ServletConfig getServletConfig() Recupera o valor corrente do objeto implcito
config.
ServletContext getServletContext() Retorna o valor corrente do objeto implcito
application.
HttpSession getSession() Retorna o valor corrente do objeto implcito
session.
void include(String relativeUrlPath) Inclui o output do processamento do URL
local.
void setAttribute(String name, Object value, Adiciona o valor ao contexto indicado, usando
int scope) key como chave.
Enumeration getAttributeNamesInScope(int Recupera os nomes de todos os atributos
scope) presentes em um determinado escopo.
Object getAttribute(String name, int scope) Recupera o valor de um atributo em um
determinado escopo.
void removeAttribute(String name, int scope) Remove o atributo indicado do escopo
especificado.
Object findAttribute(String name) Recupera o valor do atributo indicado,
buscando em todos os escopos.
int getAttributeScope(String name) Retorna o escopo no qual o atributo nomeado
est armazenado.
51
Java Web - Servlet e JSP - On-Line
O Objeto request
O objeto request uma instncia da interface
javax.servlet.http.HttpServletRequest e gerenciado pelo container para
representar uma requisio chegando a um Servlet ou documento JSP.
Este objeto tambm pode ser usado para armazenar dados arbitrrios.
Mtodo Descrio
String getContextPath() Retorna a poro da URI de request que
indica o contexto desta request.
Cookie[] getCookies() Retorna um array contendo todos os cookies
que o cliente enviou com esta request.
long getDateHeader(String name) Retorna o valor do cabealho especificado
como um long que representa uma data.
String getHeader(String name) Retorna o valor do cabealho especificado
como uma String.
Enumeration getHeaderNames() Retorna uma Enumeration com todos os
nomes de cabealho desta request.
Enumeration getHeaders(String name) Retorna todos os valores do cabealho
indicado como uma Enumeration de Strings.
int getIntHeader(String name) Retorna o valor do cabealho indicado como
um int.
String getMethod() Retorna o nome do mtodo HTTP usado para
gerar esta requisio.
String getParameter(String name) Retorna o valor do parmetro indicado como
uma String, ou null se ele no existir.
Enumeration getParameterNames() Retorna uma Enumeration de Strings
contendo os nomes dos parmetros recebidos
nesta requisio.
String[] getParameterValues(String name) Retorna um array de Strings com todos os
valores do parmetro indicado, ou null se ele
no existir.
String getRemoteUser() Retorna o login do usurio responsvel por
esta requisio, se ele fez login, ou null se no
fez.
String getRequestSessionId() Retorna a SessionId especificada pelo cliente.
HttpSession getSession() Retorna a Sesso associada com esta
requisio, ou se a requisio no tem uma
sesso cria uma.
HttpSession getSession(boolean create) Retorna a Sesso associada com esta
requisio. Se no existe sesso e create
true, cria uma.
52
Java Web - Servlet e JSP - On-Line
O Objeto session
O objeto session uma instncia da interface javax.servlet.http.HttpSession e
prov uma maneira de identificar um usurio nico por entre vrias requisies.
Este objeto criado pelo container para criar uma sesso entre o usurio e o servidor. Esta
sesso persiste por um determinado tempo desde que novas solicitaes continuem sendo
recebidas sem que este perodo se transcorra.
Mtodo Descrio
long getCreationTime() Retorna a hora em que esta sesso foi criada.
String getId() Retorna o ID desta sesso.
long getLastAcessedTime() Retorna a hora em que a ltima solicitao
associada a esta requisio foi recebida.
int getMaxInactiveInterval() Retorna o tempo mximo (em segundos) para
o qual esta sesso ser mantida.
void invalidate() Descarta a sesso, liberando quaisquer valores
armazenados como atributos.
boolean isNew() Retorna true se o navegador do usurio ainda
no tiver confirmado o ID da sesso.
void setMaxInactiveInterval(int interval) Define o tempo mximo (em segundos) para o
qual esta sesso ser mantida.
53
Java Web - Servlet e JSP - On-Line
de estabelecer uma sesso para aquele usurio. Neste caso, colocar dados no contexto de sesso
completamente intil.
O Objeto application
O objeto application uma instncia da interface
javax.servlet.ServletContext, a qual define um conjunto de mtodos que um
documento JSP pode utilizar para se comunicar com o container.
Assim como acontece com os objetos pageContext, request e session,
application tambm pode ser usado para armazenar valores arbitrrios. Estes valores
ficam disponveis para todas as pginas e usurios da aplicao.
Mtodo Descrio
Object getAttribute(String name) Retorna o atributo do container com o nome
indicado, ou null se ele no existe.
Enumeration<String> getAttributeNames() Retorna uma Enumeration com os nomes dos
atributos existentes neste ServletContext.
ServletContext getContext(String uripath) Retorna o ServletContext que corresponde
URL indicada.
String getContextPath() Retorna o nome do diretrio da aplicao
corrente.
int getEffectiveMajorVersion() Retorna o nmero de verso da especificao
Servlet que este contexto utiliza.
int getEffectiveMinorVersion() Retorna o nmero da subverso da
especificao Servlet que este contexto utiliza.
String getInitParameter(String name) Retorna o valor do parmetro de inicializao
indicado, ou null se ele no existir.
Enumeration<String> Retorna os nomes dos parmetros de
getInitParameterNames() inicializao deste Servlet como uma
Enumeration de Strings.
int getMajorVersion() Retorna o nmero de verso da especificao
Servlet suportada por este container.
String getMimeType(String file) Retorna o MIME type do arquivo indicado, ou
null se ele for desconhecido.
int getMinorVersion() Retorna o nmero da subverso da
especificao Servlet suportada por este
container.
String getRealPath(String path) Retorna o diretrio real correspondente ao
diretrio virtual (URI) indicado.
String getServletInfo() Retorna informaes a respeito deste Servlet,
como o nome do autor, a data e verso.
void log(String msg) Escreve a mensagem indicada no log do
Servlet.
54
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
void log(String message, Throwable t) Escreve uma mensagem explicative e um
stack-trace no arquivo de log do Servlet.
void removeAttribute(String name) Remove deste ServletContext o atributo de
nome indicado.
void setAttribute(String name, Object object) Associa o objeto ao nome de atributo indicado
dentro deste ServletContext.
boolean setInitParameter(String name, String Atualiza o parmetro de inicializao de nome
value) indicado dentro deste ServletContext.
O Objeto exception
O objeto implcito exception fornecido com o intuito de tratamento de erros em JSP.
Este objeto est disponvel apenas s pginas que tenham sido designadas como pginas de
tratamento de erro por meio do atributo isErrorPage da diretiva page.
Pginas comuns tipicamente vo incluir uma diretiva semelhante mostrada abaixo:
<%@page errorPage=erro.jsp%>
Neste caso, quando um erro ocorrer durante o processamento daquela pgina, o controle
transferido automaticamente para a pgina de tratamento de erros indicada (no caso,
erro.jsp).
A pgina de tratamento de erros, por sua vez, precisar incluir a diretiva mostrada abaixo:
<%@page isErrorPage=true%>
Neste caso, quando o controle for transferido para esta pgina pelo container, ela receber ainda
um objeto implcito chamado exception. Este objeto uma instncia de
java.lang.Throwable e representa o erro que fez com que o controle fosse transferido
para a pgina atual.
Abaixo demonstramos os principais mtodos de Throwable:
Mtodo Descrio
String getMessage() Retorna a mensagem de erro descritiva
associada exceo quando ela foi lanada.
void printStackTrace(PrintWriter out) Imprime a pilha de execuo em
funcionamento quando a exceo foi lanada.
String toString() Retorna uma String combinando o nome da
classe da exceo com sua mensagem de erro,
se houver alguma.
55
Java Web - Servlet e JSP - On-Line
erro.jsp
<%@page import="java.io.PrintWriter"%>
<%@page import="java.io.StringWriter"%>
<%@page isErrorPage="true"%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1">
<title>Erro</title>
</head>
<body>
<h1>Erro</h1>
<p>
O erro a seguir ocorreu:<br>
<b><%= exception %></b><br>
</p>
<pre>
<%
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
out.print(sw);
%>
</pre>
</body>
</html>
56
Java Web - Servlet e JSP - On-Line
Aes Bsicas
A Tag <jsp:forward>
A tag <jsp:forward> usada para transferir permanentemente o controle de uma pgina
JSP para outro documento no servidor local.
Note que qualquer contedo que tenha sido gerado pela pgina atual descartado.
O navegador no notificado, ento o usurio no perceber que a sua requisio foi
encaminhada para outro endereo.
A sintaxe geral :
<jsp:forward page=URL local />
Ou:
<jsp:forward page=URL local>
<jsp:param name=parametro value=valor />
<jsp:param name=parametro2 value=valor2 />
</jsp:forward>
A Tag <jsp:include>
A tag <jsp:include> permite a incorporao do contedo gerado por outro documento no
documento atual.
O output do documento includo inserido no output da pgina corrente, e a seguir o
processamento retorna pgina corrente.
A pgina includa pode ser um documento esttico, um CGI, um Servlet ou mesmo outro
documento JSP.
57
Java Web - Servlet e JSP - On-Line
A sintaxe geral :
<jsp:include page=URL local flush=true />
Note que a seo flush=true obrigatria a partir da especificao JSP 1.1.
Ou:
<jsp:include page=URL local flush=true>
<jsp:param name=parametro value=valor />
<jsp:param name=parametro2 value=valor2 />
</jsp:include>
Componentes JavaBeans
O uso de componentes JavaBeans em pginas JSP visa afastar a necessidade de se programar
diretamente dentro do JSP.
Esta capacidade de abstrao muito benfica, pois proporciona a diviso de trabalhos entre
designers / programadores. Tudo o que o designer precisa fazer incorporar algumas tags
simples no cdigo fonte HTML. Estas tags parecem HTML, ento seus elementos e atributos
so facilmente reconhecveis pelos designers e suas ferramentas.
O programador, por sua vez, pode programar a aplicao sem sequer tomar conhecimento de
como seus componentes sero usados em pginas JSP.
Parece mgica?
Carro.java
package modelo;
public class Carro {
private String nome;
private int potencia;
private int giros;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getPotencia() {
return potencia;
}
public void setPotencia(int potencia) {
this.potencia = potencia;
}
public int getGiros() {
return giros;
}
public void setGiros(int giros) {
this.giros = giros;
}
}
No cdigo acima, note que a classe Carro uma classe Java comum, com alguns atributos
privados e seus respectivos getters e setters. Agora vamos mostrar como inserir esta classe em
um documento JSP por meio de uma tcnica que ficou conhecida como Componente JavaBean.
58
Java Web - Servlet e JSP - On-Line
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="carro" class="modelo.Carro" scope="session" />
<jsp:setProperty name="carro" property="nome" value="Passat" />
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Um Carro</title>
</head>
<body>
<h1>Um Carro</h1>
<b>Nome:</b>
<jsp:getProperty name="carro" property="nome" /><br>
<b>Potncia:</b>
<jsp:getProperty name="carro" property="potencia" />
Cavalos<br>
<b>Giros do Motor:</b>
<jsp:getProperty name="carro" property="giros" /> RPM<br>
</body>
</html>
O documento JSP acima comea com o uso da tag <jsp:useBean>, a qual vincula a classe
criada anteriormente pgina. Depois, tags <jsp:getProperty> e
<jsp:setProperty> leem e gravam dados dos/nos atributos da classe, sem que para isso
seja necessrio usar nenhum cdigo Java explcito dentro da pgina.
Diretrizes Bsicas
Teoricamente qualquer classe Java pode ser usada como um componente JSP. No entanto, estas
classes precisam seguir algumas diretrizes bsicas:
Fazer parte de um pacote arbitrrio;
Incluir um construtor pblico que no recebe parmetros;
Seguir a notao JavaBean para a leitura e escrita de atributos, em especial:
o Toda propriedade passvel de leitura deve oferecer um mtodo pblico <Tipo>
getPropriedade() que no recebe argumentos e retorna o atributo em questo.
o Toda propriedade passvel de escrita deve oferecer um mtodo pblico void
setPropriedade(<tipo> propriedade).
Note que o container JSP faz todas as converses de tipo para voc conforme a necessidade,
desde que eles sejam de tipos primitivos ou, no mximo, String.
A Tag <jsp:useBean>
A tag useBean indica que voc deseja usar um bean na pgina. Voc precisa indicar pelo
menos dois atributos:
Um apelido para o bean;
O nome da classe.
Veja a sintaxe:
<jsp:useBean id=apelido class=classe />
59
Java Web - Servlet e JSP - On-Line
Ou:
<jsp:useBean id=apelido class=classe>
Cdigo de inicializao.
</jsp:useBean>
Atributo Descrio
id Um identificador para o bean, o seu apelido.
scope O escopo para o bean (pageScope, request,
session, application). O default page.
class O nome da classe que implementa o bean.
A Tag <jsp:getProperty>
A tag <jsp:getProperty> a maneira de que dispomos para recuperar o valor de uma
propriedade em um bean.
Diferente da tag <jsp:useBean>, que realiza alguma operao de background mas no exibe
nada, <jsp:getProperty> sempre resultar em alguma coisa que poderemos ver no cdigo
HTML gerado. Ela semelhante tag de expresso <%= ... %>.
Esta tag possui apenas dois atributos e no possui corpo.
Atributo Descrio
name Indica o apelido do bean cuja propriedade
queremos acessar (o atributo id usado ao
incorporarmos o bean pgina por meio da
tag useBean).
property Indica o nome da propriedade que queremos
acessar naquele bean.
A classe Java que implementa o bean precisa
definir um mtodo getter correspondente
propriedade sendo recuperada.
A Tag <jsp:setProperty>
Usamos a tag <jsp:setProperty> para alterar o valor de uma propriedade em um bean.
Cabe ao programador do bean implementar a lgica para fazer algo de til com os valores
estabelecidos como propriedades e disponibilizar informao computacional pgina JSP por
meio dos mtodos get().
A maioria dos beans precisar de uma srie de configuraes (chamadas aos mtodos set())
para que esteja pronto para realizar qualquer servio. Normalmente os mtodos get() e
set() so cdigos burros, que apenas atribuem valores aos atributos.
Porm, vez por outra, estes cdigos podem implementar inteligncia, a sim executando alguma
operao mais complexa ao invs de simplesmente atribuir ou recuperar os valores dos
atributos.
Atributo Descrio
name Indica o nome do bean cuja propriedade deve
ser alterada.
60
Java Web - Servlet e JSP - On-Line
Atributo Descrio
property Indica o nome da propriedade a alterar.
value Indica o valor a ser atribudo propriedade.
param Indica o parmetro da requisio que ceder o
seu valor propriedade indicada.
<jsp:setProperty name=meuBean
property=minhaProperty
value=<%= request.getParameter(meuParam) %>
/>
Note que podemos encadear as tags <jsp:setProperty> e <%= ... %>.
Para facilitar ainda mais o trabalho, JSP oferece um coringa que pode ser usado para casar
automaticamente propriedades e parmetros:
<jsp:setProperty name=meuBean property=* />
O coringa * far com que toda propriedade do bean que tiver um parmetro correspondente na
requisio receba automaticamente o valor do parmetro.
Isso s funciona, claro, se ambos propriedade e parmetro tiverem o mesmo nome.
61
Java Web - Servlet e JSP - On-Line
A Expression Language (EL) foi introduzida com a especificao JSP 2.0 e visa facilitar a
incluso de variveis e objetos em um documento JSP.
Inspirada tanto em JavaScript quanto XPath, a Expression Language possibilita a avaliao de
expresses fora dos elementos JSP, por meio de uma sintaxe simples e fcil de entender.
Elementos da EL podem ser usados em duas situaes:
Como atributos nas JSP Actions (padro ou customizadas);
Em texto de template, como HTML ou elementos no JSP. Neste caso o contedo da
EL avaliado e seu resultado embutido dentro do texto de template.
Carro.java
package modelo;
public class Carro {
private String nome;
private int potencia;
private int giros;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getPotencia() {
return potencia;
}
public void setPotencia(int potencia) {
this.potencia = potencia;
}
public int getGiros() {
return giros;
}
public void setGiros(int giros) {
this.giros = giros;
}
}
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean id="carro" class="modelo.Carro" scope="session" />
<jsp:setProperty name="carro" property="nome" value="Passat" />
<html>
62
Java Web - Servlet e JSP - On-Line
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Um Carro</title>
</head>
<body>
<h1>Um Carro</h1>
<b>Nome:</b>
${carro.nome}<br>
<b>Potncia:</b>
${carro.potencia} Cavalos<br>
<b>Giros do Motor:</b>
${carro.giros} RPM<br>
</body>
</html>
O Operador .
Expresses em EL esto sempre dentro de chaves, precedidas pelo smbolo de dlar:
${pessoa.nome}
Normalmente vemos uma expresso, um ponto e uma segunda expresso.
A parte esquerda do ponto o nome de um objeto implcito ou de um atributo.
A parte direita do ponto a chave de um map (se a primeira parte for um map) ou o nome de
uma propriedade bean (se a primeira parte for um bean).
Tal como um atributo bean, a parte direita precisa seguir as convenes de nomenclatura Java:
Comear com uma letra, _ ou $;
A partir do segundo caractere o nome pode incluir nmeros;
No pode ser uma palavra reservada Java.
Veja uma tabela demonstrativa:
${primeiracoisa.segundacoisa}
o primeiracoisa
OBJETO IMPLCITO DA EL
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
63
Java Web - Servlet e JSP - On-Line
pageContext
ATRIBUTO
No pageScope
No requestScope
No sessionScope
No applicationScope
o segundacoisa
SE primeiracoisa FOR UM java.util.Map
Uma chave do Map
SE primeiracoisa FOR UM BEAN
Um atributo do Bean
O Operador [
O operador . s funciona quando o que est direita for uma chave map ou uma propriedade
bean para o que est esquerda.
Mas e se a parte esquerda for um array?
Ou uma List?
Ou se a parte direita for algo que no se pode expressar com as regras de nomenclatura
Java?
O operador [, por sua vez, muito mais poderoso:
Isto:
${pessoa[nome]}
igual a isso:
${pessoa.nome}
Veja uma tabela demonstrativa:
${primeiracoisa[segundacoisa]}
o primeiracoisa
java.util.Map
um bean
java.util.List
um array
o segundacoisa
a chave do Map
um atributo do bean
o ndice da List
o ndice do array
Usando Arrays
Suponha que em um determinado momento voc executasse o seguinte cdigo:
String pessoas[] = {"Adriana", "Bernardo", "Cludia", "Daniel"};
request.setAttribute(pessoas, pessoas);
64
Java Web - Servlet e JSP - On-Line
Usando Lists
A sintaxe EL para acessar uma List exatamente a mesma que usamos para acessar um array.
Suponha que em algum ponto voc executou o cdigo a seguir:
List pessoas = new ArrayList();
pessoas.add(Adriana);
pessoas.add(Bernardo);
pessoas.add(Cludia);
pessoas.add(Daniel);
request.setAttribute(pessoas, pessoas);
Ento, se em uma pgina JSP, voc executasse os cdigos abaixo, obteria as respostas
indicadas:
O Cdigo JSP Resulta Em
As pessoas ${pessoas} As pessoas: [Ljava.lang.String;@3e25a5
A primeira pessoa: ${pessoas[0]} A primeira pessoa: Adriana
A segunda pessoa: ${pessoas[1]} Bernardo
65
Java Web - Servlet e JSP - On-Line
Objetos Implcitos
A Expression Language utiliza nomes talvez um pouco mais consistentes para os objetos
implcitos da JSP, conforme demonstra a tabela abaixo:
Objeto Descrio
pageContext O contexto da pgina JSP. Pode ser usado para acessar todos
os objetos implcitos do JSP, como request, response, session,
out, etc. Por exemplo, ${pageContext.response} retorna o
objeto response.
param Um mapa contendo todos os parmetros recebidos pela pgina.
Por exemplo, ${param.nome} retornaria o valor do parmetro
nome (ou seja, fazendo o mesmo que
request.getParameter(nome) faria).
paramValues Um mapa contendo todos os parmetros recebidos pela pgina,
os quais podem ser acessados como um array. Por exemplo,
${param.name} retornaria um array com todos os valores
recebidos pelo parmetro nome (ou seja, o mesmo que
request.getParameterValues(nome) faria).
header Um mapa contendo todos os cabealhos da requisio. Por
exemplo, ${header.name} retornaria o mesmo que
request.getHeader(name).
headerValues Um mapa contendo todos os cabealhos da requisio, os quais
podem ser acessados como um array. Por exemplo,
${headerValues.name} retornaria um array com todos os
valores do cabealho name (ou seja, o mesmo que
request.getHeaderValues(name) faria).
cookie Um mapa contendo todos os cookies recebidos por este JSP.
Por exemplo, $cookie.name.value retornaria o valor do
primeiro cookie de nome indicado.
initParam Um mapa contendo todos os parmetros de inicializao. Por
exemplo, ${initParam.name} retornaria o parmetro de
inicializao de nome indicado (o mesmo que chamar
ServletContext.getInitParameter(name)).
pageScope Um mapa com todos os objetos em escopo de pgina. Por
exemplo, ${pageScope.objectName} retornaria o objeto com
escopo de pgina indicado, enquanto que
${pageScope.objectName.propertyName} retornaria o valor da
propriedade indicada naquele objeto.
66
Java Web - Servlet e JSP - On-Line
Objeto Descrio
requestScope Um mapa com todos os objetos em escopo de requisio. Por
exemplo, ${requestScope.objectName} retornaria o objeto com
escopo de requisio indicado, enquanto que
${requestScope.objectName.propertyName} retornaria o valor
da propriedade indicada naquele objeto.
sessionScope Um mapa com todos os objetos em escopo de sesso. Por
exemplo, ${sessionScope.objectName} retornaria o objeto com
escopo de sesso indicado, enquanto que
${sessionScope.objectName.propertyName} retornaria o valor
da propriedade indicada naquele objeto.
applicationScope Um mapa com todos os objetos em escopo de aplicao. Por
exemplo, ${applicationScope.objectName} retornaria o objeto
com escopo de aplicao indicado, enquanto que
${applicationScope.objectName.propertyName} retornaria o
valor da propriedade indicada naquele objeto.
Operadores
A expression. Language ainda oferece uma srie de operadores que voc poder utilizar para
criar expresses no momento de criar sua pgina JSP.
Tipo Operador Descrio
Aritmticos +, -, *, /, div, %, mod / e div so sinnimos;
% e mod so sinnimos.
67
Java Web - Servlet e JSP - On-Line
68
Java Web - Servlet e JSP - On-Line
Captulo 9 MVC
Criar aplicaes web usando Java e JSP pode ser uma atividade perigosa:
Entender ou projetar o fluxo de navegao requer tempo;
Lgica de negcio e lgica de apresentao acabam se misturando, tornando difcil a
diviso de tarefas;
Acrescentar novas funcionalidades pode ser extremamente complicado, frequentemente
incorrendo em efeitos colaterais inesperados;
Por mais que se tomem precaues, a aplicao acaba se tornando especializada: fica
praticamente impossvel usar a lgica de negcios em outro contexto que no seja uma
aplicao web sem que o cdigo precise ser reescrito.
Para resolver estes problemas que foi criada a arquitetura MVC. Mas no s para resolv-los
em Java: MVC antecede ao Java em inmeras maneiras. hoje o padro para o
desenvolvimento de aplicaes Web, mas tambm bastante utilizada mesmo em aplicaes
desktop.
A Arquitetura MVC foi descrita pela primeira vez em 1979, por Trygve Reenskaug, um
cientista e professor de computao noruegus, enquanto visitava o Xerox Palo Alto Research
Center (PARC). A implementao original do padro foi criada para o Smaltalk, mas foi
facilmente adaptada para outras linguagens orientadas a objetos.
69
Java Web - Servlet e JSP - On-Line
Mas neste ponto voc j devia ter percebido que a nica coisa definitiva na vida a mudana.
Depois que o programa piloto entra no ar o seu cliente percebe que seria interessante adicionar
uma nova pgina logo depois da seleo do produto a comprar, oferecendo sugestes de
produtos relacionados.
O problema que esta nova pgina altera boa parte da sua lgica de navegao cuidadosamente
projetada.
70
Java Web - Servlet e JSP - On-Line
Voc vai ter que sair caando e ajustando links para encaixar a nova pgina no meio da sua
lgica de navegao j bastante complexa.
Tem que existir uma soluo melhor...
MVC Modelo 1
A requisio chega ao JSP ou Servlet e ento este componente assume toda a responsabilidade
por manipul-la, incluindo processar a requisio, validar os dados, manipular a lgica de
negcio e gerar a resposta.
Este modelo normalmente s usado em aplicaes menores. Sua grande vantagem a
facilidade e rapidez de desenvolvimento. mais ou menos o que temos feito quando usamos
componentes JavaBean dentro das pginas JSP.
Porm inevitavelmente haver uma grande duplicao de cdigo entre JSPs, o que torna a
aplicao mais difcil de manter. Alm do mais, a lgica navegao continua espalhada, ento
os problemas de se adicionar tardiamente uma regra de navegao ainda esto presentes.
MVC Modelo 2
A requisio chega ao controlador, que a processa e atualiza as classes de modelo conforme o
necessrio, passando em seguida o controle para um JSP que apresentar os dados ao usurio e
aguardar pela nova iterao.
Este modelo perfeito para aplicaes maiores, pois fica fcil alterar a ordem de chamada das
views se um novo passo for adicionado.
Porm, por apresentar um nmero maior de componentes, o desenvolvimento pode levar um
pouco mais de tempo, embora a manutenabilidade adicional costumeiramente compense este
efeito.
71
Java Web - Servlet e JSP - On-Line
Model
O modelo, componentes que representam o modelo, os dados sendo tratados pela aplicao.
Em aplicaes Java EE estes componentes so normalmente implementados como Java Beans
(POJOs).
72
Java Web - Servlet e JSP - On-Line
View
A viso ou apresentao, componentes que visam apresentar os dados ao usurio e controlar
a interface. Em Java EE estes componentes so normalmente implementados como documentos
JSPs.
Controller
O controle, aqueles componentes que visam encadear as diferentes views em uma sequncia
lgica. Em Java EE estes componentes normalmente so implementados como Servlets.
Mquina de Estados
Uma Aplicao Web Como Uma Mquina de Estados
Uma aplicao web pode ser facilmente encarada como uma mquina de estados. Na verdade
como uma Mquina de Estados Finitos (FSM, Finite State Machine).
Uma FSM um modelo comportamental composto por um nmero finito de estados, as
transies entre estes estados e as aes que devem ocorrer em determinadas situaes. Pode
ser representada com um grafo, o qual podemos usar para inspecionar o fluxo medida que uma
determinada situao ocorre.
As bolhas, ou estados, seriam os pontos terminais, etapas em que a aplicao para e espera por
alguma ao, seja automtica, seja desencadeada pelo usurio.
As linhas so transies e representam o processo que ocorre durante uma mudana de estado.
Podemos pensar em transies como o que ocorre como resposta imediata a um clique em um
boto ou um link, algo que desencadeia um processo qualquer que nos leva a um novo estado.
73
Java Web - Servlet e JSP - On-Line
Um Exemplo Simples
Os exemplos a seguir demonstram rapidamente a ideia de se ter um controller centralizado e
uma pgina JSP que a utiliza como etapa intermediria na realizao de uma tarefa qualquer.
incluir_produto.jsp
<html>
<head>
<title>Incluir Produto</title>
</head>
<body>
<b1>Incluir Produto</b1>
<form action="Controller" method="post">
Nome:
<input type="text" name="nome"><br>
Departamento:
<input type="text" name="departamento"><br>
Preo Unitrio:
<input type="text" name="precoUnitario"><br>
<input type="hidden"
name="acao"
value="incluir_produto"><br>
<input type="Submit" value="Enviar">
</form>
</body>
</html>
74
Java Web - Servlet e JSP - On-Line
No exemplo acima note que o atributo action do da tag <form> aponta para o Controller ao
invs de uma pgina qualquer. Alm disso, perceba a presena de um campo hidden chamado
acao. Este campo servir como pista para que o Controller possa perceber que ao se
deseja executar.
Controller.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Controller extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String acao = request.getParameter("acao");
if (acao == null || acao.length() == 0) {
request.getRequestDispatcher("index.jsp")
.forward(request, response);
} else if (acao.equals("incluir_produto")) {
String nome = request.getParameter("nome");
String departamento = request.getParameter(
"departamento");
float precoUnitario = Float.parseFloat(
request.getParameter("precoUnitario");
// ... Inserir aqui o cdigo para incluir um produto
// no banco de dados.
// ... E depois move para a prxima JSP no fluxo.
request.getRequestDispatcher("listar_produtos.jsp")
.forward(request, response);
} else if (acao.equals("alterar_produto") {
// ... Inserir aqui o cdigo para alterar um produto
// no banco de dados.
// ... E depois move para a prxima JSP no fluxo.
request.getRequestDispatcher("listar_produtos.jsp")
.forward(request, response);
} // Outros testes e outras aes ...
}
}
Por ser um Servlet nosso Controller pode receber requisies HTTP e atuar sobre elas,
desempenhando as aes pertinentes.
No nosso exemplo, a primeira coisa que ele faz buscar pelo parmetro acao, o qual lhe
indicar o caminho a tomar. Depois, uma srie de ifs escolhe a alternativa correta e
desempenha a tarefa desejada. Por fim, o Servlet lana um redirecionamento que permite ao
usurio ver a pgina de resultado. Tal design permite usar o Servlet para o que ele faz de melhor
(atender uma requisio HTTP e executar lgica) sem que precisemos utilizar o que ele no faz
to bem (gerar sada em HTML).
75
Java Web - Servlet e JSP - On-Line
Design-Patterns
Um Design-Pattern (padro de projeto) uma maneira formal de documentar uma soluo para
um problema de projeto em uma determinada rea de expertise.
A ideia foi introduzida pelo arquiteto Christopher Alexander, no campo da construo civl, em
1977, e mais tarde foi adaptada para vrias outras disciplinas, incluindo a a cincia da
computao.
Em engenharia de software, um Design Pattern uma soluo reutilizvel para um problema
comum no projeto de software. uma descrio ou modelo sobre como resolver um problema
que pode ser usado em muitas situaes diferentes.
O livro Design Patterns: Elements of Reusable Object-Oriented Software, lanado em 1994 e
escrito por Erich Gamma, Richard Helm, Ralph Johnson, e John Vlissides (posteriormente
imortalizados como Gang of Four [GoF, a Gangue dos Quatro]), acabou se tornando a
referncia no assunto.
O Design-Pattern Command
Embora o exemplo anterior possa parecer simples, fica evidente que adicionar novas aes torna
o cdigo do Servlet cada vez mais complexo. Alm do mais, ele ainda parece muito
procedural...
O ideal seria implementar uma arquitetura na qual a lgica de negcios ficasse independente do
Servlet, caso contrrio vamos estar apenas trocando uma dependncia (JSP) por outra (Servlets).
E pior, com um monte de ifs no meio do caminho.
O Design-Pattern Command pode nos ajudar, pois permite encapsular uma tarefa como um
objeto, permitindo assim que o Controller no precise saber nada a respeito da tarefa sendo
executada: basta ao Servlet saber que objeto Command implementa a atividade requisitada pelo
usurio por meio do formulrio web.
O Command, por sua vez, no sabe nada a respeito da interface com o usurio nem como a
requisio foi gerada: para ele basta saber que tarefa deve desempenhar.
76
Java Web - Servlet e JSP - On-Line
Voc deve estar pensando: certo, entendo o propsito e a motivao do Command, mas ainda
no consigo entender como o Controller vai descobrir que Command usar. Ainda vamos usar os
ifs? A no ser que exista uma soluo mgica....
incluir_produto.jsp
<html>
<head>
<title>Incluir Produto</title>
</head>
<body>
<b1>Incluir Produto</b1>
<form action="Controller" method="post">
Nome:
<input type="text" name="nome"><br>
Departamento:
<input type="text" name="departamento"><br>
Preo Unitrio:
<input type="text" name="precoUnitario"><br>
77
Java Web - Servlet e JSP - On-Line
<input type="hidden"
name="acao"
value="IncluirProduto"><br>
<input type="Submit" value="Enviar">
</form>
</body>
</html>
O formulrio deste exemplo praticamente o mesmo mostrado anteriormente, com uma sutil
diferena: o nome da ao a ser executada IncluirProduto, em camel-case. Isso vai
facilitar sobremaneira o trabalho do nosso Factory, como mostraremos em seguida.
Command.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Command {
public String executar(HttpServletRequest request,
HttpServletResponse response);
}
A nova interface Command define como sero os comandos da nossa aplicao. Basicamente
ela define um mtodo executar() que recebe a requisio e a resposta como parmetros e
retorna uma String. Nosso comando pode inspecionar ou alterar a requisio e a resposta HTTP
durante a realizao do seu trabalho, e ao final retorna a URL da pgina que deve ser executada
em seguida.
CommandFactory.java
public abstract class CommandFactory {
public static Command criarCommand(String acao)
throws ClassNotFoundException, InstantiationException,
IllegalAccessException {
return (Command) Class.forName(acao
+ "Command").newInstance();
}
}
J a classe abstrata CommandFactory a fbrica que ser utilizada para construir objetos do
tipo Command. Ela tem apenas um mtodo, criarCommand(), o qual recebe um nome de
ao e retorna o objeto do tipo Command correspondente.
Note que no nosso exemplo esta classe seria chamada pelo Controller, o qual receberia a
ao a partir da pgina JSP. Se por exemplo o processo partiu da pgina
incluir_produto.jsp, ento o parmetro acao vale IncluirProduto. O que a
factory faz pegar este nome de ao, concatenar a palavra Command ao seu final (gerando
IncluirProdutoCommand) e procurar por esta classe no classpath, retornando-a em
seguida ao chamador.
Controller.java
import java.io.IOException;
import java.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Controller extends HttpServlet {
protected void doGet(HttpServletRequest request,
78
Java Web - Servlet e JSP - On-Line
HttpServletResponse response)
throws ServletException, IOException {
String acao = request.getParameter("acao");
if (acao == null) {
request.getRequestDispatcher("index.jsp")
.forward(request, response);
}
try {
Command command = CommandFactory
.criarCommand(acao);
String proximaPagina = command
.executar(request, response);
request.getRequestDispatcher(proximaPagina)
.forward(request, response);
} catch (Exception e)
request.setAttribute(
"javax.servlet.jsp.jspException", e);
request.getRequestDispatcher("erro.jsp")
.forward(request, response);
}
}
}
O nosso Controller agora se viu livre de toda a lgica de deciso em relao ao
comportamento a tomar com base na ao indicada: tudo o que ele faz pedir ao
CommandFactory que crie um objeto Command com base no parmetro e depois o executa.
Tudo o que ele precisa saber que todos os Commands se comportam do mesmo jeito, reagindo
a uma chamada a executar() e que retornam a URL do prximo documento a exibir. O
Controller se tornou, finalmente, independente dos comandos que executa. E como a lgica
da CommandFactory tambm bastante simples, para adicionar novos recursos nossa
aplicao agora basta criar o JSP e a classe de command pertinente, o resto todo acontece
automaticamente.
IncluirProdutoCommand.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IncluirProdutoCommand implements Command {
@Override
public String executar(HttpServletRequest request,
HttpServletResponse response) {
// Faz todo o processo de incluso aqui.
// ...
// E depois retorna a URL da prxima pgina a ser mostrada
// ao usurio.
return "index.jsp";
}
}
Por fim, a classe IncluirProdutoCommand a classe de comando que ser disparada pelo
Controller para realizar o trabalho efetivo. Como ela implementa a interface Command, o
seu mtodo executar() recebe a requisio e a resposta como parmetros e retorna, ao seu
final, a URL do prximo documento a ser exibido para o usurio.
79
Java Web - Servlet e JSP - On-Line
No meio tempo ela pode desempenhar as funes a que se prope (no nosso caso ela faria uma
incluso no banco de dados). Alm disso, como tem acesso requisio, ela pode buscar outros
parmetros que lhe so pertinentes. Por meio da resposta tambm lhe possvel popular objetos
de contexto ou usar de outras estratgias para se comunicar com o JSP que ser executado a
seguir.
80
Java Web - Servlet e JSP - On-Line
Captulo 10 JSTL
Namespaces
JSTL oferece uma grande variedade de tags para os mais diversos usos. Para refletir isso, assim
como dar a cada rea o seu prprio namespace, JSTL disponibilizada como mltiplas
bibliotecas de tags:
Core;
Internacionalizao;
XML;
SQL;
Funes.
Namespace Prefixo Funes
Core c Suporte s Variveis
http://java.sun.com/jsp/jstl/core Controle de Fluxo
Gerenciamento de URLs
Tags Variadas
81
Java Web - Servlet e JSP - On-Line
Colaborao Implcita
A Colaborao Implcita ocorre por meio de uma interface bem-definida que permite que tags
encadeadas trabalhem de maneira uniforme com sua tag me.
As tags condicionais, por exemplo, utilizam este tipo de colaborao:
<c:choose>
<c:when test=${param.acao == incluir}>
...
</c:when>
<c:when test=${param.acao == alterar}>
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
No exemplo acima vemos que existem tags <c:when> e <c:otherwise> dentro da tag
<c:choose>. Olhando para o cdigo JSP mostrado acima no se percebe nenhum tipo de
82
Java Web - Servlet e JSP - On-Line
relacionamento entre estas tags, mas quando as explicarmos em detalhes voc perceber que,
embora no declarado, ele existe.
Colaborao Explcita
A Colaborao Explcita ocorre quando uma tag expe informao para o ambiente. Tags JSTL
expem valores como variveis EL. A conveno usar o nome var para qualquer atributo que
exponha informaes a respeito da tag.
Este o mecanismo usado pela tag forEach, por exemplo:
<c:forEach var=elemento items=${sessionScope.lista}>
${elemento}
</c:forEach>
O Namespace Core
As tags do namespace core so usadas para declarao e manipulao de variveis e controle de
fluxo.
Alm disso, ainda oferecem uma maneira de acessar recursos baseados em URLs cujo contedo
pode ento ser includo ou processado dentro do contexto de um documento JSP.
Grupo Tags
Suporte s Variveis remove
set
Controle de Fluxo choose
when
otherwise
forEach
forTokens
if
Gerenciamento de URLs import
param
redirect
param
url
param
Tags Variadas catch
out
Suporte s Variveis
A Tag <c:set>
A tag <c:set> cria ou inicializa uma varivel EL.
Pode ser usada na forma de atributo:
83
Java Web - Servlet e JSP - On-Line
A Tag <c:remove>
A tag <c:remove> remove uma varivel do contexto indicado.
<c:remove var=variavel scope=session />
Controle de Fluxo
A Tag <c:if>
A tag <c:if> permite a execuo condicional do seu corpo de acordo com o resultado
booleano do seu atributo test.
<c:if test=${!empty param.acao}>
...
</c:if>
A Tag <c:choose>
A tag <c:choose> executa o cdigo condicional embutido em sua subtags <c:when> e
<c:otherwise>.
Ela gera o corpo da primeira tag <c:when> cuja condio de testes (contida no atributo test)
for verdadeira.
O corpo da tag <c:otherwise> ser executado se nenhuma tag <c:when> for atendida.
<c:choose>
<c:when test=${param.acao == incluir}>
...
</c:when>
<c:when test=${param.acao == alterar}>
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
A Tag <c:forEach>
A tag <c:forEach> pode ser usada para iterar em uma coleo de objetos.
Voc especifica a coleo por meio do atributo items, e o tem corrente fica disponibilizado
por meio da varivel de contexto indicada pelo atributo var.
O atributo varStatus define uma varivel que pode ser usada para obter, entre outras coisas,
o nmero de iteraes executadas at o momento.
<c:forEach var=cabecalho
items=${header}
varStatus=status>
O cabealho ${status.count} ${cabecalho}.<br>
84
Java Web - Servlet e JSP - On-Line
</c:forEach>
A tag <c:forEach> tambm pode ser usada simplesmente para iterar usando valores limites.
Neste caso os atributos begin e end definem os limites a serem usados.
Opcionalmente, o atributo step pode definir quantos elementos saltar a cada iterao.
<c:forEach var=i
begin=100
end=200
step=10>
${i}<br>
</c:forEach>
Pode-se ainda iterar em uma coleo usando valores limites. Neste caso os atributos begin e
end definem os pontos extremos da coleo que devem ser usados.
O atributo step funciona mesmo nos casos em que se itera por entre valores limites, e neste
caso podemos usar ${status.index} para saber o valor do ndice atual e
${status.count} para saber o nmero de iteraes at o momento.
<c:forEach var=cabecalho
varStatus=status
items=${header}
begin=3
end=7
step=2>
O cabealho ${status.index} ${cabecalho}.<br>
</c:forEach>
E ainda podemos iterar por entre os elementos de um Map. Neste caso o objeto recuperado ser
do tipo java.util.MapEntry.
<c:forEach var=parametro
items=${param}>
O parmetro ${parametro.key} vale ${parametro.value}.<br>
</c:forEach>
A Tag <c:forTokens>
A tag <c:forTokens> pode ser usada para iterar entre os tokens encontrados em uma string
delimitada.
Neste caso o atributo items representa a string delimitada e o atributo delims lista os
delimitadores:
<c:set var=numeros
value=um,dois:trs:quatro;cinco,seis,sete:oito />
<c:forTokens var=num
items=${numeros}
delims=,:;>
${num}<br>
</c:forTokens>
A tag forTokens suporta os mesmos atributos suportados pela tag forEach. Os atributos
begin, end e step funcionam exatamente como esperados, bem como varStatus.
<c:set var=nros
value=um,dois:trs:quatro;cinco,seis,sete:oito />
<c:forTokens var=num
85
Java Web - Servlet e JSP - On-Line
varStatus=status
items=${nros}
delims=,:;
begin=3
end=7
step=2>
${status.index}: ${num}<br>
</c:forTokens>
Gerenciamento de URLs
A Tag <c:url>
A combinao das tags <c:url> e <c:param> capaz de lidar eficientemente com a re-
escrita e codificao de URLs.
O atributo value da tag url indica o caminho at o recurso linkado, enquanto que o atributo
var cria uma referncia para aquela URL, a qual pode ser reutilizada mais tarde.
O atributo scope define o escopo no qual a varivel criada por var deve ser adicionada. Ele
pode valer page, request, session ou application.
Por sua vez a tag <c:param> pode ser usada para enviar parmetros de requisio para o
recurso linkado. Seus atributos so name e value.
<c:url value=http://alfanews.com.br/login.jsp
var=minhaURL
scope=request>
<c:param name=nome value=pedro />
<c:param name=senha value=123456 />
</c>
<a href=${minhaURL}>Logar</a>
Outra caracterstica importante sobre a tag <c:url> que ela automaticamente acrescenta o
nome do contexto corrente em URLs relativas. Assim voc no precisa acrescentar o nome da
aplicao como prefixo das suas URLs relativas.
Se por exemplo a nossa aplicao tivesse sido criada no contexto exemplo, a URL...
<c:url value=/paginas/login.jsp />
Geraria uma URL apontando para...
http://localhost/exemplo/paginas/login.jsp
A tag <c:url> tambm pode tratar outros contextos de maneira transparente. Da mesma
maneira que ela adiciona o escopo corrente automaticamente, podemos indicar qual escopo
utilizar.
Assim, a URL a seguir...
<c:url value=/paginas/login.jsp context=/aplicacao2 />
Geraria uma URL apontando para...
http://localhost/aplicacao2/paginas/login.jsp
A Tag <c:import>
Importa um contedo esttico ou dinmico dentro do documento JSP atual.
86
Java Web - Servlet e JSP - On-Line
A Tag <c:redirect>
A tag <c:redirect> pode ser usada para enviar um redirecionamento para o cliente.
Quando esta tag alcanada o contedo que a segue no documento atual ignorado e uma
resposta 307 enviada para o cliente, indicando a URL especificada pelo atributo url.
O atributo context pode ser usado para indicar um redirecionamento para uma aplicao
externa.
Subtags param tambm podem ser usadas para definir parmetros de requisio a serem
repassados pgina de destino.
<c:redirect url=/login.jsp context=/aplicacao2>
<c:param name=nome value=pedro />
<c:param name=senha value=123456 />
</c:redirect>
Tags Variadas
A Tag <c:catch>
A tag <c:catch> prov um complemento para o mecanismo de manipulao de erros do JSP.
Ela permite que uma pgina se recupere graciosamente de um erro sem que o controle seja
enviado para a pgina de erros.
Voc deve colocar o cdigo que pode lanar uma exceo no corpo da tag.
Uma vez lanada, a exceo pode ser recuperada por meio da varivel indicada pelo atributo
opcional var, criada no escopo de pgina.
<c:catch var=excecao>
<!-- Cdigo que pode lanar uma exceo. -->
</c:catch>
<c:if test=${excecao != null}>
Desculpe, a operao no pode ser completada.
</c:if>
A Tag <c:out>
A tag <c:out> tem um efeito parecido com <%= expresso %> ou ${expresso}:
usada para enviar texto para o browser.
A tag <c:out>, porm, mais poderosa, podendo codificar os caracteres especiais do XML
nas suas respectivas entidades e fazer uso de valores default.
O atributo value indica o que deve ser impresso, enquanto que o atributo default indica o
que deve ser impresso se value resultar em null.
O atributo escapeXml pode ser usado para codificar os valores especiais do XML.
<c:out value=${cliente.endereco.cidade}
escapeXml=true
87
Java Web - Servlet e JSP - On-Line
Internacionalizao
As aplicaes web devem ser capazes de se adaptar s linguagens e convenes de formatao
dos diferentes pases. O processo de projetar uma aplicao com tal capacidade chamado de
internacionalizao (internationalization, ou simplesmente i18n).
O processo de efetivamente traduzir uma aplicao para uma dada lngua chamado de
localizao (localization ou l10n).
H trs grandes conceitos associados internacionalizao:
Locale
o Um locale representa uma regio geogrfica, poltica ou cultural.
representada por um cdigo de linguagem seguido opcionalmente por um
cdigo de pas.
O locale brasileiro, por exemplo, pt_BR, enquanto que o dos Estados Unidos
en_US.
Resource Bundle
o um repositrio que contm objetos associados a uma Locale. Mensagens
armazenadas no bundle ficam associadas a uma chave. No momento de
apresentar uma mensagem usa-se a chave e o engine recupera a mensagem na
lngua apropriada.
Basename
o o nome base do arquivo que armazena as mensagens. Um Resource Bundle
em especfico, ento, obtido a partir da combinao do Basename com um
Locale.
88
Java Web - Servlet e JSP - On-Line
Para que a aplicao saiba onde e como localizar seus Resource Bundles voc precisa
especificar o seu Basename no arquivo web.xml.
A tag <context-param> deve ser usada para identificar um parmetro de contexto que
indicar o basename dos resource bundles.
A subtag <param-name> indica o nome do parmetro, que para esta situao ser sempre o
mesmo.
J a subtag <param-value> indica o basename dos seus resource bundles.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<context-param>
<param-name>
javax.servlet.jsp.jstl.fmt.localizationContext
</param-name>
<param-value>
mensagens
</param-value>
</context-param>
</web-app>
Os resource bundles precisam estar acessveis para o container em algum diretrio dentro do
classpath da sua aplicao. O mais comum que estes arquivos fiquem no raiz do seu diretrio
de arquivos-fonte.
No nosso exemplo, se fossemos oferecer localizao para as lnguas portuguesa e inglesa, o
diretrio /src conteria os seguintes arquivos:
mensagens_pt_BR.properties
mensagens_en_US.properties
Exibindo Mensagens
A Tag <fmt:message>
A tag <fmt:message> pode ser usada para exibir uma mensagem devidamente localizada.
Veja por exemplo o seguinte resource bundle. Seguindo o nosso exemplo anterior o arquivo se
chama mensagens_pt_BR.properties e se localiza no diretrio raiz do cdigo fonte da
aplicao:
mensagens_pt_BR.properties
saudacao=Al mundo!
Ao usarmos a tag <fmt:message> o atributo key serve para indicar a chave a ser buscada no
resource bundle mais adequado.
<fmt:message key=saudacao />
Se o locale selecionado fosse pt_BR este trecho de cdigo resultaria na sada mostrada a seguir:
Al mundo!
Quando precisarmos que o texto exibido ao usurio contenha partes variveis podemos usar
parmetros. Considere o seguinte trecho no arquivo de resource bundle:
parametrizada=Esta mensagem recebeu os valores {0} e {1} como
parmetro.
89
Java Web - Servlet e JSP - On-Line
A Tag <fmt:setLocale>
Para fins de teste voc pode experimentar forar um determinado locale, mesmo que esteja em
outro.
Por exemplo, para obrigar a sua pgina a mostrar as mensagens em ingls mesmo que o seu
browser esteja configurado para requisitar pginas em portugus voc poderia adicionar:
<fmt:setLocale value=en_US />
Para mostrar em portugus bastaria trocar por:
<fmt:setLocale value=pt_BR />
Formatao
Mostrar textos em diversas lnguas no basta para que possamos dizer que a nossa aplicao
est internacionalizada. Ainda temos que nos preocupar com a formatao de nmeros e datas,
j que cada pas pode exibir estas informaes em um formato particular.
Formatando Valores
A Tag <fmt:formatNumber>
A tag <fmt:formatNumber> pode ser usada para exibir um nmero formatado conforme
um locale.
O atributo value ou o corpo da tag especificam o nmero a ser formatado.
90
Java Web - Servlet e JSP - On-Line
A Tag <fmt:formatDate>
A tag <fmt:formatDate> pode ser usada para apresentar uma data de maneira formatada
conforme o locale corrente.
O atributo value ou o corpo da tag so usados para indicar a data a ser exibida.
Os atributos type, dateStyle, timeStyle, pattern e timeZone podem ser usados
para especificar o formato desejado.
Os atributos var e scope podem ser usados para armazenar a data formatada em uma varivel
ao invs de simplesmente imprim-la.
91
Java Web - Servlet e JSP - On-Line
92
Java Web - Servlet e JSP - On-Line
Existem situaes em que nem mesmo a JSTL suficiente. Por mais que ela simplifique a
criao dinmica de contedo com base em lgica booleana, certos contedos parecem
complicados demais para serem gerados sem o uso de scriptlets. Mas existe uma alternativa:
criar as nossas prprias tags.
Uma Tag Customizada (no ingls, Custom Tag) um elemento JSP definido pelo usurio.
Tags Customizadas abrem uma srie de possibilidades:
Customizar o cdigo HTML gerado por meio de atributos passados no cdigo JSP;
Acessar todas as variveis disponveis no ambiente JSP;
Efetuar comunicao entre as tags, tornando possvel criar beans, criar variveis EL que
se referem queles beans em uma tag e usar aquelas variveis EL em outra tag;
Fazer com que tags encadeadas se comuniquem por meio de variveis privadas.
93
Java Web - Servlet e JSP - On-Line
<input type=submit
value= Enviar />
</form>
No exemplo acima vemos vrias tags, como por exemplo <form>, <input> e <br>.
Algumas delas tm corpo (como o caso das tags <form> e <label>), enquanto que outras
no (<br> e <input>, no exemplo). Algumas delas tm atributos (a tag <form> tem os
atributos method e action), enquanto que outras no (de novo <br>).
Atributos
Usamos atributos para definir caractersticas especiais de uma tag. Veja o exemplo:
<input type=text
name=login
size=20
maxlength=20
/>
Neste caso a tag <input> foi especializada para receber a entrada de texto (por meio do
atributo type). Alm disso, indicamos o nome do componente (atributo name), seu tamanho
aparente (atributo size) e o nmero mximo de caracteres que ele pode comportar (atributo
maxlength).
Corpo
O corpo da tag a informao que aparece dentro da mesma, algo como os dados sob os quais
ela atua.
Tags com corpo usam uma tag de fechamento para indicar onde o seu corpo acaba, como o
caso da tag <label> mostrada abaixo:
<label for=login>
Usurio:
</label>
No exemplo acima, </label> no uma tag propriamente, mas sim apenas a marcao de
fechamento da tag <label>. O texto que aparece entre a tag de abertura e a de fechamento
chamado de corpo da tag.
O corpo das tags pode conter texto (como exatamente o caso da tag <label> mostrada) ou
mesmo outras tags (como o caso da tag <form>, que tem vrios <label>s e <input>s no
seu corpo).
E ainda existem as tags sem corpo. Neste caso no h tag de fechamento (no modelo XHTML a
tag de abertura recebe o marcador /> para indicar que ela no tem tag de fechamento, como o
caso de <br />).
Tag Handler
Se vamos criar nossas prprias tags, precisamos ter uma maneira de descrevermos o que estas
tags fazem. Com Custom Tags criamos classes Java que desempenham a lgica da tag, gerando
cdigo HTML dinamicamente, exatamente da mesma maneira que os Servlets faziam.
Chamamos de Tag Handler a classe que criamos para representar uma tag. Esta classe
gerenciada pelo container, o que significa que ela ser instanciada automaticamente quando o
container perceber que a tag foi utilizada em uma pgina JSP.
94
Java Web - Servlet e JSP - On-Line
Alm de instanciar a classe, o container responsvel ainda por copiar os valores de todos os
atributos da tag para os atributos da instncia recm-criada, fazendo uso dos mtodos setters
correspondentes. Assim, se a tag tem os atributos name, id e size, por exemplo, o container
chamaria os mtodos setName(), setId() e setSize(), passando os valores
encontrados no JSP para dentro do objeto.
Sempre h pelo menos dois atributos:
pageContext, que retorna informaes a respeito da pgina onde a tag foi
encontrada;
parent, que retorna informaes a respeito da tag me da tag corrente.
Conforme a especificao JSP foi evoluindo as Custom Tags foram ganhando novos recursos e
o desenvolvimento foi ficando cada vez mais facilitado.
Assim, hoje em dia temos trs grandes modelos:
Tags clssicas;
SimpleTags;
Tag Files.
95
Java Web - Servlet e JSP - On-Line
<type>java.lang.String</type>
</attribute>
<attribute>
<name>value</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
Podemos definir vrias tags em um mesmo TLD. O arquivo comea com uma tag <taglib>,
que sempre igual e serve para indicar os namespaces utilizados neste arquivo XML. Depois
temos uma tag <tlib-version>, cujo valor um nmero de verso arbitrrio (o nmero de
verso da sua biblioteca de tags). Em seguida temos o <short-name>, que uma sugesto de
prefixo para a utilizao desta biblioteca de tags, assim como a tag <uri> serve para indicar a
URI que estar associada a esta biblioteca (veremos mais sobre estas duas ltimas tags mais
tarde).
Por fim temos uma seo <tag> para cada tag definida nesta biblioteca. Esta seo comea
com uma tag <name>, que indica o nome da tag. Depois vemos a tag <tag-class>, a qual
servir para indicar o nome plenamente qualificado da classe tag handler que implementa a
lgica desta tag. Em seguida temos uma tag <body-content>, a qual serve para indicar o
tipo de contedo suportado no corpo desta tag (o qual pode ser empty para tags que no tem
corpo, JSP para tags que suportam outras tags JSP em seu corpo, scriptless para tags
que no usaro scriptlets ou outros elementos de script em seu corpo, e tagdependant
para aqueles casos em que voc no quer que o container tente interpretar o corpo da tag, j que
ele faz sentido apenas para a prpria classe tag handler).
Ainda dentro da seo tag teremos uma seo <attribute> para cada atributo possvel
naquela tag. L dentro temos a tag <name>, que define o nome do atributo; a tag
<required>, que indica a obrigatoriedade ou no do atributo (true para atributos
obrigatrios, false para atributos opcionais); a tag <rtexprvalue>, que serve para
indicar se o atributo pode ser populado por meio de expresses (true para atributos que
podem receber valores em tempo de execuo por meio de Expression Laugnage, por exemplo,
false para atributos cujos valores devem ser informados como literais no prprio
documento JSP que utiliza a tag); e a tag <type>, a qual indica o tipo de dados Java do
atributo (na forma de um nome plenamente qualificado de classe ou nome de tipo de dados
primitivo).
96
Java Web - Servlet e JSP - On-Line
Aqui escolha a categoria Web e Descritor de Biblioteca de Marcao como tipo de arquivo.
Em seguida clique em Prximo para ver a prxima tela:
Aqui voc poder indicar o nome do seu arquivo TLD, bem como o diretrio onde ele ser
armazenado (que pode ser WEB-INF ou um subdiretrio l dentro). Informe tambm o URI e o
prefixo sugerido.
97
Java Web - Servlet e JSP - On-Line
Tags Clssicas
Tags Clssicas representam a metodologia original para o desenvolvimento de Custom Tags na
especificao 1.1 do JSP. A especificao 1.2 adicionou novas funcionalidades e simplificou a
codificao, mas essencialmente o modelo permaneceu o mesmo.
A Classe BodyTagSupport
A classe javax.servlet.jsp.tagext.BodyTagSupport tipicamente a classe que
estendemos quando estamos criando uma tag clssica, seja para tags com corpo seja para tags
sem corpo. Eis os seus mtodos principais:
Mtodo Descrio
int doAfterBody() Lanada quando o container alcana o final do
corpo desta tag. Por padro no reavalia o
corpo da tag (pois retorna SKIP_BODY).
int doEndTag() Lanada automaticamente quando o container
alcana a tag de encerramento. Por padro
avalia o restante pgina (pois retorna
EVAL_PAGE).
void doInitBody() Lanada automaticamente quando o container
est prestes a avaliar o corpo da tag pela
primeira vez.
98
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
int doStartTag() Lanada automaticamente quando o container
encontra a tag de abertura. Por padro retorna
EVAL_BODY_BUFFERED, o que provoca a
avaliao do corpo da tag.
static Tag findAncestorWithClass(Tag from, Encontra a instncia mais prxima de uma
Class klass) dada classe a partir de uma Tag especificada.
BodyContent getBodyContent() Retorna o contedo do corpo desta tag.
String getId() Retorna o valor do atributo id desta tag, ou
null se ele no foi especificado.
Tag getParent() A instncia de Tag mais prxima da instncia
atual no documento.
JspWriter getPreviousOut() Retorna o JspWriter da tag que cerca a tag
atual.
Object getValue(String k) Recupera o valor associado a uma chave.
Enumeration<String> getValues() Enumera as chaves para os valores
armazenados por esta tag.
void release() Libera o estado desta tag.
void removeValue(String k) Remove um valor associado a uma chave.
void setBodyContent(BodyContent b) Prepara para a reavaliao do corpo da tag,
armazenando o contedo atual em um buffer.
void setId(String id) Estabelece o valor do atributo id desta tag.
void setPageContext(PageContext Estabelece o PageContext.
pageContext)
void setParent(Tag t) Estabelece o aninhamento desta tag.
void setValue(String k, Object o) Associa um valor com uma chave.
Os quatro primeiros mtodos so os mais importantes da API, e fazem parte do que chamamos
de gerenciamento do ciclio de vida das custom tags clssicas.
99
Java Web - Servlet e JSP - On-Line
100
Java Web - Servlet e JSP - On-Line
As Constantes de Retorno
As diversas classes e interfaces da API de tags customizadas clssicas declaram vrias
constantes que podem ser utilizadas como retorno dos mtodos do ciclo de vida. So elas:
Constante Descrio
static int EVAL_BODY_AGAIN Faz com que o container avalie novamente o
corpo da tag no stream existente.
Declarada em
javax.servlet.jsp.tagext.IterationTag
101
Java Web - Servlet e JSP - On-Line
Constante Descrio
static int EVAL_BODY_BUFFERED Faz com que o container avalie novamente o
corpo da tag no stream existente.
Declarada em
javax.servlet.jsp.tagext.BodyTag
static int EVAL_PAGE Faz com que o container continue avaliando a
pgina.
Declarada em javax.servlet.jsp.tagext.Tag
static int SKIP_BODY Faz com que o container salte a avaliao do
corpo da tag.
Declarada em javax.servlet.jsp.tagext.Tag
static int SKIP_PAGE Faz com que o container ignore o restante da
pgina.
Declarada em javax.servlet.jsp.tagext.Tag
102
Java Web - Servlet e JSP - On-Line
Nesta janela marque o checkbox para adicionar a sua tag handler ao arquivo TLD criado
anteriormente (clique em Procurar... para apontar para o arquivo). Depois selecione o tipo de
103
Java Web - Servlet e JSP - On-Line
contedo do corpo e, por fim, clique no boto Novo... para adicionar os eventuais atributos.
Clique em Finalizar para terminar.
Veja o exemplo abaixo:
InputClassicTag.java
package classictags;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class InputClassicTag extends BodyTagSupport {
private String type;
private String name;
private String value;
public void setType(String type) {
this.type = type;
}
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
@Override
public int doStartTag() throws JspException {
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.print("<input type=\"");
out.print(this.type);
out.print("\"");
if (this.name != null) {
out.print(" name=\"");
out.print(this.name);
out.print("\"");
}
if (this.value != null) {
out.print(" value=\"");
out.print(this.value);
out.print("\"");
}
out.print(" />");
} catch (IOException ioe) {
throw new JspException("Erro em InputClassigTag.",
ioe);
}
return EVAL_PAGE;
}
}
104
Java Web - Servlet e JSP - On-Line
No exemplo acima comeamos nossa tag handler informando que ela estende
BodyTagSupport, que a classe mais utilizada como base para tags clssicas, mesmo para
aquelas que no tem corpo. Depois de definirmos os atributos que guardaro os atributos da tag
(no caso, name, type e value) e seus respectivos setters, passamos a definir os mtodos da
API.
Comeamos por sobrescrever doStartTag() apenas para retornar SKIP_BODY (caso
contrrio a implementao presente em BodyTagSupport seria utilizada, a qual retornaria
EVAL_BODY_BUFFER, forando o container a tentar avaliar o corpo (inexistente) da tag.
Por ltimo sobrescrevemos o mtodo doEndTag(), o qual faz todo o trabalho pesado no
exemplo demonstrado. Ele gera uma sada HTML de uma maneira bastante semelhante que
um Servlet faria, por meio de out.print(). No exemplo ele est gerando uma tag HTML
do tipo <input>, utilizando os atributos que recebeu do documento JSP como base para a
gerao do cdigo HTML. No final do mtodo vemos um retorno EVAL_PAGE, o que faz com
que o container continue processando normalmente o restante do documento JSP.
tags.tld
<?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>t</short-name>
<uri>/WEB-INF/tlds/tags</uri>
<tag>
<name>InputClassicTag</name>
<tag-class>classictags.InputClassicTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>type</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>name</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>value</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
O arquivo descritor de bibliotecas de tags acima define a nossa tag e seus atributos. Veja que a
tag <name> dentro da seo <tag> define o nome da tag como InputClasicTag. Este o
texto de tag que deveremos incluir em nosso JSP.
105
Java Web - Servlet e JSP - On-Line
106
Java Web - Servlet e JSP - On-Line
Por exemplo:
<tag>
<name>ToLowerCaseTag</name>
<tag-class>classictags.ToLowerCaseClassicTag</tag-class>
<body-content>JSP</body-content>
</tag>
Para que possamos lidar com o corpo das tags clssicas temos que usar o objeto
BodyContent, o qual pode ser retornado pelo mtodo getBodyContent() definido na
classe BodyTagSupport.
Veja abaixo os principais mtodos da classe BodyContent:
Mtodo Descrio
void clearBody() Limpa o corpo da tag sem lanar qualquer
exceo.
JspWriter getEnclosingWriter() Obtm o objeto JspWriter usado para escrever
o corpo desta tag.
abstract java.io.Reader getReader() Retorna o corpo da tag como um Reader.
abstract String getString() Retorna o corpo da tag como uma String.
abstract void writeOut(java.io.Writer out) Escreve o corpo da tag no Writer fornecido.
No caso de querermos ler o corpo da tag e o substituirmos por algum contedo gerado pela
nossa classe Java, basta que utilizemos o mtodo getEnclosingWriter() da classe
BodyTagSupport para escrevermos o novo contedo.
ToLowerCaseClassicTag.java
package classictags;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class ToLowerCaseClassicTag extends BodyTagSupport {
@Override
public int doAfterBody() throws JspException {
try {
if (this.getBodyContent() != null) {
String body = this.getBodyContent().getString();
this.getBodyContent().getEnclosingWriter().write(
body.toLowerCase());
}
} catch(IOException ioe) {
throw new JspException("Erro:" + ioe.getMessage());
}
return SKIP_BODY;
}
}
No exemplo acima recuperamos o corpo corrente da tag j convertido para String por meio da
chamada a getBodyContent.getString(). Depois escrevemos o novo corpo por meio
de getBodyContent().getEnclosingWriter().write(), passando como
parmetro o novo corpo.
107
Java Web - Servlet e JSP - On-Line
Mas em outras situaes no iremos querer substituir o corpo da tag, mas apenas manipul-lo de
alguma forma. Nestes casos podemos usar os mtodos doAfterBody() e doEndTag()
para controlar o fluxo de execuo.
Podemos usar isso para criarmos uma tag de loop, por exemplo, que ciclicamente fora o corpo
da tag a ser avaliado e por fim imprime o corpo gerado.
LoopClassicTag.java
package classictags;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class LoopClassicTag extends BodyTagSupport {
private int vezes;
public void setVezes(int vezes) {
this.vezes = vezes;
}
@Override
public int doStartTag() throws JspException {
if (this.vezes > 0) {
return EVAL_BODY_BUFFERED;
} else {
return SKIP_BODY;
}
}
@Override
public int doAfterBody() throws JspException {
if (this.vezes > 1) {
this.vezes--;
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
}
@Override
public int doEndTag() throws JspException {
try {
if (this.bodyContent != null) {
this.bodyContent.writeOut(this.bodyContent.
getEnclosingWriter());
}
} catch (IOException ioe) {
throw new JspException(
"Erro: " + ioe.getMessage());
}
return EVAL_PAGE;
}
}
Tags Simples
SimpleTags so uma nova alternativa para a criao de custom tags, introduzidas com a
especificao JSP 2.0 (Novembro de 2003).
108
Java Web - Servlet e JSP - On-Line
De codificao mais simples e baseadas em uma arquitetura mais leve, SimpleTags tem quase o
mesmo poder que as tags clssicas. O corpo das SimpleTags, entretanto, no pode conter
scriptlets ou expressions.
Classes SimpleTag usam menos mtodos, tem uma interface diferente para lidar com o corpo
das tags, bem como objetos de contexto diferentes.
Mas a grande vantagem a simplificao no ciclo de vida: no ter que lidar com os vrios
mtodos e constantes de retorno usadas pelas tags clssicas um enorme alvio.
A Classe SimpleTagSupport
Normalmente voc estender SimpleTagSupport quando estiver desenvolvendo tags
simples. Veja abaixo alguns dos seus principais mtodos:
Mtodo Descrio
void doTag() O nico mtodo do ciclo de vida das tags
simples, aquele que guarda a lgica da tag. A
implementao em SimpleTagSupport no faz
nada.
static jspTag findAncestorWithClass(JspTag Encontra a instncia da classe indicada que a
from, Class klass) mais prxima da tag especificada.
JspFragment getJspBody() Retorna o corpo desta tag conforme passado
pelo container.
JspContext getJspContext() Retorna o contexto de pgina desta tag,
conforme passado pelo container.
JspTag getParent() Retorna a tag me desta tag, para fins de
colaborao.
void setJspBody(JspFragment jspBody) Prov o corpo desta tag como um objeto do
tipo JspFragment, capaz de ser invocado zero
ou mais vezes pela tag handler.
109
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
void setJspContext(JspContext pc) Mtodo chamado pelo container para oferecer
o objeto JspContext a esta invocao.
void setParent(JspTag parent) Estabelece a tag me desta tag, para fins de
colaborao.
A Classe JspContext
A classe javax.servlet.jsp.JspContext serve como classe base para
PageContext e abstrai toda informao que no especfica a servlets. a partir dela, por
exemplo, que obteremos o objeto JspWriter que usamos para gerar o contedo HTML.
Mtodo Descrio
Object findAttribute(String name) Retorna o atributo indicado nos escopos page,
request, session e application, ou null se ele
no existir.
Object getAttribute(String name) Retorna o objeto associado com a chave
indicada no escopo de page ou null se ele no
existir.
Object getAttribute(String name, int scope) Retorna o objeto associado chave indicada
no escopo especificado, ou null se ele no
existir.
Enumeration<String> Enumera todos os atributos presentes no
getAttributeNamesInScope(int scope) escopo indicado.
abstract JspWriter getOut() Recupera o objeto JspWriter que deve ser
usado para gerar sada por documentos JSP.
abstract void removeAttribute(String name) Remove o objeto associado chave
especificada do contexto de pgina.
abstract void removeAttribute(String name, Remove o objeto associado chave
int scope) especificada do contexto indicado.
abstract void setAttribute(String name, Object Registra o nome e valor indicados ao contexto
value) de pgina.
abstract void setAttribute(String name, Object Registra o nome e valor indicados ao contexto
value, int scope) especificado.
A Classe JspFragment
A classe JspFragment utilizada para encapsular o corpo de uma tag simples. Podemos usar seu
mtodo invoke() para fazer com que o corpo seja gerado dentro de um documento JSP.
Mtodo Descrio
abstract JspContext getJspContext() Retorna o JspContext que est associado a
este JspFragment.
110
Java Web - Servlet e JSP - On-Line
Mtodo Descrio
abstract void invoke(Writer out) Executa o fragmento e dirige toda a sada para
o Writer indicado, ou para o Writer retornado
por JspContext.getOut() se o valor recebido
for nulo.
Assim como fez com as tags clssicas, selecione Web e Manipulador de Marcao e clique
em prximo para ver a tela seguinte:
111
Java Web - Servlet e JSP - On-Line
112
Java Web - Servlet e JSP - On-Line
113
Java Web - Servlet e JSP - On-Line
Arquivos de Tags
Arquivos de tags so outra facilidade criada pela especificao JSP 2.0. Atravs deste recurso
mesmo pessoas que no conhecem nada de Java podem criar tags personalizadas (desde que
entendam o bsico de JSTL ...).
Os arquivos de marcao devem ser colocados no diretrio /WEB-INF/tags da sua aplicao
Web e ter a extenso .tag.
Neste caso selecione Web e Arquivo de Marcao (Tag), e depois clique em Proximo para
ver a tela seguinte:
114
Java Web - Servlet e JSP - On-Line
Nesta janela informe o nome do arquivo de tags que voc deseja criar, o subdiretrio de WEB-
INF onde ele dever ser armazenado e selecione o formato (normalmente a sintaxe padro).
Depois marque o checkbox Adicionar arquivo de marcao ao descritor da biblioteca de
marcaes e clique em Procurar... para selecionar o seu arquivo TLD.
Clique em Finalizar para terminar.
InputTagFile.tag
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@tag description="Uma tag criada para testar tag files"
pageEncoding="UTF-8"%>
<%@attribute name="type"
required="true"
type="java.lang.String"%>
<%@attribute name="name"
type="java.lang.String"%>
<%@attribute name="size"
type="java.lang.String"%>
<input type="${type}"
<c:if test="${name != null}">
name="${name}"
</c:if>
<c:if test="${size != null}">
size="${size}"
</c:if>
>
Note que todos os atributos e configuraes da tag ficam no prprio arquivo de tag. Assim,
tudo o que o TLD precisa fazer indicar a existncia da tag:
tags;tld
<?xml version="1.0" encoding="UTF-8"?>
115
Java Web - Servlet e JSP - On-Line
116