サーブレット&JSPの基本|Webアプリケーションとサーブレット・JSP

ブラウザの操作をJavaの処理へつなぎ、結果をWebページとして届けるしくみを理解しよう。

検索サイトでキーワードを入力すると、入力内容に合った検索結果が表示されます。ショッピングサイトで商品を選んで購入手続きを進めると、注文内容や合計金額が画面に反映されます。

このような画面は、あらかじめ用意されたHTMLファイルをそのまま表示しているだけではありません。ブラウザから送られた情報をWebサーバ側で受け取り、必要なプログラムを実行し、その結果に合わせて新しいHTMLを作成しています。

このしくみを利用して動作するものがWebアプリケーションです。

JavaでWebアプリケーションを開発するときは、主にサーブレットとJSPを使用します。サーブレットはブラウザからのリクエストを受け取って処理を進める技術で、JSPは処理結果を利用してブラウザへ返す画面を作る技術です。

サーブレットとJSPは別々の技術に見えますが、どちらもサーバ側で動作し、最終的にはブラウザへHTMLを返すという共通の目的を持っています。

ここでは、Webアプリケーションとは何か、サーバサイドプログラムがどのように動作するのか、そしてサーブレットとJSPがどのように関係しているのかを順番に見ていきましょう。

Webアプリケーションとは

Webアプリケーションとは、Webのしくみを利用して提供されるアプリケーションです。

利用者はパソコンやスマートフォンに専用のプログラムをインストールする代わりに、ブラウザからURLへアクセスして利用します。

身近なWebアプリケーションには、次のようなものがあります。

分野Webアプリケーションの例
情報検索Web検索、地図、乗換案内
コミュニケーションSNS、Webメール、チャット
買い物ショッピングサイト、予約サイト
金融インターネットバンキング、決済サービス
業務顧客管理、販売管理、在庫管理
教育オンライン学習、試験システム
公共サービス申請、予約、情報照会

どのサービスもブラウザにWebページを表示しますが、画面の裏側では、利用者の操作に応じてサーバ側のプログラムが動いています。

たとえば、書籍販売サイトでJavaと入力して検索した場合、Webアプリケーションは次のような処理を行います。

  1. ブラウザから検索条件を受け取る
  2. 検索条件に一致する書籍を探す
  3. 書籍名や価格などの情報を取得する
  4. 検索結果を表示するHTMLを作る
  5. 作成したHTMLをブラウザへ返す

利用者から見えるのは検索結果のWebページですが、その画面が表示される前に、サーバ側では複数の処理が行われています。

一般的なアプリケーションとの違い

従来のデスクトップアプリケーションは、利用するパソコンへプログラムをインストールして実行する形が一般的です。

一方、WebアプリケーションはWebサーバ側に配置され、利用者はブラウザからアクセスします。

比較項目デスクトップアプリケーションWebアプリケーション
利用方法端末にインストールして実行するブラウザからURLへアクセスする
主な処理場所利用者の端末Webサーバ
更新方法端末ごとに更新する場合があるサーバ側の更新を利用者へ反映しやすい
利用端末インストールした端末が中心ブラウザが使える複数の端末
データ共有端末内で管理することがあるサーバやデータベースで共有しやすい
通信必須とは限らない基本的にネットワーク通信を利用する

Webアプリケーションは、ブラウザと通信環境があれば利用しやすいという特徴があります。

ただし、すべての処理をブラウザだけで行っているわけではありません。利用者の認証、商品の検索、注文の登録など、重要な処理の多くはWebサーバ側で実行されます。

図1:ブラウザからWebアプリケーションを利用する流れ

この図から分かること

Webアプリケーションでは、ブラウザから送られたリクエストをきっかけに、Webサーバ側のプログラムが動きます。

検索の場合は、入力された条件を受け取り、必要なデータを探し、その結果を使ってHTMLを作成します。作成されたHTMLはHTTPレスポンスとしてブラウザへ返されます。

利用者が目にするWebページは、Webアプリケーションの処理結果です。同じページへアクセスしても、入力内容や利用者の状態によって、表示される内容が変わることがあります。

静的なWebページと動的なWebページ

Webサーバからブラウザへ返されるページには、大きく分けて静的なWebページと動的なWebページがあります。

静的なWebページ

静的なWebページでは、Webサーバに保存されているHTMLファイルをそのままブラウザへ返します。

基本的には、誰がアクセスしても同じ内容が表示されます。

