×

概要

Revel 介绍Revel 概念Revel 项目结构

Revel 控制器

Revel 控制器概要Revel 路由routesRevel 参数绑定Revel 参数验证Revel Session / FlashRevel 国际化Revel Results

Revel 模板

Revel 拦截器Revel 缓存CacheRevel 过滤器Revel Websockets

Revel 模块

Revel 模块概要Revel 测试Revel 计划任务

Revel 操作

Revel 日志类型Revel 版本控制Revel 部署

Revel 参考资料

Revel 配置文件app.confRevel 命令行工具Revel 常见问题

Revel Results


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

type Result interface {
    Apply(req *Request, resp *Response)
}

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 都有一个默认的状态码和内容类型,简单的设置相关属性就可以修改这些默认值:

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

渲染

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

  1. 添加参数到控制器的 RenderArgs 中, 使用变量的名字作为字典的key.
  2. 使用传送的参数渲染模板 “views/Controller/Action.html”。

如果不成功 (比如,没有找到模板), 将返回 ErrorResult.

这允许开发人员编写:

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

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

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

RenderJson / RenderXml

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

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

重定向

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

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

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

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

通常用来传送参数.

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

添加你自己的 Result

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

创建此类型:

type Html string

func (r Html) Apply(req *Request, resp *Response) {
    resp.WriteHeader(http.StatusOK, "text/html")
    resp.Out.Write([]byte(r))
}

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

func (c *App) Action() revel.Result {
    return Html("<html><body>Hello Worldbody>html>")
}

状态码

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

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

分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)