servlets: redirecionamento, atributos e sessões. httprequest além dos parâmetros, é possível...

30
Servlets: Redirecionamento, Atributos e Sessões

Upload: internet

Post on 18-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

ServletsRedirecionamento Atributos e Sessotildees

HttpRequest Aleacutem dos paracircmetros eacute possiacutevel acessar

Informaccedilotildees sobre a plataforma do cliente e do navegadorString cliente = requestgetHeader(ldquoUser-Agentrdquo)

Os cookies associados com a requisiccedilatildeoCookies[] cookies = requestgetCookies()

A sessatildeo associada com a requisiccedilatildeoHttpSession sessao = requestgetSession()

O meacutetodo HTTP da requisiccedilatildeoString metodo = requiestgetMethod()

HttpResponse Usada na maioria das vezes para enviar dados ao

cliente 02 meacutetodos principais

setContentType(String) texthtml applicationjar applicationpdf etc

getWriter() Eacute possiacutevel usar a resposta para definir

Headers Erros de envio Cookies

02 tipos de saiacuteda Caracteres (PrintWriter) ou bytes (ServletOutputStream)

Pode redirecionar a saiacuteda com o meacutetodo sendRedirect(String)

Redirect vs Request Dispatch

O meacutetodo sendRedirect(String) da resposta redireciona para uma URL e deixa o navegador tratar a URL pode ser um endereccedilo externo agrave aplicaccedilatildeo por

exemplo httpwwwufubrrequestsendRedirect(ldquohttpwwwufubrrdquo)

Jaacute o meacutetodo getRequestDispatcher(String) da requisiccedilatildeo permite que o seu paracircmetro seja um endereccedilo relativo agrave aplicaccedilatildeo ou um recurso exemplo requestgetRequestDispatcher(ldquoresultadojsprdquo)

Sessotildees Como o HTTP natildeo manteacutem estado de

sessatildeo satildeo as aplicaccedilotildees Web que precisam cuidar de mantecirc-lo quando necessaacuterio Sessotildees representam um cliente A sessatildeo eacute uacutenica para cada cliente e

persiste atraveacutes de vaacuterias requisiccedilotildees

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 2: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

HttpRequest Aleacutem dos paracircmetros eacute possiacutevel acessar

Informaccedilotildees sobre a plataforma do cliente e do navegadorString cliente = requestgetHeader(ldquoUser-Agentrdquo)

Os cookies associados com a requisiccedilatildeoCookies[] cookies = requestgetCookies()

A sessatildeo associada com a requisiccedilatildeoHttpSession sessao = requestgetSession()

O meacutetodo HTTP da requisiccedilatildeoString metodo = requiestgetMethod()

HttpResponse Usada na maioria das vezes para enviar dados ao

cliente 02 meacutetodos principais

setContentType(String) texthtml applicationjar applicationpdf etc

getWriter() Eacute possiacutevel usar a resposta para definir

Headers Erros de envio Cookies

02 tipos de saiacuteda Caracteres (PrintWriter) ou bytes (ServletOutputStream)

Pode redirecionar a saiacuteda com o meacutetodo sendRedirect(String)

Redirect vs Request Dispatch

O meacutetodo sendRedirect(String) da resposta redireciona para uma URL e deixa o navegador tratar a URL pode ser um endereccedilo externo agrave aplicaccedilatildeo por

exemplo httpwwwufubrrequestsendRedirect(ldquohttpwwwufubrrdquo)

Jaacute o meacutetodo getRequestDispatcher(String) da requisiccedilatildeo permite que o seu paracircmetro seja um endereccedilo relativo agrave aplicaccedilatildeo ou um recurso exemplo requestgetRequestDispatcher(ldquoresultadojsprdquo)

Sessotildees Como o HTTP natildeo manteacutem estado de

sessatildeo satildeo as aplicaccedilotildees Web que precisam cuidar de mantecirc-lo quando necessaacuterio Sessotildees representam um cliente A sessatildeo eacute uacutenica para cada cliente e

