Front vezérlő tervezési minta
A front vezérlő programtervezési minta több minta-katalógusban is szerepel, és a WEB alkalmazások tervezéséhez, felépítéséhez kapcsolódik. A minta „egy központosított belépési pontot biztosít a kérések kezeléséhez“

A front vezérlők gyakran használatosak WEB alkalmazásokban, a működés folyamatainak implementálására. Bár nem feltétlenül szükséges, de sokkal könnyebb kontrollálni a navigációt (az oldalváltások sorát) az egymással összefüggésben lévő oldalak között (például egy online vásárláshoz használt lapok/„lépések“ között) egy front vezérlőből, mint megoldani, hogy az oldalak külön-külön feleljenek a navigációért.
 
A front vezérlő implementálható egy Java osztályként, vagy egy szkriptben egy szkriptnyelven, mint például a PHP, Python vagy a Ruby, amelyben egy webes munkamenet minden egyes kérésénél meghívnak egy szkriptet. Ez a szkript, például egy index.php, kezeli majd az alkalmazás vagy a keretrendszer minden általános feladatát, mint például a munkamenet (session) kezelés, a gyorsítótárazás (cache) vagy a bejövő adatok szűrése. A konkrét kérés alapján, a front vezérlő további objektumokat hoz létre, és eljárásokat hív meg, hogy a ténylegesen megkívánt feladat/feladatok el legyenek végezve.

A front vezérlő alternatívája egyedi szkriptek sora lenne, mint a bejelentkezes.php, megrendeles.php stb., minden egyes kérés típushoz külön-külön. Ezeknek a szkripteknek duplikált kódrészletei vagy objektumai lennének, a minden kérésnél előforduló rész-feladatok elvégzésére. Mindazonáltal az egyes szkriptek nagyobb rugalmassággal rendelkezhetnének az egyes konkrét feladatok elvégzésére.

Kapcsolat az MNV (MVC) szerkezettel 
A front vezérlő szinte minden modell-nézet-vezérlő (MNV, angolul MVC) szerkezeti mintát megvalósító rendszerben implementálva van. A vezérlő az MNV-minta egyik leginkább általánosítható része, mivel a vezérlőkben jellemzőek az olyan tipikus műveletsorok, amelyeket közösek. A vezérlőnek egy „éles“ alkalmazásban elég sok mindent kell csinálnia, mielőtt a rá vonatkozó konkrét művelet végrehajtásába kezd: pl.: a HTTP adatok előfeldolgozása, biztonsági ellenőrzések, alkalmazásszintű beállítások elvégzése, munkamenet indítása, konfigurációs állományok betöltése, és még sorolhatnánk.

Ezek általában mindegyik vezérlőre nézve közös feladatok, így felesleges lenne ezt minden vezérlő „elején“ megismételni. Emiatt, a közös dolgokat általában külön választják, kiemelik, és a konkrét műveletet elvégző vezérlők „elé“ teszik. Az egyes vezérlők előtti közös műveletek elvégzéséért, és a tényleges feladatot ellátó vezérlő ezek után történő meghívásáért felelős részt, front vezérlőként valósítják meg.

A front vezérlő másik előnye egy MNV rendszerben, hogy biztosítja az alkalmazás egyetlen belépési pontját. Nélküle minden vezérlő külön-külön meghívható lenne, ami nagyfokú „kuszaságot“ vonna maga után, és biztonsági aggályokat vetne fel. A front vezérlő segítségével (mivel mindegyik vezérlő csak rajta keresztül hívható), lehetőség van a megfelelő biztonsági ellenőrzéseket és beállításokat elvégezni. 

