Servlets Jobson Ronan jrjscin ufpe br Objetivos n
Servlets Jobson Ronan {jrjs@cin. ufpe. br}
Objetivos n Aprender ¡ ¡ n Como escrever um servlet Como compilar um servlet Como implantar um servlet no servidor Como executar Também serão exploradas as formas de interação do servlet com a requisição e resposta HTTP ¡ ¡ ¡ Como ler parâmetros da entrada Como gerar uma página de resposta Como extrair dados de um formulário HTML
O que são Servlets? n Extensão de servidor escrita em Java ¡ ¡ n Podem ser usados para estender qualquer tipo de aplicação do modelo requisição-resposta Todo servlet implementa a interface javax. servlet. Servlet (tipicamente estende Generic. Servlet) Servlets HTTP ¡ ¡ ¡ Extensões para servidores Web Estendem javax. servlet. http. Http. Servlet Lidam com características típicas do HTTP como métodos GET, POST, Cookies, etc.
API: Fundamental n Principais classes e interfaces de javax. servlet ¡ Interfaces n n n ¡ Classes abstratas n ¡ Servlet, Servlet. Config, Servlet. Context Filter, Filter. Chain, Filter. Config Servlet. Request, Servlet. Response Single. Thread. Model Request. Dispatcher Generic. Servlet Classes concretas n n n Servlet. Exception Unavailable. Exception Servlet. Input. Stream e Servlet. Output. Stream
Ciclo de vida n n O ciclo de vida de um servlet é controlado pelo container Quando o servidor recebe uma requisição, ela é repassada para o container que a delega a um servlet. O container ¡ ¡ ¡ n Depois que o servlet foi inicializado, cada requisição é executada em um método service() ¡ ¡ n Carrega a classe na memória Cria uma instância da classe do servlet Inicializa a instância chamando o método init() O container cria um objeto de requisição (Servlet. Request) e de resposta (Servlet. Response) e depois chama service() passando os objetos como parâmetros Quando a resposta é enviada, os objetos são destruídos Quando o container decidir remover o servlet da memória, ele o finaliza chamando destroy()
Ciclo de vida [Argonavis]
Como escrever um Servlet genérico? n Um servlet genérico deve estender Generic. Servlet e seu método service() import javax. servlet. *; import java. io. *; public class Generico extends Generic. Servlet { public void service (Servlet. Request request, Servlet. Response response) throws IOException { Print. Writer out = response. get. Writer(); out. println("Hello, World!"); out. close(); } } (. . . ver API)
Inicialização de um Servlet n Deve-se sobrepor init(config) com instruções que serão realizadas para inicializar um servlet Carregar parâmetros de inicialização, dados de configuração Obter outros recursos ¡ ¡ n Falha na inicialização deve provocar Unavailable. Exception (subclasse de Servlet. Exception) public void init(Servlet. Config config) throws Servlet. Exception { String dir. Imagens = config. get. Init. Parameter("imagens"); if (dir. Imagens == null) { throw new Unavailable. Exception( "Configuração incorreta!"); } }
Finalização n Quando um servlet container decide remover um servlet da memória, ele chama o seu método destroy() ¡ Use destroy() para liberar recursos (como conexões de banco de dados, por exemplo) e fazer outras tarefas de "limpeza". public void destroy() { banco. close(); banco = null; } n O servlet geralmente só é destruído quando todos os seus métodos service() terminaram (ou depois de um timeout) ¡ Se sua aplicação tem métodos service() que demoram para terminar, você deve garantir um shutdown limpo.
Métodos de serviço n n n São os métodos que implementam operações de resposta executadas quando o cliente envia uma requisição Todos os métodos de serviço recebem dois parâmetros: um objeto Servlet. Request e outro Servlet. Response Tarefas usuais de um método de serviço ¡ ¡ ¡ Extrair informações da requisição Acessar recursos externos Preencher a resposta (no caso de HTTP isto consiste de preencher os cabeçalhos de resposta, obter um stream de resposta e escrever os dados no stream)
Métodos de serviço (2) n O método de serviço de um servlet genérico é o método abstrato public void service(Servlet. Request, Servlet. Response) n n definido em javax. servlet. Sempre que um servidor repassar uma requisição a um servlet, ele chamará o método service(request, response). Um servlet genérico deverá sobrepor este método e utilizar os objetos Servlet. Request e Servlet. Response recebidos para ler os dados da requisição e compor os dados da resposta, respectivamente
Servlets genéricos n Servlets genéricos servem como componentes para serviços tipo requisição-resposta em geral ¡ ¡ n Não se limitam a serviços HTTP Podem ser usados para estender, componentes reutilizáveis, um serviço existente: é preciso implementar um "container" para rodar o servlet. Para serviços Web deve-se usar Servlets HTTP ¡ ¡ API criada especificamente para lidar com características próprias do HTTP Método service() dividido em métodos específicos para tratar os diferentes métodos do HTTP
API: Servlets HTTP n Classes e interfaces mais importantes do pacote javax. servlet. http ¡ Interfaces n n n ¡ Classes abstratas n ¡ Http. Servlet. Request Http. Servlet. Response Http. Session Http. Servlet Classes concretas n Cookie
Como escrever um servlet HTTP Para escrever um servlet HTTP, deve-se estender Http. Servlet e implementar um ou mais de seus métodos de serviço, tipicamente: do. Post() e/ou do. Get() n import javax. servlet. *; import javax. servlet. http. *; import java. io. *; public class Servlet. Web extends Http. Servlet { public void do. Get (Http. Servlet. Request request, Http. Servlet. Response response)throws IOException { Print. Writer out = response. get. Writer(); response. set. Content. Type("text/html"); out. println("<h 1>Hello, World!</h 1>"); out. close(); } }
Métodos de serviço HTTP n A classe Http. Servlet redireciona os pedidos encaminhados para service() para métodos que refletem os métodos HTTP (GET, POST, etc. ): public void do. Get(Http. Servlet. Request, Http. Servlet. Response) public void do. Post(Http. Servlet. Request, Http. Servlet. Response). . . n Um servlet HTTP genérico deverá estender HTTPServlet e implementar pelo menos um dos métodos do. Get() ou do. Post()
Métodos de serviço HTTP
Inicialização A inicialização de um Generic. Servlet, como o Http. Servlet, pode (e deve) ser feita com a versão de init() sem argumentos (e não init(config)) n Todos os métodos de config estão no servlet, poisvoid Generic. Servlet implementa Servlet. Config public init() throws Servlet. Exception { n String dir. Imagens = get. Init. Parameter("imagens"); if (dir. Imagens == null) { throw new Unavailable. Exception ("Configuração incorreta!"); } }
Parâmetros de inicialização <web-app> <servlet-name>exemplo</servlet-name> <servlet-class>curso. Exemplo. Servlet</servlet-class> <init-param> <param-name>JDBCDriver</param-name> <param-value>sun. jdbc. odbc. Jdbc. Odbc. Driver</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> </web-app>
A requisição HTTP n Uma requisição HTTP feita pelo browser tipicamente contém vários cabeçalhos RFC 822* n Os métodos de Http. Servlet. Request permitem extrair informações de qualquer um deles ¡ Pode-se também identificar o método e URL
Obtenção de dados de requisições n Alguns métodos de Http. Servlet. Request ¡ ¡ ¡ ¡ ¡ Enumeration get. Header. Names() - obtém nomes dos cabeçalhos String get. Header("nome") - obtém primeiro valor do cabeçalho Enumeration get. Headers("nome") - todos os valores do cabeçalho String get. Parameter(param) - obtém parâmetro HTTP String[] get. Parameter. Values(param) - obtém parâmetros repetidos Enumeration get. Parameter. Names() - obtém nomes dos parâmetros Cookie[] get. Cookies() - recebe cookies do cliente Http. Session get. Session() - retorna a sessão set. Attribute("nome", obj) - define um atributo obj chamado "nome". Object get. Attribute("nome") - recupera atributo chamado nome
A resposta HTTP n Uma resposta HTTP é enviada pelo servidor ao browser e contém informações sobre os dados anexados. n Os métodos de Http. Servlet. Response permitem construir um cabeçalho
Preenchimento de uma resposta n Alguns métodos de Http. Servlet. Response ¡ ¡ ¡ ¡ ¡ add. Header(String nome, String valor) - adiciona cabeçalho HTTP set. Content. Type(tipo MIME) - define o tipo MIME que será usado para gerar a saída (text/html, image/gif, etc. ) send. Redirect(String location) - envia informação de redirecionamento para o cliente (Location: url) Writer get. Writer() - obtém um Writer para gerar a saída. Ideal para saída de texto. Output. Stream get. Output. Stream() - obtém um Output. Stream. Ideal para gerar formatos diferentes de texto (imagens, etc. ) add. Cookie(Cookie c) - adiciona um novo cookie encode. URL(String url) - envia como anexo da URL a informação de identificador de sessão (sessionid) reset() - limpa toda a saída inclusive os cabeçalhos reset. Buffer() - limpa toda a saída, exceto cabeçalhos
Como implementar do. Get() e do. Post() n Use do. Get() para receber requisições GET ¡ ¡ n n Links clicados ou URL digitadas diretamente Alguns formulários que usam GET Use do. Post() para receber dados de formulários Se quiser usar ambos os métodos, não sobreponha service() mas implemente tanto do. Get() como do. Post() public class Servlet. Web extends Http. Servlet { public void do. Get (Http. Servlet. Request request, Http. Servlet. Response response) { processar(request, response); } public void do. Post (Http. Servlet. Request request, Http. Servlet. Response response) { processar(request, response); } public void processar(Http. Servlet. Request request, Http. Servlet. Response response) {. . . } }
Parâmetros da requisição n Parâmetros são pares nome=valor que são enviados pelo cliente concatenados em strings separados por &: nome=Jo%E 3 o+Grand%E 3 o&id=agente 007&acesso=3 n Parâmetros podem ser passados na requisição de duas formas ¡ Se o método for GET, os parâmetros são passados em uma única linha no query string, que estende a URL após um "? “ GET /servlet/Teste? id=agente 007&acesso=3 HTTP/1. 0 ¡ Se o método for POST, os parâmetros são passados como um stream no corpo na mensagem (o cabeçalho Content-length, presente em requisições POST /servlet/Teste HTTP/1. 0 POST informa o tamanho) Content-length: 21 Content-type: x-www-form-urlencoded id=agente 007&acesso=3
Como ler parâmetros da requisição n Caracteres reservados e maiores que ASCII-7 bit são codificados em URLs: ¡ n n Formulários HTML codificam o texto ao enviar os dados automaticamente Seja o método POST ou GET, os valores dos parâmetros, podem ser recuperados pelo método get. Parameter() de Servlet. Request, que recebe seu nome ¡ n Ex: ã = %E 3 String parametro = request. get. Parameter("nome"); Parâmetros de mesmo nome podem ser repetidos. Neste caso get. Parameter() retornará apenas a primeira ocorrência. Para obter todas use String[] get. Parameter. Values() ¡ String[] params = request. get. Parameter. Values("nome");
Como gerar uma resposta n Para gerar uma resposta, primeiro é necessário obter, do objeto Http. Servlet. Response, um fluxo de saída, que pode ser de caracteres (Writer) ou de bytes (Output. Stream) ¡ ¡ n n Apenas um deve ser usado. Os objetos correspondem ao mesmo stream de dados Deve-se também definir o tipo de dados a ser gerado. Isto é importante para que o cabeçalho Content-type seja gerado corretamente e o browser saiba exibir as informações ¡ n Writer out = response. get. Writer(); // ou Output. Stream out = response. get. Output. Stream(); response. set. Content. Type("text/html"); Depois, pode-se gerar os dados, imprimindo-os no objeto de saída (out) obtido anteriormente
n E fim de papo!
Exercícios n 1. Fazer um servlet Hello. World. . Esse eu faço! (demostração)
Servlet Hello World Deployment Descriptor (web. xml) <? xml version="1. 0" encoding="UTF-8"? > <web-app id="Web. App_ID" version="2. 4" xmlns="http: //java. sun. com/xml/ns/j 2 ee" xmlns: xsi="http: //www. w 3. org/2001/XMLSchema-instance" xsi: schema. Location="http: //java. sun. com/xml/ns/j 2 ee/webapp_2_4. xsd"> <display-name>Hello. World</display-name> <servlet> <description></description> <display-name>Hello. World. Servlet</display-name> <servlet-name>Hello. World. Servlet</servlet-name> <servlet-class>Hello. World. Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello. World. Servlet</servlet-name> <url-pattern>/Hello. World. Servlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index. htm</welcome-file> <welcome-file>index. jsp</welcome-file> </welcome-file-list> </web-app>
Exercícios n 2. Escreva um servlet que receba o nome e o telefone do usuário e retorne tais dados formatados em uma string passada ao servlet como parâmetro de inicialização ¡ n n Use o método estático format da classe String 3. Crie um servlet que imprima, em uma tabela, todos os nomes de parâmetros enviados e seus valores 4. Crie um servlet que imprima, em uma tabela, todos os nomes de cabeçalhos HTTP da requisição e seus valores
Exercícios n 6. Escreva um servlet simples que devolva uma página contendo o dia, mês, ano e hora.
n Agora sim. . ¡ Fim de Papo!
- Slides: 32