JSPの作成 †
概要 †
Hello World! - 詳細 †
毎度おなじみ(?)の「Hello World!」をJSPで表示することにより、JSPの基礎を理解します。
JSPの基礎 - 詳細 †
JSPの基礎を理解します。
暗黙オブジェクト - 詳細 †
宣言しなくても使える特殊な変数について理解します。
渡されたオブジェクトの使用 - 詳細 †
サーブレットから渡されたオブジェクトの使用方法を理解します。
インクルード - 詳細 †
2種類のインクルードの方法と、その違いを理解します。
総合課題 - 詳細 †
今までに出てきた知識を活用して、いろいろなプログラムを作ります。
概要 †
Hello World! †
毎度おなじみ(?)の「Hello World!」をJSPで表示することにより、JSPの基礎を理解します。
サンプルソース:HelloWorld?.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
最初の行では、サーブレットと同じように Content-type と文字コードの設定を行っています。
JSPではこの記述を必ず先頭に入れるようにして下さい。
最初の行以外は、普通のHTMLと何ら変わりません。
JSPの基礎 †
以下のサンプルソースを見てください。
サンプルソース:BasicJSP.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%-- コメントはこのように書きます --%>
<%-- importはこのように書きます --%>
<%@ page import="java.util.*" %>
<%-- 複数importすることもできます --%>
<%@ page import="java.io.*" %>
<%-- このように「,」区切りで書きこともできます --%>
<%@ page import="java.net.*, java.text.*" %>
<html>
<head>
<title>JSPの基礎</title>
</head>
<body>
<center><h1>JSPの基礎</h1></center>
<hr>
<%
//ここには、Javaコードを普通に記述することができます
//宣言した変数は以降の箇所でずっと使用できます
String message = "メッセージ";
boolean flag = true;
//Javaコードで文字列を出力する場合はこのようにします
out.println("Javaコードでの出力です");
%>
<br>
<%--
変数や式の結果は通常はこのように「<%= %>」を使って出力します
(「;」はつけないので注意
--%>
<%= message %>
<br>
<%-- if文はこんな感じで記述します --%>
<%
if(flag)
{
%>
flag=trueでした
<%
}
else
{
%>
flag=falseでした
<%
}
%>
</body>
</html>
HTMLの中に、見慣れないタグやJavaコードが混ざっているように見えると思います。
JSPではこのように、HTMLの中に特別なタグやJavaコードを埋め込むことにより、動的なHTMLを作成します。
このJSPを実行すると、結果のHTMLはこのように出力されます。
(改行は↓と表示しています。)
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
<html>
<head>
<title>JSPの基礎</title>
</head>
<body>
<center><h1>JSPの基礎</h1></center>
<hr>
Javaコードでの出力です
↓
↓
<br>
↓
メッセージ
↓
<br>
↓
↓
flag=trueでした
↓
</body>
</html>
↓
- <%@ page %> - page ディレクティブ - ページ情報の設定
JSPの先頭部分では、「<%@ page %>」を使ってページ情報の設定を行います。
「<%@ page %>」はページディレクティブと呼ばれます。
これにより、Content-type, 文字コード, importするパッケージなどを設定することができます。
上のサンプルにもあるように、importするパッケージは複数指定することができます。
その方法として、複数行に記述する方法と「,」区切りで記述する方法がありますが、複数行に記述する方が見やすいのでお勧めです。
- <% %> - スクリプトレット - Javaコードの記述
「<% %>」の中では、通常のJavaコードを記述することができます。
「<% %>」はスクリプトレットと呼ばれます。
ここで使用している「out」は、宣言しなくても使える特別な変数です。
JSPでは他にもこのような変数がいくつもあります。
詳細は、次の暗黙オブジェクトで解説します。
- <%= %> - 値の出力 -
「<%= %>」は、変数や式を受け取って結果の値を出力します。
「<% %>」とは違い、「;」をつけないので注意して下さい。
「out.print()」と機能は同じですが、簡単に使用できるのでこちらの方がよく使用されます。
(内部的には、実際に「<%= %>」は「out.print()」に変換されています。)
- <%-- --%> - コメント
「<%-- --%>」を使ってコメントを記述することができます。
ただし、「<% %>」の中では使用できません。
「<% %>」の中では、「//」, 「/* */」といった通常のJavaのコメントを使用します。
このコメントは、出力結果には反映されません。
出力結果に反映されるコメントを記述したい場合は、HTMLのコメントである「<!-- -->」を使用して下さい。
暗黙オブジェクト †
- 暗黙オブジェクトとは
JSPでは、よく使われるインスタンスはすでに変数として定義されているので宣言しなくても使えます。
これらの変数は、「暗黙オブジェクト」と呼ばれています。
暗黙オブジェクトは以下の通りです。
(それぞれのクラスの詳細については、Javadoc を参照して下さい。)
| 変数名 | クラス | 簡単な説明 |
| page | javax.servlet.jsp.HttpJspPage? | ページのサーブレットインスタンス |
| config | javax.servlet.ServletConfig? | サーブレットの設定データ |
| request | javax.servlet.http.HttpServletRequest? | リクエストデータ(パラメータを含む) |
| response | javax.servlet.http.HttpServletResponse? | レスポンスデータ |
| out | javax.servlet.jsp.JspWriter? | ページコンテンツの出力ストリーム |
| session | javax.servlet.http.HttpSession? | 各ユーザのセッションデータ |
| application | javax.servlet.ServletContext? | 全てのアプリケーションページに共通のデータ |
| pageContext | javax.servlet.jsp.PageContext? | ページの実行に必要なコンテキストデータ |
| exception | javax.lang.Throwable | キャッチされなかったエラーまたは例外 |
渡されたオブジェクトの使用 †
- <jsp:useBean>タグ
JSPのメインの処理は、サーブレットから渡されたオブジェクトを表示することです。
<jsp:useBean>タグを使用すると、渡されたオブジェクトを簡単に取得することができます。
<jsp:useBean>タグの使用方法は以下の通りです。
<jsp:useBean id="属性名" scope="スコープ" class="クラス名" />
idには、属性名を指定します。
自動的にこの属性名と同じ名前の変数が生成され、以降の箇所で使用することができます。
scopeには、「page」,「request」,「session」,「application」のいずれかを指定します。
「page」を指定した場合は、JSPページ内でだけ有効になりますが、まず使うことはありません。
残りの3つは、サーブレットの場合と同じです。
classにはクラス名を指定します。
「java.lang.String」のようにパッケージ名を含めた完全形式で指定する必要があります。
ただし、配列の場合はうまくいかないことがあるので、次の getAttribute() の方法を使用して下さい。
- getAttribute()
サーブレットの場合と同じく、getAttribute() メソッドで取得することもできます。
実は<jsp:useBean>タグを使用した場合も、内部では getAttribute() メソッドを使用するように変換されています。
下の2文は、ほぼ同じ内容です。
<jsp:useBean id="requestAttribute" scope="request" class="java.lang.String" />
<% java.lang.String requestAttribute = (java.lang.String)request.getAttribute("requestAttribute"); %>
サンプルソース:useBean.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<jsp:useBean id="requestAttribute" scope="request" class="java.lang.String" />
<% String sessionAttribute = (String)session.getAttribute("sessionAttribute"); %>
<html>
<head>
<title>渡されたオブジェクトの使用</title>
</head>
<body>
<center><h1>渡されたオブジェクトの使用</h1></center>
<hr>
requestAttribute=<%= requestAttribute %><br>
sessionAttribute=<%= sessionAttribute %><br>
</body>
</html>
インクルード †
- <%@ include %> - 静的インクルード
JSPでは「<%@ include %>」を使用することにより、リソースのインクルードを行うことができます。
「<%@ include %>」はインクルードディレクティブと呼ばれます。
インクルード自体の説明については、サーブレットの作成 - 他の画面の呼び出しを参照して下さい。
この方法を使ったインクルードでは、JSPのコンパイル時にリソースの読み込みを行います。
そのため、コンパイルした後に外部ファイルを変更し再度実行しても、その変更内容は反映されません。
外部ファイルの変更を反映させるには、インクルードしているJSP自体を更新するか、コンパイルにより生成された一時ファイルを削除する必要があります。
なお、Tomcatの場合一時ファイルはTomcatのルートディレクトリの下の「work」というディレクトリの下に生成されます。
- <jsp:include> - 動的インクルード
「<jsp:include>」でもリソースのインクルードを行うことができます。
「<jsp:include>」はインクルードアクションと呼ばれます。
この方法を使ったインクルードでは、実行の度にリソースの読み込みを行います。
そのため、コンパイルした後に外部ファイルを変更しても、その変更内容はただちに反映されます。
しかし、毎回読み込みを行う分「<%@ include %>」を使う方法よりもパフォーマンスは落ちます。
状況に応じて「<%@ include %>」と「<jsp:include>」の2つの方法を使い分けて下さい。
サンプルソース:include.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>インクルード</title>
</head>
<body>
<center><h1>インクルード</h1></center>
<hr>
<%-- 静的インクルード --%>
<%@ include file="/html/hogehoge.html" %>
<%-- 動的インクルード --%>
<jsp:include page="/html/hogehoge.html" />
</body>
</html>
サンプルソース:hogehoge.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>hogehoge</title>
</head>
<body>
hogehoge
</body>
</html>
上のJSPを実際に動かして見ましょう。
そして、読み込んでいるHTMLファイルを変更してもう一度動かしてみましょう。
総合課題 †
課題1 †
九九の表を、JSP「kuku.jsp」として作成して下さい。
JSP課題1解答
課題2 †
JSP課題2解答?
課題3 †
簡単な掲示板を作成します。
- ステップ1
下の図のような、簡単な掲示板を作成して下さい。
ログイン画面はHTMLで、掲示板本体はサーブレットとJSPで作成して下さい。
- コーディング条件
- 全角文字が入力されても正常に表示すること
- 入力された値を表示する際は特殊文字のエスケープを行うこと
- ヒント
- 記事の保存にはセッション属性を使うと良いです。
- 投稿者と内容をバラバラに扱うより、2つをまとめたクラス「Article」を使った方が良いです。
- テキストエリアで入力された文字列に改行が含まれている場合は、普通に表示しても改行が反映されずに一行で表示されてしまいます。
この場合は、特殊文字のエスケープの要領で改行を「<br>」というタグに変換するとうまくいきます。
- 複数の記事を管理する必要がありますが、このように動的に要素数が変化するときは配列を使うよりも、java.util.ArrayList? というクラスを使った方が良いです。
- ステップ2
ステップ1で作成した掲示板ではセッション属性で記事を保存しているので、ブラウザを終了させたり、アプリケーションサーバを再起動すると記事が消えてしまいます。
それに、セッション属性はユーザごとに独立しているので記事を共有することができません。
そこで、記事をファイルに保存して永続化されるようにしてみましょう。
- ヒント
- java.io.Serializable インターフェースを実装すると、バイナリ形式でファイルに保存することができるようになります。
具体的には、クラスの宣言時に次のように記述します。
import java.io.Serializable;
public class [クラス名] implements Serializable
{
}
インスタンスのファイルへの書き込みは java.io.ObjectOutputStream?、読み込みは java.io.ObjectInputStream? というクラスを使って行うことができます。
詳細はJavadocを参照して下さい。
- インスタンスをファイルに書き込む際には、java.util.ArrayList? や 配列に格納して書き込むと一度に書き込めるので便利です。
- 読み込み時にファイルが見つからない場合には、java.io.FileNotFoundException? 例外が投げられます。
- ステップ3
1ページに全ての記事を表示していると、記事件数が増えた場合に非常に見にくくなってしまいます。
そこで、1ページの表示件数は5件までにして、それ以上記事が増えた場合はページを切り替えられるようにして下さい。
- コーディング条件
- 記事が投稿された場合は最後のページが表示されること
- ページを切り替えるときは、JSPを直接呼び出すのではなくサーブレット経由で呼び出すこと
- ヒント
- ページの切り替えのときには、リンクのURLに「?page=1」という形式でパラメータを渡すと便利です。
- 現在のページに表示する記事情報を抽出する方法としては、次の2つが考えられますがどちらの方法を使っても良いです。
1.全ての記事情報をJSPにそのまま渡して、JSP側で必要な情報を抽出する
2.現在のページに表示する記事情報をサーブレット側で抽出して、必要な記事情報だけをJSPに渡す
JSP課題3解答?
Java勉強会カリキュラムに戻る