




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章Go網(wǎng)絡(luò)編程Socket編程01Socket概述Socket概述Socket是用于在計(jì)算機(jī)網(wǎng)絡(luò)中兩個(gè)應(yīng)用進(jìn)程間發(fā)送和接收數(shù)據(jù)的端點(diǎn),其中包含通信協(xié)議、目標(biāo)地址、連接狀態(tài)等,作為一種網(wǎng)絡(luò)資源,它本質(zhì)上就是對(duì)傳輸層協(xié)議(TCP/UDP)的運(yùn)用進(jìn)行了一層封裝,讓應(yīng)用程序能夠更方便地使用傳輸層來傳輸數(shù)據(jù)。主流操作系統(tǒng)(Windows/Linux/MacOS等)都提供了統(tǒng)一的套接字抽象編程接口(SocketAPI),開發(fā)人員平時(shí)編寫的網(wǎng)絡(luò)程序大多處于應(yīng)用層,它們直接調(diào)用SocketAPI接口進(jìn)行通信,故Socket在網(wǎng)絡(luò)中所處的位置大致位于應(yīng)用層的底部、傳輸層之上(如圖所示),起到連接這兩層的關(guān)鍵作用。02TCP程序設(shè)計(jì)1.TCP原理2.TCP編程TCP程序設(shè)計(jì)1.TCP原理一個(gè)典型的TCP傳輸文件的過程如下:(1)首先啟動(dòng)服務(wù)器,一段時(shí)間后啟動(dòng)客戶端,它與此服務(wù)器經(jīng)過三次握手后建立連接。(2)此后的一段時(shí)間內(nèi),客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器處理這個(gè)請(qǐng)求,并為客戶端發(fā)回一個(gè)響應(yīng)。這個(gè)過程一直持續(xù)下去,直到客戶端向服務(wù)器發(fā)一個(gè)文件結(jié)束符,并關(guān)閉客戶端連接。(3)接著服務(wù)器也關(guān)閉服務(wù)器端的連接,結(jié)束運(yùn)行或等待一個(gè)新的客戶端連接。以上TCP客戶端與TCP服務(wù)器間的交互時(shí)序如圖。TCP程序設(shè)計(jì)2.TCP編程Go語言TCP編程的通行步驟如下。(1)封裝地址用net.ResolveTCPAddr方法封裝TCP地址,形式為:地址,錯(cuò)誤:=net.ResolveTCPAddr("tcp","主機(jī):端口")返回的“地址”是一個(gè)TCPAddr類型的指針。(2)監(jiān)聽地址服務(wù)器通過net.ListenTCP方法監(jiān)聽第(1)步封裝的TCP地址,等待客戶端的請(qǐng)求,語句形式為:監(jiān)聽器,錯(cuò)誤:=net.ListenTCP("tcp",地址)這里創(chuàng)建的監(jiān)聽器是*TCPListener類型。(3)發(fā)起連接客戶端通過net.DialTCP方法向服務(wù)器監(jiān)聽的地址發(fā)起連接請(qǐng)求,如下:連接,錯(cuò)誤:=net.DialTCP("tcp",nil,地址)返回的“連接”是TCPConn類型的指針。TCP程序設(shè)計(jì)(4)接受連接服務(wù)器在循環(huán)中用監(jiān)聽器的AcceptTCP方法隨時(shí)接受到來的連接請(qǐng)求:連接,錯(cuò)誤:=監(jiān)聽器.AcceptTCP()這里的“連接”是由監(jiān)聽器創(chuàng)建的用于與客戶端Socket連接的結(jié)構(gòu)體,類型也是TCPConn的指針。(5)傳輸數(shù)據(jù)接下來的數(shù)據(jù)傳輸就在雙方連接(TCPConn類型的結(jié)構(gòu)體)對(duì)象之間進(jìn)行,用Read方法接收數(shù)據(jù),Write方法發(fā)送數(shù)據(jù),形如:長度,錯(cuò)誤:=連接.Read(數(shù)據(jù)) //接收數(shù)據(jù)長度,錯(cuò)誤:=連接.Write(數(shù)據(jù)) //發(fā)送數(shù)據(jù)收發(fā)的數(shù)據(jù)都是字節(jié)切片([]byte)類型。TCP程序設(shè)計(jì)【實(shí)例7.1】用TCP實(shí)現(xiàn)客戶端向服務(wù)器上傳文本文件。開發(fā)步驟如下。(1)實(shí)現(xiàn)思路及準(zhǔn)備客戶端首先將要上傳的文件名發(fā)給服務(wù)器,服務(wù)器在自己的資源目錄下創(chuàng)建此名稱的文本文件;然后客戶端將文件內(nèi)容讀取出來發(fā)送到服務(wù)器端,服務(wù)器程序再將傳來的內(nèi)容寫入文件即可。本例以D:\Go\下載Go學(xué)習(xí)資源\2023\08\01下面的“Go語言.txt”文件做測試,服務(wù)器資源目錄為D:\res\files,需要事先創(chuàng)建好。(2)服務(wù)器端開發(fā)編寫服務(wù)器程序代碼如下(file-server.go):(3)客戶端開發(fā)編寫客戶端程序代碼如下(file-client.go):TCP程序設(shè)計(jì)(4)運(yùn)行程序先啟動(dòng)服務(wù)器程序再啟動(dòng)客戶端,在客戶端子窗口提示符處輸入文件名“Go語言”回車,運(yùn)行結(jié)果如圖。此時(shí)進(jìn)入到D:\res\files目錄下可看到上傳的文件“Go語言.txt”。服務(wù)器輸出客戶端輸出03UDP程序設(shè)計(jì)1.UDP原理2.UDP編程UDP程序設(shè)計(jì)1.UDP原理UDP(UserDatagramProtocol,用戶數(shù)據(jù)報(bào)協(xié)議)是一種簡單、輕量、無連接的傳輸協(xié)議,可以用在對(duì)通信可靠性要求不是很高的場合,如以下幾種情形:網(wǎng)絡(luò)數(shù)據(jù)大多為短消息。系統(tǒng)擁有大量客戶端。對(duì)數(shù)據(jù)安全性無特殊要求。網(wǎng)絡(luò)負(fù)載很重,但對(duì)響應(yīng)速度卻要求極高。UDP所收發(fā)數(shù)據(jù)的形式是報(bào)文(Datagram),通信時(shí)UDP客戶端向UDP服務(wù)器發(fā)送一定長度的請(qǐng)求報(bào)文,報(bào)文大小的限制與各系統(tǒng)的協(xié)議實(shí)現(xiàn)有關(guān),但不得超過其下層IP規(guī)定的64KB,UDP服務(wù)器同樣以報(bào)文做出應(yīng)答,如圖。UDP程序設(shè)計(jì)在UDP方式下,客戶端并不與服務(wù)器建立連接,它只負(fù)責(zé)調(diào)用發(fā)送函數(shù)向服務(wù)器發(fā)出數(shù)據(jù)報(bào)。類似地,服務(wù)器也不接受客戶端的連接,只是調(diào)用接收函數(shù)被動(dòng)等待來自某客戶端的數(shù)據(jù)到達(dá)。UDP客戶端與UDP服務(wù)器間的交互時(shí)序如圖。UDP程序設(shè)計(jì)UDP與TCP的比較見表。比較項(xiàng)UDPTCP是否連接無連接面向連接傳輸可靠性不可靠可靠流量控制不提供提供工作方式可以是全雙工全雙工應(yīng)用場合少量數(shù)據(jù)大量數(shù)據(jù)速度快慢UDP程序設(shè)計(jì)2.UDP編程Go語言UDP編程的通行步驟如下。(1)封裝地址用net.ResolveUDPAddr方法封裝UDP地址,形式為:地址,錯(cuò)誤:=net.ResolveUDPAddr("udp","主機(jī):端口")返回的“地址”是一個(gè)UDPAddr類型的指針。(2)監(jiān)聽地址服務(wù)器通過net.ListenUDP方法監(jiān)聽第(1)步封裝的UDP地址,語句為:監(jiān)聽器,錯(cuò)誤:=net.ListenUDP("udp",地址)(3)建立連接客戶端通過net.DialUDP方法與服務(wù)器的監(jiān)聽器建立連接,如下:連接,錯(cuò)誤:=net.DialUDP("udp",nil,地址)返回的“連接”也是UDPConn類型的指針,它無須經(jīng)服務(wù)器接受,直接就能與服務(wù)器端的監(jiān)聽器通信。UDP程序設(shè)計(jì)(4)收發(fā)數(shù)據(jù)UDP數(shù)據(jù)的收發(fā)在服務(wù)器端監(jiān)聽器與客戶端連接(兩者同為UDPConn類型的結(jié)構(gòu)體)之間進(jìn)行,用ReadFromUDP方法接收數(shù)據(jù),WriteToUDP方法發(fā)送數(shù)據(jù),形如:長度,地址,錯(cuò)誤:=連接.ReadFromUDP(數(shù)據(jù)) //接收數(shù)據(jù)連接.WriteToUDP(數(shù)據(jù),地址) //發(fā)送數(shù)據(jù)UDP收發(fā)的數(shù)據(jù)也都是字節(jié)切片([]byte)類型。【實(shí)例7.2】用UDP模擬即時(shí)通訊軟件(如微信、QQ等)的用戶加入群聊時(shí)與服務(wù)器的交互。開發(fā)步驟如下。(1)服務(wù)器端開發(fā)編寫服務(wù)器程序代碼如下(group-server.go):(2)客戶端開發(fā)編寫客戶端程序代碼如下(group-client.go):UDP程序設(shè)計(jì)(3)運(yùn)行程序先啟動(dòng)服務(wù)器程序再啟動(dòng)客戶端,在客戶端子窗口提示符處輸入用戶名“周何駿”回車,運(yùn)行結(jié)果如圖。服務(wù)器輸出客戶端輸出第7章Go網(wǎng)絡(luò)編程HTTP編程01最簡單的HTTP程序最簡單的HTTP程序Go語言有net/http包專用于實(shí)現(xiàn)HTTP功能,一個(gè)最簡單的HTTP程序由服務(wù)器和客戶端兩部分組成,客戶端向服務(wù)器上的復(fù)用器發(fā)出HTTP請(qǐng)求,復(fù)用器根據(jù)請(qǐng)求的URL找到預(yù)先注冊(cè)的對(duì)應(yīng)處理器,將請(qǐng)求交給處理器處理,處理器執(zhí)行程序邏輯得到結(jié)果,再將結(jié)果寫入HTTP響應(yīng)體后返回給客戶端,整個(gè)過程如圖。最簡單的HTTP程序這個(gè)過程的Go語言實(shí)現(xiàn)方式如下。(1)服務(wù)器服務(wù)器端需要編寫實(shí)現(xiàn)一個(gè)處理器函數(shù),將這個(gè)函數(shù)注冊(cè)到復(fù)用器中,然后在指定服務(wù)地址上開啟監(jiān)聽,等待客戶端請(qǐng)求的到來。①實(shí)現(xiàn)處理器實(shí)現(xiàn)處理器就是編寫相應(yīng)的處理器函數(shù),處理器函數(shù)有固定類型的兩個(gè)參數(shù),寫法為:func函數(shù)名(參數(shù)1http.ResponseWriter,參數(shù)2*http.Request){ ...//執(zhí)行處理邏輯的代碼}②注冊(cè)處理器用戶編寫的處理器必須注冊(cè)才能使用,net/http包提供一個(gè)HandleFunc函數(shù)用于在指定的URL路徑上注冊(cè)處理器,語句寫法為:http.HandleFunc(URL路徑,函數(shù)名)最簡單的HTTP程序③開啟監(jiān)聽一切準(zhǔn)備就緒后,服務(wù)器調(diào)用ListenAndServe函數(shù)開啟監(jiān)聽,就可以向客戶端提供服務(wù)了,語句如下:http.ListenAndServe(地址,nil)如果需要對(duì)服務(wù)器進(jìn)行更多配置,可先創(chuàng)建一個(gè)http.Server結(jié)構(gòu)體對(duì)象,指定對(duì)其特定的參數(shù)進(jìn)行初始化,然后再調(diào)用ListenAndServe函數(shù),代碼形如://配置服務(wù)器server:=&http.Server{
參數(shù)1:值1,
參數(shù)2:值2, ...
參數(shù)n:值n,}server.ListenAndServe() //開啟監(jiān)聽最簡單的HTTP程序(2)客戶端客戶端需要能創(chuàng)建HTTP請(qǐng)求和解析HTTP響應(yīng)。①創(chuàng)建HTTP請(qǐng)求Go使用NewRequest函數(shù)創(chuàng)建HTTP請(qǐng)求,語句為:請(qǐng)求,錯(cuò)誤:=http.NewRequest(方法,URL,請(qǐng)求體)②解析HTTP響應(yīng)net/http包中提供了一個(gè)模擬客戶端的Client結(jié)構(gòu)體,通過調(diào)用其Do方法來獲取一個(gè)HTTP請(qǐng)求對(duì)應(yīng)的響應(yīng),語句如下:客戶端:=&http.Client{}響應(yīng),錯(cuò)誤:=客戶端.Do(請(qǐng)求)Go對(duì)最常用的GET和POST請(qǐng)求還做了進(jìn)一步封裝,因此也可以不用模擬客戶端而直接通過Get或Post函數(shù)獲取到響應(yīng),例如:響應(yīng),錯(cuò)誤:=http.Get(URL)最簡單的HTTP程序【實(shí)例7.3】服務(wù)器在收到請(qǐng)求后向客戶端返回一句話:
“Hello,我愛Go語言!@easybooks”。開發(fā)步驟如下。(1)服務(wù)器編寫服務(wù)器程序代碼如下(hello-server.go):packagemainimport( "fmt" "net/http" //Go語言HTTP編程包)//實(shí)現(xiàn)處理器funcsayhello(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,我愛Go語言!@easybooks\n") //w.Write([]byte("Hello,我愛Go語言!@easybooks\n")) //也可以用這句}
funcmain(){ http.HandleFunc("/hello",sayhello) //注冊(cè)處理器 http.ListenAndServe(":8080",nil) //開啟監(jiān)聽 //或者用下面這段代碼 //server:=&http.Server{ // Addr:":8080", //配置地址參數(shù) //} //server.ListenAndServe()}最簡單的HTTP程序(2)客戶端編寫客戶端程序代碼如下(hello-client.go):packagemainimport( "fmt" "io/ioutil" "net/http" //Go語言HTTP編程包)
funcmain(){ //創(chuàng)建HTTP請(qǐng)求 req,_:=http.NewRequest("GET",":8080/hello",nil) //解析HTTP響應(yīng) client:=&http.Client{} rsp,_:=client.Do(req)
//rsp,_:=http.Get(":8080/hello") //或者用這句替代上面3句 //輸出顯示響應(yīng)體中的數(shù)據(jù)內(nèi)容 contents,_:=ioutil.ReadAll(rsp.Body) fmt.Println(string(contents))}最簡單的HTTP程序(3)運(yùn)行程序先啟動(dòng)服務(wù)器程序再啟動(dòng)客戶端,從客戶端子窗口中可看到輸出,或者通過瀏覽器訪問:8080/hello也能看到同樣的輸出內(nèi)容,運(yùn)行結(jié)果如圖。客戶端輸出瀏覽器輸出02使用模板引擎使用模板引擎網(wǎng)頁本質(zhì)上是一個(gè)HTML文檔,其中大部分內(nèi)容(如框架、樣式、主題、頁尾聲明等)都是固定不變的,變化的只是業(yè)務(wù)數(shù)據(jù),于是可將不變的部分提取出來作為“模板”,而可變部分則由處理器在運(yùn)行時(shí)提供數(shù)據(jù),借助模板引擎渲染來合成動(dòng)態(tài)網(wǎng)頁,如圖所示。使用模板引擎Go語言內(nèi)置了文本模板引擎text/template包,開發(fā)使用模板引擎的HTTP程序的通行步驟如下。(1)定義模板模板文件通常是.html網(wǎng)頁文件,也可以是.tmpl或.tpl后綴的文件,但都必須使用UTF-8編碼。用戶要按一定的語法規(guī)則編寫模板內(nèi)容,基本規(guī)則如下:模板中使用“{{”和“}}”來包裹和標(biāo)識(shí)需要傳入的數(shù)據(jù)。傳給模板的數(shù)據(jù)可以通過點(diǎn)號(hào)(.)來訪問。如果是復(fù)合類型的數(shù)據(jù),則可以通過“{{.字段名}}”來訪問它的字段。除“{{”和“}}”包裹的內(nèi)容外,其他內(nèi)容均不做修改原樣輸出。使用模板引擎(2)解析模板解析模板使用ParseFiles函數(shù),該函數(shù)接收模板文件名作為參數(shù),返回一個(gè)模板對(duì)象(Template)類型的指針,調(diào)用語句如下:模板對(duì)象,錯(cuò)誤:=template.ParseFiles(模板文件)(3)渲染模板最后,通過調(diào)用模板對(duì)象的Execute方法來渲染模板,語句如下:模板對(duì)象.Execute(HTTP響應(yīng)體,數(shù)據(jù))使用模板引擎【實(shí)例7.4】使用模板引擎在瀏覽器中輸出一句話:
“Hello,我愛Go語言!@easybooks”。開發(fā)步驟如下。(1)定義模板在當(dāng)前GoLand項(xiàng)目目錄下創(chuàng)建模板文件,編寫內(nèi)容如下(hello-view.html):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>我喜愛的編程語言</title><style>.myfont{font-family:"華文楷體";font-size:x-large;font-weight:bold;color:limegreen;}</style></head><body><divclass="myfont">Hello,我愛{{.Language}}語言!@{{.User}}</div></body></html>使用模板引擎(2)解析、渲染模板解析和渲染模板的代碼都寫在服務(wù)器的處理器函數(shù)中,如下(hello-template.go):packagemainimport( "net/http" "text/template" //Go語言模板引擎包)typeContentsstruct{ //存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)體 Languagestring Userstring}//處理器函數(shù)funcrenderhello(whttp.ResponseWriter,req*http.Request){ tmpl,_:=template.ParseFiles("./hello-view.html") //解析模板 contents:=Contents{ Language:"Go", User:"easybooks", } //產(chǎn)生數(shù)據(jù)內(nèi)容 tmpl.Execute(w,contents) //渲染模板}
funcmain(){ http.HandleFunc("/hello",renderhello) http.ListenAndServe(":8080",nil)}使用模板引擎(3)運(yùn)行程序啟動(dòng)服務(wù)器,通過瀏覽器訪問:8080/hello,運(yùn)行結(jié)果如圖。瀏覽器輸出客戶端輸出03請(qǐng)求多路復(fù)用請(qǐng)求多路復(fù)用多路復(fù)用的HTTP程序工作過程如圖。請(qǐng)求多路復(fù)用【實(shí)例7.5】使用多路復(fù)用器分別以中英文輸出對(duì)Go語言的問候。編寫服務(wù)器程序代碼如下(hello-handle.go):packagemainimport( "fmt" "net/http")typeContentsstruct{ //作為處理器類的結(jié)構(gòu)體 Languagestring Userstring}//處理器的ServeHTTP方法func(cContents)ServeHTTP(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,c.Language)}
funcmain(){ mux:=http.NewServeMux() //創(chuàng)建多路復(fù)用器 mux.Handle("/hello/cn",Contents{Language:"您好,我愛Go語言!@易斯\n"}) mux.Handle("/hello/en",Contents{Language:"Hello,IloveGolanguage!@easybooks\n"}) //不同的URL分別定向至不同的處理器實(shí)例 server:=&http.Server{ Addr:":8080", Handler:mux, //配置復(fù)用器 } server.ListenAndServe()}請(qǐng)求多路復(fù)用或者,也可以采用處理器函數(shù)的方式來實(shí)現(xiàn)多路復(fù)用功能,如下(hello-handlefunc.go):packagemainimport( "fmt" "net/http")
funccnHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"您好,我愛Go語言!@易斯\n")} //處理器函數(shù)1(輸出中文問候語)funcenHandler(whttp.ResponseWriter,req*http.Request){ fmt.Fprintf(w,"Hello,IloveGolanguage!@easybooks\n")} //處理器函數(shù)2(輸出英文問候語)
funcmain(){ mux:=http.NewServeMux() //創(chuàng)建多路復(fù)用器 //將兩個(gè)處理器函數(shù)注冊(cè)到復(fù)用器中 mux.HandleFunc("/hello/cn",cnHandler) mux.HandleFunc("/hello/en",enHandler) server:=&http.Server{ Addr:":8080", Handler:mux, //配置復(fù)用器 } server.ListenAndServe()}請(qǐng)求多路復(fù)用以上兩個(gè)程序的運(yùn)行方式和結(jié)果都是完全一樣的。啟動(dòng)服務(wù)器,通過瀏覽器訪問:8080/hello/cn,輸出中文問候語;訪問:8080/hello/en則輸出英文問候語,運(yùn)行結(jié)果如圖。輸出中文問候語輸出英文問候語04表單提交處理表單提交處理在HTTP編程中,可從處理器函數(shù)的第2個(gè)參數(shù)(HTTP請(qǐng)求體)中獲取頁面表單提交的數(shù)據(jù),只要執(zhí)行語句:請(qǐng)求體.ParseForm()即可解析出表單數(shù)據(jù),數(shù)據(jù)是鍵值對(duì)的形式,可用如下語句得到對(duì)應(yīng)鍵的值:值:=請(qǐng)求體.Form.Get(鍵名)【實(shí)例7.6】在表單中輸入編程語言及用戶名,提交后用模板顯示對(duì)該語言的問候。開發(fā)步驟如下。(1)定義模板本例復(fù)用前面實(shí)例已定義好的模板hello-view.html,內(nèi)容略。表單提交處理(2)開發(fā)表單頁編寫表單頁的源碼如下(hello-submit.html):<html><head><title>我喜愛的編程語言</title></head><body><formaction="/hello"method="post">
語
言:<inputtype="text"name="language"><br>
用
戶:<inputtype="text"name="user"><br>
<inputtype="submit"value="確定"></form></body></html>表單提交處理(3)開發(fā)后臺(tái)程序編寫后臺(tái)服務(wù)器的程序代碼如下(hello-post.go):(4)運(yùn)行程序啟動(dòng)服務(wù)器,通過瀏覽器訪問:8080/hello,出現(xiàn)表單頁,在頁面表單中輸入語言和用戶,單擊“確定”按鈕提交,轉(zhuǎn)到模板頁輸出對(duì)該語言的問候,運(yùn)行過程如圖。提交表單輸出問候第7章Go網(wǎng)絡(luò)編程Web開發(fā)基礎(chǔ)01Web程序架構(gòu)模式1.開發(fā)視圖2.開發(fā)模型和控制器3.運(yùn)行程序Web程序架構(gòu)模式傳統(tǒng)網(wǎng)站的Web應(yīng)用程序普遍采用MVC架構(gòu)模式,它將軟件系統(tǒng)分為3個(gè)基本部分:模型:定義系統(tǒng)所用的數(shù)據(jù)結(jié)構(gòu)并封裝對(duì)數(shù)據(jù)的處理方法。它可訪問數(shù)據(jù)庫,有對(duì)數(shù)據(jù)直接操作的權(quán)限。視圖:實(shí)現(xiàn)Web前端界面,有目的地組織和顯示數(shù)據(jù)。它只關(guān)注數(shù)據(jù)的樣式和顯示效果而不管其內(nèi)容的正確性,也不包含處理數(shù)據(jù)的業(yè)務(wù)邏輯??刂破鳎河糜诳刂茟?yīng)用程序的流程、處理與程序業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)。它接受客戶端的請(qǐng)求、與模型和視圖交互并做出響應(yīng),在系統(tǒng)不同層面間起到組織協(xié)調(diào)作用。在Go語言開發(fā)的Web程序中,用于頁面顯示的模板和模板引擎就是視圖;復(fù)用器及其上注冊(cè)的諸多處理器一起構(gòu)成整個(gè)系統(tǒng)的控制器部分;而為了存儲(chǔ)數(shù)據(jù)內(nèi)容所定義的結(jié)構(gòu)體(類)及其操作數(shù)據(jù)的方法則是模型。Web程序架構(gòu)模式一個(gè)能完整體現(xiàn)MVC架構(gòu)的典型Go程序的組成結(jié)構(gòu)如圖。Web程序架構(gòu)模式【實(shí)例7.7】在MySQL數(shù)據(jù)庫中有一個(gè)favlang(愛好語言)表,其中存有一些用戶及各自所喜愛的編程語言名,如圖。Web程序架構(gòu)模式1.開發(fā)視圖(1)定義模板本例依然復(fù)用前面實(shí)例已定義好的模板hello-view.html,內(nèi)容略。(2)設(shè)計(jì)表單頁編寫表單頁的源碼如下(hello-query.html):<html><head><title>我喜愛的編程語言</title></head><body><formaction="/hello"method="post">
用
戶:<inputtype="text"name="user"><inputtype="submit"value="確定"></form></body></html>Web程序架構(gòu)模式2.開發(fā)模型和控制器本例的模型是一個(gè)名為FavLang的結(jié)構(gòu)體(對(duì)應(yīng)數(shù)據(jù)庫favlang表),它有一個(gè)getLang方法可獲取數(shù)據(jù)庫中給定用戶所喜愛的編程語言名;控制器是一個(gè)名為langController的處理器函數(shù)。模型和控制器部分的代碼都寫在后臺(tái)服務(wù)器程序中,如下(hello-mvc.go):3.運(yùn)行程序啟動(dòng)服務(wù)器,通過瀏覽器訪問:8080/hello,出現(xiàn)表單頁,在頁面表單中輸入用戶名,單擊“確定”按鈕提交,轉(zhuǎn)到模板頁輸出此用戶對(duì)該語言的問候,運(yùn)行過程如圖。提交表單輸出問候02Gin框架1.安裝Gin框架2.開發(fā)視圖3.開發(fā)模型和路由引擎4.運(yùn)行程序Gin框架(1)采用路由引擎實(shí)現(xiàn)C(控制器)功能路由引擎(gin.Engine)是Gin提供的一種中間件,乃是整個(gè)框架的核心,在用Gin框架編寫的程序一開始就要通過Default方法創(chuàng)建一個(gè)路由引擎的實(shí)例,它的作用相當(dāng)于Go語言HTTP程序中的復(fù)用器,可通過不同的請(qǐng)求方法將URL關(guān)聯(lián)到對(duì)應(yīng)的處理器函數(shù),語句如下:路由引擎=gin.Default()路由引擎.方法(URL路徑,函數(shù)名)這里的“方法”對(duì)應(yīng)GET、POST、PUT、DELETE等HTTP請(qǐng)求方法,“函數(shù)名”是需要由用戶自定義實(shí)現(xiàn)的處理器函數(shù)。然后,用Run方法啟動(dòng)路由引擎,相當(dāng)于開啟ListenAndServe監(jiān)聽:路
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)教研組年度工作總結(jié)與未來規(guī)劃
- 四年級(jí)上冊(cè)心理健康安全教學(xué)計(jì)劃
- 城市青少年足球培訓(xùn)課程計(jì)劃
- 第二講內(nèi)部控制理論沿革
- 農(nóng)業(yè)保險(xiǎn)高質(zhì)量發(fā)展-水平測度空間收斂及影響因素分析
- 一年級(jí)班主任多元化教學(xué)策略計(jì)劃
- 抑制禾谷鐮刀菌的解淀粉芽孢桿菌的篩選、鑒定及應(yīng)用評(píng)價(jià)
- 企業(yè)中秋節(jié)員工福利發(fā)放通知范文
- 視觸覺融合的服務(wù)機(jī)器人抓取感知方法研究
- 螺旋管內(nèi)非共沸烴類介質(zhì)冷凝流動(dòng)換熱特性及關(guān)聯(lián)式研究
- 感染性疾病科的操作規(guī)程
- 職場健身知識(shí)講座
- PTIO和ABTS自由基清除實(shí)驗(yàn)操作指南-李熙燦-曾婧媛
- PCI患者的術(shù)后護(hù)理課件
- 2024年供應(yīng)鏈可持續(xù)性培訓(xùn)資料
- 丁麗娟《數(shù)值計(jì)算方法》五章課后實(shí)驗(yàn)題答案(源程序很詳細(xì)-且運(yùn)行無誤)
- WS-T 10001-2023 疾病預(yù)防控制機(jī)構(gòu)實(shí)驗(yàn)室儀器設(shè)備配置和管理
- 成人住院患者跌倒評(píng)估與預(yù)防(團(tuán)體標(biāo)準(zhǔn))解讀
- 通止規(guī)設(shè)計(jì)公差自動(dòng)計(jì)算表
- 靜設(shè)備安裝質(zhì)量控制過程
- 橋梁亮化施工流程圖
評(píng)論
0/150
提交評(píng)論