[TOC] # 执行逻辑 ![](https://box.kancloud.cn/951cc57e9d444b866e3ebcfe00257832_1026x546.png) # beego里面的方法 `beego.Controller`实现了接口`beego.ControllerInterface`,`beego.ControllerInterface`定义了如下函数: * Init(ct \*context.Context, childName string, app interface{}) 这个函数主要初始化了 Context、相应的 Controller 名称,模板名,初始化模板参数的容器 Data,app 即为当前执行的 Controller 的 reflecttype,这个 app 可以用来执行子类的方法。 * Prepare() 这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行,用户可以重写这个函数实现类似用户验证之类。 * Get() 如果用户请求的 HTTP Method 是 GET,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Get 请求。 * Post() 如果用户请求的 HTTP Method 是 POST,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Post 请求。 * Delete() 如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Delete 请求。 * Put() 如果用户请求的 HTTP Method 是 PUT,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Put 请求. * Head() 如果用户请求的 HTTP Method 是 HEAD,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Head 请求。 * Patch() 如果用户请求的 HTTP Method 是 PATCH,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Patch 请求. * Options() 如果用户请求的HTTP Method是OPTIONS,那么就执行该函数,默认是 405,用户继承的子 struct 中可以实现了该方法以处理 Options 请求。 * Finish() 这个函数是在执行完相应的 HTTP Method 方法之后执行的,默认是空,用户可以在子 struct 中重写这个函数,执行例如数据库关闭,清理数据之类的工作。 * Render() error 这个函数主要用来实现渲染模板,如果 beego.AutoRender 为 true 的情况下才会 # 前置方法 **注意: 不会先执行父类再执行自己的这个前置方法,因为会覆盖掉** ~~~ func (this *AddController) Prepare() { } ~~~ # 获取表单传递参数 ~~~ func (c *UserController) PostInfo() { name := c.GetString("name") pwd := c.GetString("pwd") fmt.Println(name + "---" + pwd) c.Ctx.WriteString("hello world---112211-----\n") } ~~~ # 定义个基类 **注意方法覆盖问题** 基类 ~~~ type NestPreparer interface { NestPrepare() } type baseController struct { beego.Controller isLogin bool } func (this *baseController) Prepare() { fmt.Println("------base---ok--------") //在前置里面查看符不符合这个条件 //this.AppController当前controller,看他有没有实现NestPreparer if app, ok := this.AppController.(NestPreparer); ok { app.NestPrepare() } } ~~~ 子类 ~~~ type AdminController struct { baseController } func (this *AdminController) NestPrepare() { fmt.Println("------net---ok--------") } func (this *AdminController) Get(){ fmt.Println("------ok--------") this.Ctx.WriteString("hello world---112211-----\n") } ~~~ # 提前终止 调用 StopRun 之后,如果你还定义了 Finish 函数就不会再执行,如果需要释放资源,那么请自己在调用 StopRun 之前手工调用 Finish 函数 **直接中止进程,可以在任意的地方执行** ~~~ func (this *AdminController) Prepare() { fmt.Println("------终止--------") this.StopRun() } ~~~ # 客户端模拟PUT方法处理 首先要说明, 在 XHTML 1.x 标准中, 表单只支持 GET 或者 POST 方法. 虽然说根据标准, 你不应该将表单提交到 PUT 方法, 但是如果你真想的话, 也很容易, 通常可以这么做: 首先表单本身还是使用 POST 方法提交, 但是可以在表单中添加一个隐藏字段: ~~~ <form method="post" ...> <input type="hidden" name="_method" value="put" /> ~~~ 接着在 Beego 中添加一个过滤器来判断是否将请求当做 PUT 来解析: ~~~ var FilterMethod = func(ctx *context.Context) { if ctx.BeegoInput.Query("_method")!="" && ctx.BeegoInput.IsPost(){ ctx.Request.Method = ctx.BeegoInput.Query("_method") } } beego.InsertFilter("*", beego.BeforeRouter, FilterMethod) ~~~