在Beego中使用Jade模板

Jade是一个高性能的HTML模板引擎,它受到Haml的影响,是使用JavaScript实现的。Jade在客户端也有支持,它的代码比html可读性要高很多,Jade是一个比较常用的HTML模板。
Beego是一个go语言的web应用程序开源web框架,而Beego从1.7.0开始支持更加复杂的模板引擎,当然也包括了对于jade的支持,支持更复杂模板引擎的PR地址https://github.com/astaxie/beego/pull/1940
在介绍Jade的使用之前先来看下Go下面的html/template包。

html/template

在Go语言中,html/template包是一个很强大的html模板包,结合text/template的模板语法,基本上可以满足大部分的HTML模板需求,无论是Beego中是默认支持的两种模板格式.tpl.html,以及jadeace都是可以解析为html/template中的Template对象使用,就是说我们所使用的html模板最终都是基于html/template包实现的。
html/template使用实例:

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)
}

上面的例子会输出字符串:hello jjz
通过上面的例子我们可以看到,如何新建一个模板,再使用模板函数Parse()从字符串中加载模板内容,使用模板函数Execute()可以给模板替换字段。替换模板字段的语法,{{}}中的字段就是要替换字段,{{. Name}}表示需要替换的字段名称。
Beego使用复杂模板的方式很简单,增加一个模板引擎函数,在项目运行的时候遍历views中的文件,把指定的文件解析为template.Template对象,返回该对象提供使用,这个模板引擎函数就是:beego.AddTemplateEngine

AddTemplateEngine

beego.AddTemplateEngine是一个用来把指定的文件,转换为template.Template的对象的函数。它的第一个参数是文件的后缀名,在views中的含有此后缀名的文件都会进入该方法进行处理。他的第二个参数是一个函数,用来处理文件的转换,最后会返回一个template.Template的对象。有了这个函数,我们还少一个把jade文件解析为template.Template的方法,还好有人已经做了jade的Go语言实现。

jade.go

jade.go是Jade的Go语言实现。
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文件转换为Template对象,在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文件的内容以字符串的方式读取出来。读取文件的方法:

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解析出的结果也是一个字符串,因此在代码中需要把字符串转换为template.Template对象,使用了Template.Parse()方法。
解析jade模板的引擎方法需要在main()中调用,添加完jade的模板转换引擎之后,就可以在Beego中使用jade模板了。

jade模板的使用

首先定义一个页面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"
}

运行之后生成的页面代码:

<!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>

通过添加一个解析模板的引擎就可以在beego中使用jade的模板,beego从1.7.0之后开始支持复杂的模板引擎,不仅仅是对于jade的支持,也包括对于其他模板引擎的支持。
除了jade之外,在这个PR中推荐使用的是aceHTML模板引擎。

ace

ace是一个Go语言的HTML模板引擎,它借鉴了SlimJade,在Go语言里有超高的人气。
ace模板在beego中的使用与使用Jade类似,首先安装ace的依赖包:

go get github.com/yosssi/ace

在main函数中添加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模板需要指定一个base.ace,另外使用ace.Load()函数可以直接返回一个template.Template对象,不需要再做其他转换的工作。
添加完模板引擎之后就可以直接在views中添加.ace文件使用,新建一个home.ace文件:

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

同样的{{.content}}是也需要在controller层本替换成需要的内容,controller层代码:

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容