Go语言动手写Web框架Gee教程:第六天实现模板渲染功能

Go语言动手写Web框架Gee教程:第六天实现模板渲染功能

7days-golang 7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc framework GeeRPC etc) 7天用Go动手写/从零实现系列 7days-golang 项目地址: https://gitcode.com/gh_mirrors/7d/7days-golang

本文是《7天用Go从零实现Web框架Gee》系列教程的第六篇,将详细介绍如何为Gee框架添加HTML模板渲染和静态文件服务功能。

为什么需要服务端渲染

在现代Web开发中,前后端分离架构非常流行,后端提供API接口,前端负责数据渲染。这种架构有很多优势:

  1. 前后端职责分离,开发效率更高
  2. 一套API可同时服务Web、移动端等多种客户端
  3. 前端工程化体系完善,开发体验好

但纯前端渲染也存在一些问题,最主要的是对SEO不友好。虽然Google等搜索引擎已经能解析JavaScript渲染的页面,但服务端直接返回HTML仍然是更好的SEO方案。

静态文件服务实现

要实现服务端渲染,首先需要支持静态文件服务(如CSS、JS等)。Gee框架利用之前实现的路由通配符功能来匹配静态文件路径。

核心实现思路

  1. 使用*filepath通配符匹配静态文件路径
  2. 将请求路径映射到服务器实际文件路径
  3. 使用http.FileServer处理文件请求
func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc {
    absolutePath := path.Join(group.prefix, relativePath)
    fileServer := http.StripPrefix(absolutePath, http.FileServer(fs))
    return func(c *Context) {
        file := c.Param("filepath")
        if _, err := fs.Open(file); err != nil {
            c.Status(http.StatusNotFound)
            return
        }
        fileServer.ServeHTTP(c.Writer, c.Req)
    }
}

使用方法

开发者可以这样使用静态文件服务:

r := gee.New()
r.Static("/assets", "./static")

这会将./static目录下的文件映射到/assets路由下。

HTML模板渲染实现

Go标准库提供了强大的html/template包,Gee框架在此基础上进行了封装。

核心功能设计

  1. 支持加载多个模板文件
  2. 支持自定义模板函数
  3. 提供简单的渲染接口
// 设置自定义模板函数
func (engine *Engine) SetFuncMap(funcMap template.FuncMap) {
    engine.funcMap = funcMap
}

// 加载模板文件
func (engine *Engine) LoadHTMLGlob(pattern string) {
    engine.htmlTemplates = template.Must(
        template.New("").Funcs(engine.funcMap).ParseGlob(pattern))
}

上下文渲染方法

在Context中添加HTML渲染方法:

func (c *Context) HTML(code int, name string, data interface{}) {
    c.SetHeader("Content-Type", "text/html")
    c.Status(code)
    if err := c.engine.htmlTemplates.ExecuteTemplate(
        c.Writer, name, data); err != nil {
        c.Fail(500, err.Error())
    }
}

完整使用示例

下面是一个完整的模板渲染示例:

1. 定义模板文件

templates/css.tmpl:

<html>
    <link rel="stylesheet" href="/assets/css/geektutu.css">
    <p>geektutu.css is loaded</p>
</html>

2. 定义数据结构

type student struct {
    Name string
    Age  int8
}

3. 设置路由和模板

func main() {
    r := gee.New()
    r.Use(gee.Logger())
    r.SetFuncMap(template.FuncMap{
        "FormatAsDate": FormatAsDate, // 自定义模板函数
    })
    r.LoadHTMLGlob("templates/*")
    r.Static("/assets", "./static")

    // 路由定义
    r.GET("/", func(c *gee.Context) {
        c.HTML(http.StatusOK, "css.tmpl", nil)
    })
    
    r.Run(":9999")
}

模板功能进阶

Gee框架的模板渲染还支持更复杂的功能:

  1. 列表渲染:在模板中遍历数组或切片
  2. 条件渲染:根据条件显示不同内容
  3. 自定义函数:在模板中使用自定义函数处理数据

例如,可以在模板中使用自定义日期格式化函数:

// 定义格式化函数
func FormatAsDate(t time.Time) string {
    year, month, day := t.Date()
    return fmt.Sprintf("%d-%02d-%02d", year, month, day)
}

// 注册到模板引擎
r.SetFuncMap(template.FuncMap{
    "FormatAsDate": FormatAsDate,
})

然后在模板中调用:

<div>当前日期:{{ .now | FormatAsDate }}</div>

总结

通过本文我们实现了Gee框架的模板渲染功能,主要包含:

  1. 静态文件服务实现
  2. HTML模板加载和渲染
  3. 自定义模板函数支持
  4. 完整的示例演示

这些功能使得Gee框架能够支持传统的服务端渲染场景,为开发者提供了更多选择。模板渲染功能配合之前实现的路由、中间件等功能,已经可以满足大多数Web开发需求。

7days-golang 7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc framework GeeRPC etc) 7天用Go动手写/从零实现系列 7days-golang 项目地址: https://gitcode.com/gh_mirrors/7d/7days-golang

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侯宜伶Ernestine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值