框架浅析
这是之前使用bee创建的webapp目录层级结构:
├── 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中的代码,如下:
package main
import (
_ "webapp/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}
第四行中,导入beego框架,几乎每个文件都有这一行,所以就先不深究这个包。
在第3行导入webapp/routers包,前面加一个下划线,表示只是用那个包里面的init()函数。
可以看一下,webapp/routers包里面的代码webapp/routers/router.go:
package routers
import (
"webapp/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
在router.go代码中,导入了webapp/controllers包,可以继续深入,看一下这个包里面有什么代码(webapp/controllers/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"
}
可以看到,default.go中声明了一个MainController的结构体,定义了一个Get方法。
回到webapp/routers/router.go文件中,导入webapp/controllers包之后(包含webapp/controllers/default.go文件),然后在init()中有这么一条语句:
beego.Router("/", &controllers.MainController{})
这个语句和http.Handle绑定处理器是一样的格式,都是用来为指定路由绑定处理器的。
bee.Router声明如下:
func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App
通过Router函数的声明可知,default.go中的MainController定义的Get方法,其实是实现了ControllerInterface。
分析到这里,我们已经知道以下内容:
1、运行main.go的时候,会先导入webapp/routers包
2、在webapp/routers包中导入webapp/controllers包,然后为指定的路由绑定指定的处理器即可
3、在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