SM実行の仕組み


SSM実行の仕組みを説明します。少々込み入っているので、SSM実行フロー図(PDF,8kb)を見ながら読んで下さい。

SSMの仕組の前提

SSMは、ウェブアプリケーションを構築ためのツールとして開発しました。その仕組は、以下の事が前提になっています。

ウェブアプリケーションの構成要素である個々のページは、

  1. 該当する URL へのリクエストをパラメータとともにまたはパラメータ無しで受け取り
  2. 1つの html ファイルの形で出力をクライアントに返す

この繰り返し(または組合せ)で、ウェブアプリケーションが構成されている。

つまり何が言いたいんじゃい、と言うと、「必ず、1つの html ファイルを返す」のが基本だと言うことです。
(応用としては、html 以外のファイルをダウンロードさせたり、別の URL に飛ばすためのヘッダを出力と言うのもあります。)

このため、表示の雛型となるhtmlファイルを1つのhtmlファイルとして記述してしまい、動的に値を出力する部分だけをプログラムで調整してやる、という方法で、システムが構築できるはずです。

SSM実行の構成要素

SSMは以下の構成要素が組み合わされて動作します。

ssm2 実行ファイルとなるperlスクリプト
SSM::common perl モジュール。スクリプト ssm2 内で use される。各種基本関数/エラー関数が定義してある。ssm2 実行の際の中核となる関数 parsehtmlwithfunc() もこのモジュールの関数。
html テンプレート ある URL へのリクエストに対し、クライアントに返される出力ページ(通常は hmtl 形式)の雛型です。全くそのままクライアントに返される部分と、スクリプト側で何らかの処理をしてから(例えば、値の埋め込みなど)クライアントに返される部分とを含みます。処理をしてから返す部分は、SSMタグで囲み、処理を行う関数およびパラメータ(非必須)を指定しておきます。
スクリプトファイル html テンプレート中のSSMタグで指定される関数を定義しておきます。処理開始後すぐに require されるので、ある URL のへリクエストの処理を行う際に必ず行う手続き(例えば、別のスクリプトの require やモジュールの use、初期値の設定、標準出力のバッファーコントロールやシグナルハンドラの指定など)を定義しておくことが可能です。

実行の流れ

  1. クライアントがある URL をリクエストする。そのリクエストは、下記のような形になる。
    http://localhost/cgi/ssm2/test/env.html

  2. このリクエストを受け取るのは、実行ファイル ssm2 、すなわち、webサーバ経由で見たときの
    http://localhost/cgi/ssm2
    である。

  3. 実行ファイル ssm2 は、 URL に含まれる残りの文字列
    /test/env.html
    を、環境変数を介して受け取る。

  4. ssm2 は受け取った文字列 /test/env.html から、対応するhtmlテンプレート名とスクリプトファイル名を解釈する。(htmlテンプレートとスクリプトファイルは、予め .ssmrc 内で設定したディレクトリ以下に設置しておく。)
    ファイル名解釈に失敗すると、エラーメッセージを表示して終了する(図中の「基本エラーチェック」)。

  5. 次に、htmlテンプレートとスクリプトファイルが読み込み可能かをチェックする。読み込み不可(ファイルが存在しない、パーミッションが無いなど)の場合、エラーメッセージを表示して終了する(図中の「基本エラーチェック」)。

  6. htmlテンプレートとスクリプトファイルが読み込み可能な場合、cgiクエリー文字列を一つのオブジェクトにパックする。
    (モジュール cgi を使用。)

  7. htmlテンプレート名、スクリプトファイル名、cgiクエリーオブジェクトの参照を引数として、関数 parsehtmlwithfunc()を呼び出す。

    1. parsehtmlwithfunc()はまず、スクリプトファイルの require を試みる。
      require に失敗した場合、エラーを示すパラメータを呼び出し元に戻す。

    2. スクリプトファイルの require が成功したら、次にhtmlテンプレートを open する。
      open に失敗した場合、エラーを示すパラメータを呼び出し元に戻す。

    3. htmlテンプレートの open に成功したら、htmlテンプレートの toke::parser オブジェクトを作成する。
      オブジェクト作成に失敗した場合、エラーを示すパラメータを呼び出し元に戻す。

    4. オブジェクト作成に成功すれば、ファイルの出力に移るが、htmlテンプレートが「html」タイプの場合、ファイルの出力に先立ち、httpヘッダを出力する。(詳細は、「サンプルテンプレート」を参照)

    5. htmlテンプレートを読み込みながら、通常のhtmlコーディングの場合は、そのまま標準出力に出力を行う。
      SSM開始タグに出会うと、まず、SSMタグ内に指定されているアトリビュートの名前と値を記憶し、その後、SSMタグに囲まれている文字列を記憶しながら、SSM終了タグに出会うまでhtmlテンプレートを読み込む。

    6. SSM終了タグに出会うと、SSMタグに囲まれた文字列、クエリー文字列をパックしたオブジェクトの参照、SSMタグ内に指定されたアトリビュートをパックしたオブジェクトの参照を引数として、SSMタグのfunctionアトリビュートで指定された関数を呼び出す。
      パッケージ名をつけない関数が指定された場合、スクリプトファイル内で指定された関数であることを想定して呼び出しを行う。

      1. 指定された関数が存在しない場合、呼び出しがエラーを返す。

      2. 指定された関数が存在すれば、そのまま関数実行。実行が終了すれば、真の値を返す。

    7. 真の値が帰ってこなかった場合、エラーがあったものとして、その関数名を記録しておく。
      htmlテンプレートが終端に達するまで、同じ事を繰り返す。ファイルが終端に達したら、ファイルを close して、真の値が返らなかった関数名を返す。

  8. エラーを表す値が返ってきたら、エラーメッセージを表示して終了する。エラーがなければ、何もせずに終了する。