サーブレット&JSPの基本|JSPの基本文法と構成要素

HTMLの中にJavaを組み込む。JSPの構成要素を理解して、画面表示の基本文法を身につけよう

JSPは、HTMLの中にJavaのコードを埋め込んで、動的なWebページを作成できる技術です。

サーブレットでは、HTMLを出力するために out.println を何度も書きました。小さな画面なら問題ありませんが、HTMLが長くなると、Javaコードの中にHTML文字列がたくさん並び、見通しが悪くなりやすいです。

JSPでは、HTMLをそのまま書きながら、必要な場所にJavaの処理や値を差し込めます。そのため、画面の構造を見ながら作りやすく、サーブレットよりもHTML出力を自然に記述できます。

ただし、JSPファイルはHTMLだけでできているわけではありません。Javaのコードを書く部分、値を出力する部分、JSP専用のコメント、JSPファイル全体の設定を書く部分など、いくつかの構成要素に分かれています。

この記事では、JSPファイルを作成するうえで特に大切な、テンプレート、スクリプトレット、スクリプト式、JSPコメント、pageディレクティブを中心に解説します。まずはそれぞれの役割を整理し、どの場面で使うのかを理解していきましょう。

JSPファイルはHTMLとJavaで構成される

JSPファイルは、HTMLで書かれた部分と、Javaのコードで書かれた部分を組み合わせて作成します。

HTMLとしてそのまま出力される部分をテンプレートと呼びます。一方、Javaの処理を書く部分をスクリプトと呼びます。

スクリプトには、さらにスクリプトレット、スクリプト式、スクリプト宣言という種類があります。ただし、基本的なJSPファイルを作成するときによく使うのは、スクリプトレットとスクリプト式です。

JSPファイルを構成する主な要素

要素種類主な役割
テンプレートなしHTMLとしてそのまま出力される部分
スクリプトスクリプトレットJavaの処理を書く
スクリプトスクリプト式Javaの値や式の結果を出力する
スクリプトスクリプト宣言メソッドやフィールドを宣言する
JSPコメントなしJSP内にメモを書く。レスポンスには出力されない
ディレクティブpageディレクティブJSPファイル全体の設定を書く
ディレクティブincludeディレクティブ別ファイルを取り込む
ディレクティブtaglibディレクティブタグライブラリを使う設定を書く
アクションタグ標準アクションタグJSPで用意された処理用タグを使う
アクションタグカスタムタグ独自またはライブラリのタグを使う
EL式なし値を簡潔に出力する

この中で、最初にしっかり押さえたいのは、テンプレート、スクリプトレット、スクリプト式、JSPコメント、pageディレクティブです。

includeディレクティブ、taglibディレクティブ、アクションタグ、EL式などは、JSPをより便利に使うための要素です。まずは基本的なJSPファイルを読めるようになることを優先しましょう。

図1:JSPファイルを構成する主な要素

この図から分かること

JSPファイルは、単にHTMLを書くだけのファイルではありません。HTMLとして出力されるテンプレートの中に、Javaの処理やJSP専用の設定を組み込めます。

pageディレクティブはJSP全体の設定を担当します。スクリプトレットはJavaの処理を書き、スクリプト式はJavaの値をHTMLの中へ出力します。JSPコメントは、開発者向けのメモとして使います。

それぞれの構成要素の役割を分けて考えると、JSPファイルを読んだときに、どこがHTMLで、どこがJavaで、どこが設定なのかを判断しやすくなります。

基本的なJSPファイルの構成

JSPファイルでは、よく使う要素がある程度決まった位置に書かれます。

たとえば、ファイルの先頭にpageディレクティブを書き、そのあとにJavaの処理をスクリプトレットで記述し、HTMLの中でスクリプト式を使って値を出力します。

基本的なJSPファイルの構成イメージ

