zoukankan      html  css  js  c++  java
  • Go语言之高级篇beego框架之Controller

     一、Controller 控制器

    Controller等同于Django里的view,处理逻辑都是在Controller里面完成的,下面就写一个最简单的Controller。
    写controller的时候,一定要继承beego.Controller,也一定要记得导入 github.com/astaxie/beego.

    1、 基于 beego 的 Controller 设计,只需要匿名组合 beego.Controller。

    示例1: 语法

    type xxxController struct {
        beego.Controller
    }
    

    示例2: 使用方法

    package controllers
    
    import (
            "github.com/astaxie/beego"
    )
    
    type MainController struct {
            beego.Controller
    }
    
    func (this *MainController) Get() {
            this.Data["Website"] = "beego.me"
            this.Data["Email"] = "astaxie@gmail.com"
            this.TplName = "index.tpl"
    }
    

      

    3、Controller用法介绍

    beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head等 方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
    我们可以通过各种方式获取数据,然后赋值到 this.Data 中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出两个字符串。
    最后一个就是需要去渲染的模板,this.TplName 就是需要渲染的模板,这里指定了 index.tpl,如果用户不设置该参数,那么默认会去到模板目录的 Controller/<方法名>.tpl 查找,例如上面的方法会去 maincontroller/get.tpl(文件、文件夹必须小写)。
    用户设置了模板之后系统会自动的调用 Render 函数(这个函数是在 beego.Controller 中实现的),所以无需用户自己来调用渲染。
    
    

    示例: 当然也可以不使用模版,直接用 this.Ctx.WriteString 输出字符串

    func (this *MainController) Get() {
            this.Ctx.WriteString("hello")
    }
    

      

     4、beego.Controller源码解读

    示例:

    type Controller struct {
        // context data
        Ctx  *context.Context
        Data map[interface{}]interface{}
    
        // route controller info
        controllerName string
        actionName     string
        methodMapping  map[string]func() //method:routertree
        gotofunc       string
        AppController  interface{}
    
        // template data
        TplName        string
        ViewPath       string
        Layout         string
        LayoutSections map[string]string // the key is the section name and the value is the template name
        TplPrefix      string
        TplExt         string
        EnableRender   bool
    
        // xsrf data
        _xsrfToken string
        XSRFExpire int
        EnableXSRF bool
    
        // session
        CruSession session.Store
    }
    
    // ControllerInterface is an interface to uniform all controller handler.
    type ControllerInterface interface {
        Init(ct *context.Context, controllerName, actionName string, app interface{})
        Prepare()
        Get()
        Post()
        Delete()
        Put()
        Head()
        Patch()
        Options()
        Finish()
        Render() error
        XSRFToken() string
        CheckXSRFCookie() bool
        HandlerFunc(fn string) bool
        URLMapping()
    }
    

    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 的情况下才会执行。

     

  • 相关阅读:
    Socket
    利用Python自动生成暴力破解的字典
    【转】六年测试工作的思考1
    【转】手机测试入行三年的感想
    【转】移动测试人员的未来:测试开发技术的融合
    【转】一个互联网项目即将结束的软件测试经验总结
    【转】电子商务网站测试经验总结
    【转】六年软件测试感悟-从博彦到VMware
    使用PL/SQL删除百万条记录的大表
    【转】百万级数据查询优化
  • 原文地址:https://www.cnblogs.com/nulige/p/10365110.html
Copyright © 2011-2022 走看看