persiste atraveacutes de vaacuterias requisiccedilotildees

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 3: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

HttpResponse Usada na maioria das vezes para enviar dados ao

cliente 02 meacutetodos principais

setContentType(String) texthtml applicationjar applicationpdf etc

getWriter() Eacute possiacutevel usar a resposta para definir

Headers Erros de envio Cookies

02 tipos de saiacuteda Caracteres (PrintWriter) ou bytes (ServletOutputStream)

Pode redirecionar a saiacuteda com o meacutetodo sendRedirect(String)

Redirect vs Request Dispatch

O meacutetodo sendRedirect(String) da resposta redireciona para uma URL e deixa o navegador tratar a URL pode ser um endereccedilo externo agrave aplicaccedilatildeo por

exemplo httpwwwufubrrequestsendRedirect(ldquohttpwwwufubrrdquo)

Jaacute o meacutetodo getRequestDispatcher(String) da requisiccedilatildeo permite que o seu paracircmetro seja um endereccedilo relativo agrave aplicaccedilatildeo ou um recurso exemplo requestgetRequestDispatcher(ldquoresultadojsprdquo)

Sessotildees Como o HTTP natildeo manteacutem estado de

sessatildeo satildeo as aplicaccedilotildees Web que precisam cuidar de mantecirc-lo quando necessaacuterio Sessotildees representam um cliente A sessatildeo eacute uacutenica para cada cliente e

persiste atraveacutes de vaacuterias requisiccedilotildees

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 4: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Redirect vs Request Dispatch

O meacutetodo sendRedirect(String) da resposta redireciona para uma URL e deixa o navegador tratar a URL pode ser um endereccedilo externo agrave aplicaccedilatildeo por

exemplo httpwwwufubrrequestsendRedirect(ldquohttpwwwufubrrdquo)

Jaacute o meacutetodo getRequestDispatcher(String) da requisiccedilatildeo permite que o seu paracircmetro seja um endereccedilo relativo agrave aplicaccedilatildeo ou um recurso exemplo requestgetRequestDispatcher(ldquoresultadojsprdquo)

Sessotildees Como o HTTP natildeo manteacutem estado de

sessatildeo satildeo as aplicaccedilotildees Web que precisam cuidar de mantecirc-lo quando necessaacuterio Sessotildees representam um cliente A sessatildeo eacute uacutenica para cada cliente e

persiste atraveacutes de vaacuterias requisiccedilotildees

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 5: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Sessotildees Como o HTTP natildeo manteacutem estado de

sessatildeo satildeo as aplicaccedilotildees Web que precisam cuidar de mantecirc-lo quando necessaacuterio Sessotildees representam um cliente A sessatildeo eacute uacutenica para cada cliente e

persiste atraveacutes de vaacuterias requisiccedilotildees

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 6: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Sessotildees Sessotildees satildeo representados por objetos

HttpSession e satildeo obtidas a partir de uma requisiccedilatildeo

Dois meacutetodos podem ser usados HttpSession session =

requestgetSession(false) Se a sessatildeo natildeo existir retorna null caso

contraacuterio retorna sessatildeo HttpSession session = requestgetSession()

Retorna a sessatildeo ou cria uma nova Mesmo que getSession(true)

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 7: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Sessotildees Para saber se uma sessatildeo eacute nova use o meacutetodo

isNew()if (sessionisNew()) myObject = new BusinessObject() else

myObject = (BusinessObject) sessiongetAttribute(obj)

getSession() deve ser chamado antes de getOutputStream() ou qualquer meacutetodo que obtenha o stream de saiacuteda como getWriter()

Sessotildees podem ser implementadas com cookies e cookies satildeo definidos no cabeccedilalho HTTP (que eacute montado antes do texto)

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 8: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

O que satildeo atributos Atributos satildeo objetos Java que podem

