Beego脱坑(五)——Controller

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yang731227/article/details/82254010

Controller

controller就是处理具体的逻辑的,router将请求分发到指定的controlller,controller处理请求,然后返回。

基于 beego 的 Controller 设计,只需要匿名组合 beego.Controller 就可以了,如下所示:

type xxxController struct {
    beego.Controller
}

首先我们再回顾下的代码:


type HelloControllers struct {
	beego.Controller
}
 
func (hello * HelloControllers) Get() {
	hello.Ctx.WriteString("hello world")
}

上面代码中我们新建了HelloControllers 一个控制器,里面包含了beego.Controller.然后重写了 Controller 的 Get()方法.

 Controller结构体

首先我们来看看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
}

从controller的结构体我们可以看到,一共有5大块:

1.上下文数据

2.路由控制信息

3.模板数据

4.xsrf数据

5.session

ControllerInterface 

type ControllerInterface interface {

	Init(ct *context.Context, controllerName, actionName string, app interface{})
	/*
	主要用来初始化Context、 Controller 名称,模板名,
	初始化模板参数的容器 Data, app 可以用来执行子类的方法
	*/
	
	Prepare()
	/*
	这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些 Method 方法之前执行,
    用户可以重写这个函数实现类似用户验证之类。
	*/
	
	Get()//如果用户请求的 HTTP Method 是 GET,那么就执行该函数
	
	Post()//如果用户请求的 HTTP Method 是 POST,那么就执行该函数

	Delete()// 如果用户请求的 HTTP Method 是 DELETE,那么就执行该函数

	Put()//如果用户请求的 HTTP Method 是 PUT,那么就执行该函数
	
	Head()//如果用户请求的 HTTP Method 是 HEAD,那么就执行该函数
	
	Patch()//如果用户请求的 HTTP Method 是 PATCH,那么就执行该函数
	
	Options()//如果用户请求的HTTP Method是OPTIONS,那么就执行该函数
	
	Finish()
	/*
	这个函数是在执行完相应的 HTTP Method 方法之后执行的,默认是空,用户可以在子 struct 中重写这        
    个函数,执行例如数据库关闭,清理数据之类的工作。
	*/

	Render() error	
    //这个函数主要用来实现渲染模板,如果 beego.AutoRender 为 true 的情况下才会执行。

	XSRFToken() string

	CheckXSRFCookie() bool

	HandlerFunc(fn string) bool

	URLMapping()
}

从ControllerInterface 我们可以看到Controller 拥有很多方法,其中包括 InitPreparePostGetDeleteHead 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。

 beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览器的是 GET 请求,那么默认就会执行 HelloControllers 下的 Get 方法。这样我们上面的 Get 方法就会被执行到,这里只是调用Controller.Ctx.WriteString()然后赋值到Controller.Data中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出字符串。

获取参数

我们经常需要获取用户传递的数据,包括 Get、POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据:

  • GetString(key string) string
  • GetStrings(key string) []string
  • GetInt(key string) (int64, error)
  • GetBool(key string) (bool, error)
  • GetFloat(key string) (float64, error)

下面我们修改下开头展示的代码

func (hello *HelloControllers) Get() {
	str:= hello.GetString("str")
	hello.Ctx.WriteString("str:" + str)
}

然后我们重新 bee run hello一下

在浏览器输入 http://127.0.0.1:8080/hello?str=hello world

可以看出Getstring()自动帮我识别了key为str的值

在表单中使用 

目前我们所演示的都是Get()方法 下面我们通过表单来提交POST请求,并且通过GET打印

首先我们在view下新建一个login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    <table>
        <tbody>
        <tr>
            <td>用户名</td>
            <td>
                <input type="text" name ="user" value="">
            </td>
        </tr>
        <tr>
            <td>密码</td>
            <td>
                <input type="password" name ="pwd" value="">
            </td>

        </tr>
        <tr>
            <td>
                <input type="submit" value="确认">
            </td>

        </tr>
        </tbody>
    </table>
</form>
</body>
</html>

 action="/login" method="post"  我们可以看到表单指向了login地址,提交方法为post 。
           

所以接下来我们在Controllers目录下新建login.go文件

package controllers

import "github.com/astaxie/beego"

type  LoginController struct {
	beego.Controller
}

//使用Get方法
func (this * LoginController) Get(){
	this.TplName ="login.html"  //解析login模板

}
//使用Put方法
func (this *LoginController) Post(){
	user:=this.GetString("user")
	pwd:= this.GetString("pwd")
	this.Ctx.WriteString("user="+user+" pwd="+pwd)
}

<input type="text" name ="user" value="">
<input type="password" name ="pwd" value="">

user:=this.GetString("user")
pwd:= this.GetString("pwd")

根据这上面4行代码我们可以看到 GetString()的参数一定要和 input的name 相等,不然获取不到this.TplName 就是用来用来解析 input内容的。

紧接着我们在routers/router.go 添加

 beego.Router("/login",&controllers.LoginController{},"Get:Get;Post:Post")

运行项目 

点击确认得到 

user=admin pwd=123

猜你喜欢

转载自blog.csdn.net/yang731227/article/details/82254010