Web Dinamis menggunakan Template
Pada postingan sebelumnya kita telah membahas web dinamis tetapi dengan menggunakan respon string yang terdapat pada statik file. Maka pada kesempatan kali ini kita akan mencoba mengenal templating pada golang dimana halaman katakanlah html tersebut akan dinamis dan bisa berubah-ubah dengan data yang diakses oleh user.
Golang memiliki fitur HTML template yang mana fitur tersebut bisa kita gunakan untuk membuat HTML yang dinamis. Fitur ini terdapat pada package html/template
. Sebelum kita menggunakan HTML template, kita perlu membuat template-nya terlebih dahulu lalu nanti akan kita kirimkan variabel, string ataupun file sehingga ada bagian dinamis pada HTML Template yang mana pada golang akan menggunakan tanda {{ }}
.
Membuat HTML Template
Saat kita membuat template dengan string, kita perlu memberi tahu nama template-nya dengan menggunakan text template yang mana konten tersebut yang akan kita jadikan dinamis dengan menggunakan tanda {{.}}
. Misalkan seperti ini.
<html>
<body>{{.}}</body>
</html>
Agar lebih paham lagi kita coba langsung saja membuat HTML Template string seperti dibawah ini.
func SimpleHTMLTemplateHandler(w http.ResponseWriter, r *http.Request) {
templateText := `<html><body>{{.}}</body></html>`
t, err := template.New("SIMPLE").Parse(templateText)
if err != nil {
panic(err)
}
t.ExecuteTemplate(w, "SIMPLE", "Hello HTML Template")
}
Setelah itu kita daftarkan fungsi handler kita ke dalam handler mux
yang sudah kita pelajari sebelumnya seperti dibawah ini.
...
mux.HandleFunc("/template", SimpleHTMLTemplateHandler)
...
Lalu kita jalankan dan akses localhost:8080/template
maka akan keluar halaman website dengan menampilkan kata Hello HTML Template
. Berarti halaman template kita sudah benar dan bisa diakses pada browser.
Membuat HTML Template Dari File
Selain membuat template menggunakan string seperti yang sebelumnya sudah dibuat, kita juga bisa membuat langsung dari file. Hal ini memudahkan kita untuk langsung membuat file HTML dan ketika kita menggunakan file secara otomatis nama file tersebut menjadi nama template-nya. Misalkan kita punya file simple.html
maka nama template-nya itu adalah sample.html
.
Kita coba langsung untuk membuat HTML Template ini dari file dengan membuat file simple.html
pada project dan pada folder templates
ini lalu isi seperti dibawah ini.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ . }}</title>
</head>
<body>
<h1>{{ . }}</h1>
</body>
</html>
Selanjutnya, kita buat baru handler lagi untuk menambahkan endpoint yang mana bisa membaca file HTML Template seperti dibawah ini.
func SimpleHTMLFileTemplateHandler(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFiles("./templates/simple.html")
if err != nil {
panic(err)
}
t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML File Template")
}
Setelah dibuat handler-nya jangan lupa tambahkan atau inisialisasi juga pada main handleFunc
agar bisa diakses oleh browser URL-nya.
...
mux.HandleFunc("/template-file", SimpleHTMLFileTemplateHandler)
...
Jalankan kembali dan lihat hasilnya, kita sudah bisa membuat HTML Template menggunakan File template dengan mengirimkan variabel ke dalam html tersebut sehingga nanti bisa kita buat dinamis variabel tersebut.
Template Directory
Biasanya kita jarang sekali menyebutkan file template satu persatu maka baiknya untuk template ini kita simpan dalam satu direktori. Golang template tersebut sudah mendukung proses load template
dari direktori sehingga memudahkan kita agar tidak perlu menyebutkan satu persatu nama file-nya.
func TemplateDirectoryHanlder(w http.ResponseWriter, r *http.Request) {
t := template.Must(template.ParseGlob("./templates/*.html"))
t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML Directory File Template")
}
Sejak Golang 1.16 sudah mendukung Golang Embed sehingga direkomendasikan Golang Embed untuk menyimpan data template. Dengan menggunakan Golang Embed kita tidak perlu lagi ikut meng-copy template file lagi karena sudah otomatis di embed di dalam distribution
file-nya.
// go:embed templates/*.html
var templates embed.FS
func TemplateEmbedHandler(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFS(templates, "templates/*.html")
if err != nil {
panic(err)
}
t.ExecuteTemplate(w, "simple.html", "Hello Santekno, HTML Embed Template")
}
Lalu jangan lupa tambahkan juga pada handler mux
untuk tambahan template handler yang sudah kita buat tersebut seperti ini.
...
mux.HandleFunc("/template-directory", TemplateDirectoryHanlder)
mux.HandleFunc("/template-embed", TemplateEmbedHandler)
...