2007 年 3 月 25 日 23 時 59 分

HTML タグライブラリの処理の流れ


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


通常のタグの代わりに HTML タグライブラリを使った場合、
どのような処理が行われているのか確認してみよう。

以下は、/WEB-INF/pages/login.jsp での処理の流れだ。

/WEB-INF/pages/login.jsp は直接アクセスできないため、
必ず他の Action 等から呼び出される形になる。

[ActionServlet]

1. 利用者が、/index.do にアクセスし、
    それが Struts の ActionServlet に渡される。

2. 設定ファイルより、/index.do の <action> を検索する。

3. 設定に従い、/WEB-INF/pages/login.jsp に転送する。

[JSP]

4. 転送により /WEB-INF/pages/login.jsp が呼び出される。

5. page や taglib ディレクティブを処理する。

6. ページを上から順に処理をしていく。
    タグライブラリのタグが見つかると、
    そのタグに対応するクラスを呼び出して処理を行う。
    それ以外は、タグも含めてそのまま書き出す

7. <html:html xhtml="true"> を展開する。
    例: <html xmlns="http://www.w3.org/1999/xhtml"
                lang="ja" xml:lang="ja">

8. <html:messages id="msg"> を展開する。
    ActionErrors が存在した場合、
    そこからメッセージを取り出して
    id 属性で指定された名前のページ属性に格納しながら、
    要素内容を繰り返し処理する。
    この場合、このタグ自身は何も書き出さない。

9. <bean:write name="msg" /> を展開する。
    このタグは、メッセージの数と同じ回数展開される。
    例: パスワードを入力してください。

10. </html:messages> タグを展開する。(終了タグ)
    この場合、このタグは何も書き出さない。

11. <html:form action="/login" ~> を展開する。
    例: <form id="loginForm" method="post"
                action="/struts-test/login.do"
                style="line-height: 2">

    11.1 action 属性で指定されたパスに対応した、
        <action path="/login"> を設定ファイルから検索する。
    11.2. name 属性に従い LoginForm のインスタンスを得て、
        それを「現在のフォーム」として記憶しておく。
        フォームのインスタンスは、フォームの名前である、
        「loginForm」というセッション属性から取り出すが、
        もしまだ LoginForm インスタンスが存在しなければ、
        新しい LoginForm インスタンスを作成して、
        それを初期化するため reset メソッドを呼び出し、
        最後に「loginForm」セッション属性に登録する。

12. <html:text property="user" /> を展開する。
    property 属性値が user なので、
    フォームの getUser() を呼び出して現在値を取得し、
    その値を value 属性に持つ <input> タグを書き出す。
    例: <input type="text" name="user" value="guest" />

13. <html:password property="password" ~/> を展開する。
    property 属性値が password だが、
    redisplay 属性値が false のため現在値は取得されず、
    空の値を value 属性に持つ <input> タグを書き出す。
    例: <input type="password" name="password" value="" />

14. <html:checkbox property="persistent" /> を展開する。
    property 属性値が persistent なので、
    フォームの getPersistent() を呼び出して、
    現在のチェック状態を取得し、true ならば、
    checked 属性が指定された <input> タグを書き出す。
    今回はチェックボックスを boolean として扱うため、
    html:checkbox の value 属性は省略したが、
    この場合出力する <input> の value 属性は on となる。
    例: <input type="checkbox" name="persistent"
                value="on" checked="checked" />

15. <html:submit>ログイン</html:submit> を展開する。
    property 属性がないため、単なる送信ボタンとなる。
    要素の中身は、ボタンのラベルとして利用され、
    出力される <input> の value 属性として設定される。
    例: <input type="submit" value="ログイン" />

16. </html:form> を展開する。(終了タグ)
    例: </form>

17. </html:html> を展開する。(終了タグ)
    例: </html>


長くなったが、以上のような流れとなっている。

タグライブラリのタグは、一見普通のタグに見えるのだが、
裏でライブラリのコードが動いており、
HTML を生成したり処理を実行したりしている。

ここでは <html:text> や <html:password> 等の
単純なものしか使わなかったが、
HTML ライブラリには他にも強力なタグがある。

<html:form> と中心とする、いわゆるフォーム系タグは、
Struts との連携を意識して作られており、
ActionForm の表示・編集を行うための、
UI パーツとしての役割が強いのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.