JSP リファレンス

<% %>
JSP 1.0 以降

SYNOPSIS

<% %>

説 明

JSP に スクリプトレット (Scriptlet) と呼ばれる Java コードを 記述します。

JSP に記述した内容は Java のコードに自動変換され、コンパイルされ、そして サーブレットとして実行されます。つまり以下のような膨大な HTML 出力コードを 裏で JSP プロセッサが自動生成しているわけです。

JSP
out.write("<html>\n<body>\n<h1>Welcome</h1>");
out.write("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">");
out.write("<tr><td>");
...

スクリプトレットはこの自動生成されるコード内にそのまま埋め込まれます。例えば以下の記述は:

JSP
<ol>
<% for(int i=0; i<10; i++){ %>
<li> hello, world
<% } %>
</ol>

以下のように変換されます。

JSP
out.write("<ol>");
for(int i=0; i<10; i++){
out.write("<li> hello, world");
}
out.write("</ol>");

もちろんループだけでなく条件分岐、try-catchnew によるインスタンス生成から メソッド呼び出しまで Java で行えることは全て行うことが出来ます。

スクリプトレット内では暗黙オブジェクト (Implicit Objects) と呼ばれるいくつかの変数が 事前に宣言されています。

暗黙オブジェクトクラス
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
exception java.lang.Throwable
※<%@page%> で isErrorPage="true" を指定した場合のみ
out javax.servlet.jsp.JspWriter
page java.lang.Object
pageContext javax.servlet.jsp.PageContext
request javax.servlet.ServletRequest
response javax.servlet.ServletResponse
session javax.servlet.http.HttpSession
※<%@page%> で session="true" を指定した場合のみ

スクリプトレットは JSP 1.1 の頃に非力な標準機能を補う目的で使用されてきましたが、 大量のスクリプトレットが挿入された JSP ソースは可視性が極めて悪く、バグの温床となってきたのも 事実です。JSP 2.0 から利用できる EL や JSTL を活用すればスクリプトレットにほとんど頼らなくても 機能を満たすことができます。ツールや検証程度の作り捨て JSP でもなければ、スクリプトレットの 使用をなるべく排除する方向でサイトの設計を行ってください。

参照: <%= %> 

使用例

JSP の内容がキャッシュされないよう HTTP ヘッダを設定します。 スクリプトレットの中では通常の Java コメントを使用します。
JSP
<%
// キャッシュを無効化
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0L);
%>
ブロック (中括弧) はスクリプトレット内で完結していなくてもかまいません。 実行環境でサポートしている全てのロケールを現地語で出力します。
JSP
<%@ page language="java"
    contentType="text/html;charset=UTF-8"
    pageEncoding="UTF-8" session="false" %>
<%@ page import="java.util.*" %>
...
<table border="1">
<%
Locale[] locale = Locale.getAvailableLocales();
for(int i=0; i<locale.length; i++){
%>
<tr>
<td><%= locale[i].toString() %></td>
<td><%= locale[i].getDisplayName() %></td>
<td><%= locale[i].getDisplayName(locale[i]) %></td>
</tr>
<% } %>
</table>
CVS 2008/03/09