Gin框架操作指南03:HTML渲染

news/2024/10/20 9:57:03/

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南:开山篇。
本节演示HTML渲染,包括简单渲染,使用不同目录下名称相同的模板,自定义模板渲染器,自定义模板函数,注意多模板渲染官方没有直接介绍,只是给出了参考链接,自定义分隔符比较简单,有兴趣的读者可自行学习这些。在开始之前,我们需要在”01数据渲染“目录下打开命令行,执行如下命令来创建子目录:

mkdir HTML渲染

cd到该目录,创建4个目录:

mkdir demo01 demo02 demo03 demo04

目录

    • 一、简单渲染
    • 二、使用不同目录下名称相同的模板
    • 三、自定义模板渲染器
    • 四、自定义模板函数

一、简单渲染

cd到demo01,创建如下目录结构:

│  main.go
└─templatesindex.html

main.go:

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {// 创建默认的 Gin 路由器router := gin.Default()// 使用 LoadHTMLGlob 加载 templates 目录下的所有 HTML 模板文件// 这里使用通配符 "*" 匹配所有文件router.LoadHTMLGlob("templates/*")// 另一种方式是使用 LoadHTMLFiles 加载具体的模板文件// 它可以单独列出需要加载的模板文件// router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")// 定义一个 GET 路由,当用户访问 /index 时触发此处理函数router.GET("/index", func(c *gin.Context) {// 使用 c.HTML() 方法渲染 HTML 页面// 第一个参数 http.StatusOK 表示 HTTP 状态码 200,表示请求成功// 第二个参数是要渲染的模板文件名 "index.html"// 第三个参数是传递给模板的数据,通过 gin.H 创建键值对c.HTML(http.StatusOK, "index.html", gin.H{"title": "Main website", // 这里将传递一个名为 "title" 的数据,其值为 "Main website"})})// 启动 Gin 服务器,监听在 0.0.0.0:8080// 这会让服务器在本地 8080 端口上等待并响应请求router.Run(":8080")
}

注意:官方文档用的是.tmpl,但**.html和.tmpl的效果是一样的**,而且IDE对html提供代码高亮和补全,所以推荐用.html。

index.html:

<html>
<h1>{{ .title }} <!-- 这里是 Go 模板语法,表示将模板中传递的 "title" 数据渲染到此处 -->
</h1></html>

效果:
在这里插入图片描述

二、使用不同目录下名称相同的模板

cd到demo02,创建如下目录结构:

│  main.go
└─templates├─posts│      index.html└─usersindex.html

main.go:

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {// 创建默认的 Gin 路由器router := gin.Default()// 使用 LoadHTMLGlob 加载 templates 目录下的所有 HTML 模板文件// 使用 "**/*" 通配符表示递归加载所有子目录下的模板文件router.LoadHTMLGlob("templates/**/*")// 定义一个 GET 路由,当用户访问 /posts/index 时触发此处理函数router.GET("/posts/index", func(c *gin.Context) {// 使用 c.HTML() 方法渲染 "posts/index.html" 模板// 第一个参数 http.StatusOK 表示 HTTP 状态码 200,表示请求成功// 第二个参数是要渲染的模板文件名 "posts/index.html"// 第三个参数是传递给模板的数据,通过 gin.H 创建键值对c.HTML(http.StatusOK, "posts/index.html", gin.H{"title": "Posts", // 这里将传递一个名为 "title" 的数据,其值为 "Posts"})})// 定义另一个 GET 路由,当用户访问 /users/index 时触发此处理函数router.GET("/users/index", func(c *gin.Context) {// 使用 c.HTML() 方法渲染 "users/index.html" 模板// 第一个参数 http.StatusOK 表示 HTTP 状态码 200,表示请求成功// 第二个参数是要渲染的模板文件名 "users/index.html"// 第三个参数是传递给模板的数据,通过 gin.H 创建键值对c.HTML(http.StatusOK, "users/index.html", gin.H{"title": "Users", // 这里将传递一个名为 "title" 的数据,其值为 "Users"})})// 启动 Gin 服务器,监听在 0.0.0.0:8080// 这会让服务器在本地 8080 端口上等待并响应请求router.Run(":8080")
}

posts/index.html

{{ define "posts/index.html" }} <!-- 定义一个名为 "posts/index.html" 的模板 -->
<html>
<h1>{{ .title }} <!-- 这里是 Go 模板语法,表示将模板中传递的 "title" 数据渲染到此处 -->
</h1>
<p>Using posts/index.html</p> <!-- 显示此页面的来源 --></html>
{{ end }} <!-- 结束模板定义 -->

users/index.html

{{ define "users/index.html" }} <!-- 定义一个名为 "users/index.html" 的模板 -->
<html>
<h1>{{ .title }} <!-- 这里是 Go 模板语法,表示将模板中传递的 "title" 数据渲染到此处 -->
</h1>
<p>Using users/index.html</p> <!-- 显示此页面的来源 --></html>
{{ end }} <!-- 结束模板定义 -->

效果只展示一个,另一个同理:
在这里插入图片描述

三、自定义模板渲染器

注意这里官方示例是不全的,请读者按本文的步骤实验。
cd到demo03,创建main.go,file1.html,file2.html,填充代码:
main.go

