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.