请求处理流程

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

路由

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

  1. GET / App.Index

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

操作

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

  1. package controllers
  2. import "github.com/revel/revel"
  3. type App struct {
  4. *revel.Controller
  5. }
  6. func (c App) Index() revel.Result {
  7. return c.Render()
  8. }

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

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

模板

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

  1. {{set . "title" "Home"}}
  2. {{template "header.html" .}}
  3. <header class="hero-unit" style="background-color:#A9F16C">
  4. <div class="container">
  5. <div class="row">
  6. <div class="hero-text">
  7. <h1>It works!</h1>
  8. <p></p>
  9. </div>
  10. </div>
  11. </div>
  12. </header>
  13. <div class="container">
  14. <div class="row">
  15. <div class="span6">
  16. {{template "flash.html" .}}
  17. </div>
  18. </div>
  19. </div>
  20. {{template "footer.html" .}}

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

这个模板比较简单:

  • 添加了 title 变量到上下文中。
  • 包含了 header.html 模板 (使用了 title 变量)。
  • 显示一个欢迎信息。
  • 包含了 flash.html 模板, 用来显示一些flash消息。
  • 包含了 footer.html 模板。
    header.html 模板中有一些模板标签:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>{{.title}}</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <link rel="stylesheet" type="text/css" media="screen" href="/public/stylesheets/main.css">
  7. <link rel="shortcut icon" type="image/png" href="/public/images/favicon.png">
  8. <script src="/public/javascripts/jquery-1.5.2.min.js" type="text/javascript" charset="utf-8"></script>
  9. {{range .moreStyles}}
  10. <link rel="stylesheet" type="text/css" href="/public/{{.}}">
  11. {{end}}
  12. {{range .moreScripts}}
  13. <script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
  14. {{end}}
  15. </head>
  16. <body>

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

热启动

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

  1. <h1>It works!</h1>

修改为

  1. <h1>Hello World</h1>

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

Revel 会监视:

  • 所有 app/下的代码
  • 所有 app/views/下的模板
  • 路由文件: conf/routes
    如果发现代码有改动,Revel 会重新加载最新的代码. 现在来试一下: 打开 app/controllers/app.go 引入一个错误.

将代码

  1. return c.Render()

修改为

  1. return c.Renderx()

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

A helpful error message

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

将代码 app/controllers/app.go:

  1. return c.Renderx()

修改为:

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

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

  1. <h1>Hello World</h1>

修改为:

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

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

A Hawaiian greeting

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