1. 概要

この記事では、 Activeweb – JavaLiteのフルスタックWebフレームワーク–が動的WebアプリケーションまたはRESTフルWebサービスの開発に必要なすべてを提供することを説明します。

2. 基本的な概念と原則

Activewebは、「設定より規約」を活用しています。つまり、構成可能ですが、適切なデフォルトがあり、追加の構成は必要ありません。 クラス、メソッド、フィールドを特定の事前定義された形式で命名するなど、いくつかの事前定義された規則に従う必要があります。

また、ソースを再コンパイルして実行中のコンテナーに再ロードすることにより、開発を簡素化します(デフォルトではJetty)。

依存関係の管理には、DIフレームワークとしてGoogleGuiceを使用します。 Guiceの詳細については、ガイドをご覧ください。

3. Mavenのセットアップ

開始するには、最初に必要な依存関係を追加しましょう。

<dependency>
    <groupId>org.javalite</groupId>
    <artifactId>activeweb</artifactId>
    <version>1.15</version>
</dependency>

最新バージョンはここにあります。

さらに、アプリケーションをテストするには、activeweb-testing依存関係が必要です。

<dependency>
    <groupId>org.javalite</groupId>
    <artifactId>activeweb-testing</artifactId>
    <version>1.15</version>
    <scope>test</scope>
</dependency>

最新バージョンこちらをご覧ください。

4. アプリケーション構造

すでに説明したように、アプリケーション構造は特定の規則に従う必要があります。 典型的なMVCアプリケーションの場合は次のようになります。

ご覧のとおり、コントローラーサービス構成、およびモデルは、の独自のサブパッケージに配置する必要があります。 ]appパッケージ。

ビューはWEB-INF/ views ディレクトリに配置する必要があり、それぞれにコントローラ名に基づいた独自のサブディレクトリがあります。 たとえば、 app.controllers.ArticleController には、そのコントローラーのすべてのビューファイルを含む article/サブディレクトリが必要です。

デプロイメント記述子または web.xml 通常、 および対応するフレームワークはサーブレットフィルタであるため、 構成フィルター構成があります:

...
<filter>
    <filter-name>dispatcher</filter-name>
    <filter-class>org.javalite.activeweb.RequestDispatcher</filter-class>
...
</filter>
...

また、 root_controller アプリケーションのデフォルトコントローラを定義するには–に似ていますコントローラ:

...
<init-param>
    <param-name>root_controller</param-name>
    <param-value>home</param-value>
</init-param>
...

5. コントローラー

コントローラは、ActiveWebアプリケーションの主要コンポーネントです。 また、前述のように、すべてのコントローラーはapp.controllersパッケージ内に配置する必要があります。

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

コントローラがorg.javalite.activeweb.AppController。を拡張していることに注意してください

5.1. コントローラのURLマッピング

コントローラは、規則に基づいて自動的にURLにマップされます。 たとえば、ArticleControllerは次の場所にマップされます。

http://host:port/contextroot/article

これで、コントローラーのデフォルトのデフォルトアクションにマップされます。 アクションは、コントローラー内のメソッドに他なりません。 デフォルトのメソッドにindex():という名前を付けます

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

他のメソッドまたはアクションの場合は、URLにメソッド名を追加します。

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

URL:

http://host:port/contextroot/article/search

HTTPメソッドに基づいたコントローラーアクションを実行することもできます。 @ POST、@ PUT、@ DELETE、@ GET、@ HEADのいずれかでメソッドにアノテーションを付けるだけです。アクションにアノテーションを付けない場合、デフォルトではGETと見なされます。

5.2. コントローラのURL解決

フレームワークは、コントローラー名とサブパッケージ名を使用してコントローラーURLを生成します。 たとえば、 app.controllers.ArticleController.javaのURLは次のとおりです。

http://host:port/contextroot/article

コントローラがサブパッケージ内にある場合、URLは単純に次のようになります。

http://host:port/contextroot/baeldung/article

複数の単語を含むコントローラー名(たとえば、 app.controllers.PublishedArticleController.java )の場合、URLはアンダースコアを使用して区切られます。

http://host:port/contextroot/published_article

5.3. リクエストパラメータの取得

コントローラ内では、を使用してリクエストパラメータにアクセスできます param() また params() からのメソッド AppControllerクラス。 最初のメソッドは文字列引数を取ります–取得するパラメータの名前:

public void search() {

    String keyword = param("key");  
    view("search",articleService.search(keyword));

}

また、必要に応じて、後で使用してすべてのパラメーターを取得できます。

public void search() {
        
    Map<String, String[]> criterion = params();
    // ...
}

6. ビュー

