原生http引入模板
结构目录如下:(在根目录下新建statics和templates目录,分别用于放静态文件(CSS和JS)和网页)
1.1 定义一个模板(默认后缀为tmpl,也可以是html):hello.tmpl, 放在templates文件夹下
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<p>Hello {{.}}</p>
</body>
</html>
1.2 使用GO语言原生包 http 调用并渲染
package main
import (
"fmt"
"html/template"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
// 解析模板
t, err := template.ParseFiles("./template/hello.tmpl")
if err != nil {
fmt.Println("template.ParseFiles is error: ", err)
return
}
// 渲染模板
err = t.Execute(w, "golang")
if err != nil {
fmt.Println("t.Execute is error: ", err)
return
}
}
func main() {
// http://127.0.0.1:8080/
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("HTTP server is stop. err: ", err)
return
}
}
使用gin来调用和渲染模板
2.1从网上下载一个前段页面,之后将所有静态文件复制到statics目录下,将html文件复制到templates目录下
2.2 使用gin来调用
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 在HTML文件中,修改所有css、js和img资源引用, 加上一个前缀/ydd/, 用于重定向:
// 加载静态文件(/ydd/css/index_style.css -> /statics/css/index_style.css)
r.Static("/ydd", "./statics")
// 解析template目录下所有文件(templates/**/*:表示templates目录下目录的所有文件)
r.LoadHTMLGlob("templates/*")
// http://127.0.0.1:8080/index
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
r.Run(":8080")
}
template 模板语法扩展
1.1 在HTML中,strut 和 map,都是通过 . 来访问关键字(还有很多,参考:https://www.liwenzhou.com/posts/Go/go_template/)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<h2>struct</h2>
<p>Hello {{.s.Name}}</p>
<p>Hello {{.s.Age}}</p>
<h2>map</h2>
<p>Hello {{.m.name}}</p>
<p>Hello {{.m.age}}</p>
</body>
</html>
2.0 传递多个数据
package main
import (
"fmt"
"html/template"
"net/http"
)
type User struct {
Name string
Age int
}
func printInfo(w http.ResponseWriter, r *http.Request) {
// 解析模板
t, err := template.ParseFiles("./template/hello.tmpl")
if err != nil {
fmt.Println("template.ParseFiles is error: ", err)
return
}
// struct
s := User{
Name: "张三",
Age: 15,
}
// map
m := map[string]interface{}{
"name": "李四",
"age": 16,
}
// 组合数据
data := map[string]interface{}{
"s": s,
"m": m,
}
// 渲染模板
err = t.Execute(w, data)
if err != nil {
fmt.Println("t.Execute is error: ", err)
return
}
}
func main() {
// http://127.0.0.1:8080/
http.HandleFunc("/", printInfo)
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("HTTP server is stop. err: ", err)
return
}
}