完成项目后的目录结构:

完成项目后的源码:

package mainimport ("fmt""html/template""net/http"
)func IndexHandler(w http.ResponseWriter, r *http.Request) {t := template.Must(template.ParseFiles("views/index.html"))t.Execute(w, "")
}
func main() {http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static"))))http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages"))))http.HandleFunc("/main", IndexHandler)fmt.Println("在监听:http://localhost:8080")err := http.ListenAndServe(":8080", nil)if err != nil {panic(err)}
}

1、

安装go环境
我是Mac环境,具体步骤,略
[复杂一点的这里是go mod相关配置]

2、IDE:Goland

选择go models,因为它会自动创建go mod,之后的项目里用的包都放在这里,很方便,比gopath要好用


下载html模版,之后的几天里都会用到,我是结合视频做的
b站链接
如果看我写的贴子运行对不上的话,去看视频,虽然很慢

链接:https://pan.baidu.com/s/16N7F0ZlF5MLeaFE_WWVNOA
提取码:t3p4

解压之后,把day1里的views文件夹复制到goland里

接着开始写main.go

package mainimport ("fmt""html/template""net/http"
)func IndexHandler (w http.ResponseWriter, r *http.Request) {t := template.Must(template.ParseFiles("views/index.html"))t.Execute(w, "")
}func main() {http.HandleFunc("/main", IndexHandler)fmt.Println("在监听:http://localhost:8080")err := http.ListenAndServe(":8080", nil)if err != nil {panic(err)}
}

详细解释一下,对于小白来说

首先第一句

:http.HandleFunc(“/main”, IndexHandler)

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))HandleFunc注册一个处理器函数handler和对应的模式pattern(注册到DefaultServeMux)。

就是说你点开\main结尾的网址,http://localhost:8080\main ,处理你的请求的处理机就是IndexHandler,那么处理机是什么呢?大概相当于电脑之于CPU,浏览器之于IndexHandler

第二句:

err := http.ListenAndServe(“:8080”, nil)
if err != nil {
panic(err)
}

func ListenAndServe(addr string, handler Handler) error

ListenAndServe监听TCP地址addr “:8080”,使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。

DefaultServeMux的意思是用包里自己带的多路复用器,这个复用器也可以自己写,那参数nil就要改成你写的那个,咱们就直接默认,不搞花里胡哨

看第三句:

func IndexHandler (w http.ResponseWriter, r *http.Request) {}

这是一个处理器,http.ResponseWrite是回应报文之类的东西,我不太懂,http.Request就是请求报文了。
经常性的用法就是在
http.Request里获取很多很多数据,表单呐文件呐,反正请求报文里边的东西都可以取出来,用户在浏览器提交的东西靠它来获取到代码里。
http.ResponseWrite就可以写东西进去作为回应报文给客户端咯。

第四句:
t := template.Must(template.ParseFiles(“views/index.html”))
t.Execute(w, “”)

这就要讲到html/template库了,看意思,template,样板; 模板。

它可以将html模版解析出来,解析出来之后呢,你就可以对他修改之类的操作,
比如向html文件传几个值然后显示在网站上啊,就像一个页面,要你输入用户名密码,然后通过表单,你得到了这个用户名密码,你要把它显示在新的页面上,比如index.html,你就得先解析这个模版,然后传上值,传值用t.Execute(w,
“要传的值”)

func (t *Template) ParseFiles(filenames ...string) (*Template, error)
ParseGlob方法解析filenames指定的文件里的模板定义并将解析结果与t关联。如果发生错误,会停止解析并返回nil,否则返回(t, nil)。至少要提供一个文件。

外面加上template.Must()

func Must(t *Template, err error) *Template
Must函数用于包装返回(*Template, error)的函数/方法调用,它会在err非nil时panic,一般用于变量初始化:

就是加上一个报错功能,没什么值得注意的地方,就是更安全了

