連載
» 2003年04月15日 00時00分 公開

JSPの基本構文を理解する基礎から学ぶサーブレット/JSP(4)(2/3 ページ)

[山田祥寛,@IT]

ディレクティブ

 ディレクティブ(指令)とは、その名のとおり、JSP/サーブレットコンテナに対する指示を行うものです。一般的に、ディレクティブは以下のような構文で記述することができます。

<%@ ディレクティブ名 属性名1="属性値1" 属性名2="属性値2" ... %>

 属性値は数値であると文字列であるとに関らず、必ずダブルクォーテーションで囲まなければならない点に注意してください。JSP1.2環境においては、以下のようなディレクティブを使用することができます。

ディレクティブ 概要
@page 現在のページの処理方法を指定
@include 外部ファイルをインクルード(「アクションタグ」参照)
@taglib タグライブラリを定義(後続の記事で紹介)

 この中でも、最も重要なディレクティブが@pageディレクティブです。その性質上、ページの先頭に記述するのが一般的です。ページ内に複数回記述することができますが、import属性を除いては、同一の属性を複数回指定することはできません。ですから、

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page import="java.sql.*" %>

という記述は可能ですが、

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

のような記述は不可です(相互に矛盾しているため)。

 以下では、@pageディレクティブで使用することのできる主な属性を簡単にご紹介しておくことにしましょう。

contentType属性

 コンテンツタイプと出力の文字エンコーディングを指定します。ページ内で日本語を扱う場合、contentType属性の指定は必須となります。JSPページの文字エンコーディングは、何も指定しない場合はISO-8849-1(Latin1)という欧米言語向けの設定がデフォルト値となります。そのままでは文字化けの原因となりますので、注意してください。

<%@ page contentType="text/html;charset=Shift_JIS" %>

 一般的には、Windows系OSの環境では“Shift_JIS”、UNIX系OSの環境では“EUC-JP”を指定します。

 なお、コンテンツタイプも多くの場合は“text/html”(HTML文書)ですが、“text/xml”(XML文書)や“text/plain”(プレーンテキスト)などの指定を行なうこともできます。デフォルトは“text/html”になりますので、そのほかの文書フォーマットを出力したいという場合にはやはり指定は必須となります。

buffer、autoFlush属性

 「バッファ処理」とは、出力に際してコンテンツをそのままクライアントに垂れ流すのではなく、いったん「バッファ」と呼ばれる領域にため込んでおき、バッファサイズを超えたタイミングで(バッファサイズを超えない 場合はページの処理が完了したタイミングで)出力を行うことで、出力時のオーバヘッドを抑え、全体的なパフォーマンスの向上を図るものです。

 buffer属性は、そのバッファ処理に際して確保されるバッファのサイズを指定します。数値はキロバイト単位で、バッファ処理自体を無効にしたい場合には“none”をセットします。

 autoFlush属性は、出力コンテンツのサイズがバッファサイズを超えた場合の挙動を指定するためのものです。trueをセットした場合、バッファの内容は自動的にフラッシュ(出力)されます。falseの場合には例外を返します。デバッグ時などにページ全体が無限ループに陥るのを未然に防ぎたいという場合にも利用することができます。

<%@ page buffer="16" autoFlush="true" %>

import属性

 JSPページの中では、Java基本APIはじめ、さまざまなクラスライブラリを利用することができます。クラスの詳細については後続の記事で詳述しますが、いまは便利な機能がたくさん詰まった道具箱とでも思っておけばよいでしょう。

 import属性はページ内で使用するクラスライブラリを 宣言しておくためのものです。@pageディレクティブの中で唯一、例外的に同一ページ内で複数回記述することができます。詳細については、クラスの活用を含め後続の記事でご紹介することにします。

isErrorPage属性、session属性

 現在のページがエラーページであるかどうか(isErrorPage属性)、セッションを有効にするかどうか(session属性)を、それぞれ指定します。本属性の指定によって、現ページ内で暗黙オブジェクトexception、sessionが使用できるかどうかが決まります。暗黙オブジェクトの詳細については、次回ご紹介することにします。

One Point

ディレクティブはコンテナに対する指令塔。特に@pageディレクティブはページ内の処理方法を定義する重要な要素です。


宣言部

 「<%!〜%>」で囲まれた部分を「宣言部」といいます。宣言部では、その名のとおり、変数や定数、ユーザー定義メソッドなどの宣言を行います。JSP(というより、JSPのベースとなるJava言語)においては、変数の使用に当たって宣言は必須となります。

 以下は宣言部における変数・定数・ユーザー定義メソッドの定義例です。

<%!
int intNum=0; …変数の宣言(初期値も指定可能)
final String strAuthor="Y.Yamada" …定数の宣言
private String strEncode(String strVal) throws UnsupportedEncodingException {
  if(strVal==null){
    return (null);
  }else{
    return (new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect"));
  }
} …ユーザー定義メソッドの宣言
%>

 なお、宣言部で定義された変数の内容は、コンテナの終了まで保持されます。もしも1回のページ処理ごとに変数を初期化したいという場合には、後述のスクリプトレット内で変数宣言を行うようにしてください。

One Point

宣言部では変数・定数・ユーザー定義メソッドを定義します。ただし、処理ごとに初期化したい変数はスクリプトレットで定義します。


スクリプトレット

 「<%〜%>」の形式で定義され、HTMLコードの任意の個所に埋め込むことができる、文字どおりスクリプトコードの

断片(let)です。 JSP内にJavaの断片的なコードを埋め込む場合、最も汎用的に使うことができます。

 ほかgのスクリプトレットや式(Expression)の中に入れ子(ネスト)で定義することはできませんので、注意してください。例えば、以下のような記述は不可です。

<%
out.println("....");
<%...%>
%>

 スクリプトレットの内容は、JSPページ実行時に処理され、その処理結果のみがクライアントに出力されるしくみです。Javaの基本的な制御構文(ifやfor、whileなど)をはじめ、@pageディレクティブで指定されたクラスライブラリ、outやrequest、sessionのような暗黙オブジェクトを使用することができます。暗黙オブジェクトについては次回記事にて、クラスライブラリについては第6回以降でご紹介することにします。各命令の最後には、必ずセミコロン(;)を付加するのを忘れないようにしてください。

 また、以下に、断片的なスクリプトレットの特殊な使い方を挙げておくことにします。

<% if(blnFlag==true){ %>
変数blnFlagはtrueです
<% } else { %>
変数blnFlagはfalseです
<% } %>

 上記の記述は、

<%
if(blnFlag==true){
out.print("変数blnFlagはtrueです");
} else {
out.print("変数blnFlagはfalseです");
}
%>

と同意です。ifやswitchのような制御構文とあわせて使用した場合、スクリプトレットの外にある静的なコンテンツ部分の出力/非出力を制御することもできます。コード部分を簡素化する際に役立つ便利なテクニックですので、ぜひ押さえておくとよいでしょう。

One Point

スクリプトレットはJSPページ内のロジックを担当するメインコード部分。暗黙オブジェクトやそのほかのクラスライブラリ、基本制御構文などを使用することができます。


Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

6月16日にフォーマット統一のため利用規約を変更します

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。