Gin(三):模板tmpl

本篇博客介绍了如何在Gin框架中添加和使用模板,包括创建tmpl文件夹和模板文件,通过LoadHTMLGlob加载模板,修改路由以渲染模板页面。此外,还讲述了如何添加静态资源如Bootstrap,引入jQuery和Popper,并设置网站图标,通过SetHTMLTemplate确保在单元测试中正确加载模板。最后,总结了使用Gin处理静态资源和定义网站图标的方法。

前面的学习已经对 Gin 有了一个初步的认识和了解,对 router 的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的 html 页面吧。

?添加模板

我们仍旧是在上一章节的项目中进行修改。

首先新建一个 templates 文件夹,用于存放我们的模板文件,在文件夹中新建立 index.tmpl。并且编写我们的模板。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Gin Hello</title>
</head>
<body>
<main>{
  
  { .title }}</main>
</body>
</html>

小提示 GoLand 现在还未对 tmpl 有高亮显示语法,我们可以将 .tmpl 后缀文件添加到 go Template 模板。方法如下:File-settings-Editor-File Types。(或者我们直接使用 *.gohtml 做为模板也是可以的)如图:

添加模板

我们可以通过 LoadHTMLGlobLoadHTMLFiles 两个方法来对我们的模板进行加载。其中 LoadHTMLGlob 方法可以将一个目录下所有的模板进行加载,而LoadHTMLFiles只会加载一个文件,他的参数为可变长参数,需要我们一个一个的手动将模板文件填写。这里我们使用 LoadHTMLGlob 方法。

router.LoadHTMLGlob("templates/*")

此时我们需要修改我们的 / 路由了,不再是让它返回一个字符串,而是返回我们的页面模板。

handler 中新建立一个 indexHandler.go ,用来处理我们的 / 路由。

func Index(context *gin.Context) {
   
   
	context.HTML(http.StatusOK, "index.tmpl", gin.H{
   
   
		"title": "hello gin " + strings.ToLower(context.Request.Method) + " method",
	})
}

此时在访问我们的页面,仍旧是 hello gin get method,但是这和我们之前返回的字符串是不同的。

打开 浏览器-Network 就可以看到这两个页面的不同,一个是 text 一个是 html

写完具体功能,我们需要改造一下我们的单元测试,针对新的接口逻辑原有的单元测试已经行不通了。

重新修改单元测试。

