×

概要

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 参数绑定


Revel 尽可能让客户端传来的参数转换成Go语言的数据类型变得简单。这种从字符串转换成另外一种类型被称为“数据绑定”。

参数

所有的请求参数被收集到一个单独的 Params 对象中. 包括:

  • URL 路径参数
  • URL 查询参数
  • 表单字段 (Multipart or not)
  • 文件上传

Params对象定义在 (godoc)中:

type Params struct {
    url.Values
    Files map[string][]*multipart.FileHeader
}

嵌入的 url.Values (godoc) 提供了简单值的查询支持, 但是开发者可以更方便的使用Revel的数据绑定支持,提取参数到任意的数据类型。

控制器方法参数绑定

参数可以直接绑定到控制器方法,例如:

func (c AppController) Action(name string, ids []int, user User, img []byte) revel.Result {
    ...
}

在控制器方法执行之前, Revel 通过变量名称绑定器解析参数到指定的数据类型,如果解析参数失败, 参数将被解析到目标数据类型的初始值。

绑定器

使用 Revel 的绑定器绑定一个参数到指定的数据类型 (godoc),它集成了Params对象。例如:

func (c SomeController) Action() revel.Result {
    var ids []int
    c.Params.Bind(&ids, "ids")
    ...
}

支持的数据类型有:

  • Int
  • Bool
  • Point
  • Slice
  • Struct
  • time.Time
  • 文件上传:*os.File, []byte, io.Reader, io.ReadSeeker

数据类型绑定的语法描述如下,详细内容描述也可以参考 源代码

Booleans

字符串 “true”, “on”, 和 “1” 被绑定到 true,其他的为 false.

Slices

切片绑定有两种语法:有序和无序

有序:

?ids[0]=1
&ids[1]=2
&ids[3]=4

绑定结果为 []int{1, 2, 0, 4}

无序:

?ids[]=1
&ids[]=2
&ids[]=3

绑定结果为 []int{1, 2, 3}

注意: 只有有序切片可以绑定到一个 []Struct:

?user[0].Id=1
&user[0].Name=rob
&user[1].Id=2
&user[1].Name=jenny

Struct

Struct简单的使用一个 . 进行绑定:

?user.Id=1
&user.Name=rob
&user.Friends[]=2
&user.Friends[]=3
&user.Father.Id=5
&user.Father.Name=Hermes

绑定到下面的struct类型:

type User struct {
    Id int
    Name string
    Friends []int
    Father User
}

注意: struct中的字段必须是导出的(首字母大写)。

Date / Time

内置的 SQL 标准时间格式 [“2006-01-02”, “2006-01-02 15:04”]

使用 Revel官方模式 简单的添加时间格式到 TimeFormats 变量:

func init() {
    revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}

文件上传

文件上传参数可以绑定到以下几种类型:

  • *os.File
  • []byte
  • io.Reader
  • io.ReadSeeker

它是 Go的 multipart 包 的一个包装器. 文件保存在内存中,如果文件大小超过10MB(默认值), 就会被保存到一个临时文件中。

注意: 绑定 os.File类型,会保存到临时文件 (如果没有的话),所以效率低。

自定义绑定器

应用程序可以定义绑定器。

自定义绑定器需要实现 binder 接口并注册自定义类型:

var myBinder = revel.Binder{
    Bind: func(params *revel.Params, name string, typ reflect.Type) reflect.Value {...},
    Unbind: func(output map[string]string, name string, val interface{}) {...},
}

func init() {
    revel.TypeBinders[reflect.TypeOf(MyType{})] = myBinder

分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)