Quando um servlet e iniciado qual dos metodos é chamados? void init() ou void init(ServletCon)

5 respostas
faeldix

Entao? Qual dos dois? achei estranho ter dois…

void init(ServletConfig)
void init()

5 Respostas

Bianca_Rosa

Caçei lá no Java Docs… Na interface GenericServlet:

void [b]init/b
A convenience method which can be overridden so that there’s no need to call super.init(config).

void init(ServletConfig config)
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

public void [b]init/b
throws ServletException

A convenience method which can be overridden so that there's no need to call super.init(config).

Instead of overriding init(ServletConfig), simply override this method and it will be called by GenericServlet.init(ServletConfig config). The ServletConfig object can still be retrieved via getServletConfig(). </blockquote>

public void init(ServletConfig config)
throws ServletException

Called by the servlet container to indicate to a servlet that the servlet is being placed into service. See Servlet.init(javax.servlet.ServletConfig).

This implementation stores the ServletConfig object it receives from the servlet container for later use. When overriding this form of the method, call super.init(config). </blockquote>

Então, pelo que eu entendi, é o seguinte: ele chama por padrão passando o config, e o outro serve pra você dar override na sua aplicação, porque a Servlet vai chamar o init(config), que por sua vez vai chamar o seu init()… e por aí vai.

faeldix

Bianca Rosa:
Caçei lá no Java Docs… Na interface GenericServlet:

void [b]init/b
A convenience method which can be overridden so that there’s no need to call super.init(config).

void init(ServletConfig config)
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.

public void [b]init/b
throws ServletException

A convenience method which can be overridden so that there's no need to call super.init(config).

Instead of overriding init(ServletConfig), simply override this method and it will be called by GenericServlet.init(ServletConfig config). The ServletConfig object can still be retrieved via getServletConfig(). </blockquote>

public void init(ServletConfig config)
throws ServletException

Called by the servlet container to indicate to a servlet that the servlet is being placed into service. See Servlet.init(javax.servlet.ServletConfig).

This implementation stores the ServletConfig object it receives from the servlet container for later use. When overriding this form of the method, call super.init(config). </blockquote>

Então, pelo que eu entendi, é o seguinte: ele chama por padrão passando o config, e o outro serve pra você dar override na sua aplicação, porque a Servlet vai chamar o init(config), que por sua vez vai chamar o seu init()… e por aí vai.

tentei dar uma override no init sem parametros eee olha oque deu:

c:\AplicacaoWEB\src>javac -classpath c:\libs\servlet-api.jar;c:\xampp\tomcat\webapps\Aplicacao\WEB-INF\classes -d c:\xampp\tomcat\webapps\Aplicacao\WEB-INF\classes com\ex
com\example\web\MeuServlet.java:11: init() in com.example.web.MeuServlet cannot override init() in javax.servlet.GenericServlet; attempting to assign weaker access privil
void init(){
^
1 error

edit: se bem que eu to extendendo da HttpServlet… mas se eu nao me engano… HttpServlet implementa a GenericServlet entao acho que da na mesma!

Bianca_Rosa

Como você escreveu o seu init? Eu fiz o meu assim:

@Override public void init(){ System.out.println("Iniciando a servlet"); }

E funcionou de boa.

(Sim, dá no mesmo =] )

faeldix

Bianca Rosa:
faeldix:

tentei dar uma override no init sem parametros eee olha oque deu:

c:\AplicacaoWEB\src>javac -classpath c:\libs\servlet-api.jar;c:\xampp\tomcat\webapps\Aplicacao\WEB-INF\classes -d c:\xampp\tomcat\webapps\Aplicacao\WEB-INF\classes com\ex
com\example\web\MeuServlet.java:11: init() in com.example.web.MeuServlet cannot override init() in javax.servlet.GenericServlet; attempting to assign weaker access privil
void init(){
^
1 error

Como você escreveu o seu init? Eu fiz o meu assim:

@Override public void init(){ System.out.println("Iniciando a servlet"); }

E funcionou de boa.

(Sim, dá no mesmo =] )

de fato funcionou agora :}
Mas sera que isso nao ia dar problema?

entao a inicializacao do servlet é assim

-> containner chama o construtor do servlet
-> depois chama o init com parametro -> depois chama o init() sem parametro -> depois o service ai bla bla bla…

é isso entao?

To sendo chato ne? mas é essencial que eu entenda isso rs

__

E isso mesmo baixei o fonte do apache tomcat e la diz o seguinte no metodo init

public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); }

Bianca_Rosa

faeldix:

de fato funcionou agora :}
Mas sera que isso nao ia dar problema?

entao a inicializacao do servlet é assim

-> containner chama o construtor do servlet
-> depois chama o init com parametro -> depois chama o init() sem parametro -> depois o service ai bla bla bla…

é isso entao?

To sendo chato ne? mas é essencial que eu entenda isso rs

Acredito que não daria problema, porque segundo o javadoc ele foi feito justamente pra isso.

Cara, acho que é isso sim. Também não entendo muito sobre o assunto, se alguém quiser discordar… Mas qualquer dúvida que ainda restar sobre ciclos de vida de servlet, leia esse artigo aqui. Ele não chega a mencionar nada sobre o init() sem parâmetros, mas pelo que a gente já testou - e funcionou - ele foi chamado pelo init(ServletConfig). Também dá pra entrar em debug mode e olhar a pilha de execução, depois que ele terminar o init() sobrescrito, ele volta a fazer o init(ServletConfig config) do GenericServlet, provavelmente para finalizar a execução do método.

Que nada! É sempre bom ter dúvida, na realidade eu fui pesquisar sobre o assunto pra te responder, ou seja, nós dois estámos aprendendo.

Criado 25 de fevereiro de 2012
Ultima resposta 25 de fev. de 2012
Respostas 5
Participantes 2