このアーカイブは同期化されません。 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 のタグライブラリを使ってみよう。