En guide til frontkontrollermønsteret i Java

1. Oversikt

I denne opplæringen skal vi grave dypere inn i FrontkontrollerMønster, del av Bedriftsmønstre som definert i Martin Fowler’S bok “Mønstre av Enterprise Application Architecture”.

Frontkontroller er definert som "en kontroller som håndterer alle forespørsler om et nettsted". Den står foran en webapplikasjon og delegerer forespørsler til påfølgende ressurser. Det gir også et grensesnitt til vanlig oppførsel som sikkerhet, internasjonalisering og presentasjon av spesielle synspunkter for bestemte brukere.

Dette gjør det mulig for et program å endre oppførselen ved kjøretid. Videre hjelper det å lese og vedlikeholde et program ved å forhindre duplisering av kode.

Frontkontrolleren samler all forespørselhåndtering ved å kanalisere forespørsler gjennom et enkelt behandlerobjekt.

2. Hvordan fungerer det?

De Frontkontrollermønster er i hovedsak delt inn i to deler. En enkelt ekspedisjonskontroller og et hierarki av kommandoer. Følgende UML skildrer klasseforhold for en generisk Front Controller-implementering:

Denne enkeltkontrolleren sender forespørsler om kommandoer for å utløse atferd knyttet til en forespørsel.

For å demonstrere implementeringen, implementerer vi kontrolleren i en FrontControllerServlet og kommandoer som klasser arvet fra et abstrakt FrontCommand.

3. Oppsett

3.1. Maven avhengigheter

Først setter vi opp en ny Maven WAR prosjekt med javax.servlet-api inkludert:

 javax.servlet javax.servlet-api 4.0.0-b01 gitt 

i tillegg til jetty-maven-plugin:

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

3.2. Modell

Deretter vil vi definere en Modell klasse og en modell Oppbevaringssted. Vi bruker følgende Bok klasse som vår modell:

offentlig klasse Bok {privat Stringforfatter; privat strengetittel; privat dobbel pris; // standardkonstruktører, getters og settere}

Dette vil være depotet, du kan slå opp kildekoden for konkret implementering eller oppgi en på egen hånd:

offentlig grensesnitt Bookshelf {default void init () {add (new Book ("Wilson, Robert Anton & Shea, Robert", "Illuminati", 9.99)); legg til (ny bok ("Fowler, Martin", "Patterns of Enterprise Application Architecture", 27.88)); } Bokhylle getInstance (); boolean add (E-bok); Book findByTitle (strengetittel); }

3.3. FrontControllerServlet

Implementeringen av selve Servlet er ganske enkel. Vi trekker ut kommandonavnet fra en forespørsel, oppretter dynamisk en ny forekomst av en kommandoklasse og utfører den.

Dette lar oss legge til nye kommandoer uten å endre en kodebase av vår Frontkontroller.

Et annet alternativ er å implementere Servlet ved hjelp av statisk, betinget logikk. Dette har fordelen av kompileringstid-feilkontroll:

offentlig klasse FrontControllerServlet utvider HttpServlet {@Override-beskyttet ugyldig doGet (HttpServletRequest-forespørsel, HttpServletResponse-svar) {FrontCommand-kommando = getCommand (forespørsel); command.init (getServletContext (), forespørsel, svar); command.process (); } privat FrontCommand getCommand (HttpServletRequest-forespørsel) {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 (Unntak e) {returnere ny ukjent kommando (); }}}

3.4. FrontCommand

La oss implementere en abstrakt klasse kalt FrontCommand, som holder atferden felles for alle kommandoer.

Denne klassen har tilgang til ServletContext og dens forespørsels- og svarobjekter. Videre vil den håndtere visningsoppløsningen:

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

En konkret implementering av dette abstraktet FrontCommand ville være en Søkekommandoer. Dette inkluderer betinget logikk for tilfeller der en bok ble funnet eller når en bok mangler:

public class SearchCommand utvider FrontCommand {@Override public void process () kaster ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); if (book! = null) {request.setAttribute ("book", book); fremover ("book-found"); } annet {forward ("book-notfound"); }}}

Hvis applikasjonen kjører, kan vi nå denne kommandoen ved å peke nettleseren vår til // localhost: 8080 / front-controller /? Command = Search & title = mønstre.

De Søkekommandoer løser to visninger, kan den andre visningen testes med følgende forespørsel // localhost: 8080 / front-controller /? command = Search & title = any-title.

For å avrunde scenariet implementerer vi en ny kommando, som i alle tilfeller utløses som tilbakeslag, en kommandoforespørsel er ukjent for Servlet:

offentlig klasse UnknownCommand utvider FrontCommand {@Override offentlig ugyldig prosess () kaster ServletException, IOException {framover ("ukjent"); }}

Denne visningen kan nås på // localhost: 8080 / front-controller /? Command = Order & title = any-title eller ved helt å utelate URL parametere.

4. Implementering

Fordi vi bestemte oss for å lage en KRIG filprosjekt, trenger vi en deskriptor for nettdistribusjon. Med dette web.xml vi kan kjøre webapplikasjonen vår i hvilken som helst Servlet-container:

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

Som det siste trinnet løper vi ‘Mvn install brygge: kjør ' og inspiser våre synspunkter i en nettleser.

5. Konklusjon

Som vi har sett så langt, skal vi nå være kjent med Fremre kontrollermønster og implementeringen som Servlet og kommandohierarki.

Som vanlig finner du kildene på GitHub.


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