Vodič za obrazac prednjeg kontrolera na Javi

1. Pregled

U ovom uputstvu ćemo dublje istražiti Prednji kontrolerUzorak, dio Uzorci poduzeća kako je definirano u Martin Fowler‘Knjiga “Obrasci arhitekture aplikativnih aplikacija poduzeća”.

Prednji kontroler je definiran kao "kontroler koji obrađuje sve zahtjeve za web stranicu". Stoji ispred web-aplikacije i preusmjerava zahtjeve na sljedeće resurse. Također pruža sučelje za uobičajeno ponašanje poput sigurnosti, internacionalizacije i predstavljanja određenih pogleda određenim korisnicima.

To omogućuje aplikaciji da promijeni svoje ponašanje tijekom izvođenja. Nadalje, pomaže u čitanju i održavanju aplikacije sprečavanjem dupliciranja koda.

Prednji kontroler objedinjuje sve obrade zahtjeva kanaliziranjem zahtjeva kroz jedan objekt rukovatelja.

2. Kako to djeluje?

The Uzorak prednjeg kontrolera je uglavnom podijeljen u dva dijela. Jedan dispečerski kontroler i hijerarhija naredbi. Sljedeći UML prikazuje odnose klasa generičke implementacije Front Controllera:

Ovaj jedan kontroler šalje zahtjeve naredbama kako bi pokrenuo ponašanje povezano sa zahtjevom.

Da bismo demonstrirali njegovu provedbu, implementirat ćemo kontroler u a FrontControllerServlet a naredbe kao klase naslijeđene iz sažetka FrontCommand.

3. Postavljanje

3.1. Ovisnosti Mavena

Prvo ćemo postaviti novo Maven RAT projekt sa javax.servlet-api uključeno:

 javax.servlet javax.servlet-api 4.0.0-b01 pod uvjetom 

kao i dodatak za jetty-maven:

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

3.2. Model

Dalje ćemo definirati a Model razred i model Spremište. Koristit ćemo sljedeće Knjiga klasa kao naš model:

knjiga javnog razreda {autor privatnog niza; privatni naslov niza; privatno Dvostruka cijena; // standardni konstruktori, getteri i postavljači}

Ovo će biti spremište, izvorni kod možete potražiti za konkretnu implementaciju ili ga sami dostaviti:

javno sučelje Polica s knjigama {zadana void init () {dodaj (nova Knjiga ("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9,99)); dodaj (nova knjiga ("Fowler, Martin", "Obrasci arhitekture aplikativnih aplikacija poduzeća", 27.88)); } Polica za knjige getInstance (); boolean add (E knjiga); Book findByTitle (naslov niza); }

3.3. FrontControllerServlet

Sama implementacija Servleta prilično je jednostavna. Izvlačimo ime naredbe iz zahtjeva, dinamički kreiramo novu instancu klase naredbi i izvršavamo je.

To nam omogućuje dodavanje novih naredbi bez mijenjanja naše baze koda Prednji kontroler.

Druga je mogućnost implementacija Servleta pomoću statičke, uvjetne logike. To ima prednost provjere pogrešaka tijekom vremena kompajliranja:

javna klasa FrontControllerServlet proširuje HttpServlet {@Override zaštićen void doGet (zahtjev HttpServletRequest, odgovor HttpServletResponse) {FrontCommand command = getCommand (zahtjev); command.init (getServletContext (), zahtjev, odgovor); command.process (); } private FrontCommand getCommand (HttpServletRequest zahtjev) {try {Class type = Class.forName (String.format ("com.baeldung.enterprise.patterns.front." + "controller.commands.% sCommand", request.getParameter ("naredba" "))); return (FrontCommand) tip .asSubclass (FrontCommand.class) .newInstance (); } catch (Iznimka e) {return new UnknownCommand (); }}}

3.4. FrontCommand

Provedimo apstraktnu klasu tzv FrontCommand, koji drži ponašanje zajedničko svim naredbama.

Ova klasa ima pristup ServletContext i njeni objekti zahtjeva i odgovora. Nadalje, bavit će se razlučivošću pogleda:

javna apstraktna klasa FrontCommand {zaštićeni kontekst ServletContext; zaštićeni zahtjev HttpServletRequest; zaštićeni odgovor HttpServletResponse; javna void init (ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) {this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } javni apstraktni void postupak () baca ServletException, IOException; zaštićena praznina prema naprijed (cilj niza) baca ServletException, IOException {target = String.format ("/ WEB-INF / jsp /% s.jsp", target); RequestDispatcher dispečer = context.getRequestDispatcher (cilj); dispečer.naprijed (zahtjev, odgovor); }}

Konkretna provedba ovog sažetka FrontCommand bilo bi a SearchCommand. To će uključivati ​​uvjetnu logiku za slučajeve kada je knjiga pronađena ili kada knjiga nedostaje:

javna klasa SearchCommand proširuje FrontCommand {@Override public void process () baca ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); if (book! = null) {request.setAttribute ("knjiga", knjiga); naprijed ("pronađena knjiga"); } else {naprijed ("knjiga nije pronađena"); }}}

Ako se aplikacija izvodi, do ove naredbe možemo doći usmjeravanjem preglednika na // localhost: 8080 / front-controller /? Command = Search & title = pattern.

The SearchCommand rješava se na dva prikaza, drugi prikaz se može testirati sa sljedećim zahtjevom // localhost: 8080 / front-controller /? command = Search & title = any-title.

Da bismo zaokružili naš scenarij, implementirat ćemo drugu naredbu koja se u svim slučajevima aktivira kao zamjenska, zahtjev naredbe je nepoznat Servletu:

javna klasa UnknownCommand proširuje FrontCommand {@Override public void process () baca ServletException, IOException {forward ("unknown"); }}

Ovaj će pogled biti dostupan na // localhost: 8080 / front-controller /? Command = Order & title = any-title ili potpuno izostavljanjem URL parametri.

4. Raspoređivanje

Jer smo odlučili stvoriti RAT file file, trebat će nam deskriptor web implementacije. S ovim web.xml našu web-aplikaciju možemo pokrenuti u bilo kojem spremniku Servlet:

   prednji kontroler com.baeldung.enterprise.patterns.front.controller.FrontControllerServlet prednji kontroler / 

Kao zadnji korak koji ćemo pokrenuti 'Mvn instaliraj pomol: pokrenite' i pregledati naše poglede u pregledniku.

5. Zaključak

Kao što smo do sada vidjeli, sada bismo trebali biti upoznati s Uzorak prednjeg kontrolera i njegova primjena kao Servlet i hijerarhija naredbi.

Kao i obično, izvore ćete pronaći na GitHubu.