JSP/Servletの基本

簡単なサンプル

ここから本格的にJSPでWEBページを作成していくことにします。Eclipseを開発環境とする場合は、環境設定からプロジェクトの作成までは、こちらを参考にしてください。プロジェクト名としては、jspプロジェクトを使用することとします。

ただ、WebContent配下にソースファイルを作成していくと、ファイルが多くなりすぎて管理しづらいので、日ごとに異なるフォルダにファイルを入れて管理することにしましょう。以下の操作をして下さい。

1.jspプロジェクトのWebContentで右クリックし、新規(N)→フォルダーの順で選択してください。(図1-1.)

図1-1.WebContentフォルダの下にフォルダを作成①
WebContentフォルダの下にフォルダを作成①

規フォルダーウィンドウで、親フォルダーを入力または選択の部分がjsp/WebContentとなっていることを確認し、フォルダー名にday1と入力してから完了(F)ボタンをクリックしてください。(図1-2.)

図1-2.WebContentフォルダの下にフォルダを作成②
WebContentフォルダの下にフォルダを作成②

WebContentの下にday1というフォルダーが作成されていれば成功です。見えない場合は、プロジェクト・エクスプローラーで右クリックした後、サブメニューからリフレッシュを実行してみましょう。(図1-3.)

図1-3.WebContentフォルダの下にフォルダを作成③
WebContentフォルダの下にフォルダを作成③

以下で紹介するJSPファイルのサンプルは、このday1フォルダを右クリックして生成してください。以後、2日目なら、day23日目ならday3…といった具合に、フォルダを作っていくことを想定して、解説を進めます。

JSPの基本的なサンプル

スクリプトレット

では、さっそくJSPの簡単なサンプルを実行してみましょう。まずは、以下のサンプルを実行して見てください。

sample01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample01</title>
</head>
<body>
<%
	for(int i = 0; i < 5; i++){
		out.println("<p>JSP Sample</p>");
	}
%>
</body>
</html>

実行結果は以下のようになります。(図1-4.)作成したサンプルのURLは、http://localhost:8080/jsp/day1/sample01.jspとなります。

図1-4.sample01.jspの実行結果
sample01.jspの実行結果

このサンプルを見ればわかる通り、JSPファイルというのは、HTML(もしくはXHTML)の中に<%と、%>で囲まれた部分(このサンプルならば、10行目~13行目)にJavaのプログラムコードが書かれているものなのです。出力されたXHTMLは、以下のようになります。

なお、<%と、%>のことを、デリミターと言い、この間に書かれた処理のことをスクリプトレットと言います。

つまり、JSPファイルとは、HTML(XHTML)の中にスクリプトレットを埋め込んだもの、ということができます。ただ、HTML(XHTML)の記述のみでも問題ありません。

sample01.jspによって出力されたソースコード

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample01</title>
</head>
<body>
<p>JSP Sample</p>
<p>JSP Sample</p>
<p>JSP Sample</p>
<p>JSP Sample</p>
<p>JSP Sample</p>
</body>
</html>

このXHTMLのうち、スクリプトレットで出力されているのが、9行目~13行ままで、5回繰り返されている「<p>JSP Sample</p>」の部分です。ではいったい、どうしてこのような処理結果になるのでしょうか?具体的に解説していきましょう。

暗黙オブジェクト

JSPでは自動的にインスタンスの生成が行われ、明示的に宣言・生成しなくても使用できる特別なオブジェクトがいくつかあります。これらは暗黙オブジェクトといい、スクリプトレットやJSP式で使うことができます。12行目で用いられている、outオブジェクトも、そのうちの一つです。outオブジェクトの使用方法は、コンソールに文字列を出力するSystem.out.print()もしくはSystem.out.println()と同じように、ブラウザに対して文字列を出力するときに使用できます。(図1-5.)

図1-5.outオブジェクトによるHTMLの生成
outオブジェクトによるHTMLの生成

outオブジェクトは、javax.servlet.jsp.JspWriterというクラスのオブジェクトであり、文字列をブラウザーに出力するためのクラスです。詳細については、後ほど詳しく説明しますが、JSPではこのほかにも様々な暗黙オブジェクトが存在し、それらを利用しながら、さまざまな処理を行うプログラムを作成していくことができるわけです。

これを、for文で5回繰り返していることから、5つ分のJSP Sampleという文字列がブラウザに表示されるのです。

複数のデリミターにまたがる処理

sample01.jspのように、HTML(XHTML)の間に、Javaで記述された処理をうめこむことができるのが、JSPの特徴です。ただ、通常のJavaと大きく違うことは、この処理を、以下のように記述できることです。

sample02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample02</title>
</head>
<body>
<%
    for(int i = 0; i < 5; i++){
%>
<p>JSP Sample</p>
<%
    }
%>
</body>
</html>

作成したサンプルのURLは、http://localhost:8080/jsp/day1/sample02.jspとなります。出力結果は、タイトル部分を除きsample01.jspの場合と同じなので省略します。

sample01.javaでは、outオブジェクトを利用してHTMLのタグを出力していましたが、このように、直接HTML(XHTML)部分をfor文などで囲んで、繰り返して処理することも可能なのです。どちらがいいかは、その時の状況によりますが、上手に活用すれば、表やテーブルなどを効率的に作ることができます。

デリミターの変数

変数の宣言と値の保持

ところで、デリミター内での処理は、Javaで記述されているわけですから、当然のことながら、変数が使わるわけです。ただし、その際に注意しなくてはならないことがあります。それは、変数の値の保持です。その例として、以下のサンプルを実行してみてください。

sample03.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sample03</title>
</head>
<body>
<%
//	変数cnt1(実行されるたびに常にリセットされる)
int cnt1 = 0;
%>
<%!
//変数cnt1(実行されるたび、状態も保存される)
int cnt2 = 0;
%>
<%
out.println("<p>cnt1 = "+ cnt1 + " cnt2=" + cnt2 + "</p>");
//	cnt1,cnt2をインクリメント
cnt1++;
cnt2++;
%>
</body>
</html>

サンプルのURLは、http://localhost:8080/jsp/day1/sample03.jspとなります。実行すると、以下のように「cnt1=0 cnt2=0」と表示されます。しかし、再び実行すると、「cnt1=0 cnt2=1」となります。(図1-6.)

図1-6.sample03.jspの実行結果
sample03.jspの実行結果

さらに繰り返していくと、cnt1は相変わらず0のままですが、cnt2は更に、2,3,4…と増えていきます。Tomcatサーバーを再起動しない限り、この値は増えていきます。

宣言

14行目にある最初のデリミターにが付加されています。14行目~17行目のような、<%!から%>までの部分は、宣言と呼ばれ、その名の通り変数・配列・メソッドなどの宣言をするためにあります。

宣言を使用して宣言された変数・配列・メソッドなどは初めてリクエストが行われた時に一度だけ呼び出されます。そのため、その後何度リクエストを行っても変数の値は初期化される事はありません。アプリケーションサーバーなどを再起動するまで値が保持されます。

それに対し、宣言以外で宣言された変数は、そのページが読み出されるたびに初期化されます。そのため、21行目および22行目で両方ともインクリメントされているのにもかかわらず、何度実行してもcnt1は常に0であり、それに対しcnt2は増え続けていくのです。(図1-7.)

図1-7.宣言の効果
宣言の効果

以上がJSPの基本です。次は、実際にこれを利用して様々なページを作ってみることにしましょう。