SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

WTPではじめるサーバサイドJava入門

サーバサイドJava入門 サーブレットの実装とWARファイルの作成

第5回 JSPとサーブレットの仕組み


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を使い、複雑だが一度完成すれば修正はしないような処理はサーブレットで実装する。こうした使い分けが重要でしょう。

次のページ
サーブレットの公開の仕組み

この記事は参考になりましたか?

WTPではじめるサーバサイドJava入門連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1464 2008/08/19 20:44

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー