ここから本文です

サーブレットを作って分かるJava Webアプリの基本的な仕組み

@IT 7月26日(火)6時10分配信

※本稿は、秀和システム発行の書籍『Javaサーバサイドプログラミング パーフェクトマスター(2015年12月21日発行)』の中から、特に@IT読者に有用だと考えられる箇所を編集部が選び、著者及び出版社の許可を得て転載したものです。ご注意:本稿は、タイトルを除き、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

【その他の画像】プロジェクトを作成する第一段階

●サーブレットを作って動かしてみる

 まずは、サーブレットやJSP(JavaServer Pages)について、深く理解していきたいと思います。開発の現場では、サーバーサイドJavaといえばフレームワークを利用するのが普通ですが、フレームワークではJavaの基礎的な部分が隠ぺいされています。逆に、基礎的な部分を隠すことで、アプリケーション本来の機能に専念してプログラミングが行えるようにしています。

●Point サーバーサイドJavaの基礎技術、サーブレット/JSP

 Java EE 7やその他のフレームワークを使うにしても、その奥にある基礎的な技術を理解しておくと、様々な場面で柔軟に対応でき、より品質が高いものが作成できることは間違いありません。

 Javaを使用したWebアプリケーションでは、サーブレット(Servlet)、JSP(JavaServer Pages)、JSP STL(JavaServer Pages Standard Tag Library)は従来から使われているサーバーサイドJavaの技術です。これら3つの関係は、次のようにサーブレットが基盤となり、これを利用するかたちでJSPが存在し、さらにJSPを扱いやすくするためのJSP STLが載っかっているという関係です。

 ということで、まずはサーバーサイドの基礎技術であるサーブレットから始めることにしましょう。

●NetBeansでプロジェクトを作成する

 NetBeansでは、開発するアプリケーションを『プロジェクト』という単位で管理します。

★NetBeansでサーブレット用のプロジェクトを作成する
サーブレット用のプロジェクトを作成し、何も手を加えていない状態のプロジェクトを実行してみる。


A:「何とか開発環境の用意は終えましたが、さっそくプログラムを作ってみるんですね」

B:「まずは、プロジェクトの作成から始めましょう」

○プロジェクトって何?

B:「NetBeansでは、サーブレットやJSP用のほかに、Java EE用のプロジェクトはもちろん、サーバーサイドではないアプリケーション用のプロジェクトも作成できます」

A:「何で、わざわざプロジェクトなんて作成するんです? テキストエディターで直接、ソースコードを書いちゃダメなんですかね」

B:「プロジェクトを作成すると、アプリケーションに必要なファイルやフォルダーが自動的に作成されます。もちろん、あとから必要なファイルを追加することができますので、必要に応じてサーブレットやJSP用のソースファイルを必要なぶんだけ追加することができます」

A:「へえー、アプリケーション用というよりも、サーバーサイドJavaを利用したWebサイトを作るようなものですね」

B:「そうですね、HTMLファイルやCSSファイルも作成できますから、Webサイトを作成することも可能です。もちろん、アプリケーションを構成するJavaのファイルだけをまとめておくこともできます」

A:「ま、Webアプリケーションの基本形みたいなものが作成されるので、それに手を加えて開発を行う、そういうわけですね」

B:「Webアプリケーションの『ひな形』、いわゆる『フレームワーク』です。MVCとかJava EEとかをフレームワークと呼びますけど、これは『仕様としてのフレームワーク』です。これに対し、プロジェクトで作成されるのは『実体化されたフレームワーク』ということなのです」

○プロジェクトを作成する

「プロジェクトは、次の手順で作成します」

 1. [ファイル]メニューの[新規プロジェクト]を選択します。
 2. [新規プロジェクト]ダイアログボックスが表示されるので、[カテゴリ]で[Java Web]を選択し、[プロジェクト]で[Webアプリケーション]を選択して[次>]ボタンをクリックします。
 3. [プロジェクト名]に「ServletApp01」と入力します。
 4. [プロジェクトの場所]でプロジェクトの保存先を指定します。デフォルトでユーザー用のDocumentsフォルダーが指定されていますので、特に別の場所を指定する必要がなければ、このままにしておきます。
 5. [次>]ボタンをクリックします。
 6. [サーバー]で[GlassFish Server]を選択します。
 7. [Java EEバージョン]で[Java EE 7 Web]を選択します。
 8. [コンテキスト・パス]に、ブラウザーでアクセスするときのパスを入力します。デフォルトで「/ServletApp01」になっています。この場合、「http://localhost:8080/ServletApp01」というURLでプロジェクトにアクセスできるようになります。特に変更する必要はないので、デフォルトのままにしておきます。
 9. [終了]ボタンをクリックします。

