2007 年 3 月 23 日 19 時 3 分

タグライブラリを使う


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


[写真]


タグライブラリは、その名前の通りライブラリであり、
一般的には JAR の形式で配布されている。

Web アプリケーションでタグライブラリを利用するためには、
まず、ライブラリに応じた JAR を用意しなければならない。

まず、Struts 1.3.5 のタグライブラリは、
Struts の配布アーカイブの中に含まれている。
ファイル名は「struts-taglib-1.3.5.jar」なので、
これを /WEB-INF/lib 内にコピーしておこう。

ところで、昨日は標準化されたタグライブラリである、
JSTL (JSP Standard Tag Library) の説明をした。

JSTL のライブラリは、Apache Jakarta Project にて、
Apache ライセンスによる実装を提供しているので、
以下からダウンロードして自由に利用することができる。
http://jakarta.apache.org/taglibs/

しかしながら、Struts のタグライブラリには、
JSTL と同じような機能を持つタグが定義されているため、
今回は JSTL は併用せず、Struts のタグを使うことにする。

一気に行くとややこしいので、
まずはフォームの検証で発生したエラーを、
JSP に表示できるように書き換えてみよう。

Struts の検証エラーメッセージは、
ActionErrors インスタンスとして、
特別なリクエスト属性に格納されている。

これを表示するためには、
Struts の HTML タグライブラリにある、
messages 要素を利用すれば良い。

========== /WEB-INF/pages/login.jsp ==========
<?xml version="1.0" encoding="UTF-8" ?>

<%@ page contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>
<%@ taglib prefix="html"
        uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="bean"
        uri="http://struts.apache.org/tags-bean" %>

<!DOCTYPE html PUBLIC
        "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
        xml:lang="ja" lang="ja">

<head>
    <meta http-equiv="Content-type"
            content="text/html; charset=UTF-8" />
    <title>struts-test ログイン</title>
</head>

<body>
    <h1>ログイン</h1>
    <ul style="color: red">
        <html:messages id="msg">
            <li><bean:write name="msg" /></li>
        </html:messages>
    </ul>
    <form action="./login.do" style="line-height: 2">
        <div>
            ユーザ名:
            <input type="text" name="user" value="" />
        </div>
        <div>
            パスワード:
            <input type="password" name="password" value="" />
        </div>
        <div>
            <input type="checkbox" name="persistent" value="y" />
            次回から入力を省略
        </div>
        <div>
            <input type="submit" value="ログイン" />
        </div>
    </form>
</body>

</html>
========== end of /WEB-INF/pages/login.jsp ==========

少し長くなったが、順番に見ていこう。

まず、taglib ディレクティブを使って、
タグライブラリを使うことを宣言する。
この JSP では、Struts のタグライブラリを 2 つ使う。

    <%@ taglib prefix="html"
            uri="http://struts.apache.org/tags-html" %>

    <%@ taglib prefix="bean"
            uri="http://struts.apache.org/tags-bean" %>

1 つは HTML タグライブラリである。
これは主に HTML のフォームや画面レイアウトの機能を持ち、
http://struts.apache.org/tags-html として識別される。

もう 1 つは Bean タグライブラリである。
これは Cookie や Header 等の各種データを扱う機能を持ち、
http://struts.apache.org/tags-bean として識別される。

上記では、それぞれ html、bean の接頭辞を割り当てた。
これらは単に標準的に使われているだけなので、
別に短い接頭辞を割り当てても構わない。

エラーメッセージを表示するためには、
HTML ライブラリの messages 要素を使う。

    <ul style="color: red">
        <html:messages id="msg">
            <li><bean:write name="msg" /></li>
        </html:messages>
    </ul>

messages 要素は、もし ActionErrors が存在すれば、
ActionErrors に含まれる各メッセージに対して、
繰り返し処理を行う機能を持つ。

messages 要素の内部には、
自由な HTML の断片を書くことができ、
繰り返し毎に使われるテンプレートとなる。
これにより、レイアウトを自由に調整できるのだ。

messages 要素の id 属性は、ループ変数の名前である。
messages 要素の内部では、ここで指定した名前で、
エラーメッセージを参照することができる。

    <li><bean:write name="msg" /></li>

Bean ライブラリの write 要素は、
name 属性で指定した名前を持つ変数の値を、
適切にエスケープした上でこの場所に出力する。

では、ログインフォームをブラウザで開き、
何も入力せずにログインボタンを押してみよう。
写真のようにエラーが表示されたはずだ。

確認のため、この画面のソースを眺めてみる。

    <ul style="color: red">
       
            <li>ユーザ名を入力してください。</li>
       
            <li>パスワードを入力してください。</li>
       
    </ul>

html:messages や bean:write は単なるタグではなく、
特殊な処理が行われていることが分かるはずだ。

何も入力しない場合、ユーザ名とパスワードで、
それぞれ 1 つずつの検証失敗メッセージが作成される。

ActionErrors には 2 つのメッセージが格納されているため、
html:messages が 2 回の繰り返しを行い、
bean:write によって画面に書き出されて表示されたのだ。



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