Jakarta Servlet - Jakarta Servlet

Jakarta Servlet
Auteur(s) original(aux) Pavni Diwanji
Développeur(s) Fondation Éclipse
Première version décembre 1996 ; il y a 24 ans ( 1996-12 )
Version stable
5.0 / 7 septembre 2020 ; il y a 10 mois ( 2020-09-07 )
Dépôt Modifiez ceci sur Wikidata
Écrit en Java
Plate-forme Jakarta EE 9
Taille 2,56 Mo
Taper Composant logiciel pour l' API Web
Licence Licence publique Eclipse
Site Internet jakarta .ee /spécifications /servlet /5 .0 /
Vie d'un fichier JSP

Un Jakarta Servlet (anciennement Java Servlet) est un composant logiciel Java qui étend les capacités d'un serveur . Bien que les servlets puissent répondre à de nombreux types de requêtes, elles implémentent le plus souvent des conteneurs Web pour héberger des applications Web sur des serveurs Web et sont donc qualifiées d' API Web de servlet côté serveur . Ces servlets Web sont l' équivalent Java d'autres technologies de contenu Web dynamique telles que PHP et ASP.NET .

introduction

Un Jakarta Servlet traite ou stocke une classe Java dans Jakarta EE qui est conforme à l'API Jakarta Servlet, une norme pour l'implémentation de classes Java qui répondent aux demandes. Les servlets pourraient en principe communiquer sur n'importe quel protocole client-serveur , mais ils sont le plus souvent utilisés avec HTTP . Ainsi, "servlet" est souvent utilisé comme raccourci pour "HTTP servlet". Ainsi, un développeur de logiciels peut utiliser une servlet pour ajouter du contenu dynamique à un serveur Web en utilisant la plate-forme Java . Le contenu généré est généralement HTML , mais peut être d'autres données telles que XML et plus communément, JSON. Les servlets peuvent maintenir l' état dans la session des variables dans de nombreuses transactions de serveur en utilisant les cookies HTTP ou mappage d'URL .

L'API Jakarta Servlet a, dans une certaine mesure, été remplacée par deux technologies Java standard pour les services Web :

Pour déployer et exécuter un servlet, un conteneur Web doit être utilisé. Un conteneur Web (également appelé conteneur de servlets) est essentiellement le composant d'un serveur Web qui interagit avec les servlets. Le conteneur Web est chargé de gérer le cycle de vie des servlets, de mapper une URL sur une servlet particulière et de s'assurer que le demandeur d'URL dispose des droits d'accès appropriés.

L' API Servlet , contenue dans la hiérarchie des packages Javajavax.servlet , définit les interactions attendues du conteneur Web et d'un servlet.

A Servletest un objet qui reçoit une demande et génère une réponse basée sur cette demande. Le package Servlet de base définit des objets Java pour représenter les demandes et les réponses du servlet, ainsi que des objets pour refléter les paramètres de configuration et l'environnement d'exécution du servlet. Le package javax.servlet.httpdéfinit des sous-classes spécifiques à HTTP des éléments de servlet génériques, y compris des objets de gestion de session qui suivent plusieurs demandes et réponses entre le serveur Web et un client. Les servlets peuvent être empaquetés dans un fichier WAR en tant qu'application Web .

Les servlets peuvent être générées automatiquement à partir de Jakarta Server Pages (JSP) par le compilateur Jakarta Server Pages . La différence entre les servlets et les JSP est que les servlets intègrent généralement du HTML dans du code Java, tandis que les JSP intègrent du code Java dans du HTML. Alors que l'utilisation directe de servlets pour générer du HTML (comme indiqué dans l'exemple ci-dessous) est devenue rare, le framework Web MVC de niveau supérieur à Jakarta EE ( JSF ) utilise toujours explicitement la technologie de servlet pour la gestion des requêtes/réponses de bas niveau via le FacesServlet. Une utilisation un peu plus ancienne consiste à utiliser des servlets en conjonction avec des JSP dans un modèle appelé " Modèle 2 ", qui est une variante du modèle-vue-contrôleur .

La version actuelle de Servlet est la 5.0.

Histoire

L'API Java Servlet a été annoncée publiquement pour la première fois lors de la conférence inaugurale JavaOne en mai 1996. Environ deux mois après les annonces de la conférence, la première implémentation publique a été rendue disponible sur le site Web JavaSoft. Il s'agissait de la première version alpha du serveur Web Java (JWS ; alors connu sous son nom de code Jeeves ) qui serait finalement expédié en tant que produit le 5 juin 1997.

Dans son blog sur java.net , Jim Driscoll , vétéran de Sun et directeur de GlassFish, détaille l'histoire de la technologie des servlets. James Gosling a pensé pour la première fois aux servlets aux premiers jours de Java , mais le concept n'est devenu un produit qu'en décembre 1996, lorsque Sun a livré JWS. C'était avant que ce qui est maintenant le Jakarta EE ne devienne une spécification.

La spécification Servlet1 a été créée par Pavni Diwanji alors qu'elle travaillait chez Sun Microsystems , avec la version 1.0 finalisée en juin 1997. À partir de la version 2.2, la spécification a été développée sous le Java Community Process .

