サーブレット&JSPの基本|JSPの基本としくみ

HTMLを書きながらJavaも使える。JSPの基本としくみをやさしく理解して、Webページ作成をもっと楽にしよう

サーブレットの学習を進めると、HTMLを出力するたびに out.println を何度も書く場面が出てきます。最初は仕組みを理解するためにとても大切ですが、画面が少し複雑になるだけでも、ソースコードが長くなりやすいのが気になるところです。

そこで登場するのが JSP です。JSP は、サーブレットと同じくサーバサイドで動く技術ですが、HTMLの中にJavaのコードを埋め込んで書けるため、画面を作る処理をずっと自然な形で記述できます。見た目に関するHTMLと、動きに関するJavaを1つのファイルの中で扱えるので、サーブレットだけで画面を作るよりも書きやすく感じられるはずです。

この記事では、JSPとは何か、どのようなしくみで動くのか、そしてJSPファイルを書くとどのようなHTMLが出力されるのかを順番に見ていきます。サーブレットの学習と同じように、JSPも実際に作って実行しながら覚えていくのがいちばん分かりやすいです。まずは基本の考え方からしっかり押さえていきましょう。

JSPとは

JSPは Jakarta Server Pages の略で、サーブレットと同じくサーバサイドプログラムの技術です。ブラウザからのリクエストを受けてサーバ側で処理を行い、その結果をHTMLとして返します。

大きな特徴は、サーブレットクラスのようにJavaコードだけで画面を作るのではなく、JSPファイルを使って画面を作るところです。JSPファイルには、HTMLをそのまま書けます。そして必要な部分だけJavaのコードを埋め込めます。

サーブレットとJSPの違い

項目サーブレットJSP
主に使うファイルJavaクラスJSPファイル
HTMLの書き方out.println で1行ずつ出力HTMLをそのまま書ける
Javaコードの書き方クラスの中にJavaとして書くHTMLの中にJavaを埋め込む
画面作成のしやすさ画面が増えるとやや大変画面を作りやすい
実行の本質サーバサイドで実行サーバサイドで実行

JSPは見た目こそサーブレットとは少し違いますが、Webアプリケーションを作るためのサーバサイド技術である点は同じです。

サーブレットでは、たとえば次のようにHTMLを何行も out.println で出力していました。

  • titleタグを出力する
  • bodyタグを出力する
  • 文章を出力する
  • 閉じタグを出力する

これに対してJSPでは、HTMLの見た目をそのまま書きつつ、必要なところだけJavaの値を差し込めます。この書きやすさが、JSPの大きな魅力です。

図1:サーブレットとJSPの役割の違い

この図から分かること

サーブレットもJSPも、最終的にはブラウザへWebページを表示するための技術です。ただし、画面を作るときの書き方に違いがあります。

サーブレットではJavaのコードが中心になり、HTMLを文字列として1行ずつ出力していきます。JSPではHTMLをそのまま書けるため、画面の構造を見ながら作りやすくなります。

見た目を作る作業が多い場面では、JSPのほうが自然に書けることが多いです。そのため、サーブレットで処理を担当し、JSPで画面表示を担当する構成がよく使われます。

JSPのしくみ

JSPファイルは、そのまま直接実行されているわけではありません。実は、ブラウザからJSPファイルがリクエストされると、TomcatなどのアプリケーションサーバがそのJSPファイルをサーブレットクラスへ変換します。さらに、そのサーブレットクラスをコンパイルし、インスタンスを生成して実行します。

つまり、JSPは見た目としてはHTMLに近い書き方ができますが、内部ではサーブレットとして動いています。

JSPが実行される流れ

順番内容
1開発者がJSPファイルを作成する
2ブラウザがJSPファイルをリクエストする
3アプリケーションサーバがJSPファイルをサーブレットクラスへ変換する
4変換されたサーブレットクラスをコンパイルする
5サーブレットのインスタンスを生成して実行する
6実行結果のHTMLをブラウザへ返す

この流れを見ると、JSPは書き方こそ便利ですが、最終的にはサーブレットとして動くことが分かります。だからこそ、サーブレットでできることは、基本的にJSPでも行えます。

JSPファイルはサーブレットクラスに変換される

JSPのいちばん大事なポイントの1つは、JSPファイルがサーブレットクラスに変換されることです。

