這是以前使用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