• Results
    • 设置状态码/内容类型
  • 渲染
  • RenderJson / RenderXml
  • 重定向
  • 添加你自己的 Result
  • 状态码

    Results

    控制器方法必须返回一个revel.Result, 用来处理响应结果,其接口定义如下:

    1. type Result interface {
    2. Apply(req *Request, resp *Response)
    3. }

    revel.Controller 使用以下方法来处理响应结果:

    • Render, RenderTemplate - 渲染模板, 传送参数.
    • RenderJson, RenderXml - 序列化结构体到 json 或 xml.
    • RenderText - 返回一个明文响应.
    • Redirect - 重定向到一个控制器方法 或 URL
    • RenderFile - 返回一个文件, 一般用于响应文件下载.
    • RenderError - 渲染 errors/500.html 模板来返回一个 500 错误.
    • NotFound - 渲染 errors/404.html 模板来返回一个 404 错误.
    • Todo - 返回一个存根响应(500)
      此外,开发者可以自定义revel.Result.

    设置状态码/内容类型

    每个内建的 Result 都有一个默认的状态码和内容类型,简单的设置相关属性就可以修改这些默认值:

    1. func (c App) Action() revel.Result {
    2. c.Response.Status = http.StatusTeapot
    3. c.Response.ContentType = "application/dishware"
    4. return c.Render()
    5. }

    渲染

    控制器渲染方法 (e.g. “Controller.Action”), mvc.Controller.Render 做了两件事:

    • 添加参数到控制器的 RenderArgs 中, 使用变量的名字作为字典的key.
    • 使用传送的参数渲染模板 “views/Controller/Action.html”。
      如果不成功 (比如,没有找到模板), 将返回 ErrorResult.

    这允许开发人员编写:

    1. func (c MyApp) Action() revel.Result {
    2. myValue := calculateValue()
    3. return c.Render(myValue)
    4. }

    在模板中引用变量 “myValue”。这通常比构建一个明确的map更方便,因为在许多情况下,数据将被作为局部变量处理。

    注意: Revel 通过调用的控制器方法名来确定使用哪个模板,查找参数名。因此, c.Render() 只可称为由操作。

    RenderJson / RenderXml

    应用程序可以调用 RenderJsonRenderXml 并传送任意类型的变量 (通常是一个 struct). Revel 会使用 json.Marshal or xml.Marshal对变量进行序列化操作.

    如果 app.conf 配置文件中 results.pretty=true, 将使用 MarshalIndent 进行序列化, 生成漂亮的缩进,方便使用。

    重定向

    一个辅助函数是用于生成重定向。它有两种方式使用:

    • 重定向到一个控制器方法(不带参数):
    1. return c.Redirect(Hotels.Settings)

    这种形式是非常有用的,因为它提供了一定程度的路由类型安全性和独立性(自动生成URL)。

    • 重定向到一个格式化字符串:
    1. return c.Redirect("/hotels/%d/settings", hotelId)

    通常用来传送参数.

    它返回 302 (临时重定向) 状态码.

    添加你自己的 Result

    下面是一个添加简单结果的例子。

    创建此类型:

    1. type Html string
    2.  
    3. func (r Html) Apply(req *Request, resp *Response) {
    4. resp.WriteHeader(http.StatusOK, "text/html")
    5. resp.Out.Write([]byte(r))
    6. }

    在一个控制器方法中使用它:

    1. func (c *App) Action() revel.Result {
    2. return Html("<html><body>Hello World</body></html>")
    3. }

    状态码

    每一个Result 都会设置一个默认的状态码,你也可以重新设置默认的状态代码:

    1. func (c *App) CreateEntity() revel.Result {
    2. c.Response.Status = 201
    3. return c.Render()
    4. }