2016-08-25 8 views
3

私は単純な2つのHandler Webサーバーを構築しようとしています。最初のハンドラでは、ユーザーの名と姓の2つのフィールドから値を取得しています。 2番目のハンドラーでは、私は単に、"Hello" (first name, last name)と言っています。Golang、HTMLから値を渡さない

fmt.Printlnを入れました。最初のHandlerの情報を正しくGoプログラミングに戻していないようです。これはどこが間違っていますか?ここ

package main 

import (
    "fmt" 
    "html/template" 
    "log" 
    "net/http" 
) 

type Field struct { 
    Firstname string 
    Secondname string 
} 

func RootHandler(w http.ResponseWriter, r *http.Request) { 
    tmpl, err := template.ParseFiles("index.html") 
    if err != nil { 
     fmt.Println("Index Template Parse Error: ", err) 
    } 
    err = tmpl.Execute(w, nil) 
    if err != nil { 
     fmt.Println("Index Template Execution Error: ", err) 
    } 

} 

func main() { 
    http.HandleFunc("/", RootHandler) // sets router 
    http.HandleFunc("/welcome", WelcomeHandler) 
    err := http.ListenAndServe(":4000", nil) // set listen port 
    if err != nil { 
     log.Fatal("ListenAndServe: ", err) 
    } 
} 

func WelcomeHandler(w http.ResponseWriter, r *http.Request) { 

    Firstname := r.FormValue("Namef") 
    Secondname := r.FormValue("Namel") 
    fmt.Println(Firstname) 

    f := new(Field) 
    f.Firstname = Firstname 
    f.Secondname = Secondname 
    fmt.Println(*f) 
    tmpl, err := template.ParseFiles("tmpl/welcome.tmpl") 
    if err != nil { 
     fmt.Println("Index Template Parse Error: ", err) 
    } 
    err = tmpl.Execute(w, &f) 
    if err != nil { 
     fmt.Println("Index Template Execution Error: ", err) 
    } 

} 

そして

は、私はから2つの値を引っ張ってる index.htmlです:

<!DOCTYPE html> 
<html> 
<body> 

<form action="/welcome" method="post"> 
<p> Welcome! First I will need your full name: </p> 
First Name: <input type="text" id="Namef" name="FirstName"><br> 
Last Name: <input type="text" id="Namel" name="LastName" ><br> 
<input type="submit" value="Next"> 
</form> 

<p>Click the "Submit" button and the form-data will be sent to a page on the server called "demo_form.asp".</p> 

</body> 
</html> 

答えて

5

問題は間違った名前を使用してフォームの値を取得しようということです。

idではなく、HTMLドキュメントのname属性として使用した値を使用する必要があります。

Firstname := r.FormValue("FirstName") 
Secondname := r.FormValue("LastName") 

これはあなたの部分の練習用コードかもしれませんが、ハンドラー内のテンプレートを解析することはありません。テンプレートの解析は比較的リソース集約的な作業です。テンプレートを同時に使用することは安全であるため、一度だけ行う必要があります。複数のゴルーチン(並行要求を処理する)から単一のtemplate.Template値を使用できます。詳細については、この質問をご覧ください。It takes too much time when using "template" package to generate a dynamic web page to client in golang

+0

これは役に立ちました。わかりやすくするために、宣言の変数の名前を変更しました。ありがとうございました。 –

関連する問題