minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

JSP2.0の構文を説明します。
ちなみに、Tomcatでは5からJSP2.0に対応しています。

コメントの記述

<%-- comment --%>

コメントを記述します。
このコメントはサーブレットにコンパイルされる際には無視されます。
つまり、生成されるHTMLにコメントは出力されません。
HTMLにコメントを出力したい場合には、通常通りHTML形式のコメントを使います。

<!-- comment -->

定義文の記述

サーブレットクラスにフィールドやメソッドを定義することが出来ます。

<%!
  // 定義文の記述
  int value = 10;
  // メソッドの記述
  void func1() {
  }
%>
<%
  // 通常文の記述
  int localValue = 20;
  // 通常文中にメソッドは記述できません。
%>

上記のJSPにより生成されるサーブレットは例えば以下のようになります。

public Test_jsp extends HttpJspBase {
  
  // 定義文の記述
  int value = 10;
  // メソッドの記述
  void func1() {
  }
  
  /** JSPのエントリメソッド */
  public void _jspService(...) {
    ...
    // 通常文の記述
    int localValue = 20;
    // 通常文中にメソッドは記述できません。
    ...
  }
}

一つ注意点があります。
定義文で変数(フィールド)を定義した場合、その初期化が行われるのは
「最初の1回」だけになります。
なぜなら、通常JSPサーブレットはマルチスレッドモデルなので
JSPサーブレットのインスタンスは最初に1回しか生成されないからです。
毎回変数を初期化したい場合は、通常文中から初期化処理を行う必要があります。

最後に。JSP内に定義文やJavaロジックを記述することは極力避けましょう。
それによって、保守やデバッグが非常に困難になります。
Javaロジックはサーブレットと拡張タグライブラリ内に記述します。
JSP内にはJavaロジックを全く記述しないという事を心掛けて下さい。

EL式の記述

JSP2.0最大の特徴といえばやはりコレでしょう。
具体的には、Strutsでいうところの bean:write タグに似ています。
今までStrutsを使って

<bean:write name="obj" property="name" />

と記述していたところをEL式で記述すれば

${obj.name}

たったこれだけで済みます。
これでJSPの可読性を格段に上げる事が出来ます。

Java式の出力、Java文の記述

Java式(変数など)を出力するときには以下の記述を用います。

<%= Java式 %>

JSP内にJavaロジックを記述するときには以下の記述を用います。

<% Java文 %>

繰り返しになりますが、JSP内にJavaロジックの記述をしない為にも
これらの使用は極力控えましょう。
どうしても表示速度が必要な場合に限り使って下さい。
EL式を解釈する手間が無い分、こちらの方が若干高速になります。

しかし、あくまでも「若干」です。
どれだけの違いがあるかをきちんと測定した上で
本当にこの構文を使う価値があるのかどうかを見極めて下さい。

属性の定義

タグファイル(*.tag)内で属性を定義するときに使用します。
詳細は不明です。

<%@ attribute ... %>

静的なJSPファイルのインクルード

JSP内に、別のJSPファイルを埋め込むことが出来ます。
この場合、JSPから生成されるJavaサーブレットファイル内に直接埋ま込まれるので
ファイルサイズは大きくなりますが処理は高速になります。

<%@ include file="date.jsp" %>

ページ属性の定義

JSPファイルの属性を定義します。
記述形式は以下のようになります。

<%@ page ... %>

... の部分には、各属性を(何個でも)含めることができます。
一つにまとめてもいいですが、読みずらいので複数に分けた方が無難です。

以下、各属性の説明です。

language

使用する言語を指定します。
デフォルトは java であり、現在は他の値を使用することも出来ないので
省略しても構わないでしょう。

<%@ page language="java" %>

extends

このJSPファイルから生成されるJavaサーブレットクラスを格納する
パッケージ名を指定します。
省略すると、org.apache.jsp.[jspの相対パス] になります。

<%@ page extends="org.limy" %>

import

Javaインポート宣言を記述します。

java.lang.*
java.servlet.*
java.servlet.jsp.*
java.servlet.http.*

の4つは標準でインポートされるので、これらの宣言は必要ありません。

<%@ page import="org.limy.lib" %>

session

true(デフォルト)にすると、
JSPファイルにアクセスした際にセッションを生成します。
具体的には、以下の文を実行します。

request.getSession(true);

セッションを使わないJSPでは、明示的にfalseを指定しましょう。
そうしないと、必要の無いセッションが無駄に生成されてしまいます。

<%@ page session="false" %>

buffer

JSPの出力バッファを設定します。
デフォルトでは 8kb に設定されています。
この場合、JSPの出力が8kbを超えようとした時点で
クライアントに出力が送られて、バッファがクリアされます。
(ただし後述するオートフラッシュが有効の場合)

バッファサイズを大きくすることで、容量の大きいJSPを出力する際の
オーバーヘッドを軽減させることが出来ますが
その分クライアントが感じるレスポンスは悪くなります。

<%@ page buffer="128kb" %>

autoFlush

true(デフォルト)にすると、JSP出力のオートフラッシュが有効になります。
この場合、前項で説明したように
JSP出力がバッファサイズを超えようとすると自動的にバッファがフラッシュされます。

falseにした場合、JSP出力がバッファサイズを超えない段階で
明示的に out.flush() を実行する必要があります。
もしバッファサイズを超えて出力しようすると、オーバーフロー例外が発生します。
そのため、携帯サイト等ページサイズに制限のある場面では使えるかもしれません。