会社案内、施設紹介、利用規約など、頻繁に表示内容が変わらないページに適しています。

動的なWebページ

動的なWebページでは、ブラウザから送られた情報やデータベースの内容に合わせて、サーバ側のプログラムがHTMLを生成します。

検索結果、会員ページ、注文確認画面などは、利用者や操作内容によって表示が変わります。

比較項目静的なWebページ動的なWebページ
HTMLの用意方法作成済みのHTMLファイルを使うリクエストに応じてHTMLを生成する
表示内容基本的に固定される利用者や入力内容によって変わる
サーバ側の処理ファイルを返す処理が中心検索、計算、登録などを行う
データベース必須ではない必要に応じて利用する
主な用途会社案内、利用規約検索、ログイン、購入、予約

サーブレットとJSPは、主に動的なWebページを作るために使われます。

WebアプリケーションもHTTPを利用する

Webアプリケーションの通信でも、これまで学んだHTTPリクエストとHTTPレスポンスが使われます。

利用者が検索ボタンを押した場合、ブラウザは検索条件を含むHTTPリクエストをWebサーバへ送ります。

Webサーバ側では、Webアプリケーションがリクエストを受け取り、必要な処理を行います。その後、処理結果からHTMLを生成し、HTTPレスポンスとしてブラウザへ返します。

処理の流れを整理すると、次のようになります。

段階動作
1利用者がブラウザを操作する
2ブラウザがHTTPリクエストを送る
3Webサーバがリクエストを受け取る
4Webアプリケーションが処理を行う
5WebアプリケーションがHTMLを生成する
6WebサーバがHTTPレスポンスを返す
7ブラウザがHTMLを表示する

利用者は、Webアプリケーションのプログラムそのものを直接操作しているわけではありません。ブラウザからリクエストを送り、その結果をWebページとして受け取っています。

サーバサイドプログラムとは

ブラウザからのリクエストを受けて、Webサーバ側で動作するプログラムをサーバサイドプログラムと呼びます。

サーバサイドプログラムは、利用者の端末ではなく、Webサーバやアプリケーションサーバ上で実行されます。

主な役割は次のとおりです。

  • ブラウザから送られた情報を受け取る
  • 入力内容が正しいか確認する
  • 必要な計算を行う
  • データベースを検索する
  • データを登録、更新、削除する
  • ログイン状態を管理する
  • 表示するデータを準備する
  • 処理結果をHTMLとして返す

たとえば、書籍販売サイトには、検索だけでなく、詳細表示、カート追加、購入確定などの処理があります。

利用者が異なる操作を行うたびに、それぞれの処理に対応するサーバサイドプログラムが動作します。

ブラウザ側とサーバ側の役割

Webアプリケーションでは、ブラウザ側とサーバ側で役割を分担しています。

動作する場所主な役割
ブラウザ側画面表示、入力受付、リンクやボタンの操作
サーバ側入力処理、計算、認証、データベース操作
データベース商品、会員、注文などの情報を保存する

HTML、CSS、JavaScriptは主にブラウザ側で利用されます。

JavaによるサーブレットやJSPは、サーバ側で動作します。ただし、JSPの実行結果として作られたHTMLはブラウザ側へ送られます。

ブラウザが受け取るのは、JSPファイルそのものやJavaのソースコードではありません。サーバ側で処理された結果のHTMLです。

1回の操作ごとに処理が繰り返される

Webアプリケーションでは、利用者の操作に応じて、リクエストとレスポンスが何度も繰り返されます。

書籍販売サイトを例にすると、次のような通信が行われます。

利用者の操作サーバ側の処理返される画面
検索する条件に合う書籍を探す検索結果一覧
書籍を選ぶ選択された書籍を取得する書籍詳細
カートへ入れるカート情報を更新するカート内容
購入手続きを進める注文情報を確認する注文確認
購入を確定する注文を登録する購入完了

利用者にとっては、画面を順番に操作しているように見えます。その裏側では、操作ごとにHTTPリクエストが送られ、サーバサイドプログラムが実行され、新しいHTMLが返されています。

図2:操作ごとにサーバサイドプログラムが動くしくみ

この図から分かること

Webアプリケーションでは、検索、詳細表示、購入など、利用者の操作ごとに異なるサーバ側の処理が実行されます。