Historique de l'API de servlet
Version de l'API de servlet Publié spécification Plate-forme Changements importants
Jakarta Servlet 5.0.0 M1 12 juin 2020 5.0 Jakarta EE 9 API déplacée du package javax.servletversjakarta.servlet
Jakarta Servlet 4.0.3 13 août 2019 4.0 Jakarta EE 8 Renommé à partir de la marque "Java"
Servlet Java 4.0 sept. 2017 JSR 369 Java EE 8 HTTP/2
Java Servlet 3.1 Mai 2013 JSR 340 Java EE7 E/S non bloquantes, mécanisme de mise à niveau du protocole HTTP ( WebSocket )
Java Servlet 3.0 décembre 2009 JSR 315 Java EE 6, Java SE 6 Pluggability, Facilité de développement, Async Servlet, Sécurité, Téléchargement de fichiers
Java Servlet 2.5 Septembre 2005 JSR 154 Java EE 5, Java SE 5 Nécessite Java SE 5, prend en charge l'annotation
Java Servlet 2.4 novembre 2003 JSR 154 J2EE 1.4, J2SE 1.3 web.xml utilise le schéma XML
Java Servlet 2.3 août 2001 JSR 53 J2EE 1.3, J2SE 1.2 En plus de Filter
Java Servlet 2.2 août 1999 JSR 902 , JSR 903 J2EE 1.2, J2SE 1.2 Fait partie de J2EE, introduit des applications Web indépendantes dans des fichiers .war
Servlet Java 2.1 novembre 1998 2.1a Non spécifié Première spécification officielle, ajoutée RequestDispatcher,ServletContext
Java Servlet 2.0 décembre 1997 N / A JDK 1.1 Fait partie du kit de développement Java Servlet 2.0 d'avril 1998
Java Servlet 1.0 décembre 1996 N / A Fait partie du kit de développement de servlet Java (JSDK) 1.0 de juin 1997

Cycle de vie d'une servlet

Trois méthodes sont au cœur du cycle de vie d'une servlet. Ce sont init(), service(), et destroy(). Ils sont implémentés par chaque servlet et sont invoqués à des moments spécifiques par le serveur.

  • Au cours de l'étape d'initialisation du cycle de vie du servlet , le conteneur Web initialise l'instance de servlet en appelant la init()méthode, en passant un objet implémentant l' javax.servlet.ServletConfiginterface. Cet objet de configuration permet à la servlet d'accéder aux paramètres d'initialisation nom-valeur à partir de l'application Web.
  • Après l'initialisation, l'instance de servlet peut traiter les demandes des clients. Chaque demande est traitée dans son propre thread séparé. Le conteneur Web appelle la service()méthode de la servlet pour chaque requête. La service()méthode détermine le type de demande effectuée et l'envoie à une méthode appropriée pour traiter la demande. Le développeur de la servlet doit fournir une implémentation pour ces méthodes. Si une demande est faite pour une méthode qui n'est pas implémentée par la servlet, la méthode de la classe parente est appelée, ce qui entraîne généralement le retour d'une erreur au demandeur.
  • Enfin, le conteneur Web appelle la destroy()méthode qui met le servlet hors service. La destroy()méthode, comme init(), n'est appelée qu'une seule fois dans le cycle de vie d'une servlet.

Ce qui suit est un scénario utilisateur typique de ces méthodes.

  1. Supposons qu'un utilisateur demande à visiter une URL .
    • Le navigateur génère alors une requête HTTP pour cette URL.
    • Cette requête est ensuite envoyée au serveur approprié.
  2. La requête HTTP est reçue par le serveur Web et transmise au conteneur de servlet.
    • Le conteneur mappe cette requête à une servlet particulière.
    • La servlet est récupérée dynamiquement et chargée dans l'espace d'adressage du conteneur.
  3. Le conteneur appelle la init()méthode de la servlet.
    • Cette méthode n'est invoquée que lorsque la servlet est chargée pour la première fois en mémoire.
    • Il est possible de passer des paramètres d'initialisation à la servlet pour qu'elle se configure.
  4. Le conteneur appelle la service()méthode de la servlet.
    • Cette méthode est appelée pour traiter la requête HTTP.
    • La servlet peut lire les données qui ont été fournies dans la requête HTTP.
    • La servlet peut également formuler une réponse HTTP pour le client.
  5. La servlet reste dans l'espace d'adressage du conteneur et est disponible pour traiter toute autre requête HTTP reçue des clients.
    • La service()méthode est appelée pour chaque requête HTTP.
  6. Le conteneur peut, à un moment donné, décider de décharger la servlet de sa mémoire.
    • Les algorithmes par lesquels cette décision est prise sont spécifiques à chaque conteneur.
  7. Le conteneur appelle la destroy()méthode du servlet pour abandonner toutes les ressources telles que les descripteurs de fichiers qui sont alloués au servlet ; les données importantes peuvent être enregistrées dans un magasin persistant.
  8. La mémoire allouée à la servlet et à ses objets peut alors être récupérée.

Exemple

L'exemple de servlet suivant affiche combien de fois sa service()méthode a été appelée.

Notez qu'il HttpServlets'agit d'une sous-classe de GenericServlet, une implémentation de l' Servletinterface.

La service()méthode de HttpServletclasse distribue les requêtes aux méthodes doGet(), doPost(), doPut(), doDelete(), et ainsi de suite ; selon la requête HTTP. Dans l'exemple ci service()- dessous, il est remplacé et ne distingue pas la méthode de requête HTTP qu'il sert.

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");
    }
}

Serveurs de conteneurs

La spécification de la technologie Servlet a été mise en œuvre dans de nombreux produits. Consultez la liste des implémentations sur la page du conteneur Web .

Les références

Liens externes