ActiveWebの概要
1. 概要
この記事では、動的WebアプリケーションまたはRESTフルWebサービスの開発に必要なすべてを提供するActiveweb(JavaLiteのフルスタックWebフレームワーク)について説明します。
2. 基本的な概念と原則
Activewebは、「設定より規約」を活用します。つまり、構成可能ですが、適切なデフォルトがあり、追加の構成は必要ありません。 クラス、メソッド、フィールドを特定の定義済み形式で命名するなど、いくつかの定義済み規則に従う必要があります。
また、ソースを再コンパイルして実行中のコンテナー(デフォルトではJetty)に再ロードすることにより、開発を簡素化します。
依存関係の管理では、DIフレームワークとしてGoogleGuiceを使用します。 Guiceの詳細については、guide hereをご覧ください。
3. Mavenセットアップ
4. アプリケーション構造
すでに説明したように、アプリケーション構造は特定の規則に従う必要があります。典型的なMVCアプリケーションの場合は次のようになります。
ご覧のとおり、controllers、service、config、およびmodelsは、appパッケージ内の独自のサブパッケージに配置する必要があります。
ビューはWEB-INF/viewsディレクトリに配置する必要があり、各ビューにはコントローラ名に基づいた独自のサブディレクトリがあります。 たとえば、app.controllers.ArticleControllerには、そのコントローラのすべてのビューファイルを含むarticle/サブディレクトリが必要です。
デプロイメント記述子またはweb.xmlには、通常、<filter>と対応する<filter-mapping>.が含まれている必要があります。フレームワークはサーブレットフィルターであるため、<servlet>構成ではなく、フィルター構成があります。
...
dispatcher
org.javalite.activeweb.RequestDispatcher
...
...
また、アプリケーションのデフォルトコントローラーを定義するために<init-param>root_controllerが必要です–homeコントローラーに似ています:
...
root_controller
home
...
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/example/article
複数の単語を含むコントローラー名(たとえば、app.controllers.PublishedArticleController.java)の場合、URLはアンダースコアを使用して区切られます。
http://host:port/contextroot/published_article
5.3. リクエストパラメータの取得
コントローラ内では、AppController class.からparam()またはparams()メソッドを使用してリクエストパラメータにアクセスします。最初のメソッドはString引数(取得するパラメータの名前)を取ります。
public void search() {
String keyword = param("key");
view("search",articleService.search(keyword));
}
必要に応じて、後で使用してすべてのパラメーターを取得できます。
public void search() {
Map criterion = params();
// ...
}
6. ビュー
ActiveWebの用語では、ビューはテンプレートと呼ばれることがよくあります。これは主に、JSPの代わりにApacheFreeMarkerテンプレートエンジンを使用しているためです。 FreeMarkerin our guide, hereの詳細を読むことができます。
テンプレートをWEB-INF/viewsディレクトリに配置します。 すべてのコントローラーには、その名前に必要なすべてのテンプレートを保持するサブディレクトリが必要です。
6.1. コントローラビューのマッピング
コントローラがヒットすると、デフォルトのアクションindex()が実行され、フレームワークはそのコントローラのビューディレクトリからWEB-INF/views/article/index.ftlテンプレートを選択します。 同様に、他のアクションの場合、ビューはアクション名に基づいて選択されます。
これは必ずしも私たちが望んでいることではありません。 内部ビジネスロジックに基づいていくつかのビューを返したい場合があります。 このシナリオでは、親org.javalite.activeweb.AppControllerクラスのwe can control the process with the render() method:
public void index() {
render("articles");
}
カスタムビューの場所も、そのコントローラの同じビューディレクトリ内にある必要があることに注意してください。 そうでない場合は、テンプレート名の前にテンプレートが存在するディレクトリ名を付けて、render()メソッドに渡します。
render("/common/error");
6.3. データ付きのビュー
ビューにデータを送信するために、org.javalite.activeweb.AppControllerはview()メソッドを提供します。
view("articles", articleService.getArticles());
これには2つのパラメーターが必要です。 最初に、テンプレート内のオブジェクトにアクセスするために使用されるオブジェクト名、2番目にデータを含むオブジェクト。
assign()メソッドを使用してデータをビューに渡すこともできます。 view()メソッドとassign()メソッドの間にまったく違いはありません。次のいずれかを選択できます。
assign("article", articleService.search(keyword));
テンプレートのデータをマッピングしてみましょう。
<@content for="title">Articles
...
<#list articles as article>
${article.title}
${article.author}
${article.words}
${article.date}
7. 依存関係の管理
オブジェクトとインスタンスを管理するために、ActiveWebは依存関係管理フレームワークとしてGoogle Guiceを使用します。
アプリケーションにサービスクラスが必要だとしましょう。これにより、ビジネスロジックがコントローラから分離されます。
まず、サービスインターフェースを作成しましょう。
public interface ArticleService {
List getArticles();
Article search(String keyword);
}
そして実装:
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", "example");
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 {
// ...
}
名前は、最後に「仕様」を付けてテストしているコントローラーに似ていることに注意してください。
テストケースは次のとおりです。
@Test
public void whenReturnedArticlesThenCorrect() {
request().get("index");
a(responseContent())
.shouldContain("Introduction to Mule ");
}
request()メソッドはコントローラーへの呼び出しをシミュレートし、対応するHTTPメソッドget(),はアクション名を引数として取ることに注意してください。
params()メソッドを使用してパラメーターをコントローラーに渡すこともできます。
@Test
public void givenKeywordWhenFoundArticleThenCorrect() {
request().param("key", "Java").get("search");
a(responseContent())
.shouldContain("Article with Java ");
}
複数のパラメーターを渡すために、この流APIなAPIでメソッドをチェーンすることもできます。
9. アプリケーションのデプロイ
アプリケーションは、Tomcat、WildFly、Jettyなどの任意のサーブレットコンテナにデプロイできます。 もちろん、Maven Jettyプラグインを使用して展開およびテストする最も簡単な方法は次のとおりです。
...
org.eclipse.jetty
jetty-maven-plugin
9.4.8.v20171121
manual
10000
...
プラグインの最新バージョンはhereです。
さて、ようやく–起動できます。
mvn jetty:run
10. 結論
この記事では、ActiveWebフレームワークの基本的な概念と規則について学びました。 これらに加えて、フレームワークには、ここで説明したよりも多くの機能があります。
詳細については、公式のdocumentationを参照してください。
そして、いつものように、記事で使用されているサンプルコードは利用可能なover on GitHubです。