この仕組みがあるため、JSPはHTMLのように書きやすいのに、サーバ側の処理も実行できます。たとえば、変数を使う、Javaの値を画面に表示する、といったことが可能です。

逆に考えると、JSPは見た目上はHTMLファイルに近くても、中身は単なる静的なHTMLではありません。リクエストされるたびに、サーバ側で動作するプログラムとして扱われます。

JSPの特徴

特徴内容
リクエストして実行するブラウザからアクセスするとサーバ側で処理される
HTMLの中にJavaを書ける必要なところだけJavaを埋め込める
HTMLを出力しやすいサーブレットより画面を作りやすい
サーブレットに変換される内部的にはサーブレットとして動く

JSPを学ぶときは、HTMLを書きやすいサーバサイド技術、と考えるとつかみやすいです。

図2:JSPが実行されるまでの流れ

この図から分かること

JSPファイルは、ブラウザからアクセスされたときにそのまま実行されるのではなく、いったんサーブレットクラスへ変換されます。そして、そのサーブレットクラスがコンパイルされて実行されます。

この流れのおかげで、JSPはHTMLのように書きやすい見た目を持ちながら、サーバサイドプログラムとして動作できます。内部ではサーブレットとして処理されるため、動きの本質はサーブレットと共通しています。

JSPは単なる表示専用ファイルではなく、サーバ側で処理されるWebアプリケーションの一部であることがよく分かります。

JSPファイルの書き方

JSPファイルの中では、HTMLとJavaコードを組み合わせて書きます。HTMLは通常どおり記述し、Javaコードは専用の記法で埋め込みます。

ここでは、利用者の名前と学習コース名を表示するJSPの例を見てみましょう。

JSPファイルの例

<%
String userName = "青山 直人";
String course = "サーブレット&JSPの基本";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSPのサンプル</title>
</head>
<body>
私の名前は<%= userName %>です。現在の学習コースは<%= course %>です。
</body>
</html>

このファイルでは、最初の <% %> の中にJavaコードを書いています。ここでは userName と course という変数を用意しています。

そのあと、HTMLの本文の中で <%= %> を使い、変数の値を画面へ出力しています。

JSPでよく使う記法

記法役割
<% Javaコード %>Javaの処理を書く
<%= 値や式 %>値や式の結果を画面へ出力する

JSPファイルを見ると、HTMLがそのまま書かれているので、どのような画面になるのかをイメージしやすいです。これが、サーブレットの out.println をたくさん書く方法と比べたときの大きな違いです。

HTMLの中にJavaのコードを埋め込む

JSPの特徴は、HTMLの中にJavaのコードを埋め込めることです。

たとえば、bodyタグの中の文章の一部だけをJavaの変数で差し替えたい場合、HTML全体をJava文字列として出力する必要はありません。HTMLはそのまま書き、必要な部分にだけ <%= %> を使えばよいです。

この考え方によって、HTMLの構造と表示内容がとても見やすくなります。

JSPで書いた内容の見方

部分役割
Javaコード部分値を準備する
HTML部分ページの構造を作る
<%= %> の部分準備した値をHTMLの中へ差し込む

サーブレットでは、見出し、本文、タグの開始と終了をすべて out.println で書いていました。それに対してJSPでは、見た目の大部分はHTMLとしてそのまま書けるため、ページを作る負担がかなり小さくなります。

実行するとどのようなHTMLが出力されるか

先ほどの profile.jsp を実行すると、ブラウザへ返されるHTMLは次のようになります。

実行して出力されるHTMLの例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSPのサンプル</title>
</head>
<body>
私の名前は青山 直人です。現在の学習コースはサーブレット&JSPの基本です。
</body>
</html>

この結果を見ると、HTMLの部分はそのまま出力され、userName と course の部分には具体的な値が埋め込まれていることが分かります。

つまり、JSPではJavaコードで値を用意し、それをHTMLへ差し込み、最終的には通常のHTMLとしてブラウザへ返しているのです。

図3:JSPファイルからHTMLが出力されるイメージ

この図から分かること

JSPファイルでは、JavaコードとHTMLが1つのファイルにまとめて書かれています。Javaコードで用意した変数の値を、HTMLの中に埋め込んで出力できます。

