您现在的位置是:首页 >学无止境 >golang web学习随便记6-模板引擎网站首页学无止境

golang web学习随便记6-模板引擎

sjg20010414 2024-06-17 10:26:10
简介golang web学习随便记6-模板引擎

以下代码是几乎最简单的一个模板,{{ . }} 表示执行模板时将嵌入的数据

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Go Web 编程</title>
</head>

<body>
    {{ . }}
</body>

</html>

程序也足够简单,就是解析模板文件得到模板对象,执行模板输出结果

package main

import (
	"html/template"
	"net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("tpl.html")
	t.Execute(w, "Golang编程就是简单")
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8088",
	}
	http.HandleFunc("/process", process)
	server.ListenAndServe()
}

运行结果为

模板可以是模板文件,也可以是字符串,在上述代码中添加一个处理器函数

// ...........................
func process2(w http.ResponseWriter, r *http.Request) {
	strtpl := `
<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Go Web 编程</title>
</head>

<body>
    {{ . }}
</body>

</html>
`
	t := template.New("strtpl.html")
	t, _ = t.Parse(strtpl)
	t.Execute(w, "字符串模板也简单")
}

// .......................
	http.HandleFunc("/process2", process2)
// .......................

其实,对于文件模板,也是可以先New一个模板实例,然后用实例的ParseFiles方法解析模板文件。直接template.ParseFiles相当于生成了以文件名为模板名的模板实例。ParseFiles方法接受的参数是可变个数的,所以,实际应用中是一堆模板相互嵌套时,会把参数先放在一个数组,然后调用ParseFiles时将数组打散传入。模板中有多个文件时,必须有一个“主模板”,如果执行模板时没有指定“主模板”(调用的是Execute方法),那么第一个将作为“主模板”。指定主模板时(调用的是ExecuteTemplate方法),如果模板是未命名的,那么就用模板文件名作为模板名。模板解析过程中可能产生错误,用 template.Must(...) 包裹模板解析函数的调用过程是一种“偷懒”的错误处理模式,这种模式下,发生错误时将产生panic。

golang web学习随便记1-快速入门_sjg20010414的博客-CSDN博客   中有基本的模板嵌套情况。

下面我们来看模板中的动作。先来看条件动作:模板文件tpl.html

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>模板动作</title>
</head>

<body>
    {{ if . }}
    数字大于5!
    {{ else }}
    数字为5或小于5!
    {{ end }}
    <hr>
</body>

</html>
package main

import (
	"html/template"
	"math/rand"
	"net/http"
	"time"
)

func actionif(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("tpl.html")
	rand.Seed(time.Now().Unix())
	t.Execute(w, rand.Intn(10) > 5)
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8088",
	}
	http.HandleFunc("/actionif", actionif)
	server.ListenAndServe()
}

运行并从浏览器访问,得到的结果可能是2种之一:

然后来看迭代动作 :需要注意的是,迭代动作range,有可选的(fallback)选项 else,即没有数据时显示点什么。如果没有该选项,要处理无数据提示会麻烦很多。


<body>
    <ul>
        {{ range . }}
        <li>{{ . }}</li>
        {{ else }}
        <li>当前无数据</li>
        {{ end }}
    </ul>
</body>
package main

import (
	"html/template"
	"net/http"
)

func actionrange(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("tpl.html")
	daysOfWeek := []string{"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}
	t.Execute(w, daysOfWeek)
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8088",
	}
	http.HandleFunc("/actionrange", actionrange)
	server.ListenAndServe()
}

 显示结果为:

前面代码中,{{ . }} 的值都是golang代码执行模板时提供的确定值,但模板也提供了设置动作,可以在指定区域内使用模板内设定的其他值。

<body>
    <div>最难的语言是 {{ . }}</div>
    <div>
        {{ with "C++" }}
        最难的语言是 {{ . }}
        {{ else }}
        最难的语言还是 {{ . }}
        {{ end }}
    </div>
    <div>最难的语言又是 {{ . }} </div>
</body>
package main

import (
	"html/template"
	"net/http"
)

func actionwith(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("tpl.html")
	t.Execute(w, "Rust")
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8088",
	}
	http.HandleFunc("/actionwith", actionwith)
	server.ListenAndServe()
}

输出结果为:(第二个图是把html模板中的C++去掉,刷新后得到的,不用重启服务器)

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。