2007 年 3 月 22 日 18 時 46 分

JSP とタグライブラリ


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


今日は、JSP の方のお話だ。

JSP には、HTML をほぼそのまま記述することができるので、
デザインを考えながら画面を作ることができる利点がある。

しかし、動的に生成されるデータを埋め込む場合は、
多少面倒な記述が必要となってくる。
リクエストやセッションなどの属性を読み出して、
その値を加工して出力する必要があるからだ。

これを行うためには、式 <%= value %> や、EL 式 ${value}、
スクリプトレット <% code %> 等を使い、
Java コードを埋め込んで処理する必要があるのだが、
これらはあまりスマートではない。

JSP の組み込み機能だけを使って、
画面の設計を行うのは少々不便なのである。

そこで登場するのが、タグライブラリだ。
タグライブラリは、非常に JSP らしい拡張機能であり、
JSP ページ内に、XML タグの形で機能を記述する方法である。

埋め込まれたタグは、見た目は普通のタグなのだが、
そのままページの一部として送信されるわけではない。

JSP がページを処理する際に、これらのタグを見つけると、
タグの開発者が用意したコードが呼びだされるため、
そこで任意の処理を行うことができる。

説明だけではわかりにくいので、一つ例を示そう。

    1.

    <%=
        ((String)request.getParameter("user"))
                .replaceAll("&", "&")
                .replaceAll("<", "<")
                .replaceAll(">", ">")
                .replaceAll("\"", """)
    %>

    2.

    <%@ taglib prefix="c"
        uri="http://java.sun.com/jsp/jstl/core" %>
    <c:out value="<%= request.getParameter("user") %>" />

    3.

    <%@ taglib prefix="c"
        uri="http://java.sun.com/jsp/jstl/core" %>
    <c:out value="${param.user}" />

上記は、パラメータの「user」の値を出力するものだ。
全て同じ結果となるのだが、
その見た目がぜんぜん違うことに着目してほしい。

1 は、旧来の方法で処理を行ったものだ。
JSP は HTML だけに限った機構ではないため、
式によって出力する値は、自動的にエスケープされない。
そのため安全値を出力するためには、
自前で危険文字を変換する必要がある。

ユーティリティメソッドを呼び出すようにすれば、
若干読みやすくは書き直せるが、
それでも読みにくいことには違いはない。

2 や 3 は、JSP 標準タグライブラリを使って書いたものだ。
まず、taglib ディレクティブを使うことで、
タグライブラリを使うことを宣言する。
これは、ページの先頭で 1 度だけ宣言すれば良い。

uri 属性で使うタグライブラリを識別し、
prefix 属性でタグの接頭辞(XML 名前空間)を決める。

この場合、c の接頭辞を持つタグは、
JSP 標準タグライブラリで処理されることになる。

out タグは、value 属性で指定した値をエスケープし、
それをタグの場所に出力する機能を持っている。
なので、パラメータがエスケープされて書き出されるのだ。

なお、3 番は JSP の式の代わりに EL 式を使ったものだ。
さらに簡単になっていることが分かると思う。

このように、タグライブラリを使うと、
View の表現を作成するためのコードをページから追い出し、
保守性の高いページを書くことができるのである。

さて、タグライブラリは、標準化されたものも存在するが、
それ以外にも色々なものが開発されている。

特に Apache の Jakarta Taglibs プロジェクトでは、
数多くのタグライブラリが提供されている。
http://jakarta.apache.org/taglibs/

Struts も、JSP 用のタグライブラリを提供しており、
これを利用すると、Struts の検証機能と連動して動作する、
高機能な入力フォームを簡単に作ることができる。

明日は、Struts のタグライブラリを使ってみよう。



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