已解决!!

GO中怎么调用html文件,html怎么应用css设置?

  • 这个问题好难….弄了两天了还是没有解决。

工程的目录结构如下


这里写图片描述

其中pkg是编译main.go之后输出的目录。一开始输出是默认在c盘的Temp文件下边。

main.go代码如下

package main

import (
    "net/http"
    "log"
    "html/template"
    "os"
    "path/filepath"
)

var dir, sysPath string

func main() {
    execpath, _ := os.Executable()
    sysPath = filepath.Dir(execpath)
    dir = filepath.Join(sysPath, "/index.html")
    http.HandleFunc("/", requestHandler)
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe : ", err)
    }
}

func requestHandler(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles(dir)
    if err != nil {
        log.Fatal("template.ParseFiles : ", err)
        return
    }
    t.Execute(w, nil)
}

通过 os.Executable() 读到了当前执行的目录,然后找到html所在的路径,可以通过路由找到html,并在前端显示,但是html中调用的css并没有执行到。

<link type="text/css" rel="stylesheet" href="static/css/header_style.css">

我看书上都是直接给的相对路径的例子,怎么到了我这里就这么坑T^T。
求大神帮忙解答~我找到了答案之后也会把这个问题进行更新

======================2018-7-23==========================

这个问题终于解决了~

  • 1.首先是相对路径的404问题,这个是因为我之前用的是idea运行go程序的,上边也说了执行的时候会生成一个.exe文件,这个文件所在的路径才是执行路径,这个路径如果自己不配置的话,是在C盘自动生成的。而 /index.html 我们写的这个相对路径是程序所在目录,并不是执行目录。进入到项目main.go所在目录,通过命令行执行 go run main.go 就可以解决404问题了
  • 2.调用不到css文件,这个通过静态路由的配置就可以解决了。在http包中有两个方法:
     http.Handle(pattern string, handler Handler)
     http.HandleFunc(pattern string, handler Handler)
    这两个路由配置的函数是不同的,其种Handle是针对静态资源配置路由,HandleFunc是针对动态页面配置路由。所以只要把要调用的css等文件通过Handle配置一下路由就可以了。

可运行项目代码如下~(目录结构就是上边的图片)

package main

import (
    "net/http"
    "log"
    "html/template"
)

func main() {
    http.Handle("/css/", http.FileServer(http.Dir("templates")))
    http.Handle("/js/", http.FileServer(http.Dir("templates")))

    http.HandleFunc("/index", requestHandler)
    http.HandleFunc("/404", notFound)
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe : ", err)
    }
}

func requestHandler(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("index.html")
    if err != nil {
        log.Fatal("template.ParseFiles : ", err)
        return
    }
    t.Execute(w, nil)
}

func notFound(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("templates/html/404.html")
    if err != nil {
        log.Fatal("template.ParseFiles : ", err)
        return
    }
    t.Execute(w, nil)
}