Front Controller

Cel

Centralizacja zarządzania widokami (elementami warstwy view) aplikacji webowej w pojedynczym obiekcie przyjmującym żądania klientów.

Motywacja

Wiele interakcyjnych aplikacji internetowych ma strukturę zbioru osobnych stron powiązanych nawzajem ze sobą. Takie aplikacje są trudne do utrzymania i modyfikacji:

Powyższe problemy mogą być rozwiązane poprzez skierowanie wszystkich żądań klientów do jednego obiektu, zwanego front controller. Funkcje takie jak wybór widoku, autoryzacja, itp mogą być scentralizowane w obrębie kontrolera, który przekazuje żądania do odpowiednich elementów systemu. Dzięki temu, jeśli potrzebna jest zmiana zachowania określonych funkcji, tylko mała część aplikacji musi być modyfikowana: front controller.

Zastosowanie

Wzorzec Front Controller powinien być stosowany dla:

Struktura

Diagram

Konsekwencje

Wzorzec projektowy Front Controller ma następujące zalety:

Wzorzec ma również pewne konsekwencje, które mogą być zarówno pozytywne jak i negatywne:

Implementacja

Front controller zazwyczaj jest implementowany jako servlet, a nie jako strona JSP, ponieważ służy do kontroli obiegu sterowania. Nie należy natomiast do warstwy widoku.

W celu skierowania wszystkich żądań klientów do kontrolera, należy przydzielić obiekt kontrolera do obsługi wszystkich URLi danej aplikacji. Służy do tego element servlet-mapping w konfiguracji XMLowej serwera. Oto przykład:

<web-app>
  <!-- ... -->

  <servlet>
    <servlet-name>webTierEntryPoint</servlet-name>
    <!-- ... -->

    <servlet-class><!-- MainServlet --></servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>webTierEntryPoint</servlet-name>
    <url-pattern>/control/*</url-pattern>
  </servlet-mapping>
  <!-- ... -->

</web-app>

Następnie należy dodać logikę do kontrolera, przetwarzającą nadchodzące żądania, stosującą odpowiednie transformacje zgodne z polityką serwera, wywołującą niezbędne funkcje aplikacji i zwracającą odpowiedni widok jako odpowiedź.

Następujące kwestie powinny być rozważone przy stosowaniu wzorca Front Controller: