Einführung in ActiveWeb

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem Artikel werden wir das Activeweb - ein Full-Stack-Webframework von JavaLite - veranschaulichen, das alles bietet, was für die Entwicklung dynamischer Webanwendungen oder REST-vollständiger Webdienste erforderlich ist.

2. Grundlegende Konzepte und Prinzipien

Activeweb nutzt "Konvention über Konfiguration" - was bedeutet, dass es konfigurierbar ist, aber sinnvolle Standardeinstellungen hat und keine zusätzliche Konfiguration erfordert. Wir müssen nur einige vordefinierte Konventionen befolgen, z. B. das Benennen von Klassen, Methoden und Feldern in einem bestimmten vordefinierten Format.

Es vereinfacht auch die Entwicklung, indem die Quelle neu kompiliert und in den laufenden Container geladen wird (standardmäßig Jetty).

Für das Abhängigkeitsmanagement wird Google Guice als DI-Framework verwendet. Um mehr über Guice zu erfahren, schauen Sie sich unseren Leitfaden hier an.

3. Maven Setup

Fügen Sie zunächst die erforderlichen Abhängigkeiten hinzu:

 org.javalite activeweb 1.15  

Die neueste Version finden Sie hier.

Zum Testen der Anwendung benötigen wir außerdem die Activeweb-Testabhängigkeit :

 org.javalite activeweb-testing 1.15 test 

Schauen Sie sich hier die neueste Version an.

4. Anwendungsstruktur

Wie bereits erwähnt, muss die Anwendungsstruktur einer bestimmten Konvention entsprechen. So sieht das für eine typische MVC-Anwendung aus:

Wie wir sehen können, sollten sich Controller , Service , Konfiguration und Modelle in einem eigenen Unterpaket im App- Paket befinden.

Die Ansichten sollten sich im Verzeichnis WEB-INF / views befinden , wobei jedes über ein eigenes Unterverzeichnis verfügt, das auf dem Controller-Namen basiert. Zum Beispiel sollte app.controllers.ArticleController ein Artikel- / Unterverzeichnis haben, das alle Ansichtsdateien für diesen Controller enthält.

Der Deployment-Deskriptor oder die Datei web.xml sollten normalerweise a enthaltenund die entsprechenden . Da das Framework ein Servlet-Filter ist, anstelle einesKonfiguration gibt es eine Filterkonfiguration:

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

Wir brauchen auch eine root_controller zum Definieren des Standard-Controllers für die Anwendung - ähnlich einem Home- Controller:

...  root_controller home  ...

5. Steuerungen

Controller sind die Hauptkomponenten einer ActiveWeb-Anwendung. Wie bereits erwähnt, sollten sich alle Controller im Paket app.controllers befinden :

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

Beachten Sie, dass der Controller org.javalite.activeweb.AppController erweitert.

5.1. Controller-URL-Zuordnung

Die Controller werden basierend auf der Konvention automatisch einer URL zugeordnet. Beispielsweise wird ArticleController wie folgt zugeordnet:

//host:port/contextroot/article

Dies würde sie nun dem Standard einer Standardaktion im Controller zuordnen. Aktionen sind nichts anderes als Methoden innerhalb des Controllers. Nennen Sie die Standardmethode index ():

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

Bei anderen Methoden oder Aktionen hängen Sie den Methodennamen an die URL an:

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

Die URL:

//host:port/contextroot/article/search

Wir können sogar Controller-Aktionen basierend auf HTTP-Methoden durchführen. Kommentieren Sie die Methode einfach mit @POST, @PUT, @DELETE, @GET, @HEAD. Wenn wir eine Aktion nicht mit Anmerkungen versehen, wird sie standardmäßig als GET betrachtet.

5.2. Controller-URL-Auflösung

Das Framework verwendet den Controller-Namen und den Unterpaketnamen, um die Controller-URL zu generieren. Zum Beispiel app.controllers.ArticleController.java die URL:

//host:port/contextroot/article

Befindet sich der Controller in einem Unterpaket, lautet die URL einfach:

//host:port/contextroot/baeldung/article

Bei einem Controllernamen mit mehr als einem Wort (z. B. app.controllers.PublishedArticleController.java ) wird die URL durch einen Unterstrich getrennt:

//host:port/contextroot/published_article

5.3. Anforderungsparameter abrufen

Innerhalb eines Controllers erhalten wir Zugriff auf die Anforderungsparameter mit den Methoden param () oder params () aus der AppController-Klasse. Die erste Methode verwendet ein String-Argument - den Namen des abzurufenden Parameters:

