[ Pobierz całość w formacie PDF ]
.WysiÅ‚ek zwiÄ…zany z samodzielnym wykonaniem tego dziaÅ‚ania nie jest duży, jako że interfejs Remote wÅ‚aÅ›ciwie nie definiuje żadnych metod.Obiekt deklaruje, że implementuje interfejs Remote, aby być traktowany jako obiekt zdalny.Drugim dziaÅ‚aniem, jakie musi wykonać RemoteHttpServlet jest rÄ™czne wyeksportowanie siebie.Zazwyczaj jest to wykonywane automatycznie przez konstruktora UnicastRemoteObject().Wykonanie tego bez konstruktora nie jest jednak problemem.Klasa UnicastRemoteObject posiada statycznÄ… metodÄ™ exportObject(Remote), którÄ… każdy obiekt Remote może wykorzystać w celu wyeksportowania siebie.RemoteHttpServlet wykorzystuje tÄ™ metodÄ™ i eksportuje siebie przy pomocy poniższej pojedynczej linii:UnicastRemoteObject.exportObject(this);Powyższe dwa kroki, implementacja Remote i eksportowanie siebie sÄ… wykonywane przez RemoteHttpServlet, ponieważ nie jest ona rozszerzeniem UnicastRemoteObject.PozostaÅ‚a część kodu RemoteHttpServlet wykonuje rejestrowanie i wyrejestrowanie siebie w rejestrze RMI.Jak powiedziano wczeÅ›niej, serwer rejestrujÄ…cy RMI dziaÅ‚a jako miejsce, w którym klienty mogÄ… zlokalizować obiekty serwera.Zdalny obiekt (obiekt serwera) rejestruje siebie w rejestrze pod konkretnÄ… nazwÄ….Klienty mogÄ… wiÄ™c wyszukać ten obiekt wedÅ‚ug nazwy w rejestrze.W takim razie, aby być dostÄ™pny dla klientów, serwlet musi odnaleźć (lub stworzyć) serwer rejestrujÄ…cy i zarejestrować siÄ™ w tym serwerze pod konkretnÄ… nazwÄ….W jÄ™zyku specjalistycznym nosi to nazwÄ™ dowiÄ…zania do rejestru.RemoteHttpServlet wykonuje to dowiÄ…zanie przy pomocy swojej metody bind(), wywoÅ‚ywanej wewnÄ…trz metody init().Metoda bind() wykorzystuje dwie metody wspierajÄ…ce, getRegistryPort() i getRegistryName() w celu okreÅ›lenia portu, na którym powinien dziaÅ‚ać serwlet i nazwy, pod którÄ… powinien on zostać zarejestrowany.W przypadku przykÅ‚adowej implementacji, port jest okreÅ›lany przy pomocy parametru inicjacji registryPort, lub posiada domyÅ›lnÄ… wartość 1099.Nazwa jest pobierana z parametru inicjacji registryName lub posiada domyÅ›lnÄ… nazwÄ™ klasy serwletu — w tym przypadku SerwletGodziny.Poniżej opisana jest dokÅ‚adniej metoda bind().Rozpoczyna ona dziaÅ‚anie przez wykorzystanie nastÄ™pujÄ…cego kodu, próbujÄ…c odnaleźć wÅ‚aÅ›ciwy dziaÅ‚ajÄ…cy już rejestr.registry = LocateRegistry.getRegistry(getRegistryPort());registry.list();Pierwsza linia próbuje odnaleźć rejestr pracujÄ…cy na danym porcie.Druga prosi rejestr o listÄ™ jego obecnie zarejestrowanych obiektów.Jeżeli oba wywoÅ‚ania zakoÅ„czÄ… siÄ™ sukcesem, wynikiem bÄ™dzie prawidÅ‚owy rejestr.Jeżeli dowolne wywoÅ‚anie spowoduje wyjÄ…tek Exception, metoda bind() dowiaduje siÄ™, że nie istnieje prawidÅ‚owy rejestr i samodzielnie go tworzy.Wykonuje to dziaÅ‚anie przy pomocy nastÄ™pujÄ…cej linii kodu:registry = LocateRegistry.createRegistry(getRegistryPort());Po wykonaniu tych dziaÅ‚aÅ„ metoda bind() powinna znaleźć lub utworzyć serwer rejestrujÄ…cy.Jeżeli pobranie rejestru nie powiodÅ‚o siÄ™, a nie powiodÅ‚o siÄ™ też jego tworzenie, powraca ona i serwlet pozostaje niezarejestrowany.NastÄ™pnie RemoteHttpServlet dowiÄ…zuje siÄ™ do rejestru przy pomocy poniższej linii kodu:registry.rebind(getRegistryName(), this);Wykorzystuje ona metodÄ™ Registry.rebind() zamiast metody Registry.bind() aby wskazać, że to dowiÄ…zanie powinno zastÄ…pić wszystkie poprzednie dowiÄ…zania wykorzystujÄ…ce tÄ™ nazwÄ™.DowiÄ…zanie to trwa dopóki serwlet nie zostaje zniszczony, w którym to miejscu metoda destroy() RemoteHttpServlet wywoÅ‚uje jego metodÄ™ unbind().Kod wykorzystywany przez unbind() w celu zniszczenia dowiÄ…zania do rejestru jest niezwykle prosty:if (registry != null) registry.unbind(getRegistryName());Po prostu prosi ona rejestr o zniszczenie dowiÄ…zania do swojej nazwy.Wskazówka!!!!W którym miejscu uruchomić rejestr?Szeroko akceptowanym sposobem uruchamiania serwera rejestrujÄ…cego RMI jest samodzielny program Javy rmiregistry.Polecane jest jednak opuszczenie rmiregistry i pozwolenie RemoteHttpServlet na samodzielne utworzenie rejestru.Jest to Å‚atwiejsze i bardziej wydajne.Pierwszy serwlet korzystajÄ…cy z rejestru może go utworzyć.Z powodu uruchamiania rejestru wewnÄ…trz serwletu, rejestr pracuje przy pomocy tej samej JVM, co serwlet.Pozwala to na wykorzystanie tylko jednej wirtualnej maszyny Javy dla serwera, wszystkich jego serwletów (obiektów zdalnych) i rejestru.Niektóre serwery aplikacji na starcie uruchamiajÄ… rejestr wewnÄ…trz wÅ‚asnej JVM.Możliwe jest również caÅ‚kowite ominiÄ™cie uruchomienia rejestru, przy pomocy serwletów.Klient może poÅ‚Ä…czyć siÄ™ ze specjalnym serwletem przy pomocy HTTP i zażądać danego obiektu zdalnego (przy pomocy parametru), a serwlet może zwrócić mu dane odpowiedzi jako zserializowanÄ… koÅ„cówkÄ™ obiektu zdalnego — podobnie jak zwraca te dane rejestr.Zastosowanie serwletu zamiast rmiregistry pozwala serwletowi na zaimplementowanie polityki bezpieczeÅ„stwa ograniczajÄ…cej prawa przeglÄ…dania obiektów, pozwala serwletowi na nadanie każdemu klientowi odwoÅ‚ania do różnych obiektów zdalnych oraz (ponieważ serwlet może tworzyć zdalny obiekt w ramach obsÅ‚ugi żądaÅ„) powoduje, że obiekt zdalny jest dostÄ™pny nawet przed jego utworzeniem
[ Pobierz całość w formacie PDF ]