Introduktion til ActiveWeb

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne artikel skal vi illustrere Activeweb - en full stack web-ramme fra JavaLite - der giver alt, hvad der er nødvendigt til udvikling af dynamiske webapplikationer eller REST-fulde webtjenester.

2. Grundlæggende begreber og principper

Activeweb udnytter "konvention over konfiguration" - hvilket betyder, at det kan konfigureres, men har fornuftige standardindstillinger og ikke kræver yderligere konfiguration. Vi skal bare følge et par foruddefinerede konventioner som at navngive klasser, metoder og felter i et bestemt foruddefineret format.

Det forenkler også udviklingen ved at kompilere og genindlæse kilden i den kørende container (Jetty som standard).

Til afhængighedsstyring bruger den Google Guice som DI-rammen; for at lære mere om Guice, se vores guide her.

3. Maven-opsætning

For at komme i gang, lad os først tilføje de nødvendige afhængigheder:

 org.javalite activeweb 1.15 

Den seneste version kan findes her.

Derudover har vi brug for den til at teste applikationen aktiv webtest afhængighed:

 org.javalite activeweb-test 1.15 test 

Tjek den seneste version her.

4. Applikationsstruktur

Som vi diskuterede, skal applikationsstrukturen følge en bestemt konvention; her ser det ud for en typisk MVC-applikation:

Som vi kan se, controllere, service, configog modeller skal placeres i deres egen underpakke i app pakke.

Visningerne skal placeres i WEB-INF / visninger katalog, der hver har sin egen underkatalog baseret på controllerens navn. For eksempel app.controllers.ArticleController skulle have en artikel / underkatalog, der indeholder alle visningsfilerne til den pågældende controller.

Implementeringsbeskrivelsen eller web.xml skal typisk indeholde en og det tilsvarende . Da rammen er et servletfilter, i stedet for et konfiguration der er en filterkonfiguration:

... afsender org.javalite.activeweb.RequestDispatcher ... ...

Vi har også brug for en root_controller for at definere standardcontrolleren til applikationen - beslægtet med a hjem controller:

... root_controller hjem ...

5. Controllere

Controllere er de primære komponenter i en ActiveWeb-applikation; og som tidligere nævnt skal alle controllere være placeret inde i app.controllers pakke:

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

Bemærk, at controlleren udvider sig org.javalite.activeweb.AppController.

5.1. Kortlægning af controller-URL

Controllerne kortlægges automatisk til en URL baseret på konventionen. For eksempel, ArticleController vil blive kortlagt til:

// vært: port / contextroot / artikel

Nu vil dette blive kortlagt dem til standard en standardhandling i controlleren. Handlinger er kun metoder inde i controlleren. Navngiv standardmetoden som indeks():

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

For andre metoder eller handlinger skal du føje metodens navn til URL'en:

