Neste artigo mostraremos como os Servlets conseguiram conquistar o mundo Web. Para isso, falaremos um pouco sobre o HTTP e como ele interage com os Servlets. Antes de entrar em detalhes sobre os Servlets, vamos entender um pouco mais sobre este protocolo incrível que é o HTTP. Iniciaremos mostrando o cenário da web atual, e como a arquitetura cliente-servidor conseguiu ganhar o mundo.

Resumidamente, em uma arquitetura cliente-servidor, como é o caso da Web, um servidor Web recebe uma solicitação de um cliente. O servidor, por sua vez, pega a solicitação, encontra o recurso solicitado, podendo ser uma página HTML, ou um arquivo pdf, e retorna este recurso para o cliente. A Figura 1 ilustra esse cenário, onde existem muitos servidores e muitos clientes.

Arquitetura cliente-servidor presente na Web
Figura 1. Arquitetura cliente-servidor presente na Web

Na realidade, a coisa funciona assim. O browser formata uma Requisição e a envia para um servidor. O servidor por sua vez, procura o recurso solicitado, e caso o encontre, formata a Resposta e retorna para o browser. Este é o cenário perfeito, mas existem outros pormenores que não serão tratados agora. A Figura 2 ilustra como funciona uma requisição e resposta típica.



Requisição a um servidor para obter um determinado recurso
Figura 2. Requisição a um servidor para obter um determinado recurso

Certo, mas onde entra o HTTP? A maioria das conversas que ocorre na web entre clientes e servidores é mantida através do protocolo HTTP. Ele possibilita conversas de requisição (request) e resposta (response). Acontece assim: o cliente envia uma solicitação HTTP e o servidor retoma uma resposta HTTP. Conclusão: o HTTP é um protocolo que permite que um cliente e um servidor consigam se comunicar. Até mesmo para se enviar uma página HTML ao cliente, o servidor faz isso por meio do HTTP.

O protocolo HTTP apresenta diferentes tipos de métodos, capazes de definir diferentes tipos de funcionalidades. Os mais utilizados são os métodos HTTP GET e HTTP POST. Estes métodos possibilitam que durante a requisição feita ao servidor, também sejam enviados dados. A grande diferença entre esses dois métodos ocorre neste momento. O HTTP GET possibilita o envio limitado de dados, é utilizado normalmente para requisições simples. O HTTP POST possibilita que sejam enviados juntamente com a requisição, uma grande quantidade de dados, pois apresenta um formulário próprio para esse fim. A Listagem 1 mostra uma típica solicitação GET ao servidor. A Figura 3 mostra o retorno de uma solicitação. Uma resposta HTTP inclui, basicamente, um código de status, o tipo de conteúdo (também conhecido por MIME type) e o conteúdo real da resposta, no nosso caso, o HTML, mas poderia ser uma imagem, um arquivo pdf, entre outros.

GET /select/selectDrink.jsp?color=white&taste=malty HTTP/1.1
Host: www.testme.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US;
rv:l.4) Gecko/20030624 Netscape/7.1
Accept: text/xml,application/xml,application/xhtml+xml,text/
html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/
gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Listagem 1. Exemplo de requisição com método HTTP GET
Exemplo de Resposta HTTP com conteúdo HTML
Figura 3. Exemplo de Resposta HTTP com conteúdo HTML

Mas onde entra Java nisso? Uma página HTML simples, somente com conteúdo estático, é muito sem graça. Não podemos atualiza-la e fazer coisas legais, como saber quantas pessoas acessaram nosso site, por exemplo. Para que essas coisas “legais” aconteçam, precisamos de conteúdo dinâmico, disponibilizando-o nas nossas páginas HTML. A plataforma Java EE, desde suas primeiras versões, utiliza-se de Servlets para que possamos ter conteúdo dinâmico aliado ao HTML.

Para juntar HTTP, Servlets, conteúdo estático, e dinâmico, seria bom que tivéssemos uma classe Java para nos auxiliar. Para nossa sorte, essa classe existe. Trata-se da classe abstrata HttpServlet. Por ser abstrata, esta classe precisa ter seus métodos implementados, como o método doGet e o doPost. Estes métodos são responsáveis por representarem os métodos HTTP GET e POST, respectivamente. A Listagem 2 mostra uma classe Java que estende o HttpServlet.

public class SimpleHttpServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

    public SimpleServlet() {
        super();
    }

  protected void doGet(HttpServletRequest request, 
          HttpServletResponse response) throws ServletException, IOException {
    // O método doGet deve ser implementado
  }


  protected void doPost(HttpServletRequest request, 
          HttpServletResponse response) throws ServletException, IOException {
    // o método doPost deve ser implementado
  }

}
Listagem 2. Exemplo da classe SimpleHttpServlet, responsável por implementar a classe abstrata HttpServlet

Só está faltando uma coisa para nossa classe SimpleHttpServlet funcionar. Mas como nossa classe, que estende um Servlet, pode ser executada se não tem nenhum método main? Na realidade, para que qualquer Servlet possa ser executado, necessitamos de um Web Container que, além de outras atribuições, são responsáveis por inicializar os Servlets. O TomCat é um bom exemplo de Web Container.

A Figura 4 mostra simplificadamente as etapas de execução de um Servlet. São elas:

  1. Cliente envia uma solicitação ao Servidor;
  2. Web Container (Servidor) invoca o Servlet, que é indicado para a execução;
  3. O Servlet gera o conteúdo em resposta à solicitação do cliente, podendo acessar outros serviços através da plataforma Java;
  4. Servidor repassa o resultado gerado pelo servlet para o cliente como uma resposta HTTP convencional.
Fluxo de execução envolvendo Servlets
Figura 4. Fluxo de execução envolvendo Servlets

A primeira vez que um servlet é carregado para a máquina virtual Java (2) do servidor, o método init() é invocado, preparando alguns recursos para a execução do serviço, como estabelecer conexão com um servidor de banco de dados. O Servlet é inicializado uma única vez. Depois disso, os Servlets disponibilizam o método service(), que podem ser executados diversas vezes. Por fim, o método destroy() é invocado, quando o servidor estiver concluindo sua atividade.

Links Úteis
  • Java 7: Site com informações sobre o lançamento do Java 7
  • JavaFX: Site para fazer download de aplicações JavaFX
  • JFXtras: Site do projeto JFXtras
Saiba mais sobre Java ;)
  • Curso O Que é JPA?: Dominar a persistência de dados é uma necessidade indispensável aos programadores. Sem esse conhecimento nossas aplicações não terão a capacidade de armazenar e recuperar os dados por ela manipulados.
  • Curso Preparando o ambiente para programar em Java: Neste curso você aprenderá a preparar seu ambiente para programar em Java. Veremos aqui o que é necessário instalar e como proceder para desenvolver aplicações com essa linguagem.
  • Curso Criando meu primeiro projeto no Java: Neste curso você aprenderá a criar o seu primeiro programa com Java, e não, ele não será um simples “Hello, World!”. :) Para isso, vamos começar ensinando como instalar o Java e preparar o ambiente de desenvolvimento.