Sie sind auf Seite 1von 30

Servlets:

Redirecionamento,
Atributos e Sesses

HttpRequest

Alm dos parmetros, possvel acessar:

Informaes sobre a plataforma do cliente e


do navegador:
String cliente = request.getHeader(User-Agent);

Os cookies associados com a requisio:


Cookies[] cookies = request.getCookies();

A sesso associada com a requisio:


HttpSession sessao = request.getSession();

O mtodo HTTP da requisio:


String metodo = requiest.getMethod();

HttpResponse

Usada na maioria das vezes para enviar dados ao cliente


02 mtodos principais:

setContentType(String)

Headers
Erros de envio
Cookies

02 tipos de sada:

getWriter()

possvel usar a resposta para definir:

text/html, application/jar, application/pdf, etc...

Caracteres (PrintWriter) ou bytes (ServletOutputStream)

Pode redirecionar a sada com o mtodo


sendRedirect(String)

Redirect vs. Request


Dispatch

O mtodo sendRedirect(String) da resposta


redireciona para uma URL e deixa o
navegador tratar a URL:

pode ser um endereo externo aplicao, por


exemplo, http://www.ufu.br:
request.sendRedirect(http://www.ufu.br);

J o mtodo getRequestDispatcher(String) da
requisio permite que o seu parmetro seja
um endereo relativo aplicao ou um
recurso, exemplo:

request.getRequestDispatcher(resultado.jsp);

Sesses

Como o HTTP no mantm estado de


sesso, so as aplicaes Web que
precisam cuidar de mant-lo quando
necessrio

Sesses representam um cliente


A sesso nica para cada cliente e
persiste atravs de vrias requisies

Sesses

Sesses so representados por objetos


HttpSession e so obtidas a partir de
uma requisio
Dois mtodos podem ser usados

HttpSession session =
request.getSession(false);

Se a sesso no existir, retorna null, caso


contrrio retorna sesso.

HttpSession session = request.getSession();

Retorna a sesso ou cria uma nova. Mesmo que


getSession(true)

Sesses

Para saber se uma sesso nova, use o mtodo


isNew()
if (session.isNew()) {
myObject = new BusinessObject();
} else {
myObject = (BusinessObject) session.getAttribute("obj");
}

getSession() deve ser chamado antes de


getOutputStream() ou qualquer mtodo que obtenha
o stream de sada, como getWriter()
Sesses podem ser implementadas com cookies, e
cookies so definidos no cabealho HTTP (que
montado antes do texto)

O que so atributos?

Atributos so objetos Java que podem


ser compartilhados entre os recursos de
uma aplicao Web
02 grandes perguntas sobre atributos:
Qual recurso pode acessar os atributos?
Quanto tempo cada atributo fica disponvel
para ser acessado?
Em outras palavras:
Qual o escopo de cada atributo?

Atributos NO so parmetros!!!

Mtodos utilizados para


Atributos

Todos os escopos possuem pelo menos


os 04 mtodos a seguir:

getAttribute(String)
setAttribute(String, Object)
removeAttribute(String)
getAttributeNames()

Os atributos so armazenados na forma


de um Map, com nome e valor

Escopo de objetos em
servlets

Servlets podem compartilhar


informaes de vrias maneiras

Usando meios persistentes (bancos de


dados, arquivos, etc)
Usando objetos na memria por escopo
(requisio, sesso, contexto)
Usando variveis estticas ou de instncia

Escopo de objetos em
servlets

Servlets oferecem trs nveis diferentes de


persistncia na memria (ordem decrescente de
durao)
Contexto da aplicao: vale enquanto aplicao estiver na
memria (javax.servlet.ServletContext)
Sesso: dura uma sesso do cliente
(javax.servlet.http.HttpSession)
Requisio: dura uma requisio
(javax.servlet.ServletRequest)
Para gravar dados em um objeto de persistncia na memria

objeto.setAttribute("nome", dados);

Para recuperar ou remover os dados


Object dados = objeto.getAttribute("nome");
objeto.removeAttribute("nome");

Escopo de objetos em
servlets: resumo

Escopo de Atributos

Contexto: no thread-safe!

Sesso: no thread-safe!

Acessvel por: qualquer recurso da aplicao


Por quanto tempo existe: enquanto existir a aplicao
Exemplo de uso: nmero de usurios ativos
Acessvel por: recursos de uma sesso
Por quanto tempo existe: enquanto a sesso existir
Exemplo de uso: carrinho de compras

Requisio: thread-safe!

Acessvel por: recurso da requisio


Por quanto tempo existe: enquanto a requisio existir
Exemplo de uso: dados de um determinado item a venda

O que thread-save ?

Pode ser usado em aplicaes multi-thread


usando o mesmo objeto (no a mesma
classe, a mesma instncia)
Quando o objeto puder ser acessado por
vrias threads ao mesmo tempo, ele deve
ser thread-safe, e as duas formas mais
simples e comuns de se conseguir isso so:

Fazendo o objeto ser imutvel.


Usando sincronizao nos lugares adequados
(modificador synchronized)

Compartilhamento de objetos
na sesso

Dois mtodos

setAttribute("nome", objeto);
Object getAttribute("nome");

permitem o compartilhamento de objetos na sesso. Ex:


Requisio 1
String[] vetor = {"um", "dois", "tres"};
HttpSession session = request.getSession();
session.setAttribute("dados", vetor);

Requisio 2
HttpSession session = request.getSession();
String[] dados = (String[])session.getAttribute("dados");

Como a sesso pode persistir alm do tempo de uma


requisio, possvel que a persistncia de alguns objetos
no sejam desejveis

Use removeAttribute("nome") para remover objetos da sesso

Exemplo

Exerccio

Dado um formulrio HTML, construa um servlet que


armazene os dados vindo de um formulrio em um Java
Bean e o compartilhe com outros recursos da mesma sesso
por meio de atributos:
Os dados do formulrio so:

Este exerccio envolve o uso dos seguintes conceitos j


vistos:

CPF, Nome da Pessoa, Data de Nascimento, Profisso

Definio de servlets e mapeamento no web.xml


Criao de formulrios em HTML
Envio de requisies para servlets
Respostas HTML a partir de servlets
Recuperao de parmetros de requisio
Compartilhamento de objetos por meio de atributos

CUIDADO!!! No confundam PARMETRO com ATRIBUTO!!!

Exerccio cont...

Gerncia de sesses

No h como saber que cliente no precisa mais


da sesso

Pode-se definir um timeout em minutos para a


durao de uma sesso desde a ltima requisio do
cliente

setMaxInactiveInterval(int) define novo valor para timeout


int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no web.xml para


todas as sesses
Outros mtodos teis: getLastAccessedTime() e
getCreationTime()

Para destruir uma sesso use


session.invalidate();

Gerncia de sesses

Eventos de ligao e ativao de uma


sesso podem ser controlados com
implementaes das interfaces
HttpSessionBindingListener e
HttpSessionActivationListener
Consulte a documentao.

Timeout default no
web.xml

O elemento <session-config> permite definir a


configurao da sesso

Deve aparecer depois dos elementos <servlet-mapping>

O trecho abaixo redefine o tempo de durao


default da sesso em 15 minutos para todas as
sesses
<session-config>
<session-timeout>15</session-timeout>
</session-config>

Uma sesso especfica pode ter uma durao


diferente se especificar usando
setMaxInactiveInterval()

Sesso prova de clientes

A sesso implementada com cookies se o cliente


suport-los

Caso o cliente no suporte cookies, o servidor precisa usar outro


meio de manter a sesso

Soluo: sempre que uma pgina contiver uma URL para


outra pgina da aplicao, a URL deve estar dentro do
mtodo encodeURL() de HttpServletResponse
out.print("<a href='" +
response.encodeURL("caixa.jsp") + "'>");

Se cliente suportar cookies, URL passa inalterada (o


identificador da sesso ser guardado em um cookie)
Se cliente no suportar cookies, o identificador ser
passado como parmetro da requisio.

ex:http://localhost:8080/servlet/Teste;jsessionid=A424JX08S99

Captura de eventos de
atributos

possvel saber quando um atributo foi adicionado a


uma sesso usando HttpSessionAttributeListener e
HttpSessionBindingEvent
Mtodos a implementar do Listener

HttpSessionBindingEvent possui trs mtodos para


recuperar sesso e nome e valor dos atributos

attributeAdded(ServletContextAttributeEvent e)
attributeRemoved(ServletContextAttributeEvent e)
attributeReplaced(ServletContextAttributeEvent)

String getName()
String getValue()
HttpSession getSession()

preciso registrar o listener no web.xml

Captura de eventos do
ciclo de vida

Pode-se saber quando uma sesso foi criada,


invalidada ou expirada usando HttpSessionListener:

Para saber quando uma sesso existente foi ativada


ou est para ser passivada usa-se
HttpSessionActivationListener:

Mtodos sessionCreated() e sessionDestroyed()

Mtodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos so associados a


uma sesso e quando deixam a sesso (por
qualquer razo) deve-se implementar um
HttpSessionBindingListener

Mtodos valueBound() e valueUnbound()

Lidando com recursos


compartilhados
H vrios cenrios de acesso concorrente

Servlets so automaticamente multithreaded

Componentes compartilhando sesso ou contexto


Threads acessando variveis compartilhadas
O container cria um thread na instncia para cada requisio
preciso sincronizar blocos crticos para evitar problemas decorrentes
do acesso paralelo

Exemplo: protegendo definio de atributo de contexto:


synchronized(this) {
context.setAttribute("nome", objeto);
}

Para situaes onde multithreading inaceitvel, servlet


deve implementar a interface SingleThreadModel (s um
thread estar presente no mtodo service() ao mesmo
tempo)

Evite isto a todo custo: muito ineficiente!

Exerccios

Criar uma aplicao Web usando os objetos de negcio:

Produto. Atributos (mtodos get/set): int id, String nome, String


preco
Carrinho. Mtodos: addProduto(Produto), removeProduto(id),
Produto getProduto(id), Produto[] getProdutos()
a. Crie um servlet AdminLojaServlet

LojaServlet recebe parmetros para adicionar um produto e lista os


produtos existentes como resposta

b. Crie um servlet ComprasServlet

ComprasServlet lista todos os produtos disponveis com um boto


Adicionar ao lado de cada um. O boto deve adicionar o produto
correspondente no objeto Carrinho.
A resposta deve mostrar cada item includo com um boto
Remover. Deve haver tambm boto Comprar Mais e Encerrar
O Carrinho deve persistir entre requisies

Cookies

Como j podemos manipular sesses de maneira


transparente com HttpSession, usamos cookies
principalmente para definir preferncias que iro
durar alm do tempo da sesso

Servidor ir criar cabealho que ir instruir o browser a


criar um arquivo guardando as informaes do cookie

Para criar cookies que duram mais que uma sesso


(cookies persistentes no disco do cliente) preciso

Criar um novo objeto Cookie


Definir a durao do cookie com o mtodo setMaxAge()
Definir outros mtodos se necessrio
Adicionar o cookie resposta

Como usar cookies


Exemplo de gravao:
1) definir um cookie que contenha o nome do
usurio recebido como parmetro na
requisio
String nome = request.getParameter("nome");
Cookie c = new Cookie("usuario", nome);

2) Definir a durao do cookie em segundos


c.setMaxAge(1000 * 24 * 3600 * 60); // 60 dias

3) Adicionar o cookie resposta


response.addCookie(c);

Como usar cookies


Exemplo de leitura:
1) recuperar o cookie da requisio
Cookie[] cookies = request.getCookies();

2) Extrair cookie para um objeto local


for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("nome")
{
usuario = cookies[i].getValue();
}
}

Exerccio

Crie uma tela de entrada na loja


LojaServlet com
links para os servlets.
Ela deve requisitar um e-mail. Grave o
e-mail como
um Cookie com durao de 30 dias.
"Lembre-se" do
e-mail na prxima requisio e mostre-o
no text-field

Das könnte Ihnen auch gefallen