動的なサイトとは、表示される内容が、実行時に決まるサイトです。
一方、静的なサイトとは、表示される内容が、あらかじめ決まっているサイトです。
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
// ハンドラーを登録
http.HandleFunc("/", handler)
// ターミナルに文字列を表示
fmt.Println("Enter control + c to exit")
// サーバーを起動
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `
<!DOCTYPE html>
<html lang="ja">
<body>
<h1>動的なサイト</h1>
<p>
あなたがこのページにアクセスした時刻は、%02d時%02d分です。</p>
</body>
</html>
`, time.Now().Hour(), time.Now().Minute())
}
動的なサイトで、go ファイルと HTML ファイルを分割して管理するには、テンプレート(html/template)を使います。
次のようなディレクトリ構成にします。
dynamicsite/
- main.go
- resources/
- - styles/
- - - style.css
- view/
- - index.html
ディレクトリ構成、ディレクトリ名、ファイル名は自由に決めて大丈夫です。
package main
import (
"html/template"
"net/http"
"time"
"log"
)
func main() {
// ターミナルに文字列を表示する
println("Go is running on port 8080 (ctrl-c to quit)")
// 静的ファイルのディレクトリを指定する
http.Handle("/resources/", http.StripPrefix("/resources/",http.FileServer(http.Dir("resources/"))))
// ハンドラーを登録する
http.HandleFunc("/", handler)
// 8080 ポートでサーバーを起動する
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
// テンプレートをパースする
t := template.Must(template.ParseFiles("view/index.html"))
// テンプレートを描画する
err := t.ExecuteTemplate(w, "index.html", time.Now())
if err != nil {
log.Fatal(err)
}
}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>動的なサイト</title>
<link rel="stylesheet" href="../resources/styles/style.css">
</head>
<body>
<h1>動的なサイト</h1>
<div align="center"><p>
あなたがこのページにアクセスした時刻は、{{.Hour}}時{{.Minute}}分です。
</p></div>
</body>
</html>
body {
color: gray;
}
h1 {
text-align: center;
font-family: sans-serif;
font-weight: 100;
margin-top: 60px;
}
ターミナルで dynamicsite ディレクトリに移動して、次のように入力します。
// サーバーの起動
go run main.go
Go is running on port 8080 (ctrl-c to quit)
// 終了するには
^C // control + c