package mainimport ("html/template" // 导入 Go 的 html/template 包,用于处理 HTML 模板"net/http""github.com/gin-gonic/gin" // 导入 Gin 框架
)func main() {// 创建默认的 Gin 路由器router := gin.Default()// 使用 template.Must() 方法来解析指定的 HTML 模板文件html := template.Must(template.ParseFiles("file1.html", "file2.html"))// 设置 HTML 模板router.SetHTMLTemplate(html)// 定义路由以访问 file1.htmlrouter.GET("/file1", func(c *gin.Context) {c.HTML(http.StatusOK, "file1.html", nil)})// 定义路由以访问 file2.htmlrouter.GET("/file2", func(c *gin.Context) {c.HTML(http.StatusOK, "file2.html", nil)})// 启动 Gin 服务器,监听在 0.0.0.0:8080router.Run(":8080")
}

file1.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>File 1</title>
</head><body><h1>This is file 1</h1><p>Welcome to the first HTML file.</p>
</body></html>

file2.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>File 2</title>
</head><body><h1>This is file 2</h1><p>Welcome to the second HTML file.</p>
</body></html>

效果,另一个同理:
在这里插入图片描述

四、自定义模板函数

cd到demo04,创建main.go,raw.html,填充代码:

package mainimport ("fmt""html/template" // 引入 html/template 包用于模板渲染"net/http"      // 引入 net/http 包用于 HTTP 相关功能"time"          // 引入 time 包用于处理时间"github.com/gin-gonic/gin" // 引入 Gin 框架
)// formatAsDate 是一个自定义函数,接受一个 time.Time 类型的参数
// 返回格式化为 "年/月/日" 的字符串形式
func formatAsDate(t time.Time) string {// 获取年份、月份和日期year, month, day := t.Date()// 使用 fmt.Sprintf 格式化字符串,返回格式为 "YYYY/MM/DD"return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}func main() {// 创建一个默认的 Gin 路由实例router := gin.Default()// 自定义模板的分隔符,改变默认的 {{ 和 }} 分隔符// 将其设置为 {[{ 和 }]},以避免与 JavaScript 的冲突router.Delims("{[{", "}]}")// 设置模板函数映射,允许在模板中使用自定义函数// 将 formatAsDate 函数添加到模板函数映射中router.SetFuncMap(template.FuncMap{"formatAsDate": formatAsDate, // 注册格式化函数})// 加载指定路径下的 HTML 模板文件// 在此示例中,加载的模板文件是 "raw.tmpl"router.LoadHTMLFiles("raw.html")// 定义处理 GET 请求的路由,访问 /raw 时触发该处理函数router.GET("/raw", func(c *gin.Context) {// 渲染 HTML 模板,并传递当前时间作为数据// map[string]interface{} 用于传递数据给模板c.HTML(http.StatusOK, "raw.html", map[string]interface{}{// 设置 "now" 字段为特定的时间(2017年7月1日)"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC),})})// 启动 HTTP 服务器,监听在 8080 端口// 该服务器将在接收到请求时调用上面定义的路由router.Run(":8080")
}

raw.html

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

效果:
在这里插入图片描述


http://www.ppmy.cn/news/1540487.html

相关文章

pdf文件怎样一张纸打印四页

在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件中的多页内容合并打印到一张纸上的情况&#xff0c;比如将四页内容打印到一张A4纸上&#xff0c;以节省纸张和成本。同时&#xff0c;在打开pdf文件的方式&#xff0c;一般都是通过电脑浏览器打印&#xff0c;因此对…

外部服务器如何访问专用网络的本地IP

在专用网络&#xff08;如公司内网、专用局域网等&#xff09;中的 IP 地址&#xff0c;也属于本地 IP 地址。这些地址仅在专用网络内部使用&#xff0c;不能直接从互联网访问。本地 IP 地址的范围通常包括以下几类私有地址段&#xff1a; 10.0.0.0 到 10.255.255.255172.16.0…

Unity中通过给定的顶点数组生成凸面体的方法参考

这里我们使用了Quickhull for Unity插件&#xff0c;其实就是一个ConvexHullCalculator.cs文件&#xff0c;代码如下&#xff1a; /*** Copyright 2019 Oskar Sigvardsson** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software…

SQL实现给表添加数据及其触发器操作

新建一个表实现添加数据&#xff0c;数据不重复&#xff0c;。判断两个字段是否存在&#xff0c;如果存在&#xff0c;就修改对应字段&#xff0c;如果不存在就新增数据。 测试表格Test如下&#xff1a; 新建触发器如图&#xff1a; 触发程式如下&#xff1a; USE [Test] GO/*…

Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题

Git/SVN面试题 下边是我自己整理的面试题&#xff0c;基本已经很全面了&#xff0c;想要的可以私信我&#xff0c;我会不定期去更新思维导图 哪里不会点哪里 Git和SVN有什么区别&#xff1f; Git是分布式的&#xff0c;而SVN不是分布式的Git把内容按元数据方式存储&#xf…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

Wails 学习笔记:Wails核心思想理解

文章目录 1. Wails 的核心思想2. 工作流程2.1 前端渲染2.2 后端逻辑2.3 前后端通信2.4 应用打包与分发 3. Wails 主要组件3.1 WebView3.2 事件与数据绑定3.3 窗口管理 4. Wails 的优点5. Wails 的使用场景6. 启动函数Runwails.Run() 的主要功能wails.Run() 的参数&#xff1a;w…

LeetCode搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 …