ActiveWebの用語では、ビューはテンプレートと呼ばれることがよくあります。 これは主に、JSPの代わりにApache FreeMarkerテンプレートエンジンを使用しているためです。 FreeMarker の詳細については、ガイドのこちらをご覧ください。

テンプレートをWEB-INF/viewsディレクトリに配置します。 すべてのコントローラーには、必要なすべてのテンプレートを保持する名前のサブディレクトリが必要です。

6.1. コントローラビューのマッピング

コントローラがヒットすると、デフォルトのアクション index()が実行され、フレームワークは WEB-INF / views / article / index.ftltemplateを選択します。そのコントローラーのfromviewsディレクトリー。 同様に、他のアクションの場合、ビューはアクション名に基づいて選択されます。

これは必ずしも私たちが望むものではありません。 内部のビジネスロジックに基づいて、いくつかのビューを返したい場合があります。 このシナリオでは、 org.javalite.activeweb.AppController クラスのrender()メソッドを使用してプロセスを制御できます。

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

カスタムビューの場所も、そのコントローラーの同じビューディレクトリにある必要があることに注意してください。 そうでない場合は、テンプレート名の前にテンプレートが存在するディレクトリ名を付けて、 render()メソッドに渡します。

render("/common/error");

6.3. データ付きのビュー

ビューにデータを送信するために、 org.javalite.activeweb.AppControllerview()メソッドを提供します。

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

これには2つのパラメータが必要です。 まず、テンプレート内のオブジェクトにアクセスするために使用されるオブジェクト名、次にデータを含むオブジェクト。

assign()メソッドを使用して、ビューにデータを渡すこともできます。 view()メソッドとassign()メソッドの間にまったく違いはありません。次のいずれかを選択できます。

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

テンプレート内のデータをマッピングしてみましょう。

<@content for="title">Articles</@content>
...
<#list articles as article>
    <tr>
        <td>${article.title}</td>
        <td>${article.author}</td>
        <td>${article.words}</td>
        <td>${article.date}</td>
    </tr>
</#list>
</table>

7. 依存関係の管理

オブジェクトとインスタンスを管理するために、ActiveWebは依存関係管理フレームワークとしてGoogleGuiceを使用します。

アプリケーションにサービスクラスが必要だとしましょう。 これにより、ビジネスロジックがコントローラーから分離されます。

まず、サービスインターフェイスを作成しましょう。

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

そして実装:

public class ArticleServiceImpl implements ArticleService {

    public List<Article> 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;
    }
}

それでは、このサービスをGuiceモジュールとしてバインドしましょう。

public class ArticleServiceModule extends AbstractModule {

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

最後に、これをアプリケーションコンテキストに登録し、必要に応じてコントローラーに挿入します。

public class AppBootstrap extends Bootstrap {

    public void init(AppContext context) {
    }

    public Injector getInjector() {
        return Guice.createInjector(new ArticleServiceModule());
    }
}

この構成クラス名はAppBootstrapである必要があり、app.configパッケージに含まれている必要があることに注意してください。

最後に、これをコントローラーに注入する方法を示します。

@Inject
private ArticleService articleService;

8. テスト

ActiveWebアプリケーションの単体テストは、JavaLiteのJSpecライブラリを使用して記述されています。

JSpecのorg.javalite.activeweb.ControllerSpecクラスを使用してコントローラーをテストし、同様の規則に従ってテストクラスに名前を付けます。

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

名前は、テストしているコントローラーに似ており、最後に「Spec」が付いていることに注意してください。

テストケースは次のとおりです。

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

request()メソッドはコントローラーへの呼び出しをシミュレートし、対応するHTTPメソッド get()、はアクション名を引数として取ることに注意してください。

params()メソッドを使用して、パラメーターをコントローラーに渡すこともできます。

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

複数のパラメーターを渡すために、この流暢なAPIを使用してメソッドをチェーンすることもできます。

9. アプリケーションの展開

アプリケーションは、Tomcat、WildFly、Jettyなどの任意のサーブレットコンテナにデプロイできます。 もちろん、デプロイしてテストする最も簡単な方法は、MavenJettyプラグインを使用することです。

...
<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.8.v20171121</version>
    <configuration>
        <reload>manual</reload>
        <scanIntervalSeconds>10000</scanIntervalSeconds>
    </configuration>
</plugin>
...

プラグインの最新バージョンはこちらです。

さて、ついに–私たちはそれを起動することができます:

mvn jetty:run

10. 結論

この記事では、ActiveWebフレームワークの基本的な概念と規則について学びました。 これらに加えて、フレームワークには、ここで説明したものよりも多くの機能があります。

詳細については、公式のドキュメントを参照してください。

また、いつものように、この記事で使用されているサンプルコードは、GitHubから入手できます。