这是以前使用bee建立的webapp目录层级结构:css
├── conf 配置文件 │ └── app.conf ├── controllers 控制器 │ └── default.go ├── main.go 主程序 ├── models 模型 ├── routers 路由 │ └── router.go ├── static 静态资源 │ ├── css │ ├── img │ └── js │ └── reload.min.js ├── tests 测试 │ └── default_test.go ├── views 视图 │ └── index.tpl └── webapp
先看main.go中的代码,以下:git
package main import ( _ "webapp/routers" "github.com/astaxie/beego" ) func main() { beego.Run() }
第四行中,导入beego框架,几乎每一个文件都有这一行,因此就先不深究这个包。github
在第3行导入webapp/routers包,前面加一个下划线,表示只是用那个包里面的init()函数。web
能够看一下,webapp/routers包里面的代码webapp/routers/router.go:bash
package routers import ( "webapp/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) }
在router.go代码中,导入了webapp/controllers包,能够继续深刻,看一下这个包里面有什么代码(webapp/controllers/default.go):app
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" }
能够看到,default.go中声明了一个MainController的结构体,定义了一个Get方法。框架
回到webapp/routers/router.go文件中,导入webapp/controllers包以后(包含webapp/controllers/default.go文件),而后在init()中有这么一条语句:webapp
beego.Router("/", &controllers.MainController{})
这个语句和http.Handle绑定处理器是同样的格式,都是用来为指定路由绑定处理器的。函数
bee.Router声明以下:测试
func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App
经过Router函数的声明可知,default.go中的MainController定义的Get方法,实际上是实现了ControllerInterface。
分析到这里,咱们已经知道如下内容:
一、运行main.go的时候,会先导入webapp/routers包
二、在webapp/routers包中导入webapp/controllers包,而后为指定的路由绑定指定的处理器便可
三、在webapp/controllers包中,实现ControllerInterface接口中的Get方法便可。
综上,咱们就能够自定义本身的路由和控制器了。
依样画葫芦,照着webapp/routers/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" } //自定义控制器 type ArticleController struct{ beego.Controller } //实现接口 func (article *ArticleController) Get(){ article.Data["Website"] = "My Web Site" article.Data["Email"] = "www.cnblogs.com/-beyond" article.TplName = "index.tpl" }
能够将上面的代码整理一下,单独在一个文件中建立一个控制器,推荐使用下面这种方法:
在webapp/routers目录下建立一个文章控制器,article.go
package controllers import ( "github.com/astaxie/beego" ) //自定义控制器 type ArticleController struct { beego.Controller } //实现ControllerInterface接口的Get方法 func (article *ArticleController) Get() { article.Data["Website"] = "My Web Site" article.Data["Email"] = "www.cnblogs.com/-beyond" article.TplName = "index.tpl" }
直接在webapp/routers/router.go中修改便可:
package routers import ( "webapp/controllers" "github.com/astaxie/beego" ) func init() { beego.Router("/", &controllers.MainController{}) //增长本身的路由 beego.Router("/article", &controllers.ArticleController{}) }
访问localhost:8080/article