03.获取参数传值
# 01.MVC 简单介绍
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码
将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
Beego 是一个 MVC 框架:
- Model(模型)主要用于处理应用程序的业务逻辑,以及和数据库打交道
- View(视图) 是应用程序中数据显示的部分。
- Controller(控制器)控制器作用于模型和视图上
- 它可以把我们在 Model 模型上面获取的数据显示到 View 视图上面
- 也可以把 View 传递的数据流向模型对象
- 它使视图与模型分离开。
# 02.Beego 中的控制器
# 2.1 控制器概念
beego 中的控制器本质上是一个结构体,这个结构体里面内嵌了 beego.Controller。
这样的话 我 们 自 定 义 的 控 制 器 就 继 承 了 beego.Controller
继 承 以 后 自 动 拥 有 了 所 有beego.Controller 的属性和方法。
Beego 中的路由机制可以控制具体的 URL 请求执行哪个控制器的方法。
通常每个控制器可以定义很多方法。
路由机制是控制哪个控制器接收哪些请求。
而 beego.Controller 拥有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。
我们可以通过重写的方式来实现这些方法,而我们上面的代码就是重写了 Get 方法
# 2.2 创建控制器
controllers\goods.go
package controllers
import (
"github.com/astaxie/beego"
)
type GoodsController struct {
beego.Controller // 控制器必须要继承 beego.Controller
}
func (c *GoodsController) Get() {
c.TplName = "goods.tpl"
}
func (c *GoodsController) AddGoods() {
c.Ctx.WriteString("增加商品")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.3 配置路由
routers\router.go
package routers
import (
"beegodemo02/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/goods", &controllers.GoodsController{})
beego.Router("/goods/add", &controllers.GoodsController{}, "get:AddGoods")
// get: 表示控制器的方法
// addGoods: 表示处理请求的那个控制器
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 03.GET获取传值
# 3.1 get获取传值方法
GetString(key string) string
GetStrings(key string) []string
GetInt(key string) (int64, error)
GetBool(key string) (bool, error)
GetFloat(key string) (float64, error)
1
2
3
4
5
2
3
4
5
# 3.2 演示
http://127.0.0.1:8080/goods/add?id=1&name=apple
func (c *GoodsController) AddGoods() {
// 1.获取 string 类型
name := c.GetString("name")
fmt.Printf("%v--->%T",name,name) // apple--->string
// 2.获取 int 类型
id, err := c.GetInt("id")
if err != nil {
c.Ctx.WriteString("传入参数错误")
return
}
fmt.Printf("%v--->%T",id,id) // 1--->int
c.Ctx.WriteString("增加商品")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 04.POST获取传值
Post 接受的参数放在结构体中
如果要把表单里的内容赋值到一个 struct 里,除了用上面的方法一个一个获取再赋值外
beego 提供了通过另外一个更便捷的方式
就是通过 struct 的字段名或 tag 与表单字段对应直接解析到 struct
# 4.1 定义控制器
controllers/article.go
package controllers
import (
"fmt"
"github.com/astaxie/beego"
)
type ArticleController struct {
beego.Controller // 控制器必须要继承 beego.Controller
}
// 一:get请求页面
func (c *ArticleController) GetArticle() {
c.TplName = "article.html"
}
// 二:定义 struct 解析表单结构体
type article struct { // 通过 struct 的字段名或 tag 与表单字段对 应直接解析到 struct
Title string `form:"title"` // 商品名称
Content string `form:"content"` // 商品描述
}
// 三:post请求方法
func (c *ArticleController) DoEditArticle() {
a := article{}
err := c.ParseForm(&a)
if err == nil {
fmt.Println(a.Title) // 华为Meta 30
fmt.Println(a.Content) // 拍照神器
c.Ctx.WriteString(a.Title + "----" + a.Content)
}else {
c.Ctx.WriteString("执行增加")
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 4.2 添加路由
routers\router.go
package routers
import (
"beegodemo02/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/article", &controllers.ArticleController{}, "get:GetArticle")
beego.Router("/article/doEdit", &controllers.ArticleController{}, "post:DoEditArticle")
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4.3 article.html
views\article.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>文章页</h1>
<form action="/article/doEdit" method="post">
<p>商品名称:<input type="text" name="title" /></p>
<p>商品描述:<input type="text" name="content" /></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 05.获取post提交的XMl数据
# 5.1 配置copyrequestbody
- 在配置文件里设置
copyrequestbody = true
conf\app.conf
appname = beegodemo02
httpport = 8080
runmode = dev
copyrequestbody = true
1
2
3
4
2
3
4
# 5.2 控制器
package controllers
import (
"encoding/xml"
"fmt"
"github.com/astaxie/beego"
)
type ArticleController struct {
beego.Controller // 控制器必须要继承 beego.Controller
}
// 定义 struct 解析表单结构体,用于解析xml数据
type Article struct {
Title string `xml:"title"`
Content string `xml:"content"`
}
// 获取PostXML数据
func (c *ArticleController) PostXML() {
article := Article{}
var err error
if err = xml.Unmarshal(c.Ctx.Input.RequestBody, &article); err == nil {
c.Data["json"] = article
fmt.Printf("%#v",article) // {Title:"张三", Content:"我是张三"}
} else {
c.Data["json"] = err.Error()
}
c.ServeJSON() // {Title:"张三", Content:"我是张三"}
// c.Ctx.WriteString("测试xml请求")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- 添加路由
func init() {
beego.Router("/xml", &controllers.ArticleController{}, "post:PostXML")
}
1
2
3
2
3
# 5.3 提交Xml数据
<?xml version="1.0" encoding="UTF-8"?>
<article>
<content type="string">我是张三</content>
<title type="string">张三</title>
</article>
1
2
3
4
5
2
3
4
5
演示结果
04.Beego 中 Get 、Post、 Put、 Delete 以及获取参数传值 05.Beego 中的动态路由/正则路由 06.路由跳转
上次更新: 2024/3/13 15:35:10