重点用語解説

サーバサイドJavaテクノロジ 重点キーワード

米持幸寿
日本アイ・ビー・エム
2000/10/10

 

JavaServer Pages(JSP)


JSP の概要

 今日では、サーブレットとJSPを組み合わせて開発するのは当たり前になっているが、開発手段にサーブレットしかなかった時代があった。そのころ、サーブレットでWebサイトを作るということになれば、サーブレットのJavaソースコードには「println」が山ほど並んで、HTMLのタグを書き出していた。レイアウトの複雑なページを作るとなれば、ページをデザインするHTMLエディタで、まずページを作り、その内容をサーブレットのソースコードにゴリゴリとコピーしてコンパイルしていたものである(リスト1)

リスト1

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;

public class EasyServlet extends HttpServlet {
 public void init( ServletConfig config ) throws  ServletException {
  super.init( config ); // ここで、必要に応じて初期化処理
 }

 public void destroy() {
  super.destroy(); // ここで、必要に応じて終了処理
 }

 public void service( HttpServletRequest req,  HttpServletResponse resp )
 throws ServletException, IOException {
  PrintWriter out = resp.getWriter();
  out.println( "<HTML>" );
  out.println( " <BODY>" );
  out.println( " <H1>カンタンなサーブレット!</H1>" );
  out.println( " </BODY>" );
  out.println( "</HTML>" );
 }
}

 筆者はそのころ、実際のプロジェクトにおいて「Javaプログラミングはできないが、HTMLは書ける」という人と仕事をしたことがある。この人にサーブレットのソースコードをメンテナンスしてもらうには無理がある。仕方がないので、HTMLに特殊なタグを作り、そのタグをHTMLに書き込んでもらうようにした。筆者のサーブレット・プログラムがそのHTMLをインプットとして読み込んで、該当部分を編集して送信する、というアイデアである。実は、JSPは同じような思想で生まれた。

 JSPファイルは、見た目にはHTMLファイルである。HTMLタグをテキストとして書き込み、ファイルを*.jsp というファイルで保管する。保管する場所も、HTTPサーバのHTMLを保存するドキュメント・ディレクトリである。違いは、特殊なタグを使うことにある。JSPで使うことのできるタグを以下に示す。

  • JSP 構文

%@〜%>  ディレクティブ
<SCRIPT>〜</SCRIPT>  SCRIPT タグ
<%〜%>  スクリプトレット(インラインJava コード)
<%=〜%>  Java 変数式(Java expressions for variable data )
<BEAN>〜</BEAN>  BEAN タグ

  • HTMLテンプレート構文

<INSERT>〜</INSERT>  INSERT タグ
<REPEAT>〜</REPEAT>  REPEAT タグ

 さて、このタグを使うと、ご想像のとおり、このタグ部分が置き換わってWebブラウザに送信されるという技術である。しかし、実際には、JSPは、このファイルをインプットにして動作するのではない。JSPファイルは、ディレクトリに保存されて、サーバから読み込まれると、いったんサーブレットに変換され、コンパイルされて実行される。もし、JSPにJSPタグやテンプレート構文が一切含まれないときは、単純にJSPファイルを読み込んで送信するだけのサーブレットになり、途中にJSPタグなどが出現した場合、その部分に該当するコードが埋め込まれ、それ以外の部分は、バイト単位でファイルを読み込んで送信するようなサーブレットになる。

 こうして、いったんサーブレットに変換されて動作するため、コンパイルされたあとはサーブレットと同じ動作になる。もちろん、ソースファイルが更新されないかぎり、再コンパイルは行われない。このため、JSPはスクリプティングを使うような技術であるにもかかわらず、短いレスポンス・タイムを実現できるのである。

 JSPは、<%と%>で囲んだ中にJavaのコードを書くことができる。これをJavaスクリプトレットといい、とても重宝する。<%〜%>で囲まれた部分は、そのまま変換後のServletに挿入される。例えば、DBへのアクセス結果を表にして出力することを考えよう。もし、単純に表をJSPで記述してRDB検索したとき、検索結果が0件だった場合、表のヘッダだけが表示されるというカッコ悪い結果になる。

 これをリスト2のように記述してみる。

リスト2

<% if(bean.count() != 0) { %>
   <TABLE border=1>
   <TR><TH>番号</TH><TH>名前</TH><TH>個数</TH></TR>
   <REPEAT>
   :
   </REPEAT>
   </TABLE>
<% } else { %>
   <H3>該当データがありません</H3>
<% } %>

 こうすることによって、1件もデータがない場合は、「該当データがありません」という表示をすることができる。これは、JSPがServletとして動作することの応用である。

