Web應用框架

開發框架種類之一

Web應用框架(Web application framework)是一種開發框架,用來支持動態網站、網路應用程序及網路服務的開發。其類型有基於請求的和基於組件的兩種框架

應用簡介


Web應用框架有助於減輕網頁開發時共通性活動的工作負荷,例如許多框架提供資料庫訪問介面、標準樣板以及會話管理等,可提升代碼的可再用性。

系統架構


MVC

主條目:MVC

CMS

主條目:內容管理系統

主要分類


web框架可以分為基於請求的(request-based)和基於組件的(component-based)兩大陣營。前者的代表有Struts和Spring MVC等,後者的成員則有JSFTapestry等等。

系統對比


基於請求的框架較早出現,它用以描述一個web應用程序結構的概念和傳統的靜態Internet站點一樣,是將其機制擴展到動態內容的延伸。對一個提供HTML和圖片等靜態內容的網站,網路另一端的瀏覽器發出以URI形式指定的資源的請求,Web伺服器解讀請求,檢查該資源是否存在於本地,如果是則返回該靜態內容,否則通知瀏覽器沒有找到。Web應用升級到動態內容領域后,這個模型只需要做一點修改。那就是web伺服器收到一個URL請求(相較於靜態情況下的資源,動態情況下更接近於對一種服務的請求和調用)后,判斷該請求的類型,如果是靜態資源,則照上面所述處理;如果是動態內容,則通過某種機制(CGI、調用常駐內存的模塊、遞送給另一個進程如Java容器)運行該動態內容對應的程序,最後由程序給出響應,返回瀏覽器。在這樣一個直接與web底層機制交流的模型中,伺服器端程序要收集客戶端籍get或post方式提交的數據,轉換,校驗,然後以這些數據作為輸入運行業務邏輯後生成動態的內容(包括HTMLJavaScriptCSS、圖片等)。
基於組件的框架採取了另一種思路,它把長久以來軟體開發應用的組件思想引入到web開發。伺服器返回的原本文檔形式的網頁被視為由一個個可獨立工作、重複使用的組件構成。每個組件都能接受用戶的輸入,負責自己的顯示。上面提到的伺服器端程序所做的數據收集、轉換、校驗的工作都被下放給各個組件。現代web框架基本上都採用了模型、視圖、控制器相分離的MVC架構,基於請求和基於組件兩種類型大都會有一個控制器將用戶的請求分派給負責業務邏輯的模型,運算的結果再以某個視圖表現出來,所以兩大分類框架的區別主要在視圖部分,基於請求的框架仍然把視圖也就是網頁看作是一個文檔整體,程序員要用HTML、Javascript和CSS這些底層的代碼來寫“文檔”,而基於組件的框架則把視圖看作由積木一樣的構件拼成,積木的顯示不用程序員操心(當然它們也是由另一些程序員開發出來的),只要設置好它綁定的數據和調整它的屬性,把他們大大從編寫HTML、Javascript和CSS這些界面的工作中解放出來。

如何選擇


基於請求的和基於組件的兩種框架各有優劣。雖然一眼看上去後者有很大的吸引力,普通的web開發人員只要使用專門的公司或開源組織提供的組件就可以輕鬆開發出好用漂亮的界面,但是有幾種因素綜合起來不利於這種理想中的方案。要編寫一個沒有潛在問題的、跨瀏覽器的、顯示美觀並且有足夠靈活性可以調整的伺服器端組件是需要高水平的技能、豐富的經驗和較多時間的,即使付出這些成本,也不能完全避免使用者失望的情況。
綜合來看,基於請求的框架要程序員自己動手的地方比較多,但也因此可以更精細地控制HTML、CSS和Javascript這些最終決定應用程序界面的代碼,特別是如果要在界面上有創新,嘗試新的視覺效果和用戶操作,必然選擇基於請求的框架。基於組件的框架可以提高開發界面的效率,前提是選用的組件質量優秀。

主要特點


網頁模版系統
網頁高速緩存
安全性
URL映射
AJAX
自動configuration
Web服務

編程語言


PHP

Zend framework
CakePHP
Yii
symfony
kohanaphp
Seagull
Drupal

javascript

MooTools
dojo
zk
Backbone.js
SproutCore
Sammy.js
Spine.js
Cappuccino
Knockout.js
Javascript MVC
GWT(Google Web Toolkit)
Google Closure
Ember.js
Angular.js
Batman.js
ExtJS

Python

django
pinax
Grok
Pylons
TurboGears
web2py
Zope
Quixote
snakelets
snakelets
PylonsHQ
Tornado

Ruby

Ruby On Rails
Sinatra

.net

mvc
三層
nhibernate

JAVA

Spring
Hibernate
Grails
Tapestry
ZK
SpringMVC
Struts2
Struts
Mybatis
Go
Gin
Beego
Buffalo
Iris
Echo
Goji