各プログラムはブラウザからリクエストを受け取り、必要に応じてデータベースを検索したり情報を更新したりします。その後、処理結果を反映したHTMLをブラウザへ返します。

Webアプリケーションは、1つの大きなプログラムだけで構成されるとは限りません。複数の処理を役割ごとに分け、連携させながらサービス全体を実現します。

Javaで作るサーバサイドプログラム

サーバサイドプログラムを開発するための技術には、さまざまなものがあります。

JavaでWebアプリケーションを開発する場合は、サーブレットとJSPが基本となります。

技術主な役割
サーブレットHTTPリクエストを受け取り、Javaで処理を行う
JSP処理結果を使ってHTMLを生成する

サーブレットもJSPもサーバ側で動作します。

どちらを使っても、最終的にブラウザへHTMLを返せます。ただし、記述方法と得意な役割が異なります。

サーブレットとは

サーブレットは、Javaを使ってサーバサイドプログラムを作るための技術です。

通常のJavaクラスとは異なり、ブラウザからのHTTPリクエストを受け取って動作するためのしくみを持っています。

サーブレットとして動作するクラスをサーブレットクラスと呼びます。会話の中や開発現場では、サーブレットクラスを単にサーブレットと呼ぶこともあります。

サーブレットは、主に次のような処理を担当します。

  • GETリクエストを受け取る
  • POSTリクエストを受け取る
  • フォームの入力値を取得する
  • 入力内容を確認する
  • Javaによる計算や判断を行う
  • データベースへアクセスする
  • 処理結果を保存する
  • 次に表示するJSPを選ぶ
  • JSPへ表示用のデータを渡す
  • 別のURLへ移動させる

サーブレットは、Webアプリケーションの処理の流れを制御する役割に向いています。

サーブレットコンテナの役割

サーブレットは、Javaのプログラムとして単独で起動するわけではありません。サーブレットコンテナと呼ばれる実行環境の中で動作します。

代表的なサーブレットコンテナにはApache Tomcatがあります。

サーブレットコンテナは、ブラウザとサーブレットの間に入り、次のような処理を担当します。

  • HTTPリクエストを受け取る
  • URLに対応するサーブレットを探す
  • 必要に応じてサーブレットを生成する
  • サーブレットのメソッドを呼び出す
  • リクエストやレスポンスを表すオブジェクトを渡す
  • セッションを管理する
  • 作成されたレスポンスをブラウザへ返す

ブラウザから見ると、Webサーバやサーブレットコンテナは1つの接続先に見えます。しかし、内部ではリクエストを適切なサーブレットへ振り分ける処理が行われています。

JSPとは

JSPはJavaServer Pagesの略で、Javaを利用して動的なWebページを作成するための技術です。

JSPでは、JSPファイルという形式のファイルを作成します。JSPファイルはHTMLを中心に記述できるため、ブラウザへ返す画面を組み立てる用途に向いています。

JSPは、主に次のような役割を担当します。

  • サーブレットから受け取った値を表示する
  • 検索結果を一覧として表示する
  • 会員名や商品名をHTML内へ埋め込む
  • 条件によって表示内容を切り替える
  • 複数のデータを繰り返し表示する
  • エラーメッセージや完了メッセージを表示する

サーブレットが処理を担当し、JSPが表示を担当するように分けると、Javaの処理とHTMLの画面構造を整理しやすくなります。

JSPもサーバ側で実行される

JSPファイルにはHTMLに近い内容が書かれているため、ブラウザがJSPを直接読み取っているように見えるかもしれません。

しかし、JSPはブラウザ側で実行されるファイルではありません。JSPもサーバ側で処理されます。

JSPが実行されると、サーブレットコンテナによってサーブレットクラスへ変換されます。その後、変換されたクラスがJavaのプログラムとして実行され、HTMLを生成します。

基本的な流れは次のとおりです。

  1. ブラウザがJSPに対応するURLへアクセスする
  2. サーブレットコンテナがJSPを確認する
  3. JSPがサーブレットクラスへ変換される
  4. 変換されたJavaコードがコンパイルされる
  5. 生成されたサーブレットが実行される
  6. 実行結果としてHTMLが作られる
  7. HTMLがブラウザへ返される

一度変換とコンパイルが行われた後は、変更がない限り、生成済みのものが再利用されるのが一般的です。

サーブレットとJSPは実現できることが近い

サーブレットもJSPも、実行結果としてHTMLを生成できます。