記述要素役割
<%@ page ... %>pageディレクティブJSPファイル全体の設定
<% Javaの処理 %>スクリプトレット変数宣言や計算などのJava処理
<%-- コメント --%>JSPコメント開発者向けのメモ
からテンプレートHTMLとして出力される部分
<%= 値や式 %>スクリプト式Javaの値や式の結果を出力

この形を理解しておくと、JSPファイルの全体像をつかみやすくなります。

JSPでは、HTMLの部分は基本的にそのまま出力されます。一方、<% %> や <%= %> のようなJSP特有の記法は、サーバ側でJavaの処理として扱われます。

JSPファイルの例

ここでは、学習者名と学習テーマを表示するJSPファイルを例にします。

スクリプトレットでJavaの変数を用意し、HTMLの中でスクリプト式を使ってその値を表示します。

JSPファイルの例

<%@ page contentType="text/html; charset=UTF-8" %>
<%
String learnerName = "青山 直人";
String topic = "JSPの基本文法";
int lessonNumber = 4;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学習状況</title>
</head>
<body>
<p><%= learnerName %>さんは、第<%= lessonNumber %>回で<%= topic %>を学習しています。</p>
</body>
</html>

このJSPファイルには、pageディレクティブ、スクリプトレット、テンプレート、スクリプト式が含まれています。

ファイルの先頭にあるpageディレクティブでは、レスポンスとして返す内容がUTF-8のHTMLであることを設定しています。

<% %> の中では、learnerName、topic、lessonNumberというJavaの変数を宣言しています。

HTMLの本文では、<%= learnerName %>、<%= lessonNumber %>、<%= topic %>を使って、変数の値を画面に出力しています。

実行して出力されるHTML

JSPファイルをリクエストすると、TomcatがJSPを処理し、最終的にはHTMLをブラウザへ返します。

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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学習状況</title>
</head>
<body>
<p>青山 直人さんは、第4回でJSPの基本文法を学習しています。</p>
</body>
</html>

JSPファイル内のHTML部分は、そのまま出力されます。

一方、スクリプト式で書かれていた部分は、Javaの変数の値に置き換わっています。つまり、<%= learnerName %> は 青山 直人 に、<%= lessonNumber %> は 4 に、<%= topic %> は JSPの基本文法 に変わっています。

ブラウザが受け取るのはJSPファイルそのものではありません。JSPが実行された結果として生成されたHTMLです。

図2:JSPファイルからHTMLが生成される流れ

この図から分かること

JSPファイルでは、HTMLの中にJavaの処理を埋め込めます。

TomcatがJSPを処理すると、スクリプトレットで用意した変数の値が、スクリプト式によってHTMLの中へ差し込まれます。その結果、ブラウザには完成したHTMLが返されます。

HTML部分はそのまま出力され、Javaの値を表示する部分だけが具体的な値へ置き換わる、という流れを理解しておくと、JSPの基本的な動きが分かりやすくなります。

スクリプトレット

スクリプトレットは、JSPファイルの中にJavaのコードを書くための要素です。

基本形は次のとおりです。

<% Javaのコード %>

スクリプトレットの中には、変数宣言、代入、計算、条件分岐、繰り返し処理など、Javaの処理を書けます。

たとえば、JSPファイル内で点数を計算したい場合、スクリプトレットで変数を用意できます。

スクリプトレットの記述例

<% int javaScore = 80; int jspScore = 90; %>

このように1つのスクリプトレット内に複数のJava文を書くこともできます。

スクリプトレットは、1つのJSPファイル内に複数書けます。また、ある場所で宣言した変数は、その宣言より後ろに書かれた同じJSPファイル内のスクリプトレットやスクリプト式で利用できます。

スクリプトレットで宣言した変数を後で使う例

<% int javaScore = 80; int jspScore = 90; %>

<% int totalScore = javaScore + jspScore; %>

この例では、最初のスクリプトレットでjavaScoreとjspScoreを宣言しています。その後ろにある別のスクリプトレットでは、先に宣言した2つの変数を使ってtotalScoreを計算しています。

