Java Servret/JSPの基礎知識

Java Servletとは、JavaでWebアプリケーションを構築するためのソフトウェアや仕様を一纏めにして呼んだものです。本記事ではServletについて、基本用語の解説や、Eclipseを利用した基本操作の解説を行います。

Webアプリケーションとは

Webブラウザ上で動作するアプリケーションをWebアプリケーションと呼びますが、単にWebアプリケーションを作るだけであれば、Java Servletの他にもたくさんの方法があります。

CGI(Perl, Python, Ruby)

現在稼動されているほとんどのWebサーバにはCGIという仕組みが実装されています。
CGIはブラウザからのリクエストに従い、Webサーバ上でプログラムを実行して、その結果生成されたHTMLをブラウザに送信する仕組みです。
どんなプログラムでもその実行環境がWebサーバにあれば実行することができます。

開発言語としてよく使われるものとしては、Perl(パール)、Python(パイソン)、Ruby(ルビー)などがあり、古くからPerlが最も多く使用されています。
Perlはオブジェクト指向のプログラミング言語ではありません。

リクエストの度に実行環境が起動し、
同時に、リクエスト数だけの実行環境が起動していることになります。
ですので、大量のリクエストを処理する必要があるアプリケーションには向きません。

PerlやPyton、Rubyはインタプリタとして実行されるので実行スピードは早くはありませんが、
文字列を扱うのが容易で、コード量も少なくて済みます。
(C言語のソースコードをサーバのOS向けにコンパイルしたものをCGIで使うことも可能です。
この場合は、OSが実行しますので実行速度は速くなりますが、C言語で文字列を扱うのは困難です。)

PHP

PHP言語で書かれたプログラムもCGIの仕組みを使って動作させることができますが、
PHPの実行環境は、Webサーバがモジュール機構を提供していれば、
モジュールとしてWebサーバと一体化して動作できるように作られています。

現在ではほとんどのWebサーバは、モジュール機構を提供しています。この場合は、起動する実行環境はひとつで、その中で複数のリクエストを処理することができます。CGIとして動作させるより大量のリクエストを処理することが可能となります。

PHPはオブジェクト指向のプログラミング言語で、文字列を扱うのも容易、データベースとの連携も容易です。

ASP.NET

ASP.NETは、Microsoftが開発・提供しているWebアプリケーションフレームワークです。

ASP.NETは、MicrosoftのIIS(Internet Information Services:Webサーバ)をWebサーバとしてプログラムが実行されます。
IISはWindows向けのものしか作られておらず、動作環境はWindows(Windows2000以降)に限られます。
複数のリクエストをひとつの実行環境で処理でき、大規模なWebアプリケーションにも対応します。

使用できる言語はVisual Basic(ビジュアル・ベーシック)、C#(シー・シャープ)、などの.NETに対応したものです。
.NETとは、フレームワークと呼ばれる汎用のプログラム実行環境で、最新のWindowsアプリケーションの多くは.NETフレームワーク上で実行されるように作られています。

MacやLinuxなどの他のプラットフォームでも、それに対応した.NETフレームワークがあれば
対応したWindowsアプリケーションが動作するはずですが、現在はWindows向けのものしか提供されていません。

Visual BasicやC#はオブジェクト指向のプログラミング言語です。
開発環境は、Microsoft Visual Studioに限られ、.NETフレームワークに向けてコンパイルされることになります。動作は、高速です。

サーブレット/JSP(JavaServer Pages)

オブジェクト指向の言語であるJavaで記述されたサーブレットやJSPの実行環境は、
Webコンテナ、サーブレット・コンテナと呼ばれます。Webコンテナと呼ばれる時はWebサーバをも含んでいます。
さまざまなプラットフォームに対応したさまざまな製品がありますが、オープンソースのアプリケーションサーバであるTomcatが多く使われています。

Tomcatは多くのプラットフォーム向けのものがあり、単体でサーブレット/JSPの実行環境として
サーブレット・コンテナとして使ってWebサーバと連携させることも、Webコンテナとして使うこともできます。
連携させるWebサーバは、モジュール機構を提供している必要があります。
複数のリクエストをひとつの実行環境で処理でき、大規模なWebアプリケーションにも対応します。

サーブレット・コンテナに向けてコンパイルされたものが実行されますので、高速に動作します。

Javaの位置付け

ここまでの内容で、小規模なWebアプリケーションにはCGIやPHPの利用が、大規模なWebアプリケーションにはASP.NETやJavaの利用が向くということがわかっていただけると思います。

ASP.NETを利用しようとすると、必然的にWindowsを使うことになります。
サーバ版のOSや開発環境、クライアントアクセスライセンスに結構なコストがかかることになります。(Microsoftのサポートを受けることは可能ですが、これにもコストがかかります。)

しかし、Javaを利用するとそれらのコストはかからず、全くフリーの環境でシステムを構築することができます。

