20.6 处理窗口

正如我们在 15.6/7 节中所看到的,template 包经常被用于 web 应用,所以也可以被用于 GAE 应用。下面的应用程序让用户输入一个文本。首先,一个留言簿表格显示出来(通过 / 根处理程序),当它被发布时,sign() 处理程序将这个文本替换到产生的 html 响应中。sign() 函数通过调用 r.FormValue 获得窗口数据,并将其传递给 signTemplate.Execute(),后者将渲染的模板写入 http.ResponseWriter

编辑文件 helloworld2.go,用下面的 Go 代码替换它,并试运行:

Listing 20.4 helloworld2_version3.go:

  1. package hello
  2. import (
  3. "fmt"
  4. "net/http"
  5. "template"
  6. )
  7. const guestbookForm = `
  8. <html>
  9. <body>
  10. <form action="/sign" method="post">
  11. <div><textarea name="content" rows="3" cols="60"></textarea></div>
  12. <div><input type="submit" value="Sign Guestbook"></div>
  13. </form>
  14. </body>
  15. </html>
  16. `
  17. const signTemplateHTML = `
  18. <html>
  19. <body>
  20. <p>You wrote:</p>
  21. <pre>{{html .}}</pre>
  22. </body>
  23. </html>
  24. `
  25. var signTemplate = template.Must(template.New("sign").Parse(signTemplateHTML))
  26. func init() {
  27. http.HandleFunc("/", root)
  28. http.HandleFunc("/sign", sign)
  29. }
  30. func root(w http.ResponseWriter, r *http.Request) {
  31. w.Header().Set("Content-Type", "text/html")
  32. fmt.Fprint(w, guestbookForm)
  33. }
  34. func sign(w http.ResponseWriter, r *http.Request) {
  35. w.Header().Set("Content-Type", "text/html")
  36. err := signTemplate.Execute(w, r.FormValue("content"))
  37. if err != nil {
  38. http.Error(w, err.String(), http.StatusInternalServerError)
  39. }
  40. }

链接