Una pagina JSP è una particolare "Servlet". Il ServletContainer, quando riceve la richiesta per la visualizzazione di una pagina JSP, effettua le seguenti cose (in realtà questa è una semplificazione, ma va bene lo stesso):
1) Genera una classe Java corrispondente alla JSP (in pratica, genera del codice Java che si comporta esattamente come una Servlet)
2) Compila questo file .java e ottiene il relativo .class
3) Esegue il class.
Ora, questa classe è a tutti gli effetti una Servlet e, se sai come funziona una servlet, è facile intuire come possa essere tradotta quella pagina: viene creata una classe con un attributo privato chiamato "accessCount" ed un metodo che viene invocato dal ServletContainer ad ogni accesso affinchè venga prodotto il suo output. Ovviamente, una Servlet rimane in memoria finchè il ServletContainer non decide di "scartarla". Quindi, quella JSP verrà tradotta in una classe che è pressappoco così (è sempre una semplificazione):
codice:
public class mia_pagina extends ... {
private int accessCount = 0;
...
public void service(HttpServletRequest req, HttpServletResponse resp) {
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<H1>Dichiarazioni JSP</H1>");
out.print("<H2>Questa pagina è stata visualizzata ");
out.print( ++accessCount );
out.println(" volte</H2>");
out.println("</body>");
out.println("</html>");
}
}
Ogni volta che viene richiesta quella pagina il ServletContainer verifica che esista già un'istanza di quella servlet caricata. Se non c'è, la crea e la memorizza, altrimenti ripesca l'istanza esistente e ne invoca il metodo service().
E' facile capire, quindi, come funziona il giochetto.
Ciao.