【go项目01_学习记录07】

学习记录

  • 1 创建博文
    • 1.1 在main.go中添加路由
    • 1.2 构建表单
  • 2 读取表单数据
    • 2.1 完善articlesStoreHandler() 函数
    • 2.2 修改代码,查看区别
  • 3 表单验证
    • 3.1 数据验证
    • 3.2 出错提示

1 创建博文

1.1 在main.go中添加路由

在这里插入图片描述
访问http://localhost:3000/articles/create
在这里插入图片描述

1.2 构建表单

在这里插入图片描述
报错
在这里插入图片描述
router在main函数中定义,但其他函数无法直接识别,需将router定义在函数体外面当成全局变量(包级别的变量)。
在这里插入图片描述
包级别的变量不能使用:=声明并赋值变量
应该使用

var router = mux.NewRouter( )

浏览器访问 localhost:3000/articles/create
在这里插入图片描述
浏览器中查看源码
在这里插入图片描述

2 读取表单数据

2.1 完善articlesStoreHandler() 函数

func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {if err := r.ParseForm(); err != nil{//解析错误,这里应该有错误处理fmt.Fprintf(w,"请提供正确的数据!")return}title := r.PostForm.Get("title")fmt.Fprintf(w,"POST PostForm: %v <br>",r.PostForm)fmt.Fprintf(w,"POST Form: %v <br>",r.Form)fmt.Fprintf(w,"title 的值为: %v <br>", title)
}

访问 localhost:3000/articles/create ,在标题和内容里输入信息:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2 修改代码,查看区别

.
.
.
func articlesCreateHandler(w http.ResponseWriter, r *http.Request) {html := `
<!DOCTYPE html>
<html lang="en">
<head><title>创建文章 —— 我的技术博客</title>
</head>
<body><form action="%s?test=data" method="post"><p><input type="text" name="title"></p><p><textarea name="body" cols="30" rows="10"></textarea></p><p><button type="submit">提交</button></p></form>
</body>
</html>
`storeURL, _ := router.Get("articles.store").URL()fmt.Fprintf(w, html, storeURL)
}
.
.
.

重新打开 localhost:3000/articles/create 并填写数据(注意如果你使用浏览器的回退功能的话,需要重新刷新页面),再次提交:

在这里插入图片描述
Form多了URL参数里的数据

如不想获取所有的请求内容,而是逐个获取的话,这也是比较常见的操作,无需使用 r.ParseForm() 可直接使用 r.FormValue() 和 r.PostFormValue() 方法:

.
.
.
func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "r.Form 中 title 的值为: %v <br>", r.FormValue("title"))fmt.Fprintf(w, "r.PostForm 中 title 的值为: %v <br>", r.PostFormValue("title"))fmt.Fprintf(w, "r.Form 中 test 的值为: %v <br>", r.FormValue("test"))fmt.Fprintf(w, "r.PostForm 中 test 的值为: %v <br>", r.PostFormValue("test"))
}
.
.
.

在这里插入图片描述

3 表单验证

3.1 数据验证

.
.
.
func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {title := r.PostFormValue("title")body := r.PostFormValue("body")errors := make(map[string]string)// 验证标题if title == "" {errors["title"] = "标题不能为空"} else if len(title) < 3 || len(title) > 40 {errors["title"] = "标题长度需介于 3-40"}// 验证内容if body == "" {errors["body"] = "内容不能为空"} else if len(body) < 10 {errors["body"] = "内容长度需大于或等于 10 个字节"}// 检查是否有错误if len(errors) == 0 {fmt.Fprint(w, "验证通过!<br>")fmt.Fprintf(w, "title 的值为: %v <br>", title)fmt.Fprintf(w, "title 的长度为: %v <br>", len(title))fmt.Fprintf(w, "body 的值为: %v <br>", body)fmt.Fprintf(w, "body 的长度为: %v <br>", len(body))} else {fmt.Fprintf(w, "有错误发生,errors 的值为: %v <br>", errors)}
}
.
.
.

errors := make(map[string]string)
这行代码的含义是创建了一个空的map,其中键的类型为string,值的类型也为string。这个map被命名为errors。

访问并输入数据
在这里插入图片描述

在这里插入图片描述
在Java中,一个汉字通常占用两个字节,因为Java中使用的是UTF-16编码,每个字符通常占用16位,即2个字节。这使得Java中处理Unicode字符和汉字比较方便。

在Go语言中,一个汉字通常占用3个字节,因为Go语言中的字符串是以UTF-8格式保存的,而UTF-8编码中一个汉字通常由3个字节表示。

若要按字符个数计算而非字节数,可以使用Go语言中的utf8包中的RuneCountInString()函数来计算。这个函数会返回字符串中Unicode字符的个数,而不是字节数。

修改代码

.
.
.
func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {title := r.PostFormValue("title")body := r.PostFormValue("body")errors := make(map[string]string)// 验证标题if title == "" {errors["title"] = "标题不能为空"} else if utf8.RuneCountInString(title) < 3 || utf8.RuneCountInString(title) > 40 {errors["title"] = "标题长度需介于 3-40"}// 验证内容if body == "" {errors["body"] = "内容不能为空"} else if utf8.RuneCountInString(body) < 10 {errors["body"] = "内容长度需大于或等于 10 个字节"}// 检查是否有错误if len(errors) == 0 {fmt.Fprint(w, "验证通过!<br>")fmt.Fprintf(w, "title 的值为: %v <br>", title)fmt.Fprintf(w, "title 的长度为: %v <br>", utf8.RuneCountInString(title))fmt.Fprintf(w, "body 的值为: %v <br>", body)fmt.Fprintf(w, "body 的长度为: %v <br>", utf8.RuneCountInString(body))} else {fmt.Fprintf(w, "有错误发生,errors 的值为: %v <br>", errors)}
}
.
.
.

