środa, 7 września 2011

JAVA EE6 Programowanie aplikacji WWW KURS cz. 7 Serwlety: kontener, kontekst i filtry

      Kontekst serwletów jest obiektem służącym do komunikacji serwletów z kontenerem.
Głównym zadaniem kontenera jest obsługa komunikacji między serwletami, a serwerem. Zarządza on cyklem życia serwletów, tworzy nowy wątek obsługujący żądanie. Kontener, także zajmuje się obsługą JSP, strony JSP tak naprawdę są serwletami.



      Kontener obsługując konkretne żądanie, które skierowane jest do serwletu po przez adres URL, tworzy dwa obiekty: HttpServletResponse i HttpServletRequest. W następnym kroku tworzy lub przydziela pamięć dla wątku, który obsługuje to żądanie. Obiekty reprezentujące żądanie i odpowiedź są przekazane do nowego wątku serwletu. Od tej pory mamy już gotowy serwlet. Następuje wywołanie metody service() serwletu. Metoda ta wywołuje metodę doGet() lub do Post(), w zależności naszego żądania. Jeśli nasze żądanie było typu GET to następuje jak się domyślasz wywołanie metody doGet().

     Dzięki kontekstowi serwletów możemy dynamicznie dodawać serwlety do aplikacji, a co najważniejsze korzystać z parametrów aplikacji webowej czyli kontekstu. Wcześniej pisałem o parametrach serwletów. Są one widoczne w ramach danego serwletu. Parametry konteksu są widoczne dla wszystkich serwletów w naszej aplikacji. Określamy je w bardzo podobny sposób co parametry serwletów:



Aby skorzystać z parametrów kontekstu musimy skorzystać z metody: getInitParameter(String name)




      Przejdźmy do filtrów. Filtry są mechanizmem umożliwiającym nam wykonanie operacji w momencie nadejścia żądania. Dzięki nim możemy np. odrzucić dane żądanie, które nie spełnia jakiś określonych parametrów. Filtry możemy podłączać do dowolnej grupy serwletów za pomocą znacznika url-pattern. Analogicznie do serwletów są deklarowane w deskryptorze wdrożenia. Kontener na podstawie znacznika url-pattern decyduje kiedy zostanie wywołany dany filtr. Kiedy ma być obsłużone żądanie, najpierw kontener przeszuka pasujące do adresu URL filtry i wywoła je, w takiej kolejności w jakiej są zadeklarowane w deskryptorze. Możemy mówić wtedy o sekwencji wywołań.


       Z technicznego punktu widzenia filtr jest klasą, która implementuje interfejs javax.servlet.Filter. Udostępnia on nam metody:

  • void init(FilterConfig fc) - metoda wywoływana jest przy utworzeniu filtru. Pozwala na uzyskanie obiektu interfejsu FilterConfig odpowiedzialnego za ustawienia filtru.
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - jest wywoływana w momencie nadejścia żądania. Interfejs FilterChain zapewnia komunikację pomiędzy filtrem, a servletem. 
  • void destroy() - metoda wywoływana przez serwer w momencie zakończenia działania filtru.


      W zależności od kolejności deklaracji filtrów w deskryptorze - web.xml, nasze żądanie HTTP przechodzi przez kolejne filtry dzięki metodzie doFilter(), w każdym filtrze. Po przejściu wszystkich filtrów, żądanie trafia do serwletu. Po zakończeniu obsługi żądania przez serwlet, sterowanie powraca do kolejnych filtrów.


       Stworzymy teraz bardzo prosty filtr. Zadaniem filtra będzie mierzenie czasu wykonania żądania.
Wspomnieliśmy wcześniej, że filtr to klasa implementująca interfejs Filter. Nasze żądanie zanim trafi do servletu, najpierw trafia do naszego filtru. Kiedy zostaje wykonywana metoda doFilter() zmiennej startTime przypisywany jest aktualny czas, następnie zostaje znowu wykonana metoda doFilter() z obiektu chain. Po jej wykonaniu nasze żądanie, przechodzi do właściwego  serwletu, gdzie po jego obsłużeniu znowu trafia do filtra, w miejsce po wywołaniu metody doFilter(), gdzie pobierany jest do zmiennej stopTime aktualny czas. Aby obliczyć czas wykonania żądania wystarczy te wartości od siebie odjąć.



      Tak jak w przypadku serwletów filtry konfigurujemy podobnie. Mamy dwie sekcje. Znacznik filter ,który wiąże klase filtru z abstrakcyjną nazwą i znacznik filter-mapping wiążacy nazwę z adresem URL.




Ciekawostką jest znacznik dispatcher . Pozwala on określić, czy filtr ma być stosowany w innych przypadkach niż w bezpośrednich żądaniach.


Reakcje:

0 komentarze:

Prześlij komentarz