Webアプリケーションフレームワーク

**Web アプリケーションフレームワーク**（）は、動的なウェブサイト、ウェブアプリケーション、Webサービスの開発をサポートするために設計されたフレームワークである。

Webアプリケーションフレームワークの目的は、Web開発で用いられる共通した作業に伴う労力の軽減である。
たとえば、多数のフレームワークがデータベースへのアクセスのためのライブラリやテンプレートエンジン（Webテンプレートも参照）、セッション管理を提供し、コードの再利用を促進させるものもある。

## Webアプリケーションフレームワークの発展の歴史
### Common Gateway Interface (CGI)
World Wide Webの設計は元々ダイナミックなものではなく、初期のハイパーテキストは Webサーバ上で公開されたハードコードのHTMLでできていた。

公開されたページについての変更はページの作者が行う必要があった。
ユーザーからの入力を反映したコンテンツを提供するため、Webサーバが外部のアプリケーションとやり取りするためのCommon Gateway Interface (CGI) 標準が導入された。

CGIでは各リクエストが別々のプロセスを開始しなければならないため、サーバの負荷に悪い影響を与えることがある。

### 密結合
高いトラフィックに対応したWebアプリケーションを実現するため、プログラマはWebサーバとの密な結合を望んだ。Apache HTTP Serverは、例えば、Webサーバが任意のコードを実行したり（Mod pythonなど）、特定のリクエストを動的なコンテンツを扱えるWebサーバに転送するような（など）モジュールをサポートしている。Javaなどの言語で書かれた動的なコンテンツをWebサーバで扱うことができるよう設計されたものもある（Apache Tomcatなど） 。

### Web言語
同じころWeb用途に特化してPHPやActive Server Pagesなどの新しい言語が開発された。

### Webライブラリ
Webページの動的な生成に用いられる大半のプログラミング言語が、共通した作業を行うためのライブラリを持っているが、Webアプリケーションは HTMLの生成（たとえば JavaServer Faces）などWebアプリケーションで有用なライブラリを必要とすることが多い。

### フルスタック
成熟した「フルスタック」フレームワークが登場した。
これは、複数のWeb開発に有用なライブラリを一つに結合した
Web開発者向けの ソフトウェアスタックとして集約したものである。
例として、Jakarta EE、OpenACS、Ruby on Railsなどがある。

### ポートレット
従来のフレームワークは基本的に横型に分割されているため、ユーザ機能を追加 / 変更 / 削除する場合は、アプリケーションを入れ替える必要があった。ポータルフレームワークはユーザ機能を縦型に分割し、ユーザ機能毎にホット・デプロイ / アンデプロイできる。デプロイされたポートレットをドラッグ・アンド・ドロップ操作でWebページに配置することができるのが特徴である。

なお、ポートレット毎にエンティティインターフェース（モデル）、表示（ビュー）、業務ロジックが含まれているため、ポートレット毎に異なるスタック技術を利用することもできる。例えばJSFで作成したポートレットとSpring Frameworkで作成したポートレットを１つのWebページに配置することができる。また、異なった言語でポートレットを記述することもできる。例えばJava、Ruby、PHPで記述したポートレットを一つのWebページに配置できる。

ユーザ機能を随時に追加／置き換え／削除することができるため、ポートレットフレームワークはアジャイル開発のように継続的に開発を行う場合に適している。例えばScrumの各ユーザストリーをプラグインにすることができる。

ポートレットフレームワークを利用したWebシステムの例として、liferay、Alfrescoなどがある。その中でliferayは開発者向けのツールが揃っている。

## アーキテクチャ
### Model view controller
多数のフレームワークが、データモデル、ビジネスロジック、ユーザインタフェースを分割するためにMVCモデルに従っている。

#### プッシュ型とプル型の比較
ほとんどのMVCフレームワークは、プッシュ型のアーキテクチャにしたがっている。このようなフレームワークは、処理を要求するアクションを実行し、次に結果を出力するためにデータを表示のレイヤにプッシュする。
 
Struts、Django、Ruby on Rails、Spring Frameworkの一部であるSpring MVCなどがこのアーキテクチャの良い例である。

これに対するものとしてプル型のアーキテクチャがあり、「コンポーネント型」とも呼ばれている。こうしたフレームワークは表示レイヤから処理を開始し、必要に応じて複数のコントローラからの処理の結果を「プル」する。
このアーキテクチャでは、複数のコントローラーが一つのビューに関連付けられる。
Tapestry、Velocity などがプル型アーキテクチャの一例である。

### コンテンツ管理システム
自己記述的なコンテンツ管理システムが、高位のレイヤーのWebアプリケーションフレームワークに進出し始めている。
例えば、Drupalの構造は Webアプリケーションフレームワークに関連した機能を提供する*モジュール*により機能を拡張できる最小限の*コア*を提供している。
WordPress、Joomla!とPloneも同様な機能を持っている。
Liferay（オープンソース）のような高度な汎用コンテンツ管理システムでは、更にコンテンツのバージョン管理、公開開始日／終了日、公開する前の承認ワークフロー、プレビュー機能、マルチメディアコンテンツの対応など従来ではWebSphereやMicrosoft SharePointなどでしか提供されていない機能にも対応している。
伝統的にこれらは コンテンツ管理システムとも呼ばれる。 
しかし、コンテンツの管理がこれらのシステムの上で最重要の機能であるかについては議論の余地がある。Liferayのようなフレームワークは関数API、機能のフレームワークやコーディング標準、伝統的に*Webアプリケーションフレームワーク*に関連する機能も提供している。

## 機能
### セキュリティ
Webアプリケーションフレームワークにはアクセス制御機能（ユーザ認証とアクセス認可）を備えたものもある。
Djangoはその一例で、ロールに基づいてページに対するアクセスを管理する機能と、ユーザーの作成やロールの割り当てのためのWebベースのインターフェイスを提供する。

### データベースへのアクセスおよびマッピング
多数のWebアプリケーションフレームワークはバックエンドのデータベースに対する統一されたAPIを提供し、コードの変更なく多数のデータベースとやりとりすることを可能にし、プログラマーがより高位の概念を扱うことができるようにしている。
また高いパフォーマンスを得るため、AOLserverが行うようにデータベースのコネクションがプールされていなければならない。

さらに、オブジェクト指向フレームワークはオブジェクトと関係モデルとの対応づけを行うオブジェクト関係マッピングの機能を提供するマッピングツールを備えている。

Webアプリケーションフレームワークが提供するその他の機能としてトランザクションのサポートやデータベースの移行ツールなどが含まれる。

### URLマッピング
パラメータの付加されたURLをわかりやすいURLに自動的に変換することにより、システムは使いやすく、またさらなる利点としてサーチエンジンがインデックスを作りやすくなる。
たとえば、?cat=1&pageid=3で終わるようなアドレスを/category/science/topic/physicsや/science/physicsへの変換するような例である。
カテゴリーのIDが変更されてもURLは変わらない（従ってサーチエンジンに対して有利である）。URLの変換により、アプリケーションがREST的な設計方法の一部の要素によりうまく適合できるようにすることができる。

### Webテンプレートシステム

動的なWebページは通常静的な部分 (HTML) とHTMLを生成するコードである動的な部分からなる。HTMLを生成するコードはテンプレート上の変数あるいはコードから生成を行う。生成されるテキストをデータベースから取得することで、サイト内のページの数を劇的に少なくすることができる。

例として 500軒の家を扱う不動産会社を考える。静的なWebサイトでは、不動産会社は500ページ作成する必要があるが、動的なWebサイトでは、不動産会社はただ動的なページを500レコードを持つデータベースに接続するだけでよい。

テンプレートでは、プログラミング言語由来の変数を、コードを使わずに挿入することができるため、Webサイト内のページを更新するためにプログラミングの知識が必要なくなる。
HTMLと変数を区別するための記述方法が定義されており、たとえばJSPでは  タグが変数を出力するために使用され、Smartyでは{$variable} が用いられる。

多数のテンプレートエンジンはIFやFOREACHといった若干の論理タグをサポートしている。
これらはビジネスロジック層ないしMVCパターンにおけるM（モデル）との明確な分離を行うため、プレゼンテーション層に必要な決定を行うためだけに用いられる。

### キャッシュ

Webのキャッシングとは、帯域使用率、Webサーバの負荷、ユーザーに感じられる“ラグ”を削減するための Web文書のキャッシングである。Webキャッシュシステムは、ドキュメントのコピーを保存し、以降のリクエストは一定の条件が満たされればキャッシュから供給すれば問題なくなる。アプリケーションフレームワークには文書をキャッシュし、Webテンプレートシステムをバイパスする機構を提供するものもある。

### Ajax

AjaxとはインタラクティブなWebアプリケーションを作成するためのWeb開発手法である。Ajaxの目的はユーザーが変更を要求するごとにWebページ全体がリロードされないようにするため、背後でサーバとのデータのやり取りを少なくし、Webページをより高速に反応するようにすることである。Webページのインタラクティブ性や、速度、ユーザビリティを向上させることが意図されている。

Ajaxプログラミングは複雑であるため、Ajaxサポートを専門に行うAjax フレームワークが多数存在している。
他の大きなフレームワークの一部として組み込むことができるものも存在する。
たとえば、Prototype JavaScript FrameworkはRuby on Railsに含まれている。

### 自動構成
フレームワークには型システムを利用したや以下の方法を用いてによってWebアプリケーションの構成作業をできる限り少なくするものがある。
たとえば、多数のJavaフレームワークはHibernateを永続化層として使用しており、必要な情報を永続化させるためのデータベーススキーマをランタイムに生成することができる。
これによりアプリケーションの設計者は明示的にデータベーススキーマを設計せずにビジネスオブジェクトを設計することができる。
Ruby on Railsのようなフレームワークは逆の動作、すなわちモデルオブジェクトのプロパティをデータベーススキーマに基づきランタイムに定義することが可能である。

### Webサービス

Webサービスの作成と提供を行うツールを提供するツールを備えたフレームワークもある。
これらのユーティリティは、その他のWebアプリケーションと同様の機能を提供する。

## 技術
### プログラミング言語
多数のプログラミング言語に対して関連したWebアプリケーションフレームワークが存在する。
しかし、フレームワークに対するより高いレベルのサポートやフレームワークの開発に導く機能を提供したり十分な数の開発者がいる言語もあれば、そうでないものもある。

#### Java
膨大な数のJavaフレームワークが開発中、ないしは実際に使用されている。
これらのフレームワークの多くはJakarta EEプラットフォームの上に構築されているか、ないしは要素を借りてきている。
#### JavaScript
Javascript framework、JavaScriptライブラリ、AJAX frameworkなどと呼ばれる。
全世界に普及した成功例として代表的なものに Prototype JavaScript FrameworkやjQueryがある。
これ以外にもさまざまなものが開発されている。以下はその一例である。HTML,CSS,JavaScriptの進化が著しく、JavaScriptでは種々のフレームワークが乱立している状態であるが、

* AngularJS(1.x,2.0α Ver)
* Aurelia.js
* Backbone.js
* Ember.js
* Gatsby
* Knockout.js
* Next.js
* Nuxt
* MooTools
* Polymer
* Ractive.js
* React
* Riot.js
* Vue.js

#### C#およびVB.NET
C#および VB.NET は、マイクロソフトの言語非依存のASP.NETプラットフォーム上で最も人気のある言語である。
初期には最も人気のあるWebアプリケーションフレームワークは Webアプリケーションフレームワークであった。
ASP.NET自体はWebアプリケーションを構築するために設計された技術であるため、誤ってWebアプリケーションフレームワークとしてのみ参照されることがある。
これは、ASP.NETの一面に過ぎない。Webアプリケーションフレームワークとしての基本機能に加えて、.NET Frameworkを採用する好みの言語を選ぶことができる。
ASP.NETは統合されたAJAXフレームワークであるASP.NETにおけるAjax実装であるを備えている。

#### PHP
PHPの動的なWebページに向けた設計により、CakePHP、Symfony、Zend Framework、FuelPHP、CodeIgniter、Yii、PRADO、Laravel、eZ Publishなどのフレームワークが支持を得ている。
これらのフレームワークは、コア言語の上にフレームワーク層を適用することにより、アプリケーションの構造とモデル化を支援する。
これらは、ボトムアップからのプログラミングについての問題に対向するものである。

上記のフレームワークとは逆に、Magento、MODx、Drupal、Joomla!、TYPO3といったソフトウェアプロジェクトは、Webコンテンツ管理システムからより上位のWebアプリケーションフレームワークへと変貌し始めている。
これらの構造は、Webアプリケーションフレームワークに関連した機能を提供する*モジュール*により機能を拡張できる最小限の*コア*を提供している。

オープンソースのプロジェクトとしてコミュニティが多数のモジュールを寄贈しており（たとえばDrupalは1,000以上、Typo3には2,500以上のモジュールがある）、CMSのコア＋モジュールを用いて、広い範囲の機能を持ったWebサイトを、実際にはPHPレベルのコーディングを行わずに組み立てる方法が形作られている。

#### Perl, Python, Ruby
動的な言語によるフレームワークが多数存在する。

PerlにはCatalyst、Ark、Mojoliciousなどのフレームワークがある。

Pythonには、たとえばDjango、TurboGears、Pylons、Quixote、Karrigell、web2pyなどのフレームワークが存在する。ほぼ完全なリストとしてPython WikiのWebFrameworksがある。

RubyにはMerb、Ruby on Railsといったフレームワークがある。

### オペレーティングシステム
ごくわずかの例外はあるが、Webアプリケーションフレームワークは多数のプラットフォームで動作する、プラットフォーム非依存の言語の上に作られている。

特定の構成を推奨するフレームワークもあるが、大半のものは Windows、macOS、LinuxなどのUnix系のプラットフォーム上で動作する。
特筆すべき例外として、.NETのために書かれたDotNetNukeはMonoランタイムをサポートしていない。

## 脚注

### 注釈

### 出典

## 参考文献
* Tony Shan and Winnie Hua (2006). ''Taxonomy of Java Web Application Frameworks''. Proceedings of the 2006 IEEE International Conference on e-Business Engineering (ICEBE 2006), October 2006, p378-385.

## 関連項目
* :Category:ウェブアプリケーションフレームワーク
* ソフトウェアフレームワーク
* アプリケーションフレームワーク
* Don't repeat yourself（DRY原則）