1. Visão geral do servlet
1. Tecnologia dinâmica de desenvolvimento de recursos da Web fornecida pela Sun Company. A essência é o applet Java anterior, que exige que este applet implemente a interface do servlet para que o servidor possa chamá -lo.
2. Duas etapas para desenvolver um servlet
*Experimento: início rápido do servlet
(1) Etapa 1: Escreva um programa Java para implementar a interface do servlet (aqui herda diretamente a classe de implementação padrão GenericServlet)
pacote cn.itheima; importar java.io.*; importar javax.Servlet.*; classe pública PrimeiroServlet estende o genérico.
(2) Além de colocar a classe compilada com pacotes em Web-Inf/Classes, você também deve configurar o servlet de registro Web.xml do aplicativo da Web.
<Verlet> <Verlet-name> primeiroServlet </servlet-name> <Servlet-class> cn.itheima.firstServlet </servlet-class> </servlet> <sutlet-mapping> <Servlet-name> FIRSTSERVLE
3. Desenvolva servlets com myeclipse
2. Descrição detalhada do servlet
1. Ciclo de vida: Quando uma coisa nasce e morre, o que inevitavelmente fará durante sua existência. Colocá -lo é o ciclo da declaração da coisa.
2. Ciclo de vida do servlet: Geralmente, quando o servlet é acessado pela primeira vez, um objeto é criado na memória e o método init () é chamado imediatamente após a criação para inicializar. Para cada solicitação, o método de serviço (req, resp) é usado para processar a solicitação. No momento, as informações de solicitação serão encapsuladas com o objeto de solicitação, e o objeto de resposta (originalmente vazio) representa a mensagem de resposta, que é transmitida para o método de serviço para uso. Quando o método de serviço é processado, o servidor de retorno organiza uma mensagem de resposta a ser retornada ao navegador com base nas informações na resposta. O servlet não é destruído depois que a resposta é concluída e permanece na memória e aguarda a próxima solicitação. Até que o servidor seja fechado ou o aplicativo da Web seja removido do host virtual, o objeto Servlet é destruído e o método Destroy () é chamado antes de ser destruído para fazer algo depois.
3. Estrutura de herança da interface do servlet
Interface do servlet: define o método que um servlet deve ter e todos os servlets devem implementar essa interface direta ou indiretamente.
|
| ---- GenericServlet: A implementação padrão da interface do servlet, um servlet geral, esta é uma classe abstrata, a maioria dos métodos é implementada por padrão, apenas o método de serviço é um método abstrato que precisa ser implementado pelo próprio herdeiro.
|
| ----- HTTPSERVlet: Um servlet otimizado para o protocolo HTTP é herdado da classe GenicServlet e o método de abstrato de serviço é implementado. A implementação padrão determina o método de solicitação da solicitação e chama diferentes métodos Doxxx () de acordo com os diferentes métodos de solicitação. Normalmente podemos herdar diretamente httpservlet
4. Coisas a serem observadas ao registrar servlets em web.xml
4.1 Registre um servlet usando a tag <Verlet> <Servlet-Mapping>
<Verlet> <Verlet-name> FirstServlet </Servlet-Name> <Servlet-Class> cn.itheima.firstServlet </Servlet-Class>
Nota: O que você quer aqui é o nome completo da classe de um servlet, não o caminho do arquivo que contém extensões .java ou.
</servlet> <Verlet-mapping> <Verlet-name> FirstServlet </servlet-name> <url-tattern>/FirstServlet </url-tattern> </ervlet-mapping>
4.2 <revlet> pode corresponder a múltiplos <Verlet-mapping>
4.3 Você pode usar o caractere *Match para configurar <Serlvet-Mapping>, mas tenha cuidado para que seja um caminho começando com *.do ou / que termina com / *.
~ Devido à introdução de caracteres de correspondência, é possível que um caminho virtual corresponda a vários mapeamentos de servlet. Neste momento, qual é mais semelhante ao que o servlet está procurando, e o nível *.do é o mais baixo.
4.4 Você pode configurar o sub-label <Load-on-Startup> para <Verlet>, especificando que o servlet está carregado com a inicialização do servidor e os valores configurados especificam a ordem da inicialização
servlet> <Verlet-name> Invocador </vlect-name> <Servlet-class> org.apache.catalina.servlets.invokerServlet </servlet-class> <adar load-on-startup> 2 </olload-on-startup> </servlet>
4.5 Servlet padrão: Se o caminho de acesso externo de um servlet estiver definido como /, o servlet for um servlet padrão e outros servlets não processarem solicitações.
~ O servlet padrão está configurado em conf/web.xml, e o acesso a recursos estáticos e a saída das páginas de erro são tratados por esse servlet padrão. Se escrevermos um servlet padrão para substituir o servlet padrão no web.xml do pai, isso fará com que os recursos da Web estática sejam inacessíveis. Portanto, a configuração não é recomendada.
4.6 Questões de segurança de threads do servlet
4.6.1 Como geralmente, um servlet tem apenas uma instância na memória para processar a solicitação, quando várias solicitações forem enviadas, vários threads operarão o objeto Servlet, o que pode levar a problemas de segurança do encadeamento.
(1) Pode haver problemas de segurança de threads com variáveis de membros do servlvet
*Experimento: defina uma variável de membro inti = 0; Execute a operação I ++ no método doxxx () e a saída i valor para o cliente. No momento, os problemas de segurança do thread podem ser causados devido ao atraso.
(2) Quando a Servet opera arquivos de recursos, vários tópicos operam o mesmo arquivo e causam problemas de segurança de threads
*Experimento: a solicitação vem com um parâmetro, o servlet grava o parâmetro de solicitação em um arquivo, depois lê o arquivo e imprime o valor de leitura para o cliente. Pode haver problemas de segurança de tópicos
4.6.2 Solução
(1) Use blocos de código síncrono para resolver o problema. A desvantagem é que o bloco de código síncrono pode processar apenas uma solicitação ao mesmo tempo, o que é muito ineficiente; portanto, o bloco de código síncrono precisa conter apenas o código principal que causa problemas de segurança do encadeamento.
(2) Implementar a interface SingleThreadModel para este servlet. Esta é uma interface de tag. O servlet marcado salvará um pool de servlet na memória. Se um thread vier e não houver processamento de objetos do servlet no pool, um novo será criado. Se houver servlets livres na piscina, use -os diretamente. Isso realmente não resolve problemas de segurança de threads. Esta interface foi abandonada.
(3) Ambas as soluções não são perfeitas; portanto, tente não aparecer variáveis de membros no servlet.
3. ServletConfig
1. Objetos que representam a configuração dos servlets, que podem ser configurados em <Verlet> em web.xml
</servlet> <Verlet-name> Demo5Servlet </servlet-name> <Servlet-class> cn.itheima.Demo5Servlet </servlet-class> <iit-param> <amam-name> Data1 </aman-name> <amon-value> value1 </param-value> </inot-Param>
Em seguida, use isso.getServletConfig () no servlet para obter o objeto ServletConfig. Este objeto fornece métodos getInitParameter () e getInitParameterNames (), que podem atravessar os itens de configuração na configuração.
Se você não deseja escrever conteúdo morto no servlet, pode configurá -lo aqui.
4. ServletContext
1. O objeto que representa o aplicativo Web atual.
2. Usado como um objeto de domínio, transfira dados entre diferentes servlets e seu escopo é o aplicativo da web inteiro.
Ciclo de vida: crie um objeto ServletContext que representa todo o aplicativo da Web quando o aplicativo da Web for carregado no contêiner. Quando o servidor está fechado ou o aplicativo da Web é removido do contêiner, o objeto ServletContext é destruído.
~ Domínio: um domínio é entendido como uma caixa, onde os dados podem ser colocados. Como um domínio é chamado de domínio, ele possui uma faixa visível. Os dados nesse domínio podem ser operados dentro desse intervalo. Esse objeto é chamado de objeto de domínio.
3. Em web.xml, você pode configurar os parâmetros de inicialização de todo o aplicativo da web e usar o servletContext para obter
<Cexextep-Param> <amam-name> param1 </am-name> <amam-value> pValue1 </param-value> </context-param> this.getServletContext (). getInitParameter ("param1") this.getServletContext (). getinitParameter ()4. Encaminhamento entre diferentes servlets
this.getServletContext (). getRequestDispatcher ("/servlet/Demo10Servlet"). Forward (solicitação, resposta);Após a conclusão da execução do método, o serviço retornará ao servidor e o servidor chamará o servlet de destino, onde a solicitação será recriada e os dados da solicitação anterior serão copiados nele.
5. Leia os arquivos de recursos
5.1 Como o caminho relativo é o diretório iniciado pela Java Virtual Machine por padrão, escreveremos diretamente o caminho relativo em relação ao diretório Tomcat/Bin, para que não possamos obter os recursos. Se escrito como um caminho absoluto, o caminho absoluto está errado quando o projeto é publicado em outro ambiente.
5.2 Para resolver esse problema, o ServletContext fornece isso.getServletContext (). GetRealPath ("/1.Properties"), que fornece um caminho virtual para o recurso e retornará o caminho real do recurso no ambiente atual. this.getServletContext (). getResourceasStream ("/1.Properties"), que retorna o caminho virtual de um recurso para o fluxo do caminho real do recurso.
5.3 Ao obter arquivos de recursos em não sertlets, não existe um objeto ServletContext usado e apenas os carregadores de classe podem ser usados no momento.
ClassLoader.GetResourCeasStream ("../../ 1.Properties"), esse método usa o carregador de classe para carregar recursos diretamente na memória, que tem problemas com atrasos de atualização e, se o arquivo for muito grande, leva muita memória.
Classloader.getResource ("../ 1.Properties"). getPath () retorna diretamente o caminho real do recurso, sem o problema do atraso de atualização.
Resumir
O exposto acima é todo o conteúdo deste artigo sobre discutir brevemente a base técnica do desenvolvimento de servlet, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a este site:
Análise básica da tecnologia de sessão de servlet
Além de outros tópicos relacionados neste site, se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!