O que significa o valor <load-on-startup> do servlet

174

Estou ficando um pouco confuso aqui. Em nossa aplicação, estamos tendo alguns servlets definidos. Aqui está o trecho de web.xmlpara um dos servlets:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

De acordo com o meu entendimento, o valor para o <load-on-startup>deve ser um número inteiro positivo para que seja carregado automaticamente. Procurei no google, mas as respostas que encontrei só aumentaram minha confusão.

Vini
fonte

Respostas:

186

A resina 3.0 documenta esse comportamento:

O load-on-startup pode especificar um valor inteiro (opcional). Se o valor for 0 ou superior, indica uma ordem para o carregamento de servlets, servlets com números mais altos serão carregados após servlets com números mais baixos.

A especificação JSP 3.1 (JSR 340) diz isso na página 14-160:

O elemento load-on-startupindica que este servlet deve ser carregado (instanciado e ter seu init () chamado) na inicialização do aplicativo Web. O conteúdo do elemento desse elemento deve ser um número inteiro indicando a ordem em que o servlet deve ser carregado. Se o valor for um número inteiro negativo ou o elemento não estiver presente, o contêiner estará livre para carregar o servlet sempre que ele escolher. Se o valor for um número inteiro positivo ou 0, o contêiner deverá carregar e inicializar o servlet à medida que o aplicativo for implementado. O contêiner deve garantir que os servlets marcados com números inteiros inferiores sejam carregados antes dos servlets marcados com números inteiros mais altos. O contêiner pode escolher a ordem de carregamento de servlets com o mesmo load-on-startupvalor.

Você provavelmente deseja verificar não apenas o JSR, mas também a documentação do seu contêiner da web. Pode haver diferenças

Eddie
fonte
Cletus está errado em sua resposta. Você deve editar a postagem.
alboz
3
O que acontece quando a carga na inicialização não é especificada?
Nirmal
1
@Nirmal O segundo parágrafo especifica que, se o elemento não estiver presente, ele terá o mesmo comportamento como se fosse negativo, ou seja, o contêiner estará livre para carregar o servlet sempre que desejar.
Finnegan
129

Resposta curta : valor> = 0 significa que o servlet é carregado quando o aplicativo da web é implementado ou quando o servidor é iniciado. valor <0: o servlet é carregado sempre que o contêiner parecer.

Resposta longa (da especificação):

O elemento load-on-startup indica que este servlet deve ser carregado (instanciado e ter seu init () chamado) na inicialização do aplicativo da web. O conteúdo opcional desse elemento deve ser um número inteiro indicando a ordem em que o servlet deve ser carregado. Se o valor for um número inteiro negativo ou o elemento não estiver presente, o contêiner estará livre para carregar o servlet sempre que ele escolher. Se o valor for 128 inteiro positivo ou 0, o contêiner deverá carregar e inicializar o servlet à medida que o aplicativo for implementado. O contêiner deve garantir que os servlets marcados com números inteiros inferiores sejam carregados antes dos servlets marcados com números inteiros mais altos. O contêiner pode escolher a ordem de carregamento de servlets com o mesmo valor de carga na inicialização.

Nishant
fonte
1
E por isso que marcamos 0 para DispatcherServlet inorder para carregá-lo pela primeira vez quando o aplicativo é iniciado ..
Sorte
11

Indica que o servlet não será iniciado até que uma solicitação tente acessá-lo.

Se o carregamento na inicialização for maior ou igual a zero, quando o contêiner iniciar, ele iniciará o servlet em ordem crescente do valor de carga no início que você colocar lá (ou seja, 0, 1 e 2, 5 e 10 e assim por diante) .

cleto
fonte
7
Zero também causa carregamento. Somente valores negativos não são garantidos: "[...] se o valor for um número inteiro positivo ou 0, o contêiner deve carregar e inicializar o servlet à medida que o aplicativo é implementado. [...]"
marabol
1
@cletus Eu acho que é melhor modificar maior que zero com maior ou igual a zero , porque muitos usuários leem sua resposta conforme indicado pela aceita. Agradecemos antecipadamente
Tarik
9

Ciclo de vida do servlet

O ciclo de vida de um servlet é controlado pelo contêiner no qual o servlet foi implementado. Quando uma solicitação é mapeada para um servlet, o contêiner executa as seguintes etapas.

  1. Se uma instância do servlet não existir, o contêiner da web:

    uma. Carrega a classe de servlet

    b. Cria uma instância da classe de servlet

    c. Inicializa a instância do servlet chamando o método init (a inicialização é abordada em Criando e inicializando um servlet )

  2. O contêiner chama o método de serviço, passando objetos de solicitação e resposta. Os métodos de serviço são discutidos em Métodos de Serviço de Gravação .

