Revel 尽可能让客户端传来的参数转换成Go语言的数据类型变得简单。这种从字符串转换成另外一种类型被称为“数据绑定”。
所有的请求参数被收集到一个单独的 Params
对象中. 包括:
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")
...
}
支持的数据类型有:
数据类型绑定的语法描述如下,详细内容描述也可以参考 源代码。
字符串 “true”, “on”, 和 “1” 被绑定到 true,其他的为 false.
切片绑定有两种语法:有序和无序
有序:
?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简单的使用一个 . 进行绑定:
?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中的字段必须是导出的(首字母大写)。
内置的 SQL 标准时间格式 [“2006-01-02”, “2006-01-02 15:04”]
使用 Revel官方模式 简单的添加时间格式到 TimeFormats
变量:
func init() {
revel.TimeFormats = append(revel.TimeFormats, "01/02/2006")
}
文件上传参数可以绑定到以下几种类型:
它是 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
使用空白中间件替换默认中间件app := iris.New()替换为app := iris.Default()使用中间件package mainimport ("github.com/katara...
前端代码!DOCTYPE htmlhtml lang="en"headmeta charset="UTF-8"meta http-equiv="X-UA-Compatible" content="IE=edge"meta name=...
一个非阻塞的单线程HTTP服务器。典型的应用程序与HTTPServer类几乎没有直接交互,除了在进程开始时启动服务器(甚至通常通过to...
到目前为止,您一直在使用常见的数据类型,如:intfloatstrbool但是您也可以使用更复杂的数据类型。您仍然会拥有现在已经看到的相...
缓存的其他问题是数据的隐私和数据应该存储在缓存的级联中的问题。用户通常面临两种缓存:他们自己的浏览器缓存(私有缓存)和他...
Java Swing教程 -Java Swing SpringLayoutjavax.swing包中的SpringLayout类的实例表示一个SpringLayout管理器。在SpringLayout管...
二、运行springboot-freemarker 工程git clone 下载工程springboot-learning-example ,项目地址见 GitHub –https://github.com...
说明:继承自AbstractWrapper,自身的内部属性entity也用于生成where条件及LambdaQueryWrapper,可以通过ne...
什么是MyBatis?MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及...