2009-12-28 14 views
7

Voglio associare un EntityManager JPA al thread corrente su ogni richiesta (tramite ThreadLocal), cosa potrebbe essere fatto tramite un ServletRequestListener o Filter. L'ascoltatore sembra più pulito e in questo caso non ho bisogno delle possibilità aggiuntive di un filtro. Ma forse il filtro ha un vantaggio che ho perso.Servlet Filter vs. ServletRequestListener

Devo utilizzare un filtro servlet o un ServletRequestListener per farlo?

+1

Esistono garanzie di thread eseguite su ServletRequestListener? Sei sicuro che sia invocato in modo sincrono, sullo stesso thread della gestione delle richieste? –

+0

La specifica Servlet 3.0 dice: "11.5 Istanze di listener e threading [...] Il contenitore deve mantenere un riferimento a ciascuna istanza del listener fino a quando l'ultima richiesta non viene servita per l'applicazione Web. Le modifiche di attributo a ServletContext e HttpSession possono causare errori . Il contenitore non è necessario per sincronizzare le notifiche risultanti con le classi di listener degli attributi.Le classi di listener che mantengono lo stato sono responsabili dell'integrità dei dati e dovrebbero gestire questo caso in modo esplicito. " Ma questa non è la risposta alla tua domanda ... io * penso * sarebbe nella stessa discussione. – deamon

risposta

7

Per il tuo scopo non c'è molta differenza. Ma un ascoltatore è "più pulito" nel senso che qualcuno che legge il tuo codice saprà immediatamente che lo scopo di questo codice non può essere quello di intercettare la richiesta o alterarla o fare altre cose che un filtro può fare.

Spring, ad esempio, utilizza un ServletRequestListener per consentire alle app basate sul Web di Spring che non utilizzano il framework MVC Web di Spring di ottenere comunque l'accesso a funzionalità specifiche del Web come bean con scope di sessione. Vedi this doc.

Edit: tanto per essere più chiaro, cito RequestContextListener di primavera perché fa esattamente cosa si sta parlando: creare un oggetto ThreadLocal per memorizzare dati che può essere raggiunto in tutto il resto della richiesta del ciclo di vita.

+0

Puoi chiarire questo per me? 'ServletRequestListener' ascolta' ServletRequestEvent', che è un evento attivato per ogni richiesta in arrivo. Se voglio registrare l'user-agent per ogni richiesta sulla mia web app, dovrei usare questo listener o un filtro? – arun

+0

O probabilmente è ok. – Dan