请求处理流程
在前面的文章中,我们创建了一个新的名为 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 添加了一些 有用的方法。
这个模板比较简单:
- 添加了 title 变量到上下文中。
- 包含了 header.html 模板 (使用了 title 变量)。
- 显示一个欢迎信息。
- 包含了 flash.html 模板, 用来显示一些flash消息。
- 包含了 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()
刷新页面会得到一个有用的错误信息:
最后,我们传送一些数据到模板中
将代码 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.
下一篇: 实现一个简单的Hello World应用程序。.