offentlig klasse ArticleController udvider AppController {// ... offentlig ugyldig søgning () {gengiver ("søgning"); }}

URL'en:

// vært: port / contextroot / artikel / søgning

Vi kan endda have controllerhandlinger baseret på HTTP-metoder. Kommenter bare metoden med en af @POST, @PUT, @DELETE, @GET, @HEAD. Hvis vi ikke kommenterer en handling, betragtes det som en GET som standard.

5.2. Controller URL-opløsning

Rammen bruger controller-navn og underpakke navn til at generere controller-URL. For eksempel app.controllers.ArticleController.java URL'en:

// vært: port / contextroot / artikel

Hvis controlleren er inde i en underpakke, bliver URL'en simpelthen:

// vært: port / contextroot / baeldung / artikel

For et controller-navn, der har mere end et enkelt ord (f.eks app.controllers.PublishedArticleController.java), bliver URL'en adskilt ved hjælp af en understregning:

// vært: port / contextroot / published_article

5.3. Henter anmodningsparametre

Inde i en controller får vi adgang til anmodningsparametrene ved hjælp af param () eller params () metoder fra AppController klasse. Den første metode tager et String-argument - navnet på parameteren, der skal hentes:

offentlig ugyldig søgning () {String nøgleord = param ("nøgle"); se ("søg", articleService.search (nøgleord)); }

Og vi kan bruge det senere til at få alle parametre, hvis vi har brug for:

offentlig tom søgning () {Kortkriterium = params (); // ...}

6. Visninger

I ActiveWeb-terminologi omtales visninger ofte som skabeloner; dette skyldes for det meste, at det bruger Apache FreeMarker-skabelonmotor i stedet for JSP'er. Du kan læse mere om FreeMarker i vores guide her.

Placer skabelonerne i WEB-INF / visninger vejviser. Hver controller skal have en underkatalog med sit navn, der indeholder alle skabeloner, der kræves af den.

6.1. Kortlægning af controllervisning

Når en controller er ramt, er standardhandlingen indeks() bliver udført, og rammen vælger WEB-INF / visninger / artikel /index.ftl skabelon fra visningskataloget til den controller. Tilsvarende ville visningen for enhver anden handling blive valgt baseret på handlingsnavnet.

Dette er ikke altid, hvad vi gerne vil have. Nogle gange vil vi måske returnere nogle synspunkter baseret på intern forretningslogik. I dette scenarie vi kan styre processen med gengive () metode fra forældrene org.javalite.activeweb.AppController klasse:

offentligt ugyldigt indeks () {gengive ("artikler"); }

Bemærk, at placeringen af ​​de brugerdefinerede visninger også skal være i samme visningsmappe for den controller. Hvis det ikke er tilfældet, skal du forud for skabelonnavnet med det biblioteksnavn, hvor skabelonen findes, og videregive det til gengive () metode:

gengive ("/ common / error");

6.3. Visninger med data

For at sende data til visningerne skal org.javalite.activeweb.AppController giver den udsigt() metode:

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

Dette tager to parametre. For det første det objektnavn, der bruges til at få adgang til objektet i skabelonen, og for det andet et objekt, der indeholder dataene.

Vi kan også bruge tildele () metode til at videregive data til visningerne. Der er absolut ingen forskel mellem visning () og tildele () metoder - vi kan vælge en af ​​dem:

tildele ("artikel", articleService.search (nøgleord));

Lad os kortlægge dataene i skabelonen:

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

7. Styring af afhængigheder

For at administrere objekter og forekomster bruger ActiveWeb Google Guice som en afhængighedsstyringsramme.

Lad os sige, at vi har brug for en serviceklasse i vores ansøgning; dette ville adskille forretningslogikken fra controllerne.

Lad os først oprette en serviceinterface:

offentlig grænseflade ArticleService {List getArticles (); Artikelsøgning (streng nøgleord); }

Og implementeringen:

public class ArticleServiceImpl implementerer ArticleService {public List getArticles () {return fetchArticles (); } offentlig artikelsøgning (streng nøgleord) {artikel ar = ny artikel (); ar.set ("titel", "Artikel med" + nøgleord); ar.set ("forfatter", "baeldung"); ar.set ("ord", "1250"); ar.setDate ("dato", Instant.now ()); returnere ar; }}

Lad os nu binde denne tjeneste som et Guice-modul:

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

Til sidst skal du registrere dette i applikationskonteksten og injicere det i controlleren efter behov:

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

Bemærk, at dette konfigurationsklassens navn skal være AppBootstrap og det skal være placeret i app.config pakke.

Endelig her er hvordan vi injicerer det i controlleren:

@Injicer privat ArticleService articleService;

8. Testning

Enhedstest til en ActiveWeb-applikation er skrevet ved hjælp af JSpec-biblioteket fra JavaLite.

Vi bruger org.javalite.activeweb.ControllerSpec klasse fra JSpec for at teste vores controller, og vi navngiver testklasserne efter en lignende konvention:

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

Bemærk, at navnet ligner den controller, den tester med en “Spec” i slutningen.

Her er testsagen:

@Test offentlig ugyldig nårReturnedArticlesThenCorrect () {anmodning (). Get ("index"); a (responsContent ()) .shouldContain ("Introduktion til muldyr"); }

Bemærk, at anmodning() metode simulerer opkaldet til controlleren og den tilsvarende HTTP-metode få(), tager handlingsnavnet som et argument.

Vi kan også overføre parametre til controlleren ved hjælp af params () metode:

@Test offentligt ugyldigt givetKeywordWhenFoundArticleThenCorrect () {anmodning (). Param ("nøgle", "Java"). Get ("søg"); a (responseContent ()) .shouldContain ("Artikel med Java"); }

For at overføre flere parametre kan vi også kæde metode med denne flydende API.

9. Implementering af applikationen

Det er muligt at implementere applikationen i enhver servletcontainer som Tomcat, WildFly eller Jetty. Selvfølgelig er den enkleste måde at implementere og teste på at bruge Maven Jetty plugin:

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

Den seneste version af pluginet er her.

Nu endelig - vi kan fyre op:

mvn anløbsbro: kør

10. Konklusion

I denne artikel lærte vi om de grundlæggende begreber og konventioner i ActiveWeb-rammen. Ud over disse har rammen flere funktioner og muligheder end det, vi har diskuteret her.

Se den officielle dokumentation for flere detaljer.

Og som altid er prøvekoden, der bruges i artiklen, tilgængelig på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

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