在前面的文章中,我们创建了一个新的名为 myapp狂欢应用程序。 在这篇文章中,我们来看看 Revel 是如何处理HTTP请求到http://localhost:9000/,并返回一个欢迎消息的。

路由

Revel 首先会检查路由 conf/routes 文件:

GET     /                                       App.Index

当 Revel 接收到一个 GET 请求到 / 的时候, Revel 会去执行App 控制器 Index 方法。

操作

让我们看看被调用的代码 app/controllers/app.go:

package controllers

import "github.com/revel/revel"

type App struct {
	*revel.Controller
}

func (c App) Index() revel.Result {
	return c.Render()
}

控制器必须是在第一个位置嵌入 *revel.Controller 的结构体(直接或间接嵌入)。 控制器的方法如果是导出的并返回一个 revel.Result 可以被当做一个操作。

Revel 控制器提供一些有用的方法来生成 Results。 这个例子中, 它调用 Render(), 查找和渲染一个模板、响应一个请求 (200 OK)。

模板

所有的模板都保存在 app/views 目录。如果没有指定模板, Revel 查找一个与控制器名字相同的模板。 这里, Revel 查找 app/views/App/Index.html 文件, 作为一个 Go 模板进行渲染

{{set . "title" "Home"}}
{{template "header.html" .}}

<header class="hero-unit" style="background-color:#A9F16C">
  <div class="container">
    <div class="row">
      <div class="hero-text">
        <h1>It works!</h1>
        <p></p>
      </div>
    </div>
  </div>
</header>

<div class="container">
  <div class="row">
    <div class="span6">
      {{template "flash.html" .}}
    </div>
  </div>
</div>

{{template "footer.html" .}}

除了Go模板提供的功能外, Revel 添加了一些 有用的方法

这个模板比较简单:

  1. 添加了 title 变量到上下文中。
  2. 包含了 header.html 模板 (使用了 title 变量)。
  3. 显示一个欢迎信息。
  4. 包含了 flash.html 模板, 用来显示一些flash消息。
  5. 包含了 footer.html 模板。

header.html 模板中有一些模板标签:

<!DOCTYPE html>
<html>
  <head>
    <title>{{.title}}</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" media="screen" href="/public/stylesheets/main.css">
    <link rel="shortcut icon" type="image/png" href="/public/images/favicon.png">
    <script src="/public/javascripts/jquery-1.5.2.min.js" type="text/javascript" charset="utf-8"></script>
    {{range .moreStyles}}
      <link rel="stylesheet" type="text/css" href="/public/{{.}}">
    {{end}}
    {{range .moreScripts}}
      <script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
    {{end}}
  </head>
  <body>

可以看到标题被设置,从moreStyles和moreScripts变量中提取模板附加的JS和CSS文件。

热启动

修改欢迎消息. 把 Index.html模板中的

<h1>It works!</h1>

修改为

<h1>Hello World</h1>

刷新浏览器,立即看到欢迎消息变化了!Revel 会监视您的模板改动并重新加载它。

Revel 会监视:

  • 所有 app/下的代码
  • 所有 app/views/下的模板
  • 路由文件: conf/routes

如果发现代码有改动,Revel 会重新加载最新的代码. 现在来试一下: 打开 app/controllers/app.go 引入一个错误.

将代码

return c.Render()

修改为

return c.Renderx()

刷新页面会得到一个有用的错误信息:

A helpful error message

最后,我们传送一些数据到模板中

将代码 app/controllers/app.go:

return c.Renderx()

修改为:

greeting := "Aloha World"
return c.Render(greeting)

将代码 app/views/App/Index.html:

<h1>Hello World</h1>

修改为:

<h1>{{.greeting}}</h1>

刷新页面,应该可以看到 Hawaiian greeting.

A Hawaiian greeting

下一篇: 实现一个简单的Hello World应用程序。.