JSPでは、ユーザが自分でJSP内のタグを定義できます。こうしたタグのことを、「カスタム・タグ」と言います。
カスタム・タグによって、これまでスクリプトレットとして書いていたプログラムを、JSPの要素に閉じ込めることができ、HTMLが見やすくなります。
いくつかの関連する複数のタグは、1つの「タグライブラリ」にまとめられます。タグライブラリは、タグの処理を記述するJavaのプログラムと、タグに関する情報を持つTag Library Descriptor (TLD)というXMLファイルによって構成されています。
既存のタグライブラリとしては、Jakarta Taglibs (http://jakarta.apache.org/taglibs/index.html)や、JavaServer Pages Standard Tag Library (JSTL) (http://java.sun.com/products/jsp/jstl/)が著名です。また、後で説明するJakarta Strutsにも独自のタグライブラリがあります。
このうち、現在いちばん使われているのがJSTLでしょう。JSTLには、値の設定・制御構造などのほか、データベースへのアクセス、国際化、XMLの解析などに関するタグが用意されています。
ここでは、JSTLの"Core Tags"を使った例を紹介します。
フォームで入力したデータをWebブラウザ上に出力するサンプルです。
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <html> <head> <title>JSTL の効果</title> </head> <body> <% request.setCharacterEncoding("Shift_JIS"); %> <p>JSTL の効果について調べましょう。</p> <p> c:out を使わない場合: <%= request.getParameter("title") %> </p> <p> c:out を使った場合: <c:out value="${param.title}" /> </p> </body> </html>
このサンプルでは、c:outというタグライブラリによって、"<"や"&"といった文字がエンコードされて出力されます。例えば、フォームで次のような文字列を入力したとしましょう。
<m>Wakhok</m>
この文字列は、HTMLのフォームによって"title"というパラメータに格納されるとします。
c:outというタグを利用した場合、ブラウザには次のように表示されます。
<m>Wakhok</m>
"<"や">"といった文字がエンコードされて出力されます。つまり、<m>や</m>はタグとしてではなく、ただの文字として解釈されています。
c:outというタグではなく、<%= ... %>を利用した場合、ブラウザには次のように表示されます。
Wakhok
<m>や</m>がタグとして解釈されてしまい、ブラウザに出力されません(もっとも、このmというタグには意味はありませんが)。
このように、タグの入力を許可してしまうと、クロスサイトスクリプティングを引き起こすことも考えられます。ですから、必要がない限りは、タグの入力を許可しない方がよいでしょう。
それでは、タグライブラリの使い方について見てみましょう。
まず次の部分で、利用するタグライブラリと、その接頭辞を指定します。ここでは、接頭辞に"c"という文字が指定されています。先に見た<c:out>というタグの"c:"は、この接頭辞です。
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
次の部分で、フォームから入力されたデータを出力しています。
<c:out value="${param.title}" />
<c:out>というタグは、値を出力するタグです。valueという属性値で指定したデータを出力します。このタグによって、"<"や">"といった文字がエンコードされて出力されます。
ここでのvalueの値が、
${param.title}
という見慣れないスタイルになっています。これは、
<% String data = request.getParameter("title"); >
というスクリプトレットど同じ意味です。
JSTLでは、次のような「式言語(Expression Language)」と呼ばれる表現が可能になっています。こうしたスタイルは、今後のJSPで正式に取り上げられます。
${var} ... 変数 var ${param.title} ... フォームから入力されたデータ "title" の値 ${book.author} ... book という Bean の author プロパティ
この例では、特定の文字をエンコードして出力しています。こうした処理をタグライブラリを使わずにJSPで実現するには、スクリプトレットを記述する必要があります。
タグライブラリを使って制御構造を記述できます。
ここで示すc:forEachというタグでは、ループの処理を行っています。
<c:forEach var="book" items="${bookList.iterator}" > ..... </c:forEach>
このタグは、items属性で与えられたCollection, Iteratorなどに含まれているオブジェクトを繰り返し処理します。ここでの${bookList.iterator}という式言語は、bookListというBeanのiteratorプロパティを示しています。このプロパティの型はjava.util.Iteratorです。
また、それぞれのオブジェクトは、bookという変数に入ります。
スクリプトレットを使わなければ書けなかったループの処理が、タグライブラリを使うことによってタグで書けるようになります。
JSTLを利用するためには、JSTLの配布パッケージのlibフォルダに含まれている次の4つのjarファイルをWEB-INF/libフォルダにコピーします。