84 votes

Différence entre chaque instance de servlet et chaque thread de servlet dans les servlets?

Existe-t-il plusieurs instances de la classe servlet? Lorsque j'entends "chaque instance de servlet", quelqu'un peut-il élaborer sur ce point?

187voto

BalusC Points 498232

Lorsque le conteneur de Servlet démarre, il:

  1. lectures web.xml;
  2. trouve la déclaration de Servlets dans le classpath; et
  3. les charges et instancie chaque Servlet qu'une seule fois.

En gros, comme ceci:

String urlPattern = parseWebXmlAndRetrieveServletUrlPattern();
String servletClass = parseWebXmlAndRetrieveServletClass();
HttpServlet servlet = (HttpServlet) Class.forName(servletClass).newInstance();
servlet.init();
servlets.put(urlPattern, servlet); // Similar to a map interface.

Ces Servlets sont stockés en mémoire et réutilisés à chaque fois l'URL de la requête correspond à la Servlet est associée url-pattern. Le conteneur de servlet puis exécute le code similaire à:

for (Entry<String, HttpServlet> entry : servlets.entrySet()) {
    String urlPattern = entry.getKey();
    HttpServlet servlet = entry.getValue();
    if (request.getRequestURL().matches(urlPattern)) {
        servlet.service(request, response);
        break;
    }
}

L' GenericServlet#service() sur son tour décide de l' doGet(), doPost(),, etc.. pour invoquer basé sur HttpServletRequest#getMethod().

Vous voyez, la servletcontainer réutilise la même instance de servlet pour chaque demande. En d'autres termes: les servlets sont partagés entre chaque demande. C'est pourquoi il est extrêmement important d'écrire servlet code de la thread-safe manière, qui est en fait simple: il suffit de ne pas affecter la demande de session ou de l'étendue des données que les variables d'instance de la servlet, mais tout comme la méthode des variables locales. E. g.

public class MyServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

31voto

Bozho Points 273663

Non, une seule instance du servlet est réutilisée pour plusieurs demandes provenant de plusieurs clients. Cela conduit à deux règles importantes:

  • n'utilisez pas de variables d'instance dans un servlet, sauf pour les valeurs à l'échelle de l'application, le plus souvent obtenues à partir de paramètres de contexte.
  • ne crée pas de méthodes synchronized dans une servlet

(idem pour les filtres de servlet et jsps)

11voto

Samuel Edwin Ward Points 3192

Selon la spécification Java Servlet Version 3.0 (p. 6 à 7), il y aura une instance par déclaration par JVM, sauf si le servlet implémente SingleThreadModel, auquel cas il peut y avoir plusieurs instances par JVM.

5voto

fastcodejava Points 22174

Il ne peut y avoir plusieurs instances de la classe servlet. Même s'il existe une instance du servlet, il est capable de gérer plusieurs demandes. Il est donc sage de ne pas utiliser de variables de niveau classe.

4voto

lcn Points 379

Pour ceux qui connaissent la vraie JavaScript (pas seulement une bibliothèque de celui-ci), Servlets peuvent être considérés comme des objets de fonction. En tant qu’objets fonctionnels, la tâche principale d’eux est de faire quelque chose, au lieu de stocker des informations dans leurs coffres. Il n’y a pas besoin d’instancier plusieurs instances de chaque de ce objets fonctionnel, avec la même logique que les méthodes de la classe Java sont partagés entre toutes les instances de cette classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X