スクリプトレットを分けて書く

スクリプトレットは、Javaの処理全体を1か所にまとめるだけでなく、HTMLを挟みながら分けて書くこともできます。

たとえば、繰り返し処理の開始部分と終了部分を別々のスクリプトレットに分け、その間にHTMLを書くことができます。

繰り返し処理を分けて書く例

<% for (int i = 1; i <= 3; i++) { %>
    <p>JSPの基本を練習しています。</p>
<% } %>

この書き方では、for文の開始部分を最初のスクリプトレットに書き、繰り返し表示したいHTMLをその間に書き、最後のスクリプトレットで閉じ波括弧を書いています。

結果として、pタグの文章が3回出力されます。

分けて書くときの注意点

注意点内容
開始と終了を対応させるfor文やif文の波括弧を忘れない
HTMLはJava処理の中に挟まれる繰り返しや条件分岐の対象としてHTMLを扱える
読みやすさを意識する複雑になりすぎると見通しが悪くなる

この書き方はJSPらしい特徴の1つです。HTMLを自然に書きながら、Javaの制御構文で表示内容を変えられます。

スクリプト式

スクリプト式は、Javaの変数や式の結果をHTMLへ出力するための要素です。

基本形は次のとおりです。

<%= Javaのコード %>

スクリプト式は、値を表示したい場所に書きます。

たとえば、変数nameに入っている値を画面に表示したい場合は、<%= name %>のように書きます。

スクリプト式では、最後にセミコロンを書きません。これは大切なポイントです。

スクリプト式で出力できるもの

書き方出力される内容
<%= learnerName %>変数に代入されている値
<%= javaScore + jspScore %>演算結果
<%= topic.length() %>メソッドの戻り値
<%= topic %>オブジェクトの文字列表現

スクリプト式は、System.out.printlnのように、値を表示するために使うものと考えると分かりやすいです。

ただし、System.out.printlnはコンソールへ出力する命令です。一方、JSPのスクリプト式は、ブラウザへ返すHTMLの中へ値を出力します。

スクリプト式にセミコロンを書かない理由

スクリプト式は、Javaの文を書く場所ではなく、値や式の結果を出力する場所です。

そのため、<%= learnerName; %> のようにセミコロンを書くと、正しく扱えません。

正しい例誤りの例
<%= learnerName %><%= learnerName; %>
<%= javaScore + jspScore %><%= javaScore + jspScore; %>

スクリプトレットではJavaの文を書くため、セミコロンが必要です。

一方、スクリプト式では値を出力するため、セミコロンは不要です。

この違いは間違えやすいので、スクリプトレットは処理を書く場所、スクリプト式は値を表示する場所、と分けて覚えましょう。

図3:スクリプトレットとスクリプト式の使い分け

この図から分かること

スクリプトレットとスクリプト式は、どちらもJSPでJavaを扱うための記法ですが、役割が異なります。

スクリプトレットは、変数宣言、計算、条件分岐、繰り返しなど、Javaの処理を書く場所です。スクリプト式は、変数や式の結果をHTMLへ出力する場所です。

つまり、スクリプトレットは処理をするため、スクリプト式は表示するために使います。この違いを理解しておくと、JSPファイルの中でどの記法を使えばよいか判断しやすくなります。

JSPコメント

JSPコメントは、JSPファイルの中に開発者向けのメモを書くための要素です。

基本形は次のとおりです。

<%-- コメント --%>

JSPコメントは、JSPが処理されるときに無視されます。そのため、ブラウザへ返されるHTMLには含まれません。

JSPコメントの例

<%-- 学習状況を表示するための変数を用意する --%>

コメントは、なぜその処理を書いているのか、どのような値を扱っているのかを補足するために使います。

特に学習中は、あとで読み返したときに処理の意味を思い出しやすくなるため、適切にコメントを入れると理解しやすくなります。

スクリプトレット内ではJavaコメントを使う

