2013-07-21 12 views
31

Sto leggendo attraverso la testa prima JSP e servlet. Passando attraverso diversi tipi di ascoltatori, mi sono imbattuto in HttpSessionBindingListener e HttpSessionAttributeListener.Utilizzo pratico di HttpSessionBindingListener e HttpSessionAttributeListener

Stavo pensando alla differenza tra i due: voglio vedere gli usi pratici degli esempi reali di quei due ascoltatori. Ho testato HttpSessionBindingListener implementando valueBound() e valueUnBound() - perché un oggetto dovrebbe sapere se è stato aggiunto o meno?

Sono abbastanza confuso circa gli usi pratici. Per favore aiutami a chiarire questo.

risposta

41

Il HttpSessionBindingListener deve essere implementato nella classe le cui istanze possono essere memorizzate nella sessione, ad esempio l'utente che ha effettuato l'accesso.

E.g.

public class ActiveUser implements HttpSessionBindingListener { 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     logins.add(this); 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     logins.remove(this); 
    } 

} 

Quando un'istanza di questo ActiveUser ottenere impostato come attributo sessione HttpSession#setAttribute(), poi il valueBound() verrà richiamato. Quando viene rimosso da HttpSession#removeAttribute() o annullato della sessione o sostituito da un altro HttpSession#setAttribute(), viene richiamato lo valueUnbound().

Ecco alcuni casi di utilizzo reali:

Il HttpSessionAttributeListener deve essere implementato come applicazione @WebListener che viene richiamato quando qualsiasi attributo viene aggiunto, rimosso o sostituito in HttpSession. Continuando con l'esempio precedente ActiveUser, questo è particolarmente utile se non è possibile modificare la classe ActiveUser per implementare HttpSessionBindingListener (perché è di terza parte o così), o quando si desidera utilizzare una "interfaccia marker" su una quantità arbitraria di classi in modo da poter svolgere il lavoro di ascolto in un unico posto centrale.

@WebListener 
public class ActiveUserListener implements HttpSessionAttributeListener { 

    @Override 
    public void attributeAdded(HttpSessionBindingEvent event) { 
     if (event.getValue() instanceof ActiveUser) { 
      logins.add(event.getValue()); 
     } 
    } 

    @Override 
    public void attributeRemoved(HttpSessionBindingEvent event) { 
     if (event.getValue() instanceof ActiveUser) { 
      logins.remove(event.getValue()); 
     } 
    } 

    @Override 
    public void attributeReplaced(HttpSessionBindingEvent event) { 
     if (event.getValue() instanceof ActiveUser) { 
      logins.add(event.getValue()); 
     } 
    } 

} 

Ecco un vero e proprio caso d'uso mondo:

+0

Grazie tanto @BalusC. Ho capito la differenza Grazie mille per la risposta dettagliata. – benz

+0

Questa è un'ottima risposta. @BalusC come riesci a ottenere tutte queste informazioni e le presenti in modo così carino. – Makky

+0

Prego. – BalusC