このアーカイブは同期化されません。 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 によって画面に書き出されて表示されたのだ。