在Beego中使用Jade模板

Jade是一個(gè)高性能的HTML模板引擎互婿,它受到Haml的影響,是使用JavaScript實(shí)現(xiàn)的梨州。Jade在客戶端也有支持蛛碌,它的代碼比html可讀性要高很多,Jade是一個(gè)比較常用的HTML模板寻定。
Beego是一個(gè)go語(yǔ)言的web應(yīng)用程序開(kāi)源web框架儒洛,而B(niǎo)eego從1.7.0開(kāi)始支持更加復(fù)雜的模板引擎,當(dāng)然也包括了對(duì)于jade的支持特姐,支持更復(fù)雜模板引擎的PR地址https://github.com/astaxie/beego/pull/1940
在介紹Jade的使用之前先來(lái)看下Go下面的html/template包黍氮。

html/template

在Go語(yǔ)言中唐含,html/template包是一個(gè)很強(qiáng)大的html模板包,結(jié)合text/template的模板語(yǔ)法沫浆,基本上可以滿足大部分的HTML模板需求捷枯,無(wú)論是Beego中是默認(rèn)支持的兩種模板格式.tpl.html,以及jadeace都是可以解析為html/template中的Template對(duì)象使用,就是說(shuō)我們所使用的html模板最終都是基于html/template包實(shí)現(xiàn)的专执。
html/template使用實(shí)例:

package main
import (
    "html/template"
)
type User struct {
    Name string
}
func main() {
    t := template.New("template example")
    t, _ = t.Parse("hello {{.Name}}!")
    p := User{Name: "jjz"}
    t.Execute(os.Stdout, p)
}

上面的例子會(huì)輸出字符串:hello jjz淮捆。
通過(guò)上面的例子我們可以看到,如何新建一個(gè)模板,再使用模板函數(shù)Parse()從字符串中加載模板內(nèi)容攀痊,使用模板函數(shù)Execute()可以給模板替換字段桐腌。替換模板字段的語(yǔ)法,{{}}中的字段就是要替換字段,{{. Name}}表示需要替換的字段名稱。
Beego使用復(fù)雜模板的方式很簡(jiǎn)單苟径,增加一個(gè)模板引擎函數(shù)案站,在項(xiàng)目運(yùn)行的時(shí)候遍歷views中的文件,把指定的文件解析為template.Template對(duì)象棘街,返回該對(duì)象提供使用蟆盐,這個(gè)模板引擎函數(shù)就是:beego.AddTemplateEngine

AddTemplateEngine

beego.AddTemplateEngine是一個(gè)用來(lái)把指定的文件遭殉,轉(zhuǎn)換為template.Template的對(duì)象的函數(shù)石挂。它的第一個(gè)參數(shù)是文件的后綴名,在views中的含有此后綴名的文件都會(huì)進(jìn)入該方法進(jìn)行處理险污。他的第二個(gè)參數(shù)是一個(gè)函數(shù)痹愚,用來(lái)處理文件的轉(zhuǎn)換,最后會(huì)返回一個(gè)template.Template的對(duì)象罗心。有了這個(gè)函數(shù)里伯,我們還少一個(gè)把jade文件解析為template.Template的方法,還好有人已經(jīng)做了jade的Go語(yǔ)言實(shí)現(xiàn)渤闷。

jade.go

jade.go是Jade的Go語(yǔ)言實(shí)現(xiàn)疾瓮。
jade.go的使用,首先安裝jade.go:

go get github.com/Joker/jade

jade.go使用示例:

func main() {
    tpl, err := jade.Parse("name_of_tpl", "doctype 5: html: body: p Hello world!")
    if err != nil {
        return
    }
    fmt.Printf( "%s", tpl  )
}

輸出字符串:

<!DOCTYPE html>
<html>
    <body>
        <p>Hello world!</p>
    </body>
</html>

有了jade.go就可以在Beego中使用飒箭,把jade文件轉(zhuǎn)換為T(mén)emplate對(duì)象狼电,在beego中添加jade.go解析jade模板的方法:

func addJadeTemplate() {
    beego.AddTemplateEngine("jade", func(root, path string, funcs template.FuncMap) (*template.Template, error) {
        jadePath := filepath.Join(root, path)
        content, err := utils.ReadFile(jadePath)
        fmt.Println(content)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        tpl, err := jade.Parse("name_of_tpl", content)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        fmt.Println("html:\n%s",tpl)
        tmp := template.New("Person template")
        tmp, err = tmp.Parse(tpl)
        if err != nil {
            return nil, fmt.Errorf("error loading jade template: %v", err)
        }
        fmt.Println(tmp)
        return tmp, err

    })
}

jade.go目前只支持使用字符串的方式接卸jade模板,因此需要先把.jade文件的內(nèi)容以字符串的方式讀取出來(lái)弦蹂。讀取文件的方法:

