上篇关于Go模板库应用实践的文章最后我们留下一个问题,页面模板是通过 CDN引用的 BootStrapcssjs文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过 Nginx服务器的一定知道 Nginx天然支持静态资源的访问,那么我们是不是也要借助 Nginx才能实现处理静态文件请求呢?其实不是,在最开始的文章我们说过“Go语言不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。”,这篇文章就让我们了解一下如何用 Go语言的 net/http库实现处理静态资源请求的问题。

我们先用一个简单的例子学习一下使用 net/http如何创建一个静态资源服务器,然后再应用到我们的 http_demo项目中。

Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复 gohttp08获取本文源代码

创建静态资源服务器

我们新建一个 main.go存放创建静态资源服务器和监听请求的代码,同时在相同目录下创建 assets/cssassets/js目录用于存放上篇文章页面模板使用到的静态文件。

main.go

assets/

└── css

└── bootstrap.min.css

└── js

└── bootstrap.min.js

main.go中的代码如下:

package main

import "net/http"

func main() {

fs := http.FileServer(http.Dir("assets/"))

http.Handle("/static/", http.StripPrefix("/static/", fs))

http.ListenAndServe(":8080", nil)

}

  • 首先我们使用 http.FileServer创建一个使用给定文件系统的内容响应所有 HTTP请求的处理程序。

  • http.Handle("/static/",http.StripPrefix("/static/",fs))让文件服务器使用 assets目录下的文件响应 URL路径以 /static/开头的所有 HTTP请求。

  • assets被设置为文件服务器的文件系统根目录,文件服务器会处理以 /static开头的 URL的请求,所以我们需要使用 http.StripPrefix()把 static前缀去掉才能在 assets目录中搜索到请求的文件。

运行程序,然后用 cURL请求一下 css文件,看看有没有奏效。

$ go run main.go

$ curl -s http://localhost:8080/static/css/styles.css