JSPコメントとJavaコメントは、使う場所が異なります。

JSPファイル全体に対するメモにはJSPコメントを使います。一方、スクリプトレットの中にJavaコードとしてコメントを書く場合は、Javaの文法に従ったコメントを使います。

JSPコメントとJavaコメントの例

<%-- 合計点を計算するJSPコメント --%>
<%
// Javaのコメント
int javaScore = 80;
int jspScore = 90;
int totalScore = javaScore + jspScore;
%>

この例では、スクリプトレットの外側にJSPコメントを書き、スクリプトレットの内側にJavaコメントを書いています。

コメントの使い分け

コメント書く場所レスポンスへの出力
JSPコメントJSPの中出力されない
Javaコメントスクリプトレットの中出力されない
HTMLコメントHTML部分出力される

JSPコメントとJavaコメントは、どちらもレスポンスには出力されません。HTMLコメントはレスポンスとしてブラウザへ送られます。

pageディレクティブ

pageディレクティブは、JSPファイル全体に関する設定を書くための要素です。

基本形は次のとおりです。

<%@ page 属性名="値" %>

属性名と値を指定することで、JSPファイルの動作や出力内容に関する設定を行います。

複数の属性を指定する場合は、半角スペースで区切って記述します。

pageディレクティブでよく使う属性

属性名設定内容デフォルト値
contentTypeレスポンスのContent-Typeヘッダtext/html; charset=ISO-8859-1
importインポートするクラスまたはインタフェースjava.lang.、jakarta.servlet.、jakarta.servlet.jsp.、jakarta.servlet.http.
pageEncodingJSPファイルの文字コードcontentType属性の指定に準じる
languageJSPで使用する言語java

この中で、最初に覚えたいのはcontentType属性とimport属性です。

contentType属性は、ブラウザへ返すデータの種類や文字コードを指定します。import属性は、JSP内で利用するJavaのクラスやインタフェースを読み込むために使います。

contentType属性でContent-Typeヘッダを指定する

JSPファイルも、サーブレットクラスと同じように、レスポンスとして返す内容の種類と文字コードを指定する必要があります。

HTMLを出力するJSPファイルでは、次のように指定します。

<%@ page contentType="text/html; charset=文字コード" %>

UTF-8のHTMLを返す場合は、次のように書きます。

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

この設定は、JSPファイルのお約束として覚えておくとよいでしょう。EclipseでJSPファイルを新規作成すると、自動的に記述される場合があります。

contentType属性の意味

指定意味
text/htmlレスポンス本文がHTMLであることを示す
charset=UTF-8HTMLをUTF-8の文字コードで返すことを示す

ブラウザはContent-Typeヘッダを見て、受け取った本文をどのように扱うか判断します。日本語を含むHTMLを正しく表示するためにも、UTF-8を指定しておくと安心です。

import属性でクラスをインポートする

JSPファイル内でJavaのクラスを使う場合、pageディレクティブのimport属性を使ってインポートできます。

基本形は次のとおりです。

<%@ page import="パッケージ名.クラス名" %>

たとえば、日付を扱うLocalDateを使いたい場合は、次のように記述します。

<%@ page import="java.time.LocalDate" %>

複数のクラスを使う場合は、pageディレクティブを複数行に分けて書くこともできます。

<%@ page import="java.time.LocalDate" %>
<%@ page import="java.util.ArrayList" %>

また、1つのpageディレクティブ内で複数のクラスをまとめて指定することもできます。

<%@ page import="java.time.LocalDate, java.util.ArrayList" %>

contentType属性とimport属性を同じpageディレクティブにまとめることもできます。

<%@ page contentType="text/html; charset=UTF-8" import="java.util.*" %>

自動的にインポートされる主なパッケージ

パッケージ内容
java.langStringやMathなど、Javaの基本的なクラス
jakarta.servletサーブレット関連の基本クラス
jakarta.servlet.jspJSP関連のクラス
jakarta.servlet.httpHTTPサーブレット関連のクラス

