Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854

    [JSP] Associazione valore - variabile

    Salve,
    sto iniziando a leggere da qualche giorni delle guide per JSP.

    Mi sono imbattuto in un esempio apparentemente semplice:
    codice:
    <H1>Dichiarazioni JSP</H1>
    <%! private int accessCount = 0; %>
    <H2>Questa pagina è stata visualizzata <%= ++accessCount %> volte</H2>
    Praticamente mostra il numero di volte in cui viene effettuato un refresh del browser.

    Effettivamente, il valore delle variabile accessCount dove viene memorizzato?
    Come funziona?

    Grazie!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JSP] Associazione valore - variabile

    Originariamente inviato da Felino
    Mi sono imbattuto in un esempio apparentemente semplice:
    Praticamente mostra il numero di volte in cui viene effettuato un refresh del browser.
    Aggiungo alcune questioni "fini": quel codice può anche funzionare ma non è corretto al 100% perché manca di sincronizzazione.

    La istanza di una Servlet è di norma appunto una sola ma più thread, anche contemporaneamente (a seconda delle richieste dai client), possono eseguire il service() su quella stessa istanza.
    L'operatore di pre/post-incremento ++ non è "atomico", è composto di 3 operazioni: leggi, incrementa, scrivi.
    Ne consegue che senza una apposita sincronizzazione, è possibile una race condition, ovvero due thread che contemporaneamente eseguono il ++accessCount, possono leggere entrambi lo stesso valore e incrementarlo, andando quindi a perdere un conteggio.

    Inoltre, senza i dovuti accorgimenti, non c'è nemmeno garanzia che un incremento fatto da un thread A venga "visto" da un thread B.

    Insomma, quel codice può funzionare ma è da prendere con le pinze e da usare proprio solo a livello didattico per capire le parti di una JSP ... e niente di più.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente bannato
    Registrato dal
    Nov 2007
    residenza
    Acicatena (Catania)
    Messaggi
    1,854
    Ottimo, grazie per la spiegazione e la vostra disponibilità!

    andbin il fatto che la variabile venga incrementata comunque anche quando visualizzo la pagina con due browser diversi...rientra nella tua spiegazione?

    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.