350 likes | 447 Views
Curso de JavaWeb Instrutores: Rodrigo Cardoso e Maria Carolina Material por: Rodrigo Cardoso ( rcaa2@cin.ufpe.br ) Maria Carolina ( mcts@cin.ufpe.br ). Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra Sob as seguintes condições:
E N D
Curso de JavaWeb Instrutores: Rodrigo Cardoso e Maria Carolina Material por: Rodrigo Cardoso (rcaa2@cin.ufpe.br) Maria Carolina (mcts@cin.ufpe.br)
Você pode: • copiar, distribuir, exibir e executar a obra • criar obras derivadas • fazer uso comercial da obra • Sob as seguintes condições: • Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. • Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. • Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. • Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor. • Veja aqui a licença completa
Introdução a Servlets • Extensões do Servidor Web em Java • Componentes disponibilizados no servidor, responsáveis por aceitar pedidos,executar o serviço solicitado e gerar respostas. • Funcionam independente do browser • Uso: • Processar e armazenar dados submetidos por um formulário HTML; • Acesso dinâmico (ex: consulta ao banco de dados)
Introdução a Servlets • São programas (leia-se classe) Java • Segurança, robustez, multiplataforma. • Alta performance • Máquina virtual no servidor. • Carregados na memória apenas uma vez, no momento em que se der a primeira requisição. • Não são carregados pela rede, pois apenas parâmetros trafegam. • Podem: • Acessar cookies e controlar sessão do usuário.
Informações adicionais • Tecnologias semelhantes • JSP • CGI (PERL, shells, C) • ASP (Tecnologia Microsoft) • PHP • Acesso aos servlets • Diretamente da URL (uso de GET) • Através de formulários HTML (uso de POST)
Passos essenciais • Toda classe Java que seja um servlet deve: • Estender de HttpServlet • Redefinir métodos doGet e/ou doPost • Ler parâmetros, processá-los e fazer validações • Instanciar classes auxiliares e básicas • Gerar resposta ao cliente
Classes e interfaces importantes • HttpServlet • ServletRequest • Contém o que é passado na requisição do cliente ao servidor • Informa sobre o protocolo, IP do cliente, parâmetros e corpo • ServletResponse • O que servidor retorna ao cliente • HttpServletRequest e HttpServletResponse • Comunicação específica para HTTP
Prática 1 • Criar um Servlet seguindo os passos mostrados. • Adicionar ao projeto a classe DadosData.java • Codifiquem dentro do método doGet.
Ciclo de vida de um Servlet Carga de Classe Instanciação Instanciação Instanciação init( ) (...) (...) init( ) pode ser chamado várias vezes, porém o destroy ( ) deve ser executado antes Executado 0 ou mais vezes service( ) destroy( ) Finalização e GarbageCollector
Fases • Inicialização • Acontece na primeira vez em que a instância do servlet é chamada • Serviço • Acontece entre as outras duas • Atende a todas as requisições • Destruição • O servlet é removido do container
Fase de inicialização • public void init(ServletConfig cfg) • Não há problema de concorrência • Útil para fazer inicializações simples ou demoradas. • Ler arquivos • Criar threads • Alocar conexões com a base de dados
Fase de serviço • public void service (ServletRequest req, ServletResponse res) • Trata todas as solicitações do servlet • Método chamado várias vezes, porém apenas uma vez para cada requisição. • Pode ser chamado simultaneamente por várias threads. • O desenvolvedor tem a responsabilidade de controlar acesso simultâneos a recursos compartilhados
Fase de serviço • Os pedidos chegam através do parâmetro do tipo ServletRequest • As respostas são enviadas ao cliente através do parâmetro do tipo ServletResponse • No caso do uso de HTTP, usa-se extensões destes objetos: HttpServletRequest e HttpServletResponse. O método service encaminha para outros dois métodos: • public void doGet(HttpServletRequest req, HttpServletResponse resp) • public void doPost (HttpServletRequest req, HttpServletResponse resp)
Fase de serviço: ServletRequest • Traz informações úteis: • Dados do cliente • Dados da URL • Dados do conteúdo • Parâmetros fornecidos pelo usuário • Acessar parâmetros • String getParameter(String) • String[] getParameterValues(String) • Enumeration getParameterNames()
Fase de serviço: ServletResponse • Encapsula a resposta do servlet • Como usar: • Métodos mais comuns: • PrintWriter getWriter() • ServletOutputStream getOutputStream() • void setContentType(String) – chamado antes dos outros dois. response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><BODY>Bom Dia!</BODY></HTML>");
Fase de serviço: HttpServletRequest • Métodos para leitura do cabeçalho HTTP • getServletPath(), getPathInfo(), getMethod(), getQueryString(), getRemoteUser(), getAuthType(), getHeader(String name) • Método para leitura de cookies • Cookie[] getCookies() • Método para gerenciamento de sessões • HttpSession getSession(boolean create)
Fase de serviço: HttpServletResponse • Envia código de status ou de erros ao cliente • Contém constantes para identificar códigos de status (ex: int HttpServletResponse .SC_NOT_FOUND = 404) • Usado para: • Escrever cookies • Manipular cabeçalhos HTTP • Redirecionar o cliente
Fase de destruição • public void destroy() • Método chamado quando todas as chamadas a service() forem completadas ou após um tempo ocioso. • Usado para fechar os recursos abertos na fase de inicialização • Após a execução desse método, o servlet pode sofrer garbage collection a qualquer momento.
Exceções levantadas • Exceções mais relevantes para servlets: • ServletException • Falha geral no servlet • UnavailableException • Permanentemente: só solucionada pelo administrador • Temporariamente: problemas podem ser corrigidos com o tempo • IOException • O container é capaz de tratar e apresentar páginas de erro específicas para as exceções acima e RuntimeException. Qualquer outra exceção causa a queda do container
Mantendo estado entre requisições Uso de session e cookies
Manter estado • Necessidade • Guardar informações entre requisições de um mesmo cliente • Problema • HTTP não mantém estado • Soluções • Campos ocultos em formulários (hidden) • Cookies • Sessões (HttpSession)
Sessions • Utilizados no lado do servidor • Pode-se armazenar objetos Java • Um por cliente (não por servlet) • Expira após algum tempo inativo • Implementados pela classe HttpSession ou através de Cookies ou reescrita de URLs. • Pode ser acessada via request quando usada a primeira opção.
Sessions • Operações básicas: • Criação da session • Inserção de um objeto na session • Acesso a um objeto na session • Remoção de um objeto da session HttpSessionsession = req.getSession(true); session.setAttibute(“alias”, objeto); TipoObjeto objeto = (TipoObjeto) session.getAttribute(“alias”); session.removeAttribute(“alias”);
Sessions: propriedades • Enumeration getAttributeNames() • boolean isNew() • void invalidate() • void setMaxInactiveInterval(int segundos) • int getMaxInactiveInterval()
Cookies • Dados permanentes mantidos num browser do cliente entre múltiplas sessões. • Diferentemente da session, cada cookie representa um par e não uma coleção de pares nome-valor. • Por padrão, existem enquanto a sessão do browser existir. • Mas pode-se usar o médodo setMaxAge(int) Cookiecookie = newCookie(“alias”, “valor”); response.addCookie(cookie);
Colaboração entre Servlets • Divisão de tarefas entre Servlets • Um servlet inicia o processamento de uma requisição e repassa a outro servlet • Mecanismo utilizado: “Request Dispatching” • forward(...): passa para outro servlet, JSP ou página HTML. O receptor da chamada é responsável por produzir a resposta ao cliente • include(...): passa os dados para processamento ou produção de conteúdo, mas o controle é mantido no próprio servlet.
Colaboração entre Servlets • forward • include ServletContextsc = this.getServletContext(); RequestDispatcherrd = sc.getRequestDispatcher(“/OutroServlet”); try { rd.forward(request,response); } catch (Exception ex) { // Tratar aqui qualquer possível exceção } ServletContextsc = this.getServletContext(); RequestDispatcherrd = sc.getRequestDispatcher(“/OutroServlet”); try { rd.include (request,response); } catch (Exception ex) { // Tratar aqui qualquer possível exceção }
Prática 2 • Utilizando os conceitos vistos até agora, criar uma aplicação que realize: • Login, validando os dados fornecidos com alguns dos logins válidos. • Uma tela de boas vindas ao usuário logado • Mostre uma tela com os dados do usuário que acabou de logar. • Logout do usuário. • Além de tudo isso, valida a existência de uma sessão iniciada. • Dicas: utilize HttpSession.