Javaで 作成するWebアプリの種類には、Servlet(サーブレット)とJSP(Java Server Pages、ジェー・エス・ピー)の2つがあります。ここでは、ServletとJSPの構造と、それぞれの役割分担を説明します。

『Java Webアプリの基本、ServletとJSPを理解する』イメージ画像
『Java Webアプリの基本、ServletとJSPを理解する』イメージ画像
チャレンジ&ナレッジ最終更新日: 20180323

知っておきたい Java ServletとJSPの概念

  • このエントリーをはてなブックマークに追加

Javaで 作成するWebアプリの種類には、Servlet(サーブレット)とJSP(Java Server Pages、ジェー・エス・ピー)の2つがあり、実用的なWebアプリはたいてい、これらの2つで役割を分担・連携させて作成されます。Servletがユーザーの要求に応じた処理を行い、JSPがその結果をWebページとして返すのです。ここではWEBディレクションをされている方やWEBデザイナーの方が知っておきたい、ServletとJSPの構造とそれぞれの役割分担を説明します。

ServletとJSPは、実質的に同じもの

突然ですが、以下に、1~3の乱数(ランダムな数)を返すServletから主要な部分を抜き出したプログラムを示します。実用的なServletでは、データベースをアクセスし、その結果を返すことが多いのですが、ここでは、説明の都合上、1~3の乱数を返すという単純な処理にしています。ここではプログラムの内容や文法を理解する必要はありません。Javaのコードの中に <html> や <head> などのHTMLを返す処理が記述されていることに注目してください(赤色で示しています)。

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
  // 1~3の乱数を生成する
  int r = (int)(Math.random() * 3) + 1;

  // WebブラウザにHTMLを送る
  response.setContentType("text/html; charset=UTF-8");
  PrintWriter out = response.getWriter();
  out.println("<html>");
  out.println("<head>");
  out.println("<title>1~3の乱数を生成する</title>");
  out.println("</head>");
  out.println("<body>");
  out.println("<p>生成された乱数は、" + r + "です。</p>");
  out.println("</body>");
  out.println("</html>");
}

1~3の乱数を返すServlet(注目する部分を赤色で示す

今度は、以下に1~3の乱数を返すプログラムをJSPで作成しています。ここでもプログラムの内容を細かく理解する必要はありません。JSPは、HTMLファイルの中に、<% と %> で囲んでJavaのコードを記述したものである、ということに注目してください(赤色で示しています)。このJSPの機能は、先ほど紹介したServletと同じです。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 1~3の乱数を生成する
int r = (int)(Math.random() * 3) + 1;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>1~3の乱数を生成する</title>
</head>
<body>
<p>生成された乱数は、<%= r %>です。</p>
</body>
</html>

1~3の乱数を返すJSP(注目する部分を赤色で示す

Servletは、Javaのコードの中にHTMLがあるようなものです。逆に、JSPは、HTMLの中にJavaのコードがあるようなものです。同じ機能のWebアプリを、ServletとJSPのどちらを使っても作れます。それもそのはず、実は、JSPは、Servletに変換されてから実行される仕組みになっているのです。つまり、ServletとJSPは、実質的に同じものなのです。

なぜServletとJSPの2つがあるのか

それでは、なぜWebアプリを作るのにServletとJSPという2つの手段が用意されているのでしょう。それは、プログラマーとデザイナーが仕事を分担できるようにするためです。一般的に、プログラマーというものは、Javaのプログラミングは得意でも、HTMLによるWebページの作成は苦手なものです。逆に、デザイナーというものは、HTMLによるWebページの作成は得意でも、Javaのプログラミングは苦手なものです。それなら、プログラマーにはServletでプログラミングに専念してもらい、デザイナーにはJSPでWebページの作成に専念してもらおう、というわけです。

一般的に、JavaでWebアプリを作るときには、1つのWebアプリ(1つのWebページ)に対して、ServletとJSPをペアで用意します。Servletがユーザーの要求(リクエスト)を受け取って処理を行い、その応答(レスポンス)となるWebページをJSPが返すのです。Webアプリへの主なリクエストの種類には、GETとPOSTがあります。GETは、「Webページをよこせ」というリクエストです。POSTは、「データを送るから処理しろ」というリクエストです。

例えば、ユーザーIDとパスワードを入力してログインを行うWebアプリを作るとしましょう。このWebアプリを、LoginServletというServletとlogin.jspというJSPのペアから構成することにします。

まず、WebブラウザのURL欄にLoginServlet を指定すると、LoginServletに対してGETリクエストが送られます。次に、Servletは、このGETリクエストに対する処理として、login.jspへフォワード(同じWebアプリ内で処理を先に進めること)を行います。

次に、login.jspは、レスポンスとして、ログインページのHTMLを返します。次に、このログインページにユーザーIDとパスワードを入力して「ログイン」ボタンをクリックすると、LoginServletにPOSTリクエストが送られ、一緒にユーザーIDとパスワードも送られます。最後に、LoginServletは、ユーザーIDとパスワードの検証を行い、ログイン成功のWebページもしくは、ログイン失敗のWebページにリダイレクト(異なるWebページに切り替えること)を行います。これが、ServletとJSPの役割分担の例です。1つのServletに、GETリクエストとPOSTリクエストそれぞれに対する処理を用意しておきます。

ログインを行うWebアプリにおけるServletとJSPの役割分担の概念図ログインを行うWebアプリにおけるServletとJSPの役割分担

ログインを行うWebアプリのServletとJSPの構造

以下は、LoginServletから、Servletの構造を理解するのに必要な部分だけを抜き出したものです。Javaのプログラムは、プログラム全体を「クラス」と呼ばれる単位で部品化して作ります。1つのServletは、基本的に1つのクラスとして作ります。public class LoginServlet extends HttpServlet { ・・・・ } で囲まれた範囲が、LoginServletというクラスです。クラスの中に、処理のまとまりを「メソッド」という単位で記述します。LoginServletには、doGetというメソッドと、doPostというメソッドがあります。doGetメソッドの { ・・・ } の中に、GETリクエストに対する処理を記述します。doPostメソッドの { ・・・ } の中に、POSTリクエストに対する処理を記述します。その他、プログラムの細かな部分は、気にしないでください。

public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    // ここにGETリクエストに対する処理を記述します
    // (処理内容は省略します)
  }

protected void doPost(HttpServletRequest request, HttpServletResponse response)
                                           throws ServletException, IOException {
    // ここにPOSTリクエストに対する処理を記述します
    // (処理内容は省略します)
  }
}

