Revel 概念

2020-02-07 14:39 更新

Revel 從Rails 和 Play! 中吸收了許多成熟的設(shè)計思想, 許多相同的思想被用到了框架的設(shè)計和接口中。

Revel 通過簡單的約定來支持 MVC 設(shè)計模式,輕量、開發(fā)效率高。

MVC

  • 模型 描述基本的數(shù)據(jù)對象,特定的查詢和更新邏輯。
  • 視圖 一些模板,用于將數(shù)據(jù)呈現(xiàn)給用戶。
  • 控制器 執(zhí)行用戶的請求,準備用戶所需的數(shù)據(jù),并指定模板進行渲染。

一些不錯的MVC結(jié)構(gòu)概述,像 Play! 框架 與Revel框架完全匹配。

請求的生命周期

下面是一個請求處理的基本流程:

概要:

  • Revel 暴漏一個單獨的 http.Handler, 負責實例化控制器 (請求的上下文),并沿著過濾器鏈傳遞請求。
  • Filters 鏈接到一個請求處理鏈,由水平相關(guān)的功能組成,比如請求記錄,cookie策略,授權(quán)等。大部分內(nèi)建功能都是由過濾器實現(xiàn)的。
  • Actions 是處理用戶輸入和產(chǎn)生請求結(jié)果的的函數(shù)。

HTTP Handler

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 的方法。符合下面的條件:

  • 名稱是導(dǎo)出的(首字母大寫)
  • 返回 revel.Result 類型

例如:

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)建處理方法。

Results

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)容。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號