/*!

* Bootstrap v3.3.7 (http://getbootstrap.com)

* Copyright 2011-2016 Twitter, Inc.

......

结合 gorillia/mux使用文件服务器

上面的例子中文件服务器的处理程序是注册到 net/http库提供的标准的 ServeMux(服务复用器)中的,我们 http_demo项目为了支持复杂的路由注册使用的是 gorillia/mux库提供的服务复用器。两者的工作方式不太一样,所以把文件服务器应用到我们项目里还需要做些调整才能起作用。

首先我们先把 assets目录整个拷贝到项目的根目录。

func RegisterRoutes(r *mux.Router) {

// serve static file request

fs := http.FileServer(http.Dir("assets/"))

serveFileHandler := http.StripPrefix("/static/", fs)

r.PathPrefix("/static/").Handler(serveFileHandler)

......

}

  • 使用 router.PathPrefix("/static")创建一个匹配有 /static前缀请求的路由。

  • 然后使用 route.Handler方法将文件服务器注册成路由对应的处理程序( Handler是 *mux.Route上的方法)。

注册好文件服务器后,我们把之前页面模板引用的 CDN上的 jscss文件换成自己服务器上的文件链接。

lang="en">

......

href="/static/css/bootstrap.min.css" rel="stylesheet">

{{ template "nav" .}}

class="container">

{{template "content" .}}

然后重启服务器,访问之前的页面 http:localhost:/view/index,验证一下我们的服务器现在是否能伺服静态文件的请求了。

页面样式正常,现在只要在服务器这个 assets目录下的文件,我们都可以通过 http://localhost:8000/static/*路径的 URL访问到。

今天的文章对应的源码已经打包上传,公众号回复 gohttp08获取下载链接,赶快下载下来动手练习一下吧。如果文章能帮助到你,不要忘记转发、点在看分享给更多人啊。关注公众号每周第一时间获取文章更新。

另外今天的题图是不是很有趣,两个小地鼠和背景都来自一部非常经典的电影。你能说出他们三个的名字吗?快来留言吧,让我看看你们都能给出什么答案

推荐阅读

  • Go Web 编程--超详细的模板库应用指南


喜欢本文的朋友,欢迎关注“Go语言中文网”:

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器相关推荐

  1. Go Web编程--使用Go语言创建静态文件服务器

    上篇关于Go模板库应用实践的文章最后我们留下一个问题,页面模板是通过 CDN引用的 BootStrap的 css, js文件.到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响 ...

  2. js/css文件修改后浏览器本地缓存解决

    本文实例讲述了让html页面随js的修改来更新缓存的实现方法.分享给大家供大家参考.具体实现方法如下: 很多朋友都会碰到这样的情况:如果我们页面加载了js的话下次打开时也会是调用这个js缓存文件,但对 ...

  3. tomcat html文件修改后没生效,Tomcat-页面访问时新Jsp未生效

    现网-更新jsp后,为什么有些服务器能拿到新页面,而有些服务器获取的是旧页面,为什么有些服务器什么事也不干隔断时间就自动能看新页面啦? 你需要懂的Tomcat-生成jsp的.class文件的原理,以及 ...

  4. 关于js、css文件修改后,需要清空浏览器缓存才会生效的问题

    开发项目中,必然要引用脚本和样式等文件.这些文件经常会需要修改,修改以后,刷新页面,发现没有效果(生效).需要清空浏览器缓存以后才会生效.所以在引用这些文件时,需要增加版本号,这样最新的版本会立即生效 ...

  5. flask html css文件更改后(谷歌)浏览器不及时更新样式文件怎么办?(ctrl+shift+delete清除缓存的图片和文件)

    如果是css文件更改后 以谷歌浏览器为例 按ctrl+shift+delete 清除缓存的图片和文件,再按f5刷新浏览器,搞定! 但是如果是html文件更改,就要重新启动一下后端flask程序了

  6. linux系统sudoers文件夹权限777以及/etc/profile文件修改后无法进入系统问题

    有位博友在我的另外一篇文章中留言,关于修改/etc文件夹权限为777导致/etc/sudoers文件夹权限修改为777后无法使用 "sudo"指令,关于这个问题打算与误操作/etc ...

  7. linux etc profile生效,让/etc/profile文件修改后立即生效

    满意答案 姗姗860411 2016.09.02 采纳率:53%    等级:10 已帮助:1968人 让/etc/profile文件修改后立即生效方法1: www.dnjsb.com 让/etc/p ...

  8. hosts文件修改后无法保存问题

    hosts文件在windows目录下的位置(我的是win10系统,其他系统大同小异) C:\Windows\system32\drivers\etc\hosts linux系统hosts位置 /etc ...

  9. 对已经存在Excel文件修改后保存时,会弹出一个询问对话框

    对已经存在Excel文件修改后保存时,会弹出一个询问对话框: ---------------------------       在当前位置发现已经存在名为"RESUME.XLW" ...

最新文章

  1. 2021年大数据Spark(四十五):Structured Streaming Sources 输入源
  2. Documentum常见问题2—压力测试时一旦用户数超过一定数量就不能登录了
  3. 问题 | CondaHTTPError: HTTP 404 NOT FOUND for url
  4. 终于看腻了黄色!让它五彩斑斓起来!
  5. linux 线程间传送消息,Linux 多线程同步-消息队列
  6. mysql 自动化部署,MySQL标准化、自动化部署
  7. Spring Cloud 个人心得 理论
  8. 他写出了 Vue,却做不对这十道 Vue 笔试题
  9. Golang类型转换模块 - gconv
  10. spring boot 打war包部署,打jar包
  11. python hbase_python 操作 hbase
  12. 2021财经直播系统 H5网页直播 大区直播间源码
  13. Ubuntu16.04安装为知笔记(WizNote)
  14. android viewholder模式,Android ViewHolder模式
  15. sql查询各科成绩前三名
  16. Python笔记03:python中用import导入包的机制原理是什么?
  17. NoSQLBooster for MongoDB基本使用步骤
  18. 导入依赖失败,报错信息Failed to resolve: com.*.*:*:0.0.0<a href=““>Show in Project Structure dialog
  19. textarea回车换行的方法
  20. Django admin后台美化(极其简单)

热门文章

  1. mysql 5.7.25 的安装与 安装错误修改 适用于5.7解压版
  2. python学习笔记第9天《文件的管理办法》
  3. 关于java中BufferedReader的read()及readLine()方法的使用心得
  4. Firemonkey Android IOS 图标
  5. php:兄弟连之面向对象版图形计算器1
  6. 额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~...
  7. SQL里的SWITCH分支语句
  8. 《Sibelius 脚本程序设计》连载(四) - 1.1 创建第一个插件
  9. Python安装Jupyter Notebook配置使用教程
  10. binaryoperator java_BinaryOperatorT接口的用法示例