fixed markdown format
This commit is contained in:
26
7.4.md
26
7.4.md
@@ -1,5 +1,5 @@
|
||||
#7.4 模板处理
|
||||
##什么是模板
|
||||
# 7.4 模板处理
|
||||
## 什么是模板
|
||||
你一定听说过一种叫做MVC的设计模式,Model处理数据,View展现结果,Controller控制用户的请求,至于View层的处理,在很多动态语言里面都是通过在静态HTML中插入动态语言生成的数据,例如JSP中通过插入`<%=....=%>`,PHP中通过插入`<?php.....?>`来实现的。
|
||||
|
||||
通过下面这个图可以说明模板的机制
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Web应用反馈给客户端的信息中的大部分内容是静态的,不变的,而另外少部分是根据用户的请求来动态生成的,例如要显示用户的访问记录列表。用户之间只有记录数据是不同的,而列表的样式则是固定的,此时采用模板可以复用很多静态代码。
|
||||
|
||||
##Go模板使用
|
||||
## Go模板使用
|
||||
在Go语言中,我们使用`template`包来进行模板处理,使用类似`Parse`、`ParseFile`、`Execute`等方法从文件或者字符串加载模板,然后执行类似上面图片展示的模板的merge操作。请看下面的例子:
|
||||
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -26,10 +26,10 @@ Web应用反馈给客户端的信息中的大部分内容是静态的,不变
|
||||
- 不使用handler来写演示代码,而是每个测试一个main,方便测试
|
||||
- 使用`os.Stdout`代替`http.ResponseWriter`,因为`os.Stdout`实现了`io.Writer`接口
|
||||
|
||||
##模板中如何插入数据?
|
||||
## 模板中如何插入数据?
|
||||
上面我们演示了如何解析并渲染模板,接下来让我们来更加详细的了解如何把数据渲染出来。一个模板都是应用在一个Go的对象之上,Go对象的字段如何插入到模板中呢?
|
||||
|
||||
###字段操作
|
||||
### 字段操作
|
||||
Go语言的模板通过`{{}}`来包含需要在渲染时被替换的字段,`{{.}}`表示当前的对象,这和Java或者C++中的this类似,如果要访问当前对象的字段通过`{{.FieldName}}`,但是需要注意一点:这个字段必须是导出的(字段首字母必须是大写的),否则在渲染的时候就会报错,请看下面的这个例子:
|
||||
|
||||
package main
|
||||
@@ -63,7 +63,7 @@ Go语言的模板通过`{{}}`来包含需要在渲染时被替换的字段,`{{
|
||||
|
||||
如果模板中输出`{{.}}`,这个一般应用与字符串对象,默认会调用fmt包输出字符串的内容。
|
||||
|
||||
###输出嵌套字段内容
|
||||
### 输出嵌套字段内容
|
||||
上面我们例子展示了如何针对一个对象的字段输出,那么如果字段里面还有对象,如何来循环的输出这些内容呢?我们可以使用`{{with …}}…{{end}}`和`{{range …}}{{end}}`来进行数据的输出。详细的使用请看下面的例子:
|
||||
|
||||
package main
|
||||
@@ -103,14 +103,14 @@ Go语言的模板通过`{{}}`来包含需要在渲染时被替换的字段,`{{
|
||||
t.Execute(os.Stdout, p)
|
||||
}
|
||||
|
||||
###pipelines
|
||||
### pipelines
|
||||
Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的语法你是不是经常使用,过滤当前目录下面的文件,显示含有"name"的数据,他表达的意思就是前面的输出可以当做后面的输入,最后显示我们想要的数据,而Go语言模板最强大的一点就是支持pipe数据,在Go语言里面任何`{{}}`里面的都是pipelines数据,例如我们上面输出的email里面如果还有一些可能引起XSS注入的,那么我们如何来进行转化呢?
|
||||
|
||||
{{. | html}}
|
||||
|
||||
在email输出的地方我们可以采用如上方式可以把输出全部转化html的实体,上面的这种方式和我们平常写Unix的方式是不是一模一样,操作起来相当的简便,调用其他的函数也是类似的方式。
|
||||
|
||||
###条件处理
|
||||
### 条件处理
|
||||
在Go模板里面如果需要进行条件判断,那么我们可以使用和Go语言的`if-else`语法类似的方式来咱先,如果pipeline为空,那么if就认为是false,下面的例子展示了如何使用`if-else`语法:
|
||||
|
||||
package main
|
||||
@@ -136,7 +136,7 @@ Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的
|
||||
|
||||
通过上面的演示代码我们知道`if-else`语法相当的简单,在使用过程中很容易集成到我们的模板代码中。
|
||||
|
||||
###模板变量
|
||||
### 模板变量
|
||||
有时候,我们在模板使用过程中需要定义一些局部变量,我们可以在一些操作中申明局部变量,例如`with``range``if`过程中申明局部变量,这个变量的作用域是`{{end}}`之前,Go语言通过申明的局部变量格式如下所示:
|
||||
|
||||
$variable := pipeline
|
||||
@@ -146,7 +146,7 @@ Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的
|
||||
{{with $x := "output" | printf "%q"}}{{$x}}{{end}}
|
||||
{{with $x := "output"}}{{printf "%q" $x}}{{end}}
|
||||
{{with $x := "output"}}{{$x | printf "%q"}}{{end}}
|
||||
###模板函数
|
||||
### 模板函数
|
||||
模板在输出对象的字段值时,采用了`fmt`包把对象转化成了字符串。但是有时候我们的需求可能不是这样的,例如有时候我们为了防止垃圾邮件发送者通过采集网页的方式来发送给我们的邮箱信息,我们希望把`@`替换成`at`例如:`astaxie at beego.me`,如果要实现这样的功能,我们就需要自定义函数来做这个功能。
|
||||
|
||||
每一个模板函数都有一个唯一值的名字,然后与一个Go函数关联,通过如下的方式来关联
|
||||
@@ -240,7 +240,7 @@ Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的
|
||||
}
|
||||
|
||||
|
||||
##Must操作
|
||||
## Must操作
|
||||
模板包里面有一个函数`Must`,它的作用是检测模板是否正确,例如大括号是否匹配,注释是否正确的关闭,变量是否正确的书写。接下来我们演示一个例子,用Must来判断模板是否正确:
|
||||
|
||||
package main
|
||||
@@ -270,7 +270,7 @@ Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的
|
||||
The next one ought to fail.
|
||||
panic: template: check parse error with Must:1: unexpected "}" in command
|
||||
|
||||
##嵌套模板
|
||||
## 嵌套模板
|
||||
我们平常开发Web应用的时候,经常会遇到一些模板有些部分是固定不变的,然后可以抽取出来作为一个独立的部分,例如一个博客的头部和尾部是不变的,而唯一改变的是中间的内容部分。所以我们可以定义成`header`、`content`、`footer`三个部分。Go语言中通过如下的语法来申明
|
||||
|
||||
{{define "子模板名称"}}内容{{end}}
|
||||
@@ -332,7 +332,7 @@ Unix用户已经很熟悉什么是`pipe`了,`ls | grep "name"`类似这样的
|
||||
|
||||
>同一个集合类的模板是互相知晓的,如果同一模板被多个集合使用,则它需要在多个集合中分别解析
|
||||
|
||||
##总结
|
||||
## 总结
|
||||
通过上面对模板的详细介绍,我们了解了如何把动态数据与模板融合:如何输出循环数据、如何自定义函数、如何嵌套模板等等。通过模板技术的应用,我们可以完成MVC模式中V的处理,接下来的章节我们将介绍如何来处理M和C。
|
||||
|
||||
## links
|
||||
|
||||
Reference in New Issue
Block a user