サーブレットとJSPの使い分け

 JSPは、HTMLファイルなのでサーブレットよりも扱いやすいように見えるが、どちらも特徴的な部分を持っている。それらを理解して使い分けることが重要である。

 サーブレットから大量のprintlnでHTMLタグを書き出しているサンプルや、セッション管理のためのJavaコードをJSPに書き込んでいるサンプルをよく目にする。確かに、ServletとJSPの説明をそれぞれ行う場合には仕方ないことであるが、実際のプロジェクトでは避けたい。自社開発などのように、開発メンバーが特定の場合は別として、外部から開発者を集めて行うプロジェクトのような場合には、HTML、JavaScript、Java、RDBなどをすべて扱えるという人を大量に集めるのは困難である。さらに、インターネットに公開するようなサイトを作るとなれば、より見栄えが重視される。見栄えを美しく、使いやすく作れるのはプログラマではなく、もっぱらデザイナの技である。このとき、HTMLならまだしも、サーブレットのソースコードをデザイナに書かせるのはあまりにも酷である。また、逆もしかりで、Javaのプログラマを集めたが、HTMLやJavaScriptを知らない場合も多い。そのとき、Servletを記述するプログラマにこれらを短時間で学習させても良いものはできない。

 そこで、完全に分離することを考える。オブジェクト指向の考え方に、MVCというのが存在する。Model/View/Controller の略で、ソフトウェアのコードを、ビジネス・ロジック、表示、制御(入力受け付けと全体の制御)の3つに分けよう、という考え方である。これによって、開発の分担が楽になり、ビジネス・ロジック実装の再利用性が向上する。

  Webシステムでこの考え方を当てはめると、次のようになる。

  1. Model : JavaBeans、Enterprise JavaBeans(EJB)
  2. View : JSP
  3. Controller : Java Servlet

 Modelはビジネス・ロジックであるからJavaでコーディングを行う。しかし、再利用を考えるとUIシステム(ここでは、サーブレットに関連したシステム)に依存しないように作りたい。JavaBeansやEJBはこれに合致する。

 JavaBeans は、Javaのプログラム(=クラス)をコンポーネント化、すなわち、ソフトウェアを部品化して組み合わせることができるようにする技術である。Controllerは、ユーザー入力を受け付ける部分を含む。サーブレットの技術では HttpServletRequest オブジェクトによってユーザー入力がアプリケーションに渡るので、必然的にServletがよい。Viewは表示(表現)であるので、HTMLで作れるJSPというわけである。このような分け方でアプリケーションを作るときのモデルを図で表すと図6のようになる。

図6 Java ServletとJSPの役割

 問題はデザインだ。それぞれの部品にどのように実装すれば、このモデルが実現できるだろうか。

サーブレットとJSPの連携

 ServletとJSPをせっかく連携させるのだから、その目的をできるかぎり失わないようなデザインと実装が望まれる。目標としたいのは次のようなことだ。

  1. ビジネス・ロジックをUIから分離する
  2. JavaのソースコードにHTMLコードを含めない
  3. HTML(JSP)にJavaのソースコードを含めない

 実際には、完全に分離できないことが多いが、これらを意識しておくことで、より理想に近づく。

 まず、全体の流れを考えてみよう。次のようなステップでHTTPリクエストが処理される。

  1. URLとしてサーブレットが呼び出される
  2. サーブレットに実装する内容
  3. (ア) パラメータを読み取る。
    (イ) セッション・オブジェクトを取得する。
    (ウ) JavaBeansを呼び出す。
    (エ) Bean をセッション・オブジェクトにputValueする。
    (オ) JSPページをコールする(callPage、またはdispatchXXXX)。

  4. JavaBeansに実装する内容
  5. (ア) データベース処理やバックエンドシステムとの連携を行う。

  6. JSPページに実装する内容
  7. (ア) セッション・オブジェクトからBeanを取り出してそのプロパティを使ってページを生成する。

 このようなデザインをすることで、Javaプログラマは、Javaのコーディングに専念でき、JSPなどを作るページのデザイナは、HTMLとJavaScriptなどを使ったページのデザインに専念できる。また、JavaBeansをUIと切り離した形でうまくデザインすることで、将来UIシステムに世代交代の時期が来たときにも、最も重要なビジネス・ロジックをそのまま再利用できる。

 しかし、実際の開発を行うときには、多少これに沿えないことも出てくるだろう。例えば、1つの画面処理が複雑で、どうしてもServlet上に、ある程度のビジネス・ロジックを実装せざるを得ない場合や、結果表示に複雑な表(TABLEタグ)を生成する必要があり、JSPタグのみでは対応できない場合などである。このような場合は、JSP上にJavaコードを記述したり、Java ServletなどでHTMLの一部を生成させるなどの工夫が必要なこともある。このような場合には、どこかで妥協して、柔軟に考えることも必要である。

 また、デザイナが、まずサンプルなりプロトタイプを作成し、それを基にプログラマやデザイナが目的のファイルを作るという方法によって実装を進めるケースもある。

EJB(Enterprise Java Beans)

Keyword Index
[重点用語解説]
サーバサイドJavaテクノロジの重点キーワード
  ■Java Servlet
■JSP(JavaServer Pages)
  ■EJB(Enterprise Java Beans)
  



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間