ser compartilhados entre os recursos de uma aplicaccedilatildeo Web

02 grandes perguntas sobre atributos Qual recurso pode acessar os atributos Quanto tempo cada atributo fica disponiacutevel

para ser acessadoEm outras palavras Qual o escopo de cada atributo

Atributos NAtildeO satildeo paracircmetros

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 9: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Meacutetodos utilizados para Atributos

Todos os escopos possuem pelo menos os 04 meacutetodos a seguir getAttribute(String) setAttribute(String Object) removeAttribute(String) getAttributeNames()

Os atributos satildeo armazenados na forma de um Map com nome e valor

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 10: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Escopo de objetos em servlets

Servlets podem compartilhar informaccedilotildees de vaacuterias maneiras Usando meios persistentes (bancos de

dados arquivos etc) Usando objetos na memoacuteria por escopo

(requisiccedilatildeo sessatildeo contexto) Usando variaacuteveis estaacuteticas ou de instacircncia

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 11: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Escopo de objetos em servlets

Servlets oferecem trecircs niacuteveis diferentes de persistecircncia na memoacuteria (ordem decrescente de duraccedilatildeo) Contexto da aplicaccedilatildeo vale enquanto aplicaccedilatildeo estiver na

memoacuteria (javaxservletServletContext) Sessatildeo dura uma sessatildeo do cliente

(javaxservlethttpHttpSession) Requisiccedilatildeo dura uma requisiccedilatildeo

(javaxservletServletRequest) Para gravar dados em um objeto de persistecircncia na memoacuteria

objetosetAttribute(nome dados) Para recuperar ou remover os dados

Object dados = objetogetAttribute(nome) objetoremoveAttribute(nome)

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 12: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Escopo de objetos em servlets resumo

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 13: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Escopo de Atributos Contexto natildeo eacute thread-safe

Acessiacutevel por qualquer recurso da aplicaccedilatildeo Por quanto tempo existe enquanto existir a aplicaccedilatildeo Exemplo de uso nuacutemero de usuaacuterios ativos

Sessatildeo natildeo eacute thread-safe Acessiacutevel por recursos de uma sessatildeo Por quanto tempo existe enquanto a sessatildeo existir Exemplo de uso carrinho de compras

Requisiccedilatildeo eacute thread-safe Acessiacutevel por recurso da requisiccedilatildeo Por quanto tempo existe enquanto a requisiccedilatildeo existir Exemplo de uso dados de um determinado item a

venda

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 14: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

O que eacute thread-save Pode ser usado em aplicaccedilotildees multi-

thread usando o mesmo objeto (natildeo a mesma classe a mesma instacircncia)

Quando o objeto puder ser acessado por vaacuterias threads ao mesmo tempo ele deve ser thread-safe e as duas formas mais simples e comuns de se conseguir isso satildeo Fazendo o objeto ser imutaacutevel Usando sincronizaccedilatildeo nos lugares adequados

(modificador ldquosynchronizedrdquo)

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 15: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Compartilhamento de objetos na sessatildeo

Dois meacutetodos setAttribute(nome objeto) Object getAttribute(nome)

permitem o compartilhamento de objetos na sessatildeo ExRequisiccedilatildeo 1

String[] vetor = um dois tresHttpSession session = requestgetSession()sessionsetAttribute(dados vetor)

Requisiccedilatildeo 2HttpSession session = requestgetSession()String[] dados = (String[])sessiongetAttribute(dados)

Como a sessatildeo pode persistir aleacutem do tempo de uma requisiccedilatildeo eacute possiacutevel que a persistecircncia de alguns objetos natildeo sejam desejaacuteveis

Use removeAttribute(nome) para remover objetos da sessatildeo

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 16: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Exemplo

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 17: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Exerciacutecio Dado um formulaacuterio HTML construa um servlet que

armazene os dados vindo de um formulaacuterio em um Java Bean e o compartilhe com outros recursos da mesma sessatildeo por meio de atributos

Os dados do formulaacuterio satildeo CPF Nome da Pessoa Data de Nascimento Profissatildeo

Este exerciacutecio envolve o uso dos seguintes conceitos jaacute vistos

Definiccedilatildeo de servlets e mapeamento no webxml Criaccedilatildeo de formulaacuterios em HTML Envio de requisiccedilotildees para servlets Respostas HTML a partir de servlets Recuperaccedilatildeo de paracircmetros de requisiccedilatildeo Compartilhamento de objetos por meio de atributos

CUIDADO Natildeo confundam PARAcircMETRO com ATRIBUTO

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 18: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Exerciacutecio ndash cont

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 19: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Gerecircncia de sessotildees Natildeo haacute como saber que cliente natildeo precisa mais

da sessatildeo Pode-se definir um timeout em minutos para a

duraccedilatildeo de uma sessatildeo desde a uacuteltima requisiccedilatildeo do cliente

setMaxInactiveInterval(int) define novo valor para timeout int getMaxInactiveInterval() recupera valor de timeout

Timeout default pode ser definido no webxml para todas as sessotildees

Outros meacutetodos uacuteteis getLastAccessedTime() e getCreationTime()

Para destruir uma sessatildeo usesessioninvalidate()

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 20: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Gerecircncia de sessotildees Eventos de ligaccedilatildeo e ativaccedilatildeo de uma

sessatildeo podem ser controlados com implementaccedilotildees das interfaces HttpSessionBindingListener e

HttpSessionActivationListenerConsulte a documentaccedilatildeo

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 21: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Timeout default no webxml

O elemento ltsession-configgt permite definir a configuraccedilatildeo da sessatildeo Deve aparecer depois dos elementos ltservlet-

mappinggt O trecho abaixo redefine o tempo de duraccedilatildeo

default da sessatildeo em 15 minutos para todas as sessotildeesltsession-configgt

ltsession-timeoutgt15ltsession-timeoutgtltsession-configgt

Uma sessatildeo especiacutefica pode ter uma duraccedilatildeo diferente se especificar usando setMaxInactiveInterval()

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 22: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Sessatildeo agrave prova de clientes A sessatildeo eacute implementada com cookies se o cliente

suportaacute-los Caso o cliente natildeo suporte cookies o servidor precisa usar

outro meio de manter a sessatildeo Soluccedilatildeo sempre que uma paacutegina contiver uma URL

para outra paacutegina da aplicaccedilatildeo a URL deve estar dentro do meacutetodo encodeURL() de HttpServletResponseoutprint(lta href= +

responseencodeURL(caixajsp) + gt) Se cliente suportar cookies URL passa inalterada (o

identificador da sessatildeo seraacute guardado em um cookie) Se cliente natildeo suportar cookies o identificador seraacute

passado como paracircmetro da requisiccedilatildeo exhttplocalhost8080servletTestejsessionid=A424JX08S99

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 23: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Captura de eventos de atributos

Eacute possiacutevel saber quando um atributo foi adicionado a uma sessatildeo usando HttpSessionAttributeListener e HttpSessionBindingEvent

Meacutetodos a implementar do Listener attributeAdded(ServletContextAttributeEvent e) attributeRemoved(ServletContextAttributeEvent e) attributeReplaced(ServletContextAttributeEvent)

HttpSessionBindingEvent possui trecircs meacutetodos para recuperar sessatildeo e nome e valor dos atributos

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

Eacute preciso registrar o listener no webxml

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 24: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Captura de eventos do ciclo de vida

Pode-se saber quando uma sessatildeo foi criada invalidada ou expirada usando HttpSessionListener Meacutetodos sessionCreated() e sessionDestroyed()

Para saber quando uma sessatildeo existente foi ativada ou estaacute para ser passivada usa-se HttpSessionActivationListener Meacutetodos sessionDidActivate() e sessionWillPassivate()

