iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
1

昨天我們介紹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
}

如果我們訪問網址,可以得到下面的畫面:
message page
這個範例中我們不會將輸入的資料返回給畫面,而是回傳布林值在畫面做出不同的反應,為了確認資料確實有接收到,我們使用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!

Reference


上一篇
Post 表單
下一篇
Struct 結構
系列文
啥物碗Golang? 30天就Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言