下面的代码呈现初始页面,其中包含一个表单。在提交该表单时,我想呈现结果页面。表单提交并处理,但我看到的只是一个空白的html文档。
我不想只显示一个html页面,但是渲染它,因为一些内容将来自我在表单提交时的golang代码。我正在尝试使用模板(来自模板)指定<body></body>
中的行是Golang变量的值。
如果有人能帮我弄清楚如何呈现结果页面,我将不胜感激。
package main
import (
//"fmt"
"net/http"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
"html/template"
"io/ioutil"
)
type Page struct {
Title string
Body []byte
}
func (p *Page) save() error{
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
func loadPage(title string) (*Page, error){
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil{
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page){
t, _ := template.ParseFiles("Projects/Go/src/web/site/" + tmpl + ".html")
t.Execute(w, p)
}
func editHandler(w http.ResponseWriter, r *http.Request){
title := r.URL.Path[len("/edit/"):]
p, err := loadPage(title)
if err != nil{
p = &Page{Title: title}
}
renderTemplate(w, "edit", p)
}
func viewHandler(w http.ResponseWriter, r *http.Request){
title := r.URL.Path[len("/ask"):]
p, _ := loadPage(title)
renderTemplate(w, "ask", p)
}
func response(c web.C, w http.ResponseWriter, r *http.Request){
//name := r.FormValue("name")
//fmt.Fprintf(w, "Hello, %s!", name)
http.HandleFunc("/ask", viewHandler)
http.HandleFunc("/edit/", editHandler)
//http.HandleFunc("/save", saveHandler)
http.ListenAndServe("8000", nil)
}
func serveSingle(filename string) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filename)
}
}
func main() {
goji.Get("/", serveSingle("Projects/Go/src/web/site/index.html"))
goji.Handle("/ask", response)
goji.Serve()
}
文件结构:
根/项目/转到/ SRC /网络/站点/ edit.html
根/项目/转到/ SRC /网络/站点/ index.html中
根/项目/转到/ SRC /网络/站点/ view.html
index.html的正文:
<form action="ask" method="get">
<input type="text" name="q" />
</form>
view.html的正文:
<form action="ask" method="get">
<input type="text" name="q" />
</form>
<h1 class="abTitle">{{printf "%s" .Body}}</h1>
view.html和edit.html完全相同。
答案 0 :(得分:0)
从理论上讲,您发布的脚本应该响应/
请求,并对/ask
的请求崩溃。在对/ask
的请求中,它应该执行response
处理程序和恐慌(正如文档指定http://golang.org/pkg/net/http/#ServeMux.Handle但是究竟会发生什么是非常不清楚的。无论如何,它将更加惯用(对于这样的小型服务器)提前配置所有处理程序,避免在响应中注册处理程序。
另一个问题出在viewHandler
函数中 - 只会通过/ask
请求进行调用,但/ask
将被删除,标题将为&#34;&# 34; - 这将导致加载&#34; .txt&#34;模板文件,可能不是故意的。
如果您发布表单模板和文件结构(文件夹和文件名)的内容,也会有所帮助。