每个`Action`必须返回一个`revel.Result`实例,用来处理响应。它遵循了简单的接口: type Result interface { Apply(req *Request, resp *Response) } `revel.Controller`提供了一些方法来生成`Results`响应: 1、`Render`, `RenderTemplate` - 渲染模板, 传递参数 2、`RenderJson`, `RenderXml` - 将一个`struct`序列化为`json`或`xml`格式 3、`RenderText` - 返回一个纯文本响应 4、`Redirect` - 重定向到另一个`action`或URL 5、`RenderFile` - 返回一个文件, 一般作为一个附件下载 6、`RenderError` - 渲染`errors/500.html`模板来返回一个500状态 7、`NotFound` - 渲染`errors/404.html`模板来返回一个404状态 8、`Todo` - 返回一个存根响应 (500) 除此之外,开发人员还可以返回自己定义的`revel.Result` **设置状态码与返回体** 每一个内建的`Result`都有默认的状态码与返回体,如果要手动改变,只需要简单的覆盖`response`中的属性即可: func (c App) Action() revel.Result { c.Response.Status = http.StatusTeapot c.Response.ContentType = "application/dishware" return c.Render() } ##Render(渲染器) 在一个`action`内调用(如,`Controller.Action`)。`mvc.Controller.Render`可以做如下两件事: 1、将所有参数添加至controller的`RenderArgs`,并将它们的本地标识设置为key 2、渲染模板`views/Controller/Action.html`, 并将`RenderArgs`作为一个map传递 如果不成功,比如没找到模板,它会返回一个`ErrorResult`对象。 func (c MyApp) Action() revel.Result { myValue := calculateValue() return c.Render(myValue) } 上面示例将`myValue`传递至模板。 revel需要根据调用者的方法名来确定模板的路径与参数,因此`c.Render()`只能在Action中调用。 ##渲染 Json / Xml 程序可以通过传递任意Go类型来调用`RenderJson`或`RenderXml`,revel将通过`json.Marshal`或`xml.Marshal`来渲染。 如果`app.conf`中的`results.pretty=true`被定义,则将使用`MarshalIndent`进行序列化,以惨生更好的缩进供人阅读。 ##Redirect(重定向) revel提供了一下两种方式来进行重定向: 1、不传递参数来重定向至一个action return c.Redirect(Hotels.Settings) 这种方式十分有用,它提供一定程度的类型安全与独立路由(会自动的生成URL) 2、使用一个格式化字符串重定向 return c.Redirect("/hotels/%d/settings", hotelId) 这种形式必须传递参数 它会返回一个302(临时重定向)状态码 ##添加自定义Result 下面的示例演示如何创建一个自定义`Result` 创建如下类型: type Html string func (r Html) Apply(req *Request, resp *Response) { resp.WriteHeader(http.StatusOK, "text/html") resp.Out.Write([]byte(r)) } 并在action中使用: func (c *App) Action() revel.Result { return Html("Hello World") } ##状态码 没一个`Result`都具有默认的状态码,可以很方便的更改它: func (c *App) CreateEntity() revel.Result { c.Response.Status = 201 return c.Render() }