KotlinとKtorでウェブサイトを作成する
コード例: tutorial-server-web-application
使用されているプラグイン:
このチュートリアルでは、Kotlin、Ktor、そして Thymeleafテンプレートを使ってインタラクティブなウェブサイトを構築する方法を紹介します。
実装をすべてサーバー側に保持し、マークアップのみをクライアントに送信したいと考える理由はたくさんあります。例えば、以下のようなものが挙げられます。
- シンプルさ - 単一のコードベースを維持するため。
- セキュリティ - 攻撃者に情報を提供する可能性のあるデータやコードがブラウザに置かれるのを防ぐため。
- サポート性 - レガシーブラウザやJavaScriptが無効なブラウザを含む、可能な限り幅広いクライアントが使用できるようにするため。
Ktorは、
前提条件
このチュートリアルは単独で行うこともできますが、RESTful APIの作成方法を学ぶために
IntelliJ IDEAをインストールすることをお勧めしますが、お好みの他のIDEを使用することもできます。
Hello Task Manager Webアプリケーション
このチュートリアルでは、
これらのプラグインを既存のプロジェクトに手動で追加することもできますが、新しいプロジェクトを生成し、以前のチュートリアルからのコードを徐々に組み込んでいく方が簡単です。必要なコードはすべて提供するので、以前のプロジェクトを手元に置く必要はありません。
Ktor Project Generator に移動します。
Project artifact フィールドに、プロジェクトアーティファクト名として com.example.ktor-task-web-app を入力します。
次の画面で、以下のプラグインを検索し、Addボタンをクリックして追加します。
- Routing
- Static Content
- Thymeleaf
プラグインを追加すると、プロジェクト設定の下に3つのプラグインがすべて表示されます。
Download ボタンをクリックして、Ktorプロジェクトを生成し、ダウンロードします。
- IntelliJ IDEA、または選択した別のIDEでプロジェクトを開きます。
- src/main/kotlin/com/example に移動し、 model というサブパッケージを作成します。
- model パッケージ内に、新しい Task.kt ファイルを作成します。
Task.kt ファイルに、優先順位を表す
enum
と、タスクを表すdata class
を追加します。kotlinここでも、
Task
オブジェクトを作成し、表示可能な形式でクライアントに送信したいと考えます。思い出されるかもしれません。
- リクエストを処理しレスポンスを生成するチュートリアルでは、タスクをHTMLに変換するために手書きの拡張関数を追加しました。KtorでKotlinのルーティング、リクエスト処理、パラメータの基本を学び、タスクマネージャーアプリケーションを構築します。
- RESTful APIを作成するチュートリアルでは、KotlinとKtorを使用してバックエンドサービスを構築する方法を学び、JSONファイルを生成するRESTful APIの例を紹介します。
Task
クラスにkotlinx.serialization
ライブラリのSerializable
型をアノテーションしました。
この場合、私たちの目標は、タスクの内容をブラウザに書き込めるサーバーページを作成することです。
- plugins パッケージ内の Templating.kt ファイルを開きます。
configureTemplating()
メソッドに、以下に示すように/tasks
のルートを追加します。kotlinサーバーが
/tasks
へのリクエストを受信すると、タスクのリストを作成し、それをThymeleafテンプレートに渡します。ThymeleafContent
型は、トリガーしたいテンプレートの名前と、ページでアクセス可能にしたい値のテーブルを受け取ります。メソッドの先頭にあるThymeleafプラグインの初期化を見ると、Ktorがサーバーページのために templates/thymeleaf 内を検索することがわかります。静的コンテンツと同様に、このフォルダが resources ディレクトリ内にあることを想定しています。また、 .html のサフィックスを想定しています。
この場合、
all-tasks
という名前はsrc/main/resources/templates/thymeleaf/all-tasks.html
のパスにマッピングされます。- src/main/resources/templates/thymeleaf に移動し、新しい all-tasks.html ファイルを作成します。
all-tasks.html ファイルを開き、以下のコンテンツを追加します。
htmlIntelliJ IDEAで実行ボタン (
) をクリックしてアプリケーションを開始します。
ブラウザでhttp://0.0.0.0:8080/tasksに移動します。以下に示すように、現在のすべてのタスクがテーブルに表示されるはずです。
すべてのサーバーページフレームワークと同様に、Thymeleafテンプレートは静的コンテンツ(ブラウザに送信される)と動的コンテンツ(サーバーで実行される)を混在させます。もし Freemarker のような代替フレームワークを選択していたら、わずかに異なる構文で同じ機能を提供できたでしょう。
GETルートを追加する
サーバーページの要求プロセスに慣れたので、以前のチュートリアルからの機能をこのチュートリアルに転送し続けます。
Static Content プラグインを含めたため、以下のコードが Routing.kt ファイルに存在します。
これは、例えば/static/index.html
へのリクエストが、以下のパスからコンテンツを提供されることを意味します。
src/main/resources/static/index.html
このファイルはすでに生成されたプロジェクトの一部であるため、追加したい機能のホームページとして使用できます。
src/main/resources/static 内の index.html ファイルを開き、その内容を以下の実装に置き換えます。
htmlIntelliJ IDEAで再実行ボタン (
) をクリックしてアプリケーションを再起動します。
ブラウザでhttp://localhost:8080/static/index.htmlに移動します。タスクの表示、フィルタリング、作成を可能にするリンクボタンと3つのHTMLフォームが表示されるはずです。
name
またはpriority
でタスクをフィルタリングする場合、GETリクエストを通じてHTMLフォームを送信していることに注意してください。これは、パラメータがURLの後にクエリ文字列として追加されることを意味します。例えば、
Medium
優先度のタスクを検索する場合、サーバーに送信されるリクエストは以下のようになります。http://localhost:8080/tasks/byPriority?priority=Medium
タスクのリポジトリは、前のチュートリアルのものと同一のままで構いません。
model パッケージ内に新しい TaskRepository.kt ファイルを作成し、以下のコードを追加します。
- src/main/kotlin/com/example/plugins にある Templating.kt ファイルに移動します。
現在の
configureTemplating()
のバージョンを以下の実装に置き換えます。kotlin上記のコードは次のように要約できます。
/tasks
へのGETリクエストでは、サーバーはリポジトリからすべてのタスクを取得し、 all-tasks テンプレートを使用してブラウザに送信される次のビューを生成します。/tasks/byName
へのGETリクエストでは、サーバーはqueryString
からパラメータtaskName
を取得し、一致するタスクを見つけ、 single-task テンプレートを使用してブラウザに送信される次のビューを生成します。/tasks/byPriority
へのGETリクエストでは、サーバーはqueryString
からパラメータpriority
を取得し、一致するタスクを見つけ、 tasks-by-priority テンプレートを使用してブラウザに送信される次のビューを生成します。
これらすべてが機能するには、追加のテンプレートを追加する必要があります。
- src/main/resources/templates/thymeleaf に移動し、新しい single-task.html ファイルを作成します。
single-task.html ファイルを開き、以下のコンテンツを追加します。
html同じフォルダに、 tasks-by-priority.html という新しいファイルを作成します。
tasks-by-priority.html ファイルを開き、以下のコンテンツを追加します。
html
リポジトリを作成したので、GETリクエストのルートを実装できます。
POSTリクエストのサポートを追加する
次に、以下のことを行うために、/tasks
にPOSTリクエストハンドラーを追加します。
- フォームパラメータから情報を抽出する。
- リポジトリを使用して新しいタスクを追加する。
- all-tasksテンプレートを再利用してタスクを表示する。
- src/main/kotlin/com/example/plugins にある Templating.kt ファイルに移動します。
configureTemplating()
メソッド内に、以下のpost
リクエストルートを追加します。kotlinIntelliJ IDEAで再実行ボタン (
) をクリックしてアプリケーションを再起動します。
- ブラウザでhttp://0.0.0.0:8080/static/index.htmlに移動します。
Create or edit a task フォームに新しいタスクの詳細を入力します。
Submit ボタンをクリックしてフォームを送信します。 その後、新しいタスクがすべてのタスクのリストに表示されます。
次のステップ
おめでとうございます!これで、タスクマネージャーをWebアプリケーションとして再構築し、Thymeleafテンプレートの利用方法を習得しました。
Webソケットの操作方法を学ぶために、