servlets: redirecionamento, atributos e sessões. httprequest além dos parâmetros, é possível...
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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