网页验证
在这里插入图片描述

在这里插入图片描述

3.2 出错提示

数据验证的逻辑

  1. 正确则存入数据库
  2. 错误则重新显示表单,并显示错误提示

erros大于0时,我们需要将错误信息的参数渲染到HTML中,html/template标准库专门设计解决这种场景。

.
.
.
// ArticlesFormData 创建博文表单数据
type ArticlesFormData struct {Title, Body stringURL         *url.URLErrors      map[string]string
}func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {...// 检查是否有错误if len(errors) == 0 {...} else {html := `
<!DOCTYPE html>
<html lang="en">
<head><title>创建文章 —— 我的技术博客</title><style type="text/css">.error {color: red;}</style>
</head>
<body><form action="{{ .URL }}" method="post"><p><input type="text" name="title" value="{{ .Title }}"></p>{{ with .Errors.title }}<p class="error">{{ . }}</p>{{ end }}<p><textarea name="body" cols="30" rows="10">{{ .Body }}</textarea></p>{{ with .Errors.body }}<p class="error">{{ . }}</p>{{ end }}<p><button type="submit">提交</button></p></form>
</body>
</html>
`storeURL, _ := router.Get("articles.store").URL()data := ArticlesFormData{Title:  title,Body:   body,URL:    storeURL,Errors: errors,}tmpl, err := template.New("create-form").Parse(html)if err != nil {panic(err)}err = tmpl.Execute(w, data)if err != nil {panic(err)}}
}
.
.
.

首先我们定义一个 ArticlesFormData struct,用以给模板文件传输变量时使用。
接下来是构建 ArticlesFormData 里的数据,storeURL 是通过路由参数生成的 URL 路径。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/682049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【16-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

Agent AI智能体的未来:无限可能

文章目录 终结者智能体正反影响自我意识开放心态 终结者 还记得那场人类与天网之间的史诗般的战斗吗&#xff1f;-- 《终结者》系列电影。 《终结者》系列电影是一部标志性的科幻动作系列&#xff0c;以紧张刺激的情节、令人难忘的角色和开创性的视觉效果而闻名。 电影探讨了…

数学建模资料|历年数维杯数学建模竞赛真题及获奖论文汇总

2024年第九届数维杯大学生数学建模挑战赛&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;为了更好的帮助参赛同学了解竞赛的赛制及赛题特点&#xff0c;数乐君今天给大家整理了历年数维杯国赛真题及优秀论文&#xff0c;方便同学们赛前巩固训练&#xff0c;掌握解…

独家新闻:CSCWD 2024会议现场即时报道 天津之眼夜色如梦

会议之眼 快讯 备受瞩目的第27届国际计算机协同计算与设计大会&#xff08;CSCWD 2024&#xff09;于2024年5月8日在中国天津梅江中心皇冠假日酒店盛大开幕&#xff01;来自世界各地的专家学者齐聚一堂&#xff0c;共同探讨和分享在智能设计、制造和协同工作领域的最新研究成果…

堆的应用1——堆排序

一&#xff0c;堆排序 堆排序是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构所设计。 堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父结点。 堆排序可以分为两…

52. 【Android教程】网页视图:WebView

在前面的章节我们所围绕的全部都是纯客户端开发&#xff0c;我们叫 Native 开发。这样的好处就是体验和性能会非常好&#xff0c;但是在实际的使用中我们会发现存在大量的 H5 页面。这样就可以结合 Native / H5 双端的优势完成一个混合开发&#xff0c;而在这种开发模式中首当其…

[华为OD] B卷 树状结构查询 200

题目&#xff1a; 通常使用多行的节点、父节点表示一棵树&#xff0c;比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点 输入描述 第一行输入行数&#xff0c;下面是多行数据&#xff0c;每行以空…

Sarcasm detection论文解析 |基于语义知识和辅助信息增强讽刺检测方法

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0306457322000139?via%3Dihub 论文首页 笔记框架 基于语义知识和辅助信息增强讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Information Processing & Managem…

【独家】武汉市中级职称申报基本条件大揭秘,你符合吗?

【独家】武汉市中级职称申报基本条件大揭秘&#xff0c;你符合吗&#xff1f; 2024年申报武汉市的中级职称条件欠缺看看周边地级市的 2024年4月底在武汉人事考试院发布了关于“武汉市若干专业技术职务水平能力测试报名工作的通知”。武汉市建筑类职称水平能力测试要开始了。 武…

Windows平台PyCharm之PySide6开发环境搭建与配置

PySide6 是一个用于创建跨平台 GUI 应用程序的库&#xff0c;它是 Qt for Python 的官方库。Qt 是一个跨平台的 C 应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序。PySide6 允许开发者使用 Python 语言访问 Qt 的功能&#xff0c;从而…

8、基本数据类型转换(自动转换和强制转换)

基本类型转换 1、自动类型转换2、强制类型转换 1、自动类型转换 定义&#xff1a;当Java程序在进行赋值或者运算时&#xff0c;精度小的类型会自动转换成精度大的数据类型&#xff0c;这个就是自动类型转换。&#xff08;自动小转大&#xff09; 背多芬&#xff1a; 这里要明…

探讨关于AutoPSA里CII算法的结构荷载

UKP3D,AutoPDMS导出应力计算文件至管道应力分析软件分析&#xff0c;如下图AutoPSA.用户咨询如图 1.如果计算时考虑水重&#xff0c;把工况中的w改为ww&#xff1b; 2.CAD表格中结构荷载不是单纯的1.5倍&#xff0c;是参照仿GLIF的算法&#xff0c;计算了水重的&#xff08;根…