Revel 從Rails 和 Play! 中吸收了許多成熟的設計思想, 許多相同的思想被用到了框架的設計和接口中。
Revel 通過簡單的約定來支持 MVC 設計模式,輕量、開發效率高。
## MVC
* *模型*?描述基本的數據對象,特定的查詢和更新邏輯。
* *視圖*?一些模板,用于將數據呈現給用戶。
* *控制器*?執行用戶的請求,準備用戶所需的數據,并指定模板進行渲染。
一些不錯的MVC結構概述,像?[Play! 框架](http://www.playframework.org/)?與Revel框架完全匹配。
## 請求的生命周期
下面是一個請求處理的基本流程:

概要:
* Revel 暴漏一個單獨的 http.Handler, 負責實例化控制器 (請求的上下文),并沿著過濾器鏈傳遞請求。
* Filters 鏈接到一個請求處理鏈,由水平相關的功能組成,比如請求記錄,cookie策略,授權等。大部分內建功能都是由過濾器實現的。
* Actions 是處理用戶輸入和產生請求結果的的函數。
## HTTP Handler
Revel 構建自頂級 Go HTTP server, 他為每一個到來的請求創建一個 go-routine (輕量線程),用于處理并發。
Revel什么也不做,只是把請求交給過濾器鏈處理,完成之后,將結果寫到響應中。
默認情況下, Revel 處理程序注冊到?`"/"`?接受所有的請求連接。然而, 應用程序可以自由的重寫此行為 – 例如, 可以使用現有的 http.Handlers 而不是Revel來重新實現此功能。具體請參考?[FAQ](http://gorevel.cn/docs/manual/faq.html)。
## 過濾器
[過濾器](http://gorevel.cn/docs/manual/filters.html)?實現了Revel的大部分請求處理功能,過濾器有一個簡單的易于嵌套的接口。
“過濾器鏈” 是一個函數數組, 每一個都會去執行下一個,直到最后一個過濾器執行了控制器方法。例如, 過濾器鏈中的第一個過濾器是?`RouterFilter`, 它決定哪個操作接受請求并保存到控制器。
總之, 過濾器和過濾器鏈就像機架一樣。
## 控制器和方法
每一個 HTTP 請求,執行一個?**action**, 處理請求并寫入響應。 相關的?**actions**?被分組到?**controllers**中.?[Controller](http://gorevel.cn/docs/docs/godoc/controller.html#Controller)?類型包含相關字段和方法,作為每個請求的上下文。
作為 HTTP 請求處理的一部分,Revel 實例化你的控制器,并設置嵌入`revel.Controller`的所有的屬性。 Revel 不在請求之間共享實例。
* * *
**Controller**?是直接 或 間接嵌入?`*revel.Controller`?的一個struct。
~~~
type AppController struct {
*revel.Controller
}
~~~
**Action**?是?**Controller**?的方法。符合下面的條件:
* 名稱是導出的(首字母大寫)
* 返回 revel.Result 類型
例如:
~~~
func (c AppController) ShowLogin(username string) revel.Result {
..
return c.Render(username)
}
~~~
程序調用?`revel.Controller.Render`?渲染一個模板, 傳遞給模板一個username參數。**revel.Controller**?有許多方法處理**revel.Result**, 程序也可以自己創建處理方法。
## Results
Result 符合下面的接口:
~~~
type Result interface {
Apply(req *Request, resp *Response)
}
~~~
通常, 什么也不響應,直到?**action**?和所有的過濾器返回。此時,Revel寫入響應的headers和cookies。(例如設置會話cookie), 然后調用?`Result.Apply`?寫入實際響應內容。