欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang实现页面静态化操作的示例代码

程序员文章站 2022-07-04 17:04:10
什么是页面静态化:简单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的go方法,最后生成我们想要看到的数据。这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如 果有太...

什么是页面静态化:

简单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的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 href="#" 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}}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。