環境構築

EclipseでJava ServletのWebアプリケーションを作るための環境を構築します。
EclipseはTomcatを含むものをインストールしてください。

こちらのサイトから最新バージョンのPleiades All in One Eclipseをダウンロードしてインストールしてください。JavaのFull Editionを選びましょう。

Eclipseを起動し、以下を行います。

  • パースペクティブをJava EEに切り替える。
    右上のパースペクティブにJava EEを追加します(+マークのアイコンから追加できます)。その後、パースペクティブをJava EEに切り替えます。
  • Tomcatをセットアップして起動する。
    下部のサーバータブをクリックし、サーバービュー内で右クリックし、[新規]->[サーバー]をクリックします。[新規サーバー]ダイアログボックスから[Apache]->[Tomcat v6.0サーバー]をクリックします。インストールディレクトリを適当に選択します(私の場合はC:\pleiades4.4\tomcat\6にインストールしました)。[完了]を選択します。
  • 文字コードをUTF-8に設定する。
    上部メニューの[ウィンドウ]->[設定]をクリックします。[一般]->[ワークスペース]から[テキストファイルエンコード]がその他(UTF-8)であることを確認します。続いて、[Web]->[CSSファイル]、[Web]->[HTMLファイル]、[Web]->[JSPファイル]、[XML]->[XMLファイル]のすべてのエンコードをUTF-8であることを確認します。他のエンコードになっている場合は、UTF-8を設定してください。

動的Webプロジェクトを作成する

プロジェクトはアプリケーションの単位になります。1つのアプリケーションに対して、1つのプロジェクトを作成します。

そのうち、動的Webプロジェクトとは、ユーザの操作に対して変化しない静的なWebページと異なり、入力内容に応じて異なる内容を表示したり、異なるページに移動したりするなどの動的に変化するアプリケーションのプロジェクトのことです。

動的Webプロジェクトには、サーブレットやJSPのテンプレート、web.xmlの自動作成など、Webアプリケーション作成を補助する多くの機能を持ちます。

  1. 上部メニューの[ファイル]->[新規]->[動的Webプロジェクト]をクリックします。
  2. [プロジェクト名]ダイアログボックスに《ServletSample》と入力します。
  3. [ターゲット・ランタイム]ドロップダウンリストから《Apache Tomcat v6.0》を選択します。TomcatのAPIをライブラリが追加されます。
  4. [動的Webモジュールバージョン]ドロップダウンリストから《2.5》を選択します。サーブレットのバージョンを選択します。
  5. [構成]ドロップダウンリストから《Apache Tomcat v6.0デフォルト構成》を選択します。
  6. [次へ]をクリックします。
  7. [コンテキスト・ルート:]テキストボックスに《ServletSample》と入力されていることを確認します。
  8. [コンテンツ・ディレクトリー:]テキストボックスに《WebContent》と入力されていることを確認します。
  9. [Javaソース・ディレクトリー:]テキストボックスに《src》と入力されていることを確認します。
  10. [デプロイメント記述子の生成]チェックボックスを《ON》にします。web.xmlを作成します。
  11. [完了]をクリックします。動的Webプロジェクトが作成されました。

[ServletSample]プロジェクトを展開し、[WebContent]->[WEB-INF]を確認してください。[プロジェクト名]、[Javaソース・ディレクトリー]、[コンテンツ・ディレクトリー]、web.xmlなど、これまで設定した値でフォルダ・ファイルが作成されています。

プロジェクトの追加および除去

動的Webプロジェクトは、作成しただけでは実行することはできません。Tomcatに対して、動的Webプロジェクトを追加する必要があります。

  1. 下部のサーバータブをクリックします。
  2. 作成済みのTomcatサーバを右クリックし、[プロジェクトの追加および除去]をクリックします。
  3. [ServletSample]をクリックし、[追加]をクリックします。
  4. [完了]をクリックします。Tomcatに対して、プロジェクトが追加されました。

プロジェクトの説明

  • Javaリソース:src(ソース)
    サーブレットが保存されます。初期設定では、[デフォルトパッケージ]に含められますが、パッケージを指定することも可能です。

  • ライブラリ
    JREのライブラリやTomcatのライブラリが格納されます。実際にはプロジェクト内に保存されているわけではありませんが、クラスパスが指定されている実行可能なAPIが表示されます。

  • WebContent(ウェブ・コンテント)
    JSPやHTMLなどを保存します。

  • WEB-INF(ウェブ・インフォメーション)
    web.xmlが保存されます。

  • web.xml(ウェブ・ドット・エックスエムエル)
    プロジェクト内のファイル間の関連などについて、記述されます。サーブレット名とURLの対応については、Eclipseが自動的に記述します。機能を追加するために、直接編集することもできます。

パッケージを作成する

