您的位置:首页 > 理论基础 > 计算机网络

golang http 编程-2(模版渲染)

2017-08-12 18:48 127 查看

初识 template

template.ParseFiles(file)
进行解析文件

t.Execute(io.Writer, interface{})
把数据渲染到html里面

调用数据渲染
{{ }}


{{ . }}
里面的
.
代表你传入的数据(结构体,map)进行渲染

{{ .Name }}
是 取传入的数据中的Name的数值

传入的数据类型中的元素必须大写开头,否则访问不到该元素

main.go

package main

import (
"fmt"
"os"
"text/template"
)

type Persion struct {
Name string
Age  int
}

func main() {

file := "h:/360_update/oldboy_go/src/go_dev/day10/exercises/http_template/index.html"

t, err := template.ParseFiles(file)

if err != nil {
fmt.Println("parse file err:", err)
return
}
p := Persion{
Name: "Conny",
Age:  18,
}
if err := t.Execute(os.Stdout, p); err != nil {
fmt.Println("There was an error:", err.Error())
}
}


index.html

<html>
<body>
<p>hello {{ .Name }}</p>
<p>Age: {{ .Age }}</p>
<p>{{ . }}</p>
</body>
</html>


编译并运行:

$ go build go_dev/day10/exercises/http_template
$ .\http_template.exe
<html>
<body>
<p>hello Conny</p>
<p>Age: 18</p>
<p>{Conny 18}</p>
</body>
</html>


http template 渲染

渲染-1(结构体 struct渲染)

package main

import (
"fmt"
"net/http"
"text/template"
)

type Persion struct {
Name  string
Age   int
Title string
}

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {
fmt.Println("user info...")
fmt.Fprintln(writer, "<h1>User info</h1>")

user := Persion{
Name:  "Conny",
Age:   18,
Title: "Conny web server",
}

// 利用结构体渲染
myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}

return
}

func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)

err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}

}


index.html

<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
<p>hello {{ .Name }}</p>
<p>Age: {{ .Age }}</p>
<p>Age: {{ . }}</p>
</body>
</html>


编译并运行

$ go build go_dev/day10/exercises/6-http-template
$ ./6-http-template


使用http client访问(使用浏览器访问更直观)

$ ./2-http-client
data: <h1>User info</h1>
<html>
<head>
<title>Conny web server</title>
</head>
<body>
<p>hello Conny</p>
<p>Age: 18</p>
<p>Age: {Conny 18 Conny web server}</p>
</body>
</html>


template 渲染 if判断

使用方法:

{{ if gt .Age 20 }}
<p> hello, old main {{ .Name }}</p>
{{ else }}
<p> hello, yong main {{ .Name }}</p>
{{ end }}


if
对比操作符

not 非
{{if not .condition}} {{end}}


and 与
{{if and .condition1 .condition2}} {{end}}


or 或
{{if or .condition1 .condition2}} {{end}}


eq 等于
{{if eq .var1 .var2}} {{end}}


ne 不等于
{{if ne .var1 .var2}} {{end}}


lt 小于(less than)
{{if lt .var1 .var2}} {{end}}


le 小于等于
{{if le .var1 .var2}}  {{end}}


gt 大于
{{if gt .var1 .var2}}  {{end}}


ge 大于等于
{{if ge .var1 .var2}}  {{end}}


index.html

<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
<p>hello {{ .Name }}</p>

{{ if gt .Age 20 }}
<p> hello, old man {{ .Name }}</p>
{{ else }}
<p> hello, yong man {{ .Name }}</p>
{{ end }}

</body>
</html>


http 渲染-2 (map渲染)

with
是在with代码块中 传入的元素变成
.
来操作

range
循环数组

package main

import (
"fmt"
"net/http"
"text/template"
)

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {
fmt.Println("user info...")

// 初始化一个map
user := make(map[string]interface{})
user["name"] = "Conny"
user["age"] = 18
user["title"] = "个人网站"

// 渲染到html中
myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}
return
}

func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)

err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}

}


index.html

<html>
<head>
<title>{{ .title }}</title>

</head>
<body>

<p>hello {{ .name }}</p>

{{ if gt .age 20 }}
<p> hello, old man {{ .name }}</p>
{{ else }}
<p> hello, yong man {{ .name }}</p>
{{ end }}

<p>{{ . }}</p>

</body>
</html>


编译运行

$ go build go_dev/day10/exercises/6-http-template
$  .\6-http-template.exe


模板渲染 range with

package main

import (
"fmt"
"net/http"
"text/template"
)

type Persion struct {
Name     string
Age      int
Describe string
}

var myTemplate *template.Template

func userInfo(writer http.ResponseWriter, request *http.Request) {

fmt.Println("user info...")
user := make(map[string]interface{})
user["name"] = "Conny"
user["age"] = 18
user["title"] = "个人网站"

friendA := Persion{Name: "friendA", Age: 18, Describe: "friendA web"}
friendB := Persion{Name: "friendB", Age: 18, Describe: "friendB web"}
friendC := Persion{Name: "friendC", Age: 18, Describe: "friendC web"}
var friend []Persion

// 定义friend切片 append 所有的结构体到切片中
friend = append(friend, friendA, friendB, friendC)

// 设置user 的friend key 为friend的切片
user["friend"] = friend

myTemplate.Execute(writer, user)

}

func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}

return
}

func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)

err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}

}


index.html

<html>
<head>
<title>{{ .title }}</title>

</head>
<body>

<p>hello {{ .name }}</p>

{{ if gt .age 20 }}
<p> hello, old main {{ .name }}</p>
{{ else }}
<p> hello, yong man {{ .name }}</p>
{{ end }}

<p> {{ .name }} 的朋友们:</p>

{{ with .friend}}
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>描述</td>
</tr>

{{ range . }}

<tr>
<td>{{ .Name }}</td>
<td>{{ .Age }}</td>
<td>{{ .Describe }}</td>
</tr>
{{ end }}
</table>
{{ end }}

<p>{{ . }}</p>

</body>
</html>


编译并运行

$ go build go_dev/day10/exercises/6-http-template
$  .\6-http-template.exe


浏览器访问结果:



详解:
with
range
他们两个是相辅相成使用

摘抄一段渲染代码

{{ with .friend}}
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>描述</td>
</tr>

{{ range . }}

<tr>
<td>{{ .Name }}</td>
<td>{{ .Age }}</td>
<td>{{ .Describe }}</td>
</tr>
{{ end }}
</table>
{{ end }}


代码中
with .friend
.friend
这个数组变成
.
供后面的
range
使用,
range .
每一次循环一个结构体
friend
出来进行渲染。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  html 编程