Gin框架官方文档详解03:HTML渲染

:本教程使用工作区方法管理项目,详见第一讲:创建一个简单的Gin应用。

目录

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

一、简单渲染

首先,以03HTML渲染为根目录,创建如下目录结构:

├─demo01
│  │  main.go
│  └─templates
│          index.html
├─demo02
│  │  main.go
│  └─templates
│      ├─posts
│      │      index.html
│      └─users
│              index.html
├─demo03
│      file1.html
│      file2.html
│      main.go
├─demo04
│  │  main.go
│  └─templates
│          index.html
└─demo05│  main.go└─templatesraw.html

进入到demo01,填充代码:
main.go

package mainimport ("net/http" // 导入 HTTP 状态码和服务功能"github.com/gin-gonic/gin" // 导入 Gin 框架
)func main() {router := gin.Default() // 创建一个默认的 Gin 路由器,带有默认的中间件(如日志和恢复)// 加载所有位于 /templates 目录下的 HTML 文件,支持通配符(如 *.html)router.LoadHTMLGlob("templates/*")// 使用 LoadHTMLFiles 可以加载指定的多个文件// router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")// 设置一个 GET 路由,当用户访问 /index 时,返回 HTML 页面router.GET("/index", func(c *gin.Context) {// 使用 HTML 渲染函数,HTTP 状态码 200 (http.StatusOK),// 渲染 "index.html" 文件,并传递数据(键值对形式)供模板使用c.HTML(http.StatusOK, "index.html", gin.H{"title": "Main website", // 传递 "title" 变量到模板})})// 运行应用程序,并监听在端口 8080 上router.Run(":8080")
}

index.html

<html>
<h1>{{ .title }} <!-- 这里是模板占位符,将被渲染时替换为 title 变量的值 -->
</h1></html>

LoadHTMLGlob():用于加载模板文件的函数。LoadHTMLGlob("../templates/*") 表示加载 …/templates 目录下的所有 HTML 文件。它支持通配符,常用于一次性加载多个模板。
LoadHTMLFiles():和 LoadHTMLGlob() 类似,但它不使用通配符,而是明确列出要加载的模板文件。可以根据需要使用该函数加载特定的模板文件。
c.HTML(http.StatusOK, "index.html", gin.H{"title": "Main website"}):渲染 index.html 模板,并将 title 变量传递给模板,值为 “Main website”。在模板文件中,{{ .title }} 会被渲染为传递进来的 title 值。
注意:Gin 的模板引擎支持多种文件扩展名,常见的 .html 文件扩展名并不是必须的,比如你可以将模板文件命名为 .tmpl,模板引擎同样能够识别和渲染这些文件。但个人建议仍使用.html,因为IDE都能对.html提供代码高亮和补全。
效果
在这里插入图片描述

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

进入到demo02,填充代码:
main.go

package mainimport ("net/http" // 导入 HTTP 状态码和服务功能"github.com/gin-gonic/gin" // 导入 Gin 框架
)func main() {router := gin.Default() // 创建一个默认的 Gin 路由器,带有默认中间件(如日志和恢复)// 加载 templates 目录下所有子目录的所有模板文件router.LoadHTMLGlob("templates/**/*")// 定义一个 GET 路由,处理 /posts/indexrouter.GET("/posts/index", func(c *gin.Context) {// 渲染 posts/index.html 模板,并传递数据c.HTML(http.StatusOK, "posts/index.html", gin.H{"title": "Posts", // 传递标题})})// 定义另一个 GET 路由,处理 /users/indexrouter.GET("/users/index", func(c *gin.Context) {// 渲染 users/index.html 模板,并传递数据c.HTML(http.StatusOK, "users/index.html", gin.H{"title": "Users", // 传递标题})})// 启动 HTTP 服务器,监听 8080 端口router.Run(":8080")
}

posts/index.html

{{ define "posts/index.html" }} <!-- 定义一个名为 "posts/index.html" 的模板块 -->
<html>
<h1>{{ .title }} <!-- 这里会被传递进来的标题替换 -->
</h1>
<p>Using posts/index.html</p> <!-- 说明当前使用的是哪个模板 --></html>
{{ end }} <!-- 结束模板块定义 -->

users/index.html

