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“[1]
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.
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.
Az MVC modellben a lap vezérlő a front vezérlő alternatívája.
Lapvezérlő | Front vezérlő | |
---|---|---|
Bázis osztály | Bázis osztályra szükség van, és ez az alkalmazással együtt nő | Könnyebb módosítani, mivel minden kérést központilag kezel; ez egyszerűbb, mint a bázisosztály metódus módosítása |
Biztonság | Gyenge, mivel különféle objektumok konzisztencia nélkül hatnak kölcsön | Kiváló. A vezérlőt koordináltan alkotják meg, amivel az alkalmazás biztonságosabbá válik |
Logikai lap | Minden objektum külön logikai lapon | Egy vezérlő kezeli az összes kérést |
Bonyolultság | Kicsi | Nagy |
A front vezérlő három komponenst definiál:
Controller | Dispatcher | Helper | View |
---|---|---|---|
A vezérlő a belépési pont a kliensek és kéréseik számára. Elvégzi az azonosítást segítőknek való delegálással vagy kapcsolat újrafelvételével. | A diszpécserek navigációhoz és a kimenet megjelenítésére használhatók. A felhasználók azt látják, amit a diszpécser határoz meg. Rugalmasan kezelhetők, azaz beágyazhatók a vezérlőbe, de lejhetnek külön objektumok is.Dinamikus mechanizmussal statikus nézetet biztosít.
Felhasználja a RequestDispatcher objektumot is, amit a szervlet specifikáció támogat, és további feldolgozást foglal magába. |
A segítő segít feldolgozni a nézetet vagy felügyelni a folyamatot, így számos célt lehet vele elérni.
A nézet oldalán a segítő adatokat gyűjt és néha tárol egy átmeneti tárban. A néző folyamata előtt a segítők adaptálják számára az adatmodellt. További adatfeldolgozást végeznek, mint webes tartalommá formázás vagy nyers adatok elérése. Többnyire több segítő képes együttműködni egy nézettel. TJavában implementálhatók JavaBeans komponensként JSP 1.0+ felhasználásával és konfigurálható tagekként a JSP 1.1+ segítségével. Emellett a segítő transzformálhat is, így a modell a megfelelő formába alakítható. |
A segítők együttműködésével a néző megjeleníti az információt a kliens számára. A modell adatait használja fel. Sikeres feldolgozás esetén a nézet az, ami megjeleníti a lapot. |
Sokféle webes alkalmazás keretrendszer implementálja a front vezérlő mintát, többek között:
A vezérlő példa kódja Javában:[3]
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);
}
}
A front vezérlőnek három előnye van:[4]
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.
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.
Ez a szócikk részben vagy egészben a Front controller című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.