Jakarta Servlet - Jakarta Servlet
Autor (es) original (is) | Pavni Diwanji |
---|---|
Desenvolvedor (s) | Eclipse Foundation |
lançamento inicial | Dezembro 1996 |
Versão estável |
5.0
/ 7 de setembro de 2020
|
Repositório | |
Escrito em | Java |
Plataforma | Jakarta EE 9 |
Tamanho | 2,56 MB |
Modelo | Componente de software para API da Web |
Licença | Licença Pública Eclipse |
Local na rede Internet | jakarta |
Um Jakarta Servlet (anteriormente Java Servlet) é um componente de software Java que estende os recursos de um servidor . Embora os servlets possam responder a muitos tipos de solicitações, eles geralmente implementam contêineres da web para hospedar aplicativos da web em servidores da web e, portanto, qualificam-se como uma API da web de servlet do lado do servidor . Esses servlets da web são a contraparte Java de outras tecnologias de conteúdo da web dinâmico , como PHP e ASP.NET .
Introdução
Um Jakarta Servlet processa ou armazena uma classe Java em Jakarta EE que está em conformidade com a Jakarta Servlet API, um padrão para implementar classes Java que respondem a solicitações. Os servlets podem, em princípio, comunicar-se por meio de qualquer protocolo cliente-servidor , mas são mais frequentemente usados com HTTP . Portanto, "servlet" é freqüentemente usado como uma abreviação para "servlet HTTP". Assim, um desenvolvedor de software pode usar um servlet para adicionar conteúdo dinâmico a um servidor web usando a plataforma Java . O conteúdo gerado é comumente HTML , mas pode ser outros dados, como XML e, mais comumente, JSON. Os servlets podem manter o estado em variáveis de sessão em muitas transações de servidor usando cookies HTTP ou mapeamento de URL .
A API Jakarta Servlet foi, até certo ponto, substituída por duas tecnologias Java padrão para serviços da web:
- os Jakarta RESTful Web Services (JAX-RS 2.0) úteis para AJAX, JSON e serviços REST, e
- o Jakarta XML Web Services (JAX-WS) é útil para SOAP Web Services .
Para implantar e executar um servlet, um contêiner da web deve ser usado. Um contêiner da web (também conhecido como contêiner de servlet) é essencialmente o componente de um servidor da web que interage com os servlets. O contêiner da web é responsável por gerenciar o ciclo de vida dos servlets, mapeando uma URL para um servlet específico e garantindo que o solicitante da URL tenha os direitos de acesso corretos.
A API Servlet , contida na hierarquia do pacote Javajavax.servlet
, define as interações esperadas do contêiner da web e um servlet.
A Servlet
é um objeto que recebe uma solicitação e gera uma resposta com base nessa solicitação. O pacote Servlet básico define objetos Java para representar solicitações e respostas de servlet, bem como objetos para refletir os parâmetros de configuração do servlet e o ambiente de execução. O pacote javax.servlet.http
define subclasses específicas de HTTP dos elementos de servlet genéricos, incluindo objetos de gerenciamento de sessão que rastreiam várias solicitações e respostas entre o servidor da web e um cliente. Os servlets podem ser empacotados em um arquivo WAR como um aplicativo da web .
Servlets podem ser gerados automaticamente a partir de Jakarta Server Pages (JSP) pelo compilador Jakarta Server Pages . A diferença entre servlets e JSP é que os servlets geralmente incorporam HTML no código Java, enquanto os JSPs incorporam o código Java em HTML. Embora o uso direto de servlets para gerar HTML (conforme mostrado no exemplo abaixo) tenha se tornado raro, a estrutura da web MVC de nível superior em Jakarta EE ( JSF ) ainda usa explicitamente a tecnologia de servlet para o tratamento de solicitação / resposta de baixo nível por meio do FacesServlet
. Um uso um pouco mais antigo é usar servlets em conjunto com JSPs em um padrão chamado " Modelo 2 ", que é um tipo de modelo-visão-controlador .
A versão atual do Servlet é 5.0.
História
A API Java Servlet foi anunciada publicamente pela primeira vez na conferência JavaOne inaugural em maio de 1996. Cerca de dois meses após os anúncios na conferência, a primeira implementação pública foi disponibilizada no site JavaSoft. Este foi o primeiro alfa do Java Web Server (JWS; então conhecido por seu codinome Jeeves ), que eventualmente seria lançado como um produto em 5 de junho de 1997.
Em seu blog em java.net , Jim Driscoll , veterano da Sun e líder do GlassFish, detalha a história da tecnologia de servlet. James Gosling pensou primeiro em servlets nos primeiros dias de Java , mas o conceito não se tornou um produto até dezembro de 1996, quando a Sun lançou o JWS. Isso foi antes de o que agora é o Jakarta EE ser transformado em uma especificação.
A especificação Servlet1 foi criada por Pavni Diwanji enquanto ela trabalhava na Sun Microsystems , com a versão 1.0 finalizada em junho de 1997. A partir da versão 2.2, a especificação foi desenvolvida sob o Java Community Process .
Versão da API Servlet | Lançado | Especificação | Plataforma | Mudanças Importantes |
---|---|---|---|---|
Jakarta Servlet 5.0.0 M1 | 12 de junho de 2020 | 5.0 | Jakarta EE 9 | API movida do pacote javax.servlet parajakarta.servlet
|
Jakarta Servlet 4.0.3 | 13 de agosto de 2019 | 4,0 | Jakarta EE 8 | Renomeado de marca registrada "Java" |
Java Servlet 4.0 | Set 2017 | JSR 369 | Java EE 8 | HTTP / 2 |
Java Servlet 3.1 | Maio de 2013 | JSR 340 | Java EE 7 | E / S sem bloqueio, mecanismo de atualização do protocolo HTTP ( WebSocket ) |
Java Servlet 3.0 | Dezembro de 2009 | JSR 315 | Java EE 6, Java SE 6 | Plugabilidade, facilidade de desenvolvimento, servlet assíncrono, segurança, envio de arquivo |
Java Servlet 2.5 | Setembro de 2005 | JSR 154 | Java EE 5, Java SE 5 | Requer Java SE 5, suporta anotação |
Java Servlet 2.4 | Novembro de 2003 | JSR 154 | J2EE 1.4, J2SE 1.3 | web.xml usa esquema XML |
Java Servlet 2.3 | Agosto de 2001 | JSR 53 | J2EE 1.3, J2SE 1.2 | Adição de Filter
|
Java Servlet 2.2 | Agosto de 1999 | JSR 902 , JSR 903 | J2EE 1.2, J2SE 1.2 | Torna-se parte do J2EE, introduzindo aplicativos da web independentes em arquivos .war |
Java Servlet 2.1 | Novembro de 1998 | 2.1a | Não especificado | Primeira especificação oficial, adicionada RequestDispatcher ,ServletContext
|
Java Servlet 2.0 | Dezembro de 1997 | N / D | JDK 1.1 | Parte do Java Servlet Development Kit 2.0 de abril de 1998 |
Java Servlet 1.0 | Dezembro de 1996 | N / D | Parte do Java Servlet Development Kit (JSDK) 1.0 de junho de 1997 |
Ciclo de vida de um servlet
Três métodos são centrais para o ciclo de vida de um servlet. Estes são init()
, service()
e destroy()
. Eles são implementados por cada servlet e são chamados em horários específicos pelo servidor.
- Durante o estágio de inicialização do ciclo de vida do servlet , o contêiner da web inicializa a instância do servlet chamando o
init()
método, passando um objeto que implementa ajavax.servlet.ServletConfig
interface. Este objeto de configuração permite que o servlet acesse os parâmetros de inicialização de nome-valor do aplicativo da web. - Após a inicialização, a instância do servlet pode atender às solicitações do cliente. Cada solicitação é atendida em seu próprio encadeamento separado. O contêiner da web chama o
service()
método do servlet para cada solicitação. Oservice()
método determina o tipo de solicitação que está sendo feita e a despacha para um método apropriado para lidar com a solicitação. O desenvolvedor do servlet deve fornecer uma implementação para esses métodos. Se um pedido for feito para um método que não é implementado pelo servlet, o método da classe pai é chamado, normalmente resultando em um erro que está sendo retornado ao solicitante. - Finalmente, o contêiner da web chama o
destroy()
método que tira o servlet de serviço. Odestroy()
método, comoinit()
, é chamado apenas uma vez no ciclo de vida de um servlet.
A seguir está um cenário típico de usuário desses métodos.
- Suponha que um usuário solicite a visita a um URL .
- O navegador então gera uma solicitação HTTP para este URL.
- Essa solicitação é enviada ao servidor apropriado.
- A solicitação HTTP é recebida pelo servidor da web e encaminhada para o contêiner de servlet.
- O contêiner mapeia essa solicitação para um servlet específico.
- O servlet é recuperado dinamicamente e carregado no espaço de endereço do contêiner.
- O contêiner invoca o
init()
método do servlet.- Este método é chamado apenas quando o servlet é carregado pela primeira vez na memória.
- É possível passar parâmetros de inicialização ao servlet para que ele possa se configurar.
- O contêiner invoca o
service()
método do servlet.- Este método é chamado para processar a solicitação HTTP.
- O servlet pode ler dados que foram fornecidos na solicitação HTTP.
- O servlet também pode formular uma resposta HTTP para o cliente.
- O servlet permanece no espaço de endereço do contêiner e está disponível para processar quaisquer outras solicitações HTTP recebidas de clientes.
- O
service()
método é chamado para cada solicitação HTTP.
- O
- O contêiner pode, em algum ponto, decidir descarregar o servlet de sua memória.
- Os algoritmos pelos quais essa decisão é tomada são específicos para cada contêiner.
- O contêiner chama o
destroy()
método do servlet para abrir mão de quaisquer recursos, como identificadores de arquivo que são alocados para o servlet; dados importantes podem ser salvos em um armazenamento persistente. - A memória alocada para o servlet e seus objetos podem ser coletados como lixo.
Exemplo
O seguinte servlet de exemplo imprime quantas vezes seu service()
método foi chamado.
Observe que HttpServlet
é uma subclasse de GenericServlet
uma implementação da Servlet
interface.
O service()
método de HttpServlet
classe envia pedidos para os métodos doGet()
, doPost()
, doPut()
, doDelete()
, e assim por diante; de acordo com a solicitação HTTP. No exemplo abaixo, service()
é substituído e não distingue qual método de solicitação HTTP ele atende.
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class ServletLifeCycleExample extends HttpServlet {
private Integer sharedCounter;
@Override
public void init(final ServletConfig config) throws ServletException {
super.init(config);
getServletContext().log("init() called");
sharedCounter = 0;
}
@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
getServletContext().log("service() called");
int localCounter;
synchronized (sharedCounter) {
sharedCounter++;
localCounter = sharedCounter;
}
response.getWriter().write("Incrementing the count to " + localCounter); // accessing a local variable
}
@Override
public void destroy() {
getServletContext().log("destroy() called");
}
}
Servidores de contêineres
A especificação da tecnologia Servlet foi implementada em muitos produtos. Veja uma lista de implementações na página do contêiner da web .