ログインを行うWebアプリのLoginServletの構造(注目する部分を赤色で示す

以下は、LoginServletからフォワードされるlogin.jspです。login.jspの中には、Javaのコードはありませんが、先頭にある <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> に注目してください(赤色で示しています)。これによって、このファイルが通常のHTMLファイルではなく、JSPであることを示しています。このようなJSPは、通常のHTMLファイルとして記述することもできます。この例を示したのは、「JSPは、HTMLファイルとほとんど同じものである」ということを感じてほしかったからです。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン</title>
</head>
<body>
<form method="POST" action="/LoginServlet">
<p>ユーザーID<input type="text" name="user_id"></p>
<p>パスワード<input type="password" name="password"></p>
<p><input type="submit" name="submit" value="ログイン">
</form>
</body>
</html>

ログインを行うWebアプリのLogin.jspの構造(注目する部分を赤色で示す

ELでJSPからJavaのコードを隠す

データベースから読み出したデータを表示するWebアプリを作る場合には、Servletでデータベースをアクセスし、それによって得たデータをWebアプリの共有メモリ(リクエストスコープやセッションスコープなどがあります)に格納し、そのデータをJSPでHTMLの中に表示する、という手順を踏みます。その際に、JSPで共有メモリからデータを読み出すには、以下のようなJavaのコードを書くことになります。プログラムの内容を細かく理解する必要はありません。短いながらも、Javaのコードを記述していることに注目してください。

<%
LoginData data = (LoginData)request.getAttribute("data");
%>
<p>ようこそ <%= data.getName() %> さん!</p>

JavaのコードでWebアプリの共有メモリからデータを読み出すJSP(注目する部分を赤色で示す

どんなに短いコードであっても、JSPの中にJavaのコードを書くなら、Javaというプログラミング言語の知識が必要です。それでは、役割分担をして、JSPをデザイナーに任せるという目的が達成できません。そこで、JSPには、EL(Expression Language、式言語)という表現が用意されています。ELは、JSPからJavaのコードを隠す仕組みです。ELを使うと、先ほどのWebアプリの共有メモリからデータを読み出すJSPは、以下のように記述できます。${name} の部分がELです。${name} だけで、「共有メモリからnameという名前のデータを読み出せ」という意味になります。

<p>ようこそ ${name} さん! </p>

ELでWebアプリの共有メモリからデータを読み出すJSP(注目する部分を赤色で示す

これがプログラマーとデザイナーが役割分担して作る、大規模なWebアプリを想定したJAVAのServletとJSPの構造とそれぞれの役割分担になります。簡単なプログラムの作成については「EclipseインストールからJavaプログラム作成まで」をご確認ください。

ライタープロフィール パソコン工房NEXMAG
[ネクスマグ] 編集部

パソコンでできるこんなことやあんなこと、便利な使い方など、様々なパソコン活用方法が「わかる!」「みつかる!」記事を書いています。

記事を
シェア