JSPが実行されると、Tomcatがその内容を処理し、最終的には通常のHTMLとしてブラウザへ返します。ブラウザはJSPそのものを受け取るのではなく、JSPの実行結果として生成されたHTMLを受け取っています。

このしくみのおかげで、開発者はHTMLを見ながら画面を作りやすくなり、しかもJavaの値も柔軟に表示できます。

JSPを使うとHTML出力が楽になる理由

JSPを使うと、サーブレットクラスよりもHTML出力がずっと楽になります。

その理由は、HTMLを文字列として1つひとつ出力しなくてよいからです。たとえば、サーブレットでHTMLを出力すると、次のような作業が必要でした。

  • htmlタグを out.println で出力する
  • headタグを出力する
  • metaタグを出力する
  • bodyタグを出力する
  • 文章を出力する
  • 終了タグを出力する

JSPでは、これらを自然なHTMLの形でそのまま書けます。Javaで扱いたい部分だけを埋め込めばよいので、画面の構造がとても分かりやすくなります。

サーブレットとJSPの画面作成のしやすさ

観点サーブレットJSP
HTMLの見やすさやや低い高い
画面の修正しやすさやや大変修正しやすい
Javaとの組み合わせしやすいしやすい
表示画面の作成手間がかかりやすい比較的自然に書ける

特に、表示する画面の見た目を整えたいときには、JSPのありがたさがよく分かります。

サーブレットでできることはJSPでも行える

JSPファイルは内部的にサーブレットクラスへ変換されます。したがって、サーブレットクラスでできることは、基本的にJSPでも行えます。

たとえば、Javaの変数を使う、値を画面へ表示する、といったことはもちろん可能です。JSPはまったく別の仕組みではなく、サーブレットの動きをより書きやすい形にしたものだと考えると理解しやすいです。

ただし、JSPの役割は画面表示に向いています。Javaの複雑な処理を大量に書くよりも、表示のために必要な範囲で使うほうが、コードを読みやすく保ちやすいです。

Eclipseで変換されたサーブレットクラスの場所

Eclipseを使っている場合、JSPファイルから作成されたサーブレットクラスは、ワークスペース内の特定の場所に作成されます。

代表的な場所は次のようになります。

.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\study\org\apache\jsp

たとえば、hello.jsp を作成して実行すると、この場所に次のようなファイルが作成されます。

ファイル内容
hello_jsp.javaJSPから変換されたサーブレットクラスのソースファイル
hello_jsp.classそのクラスをコンパイルしたファイル

この場所を知っておくと、JSPが内部でどのように扱われているかをイメージしやすくなります。JSPは見た目こそHTML寄りですが、実際にはサーブレットクラスへ変換されていることがここからも分かります。

JSPの修正が反映されないとき

まれに、JSPファイルを修正したのに実行結果へ反映されないことがあります。

そのような場合は、Eclipseワークスペース内の、JSPから生成されたサーブレットクラスが置かれているディレクトリの中身を削除すると、改善することがあります。これは、古い変換結果やコンパイル結果が残っていて、正常に更新されていない場合があるためです。

反映されないときの確認ポイント

確認項目内容
JSPファイルを保存したか変更が保存されているか確認する
ブラウザを更新したか最新表示を確認する
Tomcatの状態サーバが正常に動いているか確認する
生成先ディレクトリ古いファイルが残っていないか確認する

この対処は毎回必要になるわけではありませんが、JSPの変更がどうしても反映されないときの手段として覚えておくと役立ちます。

JSPの基本として押さえておきたいこと

最後に、JSPの基本として押さえておきたいポイントを整理しておきます。

JSPの基本ポイント

ポイント内容
JSPはサーバサイド技術ブラウザではなくサーバ側で実行される
JSPファイルを使うサーブレットクラスの代わりにJSPファイルで画面を作る
HTMLの中にJavaを書ける必要な部分だけJavaを埋め込める
JSPはサーブレットへ変換される内部的にはサーブレットとして動く
HTML出力がしやすいサーブレットより画面作成が楽になる

JSPは、サーブレットの知識を土台にして学ぶと理解しやすい技術です。サーブレットでHTMLを1行ずつ出力していた経験があると、JSPの便利さがより実感しやすくなります。

これからJSPを学ぶときは、HTMLを自然に書きながら、必要なところへJavaを埋め込める仕組みとして捉えると、全体像がつかみやすくなります。