Gin之渲染HTML模板

渲染HTML模板

注:本文基于github.com/gin-gonic/gin v1.7.7依赖进行讲解

1.LoadHTMLFiles方法渲染1个HTML模板

Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染

LoadHTMLGlob()方法是加载一坨模板文件;

LoadHTMLFiles()方法是加载指定名字的模板文件;

模板通常都放在templates文件夹下的

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("templates/index.tmpl") //模板解析
	r.GET("/index", func(c *gin.Context) {

		//HTML是*Context的一个方法,需要传入3个参数(code int, name string, obj interface{});无返回值
		//code是http响应的状态码,比如写200;name 是模板的名称(当模板没有通过define命名的时候,默认模板名字就是文件名),
		//可以把H理解成一个json格式的
		//返回的是渲染好的模板文件 ; 模板渲染
		c.HTML(http.StatusOK, "index.tmpl", gin.H{
			"title": "liwnezhou",
		})
	})
	r.Run()
}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>posts/index</title>
</head>
<body>
{{.title}}
</body>
</html>


image-20220128214838392

image-20220128214659443

2.define定义模板名字LoadHTMLFiles渲染多个HTML模板

通过define给不同的模板定义不同的名字

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("templates/posts/index.tmpl", "templates/users/index.tmpl") //模板解析
	r.GET("/p", func(c *gin.Context) {
		c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
			"title": "liwnezhou",
		})
	})
	r.GET("/u", func(c *gin.Context) {
		c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
			"title": "lln",
		})
	})

	r.Run()
}

{{define "posts/index.tmpl"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>posts/index</title>
</head>
<body>
{{.title}}
</body>
</html>
{{end}}

{{define "users/index.tmpl"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>users/index</title>
    </head>
    <body>
    {{.title}}
    </body>
    </html>
{{end}}

image-20220128220700376

image-20220128220422589

image-20220129160424665

3.define定义模板名字LoadHTMLGlob渲染多个HTML模板

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.LoadHTMLGlob("templates/**/*") //这个**代表的是所有目录, *代表的是所有文件 ;假如templates文件夹下面没有posts文件夹与users文件夹,模板文件都是直接放在templates文件夹下,则写成templates/* 即可
	r.GET("/p", func(c *gin.Context) {
		c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
			"title": "liwnezhou",
		})
	})
	r.GET("/u", func(c *gin.Context) {
		c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
			"title": "lln",
		})
	})

	r.Run()
}

{{define "posts/index.tmpl"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>posts/index</title>
</head>
<body>
{{.title}}
</body>
</html>
{{end}}

{{define "users/index.tmpl"}}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>users/index</title>
    </head>
    <body>
    {{.title}}
    </body>
    </html>
{{end}}

image-20220128220700376

image-20220128220422589

image-20220129160419078

4.LoadHTMLFiles方法不会脚本注入

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("index.tmpl")//也可以写成	r.LoadHTMLFiles("./index.tmpl")
	r.GET("/u", func(c *gin.Context) {
		c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
			"bj": "<a href='https://liwenzhou.com'>李文周的博客</a>",
		})
	})

	r.Run()
}

{{define "posts/index.tmpl"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>posts/index</title>
</head>
<body>
{{.bj}}
</body>
</html>
{{end}}

image-20220129160045842

5.html\template\FuncMap类型及html\template\HTML类型及SetFuncMap方法及来脚本注入

即相信用户不会脚本注入

package main

import (
	"github.com/gin-gonic/gin"
	"html/template"
	"net/http"
)

func main() {
	r := gin.Default()
	//gin框架中给模板添加自定义模板函数
	//必须放在解析模板之前,SetFuncMapo是 *Engine的一个方法,传入一个参数(funcMap template.FuncMap),无返回值
	r.SetFuncMap(template.FuncMap{
		"safe": func(str string) template.HTML {
			return template.HTML(str)
		},
	})
	r.LoadHTMLFiles("index.tmpl")
	r.GET("/u", func(c *gin.Context) {
		c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
			"bj": "<a href='https://liwenzhou.com'>李文周的博客</a>",
		})
	})

	r.Run()
}

{{define "posts/index.tmpl"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>posts/index</title>
</head>
<body>
{{.bj | safe}}
</body>
</html>
{{end}}

image-20220129155920990

image-20220129155833383

6.自定义模板及Delims方法及pipeline概念

image-20220211205931597

package main

import (
	"fmt"
	"html/template"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

func formatAsDate(t time.Time) string {
	year, month, day := t.Date()
	return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}

func main() {
	router := gin.Default()
	router.Delims("{[{", "}]}") //修改模板的标识符
	router.SetFuncMap(template.FuncMap{
		"formatAsDate": formatAsDate,
	})
	router.LoadHTMLFiles("1.tmpl")

	router.GET("/raw", func(c *gin.Context) {
		c.HTML(http.StatusOK, "1.tmpl", map[string]interface{}{
			"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),
		})
	})

	router.Run(":8080")
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>posts/index</title>
</head>
<body>
{[{.now}]}

Date: {[{.now | formatAsDate}]}
</body>
</html>


image-20220211205243119

image-20220211205444118

image-20220211204955312

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Gin框架中,可以使用HTML模板渲染页面。可以使用`LoadHTMLGlob()`或`LoadHTMLFiles()`方法来加载HTML模板。 假设你有一个`views`文件夹,里面存放了你的HTML模板文件,可以使用以下代码加载HTML模板: ```go router := gin.Default() // 加载HTML模板文件 router.LoadHTMLGlob("views/*") // 定义路由 router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "index.html", gin.H{ "title": "首页", }) }) router.GET("/about", func(c *gin.Context) { c.HTML(http.StatusOK, "about.html", gin.H{ "title": "关于我们", }) }) router.Run(":8080") ``` 在上面的代码中,我们使用了`LoadHTMLGlob()`方法来加载`views`文件夹下的所有HTML模板文件。然后定义了两个路由,分别为`"/"`和`"/about"`。在处理这两个路由的回调函数中,我们使用了`c.HTML()`方法来渲染HTML模板文件,并传递了一个`gin.H`类型的数据,用于在HTML模板渲染动态数据。 例如,假设`index.html`文件内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{{.title}}</title> </head> <body> <h1>{{.title}}</h1> <p>这是首页</p> </body> </html> ``` 其中,我们使用了`{{.title}}`来渲染动态数据。 当用户访问`"/"`路由时,Gin框架会自动渲染`index.html`模板文件,并将`gin.H`类型的数据`{"title": "首页"}`传递给模板文件。渲染后的HTML内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>首页</h1> <p>这是首页</p> </body> </html> ``` 同样的,当用户访问`"/about"`路由时,Gin框架会自动渲染`about.html`模板文件,并将`gin.H`类型的数据`{"title": "关于我们"}`传递给模板文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值