谁能告诉我如何使用 GO 模板在https://developers.google.com/appengine/docs/java/gettingstarted/usingjsps上编写简单的页面,如 guestbook.jsp?
在我看来,编写一个有效的程序很容易,但我想知道它是否可以像 JSP 页面一样简洁。
有两个问题不知道怎么解决
- JSP 页面使用两个对象用户和请求,而模板创建只需要一个。
- 如果我们使用单独的模板来生成退出链接和留言簿,那么我们如何将它们嵌套在主页中?
谁能告诉我如何使用 GO 模板在https://developers.google.com/appengine/docs/java/gettingstarted/usingjsps上编写简单的页面,如 guestbook.jsp?
在我看来,编写一个有效的程序很容易,但我想知道它是否可以像 JSP 页面一样简洁。
有两个问题不知道怎么解决
我所做的是创建一个结构(我称之为“页面”对象),用我需要的实体填充它,然后在模板中对它们进行操作。
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。