0

谁能告诉我如何使用 GO 模板在https://developers.google.com/appengine/docs/java/gettingstarted/usingjsps上编写简单的页面,如 guestbook.jsp?

在我看来,编写一个有效的程序很容易,但我想知道它是否可以像 JSP 页面一样简洁。

有两个问题不知道怎么解决

  1. JSP 页面使用两个对象用户和请求,而模板创建只需要一个。
  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" .}}将包括另一个模板,这里是页眉和页脚。)

我经常使用的另一件事是模板中的变量。您可以使用美元符号定义变量。

下面的例子不是很优雅,但可以让你知道什么是可能的。假设我们有三个切片:一个带有“ User”对象,一个带有“ Spot”对象,一个带有“ Checkin”对象。它们都是相同的长度并按位置相关(每个索引 0 包含签入的用户、他/她签入的地点,签入对象包含它发生的时间)。“范围”将在遍历切片时为您提供两个变量:索引($i在示例中)和值($v)。使用“索引”,您可以请求切片中的实体,因此{{$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 开发人员和设计师)。

前动画,/Alexander Yngling。

于 2012-06-09T12:53:39.053 回答