我刚开始使用Go,我想用它创建一个Web应用程序。我现在要尝试的是以handlebarsjs风格使用模板。我想将页眉和页脚从主页中拉出来,以便可以将它们插入每个网页中。
我当前的设置应该解析主页,页眉和页脚HTML文件并缓存它们。然后,我执行home.html模板,该模板具有用于页面Title,header.html文件和footer.html文件的字段。
每当我搜索相似的页面时,我只会看到javascript页面,因此,如果这是转贴,请告诉我在哪里查找。
编辑:
我已经更新了我的代码,以从@Minty和@putu的答案中获取提示。我正在尝试读取html文件并将其存储在数据映射中,同时还将模板添加define
到我的模板中。我正在处理一些新的错误,因此该网站目前无法渲染。但是,如果您可以提供任何新的提示,那将会很有帮助。
server.go
package main
import (
"html/template"
"io/ioutil"
"net/http"
"regexp"
)
var tPath = "./temps/"
var dPath = "./data/"
var templates = template.Must(template.ParseFiles(tPath+"home.html", dPath+"header.html", dPath+"footer.html"))
var validPath = regexp.MustCompile("^/")
func rootHandler(wr http.ResponseWriter, req *http.Request) {
title := "home"
headerFile, headErr := ioutil.ReadFile(dPath + "header.html")
footerFile, footErr := ioutil.ReadFile(dPath + "footer.html")
if headErr != nil || footErr != nil {
http.Error(wr, headErr.Error(), http.StatusInternalServerError)
http.Error(wr, footErr.Error(), http.StatusInternalServerError)
}
data := map[string]interface{}{
"Title": title,
"Header": string(headerFile),
"Footer": string(footerFile),
}
err := templates.ExecuteTemplate(wr, title+".html", data)
if err != nil {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", rootHandler)
http.ListenAndServe(":8080", nil)
}
home.html:
{{define "homeHTML"}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{.Title}} - MySite</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
{{.Header}}
<h1>Welcome!</h1>
{{.Footer}}
</body>
</html>
{{end}}
Header.html:
{{define "headerHTML"}}
<header>
<h1>MySite</h1>
<br>
<nav>
<a href="/">Home</a>
</nav>
</header>
{{end}}
Footer.html
{{define "footerHTML"}}
<footer>
<p>Thank You for Visiting</p>
</footer>
{{end}}
这是完整的工作示例。
// home.html inside temps folder
{{define "homeHTML"}}
{{template "headHTML" .}}
{{template "headerHTML" .}}
{{template "footerHTML" .}}
{{end}}
// head.html inside data folder
{{define "headHTML"}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{.title}} - MySite</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
{{end}}
// header.html inside data folder
{{define "headerHTML"}}
<header>
{{.header}}
<h1>Welcome to my site!</h1>
<br>
<nav>
<a href="/">Home</a>
</nav>
</header>
{{end}}
// footer.html inside data folder
{{define "footerHTML"}}
<h1>Welcome! {{.footer}}</h1>
<footer>
<p>Thank You for Visiting</p>
</footer>
</body>
</html>
{{end}}
和代码将是这样的
package main
import (
"html/template"
"io/ioutil"
"net/http"
"path/filepath"
"strings"
)
var tPath = "./temps/"
var dPath = "./data/"
var templateDirs = []string{"temps", "data"}
var templates *template.Template
func getTemplates() (templates *template.Template, err error) {
var allFiles []string
for _, dir := range templateDirs {
files2, _ := ioutil.ReadDir(dir)
for _, file := range files2 {
filename := file.Name()
if strings.HasSuffix(filename, ".html") {
filePath := filepath.Join(dir, filename)
allFiles = append(allFiles, filePath)
}
}
}
templates, err = template.New("").ParseFiles(allFiles...)
return
}
func init() {
templates, _ = getTemplates()
}
func rootHandler(wr http.ResponseWriter, req *http.Request) {
title := "home"
data := map[string]interface{}{
"title": title,
"header": "My Header",
"footer": "My Footer",
}
err := templates.ExecuteTemplate(wr, "homeHTML", data)
if err != nil {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", rootHandler)
http.ListenAndServe(":8080", nil)
}
问题内容: 我正在按照本教程进行学习: golang教程- Wiki, 并且我设法使除“其他任务”部分中的最后一点之外的所有内容都起作用。我对本教程的实现: html / template引擎会按预期方式打印定位标记,但会使用html实体对其进行转义。我还没有找到合适的方法。 问题答案: 使用template.HTML将正文标记为安全HTML。 以下函数将正文转换为HTML。 使用以下方式渲染页面
问题内容: 如果我有这样的HTML文件,该如何在Golang中进行操作: 我想将一部分代码嵌入到其他文件的标头标签中,如下所示: 我的尝试: 问题答案: 如果使用或来解析所有模板文件,则模板可以相互引用,它们可以互相包含。 更改您的内容以包括以下内容: 然后是完整的程序(从当前目录解析文件,执行并将结果写入标准输出): 有了它可能看起来像这样: 输出(打印在控制台上):
问题内容: 我想将值格式化为golang 在文件中说的2个小数位。在文件中,我可以像这样格式化: 但是我不知道如何在模板中格式化它。我正在使用后端框架。任何帮助将不胜感激。谢谢。 问题答案: 您有很多选择: 您可以决定将数字格式化,例如使用,然后再将其传递给模板执行() 或者,您可以在定义方法的地方创建自己的类型,并根据自己的喜好格式化。模板引擎()对此进行了检查和使用。 您也可以直接从模板直接调
本文向大家介绍golang解析html网页的方法,包括了golang解析html网页的方法的使用技巧和注意事项,需要的朋友参考一下 1.先看一下整个结构: 主要是web和html目录,分别存放go代码和html相关的资源文件。 2.html代码比较简单,代码如下: 就是显示一张图片,然后加登陆表单。 3.而go代码也比较简单,如下: 主要是注意显示图片的路径,不能是原来的html的路径,必须是go
问题内容: 我在golang中有一个模板,其中有一个看起来像这样的字符串: 我期望输出是这样的: 但是我看到的是这样的: 我还尝试插入一些JSON,但golang会转义字符并在不应该出现的地方添加类似内容。 如何在golang中插入HTML模板而不发生这种情况? 问题答案: 您应该将变量作为a 而不是作为a 传递: https://play.golang.org/p/QKKpQJ7gIs 如您所见
问题内容: 我不确定这是否可能,但是我有一种情况,我想在HTML select标记的选项内将文本的 一部分 (不是全部)加粗。 我尝试使用b标签以及强标签,但没有运气(在Chrome上)。CSS可能会起作用,但是由于它在元素级别起作用,所以我不确定该怎么做。 有什么办法吗? 问题答案: 没有; 这是不可能的。 相反,您可以使用Javascript制作伪造的下拉列表。