JSPとサーブレットの関係
それにしても、ここまで登場したオブジェクトの収めてある変数、どこかで見た記憶があるものばかりです。response、request、out……。どれもこれも、JSPで使っていた「暗黙オブジェクト」と同じ変数名です。これは、偶然の一致でしょうか。それとも、わざわざ変数名を同じものに揃えてある? ――実は、そうです。では、何のために?
それは、「JSPというものの正体に気づかせるため」です。今までJSPを使ってきましたが、その際、ところどころで「よくわからないだろうけれど、こうなんだ!」と非常に奥歯に物の挟まったような物言いをしてきたところがありました。
実をいえば、Javaの世界には「JSPという言語」は存在しないのです。では、今まで使ってきたJSPとは何なのか? それは「HTML付きのタグをJavaのソースコードに変換し、コンパイルして実行する装置」だったのです。要するに、JSPとは「スクリプトを元にサーブレットを自動的に作って動かす技術」だったのです。
ここで、ちょっとした実験をしてみましょう。例えば、このようなメソッドを用意しておきます。
public String changeJSPtoServlet(String s){ String src = "protected void doGet(HttpServletRequest request,\n"; src += "HttpServletResponse response)\n"; src += "throws ServletException, IOException {\n"; src += "ServletOutputStream out = response.getOutputStream();\n"; String s0 = s.replace("<%",""); s0 = s0.replace("%>", ""); s0 = s0.replace("<", "out.println(\"<"); s0 = s0.replace(">", ">\");"); src += s0 + "}"; return src; }
これは、引数に渡したJSPのソースコードを変換して返すメソッドです。これに、下のようなソースコードを引数として渡してみます。すると、どのような形に変換されて返ってくるでしょうか。
<html> <body> <% out.println("Hello"); %> </body> </html>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); out.println("<html>"); out.println("<body>"); out.println("Hello"); out.println("</body>"); out.println("</html>"); }
以下の画面は、changeJSPtoServletを実装し、JTextAreaのテキストを変換して表示するプログラムを書いて動かしてみたところです。JSPがサーブレットに変換される基本原理が見えてくると思います。

いかがですか? JSPのスクリプトというのは、実は意外と簡単にサーブレットのソースコードに変換できることが分かるでしょう。もちろん、実際にはこんな大雑把なものではなく、もっときめ細かな変換処理が必要となりますが、基本的にはこのようにJSPのソースコードはサーブレットのソースコードに変換されるのです。
JSPとJavaサーバ
JSPのファイルが呼び出されると、Javaサーバはそれに相当するサーブレットが作成済みかどうかをチェックします。そしてまだない場合には、そのJSPのソースコードを解析し、サーブレットクラスのソースコードに変換して保存し、コンパイルする、といった処理を自動的に行います。そして、作成されたサーブレットを呼び出して実行していたのです。
サーバサイドで動くJavaプログラムというのは、「サーブレット」だけであり、JSPはあくまで「簡単なスクリプトからサーブレットを作る機能」であったのです。このことが分かると、JSPにまつわる疑問が解消されてきます。例えば、「暗黙オブジェクト」の存在です。
暗黙オブジェクト
暗黙オブジェクトとは、生成されるサーブレットにあらかじめ用意されることが決められている変数です。先ほどの実験を思い返してみてください。あらかじめ「out」という変数が作成されることがわかっていれば、このoutを使った処理を元のテキストに用意しておくことが可能になります。同様に、引数で渡されるrequestやresponseも、そういう変数名で渡されることがわかっていれば、それを使った処理をJSPに書いておくことができます。これが、「暗黙オブジェクト」の正体だったのです。
いかがですか。サーブレットが分かると、JSPという技術の仕組みがすっきりと理解できるはずです。仕組みがわかった上でJSPを利用すると、何もわからずにコードを書くより、はるかに柔軟にJSPを扱えるようになります。
JSPの役割
JSPの正体は、サーブレットですが、では「それなら全部サーブレットで書けばいい」かと言うと、実はそうではありません。JSPにはサーブレットにはないよさがあります。それは「修正の容易さ」と「HTMLとの親和性」です。
Webの表示というのは、HTMLで書かれます。この表示は、「一度完成したら二度と修正しない」というようなものではありません。逆に、非常に頻繁に細かく修正しながら使っていくのが普通でしょう。そのような場合、すべてをサーブレットで出力させるとしたら、後々の修正がどれだけ面倒になるでしょうか。――先ほど、簡単なフォームをサーブレットで表示させましたね。たったあれだけのものでさえ、out.println文のかたまりのようになってしまいました。あれを見て、即座に出力されるHTMLの内容が分かる人はどれだけいたでしょう。
JSPは、HTMLの中にコードを埋め込みますから、HTML部分の修正は実に容易です。また修正したものは自動的に再コンパイルされますから、その後のサーバのデプロイ(公開)処理なども不要です。HTMLファイルと大差ない感覚で手直しをしていけるのです。サーブレットで書くと、ソースコードを読んでHTMLを出力しているコードを修正し、コンパイルしてサーバにアップロードして……といったことを行わなければいけません。
HTMLファイル並みの手軽さで扱えるJava。これこそがJSPの最大の利点なのです。GUI出力のように、HTMLタグを多量に書き出すような処理、または頻繁に更新される処理はJSPを使い、複雑だが一度完成すれば修正はしないような処理はサーブレットで実装する。こうした使い分けが重要でしょう。
