Inleiding tot ActiveWeb

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In dit artikel gaan we het Activeweb illustreren - een full-stack webframework van JavaLite - dat alles biedt wat nodig is voor de ontwikkeling van dynamische webapplicaties of REST-ful webservices.

2. Basisconcepten en principes

Activeweb maakt gebruik van "conventie boven configuratie" - wat betekent dat het configureerbaar is, maar redelijke standaardinstellingen heeft en geen aanvullende configuratie vereist. We hoeven alleen maar een paar voorgedefinieerde conventies te volgen, zoals het benoemen van klassen, methoden en velden in een bepaald voorgedefinieerd formaat.

Het vereenvoudigt ook de ontwikkeling door de bron opnieuw te compileren en opnieuw te laden in de actieve container (standaard Jetty).

Voor afhankelijkheidsbeheer gebruikt het Google Guice als het DI-framework; Bekijk onze gids hier voor meer informatie over Guice.

3. Maven-instellingen

Laten we om te beginnen eerst de nodige afhankelijkheden toevoegen:

 org.javalite activeweb 1.15 

De laatste versie vind je hier.

Bovendien hebben we voor het testen van de applicatie het activeweb-testen afhankelijkheid:

 org.javalite activeweb-testing 1.15 test 

Bekijk hier de laatste versie.

4. Applicatiestructuur

Zoals we hebben besproken, moet de applicatiestructuur een bepaalde conventie volgen; hier is hoe dat eruit ziet voor een typische MVC-applicatie:

Zoals we kunnen zien, controllers, onderhoud, config, en modellen moeten zich in hun eigen subpakket in het app pakket.

De weergaven moeten zich bevinden in WEB-INF / views directory, elk met een eigen subdirectory op basis van de naam van de controller. Bijvoorbeeld app.controllers.ArticleController zou een artikel/ submap met alle weergavebestanden voor die controller.

De deployment descriptor of de web.xml moet doorgaans een en de daarbij behorende . Omdat het framework een servletfilter is, in plaats van een configuratie er is een filterconfiguratie:

... verzender org.javalite.activeweb.RequestDispatcher ... ...

We hebben ook een root_controller om de standaardcontroller voor de toepassing te definiëren - vergelijkbaar met een huis verwerkingsverantwoordelijke:

... root_controller startpagina ...

5. Controllers

Controllers zijn de belangrijkste componenten van een ActiveWeb-applicatie; en, zoals eerder vermeld, moeten alle controllers zich in het app.controllers pakket:

openbare klasse ArticleController breidt AppController {// ...} uit

Merk op dat de controller uitschuift org.javalite.activeweb.AppController.

5.1. URL-toewijzing van controller

De controllers worden automatisch toegewezen aan een URL op basis van de conventie. Bijvoorbeeld, ArtikelController wordt toegewezen aan:

// host: poort / contextroot / artikel

Dit zou nu worden toegewezen aan de standaardactie in de controller. Acties zijn niets anders dan methoden binnen de controller. Noem de standaardmethode inhoudsopgave():

public class ArticleController breidt AppController uit {// ... public void index () {render ("artikelen"); } // ...}

Voor andere methoden of acties voegt u de naam van de methode toe aan de URL:

public class ArticleController breidt AppController uit {// ... public void search () {render ("search"); }}

De URL:

// host: poort / contextroot / artikel / zoeken

We kunnen zelfs controlleracties uitvoeren op basis van HTTP-methoden. Annoteer de methode gewoon met een van de twee @POST, @PUT, @DELETE, @GET, @HEAD. Als we een actie niet annoteren, wordt deze standaard als een GET beschouwd.

5.2. Controller URL-resolutie

Het framework gebruikt de naam van de controller en de naam van het subpakket om de controller-URL te genereren. Bijvoorbeeld app.controllers.ArticleController.java de URL:

// host: poort / contextroot / artikel

Als de controller zich in een subpakket bevindt, wordt de URL eenvoudigweg:

// host: poort / contextroot / baeldung / artikel

Voor een controllernaam met meer dan één woord (bijvoorbeeld app.controllers.PublishedArticleController.java), wordt de URL gescheiden met een onderstrepingsteken:

// host: poort / contextroot / gepubliceerd_artikel

5.3. Verzoekparameters ophalen

Binnen een controller krijgen we toegang tot de verzoekparameters met behulp van de param () of params () methoden uit de AppController-klasse. De eerste methode gebruikt een String-argument - de naam van de parameter die moet worden opgehaald:

openbare ongeldige zoekopdracht () {String trefwoord = param ("sleutel"); view ("zoeken", articleService.search (trefwoord)); }

En we kunnen de laatste gebruiken om alle parameters op te halen als we:

openbare ongeldige zoekopdracht () {Kaartcriterium = params (); // ...}

6. Bekeken

In ActiveWeb-terminologie worden weergaven vaak sjablonen genoemd; dit komt voornamelijk doordat het Apache FreeMarker-sjabloonengine gebruikt in plaats van JSP's. U kunt hier meer over FreeMarker lezen in onze gids.

Plaats de sjablonen erin WEB-INF / views directory. Elke controller zou een submap met zijn naam moeten hebben met alle sjablonen die ervoor nodig zijn.

6.1. Toewijzing van controllerweergave

Wanneer een controller wordt geraakt, is dit de standaardactie inhoudsopgave() wordt uitgevoerd en het framework kiest het WEB-INF / views / artikel /index.ftl sjabloon de map from views voor die controller. Evenzo zou voor elke andere actie de weergave worden gekozen op basis van de naam van de actie.

Dit is niet altijd wat we zouden willen. Soms willen we misschien wat standpunten retourneren op basis van interne bedrijfslogica. In dit scenario, we kunnen het proces regelen met de render () methode van de ouder org.javalite.activeweb.AppController klasse:

public void index () {render ("artikelen"); }

Merk op dat de locatie van de aangepaste weergaven zich ook in dezelfde weergavemap voor die controller moet bevinden. Als dit niet het geval is, voeg dan de naam van de sjabloon toe aan de mapnaam waarin de sjabloon zich bevindt en geef deze door aan het render () methode:

render ("/ common / error");

6.3. Weergaven met gegevens

Om gegevens naar de views te sturen, moet het org.javalite.activeweb.AppController biedt de visie() methode:

view ("artikelen", articleService.getArticles ());

Hiervoor zijn twee parameters nodig. Ten eerste de objectnaam die wordt gebruikt om toegang te krijgen tot het object in de sjabloon en ten tweede een object dat de gegevens bevat.

We kunnen ook gebruik maken van toewijzen() methode om gegevens door te geven aan de weergaven. Er is absoluut geen verschil tussen view () en toewijzen() methoden - we kunnen een van hen kiezen:

toewijzen ("artikel", articleService.search (trefwoord));

Laten we de gegevens in de sjabloon in kaart brengen:

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

7. Afhankelijkheden beheren

Om objecten en instanties te beheren, gebruikt ActiveWeb Google Guice als een framework voor afhankelijkheidsbeheer.

Laten we zeggen dat we een serviceklasse nodig hebben in onze applicatie; dit zou de bedrijfslogica scheiden van de controllers.

Laten we eerst een service-interface maken:

openbare interface ArticleService {List getArticles (); Artikel zoeken (String trefwoord); }

En de implementatie:

openbare klasse ArticleServiceImpl implementeert ArticleService {openbare lijst getArticles () {return fetchArticles (); } openbaar artikel zoeken (String trefwoord) {Artikel ar = nieuw artikel (); ar.set ("titel", "Artikel met" + trefwoord); ar.set ("auteur", "baeldung"); ar.set ("words", "1250"); ar.setDate ("date", Instant.now ()); terugkeer ar; }}

Laten we deze service nu binden als een Guice-module:

openbare klasse ArticleServiceModule breidt AbstractModule uit {@Override protected void configure () {bind (ArticleService.class) .to (ArticleServiceImpl.class) .asEagerSingleton (); }}

Registreer dit ten slotte in de toepassingscontext en injecteer het in de controller, zoals vereist:

public class AppBootstrap breidt Bootstrap uit {public void init (AppContext context) {} public Injector getInjector () {retourneer Guice.createInjector (new ArticleServiceModule ()); }}

Merk op dat de naam van deze configuratieklasse AppBootstrap en het moet zich in het app.config pakket.

Eindelijk, hier is hoe we het in de controller injecteren:

@Inject private ArticleService articleService;

8. Testen

Unit-tests voor een ActiveWeb-applicatie worden geschreven met behulp van de JSpec-bibliotheek van JavaLite.

We gebruiken de org.javalite.activeweb.ControllerSpec class van JSpec om onze controller te testen, en we noemen de testklassen volgens een vergelijkbare conventie:

openbare klasse ArticleControllerSpec breidt ControllerSpec {// ...} uit

Merk op dat de naam vergelijkbaar is met de controller die wordt getest met een "Spec" aan het einde.

Hier is de testcase:

@Test openbare ongeldig whenReturnedArticlesThenCorrect () {request (). Get ("index"); a (responseContent ()) .shouldContain ("Inleiding tot Mule"); }

Merk op dat de verzoek() method simuleert de aanroep naar de controller en de bijbehorende HTTP-methode krijgen(), neemt de actienaam als argument.

We kunnen ook parameters doorgeven aan de controller met behulp van de params () methode:

@Test openbare ongeldige gegevenKeywordWhenFoundArticleThenCorrect () {request (). Param ("sleutel", "Java"). Get ("zoeken"); a (responseContent ()) .shouldContain ("Artikel met Java"); }

Om meerdere parameters door te geven, kunnen we ook een kettingmethode gebruiken, met deze vloeiende API.

9. Implementatie van de applicatie

Het is mogelijk om de applicatie in elke servlet-container te implementeren, zoals Tomcat, WildFly of Jetty. De eenvoudigste manier om te implementeren en te testen is natuurlijk het gebruik van de Maven Jetty-plug-in:

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

De nieuwste versie van de plug-in is hier.

Nu, eindelijk - we kunnen het opstarten:

mvn steiger: run

10. Conclusie

In dit artikel hebben we geleerd over de basisconcepten en conventies van het ActiveWeb-framework. Naast deze heeft het framework meer functies en mogelijkheden dan wat we hier hebben besproken.

Raadpleeg de officiële documentatie voor meer details.

En, zoals altijd, is de voorbeeldcode die in het artikel wordt gebruikt, beschikbaar op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

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