En guide til frontcontrollermønsteret i Java

1. Oversigt

I denne vejledning graver vi dybere ned i FrontcontrollerMønster, en del af Virksomhedsmønstre som defineret i Martin Fowler'S bog “Mønstre af Enterprise Application Architecture”.

Frontcontroller er defineret som “en controller, der håndterer alle anmodninger om et websted”. Det står foran en webapplikation og delegerer anmodninger til efterfølgende ressourcer. Det giver også en grænseflade til almindelig adfærd såsom sikkerhed, internationalisering og præsentation af bestemte synspunkter for bestemte brugere.

Dette gør det muligt for et program at ændre dets adfærd under kørsel. Desuden hjælper det med at læse og vedligeholde en applikation ved at forhindre kodekopiering.

Frontcontrolleren samler al anmodningshåndtering ved at kanalisere anmodninger gennem et enkelt handlerobjekt.

2. Hvordan fungerer det?

Det Forreste controller mønster er hovedsageligt opdelt i to dele. En enkelt forsendelsescontroller og et hierarki af kommandoer. Følgende UML skildrer klasseforhold for en generisk Front Controller-implementering:

Denne enkelt controller sender anmodninger om kommandoer for at udløse adfærd forbundet med en anmodning.

For at demonstrere implementeringen implementerer vi controlleren i en FrontControllerServlet og kommandoer som klasser nedarvet fra et abstrakt FrontCommand.

3. Opsætning

3.1. Maven afhængigheder

Først konfigurerer vi en ny Maven WAR projekt med javax.servlet-api inkluderet:

 javax.servlet javax.servlet-api 4.0.0-b01 leveret 

såvel som anløbsbro-plugin:

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

3.2. Model

Dernæst definerer vi en Model klasse og en model Datalager. Vi bruger følgende Bestil klasse som vores model:

public class Book {private String author; privat streng titel; privat dobbelt pris; // standardkonstruktører, getters og settere}

Dette er lageret, du kan slå kildekoden til konkret implementering eller give en på egen hånd:

offentlig grænseflade Boghylde {standard ugyldig init () {tilføj (ny bog ("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9.99)); tilføj (ny bog ("Fowler, Martin", "Patterns of Enterprise Application Architecture", 27.88)); } Bogreol getInstance (); boolsk tilføjelse (E-bog); Book findByTitle (streng titel); }

3.3. FrontControllerServlet

Implementeringen af ​​selve Servlet er ret enkel. Vi udtrækker kommandonavnet fra en anmodning, opretter dynamisk en ny forekomst af en kommandoklasse og udfører den.

Dette giver os mulighed for at tilføje nye kommandoer uden at ændre en kodebase af vores Frontcontroller.

En anden mulighed er at implementere Servlet ved hjælp af statisk, betinget logik. Dette har fordelen ved fejlkontrol af kompileringstid:

offentlig klasse FrontControllerServlet udvider HttpServlet {@Override beskyttet ugyldig doGet (HttpServletRequest anmodning, HttpServletResponse svar) {FrontCommand kommando = getCommand (anmodning); command.init (getServletContext (), anmodning, svar); command.process (); } privat FrontCommand getCommand (HttpServletRequest anmodning) {prøv {Class type = Class.forName (String.format ("com.baeldung.enterprise.patterns.front." + "controller.commands.% sCommand", request.getParameter ("command) "))); returner (FrontCommand) type .asSubclass (FrontCommand.class) .newInstance (); } fange (Undtagelse e) {returner ny UnknownCommand (); }}}

3.4. FrontCommand

Lad os implementere en abstrakt klasse kaldet FrontCommand, som holder adfærden fælles for alle kommandoer.

Denne klasse har adgang til ServletContext og dens anmodnings- og reaktionsobjekter. Desuden håndterer den visningsopløsning:

offentlig abstrakt klasse FrontCommand {beskyttet ServletContext kontekst; beskyttet HttpServletRequest anmodning; beskyttet HttpServletResponse-svar; public void init (ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) {this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } offentlig abstrakt ugyldig proces () kaster ServletException, IOException; beskyttet tomrum fremad (String target) kaster ServletException, IOException {target = String.format ("/ WEB-INF / jsp /% s.jsp", target); RequestDispatcher dispatcher = context.getRequestDispatcher (mål); dispatcher.forward (anmodning, svar); }}

En konkret implementering af dette abstrakt FrontCommand ville være en Søgekommandoer. Dette inkluderer betinget logik i tilfælde, hvor en bog blev fundet, eller når en bog mangler:

offentlig klasse SearchCommand udvider FrontCommand {@Override offentlig ugyldig proces () kaster ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); if (book! = null) {request.setAttribute ("bog", bog); frem ("bogfundet"); } andet {forward ("book-notfound"); }}}

Hvis applikationen kører, kan vi nå denne kommando ved at pege vores browser til // localhost: 8080 / front-controller /? Command = Søg & titel = mønstre.

Det Søgekommandoer løser to visninger, kan den anden visning testes med følgende anmodning // localhost: 8080 / front-controller /? command = Søg & titel = enhver titel.

For at afrunde vores scenarie implementerer vi en anden kommando, som i alle tilfælde affyres som en reserve, en kommandabehov er ukendt for Servlet:

offentlig klasse UnknownCommand udvider FrontCommand {@Override offentlig ugyldig proces () kaster ServletException, IOException {frem ("ukendt"); }}

Denne visning kan nås på // localhost: 8080 / front-controller /? Command = Order & title = any-title eller ved helt at udelade URL parametre.

4. Implementering

Fordi vi besluttede at skabe et KRIG filprojekt, skal vi bruge en deskriptor til webinstallation. Med dette web.xml vi er i stand til at køre vores webapplikation i enhver Servlet-container:

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

Som det sidste trin løber vi 'Mvn installer anløbsbro: kør' og inspicere vores synspunkter i en browser.

5. Konklusion

Som vi har set indtil videre, skal vi nu være bekendt med Forreste controller mønster og dens implementering som Servlet og kommandohierarki.

Som sædvanligt finder du kilderne på GitHub.


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