SERVLETS2

30
Servlets: Redirecionamento, Atributos e Sessões

description

Servlets

Transcript of SERVLETS2

  • Servlets:Redirecionamento, Atributos e Sesses

  • HttpRequestAlm dos parmetros, possvel acessar:Informaes sobre a plataforma do cliente e do navegador:String cliente = request.getHeader(User-Agent);Os cookies associados com a requisio:Cookies[] cookies = request.getCookies();A sesso associada com a requisio:HttpSession sessao = request.getSession();O mtodo HTTP da requisio:String metodo = requiest.getMethod();

  • HttpResponseUsada na maioria das vezes para enviar dados ao cliente02 mtodos principais:setContentType(String)text/html, application/jar, application/pdf, etc...getWriter() possvel usar a resposta para definir:HeadersErros de envioCookies02 tipos de sada:Caracteres (PrintWriter) ou bytes (ServletOutputStream)Pode redirecionar a sada com o mtodo sendRedirect(String)

  • Redirect vs. Request DispatchO mtodo sendRedirect(String) da resposta redireciona para uma URL e deixa o navegador tratar a URL:pode ser um endereo externo aplicao, por exemplo, http://www.ufu.br:request.sendRedirect(http://www.ufu.br);J o mtodo getRequestDispatcher(String) da requisio permite que o seu parmetro seja um endereo relativo aplicao ou um recurso, exemplo:request.getRequestDispatcher(resultado.jsp);

  • SessesComo o HTTP no mantm estado de sesso, so as aplicaes Web que precisam cuidar de mant-lo quando necessrioSesses representam um clienteA sesso nica para cada cliente e persiste atravs de vrias requisies

  • SessesSesses so representados por objetos HttpSession e so obtidas a partir de uma requisioDois mtodos podem ser usadosHttpSession session = request.getSession(false);Se a sesso no existir, retorna null, caso contrrio retorna sesso.HttpSession session = request.getSession();Retorna a sesso ou cria uma nova. Mesmo que getSession(true)

  • SessesPara saber se uma sesso nova, use o mtodo isNew()if (session.isNew()) { myObject = new BusinessObject();} else {myObject = (BusinessObject) session.getAttribute("obj");}getSession() deve ser chamado antes de getOutputStream() ou qualquer mtodo que obtenha o stream de sada, como getWriter()Sesses podem ser implementadas com cookies, e cookies so definidos no cabealho HTTP (que montado antes do texto)

  • O que so atributos?Atributos so objetos Java que podem ser compartilhados entre os recursos de uma aplicao Web02 grandes perguntas sobre atributos:Qual recurso pode acessar os atributos?Quanto tempo cada atributo fica disponvel para ser acessado?Em outras palavras:Qual o escopo de cada atributo?Atributos NO so parmetros!!!

  • Mtodos utilizados para AtributosTodos os escopos possuem pelo menos os 04 mtodos a seguir:getAttribute(String)setAttribute(String, Object)removeAttribute(String)getAttributeNames()Os atributos so armazenados na forma de um Map, com nome e valor

  • Escopo de objetos em servletsServlets podem compartilhar informaes de vrias maneirasUsando meios persistentes (bancos de dados, arquivos, etc)Usando objetos na memria por escopo (requisio, sesso, contexto)Usando variveis estticas ou de instncia

  • Escopo de objetos em servletsServlets oferecem trs nveis diferentes de persistncia na memria (ordem decrescente de durao)Contexto da aplicao: vale enquanto aplicao estiver na memria (javax.servlet.ServletContext)Sesso: dura uma sesso do cliente (javax.servlet.http.HttpSession)Requisio: dura uma requisio (javax.servlet.ServletRequest)Para gravar dados em um objeto de persistncia na memriaobjeto.setAttribute("nome", dados);Para recuperar ou remover os dadosObject dados = objeto.getAttribute("nome"); objeto.removeAttribute("nome");

  • Escopo de objetos em servlets: resumo

  • Escopo de AtributosContexto: no thread-safe!Acessvel por: qualquer recurso da aplicaoPor quanto tempo existe: enquanto existir a aplicaoExemplo de uso: nmero de usurios ativosSesso: no thread-safe!Acessvel por: recursos de uma sessoPor quanto tempo existe: enquanto a sesso existirExemplo de uso: carrinho de comprasRequisio: thread-safe!Acessvel por: recurso da requisioPor quanto tempo existe: enquanto a requisio existirExemplo de uso: dados de um determinado item a venda

  • O que thread-save ?Pode ser usado em aplicaes multi-thread usando o mesmo objeto (no a mesma classe, a mesma instncia)Quando o objeto puder ser acessado por vrias threads ao mesmo tempo, ele deve ser thread-safe, e as duas formas mais simples e comuns de se conseguir isso so: Fazendo o objeto ser imutvel. Usando sincronizao nos lugares adequados (modificador synchronized)

  • Compartilhamento de objetos na sessoDois mtodossetAttribute("nome", objeto);Object getAttribute("nome");permitem o compartilhamento de objetos na sesso. Ex:Requisio 1String[] vetor = {"um", "dois", "tres"};HttpSession session = request.getSession();session.setAttribute("dados", vetor);Requisio 2HttpSession session = request.getSession();String[] dados = (String[])session.getAttribute("dados");Como a sesso pode persistir alm do tempo de uma requisio, possvel que a persistncia de alguns objetos no sejam desejveisUse removeAttribute("nome") para remover objetos da sesso

  • Exemplo

  • ExerccioDado um formulrio HTML, construa um servlet que armazene os dados vindo de um formulrio em um Java Bean e o compartilhe com outros recursos da mesma sesso por meio de atributos:Os dados do formulrio so:CPF, Nome da Pessoa, Data de Nascimento, ProfissoEste exerccio envolve o uso dos seguintes conceitos j vistos:Definio de servlets e mapeamento no web.xmlCriao de formulrios em HTMLEnvio de requisies para servletsRespostas HTML a partir de servletsRecuperao de parmetros de requisioCompartilhamento de objetos por meio de atributosCUIDADO!!! No confundam PARMETRO com ATRIBUTO!!!

  • Exerccio cont...

  • Gerncia de sessesNo h como saber que cliente no precisa mais da sessoPode-se definir um timeout em minutos para a durao de uma sesso desde a ltima requisio do clientesetMaxInactiveInterval(int) define novo valor para timeoutint getMaxInactiveInterval() recupera valor de timeoutTimeout default pode ser definido no web.xml para todas as sessesOutros mtodos teis: getLastAccessedTime() e getCreationTime()Para destruir uma sesso usesession.invalidate();

  • Gerncia de sessesEventos de ligao e ativao de uma sesso podem ser controlados com implementaes das interfacesHttpSessionBindingListener e HttpSessionActivationListenerConsulte a documentao.

  • Timeout default no web.xmlO elemento permite definir a configurao da sessoDeve aparecer depois dos elementos O trecho abaixo redefine o tempo de durao default da sesso em 15 minutos para todas as sesses

    15

    Uma sesso especfica pode ter uma durao diferente se especificar usando setMaxInactiveInterval()

  • Sesso prova de clientesA sesso implementada com cookies se o cliente suport-losCaso o cliente no suporte cookies, o servidor precisa usar outro meio de manter a sessoSoluo: sempre que uma pgina contiver uma URL para outra pgina da aplicao, a URL deve estar dentro do mtodo encodeURL() de HttpServletResponseout.print("");Se cliente suportar cookies, URL passa inalterada (o identificador da sesso ser guardado em um cookie)Se cliente no suportar cookies, o identificador ser passado como parmetro da requisio. ex:http://localhost:8080/servlet/Teste;jsessionid=A424JX08S99

  • Captura de eventos de atributos possvel saber quando um atributo foi adicionado a uma sesso usando HttpSessionAttributeListener e HttpSessionBindingEventMtodos a implementar do ListenerattributeAdded(ServletContextAttributeEvent e)attributeRemoved(ServletContextAttributeEvent e)attributeReplaced(ServletContextAttributeEvent)HttpSessionBindingEvent possui trs mtodos para recuperar sesso e nome e valor dos atributosString getName()String getValue()HttpSession getSession() preciso registrar o listener no web.xml

  • Captura de eventos do ciclo de vidaPode-se saber quando uma sesso foi criada, invalidada ou expirada usando HttpSessionListener:Mtodos sessionCreated() e sessionDestroyed()Para saber quando uma sesso existente foi ativada ou est para ser passivada usa-se HttpSessionActivationListener:Mtodos sessionDidActivate() e sessionWillPassivate()Para controlar quando objetos so associados a uma sesso e quando deixam a sesso (por qualquer razo) deve-se implementar um HttpSessionBindingListenerMtodos valueBound() e valueUnbound()

  • Lidando com recursos compartilhadosH vrios cenrios de acesso concorrenteComponentes compartilhando sesso ou contextoThreads acessando variveis compartilhadasServlets so automaticamente multithreadedO container cria um thread na instncia para cada requisio preciso sincronizar blocos crticos para evitar problemas decorrentes do acesso paraleloExemplo: protegendo definio de atributo de contexto:synchronized(this) {context.setAttribute("nome", objeto);}Para situaes onde multithreading inaceitvel, servlet deve implementar a interface SingleThreadModel (s um thread estar presente no mtodo service() ao mesmo tempo)Evite isto a todo custo: muito ineficiente!

  • ExercciosCriar uma aplicao Web usando os objetos de negcio:Produto. Atributos (mtodos get/set): int id, String nome, String precoCarrinho. Mtodos: addProduto(Produto), removeProduto(id), Produto getProduto(id), Produto[] getProdutos()a. Crie um servlet AdminLojaServletLojaServlet recebe parmetros para adicionar um produto e lista os produtos existentes como respostab. Crie um servlet ComprasServletComprasServlet lista todos os produtos disponveis com um boto Adicionar ao lado de cada um. O boto deve adicionar o produto correspondente no objeto Carrinho.A resposta deve mostrar cada item includo com um boto Remover. Deve haver tambm boto Comprar Mais e EncerrarO Carrinho deve persistir entre requisies

  • CookiesComo j podemos manipular sesses de maneira transparente com HttpSession, usamos cookies principalmente para definir preferncias que iro durar alm do tempo da sessoServidor ir criar cabealho que ir instruir o browser a criar um arquivo guardando as informaes do cookiePara criar cookies que duram mais que uma sesso (cookies persistentes no disco do cliente) precisoCriar um novo objeto CookieDefinir a durao do cookie com o mtodo setMaxAge()Definir outros mtodos se necessrioAdicionar o cookie resposta

  • Como usar cookiesExemplo de gravao: 1) definir um cookie que contenha o nome do usurio recebido como parmetro na requisioString nome = request.getParameter("nome");Cookie c = new Cookie("usuario", nome);2) Definir a durao do cookie em segundosc.setMaxAge(1000 * 24 * 3600 * 60); // 60 dias3) Adicionar o cookie respostaresponse.addCookie(c);

  • Como usar cookiesExemplo de leitura: 1) recuperar o cookie da requisioCookie[] cookies = request.getCookies();2) Extrair cookie para um objeto localfor (int i = 0; i < cookies.length; i++) {if (cookies[i].getName().equals("nome") {usuario = cookies[i].getValue();}}

  • ExerccioCrie uma tela de entrada na loja LojaServlet comlinks para os servlets. Ela deve requisitar um e-mail. Grave o e-mail comoum Cookie com durao de 30 dias. "Lembre-se" doe-mail na prxima requisio e mostre-o no text-field