昨天我們介紹golang中post表單的最基礎範例,今天我們看一下稍微進階一點的範例,建立一個留言表單。首先我們看一下前端的部分:
{{if .Success}}
<h1>Thanks for your message!</h1>
{{else}}
<h1>Contact</h1>
<form method="POST">
<label>Email:</label><br />
<input type="text" name="email"><br />
<label>Subject:</label><br />
<input type="text" name="subject"><br />
<label>Message:</label><br />
<textarea name="message"></textarea><br />
<input type="submit">
</form>
{{end}}
雖然昨天有介紹過go專用的網頁版型gtpl
,不過一般的html
只要用{{ }}
,裡面也可以一樣引入go的變數。我們今天使用第九天曾經使用過的html/template
package來解析html版型,接下來看看go的部分:
package main
import (
"html/template"
"log"
"net/http"
)
type ContactDetails struct {
Email string
Subject string
Message string
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":3000", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(template.ParseFiles("./day15/form.html"))
if r.Method != http.MethodPost {
tmpl.Execute(w, nil)
return
}
details := ContactDetails{
Email: r.FormValue("email"),
Subject: r.FormValue("subject"),
Message: r.FormValue("message"),
}
// do something with details
_ = details
log.Println("Email:" + details.Email)
log.Println("Subject:" + details.Subject)
log.Println("Message:" + details.Message)
tmpl.Execute(w, struct{ Success bool }{true})
}
我們看看Main的第一行,透過template.Must
讀取經過template.ParseFiles
解析過的網頁內容,讓html可以與go的邏輯互動(html中{{if .Success}}
):
tmpl := template.Must(template.ParseFiles("./day15/form.html"))
為了方便處理資料,通常會根據商業邏輯關係做編組,就像一般MVC結構中的Model,會將不同類別的資料組合成struct
,我們看看下面的範例:
type ContactDetails struct {
Email string
Subject string
Message string
}
如果我們訪問網址,可以得到下面的畫面:
這個範例中我們不會將輸入的資料返回給畫面,而是回傳布林值在畫面做出不同的反應,為了確認資料確實有接收到,我們使用log在console中列印出來:
2018/10/21 00:42:21 Email:aaa@bbb.ccc
2018/10/21 00:42:21 Subject:topic
2018/10/21 00:42:21 Message:content
畫面上會得到Html中Success的結果:
Thanks for your message!