gf架構之模板引擎 - 基本用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

文章來源: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.tplindex.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架構的核心組件,可以通過以下方式修改模板引擎的預設範本檔案尋找目錄:

  1. (推薦)單例模式擷取全域View對象,通過SetPath方法手動修改
  2. 修改命令列啟動參數 - viewpath
  3. 修改指定的環境變數 - gf.viewpath

例如,我們的執行程式檔案為main,那麼可以通過以下方式修改模板引擎的模板目錄(Linux下):

  1. (推薦)通過單例模式

    gins.View().SetPath("/opt/template")
  2. 通過命令列參數

    ./main --viewpath=/opt/template/
  3. 通過環境變數

    • 啟動時修改環境變數:

      gf.viewpath=/opt/config/; ./main
    • 使用genv包來修改環境變數:

      genv.Set("gf.viewpath", "/opt/template")

自動檢測更新

模板引擎使用了緩衝機制,當模板檔案第一次被讀取後會被緩衝到記憶體,下一次讀取時將會直接從緩衝中擷取,以提高執行效率。並且,模板引擎提供了對模板檔案的自動檢測更新機制,當模板檔案在外部被修改後,模板引擎能夠即時地監控到並重新整理模板檔案的緩衝內容。

模板引擎的自動檢測更新機制也是gf架構的一大特色。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.