JSP/Servlet | サーブレット(Servlet) | サーブレットとJSPの違い

サーバーサイドJavaの基本といえる技術は、JSPのほかにもう一つある。それが「サーブレット(Servlet)」である。この2つはいったいどう違うのだろうか。

答えは「同じ」である。つまり、JSPとサーブレットは同じものだ。より正確に言えば、「JSPというサーバーサイド専用スクリプト言語」が存在するわけではない。JSPは実はサーブレットなのである。

少し整理してみよう。サーバーサイドJavaプログラムは、一般的なアプリケーションとはかなり異なる。アプリケーションはそのプログラムを起動して実行するが、サーバーサイドJavaプログラムはそうではない。

サーバーサイドにはJavaサーバーというものがあり、その中で動くプログラムを開発する仕組みになっている。たとえばWebブラウザーで「アプレット(Applet)」という小さなプログラムを含めて動かすものと似ていると考えればよい。アプレットはアプリケーションではない。あらかじめ小さなプログラムを実行する枠組みがあり、その枠組みに合わせて作られたプログラムをWebページに埋め込むと、自動的に認識されて動作する。

サーバーサイドも同じである。Javaサーバーには、その中でプログラムを動作させるための仕組みが用意されている。そして、その仕組みに従ってプログラムを作り、組み込んでおく。ユーザーがそのプログラムに割り当てられたURLへアクセスすると、Javaサーバーがそのプログラムを実行する。

この「Javaサーバーで動く小さなプログラム」がサーブレットである。「Webページとアプレット」をそのまま「Javaサーバーとサーブレット」に置き換えて考えてみよう。

ではJSPとは何か。サーブレットは結局Javaプログラムなので、作るのも少し大変である。すべてJavaでコーディングしなければならない。内部処理だけでなく、クライアント、つまりWebブラウザーに表示されるHTMLコードもすべてJavaコードで書かなければならない。HTMLをすべてprintlnで作ることを想像してみよう。かなり大変な作業だと思うはずだ。

そこで「もっと簡単にサーバーサイドJavaを使えるようにする」ものとして考えられたのがJSPである。Javaサーバーが実行しているとはいえ、「簡単なタグで書かれたJavaコードをそのまま実行する」わけでは実はない。

JavaサーバーはJSPコードを読み込み、それをサーブレットのソースコードへ変換する。HTMLタグなどもすべてprintlnで書かれるように変換される。そうして生成されたサーブレットソースコードをコンパイルし、サーブレットを生成してそれを呼び出す。つまり、「JSPがサーブレット」になるのである。

JSP Servlet Complie

同じとはいっても、扱うユーザーにとってはかなり違いがある。JSPはHTMLの中に処理を含められるため、HTMLページに何かを追加する場合には非常に便利である。逆にサーブレットは、HTMLとして細かく出力しなくてもよい場所で活用すると役に立つ。つまり、フロントエンド、ユーザーに表示される側はJSPにし、バックエンド、サーバーで動く見えない側はサーブレットにする、というように両方をうまく使い分けるとよい。

サーブレットのバージョン

サーブレットの基本的な作り方の説明に入る前に、知っておくべきことが一つある。それは「サーブレットのバージョン」である。

サーブレットもサーバーサイドJavaのAPIとして提供されている。もちろん継続的に改善されており、ときどきバージョンアップするとさまざまな機能が利用できるようになる。問題は「最新バージョンでサーブレットを作っても、使用するサーバー、つまりWASが対応していなければ使えない」という点である。

現在サーブレットを利用しようとすると、バージョンは明確に2つに分かれると言ってよい。それは「3.0」以前と以後である。サーブレット3.0ではかなり大きな改善が行われ、作り方も大きく変わった。基本コードは変わらないが、3.0以前ではサーブレットコードのほかに設定ファイルなどを書かなければならなかった。3.0ではサーブレットコードだけを書けば、他には何も必要なくなった。

ここで現在のサーバー、サーブレット、JSP情報を確認できる例を作ってみよう。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Info jsp</title>
<style>
h1 {
    font-size: 16pt;
    background: #AAFFAA;
    padding: 5px;
}
</style>
</head>
<body>
    <h1>Sample jsp page</h1>
    <p>このページはサンプルです。</p>
    <p>サーバー情報: <%=application.getServerInfo()%></p>
    <p>サーブレット情報: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%></p>
    <p>JSP情報: <%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%></p>
</body>
</html>

上ではapplicationからサーバーおよびサーブレット情報を取得して表示し、JspFactoryオブジェクトから仕様のバージョン情報を表示している。

GAEで対応しているサーブレットバージョン

GAEは実はまだ3.0をサポートしていない。その前の「2.5」というバージョンである。したがって、最新バージョンに比べるといろいろ面倒である。この入門ではGAEを使うが、基本的には「JSP/サーブレット入門」である。そのため3.0についても触れるが、GAEでは動作しない。そこで、「2.5ベースで作っていくが、いったん3.0についても説明しておくので、もしGAEが対応するようになったら自分で修正して試してほしい」という方針で進める。

サーブレットバージョン表

Servlet Spec JSP Spec WebSocket Spec Tomcat Version Supported Java Version
4.0 2.3 1.1 9.0.x 8
3.1 2.3 1.1 8.0.x 7
3.0 2.2 1.1 7.0.x 6
2.5 2.1 N/A 6.0.x 5
2.4 2.0 N/A 5.5.x 1.4
2.3 1.2 N/A 4.1.x 1.3
2.2 1.1 N/A 3.3.x 1.1