Desenvolvimento de Projeto e Aplicações Web Ceça Moraes – [email protected] Conteúdo 05/11/2015 Servlets 2 Servlets Módulos de programas em Java Pacote javax.servlets incluídos na especificação da J2EE Recebem pedidos, executam o serviço e geram respostas 05/11/2015 paradigma request-response Residem no servidor Grande uso na geração de conteúdo dinâmico na web Baseados em CGI 3 CGI – Common Gateway Interface 05/11/2015 Especificação de transferência de informações entre um servidor Web e um programa Um programa CGI pode ser escrito em linguagens de programação: C, Perl, Java, or Visual Basic. Maneira usual de fazer o servidor Web interagir dinamicamente com o cliente 4 CGI – Common Gateway Interface Exemplo: Métodos HTTP 05/11/2015 Formulário HTML usando um programa CGI no servidor para processar os dados digitados GET: linha de comando. POST: entrada/saída padrão e sem limite de caracteres. 5 Formulários 05/11/2015 Interface HTML para a entrada de dados pelo usuário (cliente) <FORM> define um bloco de formulário. ACTION: a URL do programa CGI METHOD, o método do protocolo HTTP Objetos do formulário: INPUT, SELECT, TEXTAREA NAME identifica uma variável VALUE identifica valor armazenado. 6 Gateways CGI para SGBDs Converte comandos de formulário HTML para a linguagem sistema de banco de dados. Converte respostas do SGBD p/ HTML Cliente 05/11/2015 7 Servlets 05/11/2015 Cria threads para cada requisição Web. 8 Arquitetura Servidor Web Container Servlet Context 05/11/2015 9 Características Servlets não têm GUI Rodam no servidor e não no cliente Não são carregados pela rede Máquina virtual está no servidor (e não no Browser) 05/11/2015 Mais eficiente, mais completa 10 e mais confiável Ciclo de vida de servlets • service(): Recebe e processa as requisições • pedidos GET são repassados para o método doGet() •pedidos POST são repassados para o método doPost() 05/11/2015 11 Implementação Simples 05/11/2015 Herdar da classe HttpServlet Redefinir métodos doGet() e doPost() para implementar os serviços 12 Implementação Simples 05/11/2015 Dentro dos métodos doGet()/doPost(), ler parâmetros vindos do formulário HTML ou da URL Processar os parâmetros, fazer validações, executar lógica de negócio e montar a reposta para o usuário 13 Acesso aos servlets Diretamente através da URL http://www.faculdademarista.co m.br/servlet/ServletPgto? matr=“2312"&valor=1000 05/11/2015 14 Acesso aos servlets Através de formulários HTML Pode escolher métodos GET ou POST Passagem de parâmetros automática Exemplo: <form method=“POST” action=“http://www.faculdademarista.com. br/servlet/ServletPgto”> <input type=“text” name=“matr” value=“2312”> <input type=“text” name=“valor” size=“1000”> <input type=“submit” > 15 </form> Acesso aos servlets 05/11/2015 16 Classes e Interfaces básicas <<Interface>> Servlet GenericServlet <<interface>> HttpServlet Interface Servlet Classe GenericServlet Implementa interface Servlet HttpServlet 05/11/2015 Métodos para gerenciar servlets Estende GenericServlet Acrescenta funcionalidade 17 específica para o protocolo HTTP Classes e Interfaces básicas ServletRequest ServletResponse O que o servidor retorna para o cliente HttpServletRequest, HttpServletResponse 05/11/2015 Conteúdo que é passado do cliente para o servidor Estendem ServletRequest e ServletResponse Comunicação específica para o 18 protocolo HTTP HttpServlet Fornece um framework para lidar com o protocolo HTTP Introduz suas próprias subclasses de request e response para lidar com o protocolo HTTP 05/11/2015 HTTPServletRequest e HTTPServletResponse 19 HttpServlet: recebendo dados getQueryString Retorna um String url-encoded: Obtenção dos parâmetros 05/11/2015 nome=Fernando&credibilidade=0 getParameter getParameterValues getParameterNames 20 HttpServlet: Exemplo import javax.servlet.*; import java.io.*; public class ServletHelloWorld extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 05/11/2015 PrintWriter out = res.getWriter(); out.println("<HEAD><TITLE>Primeiro”); out.println(“Servlet</TITLE></HEAD>"); out.println("<BODY>"); out.println("<center><h1>Hello World!</h1><center>"); out.println("</BODY>"); out.close(); } } 21 HttpServlet: Exemplo 05/11/2015 22 Fase de serviço: service() 05/11/2015 Os dados da requisição chegam ao servlet através de um objeto do tipo ServletRequest A requisição pode ser respondidada através de um objeto do tipo ServletResponse Protocolo HTTP, os objetos usados são instâncias de HttpServletRequest e HttpServletResponse 23 ServletRequest <<Interface>> ServletRequest Métodos para obter: Informações do cliente Informações da URL Parâmetros fornecidos pelo usuário + + + + + + + + + + + + + + + + + + + + + + + getAttribute(s : String) : Object getAttributeNames() : Enumeration getCharacterEncoding() : String getContentLength() : int getContentType() : String getInputStream() : ServletInputStream getLocale() : Locale getLocales() : Enumeration getParameter(s : String) : String getParameterNames() : Enumeration getParameterValues(s : String) : String[] getProtocol() : String getReader() : BufferedReader getRealPath(s : String) : String getRemoteAddr() : String getRemoteHost() : String getRequestDispatcher(s : String) : RequestDispatcher getScheme() : String getServerName() : String getServerPort() : int isSecure() : boolean removeAttribute(s : String) : void 24 setAttribute(s : String, obj : Object) : void ServletRequest Parâmetros String getParameter(String nomeParametro) 05/11/2015 Retorna um string com o valor do parâmetro especificado na variável nomeParametro ou null se o parâmetro não existir 25 ServletRequest Parâmetros String[] getParameterValues(String nomeParametro) 05/11/2015 Retorna os valores do parâmetro especificado na variável nomeParametro, como um array de strings, ou null se o parâmetro não existir Parâmetros com múltiplos valores, como listas 26 ServletRequest Parâmetros Enumeration getParameterNames() 05/11/2015 Retorna o nome dos parâmetros do request como uma enumeração de strings, ou uma enumeração vazia, se não houver parâmetros 27 ServletRequest - Parâmetros ServletRequest representa o pedido getParameter(String nomeParametro) http://localhost:8080/servlet/HelloPersonServlet?nome=Eduardo // ... public class HelloPersonServlet extends HttpServlet { public void doGet(HttpServletRequest request, // ... { // ... String nome = request.getParameter(“nome”); out.println("<h1> Hello " + nome + " </h1>"); // ... } 28 } HttpServletRequest Métodos para leitura de cookies Métodos para gerenciamento de sessões 05/11/2015 Cookie[] getCookies() HttpSession getSession(boolean create) 29 ServletResponse Encapsula a reposta do servlet <<Interface>> ServletResponse 05/11/2015 + + + + + + + + + + + + flushBuffer() : void getBufferSize() : int getCharacterEncoding() : String getLocale() : Locale getOutputStream() : ServletOutputStream getWriter() : PrintWriter isCommitted() : boolean reset() : void setBufferSize(i : int) : void setContentLength(i : int) : void setContentType(s : String) : void setLocale(locale : Locale) : void 30 ServletResponse - Saída getWriter() getOutputStream() para escrever dados binários Pode-se chamar o método setContentType() antes de chamar getWriter() ou getOutputStream() 05/11/2015 para escrever dados textuais o tipo padrão é “text/plain” 31 ServletResponse - Saída Exemplo ... response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><BODY>Bom Dia!</BODY></HTML>"); ... 05/11/2015 32 HttpServletResponse Métodos para 05/11/2015 enviar códigos de status ou de erros para o cliente redirecionar o cliente para outra URL adicionar cookies à resposta .... 33 Mantendo o Estado entre Requisições Mantendo o Estado entre Requisições Objetivo 05/11/2015 manter um estado conversacional entre o cliente e o servidor persistindo algum tipo de informação entre as requisições do cliente Cookies e Sessões 35 Cookies Concebidos pela Netscape (versão 0) Informações ficam armazenadas no browser, em memória ou em disco Suportado na API de Servlets 05/11/2015 classe Cookie 36 Cookies Características 05/11/2015 Tamanho máximo de 4KB por cookie Um navegador armazena no máximo 20 cookies por servidor Informações do cookie são enviadas e recebidas em toda transação HTTP São enviados apenas para o servidor de origem 37 Cookies: manipulação Recuperação dos cookies retorna uma matriz de cookies acessíveis da página Adição de cookies 05/11/2015 getCookies() da classe HttpServletRequest addCookie(Cookie) da classe HttpServletResponse envia um cookie para o navegador 38 Sessões O protocolo HTTP não mantém estado de sessão São criadas no lado do servidor 05/11/2015 As aplicações Web devem mantê-lo quando necessário podem armazenar variáveis e objetos de programas Java Uma sessão por cliente Expiram depois de um intervalo de tempo definido no servidor 39 Sessões 05/11/2015 A sessão é única para cada cliente e persiste através de várias requisições 40 Sessões Implementadas pela interface HttpSession <<Interface>> HttpSession (from http) 05/11/2015 + + + + + + + + + + + + + + + + getAttribute(s : String) : Object getAttributeNames() : Enumeration getCreationTime() : long getId() : String getLastAccessedTime() : long getMaxInactiveInterval() : int getSessionContext() : HttpSessionContext getValue(s : String) : Object getValueNames() : String[] invalidate() : void isNew() : boolean putValue(s : String, obj : Object) : void removeAttribute(s : String) : void removeValue(s : String) : void setAttribute(s : String, obj : Object) : void 41 setMaxInactiveInterval(i : int) : void Sessões Operações básicas Criação da sessão 05/11/2015 HttpSession session = req.getSession(boolean create) Retorna a sessão corrente associada com o request req Se não existe uma sessão, e create=true, retorna uma nova sessão Se create=false e o request não possui uma sessão, este método retorna null 42 Sessões Operações básicas Inserção de um objeto Poupanca p = new Poupanca(“34560”,513.00); session.setAttribute(“poupanca”,p); 05/11/2015 43 Sessões Operações básicas Consulta a um objeto Poupanca objeto = (Poupanca) session.getAttribute(“poupanca”) Remoção do objeto session.removeAttribute(“poupanca”) 05/11/2015 44 Sessões: propriedades Enumeration getAttributeNames() boolean isNew() 05/11/2015 retorna uma enumeração com todos os nomes dos atributos armazenados na sessão retorna true se a sessão é nova para o cliente. Retorna false para sessões 45 preexistentes Sessões: propriedades boolean isNew() 05/11/2015 Para saber se uma sessão é nova, use o método isNew() if (session.isNew()) { myObject = new BObject(); } else { myObject = (BObject) session.getAttribute("obj"); } 46 Gerenciamento de Sessão Não há como saber que cliente não precisa mais da sessão Pode-se definir um timeout em minutos para a duração de uma sessão desde a última requisição do cliente 05/11/2015 setMaxInactiveInterval(int segundos) define novo valor para timeout se intervalo for -1 sessão nunca expira int getMaxInactiveInterval() recupera valor de timeout 47 Sessões – Exemplo 05/11/2015 salvando objeto na sessão public class ControleSessaoServlet { public void doGet( ...) { HttpSession session =request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String nome = request.getParameter("nome"); Pessoa p = new Pessoa(nome); session.setAttribute("usuario",p); out.println("<a href=\"/servlet/SeuNomeServlet\">"+ "Clique aqui</a>"); out.close(); } } 48 Sessões – Exemplo – 05/11/2015 recuperando objeto da sessão public class SeuNomeServlet { public void doGet() { HttpSession session = request.getSession(false); response.setContentType("text/html"); PrintWriter out = response.getWriter(); if (session != null) { Pessoa p = (Pessoa) session.getAttribute("usuario"); out.println("Seu nome é" + p.getNome()); } else { out.println("Sessão inválida"); } out.close(); } 49 } Compartilhamento de objetos na sessão 05/11/2015 Como a sessão pode persistir além do tempo de uma requisição, é possível que a persistência de alguns objetos não sejam desejáveis Use o método removeAttribute("nome") para remover objetos da sessão 50