2015-01-13 42 views
7

Come accedere all'attuale ServletContext dall'app Vaadin 7?Come accedere a `ServletContext` dall'interno di un'app Vaadin 7?

voglio utilizzare l'oggetto del ServletContextsetAttribute, getAttribute, removeAttribute, e getAttributeNames metodi per gestire alcune stato globale per la mia Vaadin app.

Inoltre, se l'utilizzo di tali metodi a tale scopo non è appropriato per le app Vaadin, spiegare.

+0

Domanda relativa: [Hook per la mia app Web Vaadin che si avvia e si arresta?] (Http://stackoverflow.com/q/36588743/642706) –

risposta

20

tl; dr

VaadinServlet.getCurrent().getServletContext() 

VaadinServlet

La classe VaadinServlet eredita un metodo getServletContext.

Per ottenere l'oggetto VaadinServlet, chiamare il metodo di classe statica getCurrent.

Da più ovunque all'interno della vostra Vaadin applicazione, fare qualcosa di simile:

ServletContext servletContext = VaadinServlet.getCurrent().getServletContext(); 

CAVEAT
non funziona in thread in background. Nei thread avviati, questo comando restituisce NULL. Come documentato:

In altri casi, (ad esempio da thread in background avviati in un altro modo), il servlet corrente non viene definito automaticamente.

@WebListener (ServletContextListener)

Tra l'altro, si rischia di voler gestire tale stato globale quando le implementa web app (lanci) nel contenitore.

È possibile collegarsi alla distribuzione dell'app di Web Vaadin con l'annotazione @WebListener sulla classe che implementa l'interfaccia ServletContextListener. Entrambi i metodi di tale interfaccia, contextInitialized e contextDestroyed, sono passati a ServletContextEvent da cui è possibile accedere all'oggetto ServletContext chiamando getServletContext.

@WebListener ("Context listener for doing something or other.") 
public class MyContextListener implements ServletContextListener 
{ 

    // Vaadin app deploying/launching. 
    @Override 
    public void contextInitialized (ServletContextEvent contextEvent) 
    { 
     ServletContext context = contextEvent.getServletContext(); 
     context.setAttribute(…) ; 
     // … 
    } 

    // Vaadin app un-deploying/shutting down. 
    @Override 
    public void contextDestroyed (ServletContextEvent contextEvent) 
    { 
     ServletContext context = contextEvent.getServletContext(); 
     // … 
    } 

} 

Questo aggancio viene chiamato come parte del vostro Vaadin app in fase di inizializzazione, prima di eseguire la servlet Vaadin (o qualsiasi altro servlet/filtro nel web app). Per citare il documento nel metodo contextInitialized:

Riceve la notifica dell'avvio del processo di inizializzazione dell'applicazione Web. Tutti i ServletContextListeners ricevono notifica dell'inizializzazione del contesto prima che inizino a essere inizializzati tutti i filtri o servlet nell'applicazione Web.