Servlets

Propaganda
Servlets
O que são Servlets?
Servlets são programas simples feitos em Java os quais rodam em um Servlet
Container. Um Recipiente (Container) Servlet é como um servidor Web que trata requisições do
usuário e gera respostas. Recipiente Servlet é diferente de Servidor Web porque ele é feito
somente para Servlets e não para outros arquivos (como .html etc). O Recipiente Servlet é
responsável por manter o ciclo de vida do Servlet. Pode ser usado sozinho (standalone) ou
conjugado com um servidor Web. Exemplo de Recipiente Servlet é o Tomcat, e de servidor Web o
Apache.
Servlets são na verdade simples classes Java as quais necessitam implementar a
interface javax.servlet.Servlet. Esta interface contém cinco métodos que precisam ser
implementados. Na maioria das vezes você não precisa implementar esta interface. Por quê?
Porque o pacote javax.servlet já provê duas classes que implementam esta interface i.e.
GenericServlet e HttpServlet.
Então tudo que você precisa fazer é estender uma dessas classes e sobrescrever o
método que você precisa para seu Servlet. GenericServlet é uma classe muito simples que
somente implementa a interface javax.servlet.Servlet e fornece apenas funcionalidades básicas.
Enquanto HttpServlet é uma classe mais útil que fornece métodos para trabalhar com o protocolo
HTTP. Assim se seu servlet usa o protocolo HTTP (o que ocorrerá na maioria dos casos) então ele
deveria estender a classe javax.servlet.http.HttpServlet para construir um servlet.
Servlets uma vez iniciados são mantidos na memória. Então toda requisição que chega,
vai para o Servlet na memória e este gera uma resposta.
Esta característica de “manter na memória” faz com que usar Java Servlets seja um
método extremamente rápido e eficiente para construir aplicações Web.
Uma servlet funciona como um pequeno servidor (servidorzinho em inglês) que recebe
chamadas de diversos clientes.
Uma primeira idéia da servlet seria que cada uma delas é responsável por uma página,
sendo que ela lê dados da requisição do cliente e responde com outros dados (html, gif etc).
Como no Java tentamos sempre que possível trabalhar orientado a objetos, nada mais
natural que uma servlet seja representada como um objeto.
Resumindo, cada servlet é um objeto java que recebe tais requisições (request) e
retorna algo (response), como por exemplo uma página html ou uma imagem do formato jpeg.
Diversas requisições podem ser feitas a uma mesma servlet ao mesmo tempo em um
único servidor, por isso ela é mais rápida que um programa CGI comum. A especificação da servlet
cita algumas vantagens da mesma sobre o antigo CGI.
O diagrama abaixo mostra três clientes acessando o mesmo servidor web/contêiner de
servlets através do protocolo http.
A página a ser retornada pela servlet pode ser um jpeg, um gif, um arquivo html etc:
arquivos de texto ou simplesmente binários.
O comportamento das servlets foi definido na classe HttpServlet do pacote javax.servlet.
Eles se aplicam às servlets que trabalham através do protocolo Http.
A interface Servlet é a que define exatamente como uma servlet funciona, mas não é
necessariamente o que vamos utilizar neste capítulo uma vez que ela possibilita o uso de qualquer
protocolo baseado em requisições e respostas.
3 clientes acessando o mesmo servidor web/contêiner de servlets através do protocolo http
O funcionamento básico de uma servlet compreende:

A inicialização da mesma

Chamadas a métodos de serviço, essas chamadas passam dois argumentos
para o método service, a requisição que o cliente faz e a resposta que permite
enviar dados para o mesmo:
void service(HttpServletRequest req, HttpServletResponse res);

Finalização
O exemplo a seguir mostra uma servlet implementando o método de service.
Um primeiro exemplo de método service seria aquele que não executa nada e mostra
uma mensagem de bem vindo para o usuário. Para isso precisamos “alterar” a resposta que a
servlet enviará para o cliente.
O writer de saída do cliente pode ser obtido através do método getWriter da variável
response e então fica simples utilizar um PrintWriter para imprimir algo como resposta para o
cliente:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// recebe o writer
PrintWriter out = response.getWriter();
// escreve o texto
out.println("<html>");
out.println("Saida");
out.println("</html>");
}
Ciclo de Vida de um Servlet
Os Servlets são controlados pelo Contêiner (Cria os objetos solicitação e resposta, cria
ou aloca uma nova thread para o servlet e chama o método service() do servlet, passando
referências de solicitação e resposta como argumentos).
Passos do ciclo de vida:
O usuário clica em um link que tem uma URL para um servlet.
O contêiner “descobre“ que a solicitação é para um servlet e cria dois objetos:
HttpServletResponse e HttpServletRequest
O contêiner encontra o servlet correto baseado na URL da solicitação, cria ou aloca uma
thread para a solicitação e chama o método service() do servlet, passando como argumentos os
objetos solicitação e resposta.
O método service() descobre qual método do servlet chamar, baseado no Método http
(Get, Post, etc.) enviado pelo cliente. O cliente envia uma solicitação http Get, para que o método
service() chame o método doGet() do servlet, passando como argumentos os objetos solicitação e
resposta.
O servlet usa o objeto resposta para escrever a resposta para o cliente. A resposta volta
através do Contêiner.
Quando o método service() termina, a thread morre ou retorna para um pool de threads
gerenciadas pelo Contêiner.
Download