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出来进行渲染。
相关文章推荐
- golang编程入门之http请求天气实例
- golang http 编程-1(服务器编程)
- Java网络编程(21):HTTP消息的格式
- socket编程---实现get post 向http发送请求
- Java中基于HTTP协议网络编程
- HTTP协议的C语言编程实现实例
- Android 网络编程(三)HttpURLConnection
- JAVA编程技巧之如何实现HTTP的断点续传
- [转:IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
- GLSL(6)分别使用可编程渲染管线编程和固定渲染管线编程来画点(理解VAO&VBO)
- CodeSmith实用技巧(十):通过编程执行模版
- docker(9):使用alpinelinux 构建 golang http 启动了,才15mb
- 网络编程——第二篇 HTTP应用编程(上)
- Android网络编程之Http通信
- Android 网络编程 Socket Http
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- Golang开发支持平滑升级(优雅重启)的HTTP服务
- golang辟谣之模板编程
- golang实现http静态资源服务器
- http编程中的get和post混合使用方式