func TestIndexHtml
<think> 我们正在讨论Gogin框架中模板的使用方法。根据引用内容,我们可以总结出以下关键步骤和注意事项: 1. **模板文件组织**:默认情况下,模板文件应放在项目目录的`templates`文件夹中。gin框架支持按照目录结构组织模板(引用[3])。 2. **模板语法**:在模板文件中使用`{{ .变量名 }}`来输出变量值,变量值由后端通过`gin.H`或结构体传入(引用[4])。 3. **模板加载**: - 使用`gin.Default()`创建默认的路由引擎。 - 调用`LoadHTMLGlob`方法加载模板,参数为模板文件的路径模式(引用[2]中`r.LoadHTMLGlob("/Users/.../templates/**/*")`)。也可以使用`LoadHTMLFiles`加载单个文件。 4. **静态文件服务**:使用`Static`方法设置静态文件目录(引用[2]中`r.Static("/xxx", ".../statics")`)。 5. **渲染模板**: - 在路由处理函数中,使用`c.HTML`方法渲染模板,参数为HTTP状态码、模板文件名(相对于`templates`目录的路径)和传入模板的数据(引用[2])。 ### 示例代码解析 引用[2]的main.go示例展示了: - 加载静态文件:`r.Static`将URL路径`/xxx`映射到本地的静态文件目录。 - 加载模板:`r.LoadHTMLGlob`使用通配符加载`templates`目录下所有子目录的模板文件。 - 定义路由:两个GET路由,分别渲染不同的模板,并传入不同的数据(通过`gin.H`)。 ### 模板文件示例 引用[1]和引用[4]分别展示了模板文件的内容: - 在模板中,使用`{{.}}`表示传入的整个数据对象(引用[1]),而`{{.变量名}}`表示传入数据对象的字段(引用[4])。 ### 步骤总结 1. 创建模板文件,放置在`templates`目录下(可含子目录)。 2. 在Go代码中: - 初始化gin引擎。 - 设置静态文件服务(如果需要)。 - 使用`LoadHTMLGlob`或`LoadHTMLFiles`加载模板。 - 定义路由,在路由处理函数中使用`c.HTML`渲染模板并传入数据。 ### 注意事项 - 模板文件名在渲染时需指定相对于`templates`目录的路径(包括子目录)。例如,模板文件`templates/users/index.tmpl`在渲染时使用`"users/index.tmpl"`。 - 传入模板的数据可以是`gin.H`(即`map[string]interface{}`)或结构体,结构体字段需大写(可导出)。 §§相关问题§§ 1. 如何在gin框架中嵌套模板(布局)? 2. gin框架模板支持自定义函数吗?如何实现? 3. 如何处理gin模板中的循环和条件判断? </think> ### Go Gin框架模板使用指南 以下是Gin框架中模板使用的核心步骤和要点: #### 1. **模板文件组织** - 模板文件必须放在`templates`目录下(默认约定),支持子目录结构: ```text templates/ ├── users/ │ └── index.tmpl ├── posts/ │ └── index.tmpl └── layouts/ └── default.html ``` 目录结构直接影响模板加载路径[^3]。 #### 2. **模板语法基础** - 变量渲染:`{{ .变量名 }}` ```html <h1>Welcome {{ .username }}</h1> <!-- 传入 gin.H{"username": "John"} --> ``` - 完整对象渲染:`{{ . }}` ```html <title>{{ .title }}</title> <!-- 引用[4]示例 --> ``` #### 3. **核心代码实现** ```go package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() // 加载模板(支持通配符) r.LoadHTMLGlob("templates/**/*") // 加载所有子目录模板[^2] // 设置静态文件目录 r.Static("/static", "./statics") // 访问URL: /static/css/style.css → 文件 ./statics/css/style.css // 路由定义 r.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "index.tmpl", gin.H{ "title": "首页", // 模板中通过 {{ .title }} 访问 "data": map[string]interface{}{"key": "value"}, }) }) r.Run(":8080") } ``` #### 4. **关键方法说明** | 方法 | 作用 | 示例 | |------|------|------| | `LoadHTMLGlob()` | 批量加载模板 | `r.LoadHTMLGlob("templates/*.html")` | | `LoadHTMLFiles()` | 加载单个模板 | `r.LoadHTMLFiles("templates/user.html")` | | `c.HTML()` | 渲染模板 | `c.HTML(200, "template_name", data)` | | `Static()` | 注册静态目录 | `r.Static("/assets", "./static_files")` | #### 5. **高级用法** - **布局模板**:通过`{{ define }}`和`{{ template }}`实现复用 ```html <!-- templates/layouts/base.html --> <body> {{ template "content" . }} </body> <!-- templates/index.html --> {{ define "content" }} <h1>{{ .title }}</h1> {{ end }} ``` - **自定义模板函数**: ```go r.SetFuncMap(template.FuncMap{ "formatDate": func(t time.Time) string { return t.Format("2006-01-02") } }) ``` 模板中使用:`<p>{{ .createTime | formatDate }}</p>` #### 6. **常见问题解决方案** - **模板找不到**: - 检查路径:`LoadHTMLGlob("templates/**/*")`中的路径需绝对路径或正确相对路径 - 确认后缀:`.tmpl`/`.html`需与加载时一致 - **变量不渲染**: - 检查字段名匹配:`gin.H{"name": "Go"}` → 模板中用`{{ .name }}` - 确保字段可导出(结构体字段首字母大写) [^1]: 模板基础语法示例 [^2]: 核心路由和模板加载实现 [^3]: 模板目录结构规范 [^4]: 模板变量渲染语法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值