這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
文章來源:http://gf.johng.cn/591642
控制器視圖
gf為控制器提供了良好的模板引擎支援,由gmvc.View
視圖對象進行管理,提供了良好的資料隔離性。控制器視圖是並發安全設計的,允許在多線程中非同步作業。
func (view *View) Assign(key string, value interface{})func (view *View) Assigns(data map[string]interface{})func (view *View) Parse(file string) ([]byte, error)func (view *View) ParseContent(content string) ([]byte, error)func (view *View) Display(files ...string) errorfunc (view *View) DisplayContent(content string) errorfunc (view *View) LockFunc(f func(vars map[string]interface{}))func (view *View) RLockFunc(f func(vars map[string]interface{}))
使用樣本1:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/frame/gmvc")type ControllerTemplate struct { gmvc.Controller}func (c *ControllerTemplate) Info() { c.View.Assign("name", "john") c.View.Assigns(map[string]interface{}{ "age" : 18, "score" : 100, }) c.View.Display("index.tpl")}func main() { s := ghttp.GetServer() s.BindController("/template", &ControllerTemplate{}) s.SetPort(8199) s.Run()}
其中index.tpl
的模板內容如下:
<html> <head> <title>gf template engine</title> </head> <body> <p>Name: {{.name}}</p> <p>Age: {{.age}}</p> <p>Score:{{.score}}</p> </body></html>
執行後,訪問http://127.0.0.1:8199/template/info
可以看到模板被解析並展示到頁面上。如果頁面報錯找不到模板檔案,沒有關係,因為這裡並沒有對模板目錄做設定,預設是當前可行檔案的執行目錄(Linux&Mac下是/tmp
目錄,Windows下是C:\Documents and Settings\使用者名稱\Local Settings\Temp
)。如何手動設定模板檔案目錄請查看後續章節,隨後可回過頭來手動修改目錄後看到結果。
其中,給定的模板檔案file參數是需要帶完整的檔案名稱尾碼,例如:index.tpl
,index.html
等等,模板引擎對模板檔案尾碼名沒有要求,使用者可完全自訂。此外,模板檔案參數也支援檔案的絕對路徑(完整的檔案路徑)。
當然,我們也可以直接解析模板內容,請看樣本2:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/frame/gmvc")type ControllerTemplate struct { gmvc.Controller}func (c *ControllerTemplate) Info() { c.View.Assign("name", "john") c.View.Assigns(map[string]interface{}{ "age" : 18, "score" : 100, }) c.View.DisplayContent(` <html> <head> <title>gf template engine</title> </head> <body> <p>Name: {{.name}}</p> <p>Age: {{.age}}</p> <p>Score:{{.score}}</p> </body> </html> `)}func main() { s := ghttp.GetServer() s.BindController("/template", &ControllerTemplate{}) s.SetPort(8199) s.Run()}
執行後,訪問http://127.0.0.1:8199/template/info
可以看到解析後的內容如下:
<html> <head> <title>gf template engine</title> </head> <body> <p>Name: john</p> <p>Age: 18</p> <p>Score:100</p> </body></html>
非控制器視圖
非控制器中使用模板引擎沒有控制器視圖的支援,可以使用底層的gview包來實現,可以通過單例管理器來擷取預設的單例gview對象。
gview包方法列表:
func Get(path string) *Viewfunc New(path string) *Viewfunc (view *View) BindFunc(name string, function interface{})func (view *View) Parse(file string, params map[string]interface{}) ([]byte, error)func (view *View) ParseContent(content string, params map[string]interface{}) ([]byte, error)func (view *View) GetPath() stringfunc (view *View) SetPath(path string)
使用樣本1:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/frame/gins")func main() { s := ghttp.GetServer() s.BindHandler("/template2", func(r *ghttp.Request){ content, _ := gins.View().Parse("index.tpl", map[string]interface{}{ "id" : 123, "name" : "john", }) r.Response.Write(content) }) s.SetPort(8199) s.Run()}
在這個樣本中我們使用單例管理器擷取一個預設的視圖對象,隨後通過該視圖渲染對應模板目錄下的index.tpl
模板檔案並給定模板變數參數。
我們也可以通過SetPath
方法中心指定視圖對象的模板目錄,該方法是並發安全的,但是需要注意一旦改變了該視圖對象的模板目錄,將會在整個進程中生效。
當然,也可以直接解析模板內容,使用樣本2:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp" "gitee.com/johng/gf/g/frame/gins")func main() { s := ghttp.GetServer() s.BindHandler("/template2", func(r *ghttp.Request){ tplcontent := `id:{{.id}}, name:{{.name}}` content, _ := gins.View().ParseContent(tplcontent, map[string]interface{}{ "id" : 123, "name" : "john", }) r.Response.Write(content) }) s.SetPort(8199) s.Run()}
執行後,訪問http://127.0.0.1:8199/template2
可以看到解析後的內容為:id:123, name:john
此外,需要注意的是,雖然以上樣本都是在Web Server中進行展示的,但是模板引擎是對模板檔案/內容的智能解析,可以用在任何的情境中。
修改模板目錄
模板引擎作為gf架構的核心組件,可以通過以下方式修改模板引擎的預設範本檔案尋找目錄:
- (推薦)單例模式擷取全域View對象,通過
SetPath
方法手動修改
- 修改命令列啟動參數 -
viewpath
- 修改指定的環境變數 -
gf.viewpath
例如,我們的執行程式檔案為main,那麼可以通過以下方式修改模板引擎的模板目錄(Linux下):
(推薦)通過單例模式
gins.View().SetPath("/opt/template")
通過命令列參數
./main --viewpath=/opt/template/
通過環境變數
自動檢測更新
模板引擎使用了緩衝機制,當模板檔案第一次被讀取後會被緩衝到記憶體,下一次讀取時將會直接從緩衝中擷取,以提高執行效率。並且,模板引擎提供了對模板檔案的自動檢測更新機制,當模板檔案在外部被修改後,模板引擎能夠即時地監控到並重新整理模板檔案的緩衝內容。
模板引擎的自動檢測更新機制也是gf架構的一大特色。