Anda di halaman 1dari 82

UNIVERSIDADE FEDERAL DE VIOSA

DEPARTAMENTO DE INFORMTICA
Apostila Servlet/JSP
Alcione de Paiva Oliveira
2001
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
1
Sumrio
I Servlets e J SP...............................................................................................................2
SERVLETS ................................................................................................................................ 2
Applets X Servlets............................................................................................................... 3
CGI X Servlets .................................................................................................................... 4
A API SERVLET....................................................................................................................... 4
Exemplo de Servlet ............................................................................................................. 6
COMPILANDO O SERVLET......................................................................................................... 8
Instalando o Tomcat ........................................................................................................... 8
PREPARANDO PARA EXECUTAR O SERVLET............................................................................ 12
Compilando o Servlet ....................................................................................................... 12
Criando uma aplicao no Tomcat .................................................................................. 12
EXECUTANDO O SERVLET...................................................................................................... 13
Invocando diretamente pelo Navegador........................................................................... 13
Invocando em uma pgina HTML.................................................................................... 14
Diferenas entre as requisies GET e POST.................................................................. 14
CONCORRNCIA..................................................................................................................... 15
OBTENDO INFORMAES SOBRE A REQUISIO.................................................................... 17
LIDANDO COM FORMULRIOS................................................................................................ 19
LIDANDO COM COOKIES......................................................................................................... 21
LIDANDO COM SESSES......................................................................................................... 24
J SP......................................................................................................................................... 28
PHP X JSP ....................................................................................................................... 29
ASP X JSP ........................................................................................................................ 30
Primeiro exemplo em JSP ................................................................................................ 30
Executando o arquivo JSP................................................................................................ 31
Objetos implcitos............................................................................................................. 32
Tags JSP........................................................................................................................... 33
Comentrios ..................................................................................................................... 37
Diretivas ........................................................................................................................... 37
Extraindo Valores de Formulrios................................................................................... 40
Criando e Modificando Cookies....................................................................................... 41
Lidando com sesses ........................................................................................................ 43
O Uso de JavaBeans......................................................................................................... 45
REENCAMINHANDO OU REDIRECIONANDO REQUISIES....................................................... 53
UMA ARQUITETURA PARA COMRCIO ELETRNICO............................................................... 55
Tipos de aplicaes na WEB............................................................................................ 55
Arquitetura MVC para a Web .......................................................................................... 55
Agenda Web: Um Exemplo de uma aplicao Web usando a arquitetura MVC.............. 58
Bibliografia.....................................................................................................................79
Links ..............................................................................................................................80
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
2
I Servlets e JSP
Servlets e J SP so duas tecnologias desenvolvidas pela Sun para
desenvolvimento de aplicaes na Web a partir de componentes J ava que
executem no lado servidor. Essas duas tecnologias fazem parte da plataforma
J 2EE (J ava 2 Platform Enterprise Edition) que fornece um conjunto de
tecnologias para o desenvolvimento de solues escalveis e robustas para a
Web. Neste livro abordaremos apenas as tecnologias Servlets e J SP, sendo o
suficiente para o desenvolvimento de sites dinmicos de razovel
complexidade. Se a aplicao exigir uma grande robustez e escalabilidade o
leitor deve considerar o uso em conjunto de outras tecnologias da plataforma
J 2EE.
Servlets
Servlets so classes J ava que so instanciadas e executadas em
associao com servidores Web, atendendo requisies realizadas por meio do
protocolo HTTP. Ao serem acionados, os objetos Servlets podem enviar a
resposta na forma de uma pgina HTML ou qualquer outro contedo MIME.
Na verdade os Servlets podem trabalhar com vrios tipos de servidores e no s
servidores Web, uma vez que a API dos Servlets no assume nada a respeito do
ambiente do servidor, sendo independentes de protocolos e plataformas. Em
outras palavras Servlets uma API para construo de componentes do lado
servidor com o objetivo de fornecer um padro para comunicao entre clientes
e servidores. Os Servlets so tipicamente usados no desenvolvimento de sites
dinmicos. Sites dinmicos so sites onde algumas de suas pginas so
construdas no momento do atendimento de uma requisio HTTP. Assim
possvel criar pginas com contedo varivel, de acordo com o usurio, tempo,
ou informaes armazenadas em um banco de dados.
Servlets no possuem interface grfica e suas instncias so executadas
dentro de um ambiente J ava denominado de Container. O container gerencia as
instncias dos Servlets e prov os servios de rede necessrios para as
requisies e respostas. O container atua em associao com servidores Web
recebendo as requisies reencaminhada por eles. Tipicamente existe apenas
uma instncia de cada Servlet, no entanto, o container pode criar vrios threads
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
3
de modo a permitir que uma nica instncia Servlet atenda mais de uma
requisio simultaneamente A figura XX fornece uma viso do relacionamento
destes componentes.
Figura I-1. Relacionamento entre Servlets, container e servidor Web
Servlets provem uma soluo interessante para o relacionamento
cliente/servidor na Internet, tornando-se uma alternativa para a implantao de
sistemas para a Web. Antes de entrarmos em detalhes na construo de
Servlets, compararemos esta soluo com outras duas solues possveis para
implantao de aplicaes na Internet.
Applets X Servlets
Apesar de ser uma soluo robusta existem problemas no uso de Applets para
validao de dados e envio para o servidor. O programador precisa contar com
o fato do usurio possuir um navegador com suporte a J ava e na verso
apropriada. Voc no pode contar com isso na Internet, principalmente se voc
deseja estender a um grande nmero de usurio o acesso s suas pginas. Em se
tratando de Servlets, no lado do cliente pode existir apenas pginas HTML,
evitando restries de acesso s pginas. Em resumo, o uso de Applets no
recomendado para ambientes com mltiplos navegadores ou quando a
semntica da aplicao possa ser expressa por componentes HTML.
Servidor
Web
Requisies
Mquina Virtual J ava
Container
Instncias de Servlets
Respostas
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
4
CGI X Servlets
Como visto no Erro! A origem da referncia no foi encontrada.,
scripts CGI (Common Gateway Interface), acionam programas no servidor. O
uso de CGI sobrecarrega o servidor uma vez cada requisio de servio acarreta
a execuo de um programa executvel (que pode ser escrito em com qualquer
linguagem que suporte o padro CGI) no servidor, alm disso, todo o
processamento realizado pelo CGI no servidor. Se houver algum erro na
entrada de dados o CGI tem que produzir uma pgina HTML explicando o
problema. J os Servlets so carregados apenas uma vez e como so executados
de forma multi-thread podem atender mais de uma mesma solicitao por
simultaneamente. Verses posteriores de CGI contornam este tipo de problema,
mas permanecem outros como a falta de portabilidade e a insegurana na
execuo de cdigo escrito em uma linguagem como C/C++.
A API Servlet
A API Servlet composta por um conjunto de interfaces e Classes. O
componente mais bsico da API interface Servlet. Ela define o
comportamento bsico de um Servlet. A figura 1 mostra a interface Servlet.
public interface Servlet {
public void init(ServletConfig config)
throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req,
ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
Figura 1. Interface Servlet.
O mtodo service() responsvel pelo tratamento de todas das
requisies dos clientes. J os mtodos init() e destroy() so chamados
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
5
quando o Servlet carregado e descarregado do container, respectivamente. O
mtodo getServletConfig() retorna um objeto ServletConfig que
contm os parmetros de inicializao do Servlet. O mtodo
getServletInfo() retorna um String contendo informaes sobre o
Servlet, como verso e autor.
Tendo como base a interface Servlet o restante da API Servlet se
organiza hierarquicamente como mostra a figura 2.
Figura 2. Hierarquia de classes da API Servlet.
A classe GenericServlet implementa um servidor genrico e
geralmente no usada. A classe HttpServlet a mais utilizada e foi
especialmente projetada para lidar com o protocolo HTTP. A figura 3 mostra a
definio da classe interface HttpServlet.
HttpServlet
public abstract class HttpServlet
extends GenericServlet
implements java.io.Serializable
Figura 3. Definio da classe HttpServlet.
Servlet
GenericServlet
HttpServlet
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
6
Note que a classe HttpServlet uma classe abstrata. Para criar um
Servlet que atenda requisies HTTP o programador deve criar uma classe
derivada da HttpServlet e sobrescrever pelo menos um dos mtodos
abaixo:
doGet Trata as requisies HTTP GET.
doPost Trata as requisies HTTP POST.
doPut Trata as requisies HTTP PUT.
doDelete Trata as requisies HTTP DELETE.
Tabela XV.XX. Mtodos da classe HttpServlet que devem ser
sobrescritos para tratar requisies HTTP.
Todos esses mtodos so invocados pelo servidor por meio do mtodo
service(). O mtodo doGet() trata as requisies GET. Este tipo de
requisio pode ser enviada vrias vezes, permitindo que seja colocada em um
bookmark. O mtodo doPost() trata as requisies POST que permitem que
o cliente envie dados de tamanho ilimitado para o servidor Web uma nica vez,
sendo til para enviar informaes tais como o nmero do carto de crdito. O
mtodo doPut() trata as requisies PUT. Este tipo de requisio permite
que o cliente envie um arquivo para o servidor semelhana de como feito
via FTP. O mtodo doPut() trata as requisies DELETE, permitindo que o
cliente remova um documento ou uma pgina do servidor. O mtodo
service(), que recebe todas as requisies, em geral no sobrescrito,
sendo sua tarefa direcionar a requisio para o mtodo adequado.
Exemplo de Servlet
Para entendermos o que um Servlet nada melhor que um exemplo
simples. O exemplo XV.XX gera uma pgina HTML em resposta a uma
requisio GET. A pgina HTML gerada contm simplesmente a frase Ola
mundo!!!. Este um Servlet bem simples que ilustra as funcionalidades bsicas
da classe.
import javax.servlet.*;
import javax.servlet.http.*;
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
7
public class Ola extends HttpServlet
{
public String getServletInfo() {return "Ola verso 0.1";}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/html");
java.io.PrintWriter out =res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>Ola mundo!!!");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Exemplo XV.XX. Servlet Ola.
O mtodo doGet() recebe dois objetos: um da classe
HttpServletRequest e outro da classe HttpServletResponse. O
HttpServletRequest responsvel pela comunicao do cliente para o
servidor e o HttpServletResponse responsvel pela comunicao do
servidor para o cliente. Sendo o exemplo XV.XX apenas um exemplo simples
ele ignora o que foi enviado pelo cliente, tratando apenas de enviar uma pgina
HTML como resposta. Para isso utilizado o objeto da classe
HttpServletResponse. Primeiramente usado o mtodo
setContentType() para definir o tipo do contedo a ser enviado ao cliente.
Esse mtodo deve ser usado apenas uma vez e antes de se obter um objeto do
tipo PrintWriter ou ServletOutputStream para a resposta. Aps isso
usado o mtodo getWriter() para se obter um objeto do tipo
PrintWriter que usado para escrever a resposta. Neste caso os dados da
resposta so baseados em caracteres. Se o programador desejar enviar a
resposta em bytes deve usar o mtodo getOutputStream() para obter um
objeto OutputStream. A partir de ento o programa passa usar o objeto
PrintWriter para enviar a pgina HTML.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
8
Compilando o Servlet
A API Servlet ainda no foi incorporado ao SDK, portanto, para
compilar um Servlet preciso adicionar a API Servlet ao pacote SDK. Existem
vrias formas de se fazer isso. A Sun fornece a especificao da API e diversos
produtores de software executam a implementao. Atualmente, a
especificao da API Servlet est na verso 2.XX. Uma das implementaes da
API que pode ser baixada gratuitamente pela Internet a fornecida pelo projeto
J akarta (http://jakarta.apache.org) denominada de Tomcat. A
implementao da API Servlet feita pelo projeto J akarta a implementao de
referncia indicada pela Sun. Ou seja, a implementao que os outros
fabricantes devem seguir para garantir a conformidade com a especificao da
API. No entanto, uma vez que o Tomcat a implementao mais atualizada da
API, tambm a menos testada e, por consequncia, pode no ser a mais
estvel e com melhor desempenho.
Instalando o Tomcat
Assim como para se executar um Applet era preciso de um navegador
Web com J ava habilitado no caso de Servlets preciso de servidor Web que
execute J ava ou que passe as requisies feitas a Servlets para programas que
executem os Servlets. O Tomcat tanto a implementao da API Servlet como
a implementao de um container, que pode trabalhar em associao com um
servidor Web como o Apache ou o IIS, ou pode tambm trabalhar
isoladamente, desempenhando tambm o papel de um servidor Web. Nos
exemplos aqui mostrados usaremos o Tomcat isoladamente. Em um ambiente
de produo esta configurao no a mais adequada, uma vez que os
servidores Web possuem um melhor desempenho no despacho de pginas
estticas. As instrues para configurar o Tomcat para trabalhar em conjunto
com um servidor Web podem ser encontradas junto s instrues gerais do
programa. As figuras 4 e 5 ilustram essas duas situaes.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
9
Figura 4. Servidor Web habilitado para Servlet.
Figura 5. Servidor Web reencaminhando as requisies para o Servlet
container.
A verso estvel do Tomcat a 3.2.3.XX aps baix-la do site do
projeto J akarta o usurio deve descomprimir o arquivo. Por exemplo, no
ambiente Windows o usurio pode descomprimir o arquivo na raiz do disco C:,
o que gerar a seguinte rvore de diretrios:
C:\ jakarta-tomcat-3.2.3
|
|______bin
|______conf
|______doc
|______lib
|______logs
|______src
|______webapps
No diretrio bin encontram-se os programas execuo e interrupo do
container Tomcat. No diretrio conf encontram-se os arquivos de
configurao. No diretrio doc encontram-se os arquivos de documentao. No
Servidor Web
Servlet habilitado
Internet
Internet Servidor Web
Servlet Container
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
10
diretrio lib encontram-se os bytecodes do container e da implementao da
API. No diretrio logs so registradas as mensagens da geradas durante a
execuo do sistema. No diretrio src encontram-se os arquivos fontes do
container e da implementao da API de configurao. Finalmente, No
diretrio webapps encontram-se as pginas e cdigos das aplicaes dos
usurios.
No ambiente MS-Windows aconselhamos usar um nome dentro do
formato 8.3 (oito caracteres para o nome e trs para o tipo). Assim o diretrio
jakarta-tomcat-3.2.3 poderia ser mudado para simplesmente tomcat.
Antes de executar o Tomcat necessrio definir duas variveis de
ambiente. Por exemplo, supondo que no MS-Windows o Tomcat foi instalado
no diretrio c:\tomcat e que o SDK est instalado no diretrio c:\jdk1.3
ento as seguintes variveis de ambiente devem ser definidas:
set JAVA_HOME=C:\jdk1.3
set TOMCAT_HOME=C:\tomcat
Agora possvel executar o Tomcat por meio do seguinte comando:
C:\tomcat\bin\startup.bat
Para interromper a execuo servidor basta executar o arquivo
c:\tomcat\bin\shutdown.bat
Falta de espao para variveis de ambiente
Caso ao iniciar o servidor aparea a mensagem sem espao de ambiente
clique com o boto direito do mouse no arquivo .bat e edite as propriedades definindo o
ambiente inicial com 4096. Feche o arquivo execute novamente.
Ao entrar em execuo o servidor l as configuraes constantes no
arquivo server.xml e, por default, se anexa porta 8080. Para verificar se o
programa est funcionando corretamente execute um navegador como o
Netscape ou o Internet Explorer e digite a seguinte URL:
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
11
http://127.0.0.1:8080/index.html
A figura 6 mostra a tela principal do Tomcat.
Figura 6. Tela inicial do Tomcat.
A nmero porta default para recebimento das requisies HTTP pode
ser alterada por meio da edio do arquivo server.xml do diretrio conf
como mostrado abaixo:
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
<Parameter name="port" value="Nmero da porta"/>
</Connector>
No entanto, caso o Tomcat esteja operando em conjunto com um
servidor, o ideal que o Tomcat no responda requisies diretamente.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
12
Preparando para executar o Servlet
Compilando o Servlet
Antes de executar o Servlet e preciso compil-lo. Para compil-lo
preciso que as classes que implementam a API Servlet estejam no classpath.
Para isso preciso definir a varivel de ambiente. No ambiente MS-Windows
seria
set CLASSPATH=%CLASSPATH%;%TOMCAT_HOME%\lib\servlet.jar
e no ambiente Unix seria
CLASSPATH=${CLASSPATH}:${TOMCAT_HOME}/lib/servlet.jar
Alternativamente, possvel indicar o classpath na prpria linha de
execuo do compilador J ava. Por exemplo, No ambiente MS-Windows ficaria
na seguinte forma:
javac -classpath "%CLASSPATH%;c:\tomcat\lib\servlet.jar Ola.java
Criando uma aplicao no Tomcat
Agora preciso definir onde deve ser colocado o arquivo compilado.
Para isso preciso criar uma aplicao no Tomcat ou usar uma das aplicaes
j existentes. Vamos aprender como criar uma aplicao no Tomcat. Para isso
preciso cria a seguinte estrutura de diretrios abaixo do diretrio webapps do
Tomcat:
webapps
|_____ Nome aplicao
|_____ Web-inf
|_____classes
Diretrio de Aplicaes
Na verdade possvel definir outro diretrio para colocar as aplicaes do Tomcat.
Para indicar outro diretrio preciso editar o arquivo server.xml e indicar o diretrio por
meio da diretiva home do tag ContextManager.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
13
O diretrio de uma aplicao denominado de contexto da aplicao.
preciso tambm editar o arquivo server.xml do diretrio conf, incluindo
as linhas:
<Context path="/nome aplicao"
docBase="webapps/ nome aplicao" debug="0
reloadable="true" >
</Context>
Finalmente, preciso criar (ou copiar de outra aplicao) um arquivo
web.xml no diretrio Web-inf com o seguinte contedo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
</web-app>
Copie ento o arquivo compilado Ola.class para o subdiretrio
/webapps/nome aplicao/Web-inf/classes do Tomcat.
Executando o Servlet
Invocando diretamente pelo Navegador
Podemos executar um Servlet diretamente digitando a URL do Servlet
no navegador. A URL em geral possui o seguinte formato:
http://mquina:porta/nome aplicao/servlet/nome servlet
A palavra servlet que aparece na URL no indica um subdiretrio no
servidor. Ela indica que esta uma requisio para um Servlet. Por exemplo,
suponha que o nome da aplicao criada no Tomcat seja teste. Ento a URL
para a invocao do Servlet do exemplo XX.XX teria a seguinte forma:
http://localhost:8080/teste/servlet/Ola
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
14
A URL para a chamada do Servlet pode ser alterada de modo a ocultar
qualquer referncia diretrios ou a tecnologias de implementao. No caso do
Tomcat essa configurao no arquivo web.xml do diretrio Web-inf da
aplicao. Por exemplo, para eliminar a palavra servlet da URL poderamos
inserir as seguintes linhas no arquivo web.xml entre os tags <web-app> e
</web-app>:
<servlet>
<servlet-name>
Ola
</servlet-name>
<servlet-class>
Ola
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
Ola
</servlet-name>
<url-pattern>
/Ola
</url-pattern>
</servlet-mapping>
Invocando em uma pgina HTML
No caso de uma pgina HTML basta colocar a URL na forma de link.
Por exemplo,
<a href="http://localhost:8080/teste/servlet/Ola>Servlet Ola</a>
Neste caso o Servlet Ola ser solicitado quando o link associado ao
texto Servlet Ola for acionado.
Diferenas entre as requisies GET e POST
Os dois mtodos mais comuns, definidos pelo protocolo HTTP, de se
enviar uma requisies a um servidor Web so os mtodos POST e GET.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
15
Apesar de aparentemente cumprirem a mesma funo, existem diferenas
importantes entre estes dois mtodos. O mtodo GET tem por objetivo enviar
uma requisio por um recurso. As informaes necessrias para a obteno do
recurso (como informaes digitadas em formulrios HTML) so adicionadas
URL e, por consequncia, no so permitidos caracteres invlidos na formao
de URLs, como por espaos em branco e caracteres especiais. J na requisio
POST os dados so enviados no corpo da mensagem.
O mtodo GET possui a vantagem de ser idempotente, ou seja, os
servidores Web podem assumir que a requisio pode ser repetida, sendo
possvel adicionar URL ao bookmark. Isto muito til quando o usurio
deseja manter a URL resultante de uma pesquisa. Como desvantagem as
informaes passadas via GET no podem ser muito longas, um vez o nmero
de caracteres permitidos por volta de 2K.
J as requisies POST a princpio podem ter tamanho ilimitado. No
entanto, elas no so idempotente, o que as tornam ideais para formulrios onde
os usurios precisam digitar informaes confidenciais, como nmero de carto
de crdito. Desta forma o usurio obrigado a digitar a informao toda vez
que for enviar a requisio, no sendo possvel registrar a requisio em um
bookmark.
Concorrncia
Uma vez carregado o Servlet no mais descarregado, a no ser que o
servidor Web tenha sua execuo interrompida. De modo geral, cada requisio
que deve ser direcionada a determinada instncia de Servlet tratada por um
thread sobre a instncia de Servlet. Isto significa que se existirem duas
requisies simultneas que devem ser direcionadas para um mesmo objeto o
container criar dois threads sobre o mesmo objeto Servlet para tratar as
requisies. A figura 7 ilustra esta situao.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
16
Figura 7. Relacionamento entre as instncias dos Servlets e os threads.
Em conseqncia disto temos o benefcios de uma sobrecarga para
servidor, uma vez que a criao de threads menos onerosa do que a criao de
processos, e uma aparente melhora no tempo de resposta.
Por outro lado, o fato dos Servlets operarem em modo multi-thread
aumenta a complexidade das aplicaes e cuidados especiais, como visto no
captulo sobre concorrncia, devem tomados para evitar comportamentos
errticos. Por exemplo, suponha um Servlet que receba um conjunto de
nmeros inteiros e retorne uma pgina contendo a soma dos nmeros. A
exemplo XX.XX mostra o cdigo do Servlet. O leitor pode imaginar um cdigo
muito mais eficiente para computar a soma de nmeros, mas o objetivo do
cdigo do exemplo ilustrar o problema da concorrncia em Servlets. O
exemplo contm tambm um trecho de cdigo para recebimento de valores de
formulrios, o que ser discutido mais adiante.
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Soma extends HttpServlet {
Vector v =new Vector(5);
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, java.io.IOException {
v.clear();
Enumeration e =req.getParameterNames();
while (e.hasMoreElements()) {
String name =(String)e.nextElement();
Servlet2
thread1
Servlet1
thread2
thread1
usurio1
usurio2
usurio3
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
17
String value =req.getParameter(name);
if (value !=null) v.add(value);
}
res.setContentType("text/html");
java.io.PrintWriter out =res.getWriter();
out.println("<html>");
out.println("<head><title>Servlet</title></head>");
out.println("<body>");
out.println("<h1>A soma e'");
int soma =0;
for(int i =0; i<v.size() ; i++) {
soma +=Integer.parseInt((String)v.get(i));
}
out.println(soma);
out.println("<h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Exemplo XX.XX- Servlet com problemas de concorrncia.
Note que o Servlet utiliza uma varivel de instncia para referenciar o
Vector que armazena os valores. Se no forem usadas primitivas de
sincronizao (como no cdigo do exemplo) e duas requisies simultneas
chegarem ao Servlet o resultado pode ser inconsistente, uma vez que o Vector
poder conter parte dos valores de uma requisio e parte dos valores de outra
requisio. Neste caso, para corrigir esse problema basta declarar a varivel
como local ao mtodo doPost() ou usar primitivas de sincronizao.
Obtendo Informaes sobre a Requisio
O objeto HttpServletRequest passado para o Servlet contm
vrias informaes importantes relacionadas com a requisio, como por
exemplo o mtodo empregado (POST ou GET), o protocolo utilizado, o
endereo remoto, informaes contidas no cabealho e muitas outras. O Servlet
do exemplo XX.XX retorna uma pgina contendo informaes sobre a
requisio e sobre o cabealho da requisio.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
18
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestInfo extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/html");
PrintWriter out =res.getWriter();
out.println("<html><head>");
out.println("<title>Exemplo sobre Requisicao de Info </title>");
out.println("</head><body>");
out.println("<h3>Exemplo sobre Requisicao de Info </h3>");
out.println("Metodo: " +req.getMethod()+<br>);
out.println("Request URI: " +req.getRequestURI()+<br>);
out.println("Protocolo: " +req.getProtocol()+<br>);
out.println("PathInfo: " +req.getPathInfo()+<br>);
out.println("Endereco remoto: " +req.getRemoteAddr()+<br><br>);
Enumeration e =req.getHeaderNames();
while (e.hasMoreElements())
{
String name =(String)e.nextElement();
String value =req.getHeader(name);
out.println(name +" =" +value+"<br>");
}
out.println("</body></html>");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
doGet(req, res);
}
}
Exemplo XX.XX- Servlet que retorna as informaes sobre a requisio.
Note que o mtodo doPost() chama o mtodo doGet(), de modo
que o Servlet pode receber os dois tipos de requisio. A figura 8 mostra o
resultado de uma execuo do Servlet do exemplo XX.XX.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
19
Exemplo sobre Requisicao de Info
Metodo: GET
Request URI: /servlet/RequestInfo
Protocolo: HTTP/1.0
PathInfo: null
Endereco remoto: 127.0.0.1
Connection =Keep-Alive
User-Agent =Mozilla/4.7 [en] (Win95; I)
Pragma =no-cache
Host =localhost:8080
Accept =image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding =gzip
Accept-Language =en
Accept-Charset =iso-8859-1,*,utf-8
Figura 8. Sada da execuo do Servlet que exibe as informaes sobre a
requisio.
Lidando com Formulrios
Ser capaz de lidar com as informaes contidas em formulrios HTML
fundamental para qualquer tecnologia de desenvolvimento de aplicaes para
Web. por meio de formulrios que os usurios fornecem dados, preenchem
pedidos de compra e (ainda mais importante) digitam o nmero do carto de
crdito. As informaes digitadas no formulrio chegam at o Servlet por meio
do objeto HttpServletRequest e so recuperadas por meio do mtodo
getParameter() deste objeto. Todo item de formulrio HTML possui um
nome e esse nome passado como argumento para o mtodo
getParameter() que retorna na forma de String o valor do item de
formulrio.
O Servlet do exemplo XX.XX exibe o valor de dois itens de formulrios
do tipo text. Um denominado nome e o outro denominado de sobrenome.
Em seguida o Servlet cria um formulrio contendo os mesmos itens de
formulrio. Note que um formulrio criado por meio do tag <form>. Como
parmetros opcionais deste tag temos mtodo da requisio (method), a
URL para onde ser submetida a requisio (action). No caso do exemplo, o
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
20
mtodo adotado o POST e a requisio ser submetida ao prprio Servlet
Form.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Form extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/html");
PrintWriter out =res.getWriter();
out.println("<html>");
out.println("<head><title>Trata formulario</title></head>");
out.println("<body bgcolor=\"white\">");
out.println("<h3>Trata formulario</h3>");
String nome =req.getParameter("nome");
String sobreNome =req.getParameter("sobrenome");
if (nome !=null || sobreNome !=null)
{
out.println("Nome =" +nome +"<br>");
out.println("Sobrenome =" +sobreNome);
}
out.println("<P>");
out.print("<form action=\"Form\" method=POST>");
out.println("Nome : <input type=text size=20 name=nome><br>");
out.println("Sobrenome: <input type=text size=20 name=sobrenome><br>");
out.println("<input type=submit>");
out.println("</form>");
out.println("</body></html>");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
doGet(req, res);
}
}
Exemplo XX.XX- Servlet para lidar com um formulrio simples.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
21
Lidando com Cookies
Um cookie nada mais que um bloco de informao que enviado do
servidor para o navegador no cabealho pgina. A partir de ento, dependendo
do tempo de validade do cookie, o navegador reenvia essa informao para o
servidor a cada nova requisio. Dependo do caso o cookie tambm
armazenado no disco da mquina cliente e quando o site novamente visitado o
cookie enviado novamente para o servidor, fornecendo a informao desejada.
Os cookies foram a soluo adotada pelos desenvolvedores do Netscape
para implementar a identificao de clientes sobre um protocolo HTTP que no
orientado conexo. Esta soluo, apesar das controvrsias sobre a
possibilidade de quebra de privacidade, passou ser amplamente adotada e hoje
os cookies so parte integrante do padro Internet, normalizados pela norma
RFC 2109.
A necessidade da identificao do cliente de onde partiu a requisio e o
monitoramento de sua interao com o site (denominada de sesso)
importante para o desenvolvimento de sistemas para a Web pelas seguintes
razes:
necessrio associar os itens selecionados para compra com o
usurio que deseja adquiri-los. Na maioria da vezes a seleo dos
itens e compra feita por meio da navegao de vrias pginas do
site e a todo instante necessrio distinguir os usurios que esto
realizando as requisies.
necessrio acompanhar as interao do usurio com o site para
observar seu comportamento e, a partir dessas informaes, realizar
adaptaes no site para atrair um maior nmero de usurios ou
realizar campanhas de marketing.
necessrio saber que usurio est acessando o site para, de acordo
com o seu perfil, fornecer uma visualizao e um conjunto de
funcionalidades adequadas s suas preferncias.
Todas essas necessidades no podem ser atendidas com o uso bsico do
protocolo HTTP, uma vez que ele no orientado sesso ou conexo. Com os
cookies possvel contornar essa deficincia, uma vez que as informaes que
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
22
so neles armazenadas podem ser usadas para identificar os clientes. Existem
outras formas de contornar a deficincia do protocolo de HTTP, como a
codificao de URL e o uso de campos escondidos nas pginas HTML, mas o
uso de cookies a tcnica mais utiliza, por ser mais simples e padronizada. No
entanto, o usurio pode impedir que o navegador aceite cookies, o que torna o
ato de navegar pela Web muito desagradvel. Neste caso, necessrio utilizar
as outras tcnicas para controle de sesso.
A API Servlet permite a manipulao explicita de cookies. Para controle
de sesso o programador pode manipular diretamente os cookies, ou usar uma
abstrao de nvel mais alto, implementada por meio do objeto
HttpSession. Se o cliente no permitir o uso de cookies a API Servlet
fornece mtodos para a codificao de URL. O exemplo XX.XX mostra o uso
de cookies para armazenar as informaes digitadas em um formulrio.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class CookieTeste extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/html");
PrintWriter out =res.getWriter();
out.println("<html>");
out.println("<body bgcolor=\"white\">");
out.println("<head><title>Teste de Cookies</title></head>");
out.println("<body>");
out.println("<h3>Teste de Cookies</h3>");
Cookie[] cookies =req.getCookies();
if (cookies.length >0)
{
for (int i =0; i <cookies.length; i++)
{
Cookie cookie =cookies[i];
out.print("Cookie Nome: " +cookie.getName() +"<br>");
out.println(" Cookie Valor: " +cookie.getValue() +"<br><br>");
}
}
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
23
String cName =req.getParameter("cookienome");
String cValor =req.getParameter("cookievalor");
if (cName !=null && cValor !=null)
{
Cookie cookie =new Cookie(cName ,cValor);
res.addCookie(cookie);
out.println("<P>");
out.println("<br>");
out.print("Nome : "+cName +"<br>");
out.print("Valor : "+cValor);
}
out.println("<P>");
out.print("<form action=\"CookieTeste\" method=POST>");
out.println("Nome : <input type=text length=20 name=cookienome><br>");
out.println("Valor : <input type=text length=20 name=cookievalor><br>");
out.println("<input type=submit></form>");
out.println("</body>");
out.println("</html>");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
doGet(req, res);
}
}
Exemplo XX.XX- Servlet para lidar com Cookies.
Para se criar um cookie necessrio criar um objeto Cookie, passando
para o construtor um nome e um valor, sendo ambos instncias de String. O
cookie enviado para o navegador por meio do mtodo addCookie() do
objeto HttpServletResponse. Um vez que os cookies so enviados no
cabealho da pgina, o mtodo addCookie() deve ser chamado antes do
envio de qualquer contedo para o navegador. Para recuperar os cookies
enviados pelo navegador usa-se o mtodo getCookies() do objeto
HttpServletRequest que retorna um array de Cookie. Os mtodos
getName() e getvalue() do objeto Cookie so utilizados para recuperar
o nome o valor da informao associada ao cookie.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
24
Os objetos da classe Cookie possuem vrios mtodos para controle do
uso de cookies. possvel definir tempo de vida mximo do cookie, os
domnios que devem receber o cookie (por default o domnio que deve receber
o cookie o que o criou), o diretrio da pgina que deve receber o cookie, se o
cookie deve ser enviado somente sob um protocolo seguro e etc. Por exemplo,
para definir a idade mxima de um cookie devemos utilizar o mtodo
setMaxAge(), passando um inteiro como parmetro. Se o inteiro for positivo
indicar em segundos o tempo mximo de vida do cookie. Um valor negativo
indica que o cookie deve apagado quando o navegador terminar. O valor zero
indica que o cookie deve ser apagado imediatamente. O trecho de cdigo
exemplo XX.XX mostra algumas alteraes no comportamento default de um
cookie.
...
Cookie cookie =new Cookie(cName ,cValor);
cookie.setDomain(*.uvf.br); // todos os domnios como dpi.ufv.br mas no *.dpi.ufv.br
cookie.setMaxAge (3600); // uma hora de tempo de vida
...
Exemplo XX.XX- Mudanas no comportamento default do cookie.
Lidando com Sesses
A manipulao direta de cookies para controle de sesso um tanto
baixo nvel, uma vez que o usurio deve se preocupar com a identificao,
tempo de vida e outros detalhes. Por isso a API Servlet fornece um objeto com
controles de nvel mais alto para monitorar a sesso, o HttpSession. O
objeto HttpSession monitora a sesso utilizando cookies de forma
transparente. No entanto, se o cliente no aceitar o uso de cookies possvel
utilizar como alternativa a codificao de URL para adicionar o identificador da
sesso. Essa opo, apesar de ser mais genrica, no primeira opo devido a
possibilidade de criao de gargalos pela necessidade da anlise prvia de
todas requisies que chegam ao servidor. O exemplo XX.XX mostra o uso de
um objeto HttpSession para armazenar as informaes digitadas em um
formulrio.
import java.io.*;
import java.util.*;
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
25
import javax.servlet.*;
import javax.servlet.http.*;
public class SessionTeste extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
resp.setContentType("text/html");
PrintWriter out =resp.getWriter();
out.println("<html><head>");
out.println("<title>Teste de Sessao</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Teste de Sessao</h3>");
HttpSession session =req.getSession(true);
out.println("Identificador: " +session.getId());
out.println("<br>");
out.println("Data: ");
out.println(new Date(session.getCreationTime()) +"<br>");
out.println("Ultimo acesso: ");
out.println(new Date(session.getLastAccessedTime()));
String nomedado =req.getParameter("nomedado");
String valordado =req.getParameter("valordado");
if (nomedado !=null && valordado !=null)
{
session.setAttribute(nomedado, valordado);
}
out.println("<P>");
out.println("Dados da Sessao:" +"<br>");
Enumeration valueNames =session.getAttributeNames();
while (valueNames.hasMoreElements())
{
String name =(String)valueNames.nextElement();
String value =(String) session.getAttribute(name);
out.println(name +" =" +value+"<br>");
}
out.println("<P>");
out.print("<form action=\"SessionTeste\" method=POST>");
out.println("Nome: <input type=text size=20 name=nomedado><br>");
out.println("Valor: <input type=text size=20 name=valordado><br>");
out.println("<input type=submit>");
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
26
out.println("</form>");
out.println("</body></html>");
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
doGet(req, resp);
}
}
Exemplo XX.XX- Servlet para lidar com Sesses.
Para controlar a sesso necessrio obter um objeto HttpSession por
meio do mtodo getSession() do objeto HttpServletRequest. Opcionalmente, o
mtodo getSession() recebe como argumento um valor booleano que indica se
para criar o objeto HttpSession se ele no existir (argumento true) ou se para
retorna null caso ele no exista (argumento false). Para se associar um objeto ou
informao sesso usa-se o mtodo setAttribute() do objeto HttpSession,
passando para o mtodo um String e um objeto que ser identificado pelo
String. Note que o mtodo aceita qualquer objeto e, portanto, qualquer objeto
pode ser associado sesso. Os objetos associados a uma sesso so
recuperados com o uso mtodo getAttribute() do objeto HttpSession, que recebe
como argumento o nome associado ao objeto. Para se obter uma enumerao do
nomes associados sesso usa-se o mtodo getAttributeNames() do objeto
HttpSession.
A figura 9 mostra o resultado da execuo do exemplo XX.XX.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
27
Teste de Sessao
Identificador: session3
Data: Sun May 28 15:19:15 GMT-03:00 2000
Ultimo acesso: Sun May 28 15:19:43 GMT-03:00 2000
Dados da Sessao:
Alcione =4
Alexandra =6
Nome
Valor
Figura 9. Sada resultante da execuo do Servlet que lida com Sesses.
Enviar Consulta
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
28
JSP
Servlets uma boa idia, mas voc se imaginou montando uma pgina
complexa usando println()? Muitas vezes o desenvolvimento de um site
uma tarefa complexa que envolve vrios profissionais. A tarefa de projeto do
layout da pgina fica a cargo do Web Designer, incluindo a diagramao dos
textos e imagens, aplicao de cores, tratamento das imagens, definio da
estrutura da informao apresentada no site e dos links para navegao pela
mesma. J o Desenvolvedor Web responsvel pela criao das aplicaes que
vo executar em um site. O trabalho destes dois profissionais somado na
criao de um nico produto, mas durante o desenvolvimento a interferncia
mutua deve ser a mnima possvel. Ou seja, um profissional no deve precisar
alterar o que foi feito pelo outro profissional para cumprir sua tarefa. A
tecnologia Servlet no nos permite atingir esse ideal. Por exemplo, suponha que
um Web Designer terminou o desenvolvimento de uma pgina e a entregou
para o Desenvolvedor Web codificar em um Servlet. Se aps a codificao o
Web Designer desejar realizar uma alterao na pgina ser necessrio que ele
altere o cdigo do Servlet (do qual ele nada entende) ou entregar uma nova
pgina para o Desenvolvedor Web para que ele a codifique totalmente mais
uma vez. Qualquer uma dessas alternativas so indesejveis e foi devido a esse
problema a Sun desenvolveu uma tecnologia baseada em Servlets chamada de
J SP.
J ava Server Pages (J SP) so pginas HTML que incluem cdigo J ava e
outros tags especiais. Desta forma as partes estticas da pgina no precisam ser
geradas por println(). Elas so fixadas na prpria pgina. A parte dinmica
gerada pelo cdigo J SP. Assim a parte esttica da pgina pode ser projetada
por um Web Designer que nada sabe de J ava.
A primeira vez que uma pgina J SP carregada pelo container J SP o
cdigo J ava compilado gerando um Servlet que executado, gerando uma
pgina HTML que enviada para o navegador. As chamadas subsequentes so
enviadas diretamente ao Servlet gerado na primeira requisio, no ocorrendo
mais as etapas de gerao e compilao do Servlet.
A figura 10 mostra um esquema das etapas de execuo de uma pgina
J SP na primeira vez que requisitada. Na etapa (1) a requisio enviada para
um servidor Web que reencaminha a requisio (etapa 2) para o container
Servlet/J SP. Na etapa (3) o container verifica que no existe nenhuma instncia
de Servlet correspondente pgina J SP. Neste caso, a pgina J SP traduzida
para cdigo fonte de uma classe Servlet que ser usada na resposta requisio.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
29
Na etapa (4) o cdigo fonte do Servlet compilado, e na etapa (5) criada uma
instncia da classe. Finalmente, na etapa (6) invocado o mtodo service()
da instncia Servlet para gerar a resposta requisio.
Figura 10. Etapas da primeira execuo de uma pgina J SP.
A idia de se usar scripts de linguagens de programao em pginas
HTML que so processados no lado servidor para gerar contedo dinmico no
restrita linguagem J ava. Existem vrias solues desse tipo fornecida por
outros fabricantes. Abaixo segue uma comparao de duas das tecnologias mais
populares com J SP.
PHP X J SP
PHP (Personal Home Pages) uma linguagem script para ser executada
no lado servidor criada em 1994 como um projeto pessoal de Rasmus Lerdorf.
Atualmente encontra-se na verso 4. A sintaxe fortemente baseada em C mas
possui elementos de C++, J ava e Perl. Possui suporte programao OO por
meio de classes e objetos. Possui tambm suporte extensivo Banco de dados
ODBC, MySql, Sybase, Oracle e outros. PHP uma linguagem mais fcil no
Servidor
Http
(1)
Requisio de
pgina J SP
Container
Servlet/J SP
Pgina
jsp
Fonte
Servlet
(3)
Traduz
(2)
Encaminha a requisio
(5)
Instancia e
executa
(6)
Resposta
requisio
Navegador
Bytecode
Servlet
(4)
Compila
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
30
desenvolvimento de pequenas aplicaes para Web em relao J SP, uma vez
que uma linguagem mais simples e menos rgida do que J SP. No entanto, a
medida que passamos para aplicaes de maior porte, o uso de PHP no
indicado, uma vez que necessrio o uso de linguagens com checagem mais
rgidas e com maior suporte escalabilidade, como o caso de J ava.
ASP X JSP
ASP (Active Server Pages) a soluo desenvolvida pela Microsoft
para atender as requisies feitas servidores Web. Incorporada inicialmente
apenas ao Internet Information Server (IIS), no entanto, atualmente j
suportada por outros servidores populares, como o Apache. O desenvolvimento
de pginas que usam ASP envolve a produo de um script contendo HTML
misturado com blocos de cdigo de controle ASP. Este cdigo de controle pode
conter scripts em J avaScript ou VBScript. A primeira vantagem de J SP sobre
ASP que a parte dinmica escrita em J ava e no Visual Basic ou outra
linguagem proprietria da Microsoft, portanto J SP mais poderoso e fcil de
usar. Em segundo lugar J SP mais portvel para outros sistemas operacionais e
servidores WEB que no sejam Microsoft.
Primeiro exemplo em JSP
Para que o leitor possa ter uma idia geral da tecnologia J SP
apresentaremos agora a verso J SP do Ol mundo. O exemplo XX.XX mostra o
cdigo da pgina.
<html>
<head>
<title>Exemplo J SP</title>
</head>
<body>
<%
String x = " Ol&aacute; Mundo!" ;
%>
<%=x%>
</body>
</html>
Exemplo XX.XX- Verso J SP do Ol mundo.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
31
Quem est habituado aos tags HTML notar que se trata basicamente de
uma pgina HTML contendo cdigo J ava delimitado pelos smbolos <% e
%>. Para facilitar a visualizao destacamos os scripts J ava com negrito. No
primeiro trecho de script declarada uma varivel x com o valor Ol mundo
(a seqncia &acute; denota em HTML). No segundo trecho de script o
contedo da varivel x extrado e colocado na pgina resultante da execuo
do Servlet correspondente. Em seguida mostraremos como executar o exemplo
XX.XX.
Executando o arquivo JSP
Para executar o exemplo XX.XX salve-o com a extenso .jsp. Por
exemplo ola.jsp. Se voc estiver usando o servidor Tomcat, coloque-o
arquivo no subdiretrio /webapps/examples/jsp do Tomcat. Por exemplo
examples/jsp/teste. Para invocar o arquivo J SP basta embutir a URL
em uma pgina ou digitar diretamente a seguinte URL no navegador.
http://localhost:8080/examples/jsp/ola.jsp
Usamos o diretrio /webapps/examples/jsp para testar
rapidamente o exemplo. Para desenvolver uma aplicao aconselhvel criar
um diretrio apropriado como mostrado na seo que tratou de Servlets.
O Servlet criado a partir da pgina J SP colocado em um diretrio de
trabalho. No caso do Tomcat o Servlet colocado em subdiretrio associado
aplicao subordinado ao diretrio /work do Tomcat. O exemplo XX.XX
mostra os principais trechos do Servlet criado a partir da traduo do arquivo
ola.jsp pelo tradutor do Tomcat. Note que o Servlet subclasse de uma
classe HttpJspBase e no da HttpServlet. Alm disso, o mtodo que
executado em resposta requisio o mtodo _jspService() e no o
mtodo service(). Note tambm que todas as partes estticas da pgina J SP
so colocadas como argumentos do mtodo write() do objeto referenciado
out.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
32
public class _0002fjsp_0002fola_00032_0002ejspola_jsp_0 extends HttpJ spBase {
....
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
....
PageContext pageContext =null;
HttpSession session =null;
ServletContext application =null;
ServletConfig config =null;
J spWriter out =null;
...
try {
...
out.write("<html>\r\n <head>\r\n <title>Exemplo J SP</title>\r\n
</head>\r\n <body>\r\n");
String x ="Ol&aacute; Mundo!";
out.write("\r\n");
out.print(x);
out.write("\r\n </body>\r\n</html>\r\n");
...
}catch (Exception ex) {
...
}
}
}
Exemplo XX.XX- Servlet correspondente pgina J SP do Ol mundo.
Objetos implcitos
No exemplo XX.XX pode-se ver a declarao de variveis que
referenciam a alguns objetos importantes. Estas variveis esto disponveis para
o projetista da pgina J SP. As variveis mais importantes so:
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
33
Classe Varivel
HttpServletRequest
HttpServletResponse
PageContext
ServletContext
HttpSession
J spWriter
request
response
pageContext
application
session
out
Os objetos referenciados pelas variveis request e response j
tiveram seu uso esclarecido na seo sobre Servlets. O objeto do tipo
JspWriter tem a mesma funo do PrinterWriter do Servlet. Os outros
objetos tero sua funo esclarecida mais adiante.
Tags JSP
Os tags J SP possuem a seguinte forma geral:
<% Cdigo JSP %>
O primeiro caractere % pode ser seguido de outros caracteres que
determinam o significado preciso do cdigo dentro do tag. Os tags J SP
possuem correspondncia com os tags XML. Existem cinco categorias de tags
J SP:
Expresses
Scriptlets
Declaraes
Diretivas
Comentrios
Em seguida comentaremos cada uma dessas categorias.
Expresses
<%= expresses %>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
34
Expresses so avaliadas, convertidas para String e colocadas na
pgina enviada. A avaliao realizada em tempo de execuo, quando a
pgina requisitada.
Exemplos:
<%= new java.util.Date() %>
<%= request. getMethod() %>
No primeiro exemplo ser colocado na pgina a data corrente em
milsimo de segundos e no segundo ser colocado o mtodo usado na
requisio. Note que cada expresso contm apenas um comando J ava. Note
tambm que o comando J ava no terminado pelo caractere ;.
Scriptlets
<% cdigo Java %>
Quando necessrio mais de um comando J ava ou o resultado da
computao no para ser colocado na pgina de resposta preciso usar outra
categoria de tags J SP: os Scriptlets . Os Scriptlets permitem inserir trechos de
cdigo em J ava na pgina J SP. O exemplo XX.XX mostra uma pgina J SP
contendo um Scriptlet que transforma a temperatura digitada em celcius para o
equivalente em Fahrenheit.
<html>
<head><title>Conversao Celcius Fahrenheit </title></head>
<body>
<%
String valor = request.getParameter(" celcius" );
if (valor != null )
{
double f = Double.parseDouble(valor)*9/5 +32;
out.println(" <P>" );
out.println(" <h2>Valor em Fahrenheit:" +f +" <h2><br>" );
}
%>
<form action=conversao.jsp method=POST>
Celcius: <input type=text size=20 name=celcius><br>
<input type=submit>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
35
</form>
</body>
</html>
Exemplo XX.XX- Pgina J SP que converte graus Celcius para Fahrenheit.
Note o uso das variveis request e out sem a necessidade de
declarao. Todo o cdigo digitado inserido no mtodo _jspService(). A
figura 11 mostra o resultado da requisio aps a digitao do valor 30 na caixa
de texto do formulrio.
Figura 11. Resultado da converso de 30 graus celcius.
O cdigo dentro do scriptlet inserido da mesma forma que escrito e
todo o texto HTML esttico antes e aps ou um scriptlet convertido para
comandos print(). Desta forma o scriptlets no precisa conter comandos
para cdigo esttico e blocos de controle abertos afetam o cdigo HTML
envolvidos por scriptlets. O exemplo XX.XX mostra dois formas de se produzir
o mesmo efeito. No cdigo da esquerda os Scriplets se intercalam com cdigo
HTML. O cdigo HTML, quando da traduo da pgina J SP para Servlet
inserido como argumentos de mtodos println() gerando o cdigo da
direita. Ambas as formas podem ser usadas em pginas J SP e produzem o
mesmo efeito.
Valor em Fahrenheit:86.0
Celcius:
Enviar Consulta
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
36
Previs&atilde;o do Tempo
<% if (Math.random() < 0.5) { %>
Hoje vai <B>fazer sol</B>!
<% }else {%>
Hoje vai <B>chover</B>!
<% }%>
out.println("Previs&atilde;o do Tempo");
if (Math.random() <0.5) {
out.println(" Hoje vai <B>fazer sol</B>!");
}else {
out.println(" Hoje vai <B>chover</B>!");
}
Exemplo XX.XX- Dois cdigos equivalentes.
Declaraes
<%! Cdigo Java %>
Uma declarao J SP permite definir variveis ou mtodos que so
inseridos no corpo do Servlet. Como as declaraes no geram sada, elas so
normalmente usadas em combinao com expresses e scriptlets. O Exemplo
XX.XX mostra a declarao de uma varivel que usada para contar o nmero
de vezes que a pgina corrente foi requisitada desde que foi carregada.
<%! Private int numAcesso = 0; %>
Acessos desde carregada:
<%= ++ numAcesso %>
Exemplo XX.XX- Declarao de uma varivel usando o tag de declarao.
As variveis declaradas desta forma sero variveis de instncia. J as
variveis declaradas em Scriptlets so variveis locais ao mtodo
_jspService(). Por isso possvel contar o nmero de requisies com o
exemplo XX.XX. Se varivel fosse declarada em um Scriptlet a varivel seria
local ao mtodo _jspService() e, portanto, teria seu valor reinicializado a
cada chamada.
Como j foi dito, os tags de declaraes permitem a declarao de
mtodos. O Exemplo XX.XX mostra a declarao de um mtodo que converte
celcius para Fahrenheit.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
37
<%!
private double converte(double c)
{
return c*9/5 +32;
}
%>
Exemplo XX.XX- Declarao de um mtodo para a converso de celcius para
Fahrenheit.
Comentrios
Existem dois tipos de comentrios utilizados em pginas J SP. O
primeiro exclui todo o bloco comentado da sada gerada pelo processamento da
pgina. A forma geral deste tipo de comentrio a seguinte:
<%--comentrio --%>
O segundo tipo de comentrio o utilizado em pginas HTML. Neste
caso o comentrio enviado dentro da pgina de resposta. A forma geral deste
tipo de comentrio a seguinte:
<!-- comentrio.-->
Diretivas
Diretivas so mensagens para J SP container. Elas no enviam nada para
a pgina mas so importantes para definir atributos J SP e dependncias com o
J SP container. A forma geral da diretivas a seguinte:
<%@ Diretiva atributo="valor" %>
ou
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
38
<%@ Diretiva atributo
1
="valor
1
"
atributo
2
="valor
2
"
...
atributo
N
=" valor
N
" %>
Em seguida comentaremos as principais diretivas.
Diretiva page
<%@ page atributo
1
="valor
1
" ... atributo
N
=" valor
N
" %>
A diretiva page permite a definio dos seguintes atributos:
import
contentType
isThreadSafe
session
buffer
autoflush
info
errorPage
isErrorPage
language
Segue a descrio de cada um desses atributos.
Atributo e Forma Geral Descrio
import="package.class"
ou
import="package.class
1
,..
.,package.class
N
"
Permite especificar os pacotes que devem ser
importados para serem usados na pgina J SP.
Exemplo:
<%@ page import="java.util.*" %>
contentType="MIME-Type" Especifica o tipo MIME da sada. O default text/html.
Exemplo:
<%@ page contentType="text/plain" %>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
39
possui o mesmo efeito do scriptlet
<%
response.setContentType("text/plain")
;
%>
isThreadSafe="true|false" Um valor true (default) indica um processamento
normal do Servlet, onde mltiplas requisies so
processadas simultaneamente. Um valor false indica que
o processamento deve ser feito por instancias separadas
do Servlet ou serialmente.
session="true|false Um valor true (default) indica que a varivel
predefinida session (HttpSession) deve ser
associada sesso, se existir, caso contrrio uma nova
sesso deve ser criada e associada a ela. Um valor false
indica que nenhuma sesso ser usada.
buffer="sizekb|none" Especifica o tamanho do buffer para escrita usado pelo
objeto J spWriter. O tamanho default no menor que
8k..
autoflush="true|false Um valor true (default) indica que o buffer deve ser
esvaziado quando estiver cheio.
info="mensagem" Define uma cadeia de caracteres que pode ser
recuperada via getServletInfo().
errorPage="url Especifica a pgina J SP que deve ser processada em
caso de excees no capturadas.
IsErrorPage="true|false Indica se a pgina corrente pode atuar como pgina de
erro para outra pgina J SP. O default false.
Language="java Possibilita definir a linguagem que est sendo usada. No
momento a nica possibilidade J ava.
Tabela I.XX Atributos da diretiva page.
Diretiva include
<%@ include file="relative url" %>
Permite incluir arquivos no momento em que a pgina J SP traduzida
em um Servlet.
Exemplo:
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
40
<%@ include file="/meuarq.html" %>
Extraindo Valores de Formulrios
Uma pgina J SP, da mesma forma que um Servlet, pode usar o objeto
referenciado pela varivel request para obter os valores dos parmetros de
um formulrio. O exemplo XX.XX usado para converter graus Celcius em
Fahrenheit fez uso deste recurso. O exemplo XX.XX mostra outra pgina J SP
com formulrio. Note que o scriptlet usado para obter o nome e os valores de
todos os parmetros contidos no formulrio. Como o mtodo
getParameterNames() retorna uma referncia a um objeto
Enumeration preciso importar o pacote java.util, por meio da diretiva
page.
<%@ page import="java.util.*" %>
<html><body>
<H1>Formulrio</H1>
<%
Enumeration campos = request.getParameterNames();
While(campos.hasMoreElements()) {
String campo = (String)campos.nextElement();
String valor = request.getParameter(campo); %>
<li><%= campo %> = <%= valor %></li>
<% } %>
<form method="POST" action="form.jsp">
Nome: <input type="text" size="20" name="nome" ><br>
Telefone: <input type="text" size="20" name="telefone"><br>
<INPUT TYPE=submit name=submit value="envie">
</form>
</body></html>
Exemplo I.XX Pgina JSP com formulrio.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
41
A figura 12 mostra o resultado da requisio aps a digitao dos
valores Alcione e 333-3333 nas caixas de texto do formulrio.
Figura 12- Sada do exemplo XX.XX.
Criando e Modificando Cookies
Da mesma for que em Servlets os cookies em J SP so tratados por meio
da classe Cookie. Para recuperar os cookies enviados pelo navegador usa-se o
mtodo getCookies() do objeto HttpServletRequest que retorna um
arranjo de Cookie. Os mtodos getName() e getvalue() do objeto
Cookie so utilizados para recuperar o nome o valor da informao associada
ao cookie. O cookie enviado para o navegador por meio do mtodo
addCookie() do objeto HttpServletResponse. O exemplo XX.XX
mostra uma pgina J SP que exibe todos os cookies recebidos em uma
requisio e adiciona mais um na resposta.
<html><body>
<H1>Session id: <%= session.getId() %></H1>
<%
Cookie[] cookies = request.getCookies();
Formulrio
telefone =333-3333
nome =Alcione
submit =envie
Nome:
Telefone:
envie
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
42
For(int i = 0; i < cookies.length; i++) { %>
Cookie name: <%= cookies[i].getName() %> <br>
Value: <%= cookies[i].getValue() %><br>
antiga idade mxima em segundos:
<%= cookies[i].getMaxAge() %><br>
<% cookies[i].setMaxAge(5); %>
nova idade mxima em segundos:
<%= cookies[i].getMaxAge() %><br>
<% } %>
<%! Int count = 0; int dcount = 0; %>
<% response.addCookie(new Cookie(
Cookie " + count++, Valor " + dcount++)); %>
</body></html>
Exemplo I.XX Pgina JSP que exibe os cookies recebidos.
A figura 13 mostra o resultado aps trs acessos seguidos pgina J SP.
Note que existe um cookie a mais com o nome JSESSIONID e valor igual
sesso. Este cookie o usado pelo container para controlar a sesso.
Session id: 9ppfv0lsl1
Cookie name: Cookie 0
value: Valor 0
antiga idade mxima em segundos: -1
nova idade mxima em segundos: 5
Cookie name: Cookie 1
value: Valor 1
antiga idade mxima em segundos: -1
nova idade mxima em segundos: 5
Cookie name: J SESSIONID
value: 9ppfv0lsl1
antiga idade mxima em segundos: -1
nova idade mxima em segundos: 5
Figura 13- Sada do exemplo XX.XX aps trs acessos.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
43
Lidando com sesses
O atributos de uma sesso so mantidos em um objeto HttpSession
referenciado pela varivel session. Pode-se armazenar valores em uma
sesso por meio do mtodo setAttribute() e recuper-los por meio do
mtodo getAttribute(). O tempo de durao default de uma sesso
inativa (sem o recebimento de requisies do usurio) 30 minutos mas esse
valor pode ser alterado por meio do mtodo
setMaxInactiveInterval(). O exemplo XX.XX mostra duas pginas
J SP. A primeira apresenta um formulrio onde podem ser digitados dois valores
recebe dois valores de digitados em um formulrio e define o intervalo mximo
de inatividade de uma sesso em 10 segundos. A segunda pgina recebe a
submisso do formulrio, insere os valores na sesso e apresenta os valores
relacionados com a sesso assim como a identificao da sesso.
<%@ page import="java.util.*" %>
<html><body>
<H1>Formulrio</H1>
<H1>Id da sess&atilde;o: <%= session.getId() %></H1>
<H3><li>Essa sess&atilde;o foi criada em
<%= session.getCreationTime() %></li></H3>
<H3><li>Antigo intervalo de inatividade =
<%= session.getMaxInactiveInterval() %></li>
<% session.setMaxInactiveInterval(10); %>
<li>Novo intervalo de inatividade=
<%= session.getMaxInactiveInterval() %></li>
</H3>
<%
Enumeration atribs = session.getAttributeNames();
while(atribs.hasMoreElements()) {
String atrib = (String)atribs.nextElement();
String valor = (String)session.getAttribute(atrib); %>
<li><%= atrib %> = <%= valor %></li>
<% }%>
<form method="POST" action="sessao2.jsp">
Nome: <input type="text" size="20" name="nome" ><br>
Telefone: <input type="text" size="20" name="telefone" >
<br>
<INPUT TYPE=submit name=submit value="envie">
</form>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
44
</body></html>
<html><body>
<H1>Id da sess&atilde;o: <%= session.getId() %></H1>
<%
String nome = request.getParameter("nome");
String telefone = request.getParameter("telefone");
if (nome !=null && nome.length()>0)
session.setAttribute("nome",nome);
if (telefone !=null &&telefone.length()>0)
session.setAttribute("telefone",telefone);
%>
<FORM TYPE=POST ACTION=sessao1.jsp>
<INPUT TYPE=submit name=submit Value="Retorna">
</FORM>
</body></html>
Exemplo I.XX Exemplo do uso de sesso.
O exemplo XX.XX mostra que a sesso mantida mesmo
quando o usurio muda de pgina. As figura 14 e 15 mostram o resultado da
requisio aps a digitao dos valores Alcione e 333-3333 nas caixas de
texto do formulrio, submisso para pgina sessao2.jsp e o retorno
pgina sessao1.jsp.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
45
Figura 14- Tela da pgina sessao1.jsp.
Figura 15. Tela da pgina sessao2.jsp.
O Uso de JavaBeans
Formulrio
Id da sesso: soo8utc4m1
Essa sesso foi criada em 1002202317590
Antigo intervalo de inatividade = 1800
Novo intervalo de inatividade= 10
telefone =333-3333
nome =Alcione
Nome:
Telefone:
envie
Id da sesso: soo8utc4m1
Retorna
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
46
A medida que o cdigo J ava dentro do HTML torna-se cada vez mais
complexo o desenvolvedor pode-se perguntar: J ava em HTML no o
problema invertido do HTML em Servlet? O resultado no ser to complexo
quanto produzir uma pgina usando println()? Em outras palavras, estou
novamente misturando contedo com forma?
Para solucionar esse problema a especificao de J SP permite o uso de
J avaBeans para manipular a parte dinmica em J ava. J avaBeans j foram
descritos detalhadamente em um captulo anterior, mas podemos encarar um
J avaBean como sendo apenas uma classe J ava que obedece a uma certa
padronizao de nomeao de mtodos, formando o que denominado de
propriedade. As propriedades de um bean so acessadas por meio de mtodos
que obedecem a conveno getXxxx e setXxxx. , onde Xxxx o nome da
propriedade. Por exemplo, getItem() o mtodo usado para retornar o valor
da propriedade item. A sintaxe para o uso de um bean em uma pgina J SP :
<jsp:useBean id="nome" class="package.class" />
Onde nome o identificador da varivel que conter uma referncia
para uma instncia do J avaBean. Voc tambm pode modificar o atributo
scope para estabelecer o escopo do bean alm da pgina corrente.
<jsp:useBean id="nome" scope="session" class="package.class" />
Para modificar as propriedades de um J avaBean voc pode usar o
jsp:setProperty ou chamar um mtodo explicitamente em um
scriptlet. Para recuperar o valor de uma propriedade de um J avaBean voc
pode usar o jsp:getProperty ou chamar um mtodo explicitamente em
um scriptlet. Quando dito que um bean tem uma propriedade prop do
tipo T significa que o bean deve prover um mtodo getProp() e um mtodo
do tipo setProp(T). O exemplo XX.XX mostra uma pgina J SP e um
J avaBean. A pgina instancia o J avaBean, altera a propriedade mensagem e
recupera o valor da propriedade, colocando-o na pgina.
Pgina bean.jsp
<HTML><HEAD>
<TITLE>Uso de beans</TITLE>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
47
</HEAD><BODY><CENTER>
<TABLE BORDER=5><TR><TH CLASS="TITLE">Uso de J avaBeans </TABLE>
</CENTER><P>
<jsp:useBean id=" teste" cl ass= curso.BeanSimples" />
<jsp:setProperty name=" teste" property=" mensagem" value= Ola mundo!" />
<H1>Mensagem: <I>
<jsp:getProperty name=" teste" property=" mensagem" /> </I></H1>
</BODY></HTML>
Arquivo Curso/BeanSimples.java
package curso;
public class BeanSimples {
private String men = "Nenhuma mensagem";
public String getMensagem() {
return(men);
}
public void setMensagem(String men) {
this.men = men;
}
}
Exemplo I.XX Exemplo do uso de JavaBean.
A figura 16 mostra o resultado da requisio dirigida pgina
bean.jsp.
Figura 16- Resultado da requisio pgina bean.jsp.
Se no tag setProperty usarmos o valor * para o atributo
property ento todos os valores de elementos de formulrios que possurem
Mensagem: Ola mundo!
Uso de JavaBeans
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
48
nomes iguais propriedades sero transferidos para as respectivas propriedades
no momento do processamento da requisio. Por exemplo, seja uma pgina jsp
contendo um formulrio com uma caixa de texto com nome mensagem, como
mostrado no exemplo XX.XX. Note que, neste caso, a propriedade mensagem
do J avaBean tem seu valor atualizado para o valor digitado na caixa de texto,
sem a necessidade de uma chamada explcita no tag setProperty. Os
valores so automaticamente convertidos para o tipo correto no bean.
<HTML><HEAD><TITLE>Uso de beans</TITLE></HEAD>
<BODY><CENTER>
<TABLE BORDER=5><TR><TH CLASS="TITLE">Uso de J avaBeans </TABLE>
</CENTER><P>
<jsp:useBean id=" teste" cl ass=" curso.BeanSimpl es" />
<jsp:setProperty name=" teste" property=" *" />
<H1>Mensagem: <I>
<jsp:getProperty name=" teste" property=" mensagem" />
</I></H1>
<form method="POST" action="bean2.jsp">
Texto: <input type="text" size="20" name="mensagem" ><br>
<INPUT TYPE=submit name=submit value="envie">
</form>
</BODY></HTML>
Exemplo I.XX Exemplo de atualizao automtica da propriedade.
A figura 17 mostra o resultado da requisio dirigida pgina
bean2.jsp aps a digitao do texto Ol!
Figura 17- Resultado da requisio pgina bean2.jsp.
Mensagem: Ola!
Uso de JavaBeans
envie
Texto:
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
49
Escopo
Existem quatro valores possveis para o escopo de um objeto: page,
request, session e application. O default page. A tabela
XX.XX descreve cada tipo de escopo.
Escopo Descrio
page Objetos declarados com nesse escopo so vlidos at a
resposta ser enviada ou a requisio ser encaminhada
para outro programa no mesmo ambiente, ou seja, s
podem ser referenciados nas pginas onde forem
declarados. Objetos declarados com escopo page so
referenciados pelo objeto pagecontext.
request Objetos declarados com nesse escopo so vlidos durante
a requisio e so acessveis mesmo quando a requisio
encaminhada para outro programa no mesmo ambiente.
Objetos declarados com escopo request so
referenciados pelo objeto request.
session Objetos declarados com nesse escopo so vlidos durante
a sesso desde que a pgina seja definida para funcionar
em uma sesso. Objetos declarados com escopo
session so referenciados pelo objeto session.
application Objetos declarados com nesse escopo so acessveis por
pginas no mesmo servidor de aplicao. Objetos
declarados com escopo application so
referenciados pelo objeto application.
Tabela I.XX Escopo dos objetos nas pginas JSP.
Implementao de um Carrinho de compras
O exemplo abaixo ilustra o uso de J SP para implementar um carrinho de
compras virtual. O carrinho de compras virtual simula um carrinho de compras
de supermercado, onde o cliente vai colocando os produtos selecionados para
compra at se dirigir para o caixa para fazer o pagamento. No carrinho de
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
50
compras virtual os itens selecionados pelo usurio so armazenados em uma
estrutura de dados at que o usurio efetue o pagamento. Esse tipo de exemplo
exige que a pgina J SP funcione com o escopo session para manter o
carrinho de compras durante a sesso. O exemplo XX.XX mostra um exemplo
simples de implementao de carrinho de compras. O exemplo composto por
dois arquivos: um para a pgina J SP e um para o JavaBean que armazena os
itens selecionados.
Pgina compras.jsp
<html>
<jsp:useBean id=" carrinho" scope=" session" cl ass=" compra.Carrinho" />
<jsp:setProperty name=" carrinho" property=" *" />
<body bgcolor="#FFFFFF">
<%
carrinho.processRequest(request);
String[] items = carrinho.getItems();
if (items.length>0) {
%>
<font size=+2 color="#3333FF">Voc&ecirc; comprou os seguintes itens:</font>
<ol>
<%
for (int i=0; i<items.length; i++) {
out.println(" <li >" +items[i]);
}
}
%>
</ol>
<hr>
<form type=POST action=compras.jsp>
<br><font color="#3333FF" size=+2>Entre um item para adicionar ou remover:
</font><br>
<select NAME="item">
<option>Televis&atilde;o
<option>R&aacute;dio
<option>Computador
<option>V&iacute;deo Cassete
</select>
<p><input TYPE=submit name="submit" value="adicione">
<input TYPE=submit name="submit" value="remova"></form>
</body>
</html>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
51
J avaBean compra/Carrinho.java
Package compra;
Import javax.servlet.http.*;
Import java.util.Vector;
Import java.util.Enumeration;
Public class Carrinho {
Vector v =new Vector();
String submit =null;
String item =null;
Private void addItem(String name) {v.addElement(name); }
Private void removeItem(String name) {v.removeElement(name); }
Publi c void setItem(String name) {item =name; }
Publi c void setSubmit(String s) {submit =s; }
Publi c String[] getItems() {
String[] s =new String[v.size()];
v.copyInto(s);
return s;
}
private void reset() {
submit =null;
item =null;
}
public void processRequest(HttpServletRequest request)
{
if (submit ==null) return;
if (submit.equals("adicione")) addItem(item);
el se if (submit.equals("remova")) removeItem(item);
reset();
}
}
Exemplo I.XX Implementao de um carrinho de compras Virtual.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
52
O exemplo XX.XX implementa apenas o carrinho de compras, deixando
de fora o pagamento dos itens, uma vez que esta etapa depende de cada sistema.
Geralmente o que feito direcionar o usurio para outra pgina onde ele
digitar o nmero do carto de crdito que ser transmitido por meio de uma
conexo segura para o servidor. Existem outras formas de pagamento, como
boleto bancrio e dinheiro virtual. O prprio carrinho de compras geralmente
mais complexo, uma vez que os para compra devem ser obtidos dinamicamente
de um banco de dados. A figura 18 mostra a tela resultante de algumas
interaes com o carrinho de compras.
Figura 18- Carrinho de compras virtual.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
53
Reencaminhando ou Redirecionando requisies
Existem algumas situaes onde pode ser desejvel transferir uma
requisio para outra URL. Isto feito com frequncia em sistemas que
combinam o uso de Servlets juntamente com J SP. No entanto, a transferncia
pode ser para qualquer recurso. Assim, podemos transferir uma requisio de
um Servlet para uma pgina J SP, HTML ou um Servlet. Da mesma forma uma
pgina J SP pode transferir uma requisio para uma pgina J SP, HTML ou um
Servlet.
Existem dois tipos de transferncia de requisio: o redirecionamento e
o reencaminhamento. O redirecionamento obtido usando o mtodo
sendRedirect() de uma instncia HttpServletResponse, passando
como argumento a URL de destino. O exemplo XX.XX mostra o cdigo de um
Servlet redirecionando para uma pgina HTML.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Redireciona extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
res.sendRedirect("/test/index.html");
}
}
Exemplo I.XX Redirecionamento de requisio.
Note pelo exemplo que preciso passar o contexto do recurso
(/teste). No caso de redirecionamento o a requisio corrente perdida e
uma nova requisio feita para a URL de destino. Por isso no se deve
associar nenhum objeto requisio, uma vez que o objeto
HttpServletRequest corrente ser perdido. O que ocorre na prtica que
o servidor envia uma mensagem HTTP 302 de volta para o cliente informando
que o recurso foi transferido para outra URL e o cliente envia uma nova
requisio para a URL informada.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
54
J no caso de reencaminhamento a requisio encaminhada
diretamente para a nova URL mantendo todos os objetos associados e evitando
uma nova ida ao cliente. Portanto, o uso de reencaminhamento mais eficiente
do que o uso de redirecionamento. O reencaminhamento obtido usando o
mtodo forward() de uma instncia RequestDispatcher, passando
como argumento os objetos HttpServletRequest e
HttpServletResponse para a URL de destino. Uma instncia
RequestDispatcher obtida por meio do mtodo
getRequestDispatcher()de uma instncia ServletContext , que
obtido, por sua vez, por meio do mtodo getServletContext() do
Servlet. O exemplo XX.XX mostra o cdigo de um Servlet reencaminhando a
requisio para uma pgina J SP.
import javax.servlet.*;
import javax.servlet.http.*;
public class Reencaminha extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
try
{
getServletContext().getRequestDispatcher("/index.html").
forward(request,response);
}catch (Exception e) {
System.out.println("Servlet falhou: ");
e.printStackTrace();
}
}
}
Exemplo I.XX Reencaminhamento de requisio.
Note que no necessrio passar o contexto na URL, como feito no
redirecionamento, uma vez que a requisio encaminhada no contexto
corrente.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
55
Uma Arquitetura para comrcio eletrnico
O projeto de uma soluo para comrcio eletrnico uma tarefa
complexa e deve atender diversos requisitos. Nesta seo mostraremos uma
modelo de arquitetura bsico para comrcio eletrnico que pode ser adaptado
para solues mais especficas. Este modelo implementa o padro de projeto
MVC, procurando, desta forma, isolar esses aspectos de um sistema de
computao.
Tipos de aplicaes na WEB
Podemos enquadra as aplicaes na Web em um dos seguintes tipos:
Business-to-consumer (B2C) entre empresa e consumidor. Exemplo:
uma pessoa compra um livro na Internet.
Business-to-business (B2B) Troca de informaes e servios entre
empresas. Exemplo: o sistema de estoque de uma empresa de automveis
detecta que um item de estoque precisa ser resposta e faz o pedido
diretamente ao sistema de produo do fornecedor de autopeas. Neste tipo
de aplicao a linguagem XML possui um papel muito importante, uma vez
que existe a necessidade de uma padronizao dos tags para comunicao
de contedo.
User-to-data acesso bases de informao. Exemplo: uma usurio
consulta uma base de informao.
User-to-user chat, e troca de informaes entre usurios (napster).
O exemplo que mostraremos tipicamente um caso de User-to-data,
(agenda eletrnica na Web) mas possui a mesma estrutura de um B2C.
Arquitetura MVC para a Web
A figura XX.XX contm um diagrama de blocos que mostra a
participao de Servlets, J SP e J avaBeans na arquitetura proposta. A idia
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
56
isolar cada aspecto do modelo MVC com a tecnologia mais adequada. A pgina
J SP tima para fazer o papel da viso, uma vez que possui facilidades para a
insero de componentes visuais e para a apresentao de informao. No
entanto, um pouco estranho usar uma pgina J SP para receber e tratar uma
requisio. Esta tarefa, que se enquadra no aspecto de controle do modelo MVC
mais adequada a um Servlet, uma vez que neste momento compontes de
apresentao so indesejveis. Finalmente, desejvel que a modelagem do
negcio fique isolada dos aspectos de interao. A proposta que a modelagem
do negcio fique contida em classes de J avaBeans. Em aplicaes mais
sofisticadas a modelagem do negcio deve ser implementada por classes de
Enterprise J avaBeans (EJ B), no entanto esta forma de implementao foge ao
escopos deste livro. Cada componente participa da seguinte forma:
Servlets Atuam como controladores, recebendo as requisies dos
usurios. Aps a realizao das anlises necessria sobre a requisio,
instancia o J avaBean e o armazena no escopo adequado (ou no caso o bean
j tenha sido criado no escopo) e encaminha a requisio para a pgina J SP.
J avaBeans Atuam como o modelo da soluo, independente da requisio
e da forma de apresentao. Comunicam-se com a camada intermediria
que encapsula a lgica do problema.
J SP Atuam na camada de apresentao utilizando os J avaBeans para
obteno dos dados a serem exibidos, isolando-se assim de como os dados
so obtidos. O objetivo minimizar a quantidade de cdigo colocado na
pgina.
Camada Intermediria (Middleware) Incorporam a lgica de acesso aos
dados. Permitem isolar os outros mdulos de problemas como estratgias de
acesso aos dados e desempenho. O uso de EJ B (Enterprise J avaBeans)
recomendado para a implementao do Middleware, uma vez que os EJ Bs
possuem capacidades para gerncia de transaes e persistncia. Isto
implica na adoo de um servidor de aplicao habilitado para EJ B.
A figura 19 mostra a interao entre os componenetes.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
57
Figura 19. Arquitetura de uma aplicao para Comrcio Eletrnico.
Essa arquitetura possui as seguintes vantagens:
1. Facilidade de manuteno: a distribuio lgica das funes entre os
mdulos do sistema isola o impacto das modificaes.
2. Escalabilidade: Modificaes necessria para acompanhar o aumento da
demanda de servios (database pooling, clustering, etc) ficam concentradas
na camada intermediria.
A figura 20 mostra a arquitetura fsica de uma aplicao de comrcio
eletrnico.
Navegador Web
JSP
(Apresentao)
Requisio
Servlet
(controlador)
Resposta
JavaBean
(modelo)
Cria uma instncia
Servidor de Aplicao
1
5
4
3
2
SGBD
J DBC
MiddleWare
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
58
Figura 20. Arquitetura fsica de uma aplicao para Comrcio Eletrnico.
Demilitarized Zone (DMZ) onde os servidores HTTP so instalados. A
DMZ protegida da rede pbica por um firewall, tambm chamado de firewall
de protocolo. O firewall de protocolo deve ser configurado para permitir
trfego apenas atravs da porta 80. Um segundo firewall, tambm chamado de
firewall de domnio separa a DMZ da rede interna. O firewall de domnio deve
ser configurado para permitir comunicao apenas por meio das portas do
servidor de aplicao
Agenda Web: Um Exemplo de uma aplicao Web usando a
arquitetura MVC
O exemplo a seguir mostra o desenvolvimento da agenda eletrnica para
o funcionamento na Web. A arquitetura adotada uma implementao do
modelo MVC. Apenas, para simplificar a soluo, a camada intermediria foi
simplificada e implementada por um J avaBean que tem a funo de gerenciar
a conexo com o banco de dados. O banco de dados ser composto por duas
tabelas, uma para armazenar os usurios autorizados a usar a tabela e outra para
armazenar os itens da agenda. A figura 21 mostra o esquema conceitual do
banco de dados e a figura 22 mostra o comando para a criao das tabelas. Note
que existe um relacionamento entre a tabela USUARIO e a tabela PESSOA,
mostrando que os dados pessoais sobre o usurio ficam armazenados na
agenda.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
59
Figura 21. Esquema conceitual do banco de dados para a agenda.
As tabelas do BD devem ser criadas de acordo com o seguinte script:
CREATE TABLE PESSOA (ID INT PRIMARY KEY,
NOME VARCHAR(50) NOT NULL,
TELEFONE VARCHAR(50),
ENDERECO VARCHAR(80),
EMAIL VARCHAR(50),
HP VARCHAR(50),
CELULAR VARCHAR(20),
DESCRICAO VARCHAR(80));
CREATE TABLE USUARIO (ID INT PRIMARY KEY,
LOGIN VARCHAR(20) NOT NULL,
SENHA VARCHAR(20) NOT NULL,
CONSTRAINT FK_USU FOREIGN KEY (ID)
REFERENCES PESSOA(ID));
Figura 22. Script para criao das tabelas.
Para se usar a agenda necessrio que exista pelo menos um usurio
cadastrado. Como no exemplo no vamos apresentar uma tela para cadastro de
usurios ser preciso cadastr-los por meio comandos SQL. Os comandos da
figura 23 mostram como cadastrar um usurio.
INSERT INTO PESSOA(ID,NOME,TELEFONE,ENDERECO,EMAIL)
VALUES(0,'Alcione de Paiva Oliveira','3899-1769',
'PH Rolfs','alcionepaiva@globo.com');
INSERT INTO USUARIO(ID,LOGIN,SENHA) VALUES(0,'Alcione','senha');
USUARIO PESSOA 1:1 1:1
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
60
Figura 23. Script para cadastra um usurio.
O sistema e-agenda composta pelos seguintes arquivos:
Arquivo Descrio
agenda.html
Pgina inicial do site, contendo o formulrio para a
entrada do login e senha para entrar no restante do
site.
principal.jsp
Pgina J SP contendo o formulrio para entrada de
dados para insero, remoo ou consulta de itens da
agenda.
LoginBean.java
J avaBean responsvel por verificar se o usurio est
autorizado a acessar a agenda.
AgendaServlet.java
Servlet responsvel pelo tratamento de requisies
sobre alguma funo da agenda (consulta, insero e
remoo)
AcaoBean.java
J avaBean responsvel pela execuo da ao
solicitada pelo usurio.
ConnectionBean.java
J avaBean responsvel pelo acesso ao DB e controle
das conexes.
Tabela XV.XX. Arquivos do sistema e-agenda.
O diagrama de colaborao abaixo mostra as interao entre os
componentes do sistema.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
61
Figura 24. Interao entre os componentes do sistema.
Descreveremos agora cada componente da aplicao. O exemplo
XX.XX mostra cdigo HTML da pgina agenda.html. Esta a pgina
inicial da aplicao. Ela contm o formulrio para a entrada do login e senha
para entrar no restante do site.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<HTML>
<HEAD>
<TITLE>Agenda</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<P align="center"><IMG src="tit.gif" width="350" height="100" border="0"></P>
<BR>
<CENTER>
<FORM method="POST" name="TesteSub" onsubmit="return TestaVal()"
action="/agenda/agenda"><BR>
Login:<INPUT size="20" type="text" name="login"><BR><BR>
Senha:<INPUT size="20" type="password" name="senha"><BR><BR><BR>
<INPUT type="submit" name="envia" value="Enviar">
<INPUT size="3" type="Hidden" name="corrente" value="0"><BR>
</FORM>
</CENTER>
<SCRIPT language="J avaScript">
<!--
1 e 4 Requisies
2 e 6 instanciaes
4 reencaminhamento de
requisies
3,5,7 e 8 Chamadas de mtodos
agenda.html AgendaServlet
ConnectionBean LoginBean
AcaoBean
principal.jsp
1
2
4
5
7
8
3
6
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
62
21
22
23
24
25
26
27
28
29
20
31
32
33
34
35
36
37
38
39
function TestaVal()
{
if (document.TesteSub.login.value == " " )
{
alert (" Campo Login nao Preenchido...Form nao Submetido" )
return false
}
else if (document.TesteSub.senha.value == " " )
{
alert (" Campo Senha nao Preenchido...Form nao Submetido" )
return false
}
else
{
return true
}
}
//--></SCRIPT>
</BODY></HTML>
Exemplo I.XX agenda.html.
O formulrio est definido nas linha 11 a 17. Na linha 12 o parmetro
action indica a URL que dever receber a requisio. A URL virtual e sua
associao com o Servlet AgendaServlet ser definida no arquivo
web.xml. Na linha 16 definido um campo oculto (Hidden) como o nome
de corrente e valor 0. Ele ser usado pelo AgendaServlet reconhecer a
pgina de onde saiu a requisio. As linha 19 a 31 definem uma funo em
J avaScript que ser usada para verificar se o usurio digitou o nome e a senha
antes de enviar a requisio ao usurio. O uso de J avaScript no lado cliente para
criticar a entrada do usurio muito comum pois diminui a sobrecarga do
servidor.
O exemplo XX.XX mostra cdigo da pgina principal.jsp. Esta
pgina contm o formulrio para entrada de dados para insero, remoo ou
consulta de itens da agenda. Na linha 4 a diretiva page define que o servidor
deve acompanhar a sesso do usurio e importa o pacote agenda. Na linha 7
um objeto da classe agenda.LoginBean recuperado da sesso por meio
do mtodo getAttribute(). Para recuperar o objeto preciso passar para o
mtodo o nome que est associado ao objeto na sesso. De forma semelhante,
na linha 8 um objeto da classe agenda.AcaoBean recuperado da
requisio por meio do mtodo getAttribute(). Este objeto recuperado
da requisio porque cada requisio possui uma ao diferente associada. Na
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
63
linha 9 verificado se objeto agenda.LoginBean foi recuperado e se o
retorno do mtodo getStatus() true. Se o objeto
agenda.LoginBean no foi recuperado significa que existe uma tentativa
de acesso direto pgina principal.jsp sem passar primeiro pela pgina
agenda.html ou que a sesso se esgotou. Se o mtodo getStatus()
retornar false significa que o usurio no est autorizado a acessar essa
pgina. Nestes casos processado o cdigo associado ao comando else da
linha 51 que apaga a sesso por meio do mtodo invalidate() do objeto
HttpSession (linha 53) e mostra a mensagem Usurio no autorizado
(linha 55). Caso o objeto indique que o usurio est autorizado os comandos
internos ao if so executados. Na linha 11 mostrada uma mensagem com o
nome do usurio obtido por meio do mtodo getNome() do objeto
agenda.LoginBean . Na linha 13 mostrado o resultado da ao anterior
por meio do mtodo toString() do objeto agenda.AcaoBean. A ao
pode ter sido de consulta, insero de um novo item na agenda e remoo de
um item na agenda. No primeiro caso mostrado uma lista dos itens que
satisfizeram a consulta. No segundo e terceiro casos exibida uma mensagem
indicado se a operao foi bem sucedida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<HTML><HEAD>
<TITLE>Tela da Agenda </TITLE>
</HEAD><BODY bgcolor="#FFFFFF">
<%@ page session=" true" import=" agenda.*" %>
<%
agenda.LoginBean lb = (agenda.LoginBean) session.getAttribute(" loginbean" );
agenda.AcaoBean ab = (agenda.AcaoBean) request.getAttribute(" acaobean" );
if (lb != null && lb.getStatus())
{ %>
<H2>Sess&atilde;o do <%=lb.getNome() %></H2>
<%
if (ab!=null) out.println(ab.toString());
%>
<P><BR></P>
<FORM method="POST" name="formprin" onsubmit="return TestaVal()"
action="/agenda/agenda">
Nome: <INPUT size="50" type="text" name="nome"><BR>
Telefone: <INPUT size="20" type="text" name="telefone"><BR>
Endere&ccedil;o: <INPUT size="50" type="text" name="endereco"><BR>
Email: <INPUT size="50" type="text" name="email"><BR><BR>
P&aacute;gina: <INPUT size="50" type="text" name="pagina"><BR>
Celular: <INPUT size="20" type="text" name="celular"><BR>
Descri&ccedil;&atilde;o: <INPUT size="20" type="text" name="descricao">
<BR><CENTER>
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
64
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<INPUT type="submit" name="acao" value="Consulta">
<INPUT type="submit" name="acao" value="Insere">
<INPUT type="submit" name="acao" value="Apaga"></CENTER>
<INPUT size="3" type="Hidden" name="corrente" value="1">
</FORM>
<SCRIPT language="J avaScript"><!--
function TestaVal()
{
if (document.formprin.nome.value == " " &&
document.formprin.descricao.value== " " )
{
alert (" Campo Nome ou Descricao devem ser Preenchidos!" )
return false
}
else
{
return true
}
}
//--></SCRIPT>
<%
}
else
{
session.invalidate();
%>
<H1>Usu&aacute;rio n&atilde;o autorizado</H1>
<%
}
%>
</BODY></HTML>
Exemplo I.XX principal.jsp.
As linhas 17 a 31 definem o cdigo do formulrio de entrada. Nas linhas
17 e 18 so definidos os atributos do formulrio. O atributo method indica a
requisio ser enviada por meio do mtodo POST. O atributo name define o
nome do formulrio como sendo formprin. O atributo onsubmit define
que a funo javaSript TestaVal() deve ser executada quando o formulrio
for submetido. Finalmente, o atributo action define a URL para onde a
requisio deve ser enviada. Neste caso a URL agenda/agenda que est
mapeada para o Servlet AgendaServlet. O mapeamento feito no arquivo
web.xml do diretrio web-inf do contexto agenda, como mostrado na
figura XX.XX. As linhas 19 a 25 definem os campos de texto para entrada dos
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
65
valores. As linhas 27 a 29 definem os botes de submit. Todos possuem o
mesmo nome, de forma que o Servlet precisa apenas examinar o valor do
parmetro acao para determinar qual ao foi solicitada Na linha 30 definido
um campo oculto (Hidden) como o nome de corrente e valor 0. Ele ser
usado pelo AgendaServlet reconhecer a pgina de onde saiu a requisio.
As linha 33 a 47 definem uma funo em J avaScript que ser usada para
verificar se o usurio entrou com valores nos campos de texto nome ou
decricao. No mnimo um desses campos deve ser preenchido para que uma
consulta possa ser realizada.
O exemplo XX.XX mostra cdigo do J avaBean usado para intermediar
a conexo com o banco de dados. O J avaBean ConnectionBean tem a
responsabilidade de abrir uma conexo com o banco de dados, retornar uma
referncia desta conexo quando solicitado e registrar se a conexo esta livre ou
ocupada. Neste exemplo estamos trabalhando com apenas uma conexo com o
banco de dados porque a verso gerenciador de banco de dados utilizado
(PointBase
tm
), por ser um verso limitada, permite apenas uma conexo aberta.
Se o SGBD permitir varias conexes simultneas pode ser necessrio um maior
controle sobre as conexes, mantendo-as em uma estrutura de dados
denominada de pool de conexes. Na linha 12 podemos observar que o
construtor da classe foi declarado com o modificador de acesso private. Isto
significa que no possvel invocar o construtor por meio de um objeto de
outra classe. Isto feito para que se possa ter um controle sobre a criao de
instncias da classe. No nosso caso permitiremos apenas que uma instncia da
classe seja criada, de modo que todas as referncias apontem para esse objeto.
Esta tcnica de programao, onde se permite uma nica instncia de uma
classe denominada de padro de projeto Singleton. O objetivo de utilizarmos
este padro porque desejamos que apenas um objeto controle a conexo com
o banco de dados. Ma se o construtor no pode ser chamado internamente como
uma instncia da classe criada e sua referncia passada para outros objetos?
Esta a tarefa do mtodo esttico getInstance() (linhas 14 a 19). Este
mtodo verifica se j existe a instncia e retorna a referncia. Caso a instncia
no exista ela criada antes de se retornar a referncia. O mtodo init()
(linhas 21 a 27) chamado pelo construtor para estabelecer a conexo com o
SGBD. Ele carrega o driver J DBC do tipo 4 para PointBase e obtm uma
conexo com o SGBD. O mtodo devolveConnection() (linhas 29 a 34)
chamado quando se deseja devolver a conexo. Finalmente, o mtodo
getConnection() (linhas 36 a 46) chamado quando se deseja obter a
conexo.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package agenda;
import java.sql.*;
import java.lang.*;
import java.util.*;
public class ConnectionBean {
private Connection con=null;
private static int clients=0;
static private ConnectionBean instance=null;
private ConnectionBean() { init(); }
static synchronized public ConnectionBean getInstance() {
if (instance ==null) {
instance =new ConnectionBean();
}
return instance;
}
private void init() {
try {
Class.forName("com.pointbase.jdbc.jdbcUniversalDriver");
con=
DriverManager.getConnection("jdbc:pointbase:agenda","PUBLIC","public");
}catch(Exception e){System.out.println(e.getMessage());};
}
public synchronized void devolveConnection(Connection con) {
if (this.con==con) {
clients--;
notify();
}
}
public synchronized Connection getConnection() {
if(clients>0) {
try {
wait(5000);
}
catch (InterruptedException e) {};
if(clients>0) return null;
}
clients ++;
return con;
}
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
67
47 }
Exemplo I.XX ConnectionBean.java.
O exemplo XX.XX mostra cdigo do J avaBean usado para verificar se o
usurio est autorizado a usar a agenda. O J avaBean LoginBean recebe o
nome e a senha do usurio, obtm a conexo com o SGBD e verifica se o
usurio est autorizado, registrando o resultado da consulta na varivel
status (linha 10). Tudo isso feito no construtor da classe (linhas 12 a 35).
Note que na construo do comando SQL (linhas 17 a 20) inserido uma
juno entre as tabelas PESSOA e USUARIO de modo a ser possvel recuperar
os dados relacionados armazenados em ambas as tabelas. Os mtodos
getLogin(), getNome() e getStatus() (linhas 36 a 38) so
responsveis pelo retorno do login, nome e status da consulta respectivamente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package agenda;
import java.sql.*;
import java.lang.*;
import java.util.*;
public class LoginBean {
protected String nome =null;
protected String login=null;
protected boolean status=false;
public LoginBean(String login, String senha)
{
this.login =login;
Connection con=null;
Statement stmt =null;
String consulta ="SELECT NOME FROM PESSOA, USUARIO "+
"WHERE USUARIO.ID =PESSOA.ID AND "+
"USUARIO.SENHA ='"+senha+"' AND "+
"USUARIO.LOGIN ='"+login+"'";
try {
con=ConnectionBean.getInstance().getConnection();
stmt =con.createStatement();
ResultSet rs =stmt.executeQuery(consulta);
if(rs.next()) {
status =true;
nome =rs.getString("NOME");
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
68
28
29
30
31
32
33
34
35
36
37
38
39
}
}catch(Exception e){System.out.println(e.getMessage());}
finall y {
ConnectionBean.getInstance().devolveConnection(con);
try{stmt.close();}catch(Exception ee){};
}
}
public String getLogin(){return login;}
public String getNome(){return nome;}
public boolean getStatus(){return status;}
}
Exemplo I.XX LoginBean.java.
O exemplo XX.XX mostra cdigo do Servlet que implementa a camada
de controle do modelo MVC. O Servlet AgendaServlet recebe as
requisies e, de acordo com os parmetros, instncia os J avaBeans apropriados
e reencaminha as requisies para as pginas corretas. Tanto o mtodo
doGet() (linhas 9 a 12) quanto o mtodo doPost()(linhas 13 a 17)
invocam o mtodo performTask()(linhas 19 a 61) que realiza o tratamento
da requisio. Na linhas 24 a 26 do mtodo performTask() obtido o
valor do parmetro corrente que determina a pgina que originou a
requisio. Se o valor for nulo assumido o valor default zero. Na linha 30
executado um comando switch sobre esse valor, de modo a desviar para
bloco de comandos adequado. O bloco que vai da linha 32 at a linha 43 trata a
requisio originada em uma pgina com a identificao 0 (pgina
agenda.html). Nas linhas 32 e 33 so recuperados o valor de login e senha
digitados pelo usurio. Se algum desses valores for nulo ento a requisio deve
ser reencaminhada para a pgina de login (agenda.html) novamente (linha
35). Caso contrrio instanciado um objeto LoginBean, inserido na sesso
corrente e definida a pgina principal.jsp como a pgina para o
reencaminhamento da requisio (linhas 38 a 41). J o bloco que vai da linha 44
at a linha 54 trata a requisio originada em uma pgina com a identificao 1
(pgina principal.jsp). Na linha 44 recuperado o objeto
HttpSession corrente. O argumento false utilizado para impedir a
criao de um novo objeto HttpSession caso no exista um corrente. Se o
valor do objeto for null, ento a requisio deve ser reencaminhada para a
pgina de login (linha 47). Caso contrrio instanciado um objeto AcaoBean,
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
69
inserido na requisio corrente e definida a pgina principal.jsp como a
pgina para o reencaminhamento da requisio (linhas 50 a 52). Na linha 56 a
requisio reencaminhada para a pgina definida (pgina agenda.html ou
principal.jsp).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package agenda;
import javax.servlet.*;
import javax.servlet.http.*;
import agenda.*;
public class AgendaServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
performTask(request,response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
{
performTask(request,response);
}
public void performTask(HttpServletRequest request,
HttpServletResponse response)
{
String url;
HttpSession sessao;
String corrente =request.getParameter("corrente");
int icorr=0;
if (corrente !=null) icorr =Integer.parseInt(corrente);
try
{
switch(icorr)
{
case 0: String login =request.getParameter("login");
String senha =request.getParameter("senha");
if (login ==nul l||senha ==null)
url="/agenda.html";
el se
{
sessao =request.getSession(true);
sessao.setAttribute("loginbean",
new agenda.LoginBean(login,senha));
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
70
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
url="/principal.jsp";
};
break;
case 1:
sessao =request.getSession(false);
if (sessao ==null)
url="/agenda.html";
el se
{
request.setAttribute("acaobean",
new agenda.AcaoBean(request));
url="/principal.jsp";
};
break;
}
getServletContext().getRequestDispatcher(url).forward(request,response);
}catch (Exception e) {
System.out.println("AgendaServlet falhou: ");
e.printStackTrace();
}
}
}
Exemplo I.XX AgendaServlet.java.
O exemplo XX.XX mostra cdigo do J avaBean usado para realizar a
manuteno da agenda. O J avaBean AcaoBean responsvel pela consulta,
remoo e insero de novos itens na agenda. Um objeto StringBuffer
referenciado pela varivel retorno utilizado pelo J avaBean para montar o
resultado da execuo. O construtor (linhas 16 a 27) verifica o tipo de
requisio e invoca o mtodo apropriado.
O mtodo consulta() (linhas 29 a 77) responsvel pela realizao
de consultas. As consultas podem ser realizadas sobre o campo nome ou
descrio e os casamentos podem ser parciais, uma vez que usado o operador
LIKE. A consulta SQL montada nas linhas 40 a 47. Na linha 50 obtida uma
conexo com SGBD por meio do objeto ConnectionBean. Na linha 57 o
comando SQL executado e as linhas 59 a 72 montam o resultado da consulta.
O mtodo insere() (linhas 79 a 148) responsvel por inserir um
item na agenda. Na linha 95 obtida uma conexo com SGBD por meio do
objeto ConnectionBean. Para inserir um novo item preciso obter o
nmero do ltimo identificador usado, incrementar o identificador e inserir na
base o item com o identificador incrementado. Esta operao requer que no
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
71
seja acrescentado nenhum identificador entre a operao de leitura do ltimo
identificador e a insero de um novo item. Ou seja, necessrio que essas
operaes sejam tratadas como uma nica transao e o isolamento entre as
transaes sejam do nvel Repeatable Read. A definio do inicio da transao
feita no comando da linha 102. A mudana do nvel de isolamento feita
pelos comandos codificados nas linha 103 a 109. Na linha 112 invocado o
mtodo obtemUltimo() (linhas 150 a 171) para obter o ltimo identificador
utilizado. As linhas 114 a 128 montam o comando SQL para a execuo. O
comando SQL executado na linha 131. O fim da transao definido pelo
comando da linha 132. Ao fim da transao, de forma a no prejudicar a
concorrncia, o nvel de isolamento deve retornar para um valor mais baixo.
Isto feito pelos comandos das linhas 133 a 137.
O mtodo apaga() (linhas 173 a 201) responsvel por remover um
item da agenda. As linhas 175 a 180 contm o cdigo para verificar se o usurio
digitou o nome associado ao item que deve ser removido. A linha 181 montam
o comando SQL para a execuo. Na linha 184 obtida uma conexo com
SGBD por meio do objeto ConnectionBean. O comando SQL executado
na linha 191.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package agenda;
import java.lang.*;
import java.util.*;
import java.sql.*;
public class AcaoBean
{
private Connection con=null;
private StringBuffer retorno =null;
private Statement stmt=null;
private String [] legenda={"C&oacute;digo","Nome","Telefone",
"Endere&ccedil;o", "email","hp",
"celular","Descri&ccedil;&atilde;o"};
public AcaoBean(javax.servlet.http.HttpServletRequest request)
{
String acao =request.getParameter("acao");
if (acao.equals("Consulta"))
{
String nome =request.getParameter("nome");
String descri =request.getParameter("descricao");
consulta(nome,descri);
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
72
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
}
else if (acao.equals("Insere")) insere(request);
else if (acao.equals("Apaga")) apaga(request);
}
private void consulta(String nome,String descri)
{
String consulta =null;
if ((nome ==null||nome.length()<1) &&
(descri ==nul l|| descri.length()<1))
{
retorno =new StringBuffer("Digite o nome ou descricao!");
return;
}
if (descri ==null|| descri.length()<1)
consulta ="SELECT * FROM PESSOA WHERE NOME LIKE '%"+
nome+"%'"+" ORDER BY NOME";
else if (nome ==null|| nome.length()<1)
consulta ="SELECT * FROM PESSOA WHERE DESCRICAO LIKE '%"+
descri+"%'"+" ORDER BY NOME";
else consulta="SELECT * FROM PESSOA WHERE DESCRICAO LIKE '%"+
descri+"%' AND NOME LIKE '%"+nome+"%' ORDER BY NOME";
try
{
con=ConnectionBean.getInstance().getConnection();
if (con ==null)
{
retorno =new StringBuffer("Servidor ocupado. Tente mais tarde.!");
return;
}
stmt =con.createStatement();
ResultSet rs =stmt.executeQuery(consulta);
retorno =new StringBuffer();
retorno.append("<br><h3>Resultado</h3><br>");
while(rs.next())
{
retorno.append("ID:").append(rs.getString("id"));
retorno.append("<br>Nome:").append(rs.getString("Nome"));
retorno.append("<br>Telefone:").append(rs.getString("Telefone"));
retorno.append("<br>Endereco:").append(rs.getString("Endereco"));
retorno.append("<br>email:").append(rs.getString("email"));
retorno.append("<br>hp:").append(rs.getString("hp"));
retorno.append("<br>celular:").append(rs.getString("celular"));
retorno.append("<br>descricao:").append(rs.getString("descricao"));
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
73
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
retorno.append("<br><br>");
}
} catch(Exception e){System.out.println(e.getMessage());}
finall y {ConnectionBean.getInstance().devolveConnection(con);
try{stmt.close();}catch(Exception ee){};
}
}
private void insere(javax.servlet.http.HttpServletRequest request)
{
String[] par ={"telefone","endereco","email","hp","celular","descricao"};
StringBuffer comando =new StringBuffer("INSERT INTO PESSOA(");
StringBuffer values =new StringBuffer(" VALUES(");
String aux =request.getParameter("nome");
if (aux ==null || aux.length()<1)
{
retorno =new StringBuffer("<br><h3>Digite o nome!</h3><br>");
return;
}
try
{
con=ConnectionBean.getInstance().getConnection();
if (con ==null)
{
retorno =new StringBuffer("Servidor ocupado. Tente mais tarde!");
return;
}
con.setAutoCommit(false);
DatabaseMetaData meta=con.getMetaData();
if(meta.supportsTransactionIsolationLevel(
con.TRANSACTION_REPEATABLE_READ)) {
con.setTransactionIsolation(
con.TRANSACTION_REPEATABLE_READ);
}
int ultimo =obtemUltimo(con);
if (ultimo==-1) return;
ultimo++;
comando.append("id,nome");
values.append(ultimo+",'").append(aux).append("'");
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
74
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
for(int i=0;i<par.length;i++)
{
aux =request.getParameter(par[i]);
if (aux !=null && aux.length()>0)
{
comando.append(",").append(par[i]);
values.append(",'").append(aux).append("'");
}
}
comando.append(")");
values.append(")");
aux =comando.toString()+values.toString();
stmt =con.createStatement();
stmt.executeUpdate(aux);
con.setAutoCommit(true);
if(meta.supportsTransactionIsolationLevel(
con.TRANSACTION_READ_COMMITTED)) {
con.setTransactionIsolation(
con.TRANSACTION_READ_COMMITTED);
}
retorno =new StringBuffer("<br><h3>Inserido!</h3><br>");
return;
} catch(Exception e)
{retorno =
new StringBuffer("<br><h3>Erro:"+e.getMessage()+"!</h3><br>"); }
finall y
{
ConnectionBean.getInstance().devolveConnection(con);
try{stmt.close();}catch(Exception ee){};
}
}
private int obtemUltimo(Connection con)
{
String consulta ="SELECT MAX(ID) AS MAX FROM PESSOA";
try
{
if (con ==null)
{
retorno =new StringBuffer("Servidor ocupado. Tente mais tarde.!");
return -1;
}
stmt =con.createStatement();
ResultSet rs =stmt.executeQuery(consulta);
if(rs.next())
return Integer.parseInt(rs.getString("max"));
else return 0;
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
75
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
}catch(Exception e) {
retorno =
new StringBuffer("<br><h3>Erro:"+e.getMessage()+"!</h3><br>");
return -1;
}
finall y {try{stmt.close();}catch(Exception ee){};}
}
private void apaga(javax.servlet.http.HttpServletRequest request)
{
String aux =request.getParameter("nome");
if (aux ==null || aux.length()<1)
{
retorno =new StringBuffer("<br><h3>Digite o nome!</h3><br>");
return;
}
String consulta ="DELETE FROM PESSOA WHERE NOME ='"+aux+"'";
try
{
con=ConnectionBean.getInstance().getConnection();
if (con ==null)
{
retorno =new StringBuffer("Servidor ocupado. Tente mais tarde.!");
return;
}
stmt =con.createStatement();
stmt.executeUpdate(consulta);
retorno =new StringBuffer("<br><h3>Removido!</h3><br>");
return;
}catch(Exception e){
retorno =new StringBuffer("<br><h3>Erro:"+e.getMessage()+"!</h3><br>");
}
finall y {
ConnectionBean.getInstance().devolveConnection(con);
try{stmt.close();}catch(Exception ee){};}
}
public String[] getLeg(){return legenda;}
public String toString(){return retorno.toString();}
}
Exemplo I.XX AcaoBean.java.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
76
Instalao
Para instalar crie a seguinte estrutura de diretrio abaixo do diretrio
webapps do Tomcat:
webapps
|_____ agenda
|_____ Web-inf
|_____classes
|_______agenda
Figura 25. Estrutura de diretrios para a aplicao agenda.
O arquivo web.xml deve ser alterado para conter mapeamento entre a
URL agenda e o Servlet AgendaServlet.
...
<web-app>
<servlet>
<servlet-name>
agenda
</servlet-name>
<servlet-class>
agenda.AgendaServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
agenda
</servlet-name>
<url-pattern>
/agenda
</url-pattern>
</servlet-mapping>
...
</web-app>
Servlets e
J avaBeans
pginas
HTML e J SP
arquivo
web.xml
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
77
Figura XV.XX. Arquivo web.xml para a agenda.
Consideraes sobre a soluo
A aplicao acima implementa uma agenda que pode ser acessada por meio
da Internet, no entanto, devido falta de espao e necessidade de destacarmos
os pontos principais, alguns detalhes foram deixados de lado, como por
exemplo uma melhor interface com o usurio. Abaixo seguem alguns
comentrios sobre algumas particularidades da aplicao:
1. O J avaBean da classe LoginBean armazenado na sesso para
permitir a verificao se o acesso ao site autorizado. Isto impede que
os usurios tentem acessar diretamente a pgina principal.jsp da
agenda. Caso tentem fazer isso, a sesso no conter um objeto
LoginBean associado e, portanto, o acesso ser recusado.
2. O J avaBean da classe AcaoBean armazenado no objeto request
uma vez que sua informaes so alteradas a cada requisio. Uma
forma mais eficiente seria manter o objeto AcaoBean na sesso e cada
novo requisio invocar um mtodo do AcaoBean para gerar os
resultados. No entanto, o objetivo da nossa implementao no fazer a
aplicao mais eficiente possvel, e sim mostrar para o leitor uma
aplicao com variadas tcnicas.
3. Apesar de termos adotado o padro MVC de desenvolvimento a
aplicao no exibe uma separao total da camada de apresentao
(Viso) em relao camada do modelo. Parte do cdigo HTML da
viso inserido pelo AcaoBean no momento da construo da String
contendo o resultado da ao. Isto foi feito para minimizar a quantidade
de cdigo J ava na pgina J SP. Pode-se argumentar que neste caso a
promessa da separao entre as camadas no cumprida totalmente.
Uma soluo para o problema seria gerar o contedo em XML e utilizar
um analisador de XML para gerar a pgina de apresentao. No entanto,
o uso da tecnologia XML foge ao escopo deste livro.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
78
4. A soluo apresenta cdigo redundante para criticar as entradas do
usurio. Existe cdigo J avaScript nas pginas, e cdigo J ava no Servlet
e J avaBeans. O uso de cdigo J avaScript nas pginas para crticas de
entrada indispensvel para aliviarmos a carga sobre o servidor. J o
cdigo para crtica no servidor no causa impacto perceptvel e til para
evitar tentativas de violao.
5. O cdigo exibe uma preocupao com a com concorrncia de acessos ao
banco de dados que aparentemente no necessria, uma vez que
apenas uma conexo por vez permitida. No entanto, procuramos fazer
o cdigo o mais genrico possvel no pouco espao disponvel.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
79
Bibliografia
Eckel B. Thinking in Java. 2
nd
Ed. New J ersey : Prentice Hall, 2000.
Gosling J ., J oy W., Steele G. The Java Language Specification. Massachusetts
: Addison-Wesley, 1996.
Oaks S. Java Security. California : OReilly & Associates, Inc, 1998.
Oaks S., Wong H. Java Threads. 2

Ed. California : OReilly & Associates, Inc,


1999.
Watt D. A. Programming Language Concepts and Paradigms. Great Britain :
Prentice Hall, 1990.
Ethan H., Lycklama E. How do you Plug Java Memory Leaks? Dr. Dobbs
J ournal, San Francisco, CA, No. 309, February 2000.
Wahli U. e outros. Servlet and JSP Programming with IBM WebSphere Studio
and VisualAge for J ava, IBM RedBooks, California, May 2000.
Sadtler C. e outros. Patterns for e-business: User-to-Business Patterns for
Topology 1 and 2 using WebSphere Advanced Edition, IBM RedBooks,
California, April 2000.
Bagwel D. e outros. An Approach to Designing e-business Solutions, IBM
RedBooks, California, December 1998.
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
80
Links
Revistas
http://www.javaworld.com/
Revista online sobre J ava.
Livros
http://www.eckelobjects.com/
Pgina do autor do livro Thinking in Java, atualmente em segunda edio.
O livro pode ser baixado gratuitamente no site.
http://www.redbooks.ibm.com/booklist.html
Livros da IBM
Servidores
http://jakarta.apache.org
Pgina do projeto J akarta que desenvolveu o Tomcat.
http://www.metronet.com/~wjm/tomcat
Lista Tomcat
http://www.jboss.org
Servidor de aplicao gratuito habilitado para EJ B
Dicas J ava e recursos
http://java.sun.com/
Pgina da Sun com informaes, tutoriais e produtos J ava.
http://gamelan.earthweb.com/
Pgina da com informaes, Applets, Lista de discusso, tutoriais.
http://www.inquiry.com/techtips/java_pro
Ask the J ava Pro
http://www.jguru.com/
jGuru.com(Home): Your view of the J ava universe
Apostila Servlet/JSP
Alcione de Paiva Oliveira - Universidade Federal de Viosa
81
http://www.soujava.org.br
Bem Vindo ao SouJ ava!
Servlets e J SP
http://www.servlet.com/srvdev.jhtml
Servlet Inc : Developers Forum
http://www.servlets.com
Servlets.com
http://www.jspin.com/home
J spin.com - The J SP Resource Index
http://www.burridge.net/jsp/jspinfo.html
Web Development with J SP: J SP, J ava Servlet, and J ava Bean
Information
http://www.apl.jhu.edu/~hall/java/Servlet-
Tutorial
A Tutorial on J ava Servlets and J ava Server Pages (J SP)

Anda mungkin juga menyukai