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

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

mkdir HTML渲染

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

mkdir demo01 demo02 demo03 demo04

目录

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

一、简单渲染

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

│  main.go
└─templates
        index.html

main.go:

package main

import (
	"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
    └─users
            index.html

main.go:

package main

import (
	"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 main

import (
	"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.html
	router.GET("/file1", func(c *gin.Context) {
		c.HTML(http.StatusOK, "file1.html", nil)
	})

	// 定义路由以访问 file2.html
	router.GET("/file2", func(c *gin.Context) {
		c.HTML(http.StatusOK, "file2.html", nil)
	})

	// 启动 Gin 服务器,监听在 0.0.0.0:8080
	router.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 main

import (
	"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}]}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 “源鲁杯“ Round[1] web部分

Disal 打开页面没有有用信息&#xff0c;查看robots.txt发现f1ag.php&#xff0c;访问查看源代码&#xff1a; &#xfeff;<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[…

【2024最新版】网络安全学习路线-适合入门小白

首先说明&#xff0c;我是一名CTF的web手&#xff0c;这是我自己亲身学习网络安全的路线&#xff0c;希望能够帮到大家&#xff0c;我虽然不是大牛&#xff0c;但我也希望能够帮助一些网安小白找到自己学习的方向&#xff0c;后面有就业的详细安全技术要求&#xff0c;如果真想…

NSSCTF-WEB-easy_eval

目录 前言 正文 思路 序列化构造 后渗透 思路点1:Redis 思路2:蚁剑插件绕过disable_functinons 结尾 作者的其他文章 前言 说是easy,实际很difficult 正文 思路 <?php class A{public $code "";function __call($method,$args){//最后执行命令eval($th…

(AtCoder Beginner Contest 375)A - Seats

&#xff08;AtCoder Beginner Contest 375&#xff09;A - Seats 题目大意 给定一个长度为 N N N的字符串 S S S S S S 只包含"#“和”." 求 "#.#"子串 的出现次数 思路 签到题 O ( N ) O(N) O(N) 模拟即可 代码 #include<iostream> #includ…

ssm配置模式

新版 用Java类&#xff0c;全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

SpringCloudAlibaba升级手册

目录 1. 版本对照 版本现状 SpringCloud与AlibabaCloud对应版本 Springboot与Elasticsearch版本对应 2. openfeign问题 问题 解决方案 3. Feign请求问题 问题 解决方法 4. Sentinel循环依赖 问题 解决方案 5. bootstrap配置文件不生效 问题 解决方案 6. Nacos的…

工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单(2017-2022年)

我国工信部积极推动制造业的绿色转型&#xff0c;为了表彰在绿色制造领域取得显著成绩的企业和园区&#xff0c;发布了包括绿色工厂、绿色设计产品、绿色供应链企业、绿色园区在内的一系列公示名单。 2017年-2022年工信部绿色工厂、绿色设计产品、绿色供应链企业、绿色园区名单…

脉冲扩散模型

论文 Spiking Diffusion Models 主要内容是提出了“脉冲扩散模型&#xff08;Spiking Diffusion Models, SDMs&#xff09;”&#xff0c;一种基于脉冲神经网络&#xff08;SNN&#xff09;的生成模型&#xff0c;旨在解决传统人工神经网络&#xff08;ANN&#xff09;在图像生…

5G NR:UE初始接入信令流程浅介

UE初始接入信令流程 流程说明 用户设备&#xff08;UE&#xff09;向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU。IN…

2012年国赛高教杯数学建模C题脑卒中发病环境因素分析及干预解题全过程文档及程序

2012年国赛高教杯数学建模 C题 脑卒中发病环境因素分析及干预 脑卒中&#xff08;俗称脑中风&#xff09;是目前威胁人类生命的严重疾病之一&#xff0c;它的发生是一个漫长的过程&#xff0c;一旦得病就很难逆转。这种疾病的诱发已经被证实与环境因素&#xff0c;包括气温和湿…

怎么开发一款app软件

我们公司想要做一个app软件&#xff0c;老板就让我多了解几家&#xff0c;我就总计一下相关的市场行业。 8月份我一共了解了6家的软件开发公司&#xff0c;也见识了什么叫软件开发公司&#xff0c;6套下来我也挑花了眼&#xff0c;老板也就更不用说了。老板只差让我做选择了…

Linux操作系统切换设置系统语言

随着工作环境中变化&#xff0c;我们在使用电脑时&#xff0c;可能要使用不同的系统语言环境&#xff0c;那计算机如何切换成我们需要的系统语言呢&#xff0c;针对Linux操作系统&#xff0c;这里有两种方法。一是通过桌面图形化界面切换&#xff0c;这种方法操作起来直观、但是…

R语言复杂抽样调查数据统计描述和分析

gtsummary包中tbl_svysummary提供了统计描述&#xff1b;tableone包中的svyCreateTableOne提供了统计比较&#xff1b;原始描述和比较可以是有table1包。 #测试数据 library(survey) setwd("F://") data(Titanic) sur_des<-survey::svydesign(~1, data as.data.…

mongoDB基础知识

文章目录 为什么使用mongoDB&#xff1f;数据模型 想了解什么mongoDB首先我们得先知道什么事“三高”&#xff1f;三高什么呐&#xff1f;具体的应用场景&#xff1f;在这些应用场景中&#xff0c;数据操作方面共同特点是&#xff1a; 什么时候选择mongoDB&#xff1f;mySQL和m…

React基础知识(一) - React初体验

React是在2013年&#xff0c; 由Faceboo开源的&#xff0c;用于构建用户界面的 JavaScript 库。总所周知啊,React是前端三大框架之一啊现在前端领域最为流行的是三大框架&#xff1a; ReactVueAngular 前端三大框架 React开发的特点&#xff1a; &#xff08;1&#xff09;声明…

编程考古-计算机发展(上)

计算机/器现在是我们日常生活中的重要工具&#xff0c;它的发展历程见证了人类数学计算能力的不断提升。 什么是计算 计算的本质在于基于规则对符号串进行变换。简言之&#xff0c;从一个初始的符号串&#xff08;输入&#xff09;出发&#xff0c;依据既定的法则逐步改变这个…

NewStarCTF2024-Week2-Misc-WP

目录 1、wireshark_checkin 2、wireshark_secret 3、字里行间的秘密 4、你也玩原神吗 5、Hertas Study 6、用溯流仪见证伏特台风 7、热心助人的小明 1、wireshark_checkin 直接字符串搜 flag flag{ez_traffic_analyze_isnt_it} 2、wireshark_secret 查看原始数据 导出十…

STM32应用详解(2)GPIO之LED闪烁——学习使用寄存器操作方法编写延时函数

文章目录 前言一、笔记1.GPIO控制LED闪烁的两种方法&#xff1a;2.系统时钟3.延时函数的实现(us) 二、代码1.main函数2.延时函数3.固件库函数4.毫秒和秒延时函数5.整体函数结构 前言 学习使用寄存器操作方法编写延时函数。 一、笔记 1.GPIO控制LED闪烁的两种方法&#xff1a;…

C语言小游戏--猜数字

游戏过程&#xff1a; 由电脑随机在某个范围内生成一个数字&#xff0c;玩家猜数字并且输入&#xff0c;电脑判断是否正确&#xff0c;正确则游戏结束&#xff0c;错误则给出提示&#xff0c;直到玩家所给的答案正确为止 思路分析&#xff1a; 1.生成随机数 2.玩家可以多次…

springboot037基于SpringBoot的墙绘产品展示交易平台的设计与实现(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;墙绘产品展示交易平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示…