0

GOテンプレートを使用してhttps://developers.google.com/appengine/docs/java/gettingstarted/usingjspsのguestbook.jspのような単純なページをコーディングする方法を教えてもらえますか?

私の意見では、うまくいくものを書くのは簡単ですが、JSPページと同じくらい簡潔にできるかどうか知りたいです。

対処方法がわからない2つの問題があります

  1. JSPページは2つのオブジェクトuserとrequestを使用しますが、テンプレートの作成には1つしかかかりません。
  2. サインアウトリンクとゲストブックを生成するために別々のテンプレートを使用する場合、メインページにそれらをどのようにネストしますか?
4

1 に答える 1

11

私がしていることは、構造体 (私は「ページ」オブジェクトと呼んでいます) を作成し、必要なエンティティを設定して、テンプレートでそれらを操作することです。

func myPage(w http.ResponseWriter, r *http.Request) {
    var user *User // fetch from somewhere

    page := struct {        
        Title     string
        User      *User
    }{"My title", user}

    return templates.ExecuteTemplate(w, "myPage", page)
}

テンプレートは次のようになり、構造体のすべてのフィールドにアクセスできます。

{{define "myPage"}}
{{template "head" .}}

Title: {{.Title}}<br />
Name: {{.User.Name}}<br />

{{template "tail" .}}
{{end}}

({{template "head" .}}別のテンプレート、ここではヘッダーとフッターが含まれることに注意してください。)

もう 1 つよく使用するのは、テンプレート内の変数です。ドル記号を使用して変数を定義できます。

次の例はあまり洗練されたものではありませんが、何が可能かについてのアイデアが得られるかもしれません。3 つのスライスがあるとします。1 つは " User" オブジェクト、もう 1 つは " Spot" オブジェクト、もう 1 つは " Checkin" オブジェクトです。それらはすべて同じ長さで、位置によって関連付けられています (それぞれのインデックス 0 には、チェックインされたユーザー、チェックインした場所が含まれ、チェックイン オブジェクトにはそれが発生した時間が含まれます)。「範囲」は、スライスを反復処理するときに、インデックス ($i例では) と値 ( $v) の 2 つの変数を提供します。「インデックス」を使用すると、スライス内のエンティティを要求できるため、{{$user := index $checkinUsers $i}}$i が指す位置にオブジェクトが表示されます。

{{$checkinUsers := .CheckinUsers}}
{{$checkinSpots := .CheckinSpots}}
{{range $i, $v := .Checkins}}
    {{$user := index $checkinUsers $i}}
    {{$spot := index $checkinSpots $i}}
    <tr>
        <td>
            {{$user.FirstName}} {{$user.LastName}} @ {{$spot.Description}} ({{$v.Time}})<br />
        </td>
    </tr>
    {{end}}

繰り返しますが、この例はあまりエレガントではありませんが、Go で動的 HTML を JSP と同じくらい簡単に作成できることを理解していただければ幸いです (私の経験では、結果のページは JSP よりもクリーンであり、したがって、経験の浅い Web 開発者やデザイナー)。

Ex animo、/Alexander Yngling。

于 2012-06-09T12:53:39.053 に答える