1. Vamos começar com o recipiente de servlet: o recipiente de servlet com o qual todos estão mais familiarizados é o Tomcat. Como o servlet contêiner gerencia servlets?
Vamos dar uma olhada no modelo de contêiner do Tomcat primeiro:
A partir da figura acima, podemos ver que o contêiner do Tomcat é dividido em quatro níveis. O contêiner que realmente gerencia servlets é o contêiner de contexto, e um contexto corresponde a um projeto da web
No nível do contêiner do Tomcat, o contêiner de contexto é um contêiner que gerencia diretamente o wrapper Wrapper (StandardWrapper) do servlet no contêiner; portanto, como o contêiner de contexto é afetado diretamente como o servlet funciona.
Aqui vou explicar a classe de embalagem do servlet: StandardWrapper. Há uma pergunta aqui, por que o servlet deve ser envolvido no StandardWrapper, em vez de ser um objeto de servlet diretamente. Como o StandardWrapper faz parte do contêiner Tomcat, ele possui as características do contêiner e o Servlet é um padrão de desenvolvimento da Web independente e não deve ser fortemente acoplado no Tomcat.
Exceto por envolver o servlet no StandardWrapper e adicioná -lo ao contexto como subcontainer, todas as outras propriedades do Web.xml são analisadas no contexto, de modo que o contêiner de contexto é o contêiner de servlet que realmente executa o servlet. Um aplicativo da Web corresponde a um contêiner de contexto. As propriedades de configuração do contêiner são especificadas pelo web.xml do aplicativo, para que possamos entender o que a função web.xml tem.
2. A seguir, descreve brevemente o projeto de trabalho do servlet:
Quando um servidor da web interage com o cliente, o processo de trabalho do servlet é:
1. Faça uma solicitação ao servidor da web no cliente
2. O servidor da web o envia para o servlet depois de receber a solicitação
3. O contêiner do servlet gera um objeto de instância para isso e chama o método correspondente na API do servlet para processar a solicitação HTTP do cliente e, em seguida, retorna o resultado da resposta processada ao servidor da Web.
4. O servidor da Web envia a estrutura de resposta recebida do objeto da instância do servlet de volta ao cliente.
3. O ciclo de vida do servlet:
Como mostrado na figura acima, o ciclo de vida de um servlet pode ser dividido em quatro estágios, a saber, a classe de carregamento e o estágio de criação, o estágio de inicialização, o estágio de serviço e o estágio de destruição da instância. A seguir, é apresentada uma descrição detalhada das tarefas e precauções de programação para cada estágio.
1. Crie uma instância do servlet:
Por padrão, as instâncias do servlet são criadas quando a primeira solicitação chega e é reutilizada posteriormente. Se alguns servlets exigirem operações complexas que precisam ser concluídas ao carregar a inicialização, como abrir arquivos, inicializar conexões de rede etc., você poderá notificar o servidor para criar uma instância do servlet ao iniciar. A configuração específica é a seguinte:
<Verlet> <Verlet-name> timeServlet </ervlet-name> <Servlet-class> com.allanlxf.servlet.basic.timeServlet </servlet-class> <adound-on-startup> 1 </olload-on-startup> </servlet>
Crie a estrutura de classe relevante do objeto Servlet:
2. Inicialização
Depois que a instância do servlet for criada, o servidor da Web chamará automaticamente o método Init (ServletConfig Config) para inicializar o servlet. A configuração do parâmetro do método contém as informações de configuração do servlet, como o parâmetro de inicialização, criado pelo servidor.
I. Como configurar os parâmetros de inicialização do servlet?
Na tag de definição do servlet em web.xml, por exemplo:
<Verlet> <Verlet-name> timeServlet </servlet-name> <Servlet-class> com.allanlxf.servlet.basic.timeServlet </servlet-class> <iit-param> <par am-name> user </amon-name> <amam-value> nome de usuário </param-value> </irit-param> <itir--param> <amam-name> blog </param-name> <amam-value> http: //. . . </param-value> </irit-param> </vlect>
Os dois parâmetros de inicialização usuários e blog estão configurados com os valores do nome de usuário e http: //. . . , dessa maneira, para modificar o nome de usuário e o endereço do blog no futuro, você não precisa modificar o código do servlet, basta modificar o arquivo de configuração.
Ii. Como ler os parâmetros de inicialização de um servlet?
ServletConfig define o seguinte método para ler as informações dos parâmetros de inicialização:
public string getinitParameter (nome da string)
Parâmetro: o nome do parâmetro de inicialização.
Retornos: o valor do parâmetro de inicialização, se não estiver configurado, retorna nulo.
Número de tempos de execução do método iii.init (servletconfig)
Este método é executado uma vez durante o ciclo de vida de um servlet.
Método iv.init (servletconfig) e thread
Este método é executado em um único ambiente rosqueado; portanto, os desenvolvedores não precisam considerar os problemas de segurança do encadeamento.
V.Init (ServletConfig) Método e exceção
Durante a execução, esse método pode lançar uma servletexception para notificar o servidor da Web de que a instância do servlet não foi inicializada. Depois que uma servletexception for lançada, o servidor da Web não entregará a solicitação do cliente à instância do servlet para processamento, mas relatará as informações de exceção de falha de inicialização ao cliente, que serão destruídas da memória. Se uma nova solicitação for feita, o servidor da Web criará uma nova instância do servlet e executará a operação de inicialização da nova instância.
3. Serviço
Depois que a instância do servlet é criada e inicializada com sucesso, a instância do servlet pode ser usada pelo servidor para atender à solicitação do cliente e gerar uma resposta. Durante o estágio de serviço, o servidor da Web chamará o método do Serviço (Solicitação ServletRequest, Resposta do Servitresponse) da instância. O objeto de solicitação e o objeto de resposta são criados pelo servidor e passados para a instância do servlet. O objeto de solicitação encapsula as informações enviadas pelo cliente ao servidor e o objeto de resposta encapsula as informações enviadas pelo servidor ao cliente.
I. Responsabilidades do Método Serviço ()
O método Service () é o método principal do servlet. A lógica de negócios do cliente deve ser executada nesse método. O processo de desenvolvimento de um método de serviço típico é:
Analisar solicitação do cliente-> Executar lógica de negócios-> Página de resposta de saída para o cliente
II.Service () Método e thread
Para melhorar a eficiência, a especificação do servlet requer que uma instância do servlet seja capaz de atender a várias solicitações do cliente ao mesmo tempo. Ou seja, o método Service () é executado em um ambiente multithread e os desenvolvedores de servlet devem garantir a segurança do encadeamento do método.
III.Service () Método e exceção
O método Service () pode lançar servletexception e IoException durante a execução. Entre eles, o servletexception pode ser lançado durante o processo de processamento de solicitações do cliente, como o recurso solicitado não está disponível, o banco de dados não está disponível, etc. Depois que a exceção é lançada, o contêiner deve reciclar o objeto de solicitação e relatar as informações de exceção do cliente. A ioException indica um erro de entrada e saída. O programador não precisa se preocupar com a exceção e o relata diretamente ao cliente pelo contêiner.
Precauções de programação:
1) Quando o encadeamento do servidor Thread executa o método init () da instância do servlet, todos os encadeamentos do cliente do cliente não podem executar o método Service () da instância, e nenhum thread pode executar o método Destroy () da instância. Portanto, o método init () do servlet funciona em um único ambiente de encadeamento, e os desenvolvedores não precisam considerar nenhum problema de segurança de threads.
2) Quando o servidor recebe várias solicitações do cliente, o servidor executará o método Service () da instância do servlet em um thread de atendimento ao cliente separado para servir cada cliente. No momento, vários threads executarão o método Service () da mesma instância do servlet ao mesmo tempo, portanto, os problemas de segurança do thread devem ser considerados.
3) Observe que, embora o método Service () seja executado em um ambiente multithread, não é necessário sincronizar o método. Em vez disso, depende do tipo de recurso acessado por esse método durante a execução e como ele acessa recursos. A análise é a seguinte:
eu. Se o método Service () não acessar as variáveis do membro do servlet ou recursos globais, como variáveis estáticas, arquivos, conexões de banco de dados, etc., ele usa apenas os recursos do segmento atual, como variáveis temporárias, solicitações e objetos de resposta que não apontam para os recursos globais. Esse método em si é seguro para roscas e não requer nenhum controle de sincronização.
ii. Se o método Service () acessar a variável do membro do servlet, mas a operação na variável for uma operação somente leitura, o próprio método é seguro para encadeamento e não requer nenhum controle de sincronização.
iii. Se o método Service () acessar a variável do membro do servlet e a operação da variável for lida e gravada, geralmente será necessária uma instrução de controle de sincronização.
4. Se o método Service () acessar uma variável estática global, se houver outros threads no sistema acessando a variável estática ao mesmo tempo, se houver operações de leitura e gravação, geralmente será necessária uma instrução de controle de sincronização.
v. Se o método Service () acessar recursos globais, como arquivos, conexões de banco de dados, etc., geralmente é necessário adicionar instruções de controle de sincronização.
4. Destruição
Quando o servidor da Web pensa que a instância do servlet não é necessária, como recarregamento do aplicativo ou desligamento do servidor, e o servlet não é acessado há muito tempo. O servidor pode destruir (também chamado de desinstalação) a instância da memória. O servidor da Web deve garantir que o método Destroy () da instância do servlet seja chamado antes de desinstalar a instância do servlet, a fim de reciclar os recursos solicitados pelo servlet ou executar outro processamento importante.
O servidor da Web deve garantir que, antes de ligar, Destroy (), todos os threads executados no método Service () da Instância Sair ou aguardar esses threads por um período de tempo. Depois que o método Destroy () for executado, o servidor da Web rejeitará todas as novas solicitações para a instância do servlet. O método de destruição () sai e a instância do servlet pode ser coletada de lixo.
4. Fluxograma do servlet Parsing Client HTTP Solicy:
1. O cliente da web emite uma solicitação HTTP ao contêiner de servlet;
2. O contêiner servlet analisa a solicitação HTTP da Web.
3. O contêiner do servlet cria um objeto httprequest, encapsulando as informações de solicitação HTTP neste objeto;
4. O contêiner de servlet cria um objeto HTTPRESPONHE;
5. Contêiner de servlet (Se o servlet acessado não for criado na inicialização do servidor, primeiro crie uma instância do servlet e ligue para o método init () para inicializar o objeto), ligue para o método Service () do HttPServlet e passe os parâmetros do objeto HtttPrequest e HTTPRESPOnse como métodos de serviço para o objeto HTTPSVET;
6. HttpServlet chama os métodos relevantes da HTTPrequest para obter informações de solicitação HTTP;
7. HttpServlet chama os métodos relevantes de HTTPRESPO para gerar dados de resposta;
8. O contêiner do servlet passa o resultado da resposta HTTPSERVlet para o cliente da web.
O artigo acima é baseado no princípio da execução e no ciclo de vida do servlet (análise abrangente) é todo o conteúdo que compartilho com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.