routesによるマッピング
それにしても、なぜクラス名はApplicationなのでしょう。またルートにアクセスすると、なぜindexアクションが呼び出されたのでしょうか。他の名前ではいけないのでしょうか。
その秘密は、「conf」フォルダにある「routes」ファイルにあります。このファイルを開くと、次のように記述されていることが分かります(#で始まるコメントは省略しました)。
GET / Application.index
GET /public/ staticDir:public
* /{controller}/{action} {controller}.{action}
これは、アクセスされた場所に関する情報を記述したものです。それぞれざっと意味を説明しておきましょう。
GET / Application.index:これは、/へのアクセスはApplication.indexを呼び出すことを示しています。これにより、ルート(/)にアクセスすると、Applicationクラスのindexが実行されていたのです。GET /public/ staticDir:public:これは、/public/へのアクセスは、静的ディレクトリのpublicにあるファイルが呼び出されることを示しています。これを記述することにより、/public/は(プログラムが呼び出されるのではなく)直接ファイルがそのまま表示されるようになります。* /{controller}/{action} {controller}.{action}:最後にあるのは、ワイルドカード(*)を使い、それ以外のすべての場合に、「/コントローラー/アクション」という形でアクセスされたら、コントローラークラスのアクションメソッドを呼び出すようにしています。例えば、先ほどのApplicationクラスのindexアクションは、正しくは「http://localhost:9000/application/index」とアクセスするのです。これで、Application内のindexが実行されます。
このように、routesに記述されたマッピング情報により、アクセスした場所と呼び出されるメソッドやファイルの関係が設定されていたのです。
フォームの送信
では、このindexアクションを書き換えて、Web利用の基本である「フォームを使ったデータの送受」からやってみることにしましょう。他のアクションを定義してもよいのですが、ここではindex自身にPOST送信して処理させることにしましょう。
まず、コントローラークラスのメソッドの修正からです。Applicationクラスのindexメソッドを次のように修正しましょう。
public static void index(String val) {
String msg = "";
if (request.method.equals("POST")) {
msg = "こんにちは、" + val + "さん。";
} else {
msg = "お名前をどうぞ。";
}
render(msg);
}
ここでは「request.method」という値を取得し、それがPOSTであるかどうかで異なる処理を行わせています。ここでは、「request.mothod」というものの値を調べ、それによって分岐を行っています。このmethodは、HTTPプロトコルによる送信メソッドの名前を返すものです。分かりやすくいえば、「GETかPOSTかを調べるもの」と考えればよいでしょう。
この値がPOSTだった場合には、送られてきた値を使ってテキストを作成します。ここでは引数にString valと指定がされています。これは「valというテキスト値のパラメータが送られてくる」ということを意味します。このようにアクションメソッドの引数を用意しておくことで、特定のパラメータで送られてくる情報が分かるというわけです。
こうして用意した変数msgを、renderする際に引数に渡します。これにより、valの値がレンダリングされるテンプレート側で利用できるようになります。
テンプレートとルートの修正
では、index.htmlのテンプレートを修正しましょう。今回は、indexメソッドのrenderで渡された値をページ内に表示させます。また肝心のフォームも用意が必要です。
#{extends 'main.html' /}
#{set title:'Home' /}
<div>${msg}</div>
<form method="post" action="@{Application.index}">
<input type="text" name="val" />
<input type="submit" value="送信" />
</form>
main.htmlをextendsしているため、追加する表示だけを作ればいいことが分かります。今回は、indexアクションのrender時に引数として渡された変数msgの値が、${msg}と記述して書き出されるようにしています。
その下には、フォームが用意されています。基本的には普通のフォームと同じですが、actionの設定が「action="@{Application.index}"」とされています。これにより、Applicaitonのindexアクションが指定されるようになります。
これで完成ですが、実はもう1つやっておくべきことがあります。それは、routesファイルへの追記です。indexは、ルート(/)にアクセスするようにしてありますので、action="@{Application.index}"もルートにアクセスされます。そこで、ルートにPOSTで送信された場合にも、Application.indexにマッピングされるように記述を追加しておきます。
POST / Application.index
このようにファイルに追記をしてください。これで完成です。なお、このroutesへの追記は通常は必要ありません。
完成したらブラウザからアクセスしてみましょう。入力フィールドが現れるので、ここに適当に書いて送信すると、メッセージが表示されます。