func ReadFile(path string) (str string, err error) {
    fi, err := os.Open(path)
    defer fi.Close()
    fd, err := ioutil.ReadAll(fi)
    str = string(fd)
    return
}

jade.go解析出的結(jié)果也是一個(gè)字符串肩碟,因此在代碼中需要把字符串轉(zhuǎn)換為template.Template對(duì)象,使用了Template.Parse()方法凸椿。
解析jade模板的引擎方法需要在main()中調(diào)用削祈,添加完jade的模板轉(zhuǎn)換引擎之后,就可以在Beego中使用jade模板了脑漫。

jade模板的使用

首先定義一個(gè)頁(yè)面home.jade:

doctype html
html
  head
    title pageTitle
  body
    h1 jade
    .content {{.content}}

其中{{.content}}是需要替換的字段髓抑,Controller層代碼:


func (c *MainController) Jade() {
    c.Data["content"] = "this is jade template"
    c.TplName = "home.jade"
}

運(yùn)行之后生成的頁(yè)面代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>pageTitle</title>
    </head>
    <body>
        <h1>jade</h1>
        <div class="content">this is jade template</div>  
    </body>
</html>

通過(guò)添加一個(gè)解析模板的引擎就可以在beego中使用jade的模板,beego從1.7.0之后開(kāi)始支持復(fù)雜的模板引擎优幸,不僅僅是對(duì)于jade的支持吨拍,也包括對(duì)于其他模板引擎的支持。
除了jade之外,在這個(gè)PR中推薦使用的是aceHTML模板引擎。

ace

ace是一個(gè)Go語(yǔ)言的HTML模板引擎,它借鑒了SlimJade,在Go語(yǔ)言里有超高的人氣郁轻。
ace模板在beego中的使用與使用Jade類(lèi)似队秩,首先安裝ace的依賴包:

go get github.com/yosssi/ace

在main函數(shù)中添加ace模板解析引擎:

func addAceTemplate()  {
    beego.AddTemplateEngine("ace", func(root, path string, funcs template.FuncMap) (*template.Template, error) {
        aceOptions := &ace.Options{DynamicReload: true, FuncMap: funcs}
        aceBasePath := filepath.Join(root, "base")
        aceInnerPath := filepath.Join(root, strings.TrimSuffix(path, ".ace"))
        tpl, err := ace.Load(aceBasePath, aceInnerPath, aceOptions)
        if err != nil {
            return nil, fmt.Errorf("error loading ace template: %v", err)
        }
        return tpl, nil
    })  
}

注意使用ace模板需要指定一個(gè)base.ace笑旺,另外使用ace.Load()函數(shù)可以直接返回一個(gè)template.Template對(duì)象,不需要再做其他轉(zhuǎn)換的工作刹碾。
添加完模板引擎之后就可以直接在views中添加.ace文件使用燥撞,新建一個(gè)home.ace文件:

= doctype html
html lang=en
  head
    meta charset=utf-8
    title Base and Inner Template
  body
    h1 ace
    .content {{.content}}

同樣的{{.content}}是也需要在controller層本替換成需要的內(nèi)容,controller層代碼:

func (c *MainController)Ace() {
    c.Data["content"] = "this is ace template"
    c.TplName = "home.ace"
}

示例代碼地址:https://github.com/jjz/go/tree/master/template

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迷帜,隨后出現(xiàn)的幾起案子物舒,更是在濱河造成了極大的恐慌,老刑警劉巖戏锹,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冠胯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锦针,警方通過(guò)查閱死者的電腦和手機(jī)荠察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奈搜,“玉大人悉盆,你說(shuō)我怎么就攤上這事〔雎穑” “怎么了焕盟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宏粤。 經(jīng)常有香客問(wèn)我脚翘,道長(zhǎng),這世上最難降的妖魔是什么绍哎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任来农,我火速辦了婚禮,結(jié)果婚禮上崇堰,老公的妹妹穿的比我還像新娘沃于。我一直安慰自己,他們只是感情好海诲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布繁莹。 她就那樣靜靜地躺著,像睡著了一般饿肺。 火紅的嫁衣襯著肌膚如雪蒋困。 梳的紋絲不亂的頭發(fā)上盾似,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天敬辣,我揣著相機(jī)與錄音雪标,去河邊找鬼。 笑死溉跃,一個(gè)胖子當(dāng)著我的面吹牛村刨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撰茎,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嵌牺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了龄糊?” 一聲冷哼從身側(cè)響起逆粹,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炫惩,沒(méi)想到半個(gè)月后僻弹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡他嚷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹋绽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筋蓖。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸耘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粘咖,到底是詐尸還是另有隱情蚣抗,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布涂炎,位于F島的核電站忠聚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唱捣。R本人自食惡果不足惜两蟀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望震缭。 院中可真熱鬧赂毯,春花似錦、人聲如沸拣宰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巡社。三九已至膛堤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晌该,已是汗流浹背肥荔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工绿渣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燕耿。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓中符,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親誉帅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淀散,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容