{{ define "users/index.html" }} <!-- 定义一个名为 "users/index.html" 的模板块 -->
<html>
<h1>{{ .title }} <!-- 这里会被传递进来的标题替换 -->
</h1>
<p>Using users/index.html</p> <!-- 说明当前使用的是哪个模板 --></html>
{{ end }} <!-- 结束模板块定义 -->

模板定义:每个模板都使用 {{ define "模板名称" }}{{ end }} 包裹,定义了一个可重用的模板块。在渲染时,通过指定模板的完整名称来选择要渲染的具体模板。
使得在不同目录中存在同名模板时(比如这里都有index.html),可以准确指定使用哪个模板。当然,使用LoadHTMLFiles()可以不用定义模板块,也能达到相同的效果,就是要指定具体文件路径而已。相对来说,LoadHTMLGlob()使用更方便,不管templates下有多少个模板,调用语句都是一样的。
效果
在这里插入图片描述

三、自定义模板渲染器

进入到demo03,填充代码:
main.go

package mainimport ("html/template" // 导入 HTML 模板包"net/http""github.com/gin-gonic/gin" // 导入 Gin 框架
)func main() {router := gin.Default()// 加载 file1.html 和 file2.html 模板文件html := template.Must(template.ParseFiles("file1.html", "file2.html"))// 设置自定义的 HTML 模板渲染器router.SetHTMLTemplate(html)// 定义一个路由,当用户访问 /file1 时,返回 file1.html 页面router.GET("/file1", func(c *gin.Context) {c.HTML(http.StatusOK, "file1.html", gin.H{"title": "Hello, World", // 传递 "title" 变量到模板})})// 定义另一个路由,当用户访问 /file2 时,返回 file2.html 页面router.GET("/file2", func(c *gin.Context) {c.HTML(http.StatusOK, "file2.html", gin.H{"title": "Hello, World", // 传递 "title" 变量到模板})})// 启动 Gin 服务器,监听在 8080 端口router.Run(":8080")
}

file1.html

<!DOCTYPE html>
<html><head><title>{{ .title }} - File 1</title>
</head><body><h1>{{ .title }} from File 1</h1><p>This content is rendered from file1.html.</p>
</body></html>

file2.html

<!DOCTYPE html>
<html><head><title>{{ .title }} - File 2</title>
</head><body><h1>{{ .title }} from File 2</h1><p>This content is rendered from file2.html.</p>
</body></html>

效果
在这里插入图片描述

到目前为止,我们已经学了三种模板加载方法:
1.定义模板名,用LoadHTMLGlob()
2.不定义模板名,用LoadHTMLFiles()
3.不用模板目录,用template.Must()
在真实开发中,团队和项目的性质通常会影响选择的方式。常见的倾向包括:
中大型项目:往往会选择 1,因为它能保持项目结构的整洁,并且方便管理多个模板。
小型项目:可能会倾向于 2,因为它提供了更大的灵活性和可控性。
原型开发或快速迭代:通常会选择 3,以便于快速验证和调整。

四、自定义分隔符

进入到demo04,填充代码:
main.go

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 设置自定义的分隔符r.Delims("{[{", "}]}")// 加载指定路径下的 HTML 模板r.LoadHTMLGlob("templates/*")// 定义一个路由,当用户访问 /index 时,返回 index.html 页面r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", gin.H{"title": "Custom Delimiter Example", // 传递 "title" 变量到模板})})// 启动 Gin 服务器,监听在 8080 端口r.Run(":8080")
}

index.html

<!DOCTYPE html>
<html><head><title>{[{ .title }]}</title>
</head><body><h1>{[{ .title }]}</h1><p>Welcome to the page with custom delimiters!</p>
</body></html>

效果
在这里插入图片描述

五、自定义模板函数

进入到demo05,填充代码:
main.go

package mainimport ("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, // 将 formatAsDate 函数注册为模板函数})// 加载 HTML 模板文件router.LoadHTMLFiles("templates/raw.html")// 定义路由,当用户访问 /raw 时,返回 raw.html 模板router.GET("/raw", func(c *gin.Context) {c.HTML(http.StatusOK, "raw.html", map[string]interface{}{"now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), // 传递当前时间到模板})})// 启动 Gin 服务器,监听在 8080 端口router.Run(":8080")
}

raw.html

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

