将数据范围传递到HTML模板

时间:2018-01-08 10:35:19

标签: go

我已将虚拟数据插入数据库。

样本打印功能根据控制台中的代码打印13及其正方形。但我需要将整个数据传递给HTML模板(索引),在那里我可以看到一个表格,其中包含所有传递的数字及其各自的平方数。

如何在索引HTML中传递此数据?

Number x Number = SquareNumber 1 x 1 = 1 2 x 2 = 4 3 x 3 = 9 ... 等等。

func main() {

    db, err := sql.Open("mysql", "root:@/godb")
    if err != nil {
        panic(err.Error())  
    }

    defer db.Close() 

 stmtIns, err := db.Prepare("INSERT INTO squarenum VALUES(?, ?, ? )") // ? = 
placeholder
    if err != nil {
        panic(err.Error()) }

    defer stmtIns.Close() 

 stmtOut, err := db.Prepare("SELECT squareNum FROM squareNum WHERE number = 
 ?")
    if err != nil {
        panic(err.Error()) 
    }

    defer stmtOut.Close()

    for i := 1; i < 50; i++ {
        _, err = stmtIns.Exec(0,i, (i * i)) 
        if err != nil {
            panic(err.Error()) 
        }
    }

    err = stmtOut.QueryRow(13).Scan(&squareNum) // WHERE number = 13
    if err != nil {
 panic(err.Error()) // proper error handling instead of panic in your app

    }
    tRes:=pageData{}
    tRes.SquareNum=squareNum
    fmt.Printf("The square number of 13 is: %d \n", squareNum)


    // Query another number.. 1 maybe?
    err = stmtOut.QueryRow(1).Scan(&squareNum) // WHERE number = 1
    if err != nil {
 panic(err.Error()) // proper error handling instead of panic in your app
    }
    fmt.Printf("The square number of 1 is: %d \n", squareNum)
    http.HandleFunc("/",idx)
    http.ListenAndServe(":8888", nil)
}

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

    pd := pageData{
        SquareNum: squareNum,
        }

    err := tpl.ExecuteTemplate(w, "index.html", pd)
    if err != nil {
        log.Println("LOGGED", err)
http.Error(w, "Internal server error", http.StatusInternalServerError)
        return
    }
}

1 个答案:

答案 0 :(得分:2)

package main

import (
    "html/template"
    "os"
)

// here is your template
const tplString = `
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>{{.Title}}</title>
</head>
<body>
{{range .Dummies}}
<div>Square of {{.Number}} is {{.Square}}</div>
{{end}}
</body>
</html>
`

var (
    tpl *template.Template
    err error
)

// the dummydata you talked about
type DummyData struct {
    Number int
    Square int
}

//some PageData just with dummies and a title
type PageData struct {
    Title   string
    Dummies []*DummyData
}

//here you would be using your sql queries
func createSomeDummies(amount int) []*DummyData {
    dummies := make([]*DummyData, amount)
    for i := 0; i < amount; i++ {
        dd := new(DummyData)
        dd.Number = i
        dd.Square = i * i
        dummies[i] = dd
    }
    return dummies
}

func main() {
    pd := new(PageData)
    pd.Title = "Hello Dummies"
    pd.Dummies = createSomeDummies(10)

    tpl = template.New("index")
    tpl, err = tpl.Parse(tplString)
    if err != nil {
        panic(err)
    }
    err = tpl.Execute(os.Stdout, pd)
    if err != nil {
        panic(err)
    }
}

此Snippet创建一个PageData结构来保存dummydata条目数组和网页标题。

type PageData struct {
    Title   string
    Dummies []*DummyData
}

然后使用函数创建10个dummydata结构。 然后将此数组分配给PageData的Dummmies字段。

pd.Dummies = createSomeDummies(10)

这个函数是你的sql查询函数的占位符,你只需要循环你的sql行,而不是像我一样手动创建它们。

func createSomeDummies(amount int) []*DummyData {
    dummies := make([]*DummyData, amount)
    for i := 0; i < amount; i++ {
        dd := new(DummyData)
        dd.Number = i
        dd.Square = i * i
        dummies[i] = dd
    }
    return dummies
}

模板本身会像这样插入标题: <title>{{.Title}}</title>

Dummies本身由范围模板指令插入,该指令的作用类似于迭代器。 需要注意的一件事是,在这个循环中,所有数据都指向DummyData项而不是PageData

{{range .Dummies}}
<div>Square of {{.Number}} is {{.Square}}</div>
{{end}}

然后解析模板。错误将暂停执行并打印错误消息。

tpl = template.New("index")
tpl, err = tpl.Parse(tplString)
if err != nil {
    panic(err)
}

最后,模板将呈现给Stdout。要在http Handler中使用,您必须使用http.ResponseWriter。 错误再次停止执行并打印错误消息。

err = tpl.Execute(os.Stdout, pd)
if err != nil {
    panic(err)
}

这里的工作示例: Go Playground