google-app-engine - 动态 html 的 GO 模板

标签 google-app-engine templates go

任何人都可以告诉我如何在 https://developers.google.com/appengine/docs/java/gettingstarted/usingjsps 上编写像 guestbook.jsp 这样的简单页面吗?使用 GO 模板?

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

有两个问题我不知道如何解决

  1. JSP 页面使用用户和请求两个对象,而模板创建只需要一个。
  2. 如果我们使用单独的模板来生成退出链接和留言簿,那么我们如何将它们嵌套在主页中?

最佳答案

我所做的是创建一个结构(我称之为“页面”对象),用我需要的实体填充它,然后在模板中对它们进行操作。

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".}} 将包含另一个模板,这里是页眉和页脚。)

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

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

前辈, /亚历山大英灵。

关于google-app-engine - 动态 html 的 GO 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959912/

相关文章:

android - 什么是 "Web Application"?

python - 如何枚举实体的反向引用

python - 前瞻性搜索是否支持 ndb.model?

go - 仅通过 golang 中的第一个元素拆分字符串

go - 将换行符分隔的 JSON blob 的整个文件读取到内存中,并在 golang 中使用最少的转换量解码每个 blob?

node.js - Cloud SQL 实例连接在本地工作,但在 App Engine 上不工作

javascript - Web 组件模板错误

c++ - 通过大参数自动使用 const-ref

c++ - 带有参数包的类模板的构造函数给出 C3520 错误

go - 为什么下面的 Go 程序需要函数的名称是 String() 而不是其他任何东西?