サーブレットからHTMLを直接出力することもできます。また、JSPの中に処理を多く書くことも技術的には可能です。

それでも2つの技術を使い分けるのは、得意な役割が異なるためです。

比較項目サーブレットJSP
基本となる記述JavaHTMLを中心とした記述
得意な役割入力受付、判断、計算、画面遷移処理結果の表示、画面構成
ファイルの種類JavaクラスJSPファイル
主な担当処理表示
実行時の形サーブレットクラスサーブレットクラスへ変換される
HTMLの書きやすさ多量のHTMLは管理しにくいHTMLを中心に書きやすい

サーブレットだけでも、次のような流れでHTMLを返せます。

  1. Javaの処理を行う
  2. HTMLを文字列として出力する
  3. ブラウザへレスポンスを返す

ただし、HTMLが長くなると、Javaの処理と画面の記述が混ざり、読みづらくなります。

JSPだけに多くのJava処理を書くと、今度は画面構造と業務処理が混ざり、管理しにくくなります。

そのため、処理はサーブレット、表示はJSPという分担がよく使われます。

サーブレットとJSPを組み合わせる流れ

サーブレットとJSPを組み合わせたWebアプリケーションでは、一般的に次のような流れで処理します。

  1. ブラウザがサーブレットへリクエストを送る
  2. サーブレットが入力値を取得する
  3. サーブレットがJavaで必要な処理を行う
  4. 必要に応じてデータベースへアクセスする
  5. サーブレットが表示用のデータを用意する
  6. サーブレットがJSPへ処理を引き継ぐ
  7. JSPが受け取ったデータを使ってHTMLを生成する
  8. 生成されたHTMLがブラウザへ返される

この構成では、ブラウザから送られるリクエストを最初に受け取るのはサーブレットです。

JSPはサーブレットが準備したデータを受け取り、表示に集中します。

処理と表示を分ける利点

サーブレットとJSPの役割を分けると、次のような利点があります。

  • Javaの処理をサーブレットへまとめられる
  • HTMLの画面構造をJSPへまとめられる
  • 処理の変更とデザインの変更を分けやすい
  • プログラムの役割を理解しやすい
  • 不具合が起きた場所を探しやすい
  • 複数人で作業を分担しやすい
  • 同じ処理結果を異なる画面で利用しやすい
  • 画面の再利用や修正がしやすい

たとえば、検索方法を変更したい場合は、主にサーブレットや関連するJavaクラスを修正します。

検索結果の表の色や配置を変えたい場合は、主にJSPやCSSを修正します。

役割が分かれていれば、処理の変更が画面へ与える影響や、画面の変更が処理へ与える影響を小さくしやすくなります。

図3:サーブレットとJSPの役割分担

ブラウザにはJavaのコードが送られない

サーブレットやJSPはサーバ側で動作するため、Javaのソースコードがそのままブラウザへ送られることはありません。

ブラウザへ返されるのは、サーバ側の実行結果です。

多くの場合、その実行結果はHTMLです。必要に応じてJSON、画像、PDFなどを返すこともできます。

サーバ側にあるものブラウザへ返されるもの
サーブレットクラス実行結果のHTMLなど
JSPファイル生成されたHTML
データベースの接続情報必要な結果だけ
Javaの計算処理計算結果
認証処理成功または失敗に応じた画面

このしくみにより、利用者はブラウザを通じてサーバ側の処理を利用できます。

ただし、サーバ側のJavaコードが直接見えないからといって、何をしても安全になるわけではありません。入力値の確認やアクセス制御などは、サーバ側で適切に実装する必要があります。

Webアプリケーションは状態を引き継ぐ必要がある

HTTPは、基本的に1回ごとのリクエストとレスポンスを独立したものとして扱います。

そのままでは、同じ利用者から続けて送られたリクエストであっても、前回の操作とのつながりを判断できません。

しかし、Webアプリケーションでは、次のような情報を引き継ぐ必要があります。

  • ログインしている利用者
  • カートに入れた商品
  • 入力途中の情報
  • 選択した検索条件
  • 直前に表示していた画面

このような状態を管理するために、Cookieやセッションなどのしくみを利用します。

サーブレットでは、利用者ごとのセッション情報を扱えます。これにより、複数のリクエストにまたがってログイン状態やカート情報を保持できます。

状態管理については後の学習で詳しく扱いますが、Webアプリケーションは単にHTMLを返すだけでなく、利用者の一連の操作をつなぐ必要があることを覚えておきましょう。

