范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

GO语言(二十)编写Web应用程序(中)

  编辑页面
  wiki 需要能编辑页面。让我们创建两个新的处理程序:一个命名editHandler为显示"编辑页面"表单,另一个命名saveHandler为保存通过表单输入的数据。
  首先,我们将它们添加到main(): func main() {     http.HandleFunc("/view/", viewHandler)     http.HandleFunc("/edit/", editHandler)     http.HandleFunc("/save/", saveHandler)     log.Fatal(http.ListenAndServe(":8080", nil)) }
  editHandler函数加载页面(或者,如果它不存在,则创建一个空Page结构),并显示一个 HTML 表单。 func editHandler(w http.ResponseWriter, r *http.Request) {     title := r.URL.Path[len("/edit/"):]     p, err := loadPage(title)     if err != nil {         p = &Page{Title: title}     }     fmt.Fprintf(w, "

Editing %s

"+ "", p.Title, p.Title, p.Body) }   这个函数可以正常工作,但所有硬编码的 HTML 都很丑陋。当然,还有更好的方法。   html/template包   该html/template包是 Go 标准库的一部分。我们可以使用html/template将 HTML 保存在单独的文件中,允许我们更改编辑页面的布局,而无需修改底层 Go 代码。   首先,我们必须添加html/template到导入列表中。我们也不会再使用fmt了,所以我们必须删除它。 import ( "html/template" "os" "net/http" )   让我们创建一个包含 HTML 表单的模板文件。打开一个名为 的新文件edit.html,并添加以下行:

Editing {{.Title}}

  修改editHandler以使用模板,而不是硬编码的 HTML: func editHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/edit/"):] p, err := loadPage(title) if err != nil { p = &Page{Title: title} } t, _ := template.ParseFiles("edit.html") t.Execute(w, p) }   template.ParseFiles函数将读取内容 edit.html并返回一个*template.Template。   t.Execute方法执行模板,将生成的 HTML 写入http.ResponseWriter。.Title和.Body标识符指的是 p.Title和p.Body。   模板指令用双花括号括起来。该printf "%s" .Body指令是一个函数调用,它以字符串而不是字节流的形式输出,与fmt.Printf一致。html/template包有助于确保模板操作仅生成安全且外观正确的 HTML。例如,它会自动转义任何大于号 ( >),将其替换为 > ,以确保用户数据不会破坏 HTML 表单。   由于我们现在正在使用模板,让我们为 viewHandler调用创建一个模板view.html:

{{.Title}}

[edit] {{printf "%s" .Body}}   相应修改viewHandler: func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, _ := loadPage(title) t, _ := template.ParseFiles("view.html") t.Execute(w, p) }   请注意,我们在两个处理程序中使用了几乎完全相同的模板代码。让我们通过将模板代码移动到它自己的函数来删除这个重复: func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { t, _ := template.ParseFiles(tmpl + ".html") t.Execute(w, p) }   并修改处理程序以使用该功能: func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, _ := loadPage(title) renderTemplate(w, "view", p) }func editHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/edit/"):] p, err := loadPage(title) if err != nil { p = &Page{Title: title} } renderTemplate(w, "edit", p) }   如果我们在main中注释掉我们未实现的保存处理程序的注册 ,我们可以再次构建和测试我们的程序。   处理不存在的页面   如果你访问/view/APageThatDoesntExistloadPage呢?您将看到一个包含 HTML 的页面。这是因为它忽略了错误返回值, 并继续尝试填写没有数据的模板。相反,如果请求的页面不存在,它应该将客户端重定向到编辑页面,以便可以创建内容: func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] p, err := loadPage(title) if err != nil { http.Redirect(w, r, "/edit/"+title, http.StatusFound) return } renderTemplate(w, "view", p) }   http.Redirect函数向 HTTP 响应 添加 HTTP 状态代码 http.StatusFound(302) 和一个新的位置。 保存页面   saveHandler函数将处理位于编辑页面上的表单的提交。取消main注释中的相关行后 ,让我们实现处理程序: func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/save/"):] body := r.FormValue("body") p := &Page{Title: title, Body: []byte(body)} p.save() http.Redirect(w, r, "/view/"+title, http.StatusFound) }   页面标题(在 URL 中提供)和表单的唯一字段 Body存储在一个新的Page. 然后调用该save()方法将数据写入文件,并将客户端重定向到/view/页面。   返回的值FormValue是string类型。我们必须将该值转换为[]byte,然后才能将其放入Page结构中。我们用[]byte(body)来执行转换。   错误处理   在我们的程序中有几个地方会忽略错误。这是不好的做法,尤其是因为当确实发生错误时,程序会出现意外行为。更好的解决方案是处理错误并将错误消息返回给用户。这样,如果出现问题,服务器将完全按照我们想要的方式运行,并且可以通知用户。   首先,让我们处理以下错误renderTemplate: func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { t, err := template.ParseFiles(tmpl + ".html") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } err = t.Execute(w, p) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }   http.Error函数发送指定的 HTTP 响应代码(在本例中为"内部服务器错误")和错误消息。   现在让我们修复saveHandler: func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/save/"):] body := r.FormValue("body") p := &Page{Title: title, Body: []byte(body)} err := p.save() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } http.Redirect(w, r, "/view/"+title, http.StatusFound) }   p.save()期间发生的任何错误都会报告给用户。


