JSTLの全体像を数時間で説明する入門です。JSTLとは何かを説明した後に、簡単なJSPとJSTLのソースコードを比較しながら学習します。
JSTL(Java Server Pages Standard Tag Library)とは、JSPのバージョン2.0で標準化されたタグの集まりです。サンマイクロシステムズが開発したので実質的な標準です。
すこし昔をおさらいしたいと思います。2000年ごろサーブレットが開発で利用されるようになりました。このころはサーブレットのAPIをつかいJavaのソースコードの中にHTMLを記述していました。当然ちょっと修正するのにもコンパイルが必要だったため、その要望の答えて、JSPが開発されました。JSPはご存知の通り、HTML内にソースコードを書くことが出来るので、修正に強くなりました。
しかし、便利でいろいろな開発に使われると、JSPでの組み込まれたソースコードが、可読性やデザイナとの関連で問題になりました。そのため、Javaのソースコードをなるべく書かないようにしようと各自タグの集まり(ライブラリ)を作るようになりました。その集大成のひとつとしてStrutsフレームワークがあげられます。
StrutsフレームワークにもJSTLをまったく同じ機能のタグがあります。このような便利なものは様々なところで乱立して作られていたので標準化団体がJSTLをして仕様を決め生み出されました。
このような背景から、JSTLは、JSPファイル内にソースコードを書かないようにするタグの集まりとなっています。
読みたい人。JSTLの細かい部分まで深く学ぶのではなく、ちょっとしたサンプルを見ながら全体像を理解したい人にお勧めです。
ここのサンプルをテストした動作環境です。
前提条件として、JDK,Tomatがインストールしていなければなりません。これらのインストールについては、WEB上に情報が多くありますのでここでは説明しません。http://japache.infoscience.co.jp/apache/dist/jakarta/taglibs/standard/からjakarta-taglibs-standard-1.0.3.tar.gzをダウンロードします。ダウンロードしたら中に何が入っているか確認してみましょう
# tar -zxvf jakarta-taglibs-standard-1.0.3.tar.gz
# cd jakarta-taglibs/standard-1.0.3/
| ディレクトリ名 | 備考 |
| README | このディレクトリの説明 |
| javadoc | |
| lib | jstl.jarなどがあります。開発の際はWEB-INF/libに置くようにします。(詳細はあとで説明) |
| standard-doc.war | JSTLの概要が書いてあります |
| standard-examples.war | サンプル集。 |
| tld | タグライブラリディスクリプタ |
私もそうですが、英語が読めなくてもjavaのソースであればなんとなく読めるという方は standard-doc.war,standard-examples.warをtomcatのwebappに置くことをお勧めします。 tomcatの初期設定の場合、warファイルを展開してくれます。
# cp *.war $CATALINA_HOME/webapp/.
展開されているのが確認できたら以下でアクセスしてみましょう。サンプルや概要が確認できます
http://127.0.0.1:8080/standard-doc
http://127.0.0.1:8080/standard-examples
これからサンプルを動作させるためのコンテキストを作成します。またそこにweb.xmlとindex.htmlを作成して 動作確認もします。
# cd $CATALINA_HOME/webapp
# mkdir -p test/WEB-INF
ここにweb.xmlを作成します。
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>bbs</display-name>
<description></description>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
<welcome-file-list>を記述したのでindex.htmlを適当に作成します。
<html lang="ja">
<head>
<title></title>
</head>
<body topmargin="0" bottommargin="0" rightmargin="0" leftmargin="0" marginwidth=
"0" marginheight="0" bgcolor="#eeeeee">
index.html
</body>
</html>
それでは、testコンテキストにアクセスしてテストしてみましょう。
http://127.0.0.1:8080/test/index.html
先ほど作成した$CATALINA_HOME/webapp/test/WEB-INFにlibディレクトリを作成します。 そこにJSTLのライブラリstandard.jarを配置します。
# jakarta-taglibs/standard-1.0.3/
# cd /opt/tomcat/webapps/test/WEB-INF
# mkdir lib
# cd lib
# cp XXX/jakarta-taglibs/standard-1.0.3/lib/
# cp /usr/local/src/jakarta-taglibs/standard-1.0.3/lib/standard.jar .
# cp /usr/local/src/jakarta-taglibs/standard-1.0.3/lib/jstl.jar .
お疲れ様です。これでようやくJSTL実行環境が整いました。
<%@ page content="text/html; charset=Shift_JIS" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<c:out value="HelloWorld!" />
2行目でJSTLのcoreを使えるように宣言。
3行目でHelloWorld!と出力している<%= "HelloWorld!" %>と同じ意味
JSTLは、JSPからスクリプトレットを排除することが目的のようです。
Javaでライブラリを利用するときはimport文を使います。JSTLでライブラリを使うということは、 サンマイクロシステムズ社が作ったタグの集まりを使うことになります。利用したい場合は、 taglib宣言をしなければいけません。
taglib宣言とimport文との違いは、パッケージ名を書くのではなく、uri属性にuri(url)を書くことです。 そしてプレフィックスを指定します。以下にサンプルを2つ書きました。プレフィックスが違うことに 注意してください。
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
プレフィックスがcなので、コアのJSTLライブラリを<c: xxx>という書き方で使えます。
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="sun_core" %>
この例の場合は、プレフィックスがsun_coreなので、コアのJSTLライブラリを<sun_core: xxx>という書き方で使えます。
プレフィックスというのは、このライブラリはこの接頭語を使って書きますよ。と宣言しているだけ ですので、ユーザが好きに指定できます。
| プレフィックス | 備考 | 宣言の仕方 |
| c | JSTLの一般的なタグ、入出力、分岐など | <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> |
| x | XMLデータを処理するタグ | <%@ taglib uri="http://java.sun.com/jstl/xml" prefix="xml" %> |
| fmt | 国際化のタグ | <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %> |
| sql | SQLを処理するタグ | <%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %> |
coreタグは、もっとも単純なタグの集まりで、htmlには存在しない分岐や繰り返し処理を可能にします。またJSPを 使う場合は、サーバとのデータのやり取りをJavaのオブジェクトを通しておこなうので、そのオブジェクトの任意のデータを 表示したり、オブジェクトを開放したりするタグなどがあります。以下がライブラリの一覧になります。
| JSTL | JSP | 備考 |
| <c:out> | <%= %>または<% out.println("hoge"); %> | コードをHTMLに出力するために利用 |
| <c:set> | <jsp:useBean /> | データをオブジェクトに格納する |
| <c:remove> | オブジェクトの削除 | |
| <c:catch> | 例外の取得 | |
| <c:if> | if分岐 | |
| <c:choose> | whenタグ、chooseタグを利用する時に囲む | |
| <c:when> | select文などのように複数分岐する時に利用 | |
| <c:otherwise> |
JSTLとJSPのサンプルで、違いを確認していきたいと思います。JSTLでコーディングすると、タグだけになるので、JSPのスクリプトレット記述よりも読みやすいのがわかると思います。
<c:out>と<c:set>
<c:set>は、変数を定義するものです。この例だとscope="page"と指定しているのでこのページのみで参照できる変数hogehogeを値fugafugaとして定義しています。その後、<c:out>で表示しています。
| JSTLのサンプル | JSPのサンプル | ||
|
|
<c:remove>
オブジェクトの開放には、<c:remove>を使います。以下の例は、<c:set>でpageスコープにString hogehoe = "fugafuga"と定義して、そのご <c:remove>を呼ぶことでhogehoge = nullのような開放を行っています。その後、 <c:out>で値を表示しても"fugafuga"とは表示されません。
|
|
<c:catch>と<c:if>
分岐処理には、<c:if>を使います。また例外の補足には、<c:catch>を使います。例外を発生させるタグは存在しないためデバッグなどで意図的に例外を発生させたい場合は、JSPのように<%でスクリプトレットを記述する必要があります。
|
|
<c:choose><c:when><c:otherwise>
通常プログラミング言語にはcase文が備えられています。JSTLではchoose,when,otherwiseを使うことで同じ事ができます。
|
|
| JSTL | JSP | 備考 |
| <c:forEach> | オブジェクトのイテレート。ArrayListのデータ取出しなどで利用。 | |
| <c:forTokens> | デミリタで区切る。Stringをカンマで区切るときなどに利用。 |
<c:forEach>を使った繰り返し処理の例です。JSPが生まれたときは、JSPファイル内に直接ソースコードを埋め込む事で 繰り返し処理をしていました。JSTLの場合はタグが用意されています。
サンプルでは、分かりやすいように、テストデータを<% xx %>と書かれているスクリプトレットで書いていますが、 実際のソースコードでは、この部分がなくなるので、HTMLとJSTLのタグのみで読みやすいソースコードになります。
| JSTLのサンプル | JSPのサンプル | ||
|
|
国際化したサイトを作る場合には、HTMLやJSPに直接日本語や英語を書かず、外部ファイルに記述しておいたほうがよい場合があります。こういう場合は、リソースバンドルという機能を使います。JSPの場合は、JavaのAPIから直接ResourceBundleクラスを呼び出さなければなりません。けれどJSTLの場合はリソースバンドル用のタグが用意されています。
| JSTL | JSP | 備考 |
| <fmt:setLocale> | ||
| <fmt:bundle> | ||
| <fmt:setBundle> | 利用するリソースを指定します。通常はプロパティファイルになるとおもいます。 | |
| <fmt:message> | メッセージキーを指定します。 | |
| <fmt:param> | ||
| <fmt:requestEncoding> |
| JSTLのサンプル | JSPのサンプル | ||
|
|
| JSTLのサンプル | JSPのサンプル | ||
|
RequestスコープのオブジェクトやSessionスコープのオブジェクトを使うと、Requestのヘッダ情報やクッキーの情報など を入手することが可能です。JSPでは宣言しなくても暗黙オブジェクトとして直ぐ使うことが出来ました。JSTLでも同様に 使うことが出来ます。またJSTLの暗黙オブジェクトの方が簡単に使えるように設計されています。
以下に暗黙オブジェクトの一覧を記述します。
| JSTL | JSP |
| pageScope | pageContext |
| requestScope | request |
| sessionScope | session |
| applicationScope | application |
| param.xxx | request.getParameter("xxx") |
| paramValues | request.getParameterValues()#Enumeration |
| header | getHeader? |
| headerValues | ? |
| initParam | ? |
| cookie | ? |
| PageContext | can get all properties |
sessonオブジェクトを使ったセッションのサンプル
| JSTLのサンプル | JSPのサンプル | ||
|
|
自分で作成したBeanをセッションとして使うサンプル
| JSTLのサンプル | JSPのサンプル | ||
|
|
セッション用のBean
|
$Id$