Um valor 0 ativado load-on-startupsignifica que o ponto 1 é executado quando uma solicitação chega a esse servlet. Outros valores significam que o ponto 1 é executado na inicialização do contêiner.

sourcerebels
fonte
resposta perfeita!
gaurav 24/03
1

Conforme declarado em outra resposta, este artigo zero de carregamento na inicialização é aceitável e, na ausência de qualquer outro servlet, isso terá prioridade no carregamento e carregamento durante a implementação. O melhor uso do status de carregamento é carregar servlets que demoram mais tempo para inicializar bem antes que a primeira solicitação venha, como servlets que criam um pool de conexões ou fazem chamadas de rede ou retêm recursos volumosos; isso reduzirá significativamente o tempo de resposta da primeira solicitação.

Suresh Pradhan
fonte
1
  1. Se o valor for o mesmo para dois servlets, eles serão carregados em uma ordem em que são declarados no arquivo web.xml.
  2. se for 0 ou um número inteiro negativo, o Servlet será carregado quando o Container tentar carregá-los.
  3. garante carregamento, inicialização e chamada ao método init () de servlet por contêiner da web.
  4. Se não houver elemento para nenhum servlet, eles serão carregados quando o contêiner da web decidir carregá-los.
Rohit
fonte
0

sim, pode ter o mesmo valor .... o motivo para atribuir números ao carregar na inicialização é definir uma sequência para o servidor carregar todo o servlet. o servlet com o valor 0 carregar na inicialização será carregado primeiro e o servlet com o valor 1 será carregado depois disso.

se dois servlets terão o mesmo valor para carregar na inicialização do que será carregado como eles são declarados no web.xml de cima para baixo. o servlet que vem primeiro no web.xml será carregado primeiro e o outro será carregado depois disso.

Bharat Patel
fonte
0

-> (Ausência de carga na inicialização) Antes de tudo, quando um servlet é implantado no servidor, é responsabilidade do servidor criar o objeto do servlet. Ex .: Suponha que o Servlet seja implantado no servidor, (o Objeto Servlet não está disponível no servidor), o cliente envia a solicitação ao servlet pela primeira vez e, em seguida, o servidor cria o objeto servlet com a ajuda do construtor padrão e chama imediatamente init (). A partir disso, sempre que o cliente envia a solicitação, apenas o método de serviço será executado, pois o objeto já está disponível

Se a tag load-on-start-up for usada no descritor de implementação: No momento da implementação, o servidor cria o objeto de servlet para os servlets com base no valor positivo fornecido entre as tags. A criação de objetos para as classes de servlet seguirá de 0-128 0 número de servlet será criado primeiro e seguido por outros números.

Se fornecermos o mesmo valor para dois servlets no web.xml, a criação de objetos será feita com base na posição das classes no web.xml também varia de servidor para servidor.

Se fornecermos um valor negativo entre a tag load on start up, o servidor não criará o objeto servlet.

Outros cenários em que o servidor cria o objeto para servlet.

Se não usarmos a tag load on start up em web.xml, o projeto será implantado sempre que o cliente enviar a solicitação pela primeira vez que o servidor criar o objeto e o servidor for responsável por chamar seus métodos de ciclo de vida. Então, se um .class for modificado no servidor (tomcat). novamente o cliente envia a solicitação de servlet modificado, mas no caso do tomcat, o novo objeto não será criado e o servidor fará uso do objeto existente, a menos que ocorra a reinicialização do servidor. Mas na classe da lógica da web sempre que um arquivo .class é modificado no servidor sem reiniciar o servidor, se ele recebe uma solicitação, o servidor chama o método destroy no servlet existente e cria um novo objeto de servlet e chama init () para sua inicialização .

anil paritala
fonte
-1

Se o valor for <0, o serlet será instanciado quando a solicitação chegar; caso contrário> = 0, o contêiner será carregado na ordem crescente dos valores. se 2 ou mais servlets tiverem o mesmo valor, a ordem dos servlets declarados no web.xml.

Nalini
fonte
-2

O contêiner do servlet carrega o servlet durante a inicialização ou quando a primeira solicitação é feita. O carregamento do servlet depende do atributo "carregar na inicialização" no arquivo "web.xml". Se o atributo tiver um número inteiro positivo (0 a 128), o servlet será carregado com o carregamento do contêiner, caso contrário, será carregado quando a primeira solicitação for solicitada.

Quando o servlet é carregado quando é solicitado, é chamado de "Carregamento lento".

Preetesh Kumar Chaudhary
fonte
-6

É simples como você nem espera.

Se o valor for positivo, ele será carregado quando o contêiner iniciar

Se o valor não for positivo, o servelet será carregado quando a solicitação for feita.

Perguntas sobre Java
fonte