Joggal merül fel a kérdés, hogy ha minden vezérlő a front vezérlőn keresztül érhető el, akkor honnan tudja az alkalmazás, melyik vezérlőt kell meghívnia? A meghívandó vezérlőt tipikusan egy GET paraméterrel (URL-ben megadva) szokás átadni, a belépési pontot reprezentáló szkriptnek (pl. index.php?action=megrendeles). A front vezérlőnek azt a részét, amely a megfelelő „igazi“ vezérlő meghívásáról gondoskodik, ki szokták emelni, és alkalmazásvezérlőnek hívják (Application Controller). Az alkalmazásvezérlő hívása általában a front vezérlő utolsó lépéseként jelenik meg.

Összehasonlítás
Az MVC modellben a lap vezérlő a front vezérlő alternatívája.

Szerkezete
A front vezérlő három komponenst definiál:
XML leképezés: ezek a fájlok a kérést elküldik annak az osztálynak, ami feldolgozza.
Kérés processzor: a kérések feldolgozását végzi.
Folyam intéző: megkapva a bejövő kérést és az eredményt elkészíti a következő lapot.

Példák 
Sokféle webes alkalmazás keretrendszer implementálja a front vezérlő mintát, többek között:
 a PHP-ben készült MVC keretrendszerek, például Yii, CakePHP, Laravel, Symfony, CodeIgniter, Zend Framework és a Drupal
 az ASP.NET MVC alkalmazás keretrendszer
 az Adobe Flex-ben készült Cairngorm keretrendszer
 a Haskell-ben készült Yesod web alkalmazás keretrendszer
 a Java EE web alkalmazások fejlesztéséhez az Apache Struts vagy a Spring Framework

