5

少しバックグラウンドになる前は、プログラミング言語を使うのはとても新しいです。私はWindows用の最新のgoパッケージインストーラーであるWin7でgoを実行しています。私はコーディングが苦手ですが、新しい言語を学ぶという挑戦は好きです。Erlangを学び始めたかったのですが、YouTubeのGO I / Oビデオに基づいて、非常に興味深いことがわかりました。

GOでPOSTフォーム値をキャプチャする際に問題が発生しました。昨日、ブラウザでPOSTフォームの値を印刷するために3時間費やしましたが、惨めに失敗しました。何が間違っているのかわかりませんが、誰かが私を正しい方向に向けることができますか?これは、C#、PHP、VB、ASP、Railsなどの別の言語で簡単に実行できます。インターウェブ全体を検索しましたが、動作するサンプルが見つかりませんでした。以下は私のサンプルコードです。

これがIndex.htmlページです

{{ define "title" }}Homepage{{ end }}

{{ define "content" }}
    <h1>My Homepage</h1>

    <p>Hello, and welcome to my homepage!</p>
    <form method="POST" action="/">
    <p> Enter your name : <input type="text" name="username"> </P>
    <p> <button>Go</button>
    </form>
    <br /><br />

{{ end }}

これがベースページです

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>{{ template "title" . }}</title>
    </head>
    <body>
        <section id="contents">
            {{ template "content" . }}
        </section>
        <footer id="footer">
            My homepage 2012 copy
        </footer>
    </body>
</html>

今いくつかのgoコード

    package main

import (
    "fmt"
    "http"
    "strings"
    "html/template"

)

var index = template.Must(template.ParseFiles(
  "templates/_base.html",
  "templates/index.html",
))


func GeneralHandler(w http.ResponseWriter, r *http.Request) {
    index.Execute(w, nil)
     if r.Method == "POST" {
        a := r.FormValue("username")
        fmt.Fprintf(w, "hi %s!",a); //<-- this variable does not rendered in the browser!!!

    }
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    remPartOfURL := r.URL.Path[len("/hello/"):] 
    fmt.Fprintf(w, "Hello %s!", remPartOfURL)
}


func main() {
    http.HandleFunc("/", GeneralHandler)
    http.HandleFunc("/hello/", helloHandler)
    http.ListenAndServe("localhost:81", nil)
}

ありがとう!

PS:特にコピー貼り付けの場合、stackoverflowのコードのすべての行の前に4つのスペースを追加するのは非常に面倒です。それは非常にユーザーフレンドリーであるとは思いませんでしたか、それとももっと簡単な方法がありますか?

4

2 に答える 2

3

リクエストから値を読み取る前に (Execute を呼び出して) ResponseWriter に書き込むと、値がクリアされます。

このリクエスト ハンドラーを使用すると、実際にこれを確認できます。

func GeneralHandler(w http.ResponseWriter, r *http.Request) {
   fmt.Println(r.Method)
   fmt.Println(r.URL)
   fmt.Println("before",r.FormValue("username"))
   index.Execute(w, nil)
   if r.Method == "POST" {
     fmt.Println("after",r.FormValue("username"))
   } 
 }

これは前後に出力されます。ただし、この場合:

func GeneralHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println(r.Method)
  fmt.Println(r.URL)
  index.Execute(w, nil)
  if r.Method == "POST" {
    fmt.Println("after",r.FormValue("username"))
  }
}

後の値は空白になります。

于 2012-09-27T06:11:12.127 に答える
1

html / templateのドキュメントによると、Executeの2番目の引数は、テンプレートに配置するデータである必要があります。

テンプレートのどこかに{{。}}を追加し、印刷する文字列を2番目の引数として渡します。テンプレートの一部としてレンダリングされる必要があります。

于 2012-09-27T03:36:27.447 に答える