2009-12-28 11 views
7

Chcę powiązać obiekt JPA EntityManager z bieżącym wątkiem na każdym żądaniu (za pośrednictwem ThreadLocal), co można zrobić za pomocą ServletRequestListener lub Filter. Słuchacz wygląda na czystszy i nie potrzebuję w tym przypadku dodatkowych możliwości filtra. Ale może filtr ma przewagę, którą przegapiłem.Filtr serwletu vs. ServletRequestListener

Czy powinienem użyć tego filtru serwletów lub ServletRequestListener?

+1

Czy są dostępne gwarancje dotyczące gwarancji ServletRequestListener? Jesteś pewien, że jest on wywoływany synchronicznie, w tym samym wątku, co obsługa żądań? –

+0

Specyfikacja Servlet 3.0 mówi: "11.5 Wystąpienie i wątek Listenera [...] Kontener musi utrzymywać odwołanie do każdej instancji detektora, dopóki ostatnie żądanie nie zostanie obsłużone dla aplikacji WWW Atrybut zmiany w obiektach ServletContext i HttpSession mogą być ccur . Kontener nie jest wymagany do zsynchronizowania otrzymanych powiadomień z klasami nasłuchującymi atrybut .. Klasy nasłuchujące, które utrzymują stan, są odpowiedzialne za integralność danych i powinny obsługiwać ten przypadek jawnie. " Ale to nie jest odpowiedź na twoje pytanie ... Myślę, że * byłaby w tej samej nitce. – deamon

Odpowiedz

7

Dla twojego celu nie ma dużej różnicy. Ale słuchacz jest "czystszy" w tym sensie, że ktoś czytający twój kod natychmiast zorientuje się, że celem tego kodu nie może być przechwycenie prośby lub jej zmiana albo czynienie innych rzeczy, które może wykonać filtr.

Wiosna, na przykład, korzysta z ServletRequestListener, aby umożliwić aplikacjom internetowym Spring, które nie używają własnej sieci WWW MVC, aby uzyskać dostęp do funkcji specyficznych dla sieci, takich jak komponenty bean o zasięgu sesji. Zobacz this doc.

Edycja: po prostu być bardziej jasne, Wspominam RequestContextListener Wiosny, ponieważ robi dokładnie co mówisz: tworzenie ThreadLocal obiektu do przechowywania danych, które mogą być dostępne w całej pozostałej części żądanie cyklu.

+0

Czy możesz to wyjaśnić? 'ServletRequestListener' nasłuchuje' ServletRequestEvent', który jest zdarzeniem wyzwalanym dla każdego przychodzącego żądania. Jeśli chcę zalogować użytkownika użytkownika do każdego żądania do mojej aplikacji internetowej, czy powinienem użyć tego programu nasłuchującego lub filtra? – arun

+0

Albo jest prawdopodobnie w porządku. – Dan

Powiązane problemy