注意
1.FuncMap()中的key和value可以不同。
2.html中调用的函数名是FuncMap()中的key,不是value!也就是说,value的值可以随便取,不影响html调用。
3.SetFuncMap必须在 LoadHTMLFiles之前调用!
效果
在这里插入图片描述

六、总结

在使用 Gin 框架进行 HTML 渲染时,可以通过 LoadHTMLGlob() 或 LoadHTMLFiles() 方法加载模板文件。LoadHTMLGlob() 支持使用通配符,适合批量加载多个模板,而 LoadHTMLFiles() 允许精确加载特定的模板文件。通过在模板中定义结构,可以避免不同目录中同名模板的冲突,确保在渲染时通过完整名称来选择正确的模板。自定义模板渲染器和函数映射(使用 SetFuncMap)可以扩展模板功能,如格式化日期。使用自定义分隔符可改变模板中变量的标识符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习与神经网络:诺贝尔物理学奖的新篇章

机器学习与神经网络&#xff1a;诺贝尔物理学奖的新篇章 引言 2024年诺贝尔物理学奖的颁发&#xff0c;无疑是一个历史性的转折点。这一奖项首次授予了在机器学习与神经网络领域做出杰出贡献的科学家&#xff0c;标志着人工智能技术在科学研究中的重要地位得到了前所未有的认…

3.计算机网络_端口号

端口号的由来 运输层的作用&#xff1a; 在计算机网络中&#xff0c;运输层处在用户功能的最底层、通信部分的最高层的位置&#xff0c;也就是说运输层是用户数据和实际网络通信的桥梁。因此运输层屏蔽了网络的实现部分&#xff0c;以协议的方式向用户层提供了接口&#xff…

Matlab绘图总结(进阶)

本文在前文的基础上进一步整理画图方法 MATLAB画动图_CSDN博客 1. 基础图形绘制 1.1 rectangle&#xff08;矩形&#xff0c;圆形&#xff09; 在前文中&#xff0c;讲解了如何使用rectangle&#xff0c;rectangle本意是用来画矩形的&#xff0c;其中&#xff0c;Curvature可…

【一起学Rust | 框架篇 | Tauri2.0框架】高级概念之安全特性的权限与能力

文章目录 前言一、开发前准备1. 准备项目2. 需求分析1. 监听系统热键2. 切换窗口无边框3. 切换窗口全屏 二、安装插件三、前端实现功能四、配置权限 前言 当前时间为 2024 年 9 月&#xff0c;距离Tauri 2.0 的 RC 版本发布迄今已近一个月。从 Tauri 官方渠道可以看出&#xf…

CVESearch部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1、下载安装基础组件2.1.1.2、下载安装MongoDB Community Edition 7.0 2.1.2、使用源码安装系统2.1.2.1、安装CVESearch2.1.2.2、填充MongoDB数据库2.1.2.3、填充Redis数据库 2.2、使用方法 3、测…

使用java画一条线。

