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