zoukankan      html  css  js  c++  java
  • beego 自定义控制器与路由

    框架浅析

      这是之前使用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

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/-beyond/p/9317926.html
Copyright © 2011-2022 走看看