golang实现页面静态化操作的示例代码
- 作者: 抵扺
- 来源: 51数据库
- 2021-08-03
什么是页面静态化:
简单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的go方法,最后生成我们想要看到的数据。这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如 果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了。那么如何去避免呢?如果我们把请求后的结果保存成一个 html 文件,然后每次用户都去访问 ,这样应用服务器的压力不就减少了?
那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里就牵涉到我们要讲解的内容了,静态页面生成方案… 我们需要的是自动的生成静态页面,当用户访问 ,会自动生成html文件 ,然后显示给用户。
为了路由方便我用的gin框架但是不管用在什么框架上面都是一样的
项目目录:
project
-tem
--index.html
-main.go
main.go文件代码:
package main
import (
"fmt"
"net/http"
"os"
"path/filepath"
"text/template"
"github.com/gin-gonic/gin"
)
type product struct {
id int64 `json:"id"` //字段一定要大写不然各种问题
name string `json:"name"`
}
//模拟从数据库查询过来的消息
var allproduct []*product = []*product{
{1, "苹果手机"},
{2, "苹果电脑"},
{3, "苹果耳机"},
}
var (
//生成的html保存目录
htmloutpath = "./tem"
//静态文件模版目录
templatepath = "./tem"
)
func main() {
r := gin.default()
r.loadhtmlglob("tem/*")
r.get("/index", func(c *gin.context) {
getgeneratehtml()
c.html(http.statusok, "index.html", gin.h{"allproduct": allproduct})
})
r.get("/index2", func(c *gin.context) {
c.html(http.statusok, "htmlindex.html", gin.h{})
})
r.run()
}
//生成静态文件的方法
func getgeneratehtml() {
//1.获取模版
contensttmp, err := template.parsefiles(filepath.join(templatepath, "index.html"))
if err != nil {
fmt.println("获取模版文件失败")
}
//2.获取html生成路径
filename := filepath.join(htmloutpath, "htmlindex.html")
//4.生成静态文件
generatestatichtml(contensttmp, filename, gin.h{"allproduct": allproduct})
}
//生成静态文件
func generatestatichtml(template *template.template, filename string, product map[string]interface{}) {
//1.判断静态文件是否存在
if exist(filename) {
err := os.remove(filename)
if err != nil {
fmt.println("移除文件失败")
}
}
//2.生成静态文件
file, err := os.openfile(filename, os.o_create|os.o_wronly, os.modeperm)
if err != nil {
fmt.println("打开文件失败")
}
defer file.close()
template.execute(file, &product)
}
//判断文件是否存在
func exist(filename string) bool {
_, err := os.stat(filename)
return err == nil || os.isexist(err)
}
tem/index.html文件代码:
{{define "index.html"}}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>商品列表页</title>
</head>
<tbody>
<div><a rel="external nofollow" >商品列表页</a></div>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>商品名称</th>
</tr>
</thead>
<tbody>
{{range .allproduct}}
<tr>
<td>{{.id}}</td>
<td>{{.name}}</td>
</tr>
{{end}}
</tbody>
</table>
</html>
{{end}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
