Existe-t-il plusieurs instances de la classe servlet? Lorsque j'entends "chaque instance de servlet", quelqu'un peut-il élaborer sur ce point?
Réponses
Trop de publicités?Lorsque le conteneur de Servlet démarre, il:
- lectures
web.xml
; - trouve la déclaration de Servlets dans le classpath; et
- 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.
}
}
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)
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.