周小川三不为数字人民币正名随着场景的逐步铺开和试点的不断深入,如今,数字人民币引发越来越多的讨论究竟数字人民币如何实现可控匿名?是否会取代微信支付宝等第三方支付?又将如何推动人民币国际化?率先落地哪些场景?美国加州公司研发无人驾驶帆船应对地球气候变化威胁气候变化正在重塑地球,导致海平面上升,北极冰融化,全球气温升高。根据NASA的数据,全球平均海平面在过去100年里上升了7英寸。北极夏季海冰已经缩减到有记录以来的最低水平,自2002000价位5G手机性能排名榜首15GB256GB,高通骁龙870,66W快充随着华为P50,以及荣耀50系列发布会越来越近,整个手机市场将呈现两种节奏。第一个节奏就是,华为P50仍然采用麒麟9000芯片,但是供货量会相对进一步减少,第二个节奏是荣耀搭载了高微信双开太简单了!学会这几种方法,就能同时登录2个微信分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园!我们在生活中,几乎每天都会用到微信,但是一台设备只能登录一个微信,如果你想登录多个微信号,该怎么办呢?今天就来造车不如卖电池!蔚来等还在排队为他打工,他已当上香港首富文华商韬略七月他不仅让李嘉诚让位,还让一众企业家排队为他打工。他把一生都当做赌局,却能逢赌必赢。他就是曾毓群。2011年曾毓群创办宁德时代,仅用十年,市值就达到了8500多亿。曾毓宁要曹县一张床,不要北京一套房。爆火的曹县到底什么来头?近日,曹县梗在网络上迅速走红。5月17日,曹县县长针对曹县走红作出回应欢迎各位到北上广曹中的曹县来看一看,看看真实的曹县。这句话很凡尔赛,也说明了曹县如今确实也成为了现象级的网红城行为堪比辣笔小球!多人侮辱袁隆平院士被抓,互联网岂是法外之地5月22日,是一个悲伤的日子,这一天,袁隆平院士永远离开了我们。大家纷纷在社交媒体上发文悼念袁老先生时,却有人倒行逆施,发文污蔑辱骂他。天津一网友在朋友圈发表了侮辱性言论,造成了恶当今时代想要做好电商,必须要了解以下几点,助你互联网思维突破哈喽大家好,我是云众秋风,一个90后电商创业者,今天给大家分享一下如何突破电商思维,帮助你做互联网走的更远!在当今的时代,如果想要做好电商,必须要了解以下几点,绝大多数电商的人都还5000人加入小米,入职小米到底是怎样的体验?2021年校招训练,在小米北京总部已经举行,看起来现场还是蛮有气氛的,雷军和许多小米高管都出席了现场,同时在这次训练会中,雷军还亲自表示希望看到30岁集团高管的出现,雷军始终保持一华为注册麒麟处理器商标曝内部正研发3nm芯片麒麟9010近两年华为在先进的科技领域发展迅速,尤其是在5G技术方面已经领先全球。这也让美国十分忌惮,所以美国以国家安全为由将华为列入实体清单,禁止使用美国技术或者设备的公司为华为提供芯片等。多家机器人公司跌落神坛文大峻2021年转眼已快过半,中国工业机器人行业经历近十几年的发展,已经从最初的追赶变成如今的蓬勃竞艳,整体规模逐年上涨,且连续多年成为全球最大的市场,但风口时代早已过去,曾经风云
拜登表示成功避免圣诞节供应链危机据报道,美国总统拜登表示,在周三与美国官员和包括联邦快递在内的私营企业举行会议之前,美国为消除供应链混乱所采取的行动,已经成功避免了圣诞节前的危机。白宫表示,在推动港口24小时运营英特尔不是道歉,而是又一次挑衅!吃饭砸锅的行为,必须要遏制住据环球网报道,在中国外交部今天(12月23日)举行的例行记者会上,有记者就芯片巨头企业英特尔,今天对自身不当涉疆言论致歉一事,询问中方态度,对此,中国外交部发言人赵立坚回应称我们(给女朋友讲某宝是如何设计用户权限管理的(一)一概述java应用系统设计过程中,用户认证用户授权鉴权是绕不过去的话题。如果这个权限管理的设计,没有做到与业务系统的隔离,拓展性不够强,很容易就会拖后腿。这个问题应该做过开发的同学OK直接K。O用户,无法平仓致用户爆仓6000万!!吃相太难看6000万这个数字对于普通人来说可能是一辈子都达到不了的数字,可是在币圈却是每天都实实在在流通着,这一秒拥有下一秒可能就失去了,相信是谁也无法接受,更不用说这种不公平的规则之下的强还在讨论NFT区块链元宇宙?Web3已晋升年度科技热词或是互联网终极形态科创板日报(上海,编辑宋子乔)讯,当大家还在热议元宇宙NFT区块链的时候,又一个新词已成为焦点。国外媒体近日评出了2021年12大科技热词,Web3榜上有名,特斯拉首席执行官马斯克中印再起矛盾?莫迪接二连三对中企赶尽杀绝,却不知自己多愚蠢据印度商业标准报报道,在12月23日的时候,印度财政部税收局对当地的的中国企业进行了一次重大的打击。整个在印度的手机制造商和分销商都包括在内,其中,有来自中国的手机制造商OPPO小为新能源汽车注入发展正能量来源经济日报完全想不明白,现在大家为什么还买油车,除了能闻点汽油味,别的还有什么好?听个响?蔚来汽车创始人董事长李斌没想到,他在蔚来日NIODAY2021的一句讲话,竟引发了争议。数据结构队列的链式存储和链式存储队列的顺序存储头文件dynamicArray。hpragmaonceincludestdio。hincludestring。hincludestdlib。h动态数组结构体strucMIUI13首批支持,小米骁龙870旗舰迎来降价对于智能手机来说其性能是硬件配置与操作系统软件互相配合协调的结果,有iPhone手机用户表示自己之所以选择iPhone手机是因为iOS系统,可见操作系统的重要性。在安卓系统方面小米不用等新款手机了,这四款旗舰已经开始清仓甩货,比新款要实用随着新款手机的到来,可能这次又要让我们失望了。比如小米12随着这两天参数的不断曝光,我们也可以看到今年他的标配版本将不会采用2K屏幕,也就是说是素质还不如上一代,虽然表面说是为了轻明年机圈这些值得期待的顶级旗舰,神仙大战,华为终于有新机了上篇给大家盘点了2022年最值得期待的七款机型之三,今天也给大家带来剩余四款的预测,看看究竟明年旗舰机之争,哪款更出色,大家也可以看看哪款更喜欢,为明年换手机提前做准备!三星S22