これらのパッケージは自動的にインポートされるため、明示的にimportを書かなくても使えるものがあります。

ただし、java.time.LocalDateやjava.util.ArrayListのようなクラスを使う場合は、必要に応じてimport属性を指定します。

自作のクラスをJSPでインポートする場合は、そのクラスがパッケージに所属している必要があります。パッケージに所属していないクラスは、JSPから扱いにくくなるため注意しましょう。

JSPコメントとHTMLコメントの違い

JSPファイルには、JSPコメントだけでなくHTMLコメントも書けます。

HTMLコメントの基本形は次のとおりです。

ただし、JSPコメントとHTMLコメントには大きな違いがあります。

JSPコメントは、JSPの処理時に無視されるため、ブラウザへ返されるHTMLには含まれません。

一方、HTMLコメントはHTMLの一部としてレスポンスされます。そのため、ブラウザのHTML表示機能を使うと、ユーザーから見える可能性があります。

コメントの違いを確認するJSPの例

<%@ page contentType="text/html; charset=UTF-8" %>
<%-- JSPコメント:この内容はレスポンスされません --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>コメントの確認</title>
</head>
<body>
<!-- HTMLコメント:この内容はレスポンスされます -->
<p>コメントの違いを確認しています。</p>
</body>
</html>

このJSPを実行すると、JSPコメントはレスポンスに含まれません。

しかし、HTMLコメントはHTMLの一部としてブラウザへ送られます。画面上には通常表示されませんが、ブラウザのHTMLソース表示や開発者ツールを使えば確認できます。

JSPコメントとHTMLコメントの使い分け

コメントレスポンスに含まれるか使いどころ
JSPコメント含まれない開発者だけが読むメモ
HTMLコメント含まれるHTML上に残しても問題ない説明

パスワード、内部仕様、個人情報、管理用のメモなど、ユーザーに見られて困る内容はHTMLコメントに書かないようにしましょう。

開発者だけが読むメモとして残したい場合は、JSPコメントを使います。

JSPファイルを読むときの考え方

JSPファイルを読むときは、すべてを同じものとして見ないことが大切です。

まず、HTMLとしてそのまま出力されるテンプレート部分を確認します。次に、Javaの処理を書くスクリプトレットを見ます。そして、画面に値を出力しているスクリプト式を確認します。

pageディレクティブがあれば、文字コードやimportなど、JSP全体の設定を確認します。コメントがあれば、JSPコメントなのかHTMLコメントなのかを区別します。

JSPを読む順番

順番見る部分確認する内容
1pageディレクティブ文字コードやimportの設定
2スクリプトレット変数宣言やJavaの処理
3テンプレートHTMLの構造
4スクリプト式どの値を画面に出力しているか
5コメントJSPコメントかHTMLコメントか

この順番で読むと、JSPファイルの構成を整理しやすくなります。

特に、スクリプトレットとスクリプト式の違いを理解しておくと、JSPの基本文法をかなり読みやすくなります。

最初に覚えたいJSPの基本文法

JSPの構成要素は多くありますが、最初からすべてを使いこなす必要はありません。

基本的なJSPファイルを作成するうえでは、次の要素を優先して覚えるとよいでしょう。

要素基本形役割
pageディレクティブ<%@ page 属性名="値" %>JSP全体の設定
スクリプトレット<% Javaのコード %>Javaの処理を書く
スクリプト式<%= Javaのコード %>値や式の結果を出力する
JSPコメント<%-- コメント --%>レスポンスされないコメントを書く
テンプレートHTMLHTMLとしてそのまま出力される

JSPでは、HTMLを自然に書きながら、必要な場所だけJavaの記法を使います。

テンプレートで画面の形を作り、スクリプトレットで値を準備し、スクリプト式でその値を表示する。この流れを意識すると、JSPの基本的な読み書きがしやすくなります。