パッケージは、クラスをグループ化する際に使用します。
パッケージ名が異なれば、それぞれのパッケージごとに同名のクラスを作成することができ、
クラス名の衝突を防ぐことができます。

パッケージ名は、一般的にドメイン名を逆に表記します。

「geek.net」 ⇒ 「net.geek」

ドメイン名以降は機能や役割ごとにグループ分けを行います。
《net.geek.javaweb.sample01》という名前で、パッケージを作成します。

  1. [ServletSample]プロジェクトを右クリックし、[新規]->[パッケージ]をクリックします。
  2. [ソース・フォルダ―]テキストボックスの内容が《ServletSample/src》であることを確認します。
  3. [名前]テキストボックスに《net.geek.javaweb.sample01》と入力します。
  4. [完了]をクリックします。パッケージが作成されます。

ファイルを作成する

作成したプロジェクトを右クリックし、[新規]から サーブレット、JSP、HTML、CSSなどを作成することができます。

今回は、実際にサーブレットを作成し、「Hello World!」を表示するプログラムを記述してみます。

  1. 《net.geek.javaweb.sample01》パッケージを右クリックし、[新規]->[サーブレット]をクリックします。[サーブレット作成]ダイアログが開きます。
  2. [クラス名]にWorkと入力します。
  3. [次へ]を2回クリックします。
  4. 「どのメソッド・スタブを作成しますか?」のところで、[スーパークラスからのコンストラクター]、[継承された抽象メソッド]、[doGet]、[doPost]にチェックが付いていることを確認します。
  5. [完了]をクリックするとサーブレット・クラスが作成されます。

ここまでの操作でWork.javaクラスが新たに作成され、クラス内にはWorkメソッド、doGetメソッド、doPostメソッドが作成されました。

さらに、[WebContent]->[WEB-INF]->web.xmlにWorkクラスの情報が追加されています。web.xmlを開き、[ソース]タブに切り替えて、記述されている内容を確認しておいてください。

サーブレット・クラスはHttpServletクラスを継承します。HttpServletクラスには、Webコンテナ(サーブレット/JSPがサーバ側で実行する環境)で動作するために必要な定義がすでにあるため、ロジック部分をコーディングするだけでWebアプリケーションを作成することができます。

HTTPリクエストを処理するため、HttpServletクラスには、doGetメソッド/doPostメソッドが定義されています。doGetメソッド、もしくはdoPostメソッド、もしくは両方をオーバーライドし、内部に処理内容を記述します。

  • Work
    コンストラクタです。
  • doGet
    フォームからGETリクエストでデータを送信してページが呼び出された場合に使用します。このメソッドでのデータ送信は、ページを呼び出すURLの末尾にデータが記述されて送信されます。なお、直接ページをURLで指定して呼び出す、URLを指定したリンクからページを呼び出す、といった場合はGETメソッドでデータがない状態ということになり、doGetメソッドが動作することになります。
  • doPost
    フォームからPOSTリクエストでデータを送信してページが呼び出された場合に使用します。このメソッドでのデータ送信は、URLとは別途にデータが送信されます。

デフォルトではdoGetメソッドが使用されます。Javaのmainメソッドにあたる役割を果たします。

doGetメソッドに以下の内容を記述します。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("It works by Servlet!");
}

ファイルの上書き保存を行います。

続いて、Tomcatを起動します。サーバータブから作成済みのTomcatサーバを右クリックし、[開始]をクリックしてください。

ブラウザを起動し、http://localhost:8080/ServletSample/Workにアクセスしてみましょう。

画面に「It works by Servlet!」が表示されることを確認してください。

続いて、画面に出力する内容を変更してみましょう。

先ほど作成したWork.javaのout.println("It works by Servlet!");の箇所をout.println("Hello, World!");に変更してください。
上書き保存を行うと、自動的にTomcatが再起動します(Eclipseの右下のステータスバーにプログレスバーが表示されます)。

Tomcatの再起動が完了したらブラウザをリロードし、「Hello, World!」が表示されることを確認してください。

まとめ

上手くいかないときは以下の点を確認してみましょう。

  • パースペクティブがJava EEになっているか。
  • サーバタブからTomcat6を作成しているか。
  • 文字コードがUTF-8になっているか。
  • 動的Webプロジェクトとして作成しているか。
  • Tomcatに[追加および削除]から作成済みの動的Webプロジェクトを追加しているか。
  • 意図した名前と同じ名前のパッケージを作成しているか。
  • サーブレットファイルを作成しているか(単なるJavaクラスとして作成するミスが多いので要注意)。
  • web.xmlにファイルの情報が記載されているか(ファイルを別のプロジェクトからコピーしてきたりした場合は自動的にweb.xmlには書き込まれないので要注意)。
  • Tomcatを起動しているか。ファイルを追加した場合は再起動しているか。
  • ブラウザに打ち込むURLは間違っていないか。

参考資料
スクールの教科書