O ciclo de vida do servlet passa através dos seguintes estágios:
- carregamento da classe servlet;
- instanciação da classe servlet;
- inicialização;
- serviço;
- destruição.
Lembrando que um servlet não tem um método main() sendo controlado pelo container. Segue uma figura representativa do ciclo:
Interação cliente-servidor
O que acontece quando uma request vem do browser? Vejamos esse código html:
<form action="HelloServlet" method="POST">
Quando clicamos no botão de submit do form em questão o browser envia a solicitação para o container e o mesmo identifica que a solicitação é para um servlet e cria dois objetos, um do tipo HttpServletRequest e um * HttpServletResponse*. Em seguida encontra o servlet correto para a solicitação e cria uma thread para ele, no passo seguinte envia os dois objetos e chama o método service(), que repassa os objetos para o método apropriado em função do tipo de solicitação (POST nesse caso). A resposta correta é criada e entregue ao objeto response que por sua vez é retornado para o cliente.
A figura seguinte representa o fluxo citado:
Repassando o tratamento de Request / Response
Relembrando:
- O servlet recebe uma request do container;
- o container cria um objeto do tipo HttpServletResponse e um HttpServletRequest baseado em encontrar o servlet correto;
- o container cria uma thread separada para cada requisição ao servlet;
- o container que entrega o objeto de requisição e resposta para a thread do servlet;
- o container chama o método service() do servlet;
- o método service() por sua vez, chama o método POST ou GET apropriado que foi definido na página HTML ou JSP.
- a resposta é gerada, e por sua vez e é retornada para o cliente;
- os objetos de resposta e de requisição são apagados pelo container.
Repassando o Ciclo de Vida do Servlet
Antes da classe do servlet ser criada, ela é carregada pelo container, e então é instanciada. Após a instanciação do
servlet ele é iniciado através do método init()
, é importante frisar que o servlet é inicializado apenas uma vez e que
o método init()
pode ser sobrescrito, após a inicialização o container chama o método service()
(onde a maior parte
do tempo do servlet é utilizada).
O método service()
não deve ser sobrescrito, para evitar comportamentos errados no servlet, a implementação padrão
cria uma thread para a solicitação e identifica qual método deve ser chamado, doGet()
ou doPost()
, os quais devem
ser sobrescritos para implementar o comportamento desejado. Após criação da resposta o conteiner chama o
método destroy()
e o servlet é finalizado, esse método é chamado apenas uma vez no ciclo de vida.
A interface Servlet possui cinco métodos dos quais três fazem parte do ciclo de vida (init, service e destroy) e os
outros dois (getServletConfig()
e getServletInfo()
) que retornam um objeto do tipo ServletConfig
e uma String
com informações sobre o servlet (como versão, autor etc) respectivamente. Os parâmetros são passados pelo deployement
descriptor e preenchido no objeto ServletConfig
passado para o método init()
. Só há um objeto ServletConfig
por
servlet e um ServletContext
por aplicação web.
Em um post futuro irei detalhar melhor o ServletContext, até a próxima!