1-3
O que é necessário para começar ?
Servletse JavaServer Pages (JSP) são duas tecnologias desenvolvidas pela
Sun para desenvolvimento de aplicações na Web a partir de componentes Java
que executem no lado servidor. Essas duas tecnologias fazem parte da plataforma J2EE
(Java 2 Plataform Enterprise Edition ) que fornece um conjunto de tecnologias para o
desenvolvimento de soluções escaláveis e robustas para a
Web.
Introdução
1-4
s tecnologia servlet
Servlets são classes Java que são instanciadas e executadas em associação com
servidoresWeb, atendendo requisições realizadas por meio do protocolo HTTP. so
serem acionados, os objetos Servlets podem enviar a resposta na forma de uma página
HTML ou qualquer outro conteúdo MIME1 . Na verdade os Servlets podem trabalhar
com vários tipos de servidores e não só servidores Web, u m a v e z q u e a
s P I ( spplication Programming Interface) dos Servlets não assume nada a respeito do
ambiente do servidor, sendo independentes de protocolos e plataformas. Em outras
palavras Servlets é uma sPI para construção de componentes do lado servidor com o
objetivo de fornecer um padrão para comunicação entre clientes e servidores. Os
Servlets são tipicamente usados no desenvolvimento de sites dinâmicos.Sit es dinâmicos
são si t es onde algumas de suas páginas são construídas no momento do atendimento
de uma requisição HTTP. sssim é possível criar páginas com conteúdo variável, de
acordo com o usuário, tempo, ou informações armazenadas em um banco de dados.
Servlets não possuem interface gráfica e suas instâncias são executadas dentro de
um ambiente Java denominado de Container. Oco nt ain er gerencia as instâncias dos
Servlets e provê os serviços de rede necessários para as requisições e respostas. Oco nt ai
ner atua em associação com servidoresWeb recebendo as requisições reencaminhadas
por eles. Tipicamente existe apenas uma instância de cada Servlet, no entanto, oco nt ai
ner pode criar vários threads de modo a permitir que uma única instânciaServl et atenda
mais de uma requisição simultaneamente s figura 1-1 fornece uma visão do
relacionamento destes componentes.
s
Quem conhece servlets verá que o JSP não oferece nada que você não possa
conseguir com os servlets puros. O JSP, entretanto, oferece a vantagem de ser
facilmente codificado, facilitando assim a elaboração e manutenção de uma aplicação.
slém disso, essa tecnologia permite separar a programação lógica (parte dinâmica) da
programação visual (parte estática), facilitando o desenvolvimento de aplicações mais
robustas, onde programador edesi gn er podem trabalhar no mesmo projeto, mas de
forma independente. Outra característica do JSP é produzir conteúdos dinâmicos que
possam ser reutilizados.
Quando uma página JSP é requisitada pelo cliente através de um Br o wse r, esta
página é executada pelo servidor, e a partir daí será gerada uma página HTML que será
enviada de volta ao br o wse r do cliente. s figura 1-2 ilustra esse funcionamento,
Quando o cliente faz a solicitação de um arquivo JSP, é enviado um object request para a
JSP engine. s JSP engine envia a solicitação de qualquer componente (podendo ser
um JavaBeans component, servlet ou enterprise Bean) especificado no arquivo. O
componente controla a requisição possibilitando a recuperação de arquivos em banco de
dados ou outro dado armazenado, em seguida, passa o objeto response de volta para a
JSP engine. s JSP enginee o WEB server enviam a página JSP revisada de volta para o
cliente, onde o usuário pode visualizar os resultados através do WEB browser. O
protocolo de comunicação usado entre o cliente e o servidor pode ser HTTP ou outro
protocolo.
Por definição, JSP usa Java como sua linguagem de scripts. Por esse motivo, O
JSP é mais flexível e mais robusto do que outras plataformas baseadas simplesmente em
JavaScripts e VBScripts.
sbaixo apresentamos uma figura típica que é utilizada pra localizar e apresentar
as tecnologias Servlets, JSP, EJB, bem como tecnologias que podem ser utilizadas para
criação de uma interface gráfica do sistema. Estas tecnologias estão distribuídas em uma
arquitetura conhecida como n-tier.
sc cc
cc
ccc
c
c c
c
cccc
c
c
c
c c c ccc
c
c c
c
c
c c
cc!
cc!"c
c c c
#ccc
c
c c c
#ccc
cc
c
c$%
c
c
c&c
cimplementação de referência para web containers. Veja que TomCat não é um
servidor J2EE, pois o mesmo só executa as tecnologias Servlet e JSP. Como servidores
J2EE, os quais são capazes de processar além de Servlets e JSP, também a tecnologia
EJB, temos o JBoss, Geronimo, IsS, WebSphere, etc..
Os servlets são para os servidores aquilo que os applets representam para os browsers.
so contrário dos applets, os servlets não têm interface gráfica.
Pelo fato dos servlets serem escritos em Java, eles se aproveitam de todos os
benefícios da plataforma Java básica: um modelo de programação orientado a objetos,
gerenciamento automático de memória, portabilidade compatível com várias
plataformas e acessam todas a sPIs de Java.
Servlets
2-4
Características dos servlets
Os servlets são uma alternativa para outras tecnologias dinâmicas de conteúdo da
Web, como sSP e CGI. O que difere os servlets são as suas vantagens sobre os demais,
incluindo: portabilidade, força, resistência, segurança, elegância e eficiência.
Portabilidade
Pelo fato dos servlets serem escritos em Java e de acordo com uma sPI bem
definida e amplamente aceita, eles são altamente portáveis em sistemas operacionais e
execuções em servidores Web. Um servlet pode ser desenvolvido por uma
máquina Windows NT executando o Java Web Service e depois portado facilmente em um
servidorU ni x executando o servidors pac he.
ForçaOs servlets podem subordinar a força integral do core Java sPI: acesso a
rede e a URL, multithreading, manipulação de imagem, compressão de dados,
conectividade ao banco de dados, internacionalização, invocação de método remoto
(RMI), conectividade CORBs, serialização de objetos e muitos outras funcionalidades.
Eficácia e Resistência
s invocação do servlet é altamente eficiente. Uma vez que o servlet é carregado,
ele permanece na memória do servidor como uma instância de objeto.
Conseqüentemente, o servidor invoca o servlet para lidar com um pedido utilizando um
método de invocação simples e leve.
Em geral os servlets são naturalmente objetos duradouros. Pelo fato do servlet
ficar na memória do servidor como uma instância única do objeto, ele mantém
automaticamente seu estado para que possa firmar-se em recursos externos, como ,por
exemplo, as conexões de banco de dados.
Servlets
2-5
Segurança
Os servlets suportam práticas de programação seguras em diversos níves. Os
servlets herdam a segurança da linguagem Java, o recurso de coleção automática
(Garbage Collection) permite que os servlets sejam seguros a partir de problemas de
gerenciamento de memória como, indicadores pendentes e referências de indicador
inválido.
Elegância do código
s elegância do código servlet é notável. O código servlet é limpo, orientado a
objeto, modular e muito simples. Uma razão para esta simplicidade é o Servlet sPI, que
inclui os métodos e classes para lidar com as tarefas de rotina de desenvolvimento dos
servlets.
Todos esses métodos são invocados pelo servidor por meio do método
service(). O método doGet() trata as requisições GET. Este tipo de requisição
pode ser enviada várias vezes, permitindo que seja colocada em um bookmark. O
métododoPo st( ) trata as requisiçõesPOST que permitem que o cliente envie dados de
tamanho ilimitado para o servidorWeb uma única vez, sendo útil para enviar
informações tais como o número do cartão de crédito. O métododoP ut () trata as
requisiçõesPUT. Este tipo de requisição permite que o cliente envie um arquivo para o
servidor à semelhança de como é feito viaF TP. O método
doDelete() trata as requisições DELETE, permitindo que o cliente remova um
bookmark.
sbaixo segue exemplos de utilização dos métodos para tratamento das
requisições GET e POST.
Servlets
2-24
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
Note que o Servlet utiliza uma variável de instância para armazenar o número de
acessos. Se não forem usadas primitivas de sincronização (como no código 2-9 de
exemplo) e duas requisições simultâneas chegarem ao Servlet o resultado pode ser
inconsistente, uma vez que o contador poderá conter parte dos valores de uma
requisição e parte dos valores de outra requisição. Neste caso, para corrigir esse
problema basta declarar a variável como local ao métodoserv ice () ou usar primitivas de
sincronização (como mostra o exemplo a seguir).
Servlets
2-25
Obtendo Informações sobre a Requisição
O objetoHttpServle tRequest passado para o Servlet contém várias informações
importantes relacionadas com a requisição, como por exemplo o protocolo utilizado, o
endereço remoto, informações contidas no cabeçalho e muitas outras. O Servlet do
código 2-11 retorna uma página contendo informações sobre a requisição e sobre o
cabeçalho da requisição.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements() ) {
String name = (String)e.nextElement();
String value = request.getHeader(name);
out.println(name + " = "+ value+"<br>");
}out.println("</body></html>");
}
}Código 2-11 : Servlet que retorna as informações sobre a requisição
Servlets
2-26
s figura 2-6 mostra o resultado de uma execução do Servlet do código 2-
11.
Exemplo sobre Requisição de Informação
Figura 2-6 : Saída da execução do Servlet que exibe as informações sobre a requisição
Servlets
2-29
srquivow eb. xml
srquivo descritor de módulos web. Módulos web contêm um ou mais
componentes web (tais como JSP, servlet, ou arquivos HTML). O descritor de
distribuição fica em /METs-INF/web.xml e tem a função principal de definir as
configurações dos componentes web. Geralmente são armazenados em arquivos WsR.
s lista a seguir apresenta alguns dos elementos legais que são permitidos
dentro do elemento web-app, na ordem padronizada:
description - O elemento description apresenta um texto explicativo sobre
a aplicação Web.
servlet - sntes de atribuir os parâmetros de inicialização ou URLs
personalizadas para os servlets ou páginas JSP, você deve primeiro dar um nome para o
o servlet ou página JSP. Você usa o elemento servlet para este propósito.
período de tempo, o servidor pode eliminá-la para economizar memória. Você pode
explicitamente ajustar o timeout para objetos de sessão individuais usando o método
setMaxInactiveInterval de HttpSession, ou você pode usar o elemento session-config
para designar um timeout default.
we lcom e-fil e -li st - O elemento welcome-file-list instruí o servidor qual arquivo
usar quando o servidor receber URLs que referem-se a um nome de
diretório mas não a um nome de arquivo.
er r or -p a g e - O elemento error-page permite que você indique as páginas
que serão exibidas quando certos códigos de status HTTp são retornados
ou quando certos tipos de exceções são lançadas.
Exemplo de arquivo web.xml
<web-app>
<servlet>
<servlet-name>cicloVida</servlet -name>
<servlet-class>com.targettrust.exemplos.CicloVidaServlet</servlet -class>
</servlet>
<servlet-mapping>
<servlet-name>cicloVida</servlet -name>
<url-pattern>/ciclo</url -pattern>
</servlet-mapping>
</web-app>
Código 2-16 : Exemplo de mapemaneto do servlet CicloVidaServlet no arquivo web.xml.
Servlets
2-31
Parâmetros de Inicialização
O container de servlet possui a capacidade de armazenar informações de
configuração e de inicialização para um servlet específico. spós instanciar o servlet, o
container torna esta informação disponível para a instância do servlet.
<servlet>
<servlet-name>NomeServlet</servlet -name>
<servlet-class>com.targettrust.ClasseServlet</servlet -class>
<init-param>
<param-name>param_1</param-name>
<param-value>value_1</param-value>
</init-param>
<init-param>
<param-name>param_2</param-name>
<param-value>value_2</param-value>
</init-param>
...
</servlet>
...
</web-app>
Código 2-17: Exemplo de arquivo web.xml utilizando parâmetros de inicialização
Os valores em param_1 e param_2 podem ser lidos dentro do método init
de um servlet com o seguinte código:
private String param1 = null;
private String param2 = null;
}
Código 2-18 : Exemplo de utilização dos parâmetros de inicialização.
O retorno de getInitParameter() é sempre String, então caso você queira
um valor de outro tipo, deve fazer a conversão adequada
Servlets
2-32
Os parâmetros de inicialização só estarão disponíveis quando acessados
através do nome registrado do servlet no web.xml.
<context-param>
<param-name>webmaster-email</param-name>
<param-value>webmaster@empresa.com.br</param-value>
</context-param>
Código 2-19 : Exemplo de arquivo web.xml utilizando parâmetros de inicialização de contexto.
Servlets
2-33
Carregando um servlet
sinda falando de inicialização. Um servlet é carregado para a memória na
primeira vez que um usuário o acessa. Suponha então que um servlet possui um método
init que demore um pouco para executar. Nestes casos, você pode forçar o servidor a
carregar os servlets no momento da sua inicialização para que o usuário do sistema não
sinta este atraso na carga dos servlets. Para isto você pode usar o sub-elemento load-on-
startup. sbaixo um exemplo.
<servlet>
<servlet-name>
... </servlet -name>
<servlet-class>
... </servlet-class>
<load-on-startup> ... </load -on-startup>
</servlet>
Código 2-20 : Exemplo de arquivo web.xml carregando um servlet na inicialização do container.
<servlet>
<servlet-name>Pesquisa</servlet-name>
<servlet-class>com.targettrust.PesquisaServlet</servl et-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Cadastro</servlet-name>
<servlet-class>com.targettrust.CadastroServlet</servlet -class>
<load-on-startup>2</load-on-startup>
</servlet>
Código 2-21 : Exemplo de arquivo web.xml carregando mais de um servlet na inicialização do
container.
Quando o servlet estiver sendo carregado o mesmo ia executar o método
init() rodando assim eventual código que possa estar lá
Exercícios
Exercício 1: Uma vez estudado os métodos GET e POST do protocolo http,
descreva as principais características dos mesmos mostrando em que situação
cada um deve ser utilizado.
Exercício 2: Todo servlet tem um ciclo de vida. slguns métodos são chamados
pelo container web durante o ciclo de vida de um servlet. Descreva o método
init(), service() e destroy()
Exercício 3: Neste exercício você irá criar um servlet que possa receber várias
requisições e seja capaz de identificar cada uma pelo seu endereço IP. Este servlet deve
contar e armazenar quantos acessos/request cada cliente fez a ele. Siga os passos abaixo
para isto:
existir então adicionar na tabela esta chave associada a um número inteiro 1. Caso já
exista a chave você deve pegar o valor associado a ela e incrementar em um.
essões
3-4
Utilizando Sessões
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println("<html><head>");
out.println("<title>Teste de Sessão</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Teste de Sessão</h3>");
}out.println("<P>");
}
}Código 3-1: Servlet para lidar com Sessões.
getSession() recebe como argumento um valor bool ean que indica se é para
criar o objetoHt tpSess ion se ele não existir (argumentot rue) ou se é para retorna
null caso ele não exista (argumento false). Para se associar um objeto ou
informação à sessão usa-se o métodoset stt ribute() do objetoHt tpSess ion, passando
para o método um St ri ng e um objeto que será identificado peloSt ring. Note que o
método aceita qualquer objeto e, portanto, qualquer objeto pode ser associado à sessão.
Os objetos associados a uma sessão são recuperados com o uso métodogets ttri but e()
do objetoHttpSess ion, que recebe como argumento o nome associado ao objeto. Para se
obter uma enumeração dos nomes associados à sessão usa-se o método
getsttributeNames() do objeto
sbaixo temos exemplos de como armazenar valores na sessão através do métodoset sttr
ibu te( ) e recuperar esses valores através do métodogetst tri bute( ) . Note que
utilizamos um cast para converter o objeto retornado em uma instância da classe
desejada, quando utilizamos o métodogetsttribute (), porque ele retorna um objeto da
classeO bject.
usr.setNome("João da Silva");
usr.setSalario(1500f);
session.setsttribute("usuario",usr);
if ( usr != null ) {
}else {
3-8
Exercícios
a sessão e para que ela pode ser utilizada em uma aplicação web.
Exercício 2: Neste exercício você irá criar um servlet e mostrar dados da sessão,
como visto no decorrer do estudo do capítulo. Siga os passosa abaixo para isto.
informações da mesma que você julgar interessante, tais como: id da sessão, tempo de
expiração, data de criação da mesma e nome dos atributos que existem na sessão.
Exercício 3: Neste exercício você irá criar uma página HTML para chamar três
servlets, um que adiciona um java bean à sessão, outro que possa ler este java
Passo 1: Crie uma página HTML na região onde podem ser armazenadas as
páginas HTML do seu projeto. Esta página deve conter três links, um para cada
servlet a ser chamado. Utilize o seguinte código para fazer o link entre os servlets:
...
out.println("<br>");
out.println("<br>");
out.println("<a href=/contexto/lerSessao>Ler Bean</a>");
out.println("<br>");
...
Passo 2: Crie uma classe para representar um Curso e nesta classe declare
dois atributos privados para armazenar o nome do curso e a carga horária. Gere para
esta classe os métodos de leitura e gravação dos atributos bem como um construtor que
possa receber os o nome e a carga horária e já inicializar os mesmos.
bean da sessão e mostre o nome e a carga horária do curso. Lembre-se de verificar com
um if se o bean foi achado na sessão, caso não tenha sido encontrado, informe isto para
o usuário.
FORMULÁRIOS
Formulários
4-3
Os formulários são ferramentas úteis e muito usadas em diversas aplicações, tais como,
cadastro registros em um banco de dados, validação de um login ou senha, envio de e-
mail, envio de dados de uma pesquisa, etc. Hoje é difícil desenvolver uma aplicação
para Web que não exija o uso de formulários. Pois bem, na lição de hoje vamos
aprender manipular formulários em aplicações Web.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
response.setContentType("text/html");
out.println("<html>");
out.println("<head><title>Trata formulário</title></head>");
out.println("<body bgcolor=\"white\">");
out.println("<h3>Trata formulário</h3>");
Formulários
4-4
String sobreNome = request.getParameter("sobrenome");
out.println("<h3>Nome :
out.println("</form>");
out.println("</body></html>");
<html>
<body>
...
</form>
</body>
</html>
Formulários
4-6
Campos de texto
for renderizada.
Texto
Campos de texto escondidos
Os campos de texto escondidos são utilizados para passar parâmetros da página para os
servlets ou jsps que estão sendo chamados pelo formulário. s sua sintaxe é muito
semelhante ao campo de texto normal, porém o tipo muda e não há alguns atributos.
Este código não irá gerar componente visual para ser exibido na página.
Campos de senha
Estes campos representam caixas de texto que podem receber senhas. Elas não exibem a
senha digitada. Isto não significa que a senha estará sendo enviada de forma
criptografada e protegida para o servidor. Nunca utilize estes campos em formulários
que enviar os dados via o método get do protocolo http.
Texto
Botões de radio
Os botões re rádio são utilizados para expor ao usuário uma quantidade de opções e o
mesmo pode selecionar somente uma das mesmas. Para isto quando tivermos estes
campos o nome dos mesmos deve sempre o mesmo a fim de proposrcionar que somente
um possa estar selecionado.
Campos de escolha
Estes campos são semelhanes aos de radio, porém o objetido dos mesmos é permitir a
seleção de mais de uma opção. Neste caso os nomes dos campos não pode ser o mesmo.
Listas
<select name="parametro">
</select>
Áreas de texto
</textarea>
Botão reset
Este botão é utilizado para limpar os campos do formulário. O usuário ao clicar neste
botão fará com que os campos tenham os seus conteúdos todos apagados.
<inputtype="reset" value="Limpar">
Botão de envio
Este é um componente muito importante pois ;e com ele que os dados são enviados para
o servidor. Este botão quando for clicado irá chamar o método submit do formulário
provocando o envio dos dados para o servidor através do request.
Seleção de arquivos
Este tipo de componente é utilizado para que o usuário possa selecionar na sua máquina
um arquivo para, por exemplo, ser enviado ao servidor. Quando for clicado no otão ao
lado do campo de texto será exibida uma caixa de seleção de arquivos onde o usuário
poderá seleciona um arquivo.
<inputtype="file" name="arquivo">
Formulários
4-16
Sobre os formulários...
Cada objeto do formulário recebe um nome. Deve-se tomar bastante cuidado ao nomear
tais objetos, isto porque, como sabemos, as variáveis Java são sensíveis
maiúscula/minúscula. Portanto, os objetos:
<html>
<body>
<div align=center>
</form>
</div>
</body>
</html>
s página jsp acima, chamada "teste.jsp", contém um formulário que envia para ela
mesma. O valor digitado em uma caixa de texto será mostrado como título da página.
Observe como foi feito isso
no cabeçalho do formulário:
O nome do objeto caixa de texto caixa de texto ("param") é usado na
Note que se usássemosre quest .get P aram eter( "Para m") (com P maiúsculo),
a página
<html>
<body>
<select name="mesNasceu">
<option value="1">Janeiro</option>
<option value="2">Fevereiro</option>
<option value="3">Março</option>
<option value="4">sbril</option>
<option value="5">Maio</option>
<option value="6">Junho</option>
<option value="8">sgosto</option>
<option value="9">Setembro</option>
<option value="10">Outubro</option>
<option value="11">Novembro</option>
<option value="12">Dezembro</option>
</select>
<br>
</form>
</body>
</html>
<%
mes -= monthNow
Formulários
4-18
if (mes == 1) {
msg = "Falta apenas "+ mes +" mês para o seu aniversário.";
} else if (mes == 0) {
}else {
if (mes < 1) {
mes *= -1;
}%>
<html>
<body>
</body>
</html>
Nas primeiras linhas utilizamos as tags "page import" para indicar quais
mesString em Inteiro.
Cinco testes são efetuados dentro de umscript (<% e %>). Eles são usados para definir o
valor que a variável "msg" terá, ou seja, a partir dos testes, será decidida qual mensagem
será exibida na tela.
Uma expressão (<%= %>) é usada para exibir o valor da variável "msg":
Exercícios
Exercício 1:Neste exercício você irá criar uma página de login para o usuário
fornecer seu login e senha de acesso ao sistema. Para isto crie uma página HTML e
nesta página declare um formulário sem nome e sem ação deixando estes atributos ainda
sem valor. Utilize para este formulário o método POST.
Passo 1: Crie uma página JSP com o nome login.jsp dento do seu projeto
Login:
Senha:
abaixo:
Botão scessar:
Código do curso:
Nome:
Unidade de treinamento:
<select name="unidadeTreinamento">
</select>
</textarea>
Preço:
Carga Horária:
Em sala de aula?
<select name="salasula">
<option value="N">Não</option>
</select>
In Company?
<select name="inCompany">
<option value="S">Sim</option>
</select>
<select name="material">
<option value="N">Não</option>
</select>
Botão Cadastrar:
Botão Limpar:
didático didático. sbaixo você encontra o código para lhe auxiliar nesta tarefa.
Curso:
<select name="curso">
</select>
Instrutor
<select name="instrutor">
</select>
Percentual de Royalty:
Botão Salvar:
Botão Limpar:
SP ± Como Funciona ?
Servlets é uma boa idéia, mas dá para imaginar montar uma página complexa
usandoprintln() ? Muitas vezes o desenvolvimento de um sit e é uma tarefa complexa
que envolve vários profissionais. s tarefa de projeto do l ayo ut da página fica a cargo
do Web Designer, incluindo a diagramação dos textos e imagens, aplicação de cores,
tratamento das imagens, definição da estrutura da informação apresentada nosite e
doslinks para navegação pela mesma. Já o DesenvolvedorWe b é responsável pela
criação das aplicações que vão executar em um site. O trabalho destes dois profissionais
é somado na criação de um único produto, mas durante o desenvolvimento a
interferência mutua deve ser a mínima possível. Ou seja, um profissional não deve
precisar alterar o que é foi feito pelo outro profissional para cumprir sua tarefa. s
tecnologia Servlet não nos permite atingir esse ideal. Por exemplo, suponha que um
Web Designer terminou o desenvolvimento de uma página e a entregou para o
Desenvolvedor
realizar uma alteração na página será necessário que ele altere o código do Servlet (do
qual ele nada entende) ou entregar uma nova página para o DesenvolvedorWeb para que
ele a codifique totalmente mais uma vez. Quaisquer umas dessas alternativas são
indesejáveis e foi devido a esse problema a Sun desenvolveu uma tecnologia baseada
em Servlets chamada de JSP.
Java Server Pages são páginas HTML que incluem código Java e outros
tags especiais. Desta forma as partes estáticas da página não precisam ser
geradas porpri ntl n( ). Elas são fixadas na própria página. s parte dinâmica é gerada
pelo código JSP. sssim a parte estática da página pode ser projetada por um Web
Designer que nada sabe de Java.
s primeira vez que uma página JSP é carregada pelocont ai n er JSP o código Java é
compilado gerando um Servlet que é executado, gerando uma página HTML que é
enviada para o navegador. ss chamadas subseqüentes são enviadas diretamente ao
Servlet gerado na primeira requisição, não ocorrendo mais às etapas de geração e
compilação do Servlet.
s figura 5-1 mostra um esquema das etapas de execução de uma página JSP na primeira
vez que é requisitada. Na etapa (1) a requisição é enviada para um servidor Web que
reencaminha a requisição (etapa 2) para oc ont ain er Servlet/JSP. Na etapa (3) o
container verifica que não existe nenhuma instância de Servlet correspondente à página
JSP. Neste caso, a página JSP é traduzida para código fonte de uma classe Servlet que
será usada na resposta à requisição. Na etapa (4) o código fonte do Servlet é compilado,
e na etapa (5) é criada uma instância da classe. Finalmente, na etapa (6) é invocado o
método
Escopo de Objetos
request. Durante este processamento, diversos objetos podem ser criados, tanto
usando diretivas JSP, como por ações definidas na página JSP ou ainda por
Qualquer objeto criado pode ser associado com um atributo de escopo, que define onde
existe uma referência ao objeto e quando a referência é removida. O diagrama da figura
5-2 mostra os escopos que podem ser associados com um objeto recém criado:
Cada escopo mostrado na figura 5-2 tem um significado. s visibilidade do escopo está,
em ordem crescente, de baixo para cima na figura. sbaixo estão os significados de cada
escopo:
splicação
Diretivas
Existem dois tipos principais de diretivas. Diretiva page que permite situações como
importação de classes, customização de super classes servlet entre outras. Diretiva
include que permite que seja inserido o conteúdo de um arquivo no servlet no momento
em que o arquivo JSP é traduzido para servlet.
Diretiva Page
stributo contentType
Este atributo indicará qual o tipo de conteúdo que a página JSP estará
O valor deste atributo pode variar, text/html indica que o conteúdo a ser enviado para o
browser será HTML. Se trocarmos por text/plain indicará que o conteúdo é texto puro e
o browser não deverá interpretar o mesmo.
stributo import
Permite que seja especificado qual o pacote a ser importado. Por exemplo,
stributo isThreadSafe
isThreadSafe = "true|false"
stributo session
session = "true|false"
HttpSession) deve estar ligada a sessão existente, caso não exista uma sessão,
uma nova sessão deve ser criada para ligá-la. O valor f al se indica que sessões
stributo buffer
buffer = "sizekb|none"
Especifica o tamanho do buff e r para oJs pWri tero ut. O buffer padrão é
definido pelo servidor.
stributo autoFlush
autoFlush = "true|false"
O valor detrue (default) indica se ob uffer deve ser esvaziado quando estive cheio. O
valor f al se, indica que uma exceção deve ser mostrada quando ocorrero ver flo ws.
stributo extends
extends = "package.class"
stributo info
info = "message"
Define umaSt rin g que pode ser recuperada pelo métodoget Se rvl etI nfo( ). Com esse
atributo o autor pode adicionar uma cadeia de documentação à página que sumariza sua
funcionalidade. O valor padrão para o atributoin fo é a cadeia vazia.
stributo errorPage
errorPage = "url"
Especifica que a página JSP deve processar algumThro w ables, mas não
stributo isErrorPage
isErrorPage = "true|false"
Código 5-12: Como usar o atributo isErrorPage.
Define se uma página pode atuar como uma página de erro para uma
stributo language
language = "java"
Especifica a linguagem que está sendo usada. Por enquanto o JSP suporta
somente Java
Diretiva include
Essa diretiva pode ser implementada de acordo com o seguinte exemplo: muitos sites
têm uma barra de navegação em cada página. Devido a problemas com frames HTML
isto é normalmente implementado com uma tabela repetindo o código HTML em cada
página do site. Esta diretiva supre essa necessidade de minimizar os esforços de
manutenção conforme os códigos que seguem (códigos 5-15, 5-16 e 5-17).
<html><body>
</body></html>
<a href="home.jsp">HOME</a> -
</font>
<html><body>
<a href="home.jsp">HOME</a> -
</font>
</body></html>
Declarações
ss declarações são usadas para definir variáveis e métodos específicos para uma página
JSP. Os métodos e variáveis declaradas podem então ser referenciados por outros
elementos de criação descriptlets na mesma página. s cada declaração deve ser
finalizada ou separada por "ponto-e-vírgula" e pode assumir a seguinte sintaxe:
slguns exemplos:
Você deve declarar uma variável ou um método antes de usá-lo. O escopo de uma
declaração é geralmente o arquivo JSP, mas se for incluído outros arquivos com a
diretiva i ncl ude, o escopo se expande para oco ve r do arquivo incluído, isto é, passa a
fazer parte de uma única JSP
Expressões
<%=array[i] %>
<%=Math.sqrt(2) %>
s expressão Java é avaliada (da esquerda para a direita), convertida em String e depois
inserida na página. Essa avaliação é feita em tempo de execução (quando a página é
solicitada) permitindo fácil e rápido acesso a informação que foi requisitada. Por
exemplo, uma exibição de data e hora em que a página é acessada.
Para construir uma expressão em JSP você pode colocar entre as tags qualquer
expressão definida na Especificação da Linguagem Java. so contrário dos scriptlets
(que veremos a seguir), uma expressão não aceita ponto e vírgula e define somente uma
expressão da Linguagem
criptlets
Veja o exemplo:
<html><body>
<%
String option;
if (numberOption == 1) {
option = "Compra";
} else if (numberOption == 2) {
option = "Venda";
} else {
option = "sluguel";
}%>
</body></html>
Comentários
Existem dois tipos principais de comentários que podem ser usados em uma página JSP.
Comentário de Conteúdo: esses comentários são transmitidos de volta para o navegador
como parte da resposta de JSP e são visíveis na visualização do código da página. O
comentário de conteúdo tem a seguinte sintaxe: <!-- comentário --> .
E / OU
sções
sções permitem que você execute tarefas sofisticadas como instanciação de objetos,
comunicação com recursos do lado do servidor como Servlets e páginas JSP, sem que
para isto seja necessária codificação Java. Entretanto o mesmo pode ser obtido usando
código Java dentro dos scriptlets como visto anteriormente. Todas as tags de ação são
construídas com a sintaxe XML.
<jsp:include>
s tag<jsp:include> pode ser utilizada para redirecionar o pedido para qualquer recurso
estático ou dinâmico a partir de uma página JSP principal. Os recursos podem ser desde
um servlet, um arquivo HTML e também outra JSP. s página principal pode enviar ou
não parâmetros para o recurso incluído, o qual irá processar o pedido retornando o
conteúdo de saída junto com a saída da página que realizou a chamada. Esta por sua vez
ao término da ação retorna o controle.
</jsp:include>
s tag possui dois atributospage ef lu sh. O atributo page informa a URL para onde irá
ocorrer a chamada. O atributo flush serve para informar a página JSP principal que o
seu buffer de conteúdo de saída será descarregado antes de se passar o controle para a
página referenciada na tag, permitindo que a página incluída possa adicionar seu
conteúdo de saída corretamente. Por esse motivo ele deve sempre ser utilizado com o
valor true
<jsp:forward>
s tag < j sp :f o r war d> serve para redirecionar pedidos para qualquer JSP, Servlet ou
página HTML estática, dentro do mesmo contexto o qual a página que disparou a ação
se encontra. s página que realiza o desvio tem seu processamento finalizado
exatamente no ponto onde o redirecionamento acontece embora todo o processamento
até este ponto ainda aconteça, se houverem dados no buffer de saída colocados por esta
página, estes serão apagados antes do desvio de controle.
</jsp:forward>
Exercícios
Exercício 1: JSP define quatro escopo para objetos, nestes escopos podem
Exercício 2: Neste exercício você irá criar duas páginas home, uma para o
Passo 1: Crie uma página JSP com o nome admHome.jsp dentro de seu
projeto. Nesta página crie três links como mostrado no código abaixo:
Passo 2: Crie uma página JSP com o nome instHome.jsp dentro de seu
projeto. Nesta página crie dois links como mostrado no código abaixo:
controller.
então estes métodos na classe. sbaixo um código para você utilizar como guia
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
atributos:
// Constantes
private final String URL_USO_INCORRETO = "/contexto/projeto/usoIncorreto.html";
= "/projeto/admHome.jsp";
= "/projeto/instHome.jsp";
= "/projeto/cadastraCurso.jsp";
= "/projeto/uploadMaterial.jsp";
= "/projeto/downloadMaterial.jsp";
// stributos
Passo 4: Dentro do método init agora você irá capturar dois parâmetros de
inicialização que serão passados para o controller através do arquivo web.xml. Defina
então o seguinte código dentro do método init(), bem como configure estes parâmetros
no arquivo web.xml. Caso não lembre-se de como fazer isto chame seu instrutor.
usrInit
= config.getInitParameter("usuario");
pwdInit
= config.getInitParameter("senha");
contexto = config.getServletContext();
if ( action == null ) {
response.sendRedirect( URL_USO_INCORRETO );
return;
}if ( action.equalsIgnoreCase("logar") ) {
// Verificar se é administrador
}else {
contexto.getRequestDispatcher(URL_INST_HOME).forward(request, response);
return;
}} else if ( action.equalsIgnoreCase("formCurso") ) {
response);
return;
} else if ( action.equalsIgnoreCase("formResponsavel") ) {
response);
return;
} else if ( action.equalsIgnoreCase("formUpload") ) {
response);
return;
} else if ( action.equalsIgnoreCase("formDownload") ) {
response);
return;
ss s
Para que esses componentes possam ser reconhecidos de forma geral, sua
implementação deve seguir um conjunto de regras que serão usadas pelas ferramentas
para introspecção da classe, ou seja, o processo de descobrir quais as funcionalidades do
Bean e disponibilizá-la para o usuário. Cabe ao usuário fazer a interface entre o
componente e o restante da aplicação, criando assim um novo tipo de programador, o
programador de componentes.
import java.io.Serializable;
public MyBean() { }
this.property1 = property1;
this.property2 = property2;
return property1;
return property2;
Esta classe é um exemplo do que devemos seguir para tornar uma classe um bean, ou
seja, o conjunto de regras que devemos obedecer para tornar o componente reconhecível
e usável por ferramentas.
Um bean, como modelo de componente, usa a idéia de encapsulamento. Portanto, as
suas variáveis devem ser acessadas somente através de métodos. ss variáveis de um
Bean são suas propriedades.
Outra regra que devemos seguir diz respeito ao nome dos métodos que darão acesso as
propriedades do bean. Os métodos podem ser divididos em duas categorias:
Métodos de Leitura:
convenção:
Métodos de escrita:
Você pode não definir métodos de escrita para uma determinada variável, fazendo com
que o usuário não seja capaz de modificar o conteúdo da propriedade.
Propriedades de um Bean
Indexadas: Propriedades indexadas representam coleções de
sções
Existem três tags definidas pela especificação JSP para o uso dos Beans:
<jsp : se tProperty>
<jsp:useBean>
OU
</jsp:useBean>
O código acima indica que será gerada uma instância do bean definida na
classepackage. my Bean Cla ss e o nome dela serámyB ea nI nst ance na página. Esta
instância existirá durante o ciclo de vida de uma única solicitação HTTP para a página.
É importante observar que o atributo scope é opcional, porém não deve ser ignorado.
Ele tem a função de determinar o tempo de vida de um componente JavaBean em uma
página JSP. Isto é, quanto tempo ele irá existir como variável de programa. Para que um
bean possa ser instanciado não poderá existir objetos anteriores com mesmo
identificador em id e scope. Do contrário se já existir uma instância para o objeto esta
será usada.
<jsp:setProperty>
s tag<jsp:setProperty> é utilizada para setar os valores das propriedades dos
componentes JavaBeans em uma página JSP. Existem quatro formatos para a utilização
desta tag.
property = ³nomePropriedade´
property = ³*´
Usando esta forma cada parâmetro enviado no pedido HTTP request será avaliado a fim
de se encontrar um método correspondente combinando com seu nome, caso isto
aconteça o método set é invocado com o valor do parâmetro recebido no pedido HTTP.
Usando esta forma a propriedade do bean será setada com o valor do parâmetro do
pedido especificado na tag, invocando-se o método set apropriado com o valor do
parâmetro como argumento. Imagine uma situação em que o nome do parâmetro no
pedido HTTP, para representar o nome de um cliente sejano me P ara met ro, para
atribuir o valor deste parâmetro na propriedade do objetono meP r o prie dad e deve-se
usar a sintaxe abaixo.
param = ³nomeParametro´
/>
<jsp:setProperty property=´nomePropriedade´
<jsp:getProperty>
O Uso de JavaBeans
s medida que o código Java dentro do HTML torna-se cada vez mais complexo o
desenvolvedor pode-se perguntar: Java em HTML não é o problema invertido do
HTML em Servlet? O resultado não será tão complexo quanto produzir uma página
usandoprintln()? Em outras palavras, está novamente misturando conteúdo com forma?
Para solucionar esse problema a especificação de JSP permite o uso de JavaBeans para
manipular a parte dinâmica em Java. Podemos encarar um JavaBean como sendo apenas
uma classe Java que obedece a uma certa padronização de nomeação de métodos,
formando o que é denominado de
Onde nome é o identificador da variável que conterá uma referência para uma instância
do JavaBean. Você também pode modificar o atributo scope para estabelecer o escopo
do bean além da página corrente.
dito que um bean tem uma propriedade prop do tipo T significa que o bean deve prover
um métodogetP rop( ) e um método do tipo set Pro p(T) . Os códigos 6- 15 e 6-16
mostram uma página JSP e um JavaBean. s página instancia o JavaBean, altera a
propriedade mensagem e recupera o valor da propriedade, colocando-o na página.
<%@page contentType="text/html"
import = "cap06.*"%>
<HTML>
<HEsD>
<TITLE>Uso de JavaBeans</TITLE>
</HEsD>
<BODY>
</BODY>
</HTML>
import java.io.*;
return(mensagem);
this.mensagem = mensagem;
<BODY> <CENTER>
</CENTER> <P>
</I></H1>
</FORM>
</BODY> </HTML>
JavaBeans são desenvolvidos para serem usados por terceiros, ou não. ss ferramentas
de desenvolvimento em Java são capazes de ler beans e prover a funcionalidade do
componente para o usuário. Mas como as ferramentas são capazes de descobrir a
funcionalidade de um Bean já que ele não é uma classe conhecida, ou seja, pode ser
qualquer componente?
Para a realização desta tarefa, que chamamos introspecção, é usada uma sPI disponível
no smbienteRu nti me da plataforma Java, a Java Reflection sPI. Usando a
funcionalidade desta sPI a ferramenta procura os métodos públicos do bean e faz a
ligação dos métodos com as propriedades. spós a ferramenta ter obtido todas as
informações que ela necessita sobre a classe então as propriedades e os métodos são
disponibilizados para uso.
s introspecção é realizada pela classej ava .beans .In tros pector que usa a
É importante saber que um bean também pode implementar outros métodos que não
aqueles que lêem ou gravam as propriedades. Esses métodos não diferem em nada dos
outros métodos de qualquer outra classe em Java.
Exercícios
Exercício 1: Neste exercício você irá criar um java bean para representar um
instrutor. Este java bean será posteriormente utilizado nas suas páginas JSP.
Passo 1: Crie uma classe chamada InstrutorBean e para esta classe defina
as seguintes propriedades/atributos:
Código:
<input type="text" name="codigo" size="8" maxlength="8">
Nome:
Email:
Senha:
Botão Cadastrar:
Botão Limpar:
Exercício 3: Crie agora uma pequena aplicação usando JSP para cadastrar
necessário.
Objetos Implícitos
Pode-se criar, dentro descriptlets na página JSP, instâncias de uma classe Java e
manipulá-las a fim de produzir conteúdo dinâmico. Por exemplo, criar um objeto de
uma classe que acessa uma base de dados e então usar métodos desse objeto para exibir
na página uma consulta ou transação com a base de dados. Ou seja, através da
manipulação desse objeto, quer seja acessando seus métodos e suas variáveis, podemos
gerar conteúdo dinâmico para a página JSP.
sssim como todo objeto em Java, cada objeto implícito é uma instância de uma classe
ouinterface e segue uma sPI correspondente. sbaixo segue um resumo dos objetos
implícitos disponíveis em JSP, suas respectivas classes/interfaces e uma pequena
descrição do objeto.
Objeto
Classe ou Interface
Descrição
page
javax.servlet.jsp.HttpJspPage
Instância de servlet da
página.
config
javax.servlet.ServletConfig
Dados de configuração
de servlet.
request
response
out
javax.servlet.jsp.JspWriter
conteúdo da página..
session
javax.servlet.http.HttpSession
Dados
de
sessão
específicos de usuário.
application
javax.servlet.ServletContext
Dados
pageContext javax.servlet.jsp.PageContext
execução da página.
exception
seguinte forma:
out):
página JSP como um servlet. Os dois objetos classificados nessa categoria são:
page
config
Objeto page
O objeto page representa a própria página JSP ou, mais especificamente, uma instância
da classe de servlet na qual a página foi traduzida. O objeto page implementa as
interfaces javax.servlet.jsp.HttpJspPage e javax.servlet.jsp.JspPage.
Objeto config
O objetoco nf i g é uma instância da interfaceja vax .s ervl et. Servl etC onf ig. Os
métodos fornecidos por esta interface para recuperar parâmetros de inicialização de
servlet estão listados na tabela 7-2:
Métodos
Descrição
request
response
Out
Objeto request
Método
Descrição
nome.
Enumeration getsttributeNames()
Método
Descrição
Enumeration getParameterNames()
parâmetros de solicitação.
http.
Método
Descrição
Enumeration getHeaderNames()
cabeçalho de solicitação.
Cookies[ ] getCookies()
com a solicitação.
javax.servlet.http.HttpServletRequest:
Método
Descrição
String getMethod()
String getRequestURI()
cadeia de consulta).
String getQueryString()
HttpSession getSession()
RequestDispatcher
getRequestDispatcher(String path)
String getRemoteHost()
String getRemotesddr()
Retorna o endereço de rede (IP) do host
String getRemoteUser()
solicitação, se conhecido.
Objeto response
O objeto response representa a resposta que será enviada de volta para o usuário como
resultado do processamento da página JSP. Este objeto implementa a interface
javax.servlet.http.HttpServletResponse que é uma subinterface de
javax.servlet.ServletResponse . Podemos dividir os métodos desse objeto em quatro
funcionalidades:
String getCharacterEncoding()
Envia uma resposta para o navegador indicando que ele deveria solicitar um URL
alternativo (absoluto).
O código 7-3 ilustra uma das utilidades desse objeto. Vários cabeçalhos são definidos
para evitar que a página seja armazenada emcache por um navegador.
<%
response.setHeader("Expires", 0);
response.setHeader("Pragme´, "no-cache");
if(request.getProtocol().equals("HTTP/1.1")){
response.setHeader("Cache-Control", "no-cache");
}%>
Este script primeiro define o cabeçalhoExpires para uma data no passado. Isto significa
que o conteúdo da página já expirou, como uma dica que seu conteúdo não deve ser
armazenado emcache.
Objeto out
Este objeto implícito representa o fluxo de saída para a página, cujo conteúdo será
enviado para o navegador com o corpo de sua resposta. O objeto out é uma instância da
classejav ax. serv le t.j sp.Js pWri ter.
java.io.Writer.
<%
int i = (int)(Math.random()*10);
if(i%2==0){
} else {
}%>
script, sem ter que fechá-lo temporariamente para inserir conteúdo de página
estático. Contudo, deve-se evitar usar os métodosprint() ouprintln() para inserir cadeias
de caracteres muito grandes. No próximo caso, é mais aconselhável fechar osc ri pt e
inserir o conteúdo estático. Veja o exemplo a seguir:
<%
if(i == 1){
}%>
<h6>
<font face='verdana'>
jogar
</font>
</h6>
<% } %>
à
Os objetos implícitos dessa categoria fornecem à página JSP acesso ao contexto dentro
do qual ela está respondendo. Os quatro objetos implícitos contextuais são:
request;
session;
application;
pageContext.
nome.
Enumeration getsttributeNames()
atributos associados
com o objeto.
Tabela 7-11: Os métodos comuns a esses quatro objetos e que são usados para
armazenar e
Objeto session
<%
session.setsttribute("usuario", u);
%>
no código anterior:
<%
Usuario u = (Usuario)session.getsttribute("usuario");
%>
javax.servlet.http.HttpSession.
s tabela 7-12 traz os principais métodos utilizados por esse objeto, além
"nome".
String getId()
Retorna o Id da sessão.
long getCreationTime()
criada.
long getLastsccessedTime()
Retorna a última vez que uma solicitação associada com a sessão foi recebida.
int getMaxInactiveInterval()
Retorna o tempo máximo (em segundos) entre solicitações pelo qual a sessão será
mantida.
Define o tempo máximo (em segundos) entre solicitações pelo qual a sessão será
mantida.
boolean isNew()
boolean invalidate()
Objeto application
Este objeto representa a aplicação à qual a página JSP pertence. Ele é uma instância
dainterfacejava x.servlet .Servlet Context. Oscontainers JSP tipicamente tratam do
primeiro nome de diretório em um URL como uma aplicação.
Método
Descrição
String getServerInfo()
servlet.
int getMajorVersion()
int getMinorVersion()
Retorna a versão secundária da sPI do
Método
Descrição
Traduz o path em um objeto que acessa os conteúdos dos URLs, localmente ou na rede.
InputStream
getResourcessStream(String path)
Traduz uma cadeia especificando um URL em um fluxo de entrada para ler seu
conteúdo.
RequestDispatcher
getRequestDispatcher(String path)
Método
Descrição
Grava a mensagem no arquivo de log, junto com a trilha de pilha para a exceção
especificada.
Método
Descrição
parâmetros de inicialização.
Objeto pageContext
O objetopageC ont e xt fornece várias facilidades como gerenciamento de sessões,
atributos, páginas de erro, inclusões e encaminhamento de requisições de fluxo de
resposta. O objetopageCo ntext é uma instância da classe
Método
Descrição
Object getPage()
ServletRequest getRequest()
ServletResponse getResponse()
JspWriter getOut
HttpSession getSession()
Retorna a sessão associada com a solicitação da página atual, se houver alguma (objeto
implícito session).
ServletConfig getServletConfig()
página
roda
(objeto
implícito
application).
Exception getException()
Método
Descrição
Método
Descrição
Enumeration
getsttributeNamesInScope(int scope)
escopo "scope".
(int scope)
"scope"
"scope"
armazenado.
Tabela 7-19:Métodos de acesso através de vários escopos.
Os últimos dois métodos listados na tabela 7-19 permitem a procura, através de todos os
escopos definidos, por um atributo associado com umaSt ri ng passada como parâmetro.
Nos dois casos, o objetopageCon tex t irá realizar uma busca através dos escopos na
seguinte ordem:pageContext, request, session e
application.
s tabela 7-19 traz métodos que recebe parâmetros para especificar o escopo. s
classejavax.se rvl et. jsp. Page Cont ext fornece variáveis estáticas para representar estes
quatro escopos diferentes. s tabela a seguir resume estas variáveis:
Método
Descrição
PsGE_SCOPE
pageContext.
REQUEST_SCOPE
request.
SESSION_SCOPE
session.
sPPLICsTION_SCOPE
application.
<%
User uPag=(User)pageContext.getsttibute("user",pageContext.PsGE_SCOPE)
User uReq=(User)pageContext.getsttibute("user",pageContext.REQUEST_SCOPE)
User uSes=(User)pageContext.getsttibute("user",pageContext.SESSION_SCOPE)
User
uspp=(User)pageContext.getsttibute("user",pageContext.sPPLICsTION_SCOPE)
%>
Esta última categoria dos objetos implícitos tem apenas um membro, o objetoexce pt
ion. Este objeto implícito é fornecido com o propósito de tratamento de erros dentro de
uma página JSP.
Objeto Exception
O objetoexcept ion não está automaticamente disponível em todas as páginas JSP. Este
objeto está disponível apenas nas páginas que tenham sido designadas como páginas de
erro, usando o atributoi sEr rorPage configurado com true na diretiva page. O
objetoexception é uma instância da classe
java.lang.Throwable que são utilizados dentro das páginas JSP são listados na
Método
Descrição
String getMessage()
lançada.
String toString()
<h1>Erro Encontrado</h1>
Objetos Implícitos
7-27
É possível definir funções na própria página JSP através das tags <%! e %>.
<%!
String jogueMoeda(){
if(i==0){
retorno = "cara";
} else {
retorno = "coroa";
}return retorno;
}%>
<html>
<body>
</body>
</html>
Nesse trecho de código, código 7-11, uma função é definida dentro de uma página JSP.
Essa função é bastante simples, ela simula o ³lançamento de uma moeda para cima´ e
escolhe, aleatoriamente, entre cara ou coroa.
Imagine agora que queremos que a função simule o ³lançamento da moeda´ várias
vezes seguidas. Podemos alterar o código anterior e chamarmos a função várias vezes:
<html>
<body>
</body>
</html>
Essa, solução, apresentada no código 7-12, apesar de funcionar, não é a mais adequada.
Podemos reescrever a função para receber como parâmetros a quantidades de jogadas
que deverão ser efetuadas e fornecer um meio para que a função possa escrever o
conteúdo na página JSP:
<%!
try{
//número entre 0 e 10
if(i==0){
o.print("cara");
} else {
o.print("coroa");
}if (k==numeroJogadas){
o.print("!");
} else {
o.print(", ");
} catch(Exception e){}
}%>
<html>
<body>
</body>
</html>
Código 7-13: Um uso mais adequado de método dentro da JSP.
Passamos
como
parâmetro
um
objeto
da
interface
É importante aprender que não podemos chamar o objetoo ut (ou qualquer outro objeto
implícito) diretamente em uma função declarada dentro de uma página JSP. Portanto, o
seguinte código está errado e apresentará um erro em tempo de compilação:
<%!
int i = Math.random();
i = i*10;
i = i%2;
if(i==0){
out.print("cara");
} else {
out.print("coroa");
}if(k==numeroJogadas){
out.print("!");
} else {
out.print(", ");
}%>
<html>
<body>
</body>
</html>
Exercício 2: Neste exercício você irá utilizar o objeto implícito session. Iremos
utilizar este objeto para validar se o usuário esta logado e então permitir que as
páginas possam ser acessadas por ele. Siga abaixo os passos para isto.
arquivo faça uso do objeto implícito session da seguinte maneira para validar se o
usuário está logado ou não, ou seja, se passou pelo controller e era um usuário válido.
<%
if ( usr == null ) {
response.sendRedirect(url);
return;
}if ( ! usr.getId().equals(idPagina) ) {
response.sendRedirect(url);
return;
%>
Exercício 3: sgora você irá contruir uma página para exibir os erros de exception
que podem ser gerados nas páginas JSP do seu sistema. Para isto construa uma página
JSP que possa ter acesso ao objeto implícito exception e através do uso deste mostre a
mensagem de erro de forma a informar o usuário o problema que aconteceu. Lembre-se
de utilizar a diretiva page com o atributo isErrorPage e
<%@page
errorPage="error.jsp" %>
àà
Umcookie nada mais é que um bloco de informação que é enviado do servidor para o
navegador no cabeçalho página. s partir de então, dependendo do tempo de validade
docookie, o navegador reenvia essa informação para o servidor a cada nova requisição.
Dependo do caso oco o kie é também armazenado no disco da máquina cliente e quando
o site é novamente visitado ocooki e é enviado para o servidor, fornecendo a informação
desejada.
É necessário associar os itens selecionados para compra com o usuário que deseja
adquiri-los. Na maioria das vezes a seleção dos itens de compra é feita por meio da
navegação de várias páginas do site e a todo instante é necessário distinguir os usuários
que estão realizando as requisições.
É necessário saber que usuário está acessando o site para, de acordo com o seu perfil,
fornecer uma visualização e um conjunto de funcionalidades adequadas às suas
preferências.
Todas essas necessidades não podem ser atendidas com o uso básico do
protocolo HTTP, uma vez que ele não é orientado à sessão ou conexão. Com os
cookies é possível contornar essa deficiência, uma vez que as informações que
são neles armazenadas podem ser usadas para identificar os clientes. Existem outras
formas de contornar a deficiência do protocolo de HTTP, como a codificação de URL e
o uso de campos escondidos nas páginas HTML, mas o uso decookies é simples e
padronizada. No entanto, o usuário pode impedir que o navegador aceitecooki es, o que
torna o ato de navegar pelaWeb muito desagradável. Neste caso, é necessário utilizar as
outras técnicas para controle de sessão.
<html>
<body>
<h3>Teste de Cookies</h3>
<%
if (cookies.length > 0) {
cookie.setPath("/");
<%}
}String cName = request.getParameter("cookienome");
cookie.setPath("/");
response.addCookie(cookie);
%>
</body>
</html>
cookie é enviado para o navegador por meio do métodoaddC ook ie( ) do objeto
página, o métodoaddC ook i e() deve ser chamado antes do envio de qualquer conteúdo
para o navegador. Para recuperar oscookies enviados pelo navegador usa-se o
métodoget Cookies () do objetoHttpServle tRequ est que retorna um array deCookie. Os
métodos getN ame( ) eg etVal ue() do objeto
socookie.
Os objetos da classeCo o ki e possuem vários métodos para controle do uso decookies.
É possível definir tempo de vida máximo docookie, os domínios que devem receber oco
o ki e (por default o domínio que deve receber ocoo ki e é o que o criou), o diretório da
página que deve receber oc o okie, se oco o ki e deve ser enviado somente sob um
protocolo seguro e etc. Por exemplo, para definir a idade máxima de umcookie devemos
utilizar o métodos etM axs ge(), passando um inteiro como parâmetro. Se o inteiro for
positivo indicará em segundos o tempo máximo de vida docookie. Um valor negativo
indica que oco o kie deve apagado quando o navegador terminar. O valor zero indica
que o cookie deve ser apagado imediatamente. O trecho de código do código 8-2 mostra
algumas alterações no comportamento default de umcookie.
...
não *.instrutor.targettrust.com.br
...
Também é importante definir qual o caminho URL do qual o cookie pode ser acessado,
através do métodosetPath (), em geral é utilizado na forma: cookie.setPath(³/´). Este
comando indica que todas as páginas neste servidor devem receber o cookie de volta.
Gerenciando Cookies
Oscookies são definidos por um servidor da web. Quando um usuário solicita um URL
cujo servidor e diretório correspondam àqueles de um ou mais de seuscookies
armazenados, oscookies correspondentes são enviados de volta para o servidor. ss
páginas JSP acessam os seus cookies associados através do métodogetC ook i es() do
objeto implícitor equest. De forma similar, as páginas JSP podem criar ou alterarcookies
através do métodoaddCook ie () do objeto implícitore spo n se. Esses métodos são
resumidos na tabela abaixo:
request
getCookies()
acessíveis da página
response
addCookie()
s classe Cookie
Essa classe fornece apenas um tipo de construtor que recebe duas variáveis do tipo
String, que representam o nome e o valor do cookie. O cookie tem a seguinte sintaxe:
Método
Descrição
String getName()
String getValue()
String getDomain()
String getPath()
boolean getSecure()
Definindo um cookie
O primeiro passo, então, ao usar um cookie dentro de uma página, é defini-lo. Isto é
feito criando uma instância da classe Cookie e chamando os métodos "sets" para definir
os valores de seus atributos.
<%
cookieJSP.setMaxsge(7 * 24 * 60 * 60);
cookieJSP.setVersion(0);
//indica que o cookie deve ser transferido pelo protocolo HTTP padrão
cookieJSP.setSecure(false);
cookieJSP.setComment("Email do visitante");
cookieJSP.setPath("/");
//grava o cookie na máquina do usuário
response.addCookie(cookieJSP);
%>
<html>
<head>
<title>Grava Cookie</title>
</head>
<body>
<h1>Grava Cookie</h1>
</body></html>
Vamos criar uma página html com um formulário que irá fornecer um e-
<html>
<body>
<form action="addCookie.jsp">
</body>
</html>
<%
//null
if (listaPossiveisCookies != null) {
if (listaPossiveisCookies[i].getName().equals(cookieName)) {
cookieJSP = listaPossiveisCookies[i];
cookieJSP.setPath("/");
break;
}
}%>
<html>
<body>
<h1>Lê Cookie</h1>
<% } %>
</body>
</html>
resultado:
Tela
ultrapassar 4K.
Exercícios
este recurso a nossa aplicação. Para isto você deve seguir os seguintes passos:
// Criar cookies
cLogin.setPath("/");
cSenha.setPath("/");
response.addCookie( cSenha );
request se há estes cookies, caso existam você deve exibir os valores dos mesmos nos
campos de login e senha. O código abaixo mostra como os cookies podem ser
procurados no request:
<%
Cookie c = cookies[i];
if (c.getName().equalsIgnoreCase("login")) {
login = c.getValue();
}if (c.getName().equalsIgnoreCase("senha")) {
senha = c.getValue();
%>
OUTROS EXERCÍCIOS
Exercícios
Nestes exercícios iremos terminar a aplicação web para a entrega do material didático.
s partir dos exercícios realizados nos capítulos anteriores, implemente as
funcionalidades ainda não realizadas como:
que você realizou no decorrer do capítulo 6. Para isto siga os passos abaixo:
<select name="unidadeTreinamento">
UnidadeTreinamentoBean un = (UnidadeTreinamentoBean)unidades.get(i);
%>
<% } %>
</select>
public String
insert(CursoBean curso)
<%
%>
Exercício 2: sgora faremos a página JSP que pode gravar o responsável pelo
material didático. Esta página não fará uso de java beans. Siga os passoa abaixo
para isto:
...
<select name="curso">
<% Vector cursos = CursoDB.getCursos();
%>
<% } %>
</select>
...
<select name="instrutor">
%>
<% } %>
</select>
...
entrega do material didático. Você irá utilizar o método abaixo, observe que
int codigoInstrutor,
java.sql.Date dataPrevista,
float royalty)
Veja abaixo o código exemplo para isto que você deverá ter em uma
página JSP:
<%
Exercício 3: Neste exercício você irá fazer o upload e download do material para
dentro do banco de dados. O seu instrutor irá fornecer dois arquivos com as páginas JSP
e seus formulários para que este processo possa ser feito. Os arquivos são
uploadMaterial.jsp e downloadMaterial.jsp. sbaixo as figuras que mostram como estes
arquivos serão exibidos no browser. Siga abaixo os passos para realizar este exercício:
UploadServlet no arquivo web.xml para que os mesmos possam ser reconhecidos pelo
TomCat como servlets. Estes servlets serão fornecidos pelo seu instrutor. Veja o
mapeamento (servlet-mapping) dos mesmos para que no formulário das páginas acima
você os chame corretamente.
Exercício 4: Neste exercício você irá validar o usuário para saber se ele é um
instrutor ou não. sté o momento não foi feita esta validação. sgora vamos realizar
modificações no controller para podermos então diferenciar entre um administrador, um
instrutor e um usuário inválido. Para isto altere o seu controller fazendo uso do método
localizado na classe InstrutorDB com a seguinte assinatura:
Observe que este método retorna um objeto da classe InstrutorBean, aquel bean que
você criou. Este objeto contém informações sobre o instrutor, como, por exemplo, o seu
nome. Você deve utilizar estas informações para o objeto a ser adicionado na sessão e
que identifica o usuário logado. O código abaixo pode ser utilizado como modelo:
// Verificar se é instrutor
if ( inst != null ) {
session.getId() );
session.setsttribute("usuario", u);
contexto.getRequestDispatcher(URL_INST_HOME).forward(request, response);
return;
} else {
response.sendRedirect( URL_LOGIN );
return;