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结构体,以及定义的方法
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
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 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法。
beego 是一个 RESTful 的框架,所以我们的请求默认是执行对应 req.Method 的方法。例如浏览器的是 GET 请求,那么默认就会执行 HelloControllers 下的 Get 方法。这样我们上面的 Get 方法就会被执行到,这里只是调用Controller.Ctx.WriteString()然后赋值到Controller.Data中,这是一个用来存储输出数据的 map,可以赋值任意类型的值,这里我们只是简单举例输出字符串。
我们经常需要获取用户传递的数据,包括 Get、POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据:
下面我们修改下开头展示的代码
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
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/login" method="post">
<table>
<tbody>
<tr>
<td>用户名td>
<td>
td>
tr>
<tr>
<td>密码td>
<td>
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)
}
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
作者:Clown95
来源:CSDN
原文:https://blog.csdn.net/yang731227/article/details/82254010
版权声明:本文为博主原创文章,转载请附上博文链接!