【GoWeb开发实战】Beego之Controller使用
Controller
controller就是处理具体的逻辑的,router将请求分发到指定的controlller,controller处理请求,然后返回。
基于beego的Controller 设计,只需要匿名组合beego.Controller就可以了,如下所示:
type xxxController struct {
beego.Controller
}
beego.Controller拥有很多方法,其中包括Init、Prepare、 Post、 Get、Delete、 Head等方法。我们可以通过重写的方式来实现这些方法。
一、默认的Controller
对于我们默认生成的beego的项目中,default.go文件:
package controllers import ( "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "astaxie@gmail.com" c.TplName = "index.tpl" }
里面就有MainController,并且重写了Get()方法。
说明:
我们可以通过各种方式获取数据,然后赋值到this.Data中,这是一个用来存储输出数据的map,可以赋值任意类型的值,这里我们只是简单举例输出两个字符串。
最后一个就是需要去渲染的模板,this.TplName 就是需要渲染的模板,这里指定了index.tpl,如果用户不设置该参数,那么默认会去到模板目录的Controller/<方法名>.tpl查找,例如上面的方法会去maincontroller/get.tpl(文件、 文件夹必须小写)。 用户设置了模板之后系统会自动的调用Render函数(这个函数是在beego.Contoller中实现的),所以无需用户自己来调用渲染。
1.1 Controller结构体
首先我们来看看Controller结构体,以及定义的方法
type Controller struct { // context data Ctx *context.Context Data map[interface{}]interface{} // route controller info controllerName string actionName string methodMapping map[string]func() //method:routertree gotofunc string AppController interface{} // template data TplName string ViewPath string Layout string LayoutSections map[string]string // the key is the section name and the value is the template name TplPrefix string TplExt string EnableRender bool // xsrf data _xsrfToken string XSRFExpire int EnableXSRF bool // session CruSession session.Store }
从controller的结构体我们可以看到,一共有5大块:
1.上下文数据
2.路由控制信息
3.模板数据
4.xsrf数据
5.session
1.2 ControllerInterface
type ControllerInterface interface { Init(ct *context.Context, controllerName, actionName string, app interface{}) /* 主要用来初始化Context、 Controller 名称,模板名, 初始化模板参数的容器 Data, app 可以用来执行子类的方法 */ Prepare() /* 这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行, 用户可以重写这个函数实现类似用户验证之类。 */ Get()//如果用户请求的 HTTP Method 是 GET,那么就执行该函数 Post()//如果用户请求的 HTTP Method 是 POST,那么就执行该函数 Delete()// 如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数 Put()//如果用户请求的 HTTP Method 是 PUT,那么就执行该函数 Head()//如果用户请求的 HTTP Method 是 HEAD,那么就执行该函数 Patch()//如果用户请求的 HTTP Method 是 PATCH,那么就执行该函数 Options()//如果用户请求的HTTP Method是OPTIONS,那么就执行该函数 Finish() /* 这个函数是在执行完相应的 HTTP Method 方法之后执行的,默认是空,用户可以在子 struct 中重写这 个函数,执行例如数据库关闭,清理数据之类的工作。 */ Render() error //这个函数主要用来实现渲染模板,如果 beego.AutoRender 为 true 的情况下才会执行。 XSRFToken() string CheckXSRFCookie() bool HandlerFunc(fn string) bool URLMapping() }
从ControllerInterface 我们可以看到Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览器的是 GET 请求,那么默认就会执行 HelloControllers 下的 Get 方法。这样我们上面的 Get 方法就会被执行到,这里只是调用Controller.Ctx.WriteString()然后赋值到Controller.Data中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出字符串。