<%@ page autoFlush="false" %>

isThreadSafe

true(デフォルト)にすると、JSPはスレッドセーフだと見なされます。
falseにした場合、JSPから生成されるJavaサーブレットファイルには
SingleThreadModel がインプリメントされます。

<%@ page isThreadSafe="false" %>

info

JSPから生成されるJavaサーブレットクラスの情報を設定します。
この情報は、servlet.getServletInfo() メソッドにより取得することが出来ます。

<%@ page info="Servlet information." %>

errorPage

JSP内で例外が発生した場合に遷移するエラーページを指定します。

<%@ page errorPage="/error.jsp" %>

isErrorPage

このJSPがエラーページかどうかを指定します。
trueにした場合、exception という変数に例外情報が格納されます。

<%@ page isErrorPage="true" %>

contentType

このJSPに使用するコンテンツタイプを記述します。
デフォルトでは、text/html;charset=ISO-8859-1 になります。

なお、後述の pageEncoding を指定すると
自動的にコンテンツタイプの文字コードもそれに合わされて変更されるようです。
つまり、

<%@ page pageEncoding="EUC-JP" %>
<%@ page contentType="text/html;charset=EUC-JP" %>

と書かなくても

<%@ page pageEncoding="EUC-JP" %>

だけでOKということです。
なお、この挙動はTomcat5.5.9で確認しましたが
これがJSPの仕様かどうかは不明ですので、これに頼った記述はしない方がいいかもしれません。

pageEncoding

このJSPファイルの文字エンコーディングを指定します。
デフォルトでは、ISO-8859-1 になります。

<%@ page pageEncoding="EUC-JP" %>

isELIgnored

このJSP内で、EL文を無視するかどうかを指定します。
デフォルトはfalse(無視しない。つまり有効)です。

<%@ page isELIgnored="true" %>

タグファイル内でのページ属性の定義

タグファイル(*.tag)内でページ属性を定義するときに使用します。
詳細は不明です。

<%@ tag ... %>

タグライブラリ使用の宣言

このJSP内で使用する拡張タグライブラリの使用を宣言します。

uri

使用するタグライブラリのURI。
このURIは web.xml 内の taglib-uri 要素に記述してある必要があります。

prefix

このタグライブラリを識別するプレフィックスを指定します。
例えばプレフィックスを limy とした場合、
JSP内に現れる <limy:XXX> という部分が拡張タグとして解釈されます。

<%@ taglib uri="http://www.limy.org/taglib" prefix="limy" %>	

変数の宣言

タグファイル(*.tag)内で変数を定義するときに使用します。
詳細は不明です。

<%@ variable ... %>

フォワード先の指定

別のJSPファイルに処理を委ねます。

<jsp:forward page="/servlet/login" />

パラメータを渡すことも出来ます。

<jsp:forward page="/servlet/login">	
   <jsp:param name="username" value="jsmith" />	
</jsp:forward>

プロパティの取得、設定

初期のJSPではよく用いられた方法ですが、現在ではあまり使われていません。
代わりにEL式を使いましょう。

<jsp:getProperty name="calendar" property="username" />
<jsp:setProperty name="mybean" property="username" />	

beanの定義

これも、現在ではあまり使用しません。
Javaサーブレット内にローカル変数を定義する際に使います。
記述を見てわかるように、クラス名を指定する必要があるので
好ましくありません。代わりにEL式を使いましょう。

<jsp:useBean id="cart" scope="session" class="session.Carts" />	

動的なJSPファイルのインクルード

静的なインクルードとよく似ていますが、以下の点が異なります。

Javaサーブレットファイルは別々になる

動的というくらいですから、インクルードするファイルは別々にコンパイルされます。
これにより若干処理は重くなりますが、
インクルード先のファイルを修正したとしてもインクルード元ファイルの
再コンパイルは不要になります。

パラメータを渡せる

これが一番のメリットでしょう。
逆に言うと、パラメータを渡す必要が無い場合には
静的インクルードを使いましょう。

<jsp:include page="scripts/login.jsp" />

パラメータを渡す場合には、以下のようにします。

<jsp:include page="scripts/login.jsp">	
  <jsp:param name="username" value="jsmith" />	
</jsp:include>

プラグインの使用

アプレットを使用するときなどに利用します。
詳細は不明です。

<jsp:plugin type=applet code="Molecule.class" codebase="/html">	
   <jsp:params>	
      <jsp:param name="molecule" value="molecules/benzene.mol" />	
   </jsp:params>	
   <jsp:fallback>	
      <p>Unable to load applet</p>	
   </jsp:fallback>	
</jsp:plugin>

デフォルトで使用できるローカル変数

JSP内では、いくつかのローカル変数がデフォルトで定義されています。

request

HTTPリクエスト(入力)を表します。

response

HTTPレスポンス(出力)を表します。

pageContext

ページコンテキストを表します。
このオブジェクトは単一サーブレット内において共通です。

session

HTTPセッションを表します。

application

アプリケーションオブジェクトを表します。
このオブジェクトは全サーブレットにおいて共通です。

out

JSP出力オブジェクト(JspWriter)を表します。

config

サーブレットコンフィグオブジェクトを表します。

page

サーブレットファイルのインスタンス(this)を表します。

exception

例外オブジェクトを表します。
isErrorPage が true の場合のみ有効です。