Introduksjon til ActiveWeb

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

I denne artikkelen skal vi illustrere Activeweb - et full stack web-rammeverk fra JavaLite - som gir alt som er nødvendig for utvikling av dynamiske webapplikasjoner eller REST-fulde webtjenester.

2. Grunnleggende konsepter og prinsipper

Activeweb benytter "konvensjon over konfigurasjon" - noe som betyr at den kan konfigureres, men har fornuftige standarder og ikke krever ytterligere konfigurasjon. Vi trenger bare å følge noen forhåndsdefinerte konvensjoner, som å navngi klasser, metoder og felt i et bestemt forhåndsdefinert format.

Det forenkler også utviklingen ved å kompilere og laste kilden på nytt i containeren som kjører (Jetty som standard).

For avhengighetsadministrasjon bruker den Google Guice som DI-rammeverk; for å lære mer om Guice, ta en titt på guiden vår her.

3. Maven-oppsett

For å komme i gang, la oss først legge til de nødvendige avhengighetene:

 org.javalite activeweb 1.15 

Den siste versjonen finner du her.

I tillegg, for å teste applikasjonen, trenger vi aktiv web-testing avhengighet:

 org.javalite activeweb-testing 1.15 test 

Sjekk ut den siste versjonen her.

4. Søknadsstruktur

Som vi diskuterte, må applikasjonsstrukturen følge en viss konvensjon; Slik ser det ut for en typisk MVC-applikasjon:

Som vi kan se, kontrollere, service, config, og modeller skal være plassert i sin egen underpakke i app pakke.

Utsikten skal ligge i WEB-INF / visninger katalog, hver har egen underkatalog basert på kontrollerens navn. For eksempel app.controllers.ArticleController burde ha en artikkel/ underkatalog som inneholder alle visningsfilene for den kontrolleren.

Distribusjonsbeskrivelsen eller web.xml skal vanligvis inneholde en og det tilsvarende . Siden rammeverket er et servletfilter, i stedet for et konfigurasjon er det en filterkonfigurasjon:

... dispatcher org.javalite.activeweb.RequestDispatcher ... ...

Vi trenger også en root_controller for å definere standardkontrolleren for applikasjonen - i likhet med a hjem kontroller:

... root_controller hjem ...

5. Kontrollere

Kontrollere er de viktigste komponentene i en ActiveWeb-applikasjon; og, som nevnt tidligere, skal alle kontrollere være plassert inne i app.controllers pakke:

