Powered by SmartDoc

タグライブラリとJSP

タグライブラリとは

JSPでは、ユーザが自分でJSP内のタグを定義できます。こうしたタグのことを、「カスタム・タグ」と言います。

カスタム・タグによって、これまでスクリプトレットとして書いていたプログラムを、JSPの要素に閉じ込めることができ、HTMLが見やすくなります。

いくつかの関連する複数のタグは、1つの「タグライブラリ」にまとめられます。タグライブラリは、タグの処理を記述するJavaのプログラムと、タグに関する情報を持つTag Library Descriptor (TLD)というXMLファイルによって構成されています。

JSTL

JSTL とは

既存のタグライブラリとしては、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 1.1の"Core Tags"を使った例を紹介します。

タグのエンコード

フォームで入力したデータをWebブラウザ上に出力するサンプルです。

JSTLTest.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/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/jsp/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を利用するためには、JSTLの配布パッケージのlibフォルダに含まれている次の2つのjarファイルをWEB-INF/libフォルダにコピーします。