教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

JSPの基本構造 (2)

JSPの繰り返し処理を学習しよう (1)

次のプログラム HelloWorld2.jsp は、ブラウザの リクエスト(HTTPのGETリクエスト)に対して、JSP内で動的に 生成したHTML文章を返す。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World </title>
</head>
<body>
<%
    for (int i = 0; i < 10; i++) {
%>
        Hello World!(<%= i+1 %>回目)<br>
<%
    }
%>
</body>
</html>

たとえば、Webサーバが動いているホストlocalhostのWebアプリケーシ ョンのルートディレクトリ下に格納されている、 JSPファイルHelloWorld2.jspを実行する。そうすると、 ブラウザが起動され、"Hello World"というテキストが 10回表示される。

プログラム HelloWorld2.jspの説明

以下の部分

<%
    for (int i = 0; i < 10; i++) {
%>
        Hello World!(<%= i+1 %>回目)
<% } %>
では、

<%
    for (int i = 0; i < 10; i++) {
%>

<%= i+1 %>

<%
    }
%>

からなる3つのスクリプトレットが記述されている。 したがって、この部分を実行することで、

        Hello World!(<%= i+1 %>回目)

は、10回繰り返されることになり、最終的には、以下な文字列が 出力される。

<!DOCTYPE HTML>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head><title>Hello World</title></head>
<body>
Hello World!(1回目)
Hello World!(2回目)
Hello World!(3回目)
Hello World!(4回目)
Hello World!(5回目)
Hello World!(6回目)
Hello World!(7回目)
Hello World!(8回目)
Hello World!(9回目)
Hello World!(10回目)
</body>
</html>

JSPの繰り返し処理を理解しよう (2)

次のプログラム EveryoneHello.jsp は、ブラウザの リクエスト(HTTPのGETリクエスト)に対して、JSP内で、繰り返し文 から構成されるJavaプログラムを実行し、動的に生成されたHTML文章 を返すものである。

<%@ page contentType="text/html" pageEncoding="UTF-8" %>

<%!
int i;
int intNum;
String[] strVal={"渡辺","松岡","川端","本多","川村"};
%>

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>みんなにHello!!</title>
</head>
<body>
<h1>みんなにHello!!</h1>
<%
intNum=strVal.length;
for(i=0;i<intNum;i++){
	out.println("<p>こんにちは、" + strVal[i] + "さん!</p>");
}
%>
</body>
</html>
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーシ ョンのルートディレクトリ下に格納されている、 JSPファイルEveryoneHello.jspを実行する。そうすると、 ブラウザが起動され、その上で"こんにちは、....さん"というテキストが 5回表示される。

プログラム EveryoneHello.jsp の説明

変数を宣言するためには、

<%!
int i;
int intNum;
String[] strVal={"渡辺","松岡","川端","本多","川村"};
%>
によって、それぞれの変数と配列が宣言され、配列については初期値が 格納される。

スクリプトレットは、

<%
intNum=strVal.length;
for(i=0;i<intNum;i++){
	out.println("<p>こんにちは、" + strVal[i] + "さん!</p>");
}
%>

により表され、変数intNumへの代入とout.print(....)文の繰り返し 実行がおこなわれる。

EveryoneHello.jspの実行により、 最終的には、次のようなHTMLテキストが出力される。

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head><title>Hello World</title></head>
<body>
<p>こんにちは、渡辺さん!</p>
<p>こんにちは、松岡さん!</p>
<p>こんにちは、川端さん!</p>
<p>こんにちは、本多さん!</p>
<p>こんにちは、川村さん!</p>
</body>
</html>

JSPのインスタンス変数、ローカル変数を理解しよう

次のプログラム ScriptElement.jsp は、ブラウザの リクエスト(HTTPのGETリクエスト)に対して、JSP内で定義された メソッドを、スクリプトレット内で実行することで設定されるカウンタ 変数の値を表示するものである。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%!
    int declarationCounter = 0; // 宣言のカウンタ
    // 宣言のカウンタ値を読むスレッドセーフなメソッド
    synchronized int getDeclarationCounter() {
        return ++declarationCounter;
    }
%>
<%
    // スクリプトレットのカウンタもここで用意しておく
    int scriptletCounter = 0;
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>宣言とスクリプトレットの比較</title>
</head>
<body>
宣言のカウンタ=<%= getDeclarationCounter()%> <br>
スクリプトレットのカウンタ=<%= ++scriptletCounter%>
</body>
</html>

たとえば、Webサーバが動いているホストlocalhostのWebアプリケーシ ョンのルートディレクトリ下に格納されている、 JSPファイルScriptElement.jspを実行する。 その後、ブラウザが起動され、JSP内で、インスタンス変数として宣言 されたカウンタ変数の値とスクリプトレット内で宣言されたカウンタの 値をそれぞれ表示する。

プログラム ScriptElement.java の説明

変数を使う場合には、必ず宣言をおこなう必要がある。宣言方法には、 <%! 〜 %>の宣言部で宣言する方法とスクリプトレットで 宣言する方法がある。 以下では、前者の宣言部でカウンタ変数とメソッドの宣言をおこなって いる。

<%!
    int declarationCounter = 0; // 宣言のカウンタ
    // 宣言のカウンタ値を読むスレッドセーフなメソッド
    synchronized int getDeclarationCounter() {
        return ++declarationCounter;
    }
%>
ここでは、<%! 〜 %>の宣言部において、インスタンス変数 declarationCounterとメソッドgetDeclarationCounter()が 定義されている。このメソッドは、排他制御をおこなうため、 synchronizedになっている。これによって、複数のスレッドが 同時にこのメソッドを実行しようとしても、ひとつのスレッド だけが実行できることを保証している。

以下のスクリプトレットでは、

<%
    int scriptletCounter = 0;
%>

カウンタ変数scriptletCounterが用意され、初期化 されている。

宣言部で定義されたカウンタ変数とスクリプトレットで定義された カウンタ変数は、

宣言のカウンタ=<%= getDeclarationCounter()%> <br>
スクリプトレットのカウンタ=<%= ++scriptletCounter%>
によって、表示される。前者の宣言部で定義されたカウンタ変数には、 式(<%= 〜 %>)の呼び出しで結果を求め、代入している。 一方、スクリプトレット内で定義されたカウンタ変数も式の呼び出し 結果が表示されている。

ScriptElement.jspでは、ページを読み込んだ回数をカウント 変数に設定し、表示する。同じページを再表示させる場合に、 宣言部で定義されたカウント変数はカウントアップ(1ずつ 増やされる)される。一方、スクリプトレット内で定義された カウント変数は、再表示のたびにカウントがリセットされる。

問題-1

NetBeansを使って、上のプログラム HelloWorld2.jsp を 実行してみよ。

問題-2

NetBeansを使って、上のプログラム EveryoneHello.jsp を 実行してみよ。

問題-3

上のプログラム EveryoneHello.jspを、Servletに変換した プログラムを、NetBeansを使って実行してみよ。

問題-4

NetBeansを使って、上のプログラム ScriptElement.jsp を 実行してみよ。

問題-5

上のプログラム ScriptElement.jspを、Servletに変換した プログラムを、NetBeansを使って実行してみよ。実行後のそれぞれのカウンタ変数 の違いについても説明せよ。

システムプログラミング演習


nagai