Útmutató az elülső vezérlő mintához Java-ban

1. Áttekintés

Ebben az oktatóanyagban mélyebbre fogunk ásni a Első vezérlőMinta, része a Vállalati minták -ban meghatározottak szerint Martin FowlerKönyve „Vállalati alkalmazás architektúra mintái”.

Első vezérlő a „vezérlő, amely kezeli a webhely minden kérését”. Egy webalkalmazás előtt áll, és a későbbi erőforrásokra továbbítja a kéréseket. Ezenkívül interfészt biztosít az általános viselkedéshez, például a biztonsághoz, a nemzetközivé váláshoz, és bizonyos nézetek bemutatásához bizonyos felhasználók számára.

Ez lehetővé teszi az alkalmazás számára, hogy futás közben megváltoztassa viselkedését. Ezenkívül segíti az alkalmazások elolvasását és karbantartását azáltal, hogy megakadályozza a kódduplikációt.

Az elülső vezérlő az összes kérelemkezelést úgy konszolidálja, hogy a kéréseket egyetlen kezelő objektumon keresztül irányítja.

2. Hogyan működik?

A Az első vezérlő mintája főleg két részre oszlik. Egyetlen diszpécser vezérlő és a parancsok hierarchiája. A következő UML egy általános Front Controller megvalósítás osztálykapcsolatait ábrázolja:

Ez az egyetlen vezérlő parancsokat küld a kérésekhez annak érdekében, hogy kiváltsa a kéréssel kapcsolatos viselkedést.

A megvalósítás bemutatásához a vezérlőt a FrontControllerServlet és a parancsok mint absztraktból örökölt osztályok FrontCommand.

3. Beállítás

3.1. Maven-függőségek

Először beállítunk egy újat Maven WAR projekt vele javax.servlet-api beleértve:

 javax.servlet javax.servlet-api 4.0.0-b01 biztosított 

továbbá móló-maven-plugin:

 org.eclipse.jetty móló-maven-plugin 9.4.0.M1 / elülső vezérlő 

3.2. Modell

Ezután meghatározzuk a Modell osztály és egy modell Adattár. A következőket fogjuk használni Könyv osztály mint modellünk:

public class Könyv {private String szerző; privát húr cím; magán Dupla ár; // szabványos kivitelezők, mérőeszközök és beállítók}

Ez lesz a tár, megkeresheti a forráskódot a konkrét megvalósításhoz, vagy megadhatja saját maga:

nyilvános felület Könyvespolc {default void init () {add (új könyv ("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9.99)); add (új könyv ("Fowler, Martin", "Vállalati alkalmazás-architektúra mintái", 27.88)); } Könyvespolc getInstance (); logikai hozzáadás (E könyv); Könyv findByTitle (karakterlánc címe); }

3.3. FrontControllerServlet

Maga a Servlet megvalósítása meglehetősen egyszerű. Kivonjuk a parancs nevét egy kérésből, dinamikusan létrehozunk egy új parancsot egy parancsosztályból, és végrehajtjuk.

Ez lehetővé teszi számunkra, hogy új parancsokat adjunk hozzá anélkül, hogy megváltoztatnánk a kód alapját Első vezérlő.

Egy másik lehetőség a Servlet megvalósítása statikus, feltételes logika segítségével. Ennek megvan az az előnye, hogy a fordítás idején hibákat ellenőriz:

public class FrontControllerServlet kiterjeszti a HttpServlet {@Override protected void doGet (HttpServletRequest kérés, HttpServletResponse válasz) {FrontCommand parancs = getCommand (kérés); command.init (getServletContext (), kérés, válasz); parancs.folyamat (); } privát FrontCommand getCommand (HttpServletRequest kérés) {try {Class type = Class.forName (String.format ("com.baeldung.enterprise.patterns.front." + "controller.commands.% sCommand", request.getParameter ("parancs) "))); return (FrontCommand) type .asSubclass (FrontCommand.class) .newInstance (); } catch (e kivétel) {return new UnknownCommand (); }}}

3.4. FrontCommand

Vezessünk be egy absztrakt osztályt FrontCommand, amely az összes parancsra jellemző viselkedést tartja.

Ez az osztály hozzáfér a ServletContext valamint kérési és válaszobjektumai. Ezenkívül kezeli a nézet felbontását:

public abstract osztály FrontCommand {védett ServletContext kontextus; védett HttpServletRequest kérés; védett HttpServletResponse válasz; public void init (ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) {this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } public abstract void process () dob ServletException, IOException; védett void előre (String target) dob ServletException, IOException {target = String.format ("/ WEB-INF / jsp /% s.jsp", target); RequestDispatcher diszpécser = context.getRequestDispatcher (cél); diszpécser.forward (kérés, válasz); }}

Az absztrakt konkrét megvalósítása FrontCommand lenne a SearchCommand. Ez magában foglalja a feltételes logikát azokra az esetekre, amikor egy könyvet találtak, vagy ha a könyv hiányzik:

public class SearchCommand kiterjeszti a FrontCommand {@Orride public void process () dobja a ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); if (könyv! = null) {request.setAttribute ("könyv", könyv); előre ("könyv-talált"); } else {forward ("book-notfound"); }}}

Ha az alkalmazás fut, akkor elérhetjük ezt a parancsot, ha a // localhost: 8080 / front-controller /? Command = Search & title = mintákra mutatunk a böngészőnkben.

A SearchCommand két nézetre bomlik, a második nézetet a következő kéréssel tesztelhetjük // localhost: 8080 / front-controller /? command = Search & title = any-title.

A forgatókönyv kerekítéséhez végrehajtunk egy második parancsot, amelyet minden esetben tartalékként indítunk, a Servlet nem ismeri a parancskérést:

public class UnknownCommand kiterjeszti a FrontCommand {@Orride public void process () felüldobja a ServletException, IOException {előre ("ismeretlen"); }}

Ez a nézet a // localhost: 8080 / front-controller /? Command = Order & title = any-title címen érhető el, vagy a URL paraméterek.

4. Telepítés

Mivel úgy döntöttünk, hogy létrehozunk egy HÁBORÚ fájl projektre, szükségünk lesz egy webes telepítési leíróra. Ezzel web.xml bármelyik Servlet-tárolóban futtathatjuk webalkalmazásunkat:

   front-controller com.baeldung.enterprise.patterns.front.controller.FrontControllerServlet front-controller / 

Utolsó lépésként futni fogunk ‘Mvn móló telepítése: futtatás’ és egy böngészőben ellenőrizheti nézeteinket.

5. Következtetés

Amint eddig láttuk, most ismerkednünk kell a Az első vezérlő mintája és megvalósítása Servlet- és parancs hierarchiaként.

Szokás szerint a forrásokat a GitHubon találja meg.


$config[zx-auto] not found$config[zx-overlay] not found