A execução de um servlet não difere muito de uma aplicação CGI em sua forma de interação com o servidor. As quatro principais etapas nessa interação são:
Quando um servlet é carregado pela primeira vez para a
máquina virtual Java do servidor, o método init()
é
invocado. Esse método tipicamente prepara recursos para a
execução do serviço (por exemplo, abrir arquivos ou ler o valor
anterior de um contador de número de acessos) ou estabelece
conexão com outros serviços (por exemplo, com um servidor de
banco de dados). O método destroy()
permite
liberar esses recursos (fechar arquivos, escrever o valor final
nessa sessão do contador de acessos), sendo invocado quando o
servidor estiver concluindo sua atividade.
Uma diferença fundamental entre um servlet e uma aplicação CGI é que a classe que implementa o servlet permanece carregada na máquina virtual Java após concluir sua execução. Um programa CGI, ao contrário, inicia um novo processo a cada invocação -- por este motivo, CGI deve utilizar mecanismos adicionais para manter o estado entre execuções, sendo a forma mais comum a utilização de arquivos em disco. Com um servlet, tais mecanismos são necessários apenas na primeira vez que é carregado e ao fim da execução do servidor, ou eventualmente como um mecanismo de checkpoint.
Servlets também oferecem como vantagem o fato de serem programas Java. Assim, eles permitem a utilização de toda a API Java para a implementação de seus serviços e oferecem adicionalmente portabilidade de plataforma.