package p1008;import javax.swing.*; import java.awt.*;public class LineAndTextExample extends JPanel {Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 设置线条粗细Graphics2D g2d (Graphics2D) g;g2d.setStroke(new BasicStroke(5))…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(基础)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;基础&#xff09; 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一&#xff1a;内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定…

Broken pipe异常分析及处理

问题出现&#xff1a;生产上运行的系统业务正常&#xff0c;当在查询数据时&#xff0c;出现后台异常&#xff0c;检查后台日志出现Broken Pipe异常&#xff1b; 如图示&#xff1a; Broken Pipe定义&#xff1a;通常发生在服务器端尝试向已关闭的套接字&#xff08;客户端/端…

前端面试经验总结1(简历篇)

本文分为3部分&#xff0c;分别为第一部分简历篇&#xff0c;第二部分经典问题篇以及第三部分知识体系篇&#xff0c;都是个人面试经验及同行面试经验总结和整理。 我对于简历的理解是这样的&#xff0c;简历的作用是让看简历的人能够快速、准确地捕捉到有用信息&#xff1a; 你…

大数据存储,搜索智能化的实践分享 | OceanBase 城市交流会精彩回顾

9月21日&#xff0c;“OceanBase 城市交流会”来到了深圳&#xff0c;携手货拉拉大数据技术与产品部&#xff0c;联合举办了“走进货拉拉”的技术交流活动。货拉拉、万家数科、云集、百丽等多家企业的一线技术专家&#xff0c;就大数据存储、AI等热点话题&#xff0c;深入探讨并…

新的一轮前端面试已来临,避坑指南来 get!

最近看到很多人都在投简历&#xff0c;可是很多人对待面试不够认真&#xff0c;只会等待结果&#xff0c;不去努力。所以整理一些懒人面试技巧给大家。 我们说说目前应用面积最广的 Vue&#xff0c;大厂或是高级工程师面试的时候究竟会碰到什么棘手或是难缠的 Vue 的面试题呢&a…

人工智能 | openai chatgpt 大语言模型

简介 OpenAI 一个美国人工智能研究实验室&#xff0c;由非营利组织 OpenAI Inc&#xff0c;和其营利组织子公司 OpenAI LP 所组成。该组织于 2015 年由萨姆阿尔特曼、里德霍夫曼、杰西卡利文斯顿、伊隆马斯克、伊尔亚苏茨克维、沃伊切赫萨伦巴、彼得泰尔等人在旧金山成立&…

高效数据处理:MapReduce与Hive的实战应用

文章目录 hive分析汇总互联网日志分析1.项目需求2.数据说明3.算法思路 用户电影推荐1.项目需求2.数据说明3.算法思路4.解题步骤 简单数据统计WordCount数据说明 疫情数据分析1.项目需求2.数据说明step1:创建ods层数据表step2&#xff1a;创建dwd层数据表step3&#xff1a;创建d…

selenium的webdriver常用方法和属性介绍(2)

selenium的webdriver介绍 从selenium导入webdriver模块&#xff0c;在pycharm中跳转webdriver模块的__init__.py文件&#xff0c;内容如图所示&#xff1a;从selenium包的子目录中导入了很多模块并做了重命名&#xff0c;用于支持如下 Chrome/Edge/Ie/Firefox/Safari浏览器。 使…

Codigger Keyboard Look应用说明

Keyboard Look是一项专为Desktop设计的功能模式&#xff0c;旨在通过全面启用键盘操作&#xff0c;减少对鼠标依赖&#xff0c;从而提升用户的工作效率和操作体验。尤其对于频繁使用键盘的用户&#xff0c;如开发者&#xff0c;此模式可显著加速日常操作&#xff0c;优化工作流…

连肝了多天学习MySQL索引与性能优化,详细总结一下索引的使用与数据库优化

文章目录 索引是什么&#xff1f;索引的作用初步认识索引索引的类型按照数据结构分类BTREE索引 哈希索引 按功能逻辑进行分类唯一索引普通索引主键索引全文索引 按照字段的个数进行划分单列索引多列&#xff08;组合&#xff0c;联合&#xff09;索引 小结索引的设计原则数据准…

Centos7 搭建单机elasticsearch

以下是在 CentOS 7 上安装 Elasticsearch 7.17.7 的完整步骤&#xff1a;&#xff08;数据默认保存在/var/lib/elasticsearch下&#xff0c;自行更改&#xff09; 一、装 Java 环境 Elasticsearch 是用 Java 编写的&#xff0c;所以需要先安装 Java 运行环境。 检查系统中是…

gbase8s之建表相关问题

第一章..绪论 1.1..背景 需要对明年所有系统的表新建。 1.2..要求 对导切建表可能遇到的一些问题罗列及解决办法。 第二章..新建表的的过程 1.1..获取DDL 获取DDL一定要在服务器上去获取&#xff0c;千万别用gds去导出ddl。 1.1.1..切换数据库用户 su – gbasedbt 1.1…

一键录制电脑画面全攻略!免费的电脑录屏秘籍

屏幕录制&#xff0c;这是个看起来挺简单&#xff0c;实际上作用可大了的工具。它能帮咱们把电脑屏幕上的每个动作都给抓住&#xff0c;不管是弄教程&#xff0c;还是记会议&#xff0c;又或者是分享游戏里的精彩时刻。不过&#xff0c;一键录制真有它听上去那么容易吗&#xf…

1.Label Studio 介绍

Label Studio 介绍 文章目录 Label Studio 介绍前言一、安装介绍二、Run with Docker Compose1、WSL2安装2、Docker Desktop安装3、Label Studio安装&#xff08;第二种方法 Run with Docker Compose &#xff09; 三、Install for local development1.下载源码2.安装poetry3.安…