Czytanie książki, która mówi, że serwlet jest singleton od strony kontenera. Czy to prawda?Czy serwlet to singleton?
Jednak nawet to jest pojedyncza, musimy obsłużyć synchronizacji danych itp
Czytanie książki, która mówi, że serwlet jest singleton od strony kontenera. Czy to prawda?Czy serwlet to singleton?
Jednak nawet to jest pojedyncza, musimy obsłużyć synchronizacji danych itp
Nie. Można utworzyć instancję tej samej klasy serwletów wiele razy pod różnymi nazwami serwletów i adresami URL w tym samym kontenerze internetowym i rzeczywiście w tej samej aplikacji internetowej.
Jeśli mam tylko jedną regułę mapowania dla MyServlet w web.xml i nie używam adnotacji @WebServlet, czy mogę mieć pewność, że zawsze będzie tylko jedno wystąpienie MyServlet w kontenerze? –
@ JimJim2000 Nie, chyba że unikniesz też 'SingleThreadModel': zobacz drugą odpowiedź. – EJP
Patrząc na definicję wzoru Singleton, jak określono w Cunningham & Cunningham, Inc. Wiki
Zapewnienie klasa ma tylko jedną instancję, a zapewnić globalny punkt dostępu do niego.
Powiedziałbym, że nie. Z perspektywy kontenera jeden obiekt serwletu jest akceptowany i zarządzany, łącznie z tworzeniem ServletContext, ale nie wyklucza, że nie ma więcej niż jednego wystąpienia serwletu.
Jeśli chodzi o takie kwestie, uważam, że najlepiej jest spojrzeć na odpowiednią umowę, co ma miejsce w przypadku serwletów zdefiniowanych w Java Servlet Specification. Zaadresowały liczbę wystąpień serwletu.
2,2 Ilość wystąpień
Deklaracja aplet, który jest albo za pośrednictwem adnotacji jako opisanego w Rozdziale 8, „Adnotacje i Plugging” lub część deskryptora rozmieszczania aplikacji sieci Web zawierającej servlet, , jak opisano w rozdziale 14, "Deskryptor wdrażania", kontroluje, w jaki sposób kontener serwletu udostępnia instancje serwletu. Dla serwletu, który nie jest hostowany w środowisku rozproszonym (ustawienie domyślne), kontener serwletu musi używać tylko jednej instancji na deklarację serwletu. Jednak w przypadku serwletu implementującego interfejs SingleThreadModel , kontener serwletu może tworzyć instancje wielu instancji, aby obsłużyć duże żądanie żądania i szeregować żądania do określonej instancji.
W przypadku gdy aplet został wdrożony jako część aplikacji oznaczonego w deskryptorze wdrażania jako dystrybuowana, pojemnik może mieć tylko jedną instancję za deklaracji apletu Java Virtual za maszynę (JVM ™). Jednakże, jeżeli serwlet w dystrybuowalnej aplikacji implementuje interfejs SingleThreadModel, pojemnik może tworzyć instancje wielu wystąpień tego serwletu w każdej maszynie JVM kontenera .
Określa jedynie, że pojemnik musi używać tylko jednej instancji (w pierwszym przypadku) i jako EJP wskazał w komentarzu:
Nie ma nic w specyfikacji Servlet to uniemożliwia ponowną instancję tej samej klasy serwletu pod inną nazwą w tej samej aplikacji internetowej. Ergo, nie singleton.
odniesieniaJava Servlet Specification 3.0 MR (s.6-7)
Dobrze zbadane, ale niepoprawne. W specyfikacji serwletu nie ma nic, co uniemożliwiłoby ponowne utworzenie instancji tej samej klasy serwletu pod inną nazwą w tej samej aplikacji internetowej. Ergo, nie singleton. – EJP
@EJP Zgadzam się z tobą. Przyjrzenie się definicji singleton nie jest zapewnione. –
Nie, serwlet nie jest singletonem. Może utworzyć drugi obiekt, w zależności od przychodzącego żądania i zachowania kontenera.
To nie dodaje nic do już opublikowanych odpowiedzi sprzed prawie 2 lat. –
możliwy duplikat [Jak działają serwlety? Tworzenie, zmienne sesji i wielowątkowość] (http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading) – BalusC
Serlet nie jest singletonem, ale powinieneś leczyć jako singleton: synchronizuj lub unikaj atrybutów poziomu instancji. Zobacz również [this] (http://stackoverflow.com/questions/6888268/httpservlet-does-not-implement-runnable-or-extend-thread-why-is-it-threadable/6888301#6888301). – home