func (t *Template) Execute(wr io.Writer, data interface{}) error
Execute方法将解析好的模板应用到data上,并将输出写入wr。如果执行时出现错误,会停止执行,但有可能已经写入wr部分数据。模板可以安全的并发执行。

好了,讲解完毕。看一下结果
http://localhost:8080\main

成功!

然后发现有几张图片没有显示,其实这是因为http请求内部资源的时候,获取不到,比如这个图片

<img class="book_img" alt="" src="/static/img/default.jpg" />

路径是/static/img/default.jpg

得加上这句代码,加在func main 第一句:

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("views/static"))))

把http访问的/static/,而FileServer 查询 views/static,因为我们文件夹里图片的路径就是 views/static/img/default.jpg,直接找/static/img/default.jpg肯定找不到的。

func Handle(pattern string, handler Handler)
Handle注册HTTP处理器handler和对应的模式pattern(注册到DefaultServeMux)。如果该模式已经注册有一个处理器,Handle会panic。ServeMux的文档解释了模式的匹配机制。
func StripPrefix(prefix string, h Handler) Handler
StripPrefix返回一个处理器,该处理器会将请求的URL.Path字段中给定前缀prefix去除后再交由h处理。StripPrefix会向URL.Path字段中没有给定前缀的请求回复404 page not found。
func FileServer(root FileSystem) Handler
FileServer返回一个使用FileSystem接口root提供文件访问服务的HTTP处理器。要使用操作系统的FileSystem接口实现,可使用http.Dir:
http.Handle("/", http.FileServer(http.Dir("/tmp")))Example
// Simple static webserver:
log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))

所以上面那句话的意思就是:

如果http请求字段出现了static,那么交给http.StripPrefix(“/static/”,http.FileServer(http.Dir(“views/static”)))这个处理机处理,
处理机http.StripPrefix(“/static/”, handler),把/static/去掉,那么就剩空字符串 “” 了,交给
http.FileServer(http.Dir(“views/static”))这个处理机处理,
最后,""的pattern由http.FileServe最后处理成访问"views/static"的文件

就是说,找\static\最后找到了文件\views\static

现在就可以看到图片了

然后发现点开登陆/注册, 购物车,后台管理都没有反应,打开index.html,发现跳转页面

             <a href="pages/user/login.html">登录</a> | <a href="pages/user/regist.html">注册</a> &nbsp;&nbsp;<a href="/pages/cart/cart.html">购物车</a><a href="/pages/manager/manager.html">后台管理</a>

pages/user/login.html,这个pages跟上面那个static一个意思,继续加上代码

http.Handle("/pages/", http.StripPrefix("/pages/", http.FileServer(http.Dir("views/pages"))))

重新编译,点开登陆,

成功!!!

还会继续更新!

