当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

ApacheユーザがJavaWEBプログラミングを始める際に知っておくべきこと。

Javaの仕事をたまに受けると頭の中で変換をしないと行けないことが沢山ある。やはりWEBサーバの基本はApache Webサーバをベースとして考えるのが最もベーシックな事だと思う。会社に入社して真っ先にJavaを覚えた方はこの記事はパススルーしてください。どちらかといえばエンジニアとしては古株が対象の記事です。JavaはWEBコンテンツを作ろうとする場合にTomcatを使用してアプリケーション(サーブレット、JSP)を実行する。このTomcatって何?なんだが名称上は「WEBコンテナ」と呼ばれている。Apacheオンリーで開発してきた経験者でもJava初心者の段階では全く意味がわからん。中級者でもきちんと理解して使っている人は少ないかもしれない。それはJavaの場合もはやEclipseで開発を行うのが当たり前になってるからだ。だからApacheだけでやってきた人からすると普通のWEBサーバと何が違うのって思いますよね。ということでJavaはWEBの世界では特殊な呼び方を沢山するのできちんとそれを理解するところからやっていかないと???マークだらけになる。

JavaにおけるWEBコンテナとは?

まずコンテナっていう言葉がなんじゃこりゃって思う人がいると思う。この原点の意味は入れ物、器の事を指す。Apache Webサーバならドキュメントルート(Documentroot)というフォルダーにHTMLや言語のプログラムファイル等を配置すれば後はApache Webサーバがファイルを閲覧者のブラウザーに送ってくれる。つまり、JavaのWEBコンテナとApacheのドキュメントルートはニアリーイコールかもしれないと予測がつくだろう。つまりWEBコンテナもドキュメントルートもWEBコンテンツを配置するパス(WEB専用容器)という意味では概念は同じだ。しかし、全く同じではないのもわかるだろう。JavaのWEBアプリはWEBコンテナフォルダーにプログラムを配置しただけでは動作しない。まずJavaコードはサーブレットというライブラリーでコードを記述しないとWEBアプリが動作しないのだ。なおかつそのコードをどこにでも配置して良いというものではないWEBコンテナフォルダーの決められた場所に配置しないと動作しない。WEBコンテナはコンテナパスに配置されたサーブレットを読み込みWEB上で表示されるよう処理をしてくれる。つまりただの容器ではなくてWEB上でサーブレットプログラムを動作させ、それをWEB上のプロトコルに展開する仕組みを持っている。高機能な容器と言える。車のトラックで言えば冷凍庫で温度管理してくれる機能付きトラックや移動して料理ができるキッチントレーラのようなものかもしれない。そのあたりが通常のApache Webサーバで動作させるコンテンツ(HTML,プログラム)と見かけ上違って見えると思う。Apache Webサーバを使っている側から見るとWEBコンテナは複雑極まりない。

Apache Webサーバのコンテンツは本当にWEBコンテナと異なるものか?

Apache Webサーバの場合Javaで言うところのコンテナ(容器)とドキュメントルートとは役割が異なる。ドキュメントルートはただの容器である。ではJavaでいう「言語を解釈してWEBプロトコルを喋るの部分は何処が担うのか?」ここを理解するのが大切だ。例えばPHPという言語の典型的な実行パターンで考えるとmod_phpとmod_fpm、CGIの仕組みがApacheの内部機能としてjavaのコンテナのサーブレットを解釈して動作させる仕組みと近いものである。つまりお互いに役割の範囲が異なるだけで、実は同じようなことをしている。

Tomcatを使ってサーブレット(WEBプログラミング)を行う場合に真っ先に考えることは?

まず最初にWEBコンテナの構造を理解することだろう。何故って?サーブレットを動かすにはプログラムの配置、静的コンテンツの配置、WEB設定ファイルの配置がきちんと構成されていないと動作しないからです。そのうえで各フォルダーの役割、配置されているファイルの役割を知りその役割につけられている名称を認識することです。

webappsとは?

「Tomcatフォルダー」というものがあります。これはダウンロードしたTomcatの実行バイナリーやライブラリー、サンプルのプロジェクトフォルダーがひとまとめに構成されたフォルダーを指します。別名カタリーナホームとも言います。環境変数CATALINA_HOMEで表されるのがこれです。下記はTomcatの直下のフォルダーについて解説している表になります。

フォルダ名 説明
bin Tomcatの実行ファイルがある。Tomcat自体の起動や停止を行う。
conf Tomcat全体の設定ファイルがある。
logs Tomcatのログが出力される。エラーが起こった時にログから原因を探そう。
webapps ここへアプリケーションを配備する。
lib ここはtomcatのシステムライブラリーのパス
work コンパイルされたJspファイルが保存されるフォルダ
temp 一時フォルダー

webappsはTomcatがwebapps配下に置かれたフォルダを起動時に自動的に読み込み実行する際の基準となるフォルダーである。Apacheで言うところのドキュメントルートでは無いもののドキュメントルートの親フォルダーと言えばわかりやすいかもしれない。私は典型的なApacheWEBサーバでは次のようなドキュメントルートで作成する「/var/www/vhosts/{ドメイン} 」。このパスで言うなら「/var/www/vhosts」がwebappsに相当するだろう。ドキュメントルートの親玉フォルダーと理解すればわかり易いかもしれない。標準インストールではwebappsの配下に「examples」というフォルダーが存在する。これがApacheで言うところのドキュメントルートに近いものだ。厳密にはコンテキストルート(アプリケーションルート)という名称で呼ばれている。若干意味合いがドキュメントルートとは違いjavaのプロジェクト名がそれに相当します。つまりjavaはドメイン単位でドキュメントルートを作るという考え方でなく、プロジェクト単位(アプリ単位)で作るのが特徴だ。そう考えると一体どこでドメインをマッピングするのか?と思いますよね。WEBコンテナのレベルではWEBアプリケーションはドメインを感知するところではないというのが結論。DNSでWEBホスティングサーバIPにドメインをマッピングすれば自ずとサイトとして機能するのでシングルサイトとしてはこれで十分と言えよう。

プロジェクトディレクトリ(コンテキストルート)
フォルダ(ファイル)名 説明
classes 作成したプログラムをコンパイルし置く
lib Webアプリケーションを動かすために必要なライブラリがあった場合、このフォルダへ配置する
web.xml 設定ファイル。ここに使用するサーブレットクラスを記述したり、追加したライブラリ情報、URLのパスマッピングを記述する。

URLのパスは何処で決めるのか?

前述の表にある通りweb.xmlというファイルをコンテキストルート配下のWEB-INFへ配置します。このweb.xmlはプロジェクト単位のWEB実行コンフィグレーションファイルになります。つまりサイト全体で制御するCATALINA_HOME直下のconfフォルダーにあるweb.xmlの子分的な扱いのフォルダーがこれに相当します。web.xmlはURLのパスをどのサーブレットプログラムへマッピングするのか定義するファイルになります。尚、後述するJSPはコンテキスト設定ファイルを作成し「Tomcatをインストールしたディレクトリ「/conf/Catalina/localhost」つまり「$CATALINA_HOME/conf/Catalina/localhost」へ配します。ファイル名は「コンテキスト名.xml」で作成します。尚JSP自体の配置はコンテキストルート配下であればどこでも構いません。また、プロジェクトベースならweb.xmlでURLパスを設定できます。

例えば、webappsの配下にproject1というフォルダーを作りそこへサーブレット(servelet-name:Hello , servlet-class:HelloServlet.class)やweb.xmlを配置すると以下のようなURLで呼び出しが可能になります。

URLの書式  http://ドメイン名/コンテキストルート名/サーブレットネーム

http://localhost:8080/project1/Hello

サーブレット実行環境TomcatサーバはWEB実行環境として十分なものか?

答えは一般的には不十分です。WEBサーバとしてはおまけ程度でとてもApacheの足元に及ぶものではありません。セキュリティ的にも使い勝手、他サーバとの連携を考えるとフロントはApache Webサーバが受けて後方をJavaのサーブレットが処理するような仕組みが理想的だと思います。サーブレットはlocalhostで8080でリッスンしフロントの80,443をApache WEBサーバがリクエストを受けてリバースプロキシーで転送する使い方が良いと思います。但しjava単体のWEBアプリケーション&サーバ(Tomcatを使わない)というのも作り方としてあるのでその場合はApache WEBサーバは不要です。どんなものを作るかによります。

WEBアプリとWEBコンテンツの言葉の違い

厳密には定義があるわけではありませんが、WEBアプリはプログラムでできたコンテンツでありWEBサーバの仕組みもオールインワンで持っているものを指すケースが多いと思います。しかし、WEBサーバの仕組みを持っていないプログラミングコンテンツも世間ではWEBアプリと呼ばれている現状もあるので言葉の線引は不定(あいまい)な印象です。また、「アプリケーションサーバ」という単体の言葉もあります。非常にまどろっこしい、かつ勘違いしてしまいそうな用語ですが「アプリケーションサーバ」は大きな処理単位で独立した実行体WEB関連プロセス間の連携とマネージメントを行うサーバを指します。分散処理とかミドルウェアという用語もここから来ていて、処理が重いので役割ごとにサーバプロセスを立てて処理が遅くなったら追加が簡単にできるようにする仕組みを分散処理といいますがサーバ間をバインディングするためのインターフェイスプログラムをミドルウェアと呼んだりします。

JavaのJSP、サーブレットの違い使い分けは?

JSPとはJavaServer Pageの略になりますサーブレットと同じくサーバ上で動作させるプログラミングのひとつです。JSPはWORDPRESS使っているユーザなら理解しやすいと思います。WORDPRESSのテーマフォルダーにあるphpファイルはテンプレートファイルと呼ばれています。この仕組がjavaのJSPと同じ考え方になっています。つまりHTMLファイルのコンテンツブロックにプログラムを差し込んで使うやり方をjavaではJSPと呼んでいます。もちろんJSPでできることはサーブレット単体でも作ることは可能です。その逆のJSPでサーブレットでやっていることを実装することは可能です。しかし使い分けは必要です。JSPはフォーム入力や静的ページ(ダイナミック要素が少ないも含む)主体で使うのに向いています。サーブレットは逆に裏側のロジック処理や隠匿したい処理や認証が絡むような処理で使うべきです。