public void search() { String keyword = param("key"); view("search",articleService.search(keyword)); }

Und wir können das später verwenden, um alle Parameter zu erhalten, wenn wir müssen:

public void search() { Map criterion = params(); // ... }

6. Ansichten

In der ActiveWeb-Terminologie werden Ansichten häufig als Vorlagen bezeichnet. Dies liegt hauptsächlich daran, dass anstelle von JSPs die Apache FreeMarker-Vorlagen-Engine verwendet wird. Weitere Informationen zu FreeMarker finden Sie in unserem Handbuch hier.

Platzieren Sie die Vorlagen im Verzeichnis WEB-INF / views . Jeder Controller sollte über ein Unterverzeichnis mit seinem Namen verfügen, das alle von ihm benötigten Vorlagen enthält.

6.1. Controller View Mapping

When a controller is hit, the default action index() gets executed and the framework will choose the WEB-INF/views/article/index.ftl template the from views directory for that controller. Similarly, for any other action, the view would be chosen based on the action name.

This isn't always what we would like. Sometimes we might want to return some views based on internal business logic. In this scenario, we can control the process with the render() method from the parent org.javalite.activeweb.AppController class:

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

Note that the location of the custom views should also be in the same view directory for that controller. If it is not the case, prefix the template name with the directory name where the template resides and pass it to the render() method:

render("/common/error");

6.3. Views With Data

To send data to the views, the org.javalite.activeweb.AppController provides the view() method:

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

This takes two params. First, the object name used to access the object in the template and second an object containing the data.

We can also use assign() method to pass data to the views. There is absolutely no difference between view() and assign() methods – we may choose any one of them:

assign("article", articleService.search(keyword));

Let's map the data in the template:

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

7. Managing Dependencies

In order to manage objects and instances, ActiveWeb uses Google Guice as a dependency management framework.

Let's say we need a service class in our application; this would separate the business logic from the controllers.

Let's first create a service interface:

public interface ArticleService { List getArticles(); Article search(String keyword); }

And the implementation:

public class ArticleServiceImpl implements ArticleService { public List getArticles() { return fetchArticles(); } public Article search(String keyword) { Article ar = new Article(); ar.set("title", "Article with "+keyword); ar.set("author", "baeldung"); ar.set("words", "1250"); ar.setDate("date", Instant.now()); return ar; } }

Now, let's bind this service as a Guice module:

public class ArticleServiceModule extends AbstractModule { @Override protected void configure() { bind(ArticleService.class).to(ArticleServiceImpl.class) .asEagerSingleton(); } }

Finally, register this in the application context and inject it into the controller, as required:

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

Note that this config class name must be AppBootstrap and it should be located in the app.config package.

Finally, here's how we inject it into the controller:

@Inject private ArticleService articleService;

8. Testing

Unit tests for an ActiveWeb application are written using the JSpec library from JavaLite.

We'll use the org.javalite.activeweb.ControllerSpec class from JSpec to test our controller, and we'll name the test classes following a similar convention:

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

Notice, that the name is similar to the controller it is testing with a “Spec” at the end.

Here's the test case:

@Test public void whenReturnedArticlesThenCorrect() { request().get("index"); a(responseContent()) .shouldContain("Introduction to Mule"); }

Notice that the request() method simulates the call to the controller, and the corresponding HTTP method get(), takes the action name as an argument.

We can also pass parameters to the controller using the params() method:

@Test public void givenKeywordWhenFoundArticleThenCorrect() { request().param("key", "Java").get("search"); a(responseContent()) .shouldContain("Article with Java"); }

To pass multiple parameters, we can chain method as well, with this fluent API.

9. Deploying the Application

Es ist möglich, die Anwendung in jedem Servlet-Container wie Tomcat, WildFly oder Jetty bereitzustellen. Der einfachste Weg zum Bereitstellen und Testen wäre natürlich die Verwendung des Maven Jetty-Plugins:

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

Die neueste Version des Plugins ist hier.

Jetzt endlich - wir können es starten:

mvn jetty:run

10. Schlussfolgerung

In diesem Artikel haben wir die grundlegenden Konzepte und Konventionen des ActiveWeb-Frameworks kennengelernt. Darüber hinaus verfügt das Framework über mehr Funktionen und Fähigkeiten als hier beschrieben.

Weitere Informationen finden Sie in der offiziellen Dokumentation.

Und wie immer ist der im Artikel verwendete Beispielcode auf GitHub verfügbar.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs