Revel 從Rails 和 Play! 中吸收了許多成熟的設(shè)計思想, 許多相同的思想被用到了框架的設(shè)計和接口中。
Revel 通過簡單的約定來支持 MVC 設(shè)計模式,輕量、開發(fā)效率高。
一些不錯的MVC結(jié)構(gòu)概述,像 Play! 框架 與Revel框架完全匹配。
下面是一個請求處理的基本流程:
概要:
Revel 構(gòu)建自頂級 Go HTTP server, 他為每一個到來的請求創(chuàng)建一個 go-routine (輕量線程),用于處理并發(fā)。
Revel什么也不做,只是把請求交給過濾器鏈處理,完成之后,將結(jié)果寫到響應(yīng)中。
默認情況下, Revel 處理程序注冊到 "/"
接受所有的請求連接。然而, 應(yīng)用程序可以自由的重寫此行為 – 例如, 可以使用現(xiàn)有的 http.Handlers 而不是Revel來重新實現(xiàn)此功能。具體請參考 FAQ。
過濾器 實現(xiàn)了Revel的大部分請求處理功能,過濾器有一個簡單的易于嵌套的接口。
“過濾器鏈” 是一個函數(shù)數(shù)組, 每一個都會去執(zhí)行下一個,直到最后一個過濾器執(zhí)行了控制器方法。例如, 過濾器鏈中的第一個過濾器是 RouterFilter
, 它決定哪個操作接受請求并保存到控制器。
總之, 過濾器和過濾器鏈就像機架一樣。
每一個 HTTP 請求,執(zhí)行一個 action, 處理請求并寫入響應(yīng)。 相關(guān)的 actions 被分組到 controllers中. Controller 類型包含相關(guān)字段和方法,作為每個請求的上下文。
作為 HTTP 請求處理的一部分,Revel 實例化你的控制器,并設(shè)置嵌入revel.Controller
的所有的屬性。 Revel 不在請求之間共享實例。
Controller 是直接 或 間接嵌入 *revel.Controller
的一個struct。
type AppController struct {
*revel.Controller
}
Action 是 Controller 的方法。符合下面的條件:
例如:
func (c AppController) ShowLogin(username string) revel.Result {
..
return c.Render(username)
}
程序調(diào)用 revel.Controller.Render
渲染一個模板, 傳遞給模板一個username參數(shù)。revel.Controller 有許多方法處理revel.Result, 程序也可以自己創(chuàng)建處理方法。
Result 符合下面的接口:
type Result interface {
Apply(req *Request, resp *Response)
}
通常, 什么也不響應(yīng),直到 action 和所有的過濾器返回。此時,Revel寫入響應(yīng)的headers和cookies。(例如設(shè)置會話cookie), 然后調(diào)用 Result.Apply
寫入實際響應(yīng)內(nèi)容。
更多建議: