Go语言动手写Web框架Gee教程:第六天实现模板渲染功能
本文是《7天用Go从零实现Web框架Gee》系列教程的第六篇,将详细介绍如何为Gee框架添加HTML模板渲染和静态文件服务功能。
为什么需要服务端渲染
在现代Web开发中,前后端分离架构非常流行,后端提供API接口,前端负责数据渲染。这种架构有很多优势:
- 前后端职责分离,开发效率更高
- 一套API可同时服务Web、移动端等多种客户端
- 前端工程化体系完善,开发体验好
但纯前端渲染也存在一些问题,最主要的是对SEO不友好。虽然Google等搜索引擎已经能解析JavaScript渲染的页面,但服务端直接返回HTML仍然是更好的SEO方案。
静态文件服务实现
要实现服务端渲染,首先需要支持静态文件服务(如CSS、JS等)。Gee框架利用之前实现的路由通配符功能来匹配静态文件路径。
核心实现思路
- 使用
*filepath
通配符匹配静态文件路径 - 将请求路径映射到服务器实际文件路径
- 使用
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框架在此基础上进行了封装。
核心功能设计
- 支持加载多个模板文件
- 支持自定义模板函数
- 提供简单的渲染接口
// 设置自定义模板函数
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框架的模板渲染还支持更复杂的功能:
- 列表渲染:在模板中遍历数组或切片
- 条件渲染:根据条件显示不同内容
- 自定义函数:在模板中使用自定义函数处理数据
例如,可以在模板中使用自定义日期格式化函数:
// 定义格式化函数
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框架的模板渲染功能,主要包含:
- 静态文件服务实现
- HTML模板加载和渲染
- 自定义模板函数支持
- 完整的示例演示
这些功能使得Gee框架能够支持传统的服务端渲染场景,为开发者提供了更多选择。模板渲染功能配合之前实现的路由、中间件等功能,已经可以满足大多数Web开发需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考