DATE : 2007/06/08 (Fri)
JSTL Core タグライブラリ の c:url を使用すると、URL を変数に記憶しておくことができます。しかも、「/」から始まる絶対パスを指定した場合、ルートはコンテキストルートとなります。
これは JSF を使用しているページに a タグで直接 URL を埋め込む場合にとても便利です。JSF は post-back で動作するため、JSF 上で次のページに遷移した場合の URL は前のページの URL となります。すると、a タグに相対パスを指定した場合、リンクの内容は遷移元のページの URL からの相対パスとなります。これでは、全ページがコンテキストルート直下に存在しないと、遷移元のページのあったディレクトリによってリンクの内容が変化してしまいます。かと言って、絶対パスを埋め込んだ場合、開発用サーバ上から公開用サーバにページを移す場合に、リンク中の絶対パスを全て公開用サーバのものに置き換えなければなりません。
c:url を使えばこの問題は解決できます。「/」から始まる絶対パスのルートはコンテキストルートなので、「/」から始まるパスを埋め込んでおけば公開用サーバに移す場合でもリンクを修正する必要がありません。
c:url を使うには、page ディレクティブて EL 式を有効にし、 taglib ディレクティブで JSTL Core タグライブラリの使用を宣言します。(「...」は省略を表します)
<%@ page ... isELIgnored="false"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
value 属性に URL を、var 属性に変数名を指定することで、変数に URL を記憶できます。
<c:url var="top_url" value="/index.jsp" />
この変数は次のような EL 式で参照できます。
${top_url}
つまり、a タグに c:url で変数に記憶させた URL を指定するには、次のようになります。
<a href="${top_url}">...</a>
私は、トップページなどの特殊な URL を別の JSP ファイルで記憶させています。そして実際にその URL を使用するページでその JSP ファイルを取り込んで、EL 式から URL を参照しています。よく使う URL を1ファイルにまとめられるので、管理が楽になります。