当尝试在表单提交上呈现结果页面时,会显示空白的html文档

时间:2014-08-23 01:16:43

标签: html go web-frameworks

下面的代码呈现初始页面,其中包含一个表单。在提交该表单时,我想呈现结果页面。表单提交并处理,但我看到的只是一个空白的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完全相同。

1 个答案:

答案 0 :(得分:0)

从理论上讲,您发布的脚本应该响应/请求,并对/ask的请求崩溃。在对/ask的请求中,它应该执行response处理程序和恐慌(正如文档指定http://golang.org/pkg/net/http/#ServeMux.Handle但是究竟会发生什么是非常不清楚的。无论如何,它将更加惯用(对于这样的小型服务器)提前配置所有处理程序,避免在响应中注册处理程序。

另一个问题出在viewHandler函数中 - 只会通过/ask请求进行调用,但/ask将被删除,标题将为&#34;&# 34; - 这将导致加载&#34; .txt&#34;模板文件,可能不是故意的。

如果您发布表单模板和文件结构(文件夹和文件名)的内容,也会有所帮助。