Példa kód
A vezérlő példa kódja Javában:private void doProcess(HttpServletRequest request,
                       HttpServletResponse response)
   throws IOException, ServletException {
    ...
   try {
      getRequestProcessor().processRequest(request);

        getScreenFlowManager().forwardToNextScreen(request, response);
    } catch (Throwable ex) {
      String className = ex.getClass().getName();
      nextScreen = getScreenFlowManager().getExceptionScreen(ex);
      // put the exception in the request
      request.setAttribute("javax.servlet.jsp.jspException", ex);
      if (nextScreen == null) {
         // send to general error screen
         ex.printStackTrace();
         throw new ServletException("MainServlet: unknown exception: " +
            className);
      }
   }

Értékelés
A front vezérlőnek három előnye van:
Központi vezérlés: A front vezérlő kezeli a webalkalmazás összes kérését. Ez előnyös a teljes alkalmazásra kiterjedő házirendek számára.
Szálbiztosság: Minden új kérés egy új parancs objektum létrejöttét eredményezi. A parancs objektumok tervmintája nem tartalmazza a szálbiztosságot, így a parancs osztálynak kell szálbiztosnak lenni. Ha ilyeneket használ az alkalmazás, akkor szálbiztos lesz.
Konfigurálhatóság: Mivel a webalkalmazásban egy front vezérlő van, a webalkalmazás kofigurációja egyszerűsödik. Ha új parancsokat és hozzájuk tartozó objektumokat adnak hozzá, akkor az eddigiek közül csak a front vezérlőt kell megváltoztatni.

Ezzel szemben a sebesség lelassulhat, ha a vezérlő mögött XML vagy adatbázis áll. A már létező rendszerek refaktorálása komplett cserét jelent, ami megnehezíti a betanulást.

Kapcsolat a modell-nézet-vezérlő mintával
A rendszer megbízhatóságát és karbantarthatóságát segíti, ha a közös kódrészeket inkább egy helyen tartjuk és egy központi helyre emeljük ki.

Az alkalmazás adatainak kezelésének központosítása miatt nem kell másolgatni az adatbázissal foglalkozó kódokat.

Az MVC minta komponenseit jól el lehet különíteni, ami előnyös a tesztelés szempontjából. Ez igaz a front vezérlőre is.

Lásd még 
 Programtervezési minta
 Közvetítő programtervezési minta *Megjegyzés: a front vezérlő mintára, egy specializált közvetítő mintaként is tekinthetünk.

Jegyzetek

Hivatkozások

Külső hivatkozások
 Bear Bibeault's Front Man™, A lightweight Java implementation.

Fordítás 

Programtervezési minták
A front vezérlő programtervezési minta több minta-katalógusban is szerepel , és a WEB alkalmazások tervezéséhez , felépítéséhez kapcsolódik . A minta „ egy központosított belépési pontot biztosít a kérések kezeléséhez“ A front vezérlők gyakran használatosak WEB alkalmazásokban , a működés folyamatainak implementálására . Bár nem feltétlenül szükséges , de sokkal könnyebb kontrollálni a navigációt ( az oldalváltások sorát ) az egymással összefüggésben lévő oldalak között ( például egy online vásárláshoz használt lapok/„ lépések“ között ) egy front vezérlőből , mint megoldani , hogy az oldalak külön-külön feleljenek a navigációért . A front vezérlő implementálható egy Java osztályként , vagy egy szkriptben egy szkriptnyelven , mint például a PHP , Python vagy a Ruby , amelyben egy webes munkamenet minden egyes kérésénél meghívnak egy szkriptet . Ez a szkript , például egy index.php , kezeli majd az alkalmazás vagy a keretrendszer minden általános feladatát , mint például a munkamenet ( session ) kezelés , a gyorsítótárazás ( cache ) vagy a bejövő adatok szűrése . A konkrét kérés alapján , a front vezérlő további objektumokat hoz létre , és eljárásokat hív meg , hogy a ténylegesen megkívánt feladat/ feladatok el legyenek végezve . A front vezérlő alternatívája egyedi szkriptek sora lenne , mint a bejelentkezes.php , megrendeles.php stb . , minden egyes kérés típushoz külön-külön . Ezeknek a szkripteknek duplikált kódrészletei vagy objektumai lennének , a minden kérésnél előforduló rész-feladatok elvégzésére . Mindazonáltal az egyes szkriptek nagyobb rugalmassággal rendelkezhetnének az egyes konkrét feladatok elvégzésére . Kapcsolat az MNV ( MVC ) szerkezettel A front vezérlő szinte minden modell-nézet-vezérlő ( MNV , angolul MVC ) szerkezeti mintát megvalósító rendszerben implementálva van . A vezérlő az MNV-minta egyik leginkább általánosítható része , mivel a vezérlőkben jellemzőek az olyan tipikus műveletsorok , amelyeket közösek . A vezérlőnek egy „ éles“ alkalmazásban elég sok mindent kell csinálnia , mielőtt a rá vonatkozó konkrét művelet végrehajtásába kezd : pl . : a HTTP adatok előfeldolgozása , biztonsági ellenőrzések , alkalmazásszintű beállítások elvégzése , munkamenet indítása , konfigurációs állományok betöltése , és még sorolhatnánk . Ezek általában mindegyik vezérlőre nézve közös feladatok , így felesleges lenne ezt minden vezérlő „ elején“ megismételni . Emiatt , a közös dolgokat általában külön választják , kiemelik , és a konkrét műveletet elvégző vezérlők „ elé“ teszik . Az egyes vezérlők előtti közös műveletek elvégzéséért , és a tényleges feladatot ellátó vezérlő ezek után történő meghívásáért felelős részt , front vezérlőként valósítják meg . A front vezérlő másik előnye egy MNV rendszerben , hogy biztosítja az alkalmazás egyetlen belépési pontját . Nélküle minden vezérlő külön-külön meghívható lenne , ami nagyfokú „ kuszaságot“ vonna maga után , és biztonsági aggályokat vetne fel . A front vezérlő segítségével ( mivel mindegyik vezérlő csak rajta keresztül hívható ) , lehetőség van a megfelelő biztonsági ellenőrzéseket és beállításokat elvégezni . Joggal merül fel a kérdés , hogy ha minden vezérlő a front vezérlőn keresztül érhető el , akkor honnan tudja az alkalmazás , melyik vezérlőt kell meghívnia ? A meghívandó vezérlőt tipikusan egy GET paraméterrel ( URL-ben megadva ) szokás átadni , a belépési pontot reprezentáló szkriptnek ( pl. index.php ? action=megrendeles ) . A front vezérlőnek azt a részét , amely a megfelelő „ igazi“ vezérlő meghívásáról gondoskodik , ki szokták emelni , és alkalmazásvezérlőnek hívják ( Application Controller ) . Az alkalmazásvezérlő hívása általában a front vezérlő utolsó lépéseként jelenik meg . Összehasonlítás Az MVC modellben a lap vezérlő a front vezérlő alternatívája . Szerkezete A front vezérlő három komponenst definiál : XML leképezés : ezek a fájlok a kérést elküldik annak az osztálynak , ami feldolgozza . Kérés processzor : a kérések feldolgozását végzi . Folyam intéző : megkapva a bejövő kérést és az eredményt elkészíti a következő lapot . Példák Sokféle webes alkalmazás keretrendszer implementálja a front vezérlő mintát , többek között : a PHP-ben készült MVC keretrendszerek , például Yii , CakePHP , Laravel , Symfony , CodeIgniter , Zend Framework és a Drupal az ASP.NET MVC alkalmazás keretrendszer az Adobe Flex-ben készült Cairngorm keretrendszer a Haskell-ben készült Yesod web alkalmazás keretrendszer a Java EE web alkalmazások fejlesztéséhez az Apache Struts vagy a Spring Framework Példa kód A vezérlő példa kódja Javában : private void doProcess( HttpServletRequest request , HttpServletResponse response ) throws IOException , ServletException { \... try { getRequestProcessor ( ) . processRequest ( request ) ; getScreenFlowManager ( ) . forwardToNextScreen ( request , response ) ; } catch ( Throwable ex ) { String className = ex.getClass ( ) .getName ( ) ; nextScreen = getScreenFlowManager ( ) .getExceptionScreen( ex ) ; / / put the exception in the request request.setAttribute ( " javax.servlet.jsp.jspException " , ex ) ; if ( nextScreen == null ) { / / send to general error screen ex.printStackTrace ( ) ; throw new ServletException ( " MainServlet : unknown exception : " + className ) ; } } Értékelés A front vezérlőnek három előnye van : Központi vezérlés : A front vezérlő kezeli a webalkalmazás összes kérését . Ez előnyös a teljes alkalmazásra kiterjedő házirendek számára . Szálbiztosság : Minden új kérés egy új parancs objektum létrejöttét eredményezi . A parancs objektumok tervmintája nem tartalmazza a szálbiztosságot , így a parancs osztálynak kell szálbiztosnak lenni . Ha ilyeneket használ az alkalmazás , akkor szálbiztos lesz . Konfigurálhatóság : Mivel a webalkalmazásban egy front vezérlő van , a webalkalmazás kofigurációja egyszerűsödik . Ha új parancsokat és hozzájuk tartozó objektumokat adnak hozzá , akkor az eddigiek közül csak a front vezérlőt kell megváltoztatni . Ezzel szemben a sebesség lelassulhat , ha a vezérlő mögött XML vagy adatbázis áll . A már létező rendszerek refaktorálása komplett cserét jelent , ami megnehezíti a betanulást . Kapcsolat a modell-nézet-vezérlő mintával A rendszer megbízhatóságát és karbantarthatóságát segíti , ha a közös kódrészeket inkább egy helyen tartjuk és egy központi helyre emeljük ki . Az alkalmazás adatainak kezelésének központosítása miatt nem kell másolgatni az adatbázissal foglalkozó kódokat . Az MVC minta komponenseit jól el lehet különíteni , ami előnyös a tesztelés szempontjából . Ez igaz a front vezérlőre is . Lásd még Programtervezési minta Közvetítő programtervezési minta * Megjegyzés : a front vezérlő mintára , egy specializált közvetítő mintaként is tekinthetünk . Jegyzetek Hivatkozások Külső hivatkozások Bear Bibeault's Front Man™ , A lightweight Java implementation . Fordítás Programtervezési minták