Web アプリについて

サーバーサイドで動くWeb システムです。流行のJava ベースアプリについて勉強します。
更新日 2016-02-13

Web アプリケーションの概要

Web アプリケーションとはサーバーサイド(Web 側)で動いていて、クライアントからの要求に対し動的にコンテンツを作成して返して くれる仕組みを言います。Apache のようなHTTP サーバーから必要な時に呼び出されます。以下に示します。

通常の動作

Webブラウザ —(リクエスト)→ Apache[リクエストのページを読み込み] ↓
Webブラウザ ←(レスポンス)— Apache[クライアントに向けて送出] ←

Web アプリ

Webブラウザ —(リクエスト)→ Apache[転送] → Javaサーブレット[リクエストに対する処理] ↓
Webブラウザ ←(レスポンス)← Apache[転送] ← Javaサーブレット[結果を送出] ←
(Web ブラウザからは通常の動作と違いは分りません。あくまでサーバーサイドの処理となります。)

サーブレットとは

サーブレットはサーブレットコンテナと呼ばれる土台の上でただ一つのインスタンスが起動し、常時待機しています。 リクエストが届くとスレッドが作成され、サーブレットの特定のメソッドが呼ばれます。以下の特徴があります。

パフォーマンスが良い

CGIがリクエスト毎にプロセスが立ち上げるのに対し、単一のプロセス上でマルチスレッドにて対応する方がパフォーマンスが 上がります。またJava は高速で柔軟です。

永続化をサポート

CGI ではリクエスト毎にプロセスが変わるのに対し、サーブレットでは永続したデータ保持が可能です。HttpSession を用いれば セッション毎に固有のデータを管理できます。ショッピングカートなどが良い例です。

JSP (Java Server Pages)について

HTML 構文が使えるテキストファイル(つまりHTML と変わらない)ですが、拡張子が.jsp となります。動的ページを可能にする スクリプトレットというJava コードを埋め込めば、それがリクエスト時にサーバーサイドで実行され、実行結果に置き換えて クライアントに送出されます。JTL と呼ばれるタグライブラリをスクリプトレットの代わりに使えば、きわめてHTML らしく 保守性も高まります。

Java で書くのに比べて遅くならない?

JSP ファイルは編集する段階ではHTML テキストそのものですが、実行時は異なります。実はJSP はJava のソースにコンバートされ、 クラスファイルにコンパイルされます。出来上がった実行モジュール(Java class ファイル)はキャッシュディレクトリ(work)に保存され、 リクエストに毎に実行され結果を返します。つまり、Java で書くのに比べて、リクエスト毎にHTML の構文解析にかかるオーバーヘッドに 対する心配は無用という事です。保守性を高め、実効性能も落ちない。素晴らしい技術です。

4層モデル

Web アプリは4層で考えるようです。

クライアント層

リクエストをし、レスポンスを受け取るクライアント。この場合はWeb ブラウザです。

プレゼンテーション層

データをどのような表現でクライアントに渡すか考慮する層です。CGI などではこの層は存在せず、ビジネスロジック層において レスポンスページそのものを作成していました。つまりページデザインを変えるには、ビジネスロジックそのものを編集し直す 必要がありました。またスクリプト中にHTML を書く事になり、プログラムデザインに翻弄されやすく、見通しも悪く保守性の低いものでした。
JSP はその問題を解消します。HTML 文として記述でき、その中にデータの挿入個所を設定するという点で画期的です。JSP には スクリプトレットが記述でき、その機能性故にプレゼンテーション層に収まりきらないという意見はもっともです。今となっては スクリプトレットを使わない事がエレガンスなデザインパターンなんだと思います。

ビジネスロジック層

リクエストデータを保持したり、セッションを維持したり、関連する処理を行った後、プレゼンテーション層を経由してクライアントに レスポンスを返したり。Java クラスで実装される実際のデータ処理層です。かつてCGI でやってた処理などはココで行います。

バックエンド層

ビジネスロジックだけで処理できない仕事を承る層です。主にデータベースとのやりとりを受け持ったり、特殊な処理を専門に行います。 バックエンドが無い場合は、3層モデルになる訳ですが・・・。

3つのC

コンポーネント, コンテナ, コネクタ の事です。

コンポーネント

Java のクラスからJSP、サーブレットの事です。コンテナ上で動作するパーツの事です。

コンテナ

実行環境の事で、例えばTomcat などが有名です。この上で先ほどのコンポーネント(サーブレット)がインスタンス化され、実行される 訳です。

コネクタ

バックエンド層への入出力を標準化して実装したモジュールです。今まではミドルウェア毎に依存していて、実装時に合わせる必要が ありました。これを統一するのが狙いです。

MVCモデル

モデル、ビュー、コントローラーの事です。Webアプリの大まかな構造です。

モデル

ビジネスロジックを担当します。Java クラスです。

ビュー

クライアント(Web ブラウザ等)との入出力に対応します。JSP です。

コントローラ

Java サーブレットの事です。

EJB について

Enterprise Java Beans の事です。サーバーサイド用途に特化したJava Beans です。

Entity Bean

永続化されたオブジェクトです。データベースのレコードと対にまって連動したりするようです。

CMP

Container Managed Persistence. 実装済みのコンポーネント。

BMP

Bean Managed Persistence. 実装をオーバーライドしないといけません。柔軟な仕様設計が可能。

Session Bean

ビジネスロジックで利用されるメソッドに重点をおいたクラスです。

Stateless Sassion Bean

永続性がなく、まさしくメソッド中心です。C++ でいうグローバル関数みたいなもんでしょうか。

Sateful Session Bean

セッションに限ってですが、永続性が保証された変数です。