public class ArticleController utvider AppController {// ...}

Legg merke til at kontrolleren utvider seg org.javalite.activeweb.AppController.

5.1. Kontroller URL-kartlegging

Kontrollerne tilordnes automatisk til en URL basert på konvensjonen. For eksempel, ArticleController blir kartlagt til:

// vert: port / contextroot / artikkel

Nå vil dette bli kartlagt dem til standard en standardhandling i kontrolleren. Handlinger er bare metoder inne i kontrolleren. Navngi standardmetoden som indeks ():

public class ArticleController utvider AppController {// ... public void index () {render ("articles"); } // ...}

For andre metoder eller handlinger, legg metodens navn til URL-en:

offentlig klasse ArticleController utvider AppController {// ... public void search () {render ("search"); }}

URL:

// vert: port / contextroot / artikkel / søk

Vi kan til og med ha kontrollerhandlinger basert på HTTP-metoder. Bare kommenter metoden med en av @POST, @PUT, @DELETE, @GET, @HEAD. Hvis vi ikke kommenterer en handling, betraktes det som en GET som standard.

5.2. Controller URL Resolution

Rammeverket bruker kontrollernavn og underpakkens navn for å generere kontrollerens URL. For eksempel app.controllers.ArticleController.java URL:

// vert: port / contextroot / artikkel

Hvis kontrolleren er inne i en underpakke, blir nettadressen ganske enkelt:

// vert: port / contextroot / baeldung / artikkel

For et kontrollernavn som har mer enn ett ord (for eksempel app.controllers.PublishedArticleController.java), blir URL-en skilt ved hjelp av en understreking:

// vert: port / contextroot / published_article

5.3. Henter forespørselsparametere

Inne i en kontroller får vi tilgang til forespørselsparametrene ved hjelp av param () eller params () metoder fra AppController-klasse. Den første metoden tar et String-argument - navnet på parameteren som skal hentes:

offentlig ugyldig søk () {String nøkkelord = param ("nøkkel"); visning ("søk", articleService.search (nøkkelord)); }

Og vi kan bruke det senere for å få alle parametere hvis vi trenger:

offentlig tomt søk () {Kartkriterium = params (); // ...}

6. Visninger

I ActiveWeb-terminologi blir visninger ofte referert til som maler; Dette er hovedsakelig fordi den bruker Apache FreeMarker malmotor i stedet for JSPer. Du kan lese mer om FreeMarker i guiden vår, her.

Plasser malene i WEB-INF / visninger katalog. Hver kontroller skal ha en underkatalog med navnet sitt som inneholder alle malene som kreves av den.

6.1. Kontroller visningskartlegging

Når en kontroller blir truffet, er standardhandlingen indeks () blir henrettet og rammeverket vil velge WEB-INF / visninger / artikkel /index.ftl mal fra visningskatalogen for den kontrolleren. Tilsvarende vil visningen for enhver annen handling bli valgt basert på handlingsnavnet.

Dette er ikke alltid det vi ønsker. Noen ganger vil vi kanskje returnere noen synspunkter basert på intern forretningslogikk. I dette scenariet, vi kan kontrollere prosessen med gjengi () metode fra foreldrene org.javalite.activeweb.AppController klasse:

offentlig ugyldighetsindeks () {gjengi ("artikler"); }

Merk at plasseringen av de tilpassede visningene også skal være i samme visningskatalog for den kontrolleren. Hvis det ikke er tilfelle, må du legge til navnet på malen med katalognavnet der malen ligger, og sende den til gjengi () metode:

gjengi ("/ common / error");

6.3. Visninger med data

For å sende data til visningene, org.javalite.activeweb.AppController gir den utsikt() metode:

se ("artikler", articleService.getArticles ());

Dette tar to params. Først, objektnavnet som ble brukt til å få tilgang til objektet i malen, og for det andre et objekt som inneholder dataene.

Vi kan også bruke tildele() metode for å overføre data til visningene. Det er absolutt ingen forskjell mellom visning () og tildele() metoder - vi kan velge hvilken som helst av dem:

tilordne ("artikkel", articleService.search (nøkkelord));

La oss kartlegge dataene i malen:

Artikler ... $ {article.title}$ {article.author}$ {article.words}$ {article.date}

7. Administrere avhengigheter

For å administrere objekter og forekomster bruker ActiveWeb Google Guice som et avhengighetsstyringsrammeverk.

La oss si at vi trenger en serviceklasse i applikasjonen vår; dette vil skille forretningslogikken fra kontrollerne.

La oss først opprette et tjenestegrensesnitt:

offentlig grensesnitt ArticleService {List getArticles (); Artikkelsøk (String nøkkelord); }

Og implementeringen:

public class ArticleServiceImpl implementerer ArticleService {public List getArticles () {return fetchArticles (); } offentlig artikkelsøk (strengnøkkelord) {Article ar = new Article (); ar.set ("tittel", "Artikkel med" + nøkkelord); ar.set ("forfatter", "baeldung"); ar.set ("ord", "1250"); ar.setDate ("date", Instant.now ()); returnere ar; }}

La oss nå binde denne tjenesten som en Guice-modul:

offentlig klasse ArticleServiceModule utvider AbstractModule {@Override-beskyttet ugyldig konfigurere () {bind (ArticleService.class) .to (ArticleServiceImpl.class) .asEagerSingleton (); }}

Til slutt registrerer du dette i applikasjonssammenheng og injiserer det i kontrolleren, etter behov:

offentlig klasse AppBootstrap utvider Bootstrap {public void init (AppContext context) {} public Injector getInjector () {return Guice.createInjector (new ArticleServiceModule ()); }}

Merk at dette konfigurasjonsklassenavnet må være AppBootstrap og den skal være plassert i app.config pakke.

Til slutt, her er hvordan vi injiserer det i kontrolleren:

@Injiser privat ArticleService articleService;

8. Testing

Enhetstester for et ActiveWeb-program skrives ved hjelp av JSpec-biblioteket fra JavaLite.

Vi bruker org.javalite.activeweb.ControllerSpec klasse fra JSpec for å teste kontrolleren vår, og vi vil navngi testklassene etter en lignende konvensjon:

public class ArticleControllerSpec utvider ControllerSpec {// ...}

Legg merke til at navnet ligner kontrolleren det tester med en “Spec” på slutten.

Her er testsaken:

@Test offentlig ugyldig nårReturnedArticlesThenCorrect () {forespørsel (). Get ("indeks"); a (responsContent ()) .shouldContain ("Introduksjon til Mule"); }

Legg merke til at be om() metoden simulerer anropet til kontrolleren, og den tilsvarende HTTP-metoden få(), tar handlingsnavnet som argument.

Vi kan også overføre parametere til kontrolleren ved hjelp av params () metode:

@Test offentlig tomrom gittKeywordWhenFoundArticleThenCorrect () {forespørsel (). Param ("nøkkel", "Java"). Get ("søk"); a (responsContent ()) .shouldContain ("Artikkel med Java"); }

For å overføre flere parametere kan vi også kjede metoden med denne flytende API-en.

9. Distribuere applikasjonen

Det er mulig å distribuere applikasjonen i en hvilken som helst servletcontainer som Tomcat, WildFly eller Jetty. Selvfølgelig vil den enkleste måten å distribuere og teste være å bruke Maven Jetty plugin:

... org.eclipse.jetty jetty-maven-plugin 9.4.8.v20171121 manual 10000 ...

Den siste versjonen av pluginet er her.

Nå, endelig - vi kan fyre opp:

mvn brygge: løp

10. Konklusjon

I denne artikkelen lærte vi om de grunnleggende konseptene og konvensjonene i ActiveWeb-rammeverket. I tillegg til disse har rammeverket flere funksjoner og evner enn det vi har diskutert her.

Se den offisielle dokumentasjonen for mer informasjon.

Og som alltid er eksempelkoden som brukes i artikkelen tilgjengelig på GitHub.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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