B:「ウィンドウ・グループの『プロジェクト』タブをクリックすると、『ServletApp01』プロジェクトが作成されていることが確認できます」

 「Webページ」フォルダーが公開用のフォルダーで、『index.html』が作成され、ソースコードエディターにファイルの中身が表示されています。このページがプロジェクトのトップページで、「http://localhost:8080/ServletApp01」でアクセスすると、このページが表示されます。

○できたてのプロジェクトを実行してみる

A:「では、このままの状態でプロジェクトを実行してみましょう。『プロジェクト』タブのプロジェクト名を右クリックして[実行]を選択してみてください」

A:「プロジェクトに作成されたindex.htmlのbody要素に入力されている『TODO write content』の文字列だけが表示されましたね」

B:「プロジェクトのプログラムを実行すると、コンパイルが行われ、GlassFishのシステム領域にコンパイル後のファイル(warファイル)がコピーされます。これを『デプロイ』と呼びます。プロジェクトを実行するとデプロイが自動的に行われ、ブラウザーが起動してページが表示される仕組みになってます」

A:「今回はHTMLファイルだけなので、コンパイルは省略してデプロイされたってことですね。ところで、GlassFishを起動する操作は行いませんでしたが」

B:「プロジェクトを実行すればデプロイに伴って自動で起動するようになっています」

○プロジェクトの中身を見てみる

B:「一応、プロジェクトに作成されたフォルダーやその中身を確認しておきましょう。『プロジェクト』タブの下に『ナビゲーター』というタブが別ウィンドウで表示されていますが、いまは使わないので[×]をクリックして閉じておきました」

B:「プロジェクトの内部には4つのフォルダーがあり、以下の要素が格納されます」

  / フォルダー / 内容
Webページ / 公開用のフォルダー。内部のWEB-INFフォルダーには、設定用のファイルなどの外部から直接アクセスすることがない(またはアクセスさせない)ファイルが格納される。
ソース・パッケージ / Javaのソースファイルが格納される。
ライブラリ / JDKやGlassFishなどのライブラリが格納される。
構成ファイル / プロジェクト全体にかかわる設定ファイルが格納される。



●Memo 実行するブラウザーの指定

 NetBeansの[実行]メニューの[プロジェクト・ブラウザの設定]を選択すると、プログラムを実行するブラウザーを選択することができます。

○サーブレットを作ると何ができるの?

 サーブレットの実体は、Javaのクラスです。Javaでは、クラスという単位でデータやメソッドを管理します。いわば、アプリケーションにおける特定の処理を行うソースコードを1つのクラスにまとめておくのですが、サーブレットもクラスとして定義します。

★サーブレットが実行されるとHTMLが出力される

A:「なるほど、サーブレットってJavaのクラスなんですね。ってことは、フィールド(変数)やらメソッドやらをクラスの内部に作って、何かの処理を行わせるのですね」

B:「サーブレットはクラスなので、インスタンス化を行ってメモリ上に読み込む必要があります。クラスやインスタンスについては『ミドルエンジニアの素朴な疑問』で触れていますので、よければあとで参照してみてください。で、サーブレットが実行される流れは次のようになります」

B:「クライアントのブラウザーからリクエストがあると、アプリケーションサーバー内でサーブレットが実行され、処理結果としてHTMLが出力されるという流れになります。もちろん、HTMLを出力するためのメソッドはサーブレットクラス内部で定義しますので、何らかの処理を行ったあと、このメソッドが実行されてHTMLが出力されます」

A:「えっと、アクセスされるとサーブレットが実行されるってことですが、クラスはインスタンス化しなきゃならないですよね。インスタンス化はどこで行われるんです?」

B:「スルドイ質問ですね。インスタンス化は、アプリケーションサーバー(GlassFish)の内部でインスタンス化の処理が行われます。アプリケーションサーバーに搭載されているサーブレットやJSPを実行する機能のことを『JSP&サーブレットコンテナー』と呼ぶことがありますが、このコンテナーがインスタンス化を行い、内部のメソッドを呼び出すようになっています」

A:「えーっと、Javaのプログラムってmain()メソッドから実行されますよね。main()はどうなってるんですか?」

B:「さらにスルドイですね。確かにJavaのプログラムは、起動直後にまずmain()メソッドが呼ばれます。で、main()メソッドの処理もコンテナーの内部で定義されていて、そこからサーブレットのメソッドを呼び出すようになっています」

●Memo GlassFishのデフォルトのポート番号は「8080」

 ところで、ブラウザーのアドレス欄は『http://localhost:8080/ServletApp01』となっています。この「8080」というのは、GlassFishが使用するポート番号です。Webサーバーが使用するポート番号は通常『80』ですが、GlassFishでは『8080』を使用します。『http://localhost/ServletApp01』とすると、ApacheのようなWebサーバーへのアクセスになるので、『localhost:8080』のようにポート番号を指定しているというわけです。

 このため、もしGlassFishをWeb上で稼働させた場合は、外部からアクセスする際には常に『8080』を指定することになります。

 ただし、GlassFishの設定を変更して80番ポートにすることも可能です。そうすれば普通にURLを指定すればアクセスできます。なお、実際にWeb上で公開する場合は、ApacheなどのWebサーバーを稼働させておき、Webサーバー側の設定で、80番ポートにアクセスを8080番に切り替えてGlassFishに振り分ける、といった方法がよく使われています。この場合、「ブラウザー→Apacheサーバー→ポート番号を8080に付け替え→GlassFish」のようにWebサーバーを介してアクセスすることになります。

○サーブレットクラスを作成する

 サーブレットの実体は、Javaのクラスです。Webサーバーに格納されたサーブレットクラスは、アクセスがあると、Webサーバーと連携したアプリケーションサーバーによって実行され、実行結果をHTMLで出力します。出力されたHTMLは、クライアントへレスポンスとして送信されます。

★サーブレットクラスをプロジェクトに追加する
サーブレットクラスのソースファイルをプロジェクトに追加し、自動で生成されたサーブレットを実行してみる。

 1. [プロジェクト]タブでプロジェクト名を右クリックして[新規]→[サーブレット]を選択します。
 2. [クラス名]に「Servlet01」、[パッケージ]に「com.example」と入力します。
 3. [次>]ボタンをクリックします。
 4. [サーブレット名]に「Servlet01」と入力します。サーブレットクラスの正式名は「com.example.Servlet01」ですが、アプリケーション内部では「Servlet01」で認識できるようにします。[URLパターン]は、サーブレットにアクセスするためのURLです。デフォルトで「/Servlet01」となっていますが、この場合、「http://localhost:8080/ServletApp01/Servlet01」でアクセスできるようになります。特に変更する必要はないので、デフォルトのままにしておきましょう。
 5. [終了]ボタンをクリックすると、サーブレットクラスが作成されます。

B:「手順どおりに操作すると、プロジェクトの『ソース・パッケージ』フォルダーに『com.example』パッケージが作成され、内部に『Servlet01.java』というソースファイルが作成されます」

●Onepoint
 サーブレットを作成すると、サーブレットのソースファイルが保存され、コンパイルとデプロイが自動的に行われます。



●書籍紹介
Javaサーバサイドプログラミング パーフェクトマスター・金城俊哉著秀和システム 3,780円
Javaははじめてですか? でも、しり込みしなくたっていいんです。いきなりサーバサイドからはじめましょう!本書は、Webエンジニアを目指す人のために対話形式でJava EEを基礎からストア構築まで動かしながら学べる解説書です。Javaサーブレットを学び、Java EEを極めていく一方、初心者のためにコラム形式でJavaの基本も説明します。実行環境の構築、ロジックの作成、データベース連携まで動かしながら覚えられます!

最終更新:7月26日(火)6時10分

@IT