mariojav ha scritto:
Se si, se no, chi mi chiarisce il dubbio?
Quando nel web.xml dichiari una servlet
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>x.y.z.MyServlet</servlet-class>
</servlet>
Il Servlet container crea una (ripeto UNA) sola istanza di quella classe, invocando per reflection (dal nome qualificato della classe) il costruttore senza argomenti (che chiaramente deve esistere, quello implicito o uno esplicito).
E tutte le richieste "mappate" su quella Servlet vengono servite in modo "concorrente" da più thread (creati e gestiti dal Servlet container) invocando il service e poi uno dei doXXX.
Questo ha una implicazione fondamentale: devi essere estremamente attento ed accurato se la Servlet deve tenere uno "stato" mutabile, perché sei in un contesto altamente concorrente.
Esiste una alternativa ma è stata deprecata (=non più da usare) dalle Servlet API 2.4 in poi: la interfaccia javax.servlet.SingleThreadModel. Come dice il javadoc:
If a servlet implements this interface, you are guaranteed that no two threads will execute concurrently in the servlet's service method. The servlet container can make this guarantee by synchronizing access to a single instance of the servlet, or by maintaining a pool of servlet instances and dispatching each new request to a free servlet.
Ma è bene NON sfruttare questa opzione. Quindi: una Servlet È in sostanza un "singleton".
Precisazione: una singola istanza è "per dichiarazione" nel web.xml. Potresti avere la stessa classe Servlet dichiarata due volte con due nomi distinti (e poi magari mappate differentemente). In questo caso le istanze sono due. Quindi alla fine: 1 istanza per 1 <servlet>