Para controlar quando objetos satildeo associados a uma sessatildeo e quando deixam a sessatildeo (por qualquer razatildeo) deve-se implementar um HttpSessionBindingListener Meacutetodos valueBound() e valueUnbound()

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 25: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Lidando com recursos compartilhados

Haacute vaacuterios cenaacuterios de acesso concorrente Componentes compartilhando sessatildeo ou contexto Threads acessando variaacuteveis compartilhadas

Servlets satildeo automaticamente multithreaded O container cria um thread na instacircncia para cada requisiccedilatildeo Eacute preciso sincronizar blocos criacuteticos para evitar problemas

decorrentes do acesso paralelo Exemplo protegendo definiccedilatildeo de atributo de contexto

synchronized(this) contextsetAttribute(nome objeto)

Para situaccedilotildees onde multithreading eacute inaceitaacutevel servlet deve implementar a interface SingleThreadModel (soacute um thread estaraacute presente no meacutetodo service() ao mesmo tempo)

Evite isto a todo custo muito ineficiente

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 26: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Exerciacutecios Criar uma aplicaccedilatildeo Web usando os objetos de

negoacutecio Produto Atributos (meacutetodos getset) int id String nome

String preco Carrinho Meacutetodos addProduto(Produto) removeProduto(id)

Produto getProduto(id) Produto[] getProdutos() a Crie um servlet AdminLojaServlet

LojaServlet recebe paracircmetros para adicionar um produto e lista os produtos existentes como resposta

b Crie um servlet ComprasServlet ComprasServlet lista todos os produtos disponiacuteveis com um

botatildeo Adicionar ao lado de cada um O botatildeo deve adicionar o produto correspondente no objeto Carrinho

A resposta deve mostrar cada item incluiacutedo com um botatildeo Remover Deve haver tambeacutem botatildeo Comprar Mais e Encerrar

O Carrinho deve persistir entre requisiccedilotildees

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 27: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Cookies Como jaacute podemos manipular sessotildees de maneira

transparente com HttpSession usamos cookies principalmente para definir preferecircncias que iratildeo durar aleacutem do tempo da sessatildeo Servidor iraacute criar cabeccedilalho que iraacute instruir o browser a

criar um arquivo guardando as informaccedilotildees do cookie Para criar cookies que duram mais que uma

sessatildeo (cookies persistentes no disco do cliente) eacute preciso Criar um novo objeto Cookie Definir a duraccedilatildeo do cookie com o meacutetodo setMaxAge() Definir outros meacutetodos se necessaacuterio Adicionar o cookie agrave resposta

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 28: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Como usar cookiesExemplo de gravaccedilatildeo 1) definir um cookie que contenha o nome do

usuaacuterio recebido como paracircmetro na requisiccedilatildeoString nome = requestgetParameter(nome)Cookie c = new Cookie(usuario nome)

2) Definir a duraccedilatildeo do cookie em segundoscsetMaxAge(1000 24 3600 60) 60 dias

3) Adicionar o cookie agrave respostaresponseaddCookie(c)

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 29: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Como usar cookiesExemplo de leitura 1) recuperar o cookie da requisiccedilatildeo

Cookie[] cookies = requestgetCookies() 2) Extrair cookie para um objeto local

for (int i = 0 i lt cookieslength i++) if (cookies[i]getName()equals(nome)

usuario = cookies[i]getValue()

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field

Page 30: Servlets: Redirecionamento, Atributos e Sessões. HttpRequest Além dos parâmetros, é possível acessar: Informações sobre a plataforma do cliente e do navegador:

Exerciacutecio Crie uma tela de entrada na loja

LojaServlet com links para os servlets 1048707 Ela deve requisitar um e-mail Grave o

e-mail como um Cookie com duraccedilatildeo de 30 dias

Lembre-se do e-mail na proacutexima requisiccedilatildeo e mostre-o

no text-field