Você está na página 1de 4

A importncia do ciclo de vida dos Servlets

Neste artigo iremos mostrar a importncia de se conhecer bem os Servlets, at pelo fato de serem a base para muitos frameworks utilizados atualmente, como o JSF e Struts. Para isso, iremos objetivamente mostrar as principais caractersticas e o ciclo de vida desses objetos Java de tanta importncia. Por fim, iremos construir um exemplo simples ao final do artigo. Os Servlets foram a primeira maneira de criar pginas dinmicas com Java. Seu nome vem da ideia de um pequeno servidor (servidorzinho, em ingls). Sua principal funo receber chamadas HTTP, process-las e devolver uma resposta ao cliente. Para uma primeira noo de um servlet, vamos considerar que cada um responsvel por uma pgina, lendo os dados de uma requisio do cliente e respondendo com outros dados (uma pgina HTML, uma imagem GIF, etc). Como em Java tentamos sempre trabalhar com orientao a objetos, nada mais natural que um servlet seja representado como um objeto a partir de uma classe Java. Sendo assim, um servlet , portanto, um objeto Java que recebe requisies (request), e retorna algo (response). A figura abaixo mostra clientes (browsers) acessando o mesmo servidor atravs do protocolo HTTP. Note que o Servidor (na figura, o Apache Tomcat), ao mesmo tempo um Servidor Web e um Servlet Container.

Figura 1: Requisies feitas a um Web Container (Servidor Web + Servlet Container) Um Servidor Web responsvel por tratar, entre outras coisas, as requisies HTTP feitas a ele. Ao receb-las, ele as direciona para que um Servlet especfico cuide delas. Mas somente o Servlet no capaz de fazer esse servio. Ele precisa de algum para ajuda-lo, mais precisamente, para gerencialo. Esse algum o Servlet Container. O Servlet Container responsvel por gerenciar o ciclo de vida de um Servlet. Ele que decide quando o Servlet vai ser iniciado, atravs do mtodo init(), quando vai poder atender s requisies, pelo mtodo service(), e quando deve morrer, atravs do mtodo destroy(). O Servlet somente inicializado e destrudo uma nica vez, porm pode atender diversas requisies, ou seja, executar o mtodo service() inmeras vezes. A figura 2 mostra o ciclo de vida de um servlet, e a figura 3 mostra o diagrama de transio de estado de um Servlet, dentro do Servlet Container.

Figura 2: Ciclo de vida de um Servlet

Figura 3: Diagrama de Transio de Estado de um Servlets Para entender o diagrama de transio de estado de um servlet, precisamos entender tambm a sua relao com o Servlet container. No momento que o Servlet Container no est disponvel, ou seja, est em shutdown (desligado), o servlet encontra-se DESCARREGADO. Quando ocorre o startup do Servlet Container, o Servlet CARREGADO, porm ainda est indisponvel. No momento que uma requisio chega ao Servidor Web, e direcionada para o Servlet, o mtodo init() chamado e o Servlet INICIALIZADO. Aps isso, o mtodo service() pode ser chamado inmeras vezes e diversas requisies podem ser atendidas, at o mtodo destroy () ser chamado e o Servlet DESTRUIDO. Normalmente, nas aplicaes convencionais, o prprio Servlet Container responsvel por gerenciar este ciclo de vida, porm possvel que esses mtodos sejam sobrecarregados, e uma nova implementao pode ser realizada. Em uma aplicao convencional, o Servlet Container executa o mtodo service( ), e este, entre outras coisas, chama o nosso mtodo doGet(). No nosso exemplo, vamos construir uma aplicao e sobrecarregar os mtodos init(), service() e destroy(). Para isso, crie um Dynamic Web Project no Eclipse, e no Deployment Descriptor (web.xml), vamos registrar o nosso Servlet. Listagem 1: Deployment Descriptor do nosso exemplo <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>servlet</servlet-name> <servlet-class>br.com.SimpleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlet</servlet-name> <url-pattern>/servlet</url-pattern> </servlet-mapping> </web-app>

Pelo nosso Deployment Descriptor, vemos que temos um Servlet apelidado de, vejam s, servlet

(bem criativo). Esse apelido usado para representar nossa classe Java br.com.SimpleServlet, e para ser utilizado em outros pontos dentro do prprio web.xml. Ele ser utilizado dentro do mapeamento do servlet, para definir a URL onde ser acessado. Essa URL, a /servlet. A listagem 2 mostra nossa Classe Java. Listagem 2: Classe Java SimpleServlet que estende HTTPServlet package br.com; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SimpleServlet extends HttpServlet { public void init() throws ServletException { super.init(); System.out.println("INICIALIZANDO SERVLET"); } protected void service (HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("Meu Servlet"); out.println("</body>"); out.println("</html>"); destroy(); } public void destroy() { super.destroy(); System.out.println("DESTRUINDO PARCIALMENTE O SERVLET"); } }

Normalmente deixamos esses mtodos a cargo do prprio Servlet Container para gerenci-lo, tanto pela complexidade, quanto por no ser necessrio os sobrescrevermos. O mais importante implementarmos os mtodos HTTP, ou GET com o doGet(), ou o POST, com o doPost(). A listagem 3 mostra o exemplo de um Servlet implementando o mtodo doGet(). Lembre-se apenas de mapelo no web.xml. Listagem 3: Classe Java SimpleServlet que estende HTTPServlet package br.com; import java.io.IOException; import java.io.PrintWriter;

import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SimpleServletGET extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<body>"); out.println("Meu Servlet com GET"); out.println("</body>"); out.println("</html>"); } }

Você também pode gostar