Golang Gin HTML模版使用

Gin支持HTML渲染来完成对于传统MVC模式的支持。

以下是使用Gin框架渲染HTML模板的示例代码:

package main

import (
    "net/http"

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

func main() {
    // 创建一个默认的路由引擎
    router := gin.Default()

    // 设置HTML模板文件目录
    router.LoadHTMLGlob("templates/*")

    // 定义路由
    router.GET("/", func(c *gin.Context) {
        // 渲染HTML模板
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "title": "Gin HTML模板示例",
        })
    })

    // 启动HTTP服务
    router.Run(":8080")
}

上述代码中,router.LoadHTMLGlob 方法指定了HTML模板文件所在的目录,该目录下所有以.tmpl为扩展名的文件都会被加载。

在路由处理函数中,可以使用c.HTML方法渲染HTML模板。该方法的第一个参数是HTTP状态码,第二个参数是模板文件的文件名,第三个参数是传递给模板的变量。在上述示例中,我们传递了一个变量title,其值为Gin HTML模板示例

在模板文件中可以通过{{ . }}语法来访问变量。例如,在上述示例中,可以使用{{ .title }}来访问title变量的值。

以下是一个简单的HTML模板示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ .title }}</title>
</head>
<body>
    <h1>{{ .title }}</h1>
</body>
</html>

上述模板文件中,{{ .title }}语法会被渲染成变量title的值。

模版有多种加载方式,还有通过LoadHTMLFiles方法加载HTML模板文件。

func main() {
    router := gin.Default()

    // 或者加载多个HTML模板文件
    router.LoadHTMLFiles("templates/index.tmpl", "templates/layout.tmpl")

    router.Run(":8080")
}

自定义模版布局

模板布局是指在多个HTML模板文件中公共部分的抽象表示。可以使用definetemplate模板函数来定义和使用模板布局。

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("templates/*")

    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "title": "首页",
        })
    })

    router.GET("/about", func(c *gin.Context) {
        c.HTML(http.StatusOK, "about.tmpl", gin.H{
            "title": "关于我们",
        })
    })

    router.Run(":8080")
}

以下是index.tmplabout.tmpl的示例:

<!-- index.tmpl -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ .title }}</title>
</head>
<body>
    {{ template "content" . }}
</body>
</html>

<!-- about.tmpl -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ .title }}</title>
</head>
<body>
    {{ template "content" . }}
</body>
</html>
<!-- content.tmpl -->
{{ define "content" }}
<h1>{{ .title }}</h1>
{{ end }}

自定义模版函数

模版函数主要用于在模版中使用的,用于辅助页面显示的函数,比如格式转换等,例子如下

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("./testdata/template/raw.tmpl")

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

    router.Run(":8080")
}

raw.tmpl

Date: {[{.now | formatAsDate}]}

结果:

Date: 2017/07/01

自定义模版渲染器

Gin框架可以使用模板引擎来渲染HTML模板。常用的模板引擎有HTML/template、Mustache、Handlebars,下面是使用自定义的 html 模板渲染的例子

import "html/template"

func main() {
    router := gin.Default()
    html := template.Must(template.ParseFiles("file1", "file2"))
    router.SetHTMLTemplate(html)
    router.Run(":8080")
}

更复杂的例子

看以下代码,它演示了使用Gin模板引擎渲染HTML模板,以及如何从模板获取表单数据:

package main

import (
    "net/http"

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

func main() {
    router := gin.Default()

    // 首页路由
    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "title": "Gin Example",
        })
    })

    // 处理表单提交
    router.POST("/submit", func(c *gin.Context) {
        // 从POST表单获取数据
        firstname := c.PostForm("firstname")
        lastname := c.PostForm("lastname")

        c.HTML(http.StatusOK, "submit.tmpl", gin.H{
            "firstname": firstname,
            "lastname":  lastname,
        })
    })

    router.Run(":8080")
}

其中,我们定义了两个路由:一个是处理首页请求,一个是处理表单提交请求。在首页路由中,我们使用Gin的HTML方法渲染了一个名为"index.tmpl"的HTML模板,同时传递了一个变量"title"给模板。在表单提交路由中,我们使用PostForm方法从POST表单中获取数据,然后再将数据传递给名为"submit.tmpl"的HTML模板。

下面是"index.tmpl"和"submit.tmpl"的内容:

<!-- index.tmpl -->
<!DOCTYPE html>
<html>
<head>
    <title>{{ .title }}</title>
</head>
<body>
    <h1>{{ .title }}</h1>
    <form action="/submit" method="POST">
        <label for="firstname">First Name:</label>
        <input type="text" name="firstname" id="firstname"><br><br>
        <label for="lastname">Last Name:</label>
        <input type="text" name="lastname" id="lastname"><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

<!-- submit.tmpl -->
<!DOCTYPE html>
<html>
<head>
    <title>Form Submitted</title>
</head>
<body>
    <h1>Form Submitted</h1>
    <p>First Name: {{ .firstname }}</p>
    <p>Last Name: {{ .lastname }}</p>
</body>
</html>

以上示例代码和HTML模板都可以用于参考和学习。当然,在实际开发中,需要根据具体的业务需求和情况进行相应的调整和改进。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容