データベースとの連携

実際のWebアプリケーションでは、商品、会員、注文などの情報をデータベースに保存することがよくあります。

サーブレットから直接データベース処理を書く場合もありますが、規模が大きくなると、データベースを担当するJavaクラスを別に作成する構成が一般的です。

それぞれの役割は次のように整理できます。

構成要素主な役割
サーブレットリクエストを受け取り、処理の流れを制御する
JSP処理結果をWebページとして表示する
Javaクラス計算や業務処理を担当する
データベース操作クラスデータの検索、登録、更新、削除を担当する
データベースアプリケーションで利用する情報を保存する

役割を分けるほどファイルの数は増えますが、それぞれの責任が明確になり、修正やテストを行いやすくなります。

サーブレット・JSPを学ぶときの見方

これからサーブレットとJSPのプログラムを学ぶときは、コードだけを追うのではなく、通信と処理の流れを意識することが大切です。

特に、次の点を確認しながら進めると理解しやすくなります。

どのURLへアクセスしたのか

ブラウザがどのURLへリクエストを送ったのかを確認します。

URLとサーブレットの対応関係が分かると、どのサーブレットが動作するのかを判断できます。

GETとPOSTのどちらなのか

同じURLでも、GETとPOSTで異なる処理が行われることがあります。

サーブレットでは、リクエストメソッドに応じてdoGetやdoPostが呼び出されます。

どの値が送信されたのか

フォームから送信された名前や検索条件などを確認します。

入力要素のname属性が、サーブレット側で値を取得するときの手がかりになります。

サーブレットで何を処理したのか

取得した入力値を使って、どのような判断、計算、検索を行ったのかを確認します。

JSPへ何を渡したのか

サーブレットがどのデータを表示用としてJSPへ渡したのかを確認します。

ブラウザへ何が返されたのか

最終的に生成されたHTMLを確認します。

ブラウザはサーブレットやJSPの内部処理を見るのではなく、返されたHTMLを読み取って画面を表示します。

エラーが発生したときの切り分け

サーブレットとJSPを使ったWebアプリケーションでは、問題が起きた場所を段階ごとに分けて考えると原因を探しやすくなります。

症状主に確認する場所
ページが見つからないURL、サーブレットの対応付け、配置場所
GETで動くがPOSTで動かないform要素のmethod属性、doPost
入力値を取得できないinput要素のname属性、取得する名前
処理結果が正しくないサーブレットやJavaクラスの処理
JSPに値が表示されないJSPへ渡した属性名、表示側の記述
日本語が文字化けするリクエストとレスポンスの文字コード
500エラーになるJavaの例外、JSPのエラー、サーバのログ
古い画面が表示されるファイルの保存、再配備、ブラウザの再読み込み

Webアプリケーションは、ブラウザ、HTTP、Webサーバ、サーブレット、JSPなど、複数の要素が連携して動作します。

そのため、画面が表示されないからといって、必ずJSPに問題があるとは限りません。リクエストがサーブレットへ届いていない場合や、サーブレットの処理中にエラーが発生している場合もあります。

ブラウザからサーバへ送られ、処理され、HTMLとして戻ってくるまでの流れを順番に追うことが、問題解決の基本になります。

Webアプリケーション開発へのつながり

ここまでの学習で、HTML、URL、HTTPリクエスト、HTTPレスポンスというWebの基本を確認してきました。

サーブレットとJSPは、これらのしくみをJavaから利用するための技術です。

サーブレットはHTTPリクエストを受け取り、Javaによる処理を行います。JSPは処理結果をHTMLとして表現し、HTTPレスポンスの一部としてブラウザへ返します。

これから実際にサーブレットやJSPを作成するときは、次の流れを常に意識してみましょう。

  1. ブラウザからどのようなリクエストが送られるか
  2. どのサーブレットがリクエストを受け取るか
  3. サーブレットがどのような処理を行うか
  4. どのデータをJSPへ渡すか
  5. JSPがどのようなHTMLを生成するか
  6. ブラウザにどのような画面が表示されるか

この流れが理解できると、Javaのコードとブラウザの画面がどのようにつながっているのかが見えやすくなります。

サーブレットとJSPは単にJavaでHTMLを書くための技術ではありません。利用者の操作を受け取り、必要な処理を実行し、その結果を分かりやすいWebページとして返すための技術です。