<% %>
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-catch、new によるインスタンス生成から
メソッド呼び出しまで 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>