Name
Password

Ymirの処理フロー

  • 2008-10-16 18:06:28

Ymirが行なう基本的な処理は、

  1. リクエストを受け取る
  2. サーブレットやビューテンプレートエンジンがHTMLをレンダリングする
  3. HTMLレスポンスを返す

という流れの2の手前のところにサーブレットフィルタを使って必要に応じて処理を挟み込むことです。具体的には、YmirはリクエストURIとJavaコンポーネント名のマッピング情報をもっており、受け取ったリクエストのURIに対応するJavaコンポーネントがSeasar2コンテナに存在すればそれを取り出してメソッドを呼び出してからビューテンプレートエンジンに処理を戻します。対応するコンポーネントが存在しない場合は何もしません。

処理の流れ

以下、具体的に説明します。

Ymirは例えば以下のようなURIとコンポーネント名とのマッピングパターンを一つまたは複数持っています。(説明を簡素化するため、実際のマッピングパターンとは異なるパターンを提示しています。なお、マッピングパターンはアプリケーション毎にカスタマイズすることも可能です。)

URI コンポーネント名 メソッド名
/([a-zA-Z][a-zA-Z0-9]*)\.jsp ${1}Page _${method}

表中、URIはWebアプリケーションのコンテキスト相対のパスで、パターンはJavaの正規表現です。コンポーネント名はURIに対応するJavaコンポーネント名のパターンで、${1}などの部分はURIパターンの中の括弧で囲われている部分に対応する部分文字列で置き換えられます。メソッド名は、コンポーネントについて呼び出すメソッドの名前です。${method}の部分はリクエストのHTTPメソッド名(getやpost)で置き換えられます。

例えばWebアプリケーションのコンテキストルートのURLがhttp://localhost:8080/appであるとします。http://localhost:8080/app/list.jspというURLがgetメソッドでリクエストされた場合、URIである/list.jspが上記パターン「/([a-zA-Z][a-zA-Z0-9]*)\.jsp」にマッチするか調べます。この場合マッチしますので、「listPage」という名前を持つコンポーネントをSeasar2コンテナから探します。コンポーネントが存在する場合、コンポーネントの「_get」というメソッドを呼び出します。通常_getメソッドの中では/list.jspの中で利用されるJavaBeanの準備等を行ないます。_getメソッドの呼び出しの後は、/list.jspというJSPページを処理するビューテンプレートエンジン(通常はJSPエンジン)に処理を遷移します。

一方、http://localhost:8080/app/image.jpgというURLがリクエストされた場合、URIである「/image.jpg」にマッチするパターンが存在しないため、Ymirは何もしません。そのため、単にサーブレットコンテナによって/image.jpgというコンテンツが返されることになります。

なお、今までの説明ではメソッド呼び出しの後はビューテンプレートエンジンに処理を遷移すると言いましたが、実際は呼び出しメソッドの返り値の型や値によってメソッド呼び出しの後の処理は変わります。例えば返り値の型がvoidである場合は、そのまま処理を継続してリクエストされたURIにマッチするサーブレットやビューテンプレートエンジンに処理を遷移します。また、返り値の型がStringでかつ返り値が「/」で始まる文字列の場合は、返り値に対応するリソースに処理をフォワードします。返り値が「redirect:」で始まる文字列の場合は、「redirect:」の後ろに書かれたURLにリダイレクトします。この呼び出しメソッドの返り値の型とメソッド呼び出し以降の処理の対応は、アプリケーション毎にカスタマイズすることができます。