GO Web编程---网上书店(1)相关推荐

  1. GO Web编程---网上书店(4.1) 添加、删除、更新图书

    上一篇讲了查询图书并且分页,那是在图书管理那里,那么我们接着讲图书的管理. 完成后项目结构 实现的功能如下: 1.删除图书 在bookhandler.go新加一个函数 //DeleteBook 删除图 ...

  2. 基于java web的网上书店系统

    006基于java web的网上书店系统(含论文) 开发环境: Eclipse/MyEclipse.Tomcat8.Jdk1.8 数据库: MySQL 适用于: 课程设计,毕业设计,学习等等 系统介绍 ...

  3. 计算机科学与技术网上书店,计算机科学与技术毕业论文:基于web的网上书店.doc...

    本科毕业论文(设计) 题 目 基于web的网上书店 学生姓名 专业名称 计算机科学与技术 指导教师 目录 1.引言5 2.系统概述6 2.1概述6 2.2 开发平台7 3.需求分析7 3.1总体需求描 ...

  4. java web网上书店_java web简易网上书店项目系列,使用MVC模式(servlet+jstl+dbutils),开篇...

    一. 针对很多java web初学者入门困难的问题,笔者利用一个小型web项目,一步一步的展示java web开发方法,每一个章节引入一些java web开发的重点知识,让同学们可以将java web ...

  5. 网购图书java代码_基于JAVA WEB的网上书店的设计与实现

    摘 要 互联网的迅速发展为人们提供了更多的购物方式,网上商店就是目前最主流的网上购物方式之一.本网上购物系统的设计源于对网上购物需求的增加,由于地理位置购物不便,购物管理不规范,管理工作效率低的现状开 ...

  6. 基于html5的网上书店,基于web的网上书店的设计与实现

    [实例简介] 这个文件里面包含了代码和一个文档介绍,代码比较简单,基于web的一个小网站,内容不多但是会很实用,文档内容比较详细,引言,需求分析,总体设计,详细设计,测试,数据库等等方面都有很详细的说 ...

  7. SSM网上书店管理系统毕业设计源码082255

    目  录 摘要 1 绪论 1.1 研究目的 1.2国内外研究现状 1.3论文结构与章节安排 2网上书店管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务 ...

  8. SSM+网上书店管理系统 毕业设计-附源码082255

    目  录 摘要 1 绪论 1.1 研究目的 1.2国内外研究现状 1.3论文结构与章节安排 2网上书店管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务 ...

  9. JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页

    一.源码特点     JSP 网上书店系统 是一套完善的系统源码,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发.研究的基本内容是基于网上书店系 ...

  10. java购书管理系统代码_Java Web 网上书店管理系统

    [实例简介] Java Web网上书店 J2EE,内含源代码,数据库. [实例截图] [核心代码] 38e595d4-15a3-4def-bf32-4e3b21d8c473 └── 网上书店 ├── ...

最新文章

  1. angular4 下载文件 Excel zip包
  2. oracle 11g 从rman全备中恢复控制文件,拥有RMAN全备(缺少后增文件),丢失全部数据文件,控制文件的恢复...
  3. Android 自定义注解(Annotation)
  4. 解决IE10以下对象不支持“bind“属性或方法
  5. 用计算机玩游戏最简单的方法,如何制作电脑简易命令小游戏
  6. 为什么系统调用会消耗较多资源?系统调用的三种方法:软件中断(分析过程)、SYSCALL指令、vDSO(虚拟动态链接对象linux-vdso.so.1)
  7. POJ1011———Sticks
  8. C++的冒泡排序法的原理是什么?
  9. 碰撞域与广播域的区别
  10. 难崩日记——从入门到入土的求生之路(二):文件上传中的路径问题
  11. python--贝壳租房爬虫及数据可视化
  12. Angel-Eye: A Complete Design Flow for Mapping CNN onto Embedded FPGA阅读笔记
  13. 口袋里的mini宝贝,西圣Ava蓝牙耳机,百元即可享受好音质耳机
  14. opencv+python+OpenPose姿态实时识别
  15. linux搭建kubernetes集群(一主二从)
  16. html css 微信小程序,tailwindcss 支持微信小程序配置
  17. coolpad大神f2Android,酷派大神f2致命缺点和优点有什么【图文】
  18. mfc入门基础(四)对话框添加控件、创建对话框类和为对话框控件添加变量
  19. 初创的云平台公司是否需要设立运维岗
  20. PyTorch深度学习入门笔记(五)Transforms的使用

热门文章

  1. c#动态加载dll并调用dll中类的方法
  2. 商业银行vh是哪个银行的简称_各个银行缩写是什么
  3. 【转】和老外聊天、发邮件常用英语缩写
  4. 刘强东学习亚马逊:控制供应链 技术是最大障碍
  5. ICLR 22 GIANT ,UIUC UCLA OGB榜单
  6. C++内存泄漏及解决办法
  7. 手贱大意删除重要的文件怎么办!!!一招教你怎样恢复误删的文件
  8. android 汉字 转 拼音首字母大写,传入汉字字符串, 返回大写拼音首字母
  9. Java利用NeteaseCloudMusicApi批量下载网易云音乐
  10. Windows Mobile 进阶系列.第二回.初窥.NET CF类型加载器