Sprievodca vzorom predného radiča v Jave

1. Prehľad

V tomto výučbe sa budeme zaoberať hlbšie Predný ovládačVzor, časť Podnikové vzory ako je definované v Martin FowlerKniha „Vzory podnikovej aplikačnej architektúry“.

Predný ovládač je definovaný ako „kontrolór, ktorý vybavuje všetky požiadavky na webovú stránku“. Stojí pred webovou aplikáciou a deleguje požiadavky na ďalšie zdroje. Poskytuje tiež rozhranie k bežnému správaniu, ako je bezpečnosť, internacionalizácia a prezentácia konkrétnych pohľadov určitým používateľom.

To umožňuje aplikácii zmeniť svoje správanie za behu programu. Ďalej pomáha čítať a udržiavať aplikáciu zabránením duplikácii kódu.

Predný radič konsoliduje všetko vybavovanie požiadaviek smerovaním požiadaviek cez jeden objekt obsluhy.

2. Ako to funguje?

The Predný ovládač je rozdelená hlavne na dve časti. Jeden dispečer a hierarchia príkazov. Nasledujúci UML zobrazuje triedne vzťahy generickej implementácie Front Controller:

Tento jediný radič odosiela požiadavky na príkazy, aby spustil správanie spojené s požiadavkou.

Na demonštráciu jeho implementácie implementujeme kontrolór v a FrontControllerServlet a príkazy ako triedy zdedené z abstraktu FrontCommand.

3. Inštalácia

3.1. Maven závislosti

Najskôr nastavíme nový Maven WAR projekt s javax.servlet-api v cene:

 javax.servlet javax.servlet-api 4.0.0-b01 k dispozícii 

ako aj jetty-maven-plugin:

 org.eclipse.jetty jetty-maven-plugin 9.4.0.M1 / front-controller 

3.2. Model

Ďalej definujeme a Model triedy a model Úložisko. Použijeme nasledujúce Kniha trieda ako náš model:

public class Book {private String author; súkromný názov reťazca; súkromná dvojitá cena; // štandardné konštruktory, getre a setre}

Bude to úložisko, kde môžete vyhľadať zdrojový kód pre konkrétnu implementáciu alebo ho sami poskytnúť:

verejné rozhranie Knihovnička {default void init () {add (nová kniha ("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9,99)); add (nová kniha ("Fowler, Martin", "Patterns of Enterprise Application Architecture", 27.88)); } Polica getInstance (); boolean add (E kniha); Kniha findByTitle (názov reťazca); }

3.3. FrontControllerServlet

Samotná implementácia servletu je dosť jednoduchá. Extrahujeme názov príkazu z požiadavky, dynamicky vytvoríme novú inštanciu triedy príkazov a vykonáme ju.

To nám umožňuje pridávať nové príkazy bez zmeny našej kódovej základne Predný ovládač.

Ďalšou možnosťou je implementácia servletu pomocou statickej, podmienenej logiky. To má výhodu kontroly chýb pri kompilácii:

verejná trieda FrontControllerServlet rozširuje HttpServlet {@Override chránený void doGet (požiadavka HttpServletRequest, odpoveď HttpServletResponse) {FrontCommand príkaz = getCommand (požiadavka); command.init (getServletContext (), požiadavka, odpoveď); command.process (); } private FrontCommand getCommand (požiadavka HttpServletRequest) {try {Class type = Class.forName (String.format ("com.baeldung.enterprise.patterns.front." + "controller.commands.% sCommand", request.getParameter ("príkaz) "))); návratový (FrontCommand) typ .asSubclass (FrontCommand.class) .newInstance (); } catch (Výnimka e) {return new UnknownCommand (); }}}

3.4. FrontCommand

Implementujme abstraktnú triedu s názvom FrontCommand, ktorá drží spoločné správanie pre všetky príkazy.

Táto trieda má prístup k ServletContext a jej objekty požiadaviek a odpovedí. Ďalej zvládne rozlíšenie zobrazenia:

verejná abstraktná trieda FrontCommand {chránený kontext ServletContext; chránená požiadavka HttpServletRequest; chránená odpoveď HttpServletResponse; public void init (ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) {this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } public abstract void process () hodí ServletException, IOException; protected void forward (String target) throws ServletException, IOException {target = String.format ("/ WEB-INF / jsp /% s.jsp", target); Dispečer RequestDispatcher = context.getRequestDispatcher (cieľ); dispečer.predal (požiadavka, odpoveď); }}

Konkrétna implementácia tohto abstraktu FrontCommand by bolo SearchCommand. To bude zahŕňať podmienenú logiku pre prípady, keď bola kniha nájdená alebo keď kniha chýba:

public class SearchCommand extends FrontCommand {@Override public void process () throws ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); if (book! = null) {request.setAttribute ("kniha", kniha); vpred („nájdená kniha“); } else {forward ("nenašiel sa"); }}}

Ak je aplikácia spustená, môžeme k tomuto príkazu dospieť nasmerovaním nášho prehliadača na // localhost: 8080 / front-controller /? Command = Search & title = patterns.

The SearchCommand sa rozdelí na dva pohľady, druhý pohľad je možné otestovať s nasledujúcou požiadavkou // localhost: 8080 / front-controller /? command = Search & title = any-title.

Na doplnenie nášho scenára implementujeme druhý príkaz, ktorý je vo všetkých prípadoch spustený ako záložný, servlet nezná požiadavku na príkaz:

public class UnknownCommand extends FrontCommand {@Override public void process () throws ServletException, IOException {forward ("unknown"); }}

Toto zobrazenie bude dostupné na // localhost: 8080 / front-controller /? Command = Order & title = any-title alebo úplným vynechaním URL parametre.

4. Nasadenie

Pretože sme sa rozhodli vytvoriť VOJNA súborový projekt, budeme potrebovať deskriptor nasadenia webu. S tým web.xml našu webovú aplikáciu môžeme spustiť v ľubovoľnom servletovom kontajneri:

   predný radič com.baeldung.enterprise.patterns.front.controller.FrontControllerServlet predný radič / 

Ako posledný krok bežíme „Inštalácia mvn: spustiť“ a prezrieť si naše názory v prehliadači.

5. Záver

Ako sme už videli, teraz by sme mali poznať Predný ovládač a jeho implementácia ako servlet a hierarchia príkazov.

Ako obvykle nájdete zdroje na GitHube.


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