gf框架之模板引擎 - 基本用法

news/2023/12/1 8:40:17

文章来源:http://gf.johng.cn/591642

控制器视图

gf为控制器提供了良好的模板引擎支持,由gmvc.View视图对象进行管理,提供了良好的数据隔离性。控制器视图是并发安全设计的,允许在多线程中异步操作。

func (view *View) Assign(key string, value interface{})
func (view *View) Assigns(data map[string]interface{})

func (view *View) Parse(file string) ([]byte, error)
func (view *View) ParseContent(content string) ([]byte, error)

func (view *View) Display(files ...string) error
func (view *View) DisplayContent(content string) error

func (view *View) LockFunc(f func(vars map[string]interface{}))
func (view *View) RLockFunc(f func(vars map[string]interface{}))

使用示例1:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gmvc"
)

type ControllerTemplate struct {
    gmvc.Controller
}

func (c *ControllerTemplate) Info() {
    c.View.Assign("name", "john")
    c.View.Assigns(map[string]interface{}{
        "age"   : 18,
        "score" : 100,
    })
    c.View.Display("index.tpl")
}

func main() {
    s := ghttp.GetServer()
    s.BindController("/template", &ControllerTemplate{})
    s.SetPort(8199)
    s.Run()
}

其中index.tpl的模板内容如下:

<html>
    <head>
        <title>gf template engine</title>
    </head>
    <body>
        <p>Name: {{.name}}</p>
        <p>Age:  {{.age}}</p>
        <p>Score:{{.score}}</p>
    </body>
</html>

执行后,访问http://127.0.0.1:8199/template/info可以看到模板被解析并展示到页面上。如果页面报错找不到模板文件,没有关系,因为这里并没有对模板目录做设置,默认是当前可行文件的执行目录(Linux&Mac下是/tmp目录,Windows下是C:\Documents and Settings\用户名\Local Settings\Temp )。如何手动设置模板文件目录请查看后续章节,随后可回过头来手动修改目录后看到结果。

其中,给定的模板文件file参数是需要带完整的文件名后缀,例如:index.tplindex.html等等,模板引擎对模板文件后缀名没有要求,用户可完全自定义。此外,模板文件参数也支持文件的绝对路径(完整的文件路径)。

当然,我们也可以直接解析模板内容,请看示例2:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gmvc"
)

type ControllerTemplate struct {
    gmvc.Controller
}

func (c *ControllerTemplate) Info() {
    c.View.Assign("name", "john")
    c.View.Assigns(map[string]interface{}{
        "age"   : 18,
        "score" : 100,
    })
    c.View.DisplayContent(`
        <html>
            <head>
                <title>gf template engine</title>
            </head>
            <body>
                <p>Name: {{.name}}</p>
                <p>Age:  {{.age}}</p>
                <p>Score:{{.score}}</p>
            </body>
        </html>
    `)
}

func main() {
    s := ghttp.GetServer()
    s.BindController("/template", &ControllerTemplate{})
    s.SetPort(8199)
    s.Run()
}

执行后,访问http://127.0.0.1:8199/template/info可以看到解析后的内容如下:

<html>
    <head>
        <title>gf template engine</title>
    </head>
    <body>
        <p>Name: john</p>
        <p>Age:  18</p>
        <p>Score:100</p>
    </body>
</html>

非控制器视图

非控制器中使用模板引擎没有控制器视图的支持,可以使用底层的gview包来实现,可以通过单例管理器来获取默认的单例gview对象。

gview包方法列表:

func Get(path string) *View
func New(path string) *View
func (view *View) BindFunc(name string, function interface{})
func (view *View) Parse(file string, params map[string]interface{}) ([]byte, error)
func (view *View) ParseContent(content string, params map[string]interface{}) ([]byte, error)

func (view *View) GetPath() string
func (view *View) SetPath(path string)

使用示例1:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gins"
)

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/template2", func(r *ghttp.Request){
        content, _ := gins.View().Parse("index.tpl", map[string]interface{}{
            "id"   : 123,
            "name" : "john",
        })
        r.Response.Write(content)
    })
    s.SetPort(8199)
    s.Run()
}

在这个示例中我们使用单例管理器获取一个默认的视图对象,随后通过该视图渲染对应模板目录下的index.tpl模板文件并给定模板变量参数。

我们也可以通过SetPath方法中心指定视图对象的模板目录,该方法是并发安全的,但是需要注意一旦改变了该视图对象的模板目录,将会在整个进程中生效。

当然,也可以直接解析模板内容,使用示例2:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gins"
)

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/template2", func(r *ghttp.Request){
        tplcontent := `id:{{.id}}, name:{{.name}}`
        content, _ := gins.View().ParseContent(tplcontent, map[string]interface{}{
            "id"   : 123,
            "name" : "john",
        })
        r.Response.Write(content)
    })
    s.SetPort(8199)
    s.Run()
}

执行后,访问http://127.0.0.1:8199/template2可以看到解析后的内容为:id:123, name:john

此外,需要注意的是,虽然以上示例都是在Web Server中进行展示的,但是模板引擎是对模板文件/内容的智能解析,可以用在任何的场景中。

修改模板目录

模板引擎作为gf框架的核心组件,可以通过以下方式修改模板引擎的默认模板文件查找目录:

  1. (推荐)单例模式获取全局View对象,通过SetPath方法手动修改
  2. 修改命令行启动参数 - viewpath
  3. 修改指定的环境变量 - gf.viewpath

例如,我们的执行程序文件为main,那么可以通过以下方式修改模板引擎的模板目录(Linux下):

  1. (推荐)通过单例模式

    gins.View().SetPath("/opt/template")
  2. 通过命令行参数

    ./main --viewpath=/opt/template/
  3. 通过环境变量

    • 启动时修改环境变量:

      gf.viewpath=/opt/config/; ./main
    • 使用genv包来修改环境变量:

      genv.Set("gf.viewpath", "/opt/template")

自动检测更新

模板引擎使用了缓存机制,当模板文件第一次被读取后会被缓存到内存,下一次读取时将会直接从缓存中获取,以提高执行效率。并且,模板引擎提供了对模板文件的自动检测更新机制,当模板文件在外部被修改后,模板引擎能够即时地监控到并刷新模板文件的缓存内容。

模板引擎的自动检测更新机制也是gf框架的一大特色。


http://www.niftyadmin.cn/n/4151658.html

相关文章

中兴智能视觉大数据司机疲劳监测系统功能、特点及优势详细介绍

中兴智能视觉大数据司机疲劳监测系统功能、特点及优势详细介绍司机疲劳监测管理平台是一款全新的基于疲劳模型算法实现的驾驶安全主动监测系统&#xff0c;该产品通过图像识别分析方法&#xff0c;使用摄像头&#xff0c;通过非接触方式&#xff0c;时时刻刻扫描分析驾驶员精神…

访问controller方法时报错:java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getHeader(...

2019独角兽企业重金招聘Python工程师标准>>> Controller方法: RequestMapping(value "/export")ResponseBodypublic void export(String startDate, String endDate, HttpServletRequest request, HttpServletResponse response) throws IOException, Ex…

Unicode不可见字符的显示

Unicode的学名是”Universal Multiple-Octet Coded Character Set”&#xff0c;简称为UCS 不可见字符”/u200b”为 Unicode Character ‘ZERO WIDTH SPACE’ (U200B)&#xff0c;可用于内容标识&#xff0c;不占位数。 echo $LANG可以显示出Linux系统的编码方式&#xff0c;一…

脚踏两只船的困惑 - Memcached与Redis(转载)

序言很多人喜欢把Memcached与Redis进行比较&#xff0c;基于这个论点&#xff0c;笔者希望可以大家呈现一些笔者自己的见解与大家分享。首先&#xff0c;讨论一件事情之前&#xff0c;我们必须要对他们有一个基本的了解&#xff0c;才能给我们提供一个比较好的理论依据&#xf…

js的target.innerHTML

2019独角兽企业重金招聘Python工程师标准>>> <li><a href"javascript:void(0)" οnclick"changeGoodsModule(this)">品牌管理</a></li> //切换功能模块 function changeGoodsModule(e) {var event window.event || e;…

OAuth 2.0 身份验证漏洞

OAuth 2.0 身份验证漏洞 在浏览网页时&#xff0c;您几乎肯定会遇到可让您使用社交媒体帐户登录的网站。该功能很有可能是使用流行的 OAuth 2.0 框架构建的。OAuth 2.0 对攻击者来说非常有趣&#xff0c;因为它非常常见并且天生就容易出现实施错误。这可能导致许多漏洞&#xf…

Linux的软链接和硬链接的区别

在Linux系统中&#xff0c;链接分为两种&#xff0c;一种是硬链接&#xff08;Hard link&#xff09;&#xff0c;另一种称为符号链接或软链接&#xff08;Symbolic Link&#xff09;。 ①默认不带参数的情况下&#xff0c;ln创建的是硬链接&#xff0c;带-s参数的ln命令创建的…

HTTP 主机头攻击

HTTP 主机头攻击 在本节中&#xff0c;我们将讨论错误配置和有缺陷的业务逻辑如何通过 HTTP Host 标头将网站暴露于各种攻击。我们将概述识别易受 HTTP Host 标头攻击的网站的高级方法&#xff0c;并演示如何利用它。最后&#xff0c;我们将就如何保护自己的网站提供一些一般性…

阿里云升级配置及添加云盘和数据迁移

升级配置&#xff1a; 点击实例--升降配--选择配置购买 添加云盘&#xff1a; 1. 点击云盘--创建云盘--选择区域和配置购买 2. 点击云盘或实例--点击挂载--自动匹配实例&#xff0c;然后进行云盘挂载 3. 格式化和挂载数据盘磁盘&#xff1a;https://help.aliyun.com/document_d…

理解js的事件冒泡和事件捕获

理解js的事件冒泡和事件捕获 定义 冒泡&#xff1a;作用于子元素上的事件会一级一级向上传递&#xff0c;类似于冒泡的形式。捕获&#xff1a;作用于父元素的事件会一级一级向下传递到最终的子元素。 使用方法 文档请参考addEventListener&#xff0c;以及runnoob的addEventLis…

基于canvas实现的高性能、跨平台的股票图表库--clchart

什么是 ClChart&#xff1f; ClChart是一个基于canvas创建的简单、高性能和跨平台的股票数据可视化开源项目。支持PC、webApp以及React Native和Weex等平台。在React Native和Weex上完全适配开源项目GCanvas&#xff0c;可轻松使用GCanvas来使得您开发的应用在android和ios上具…

【专题速递】传输网络优化(长专题)

// RTC如何助力远程医疗&#xff1f;5G的差异化体现在哪&#xff1f;SMT如何将远程做到极致&#xff1f;7月29日LiveVideoStackCon2023上海站传输网络优化专场&#xff0c;为您解答。 传输网络优化 为应对互联网日益增长的加速需求、复杂的网络环境以及多种多样的视频业务&am…

My first blog post

关于我 这是一个个人博客&#xff0c;创建这个博客的时候&#xff0c;就想着拥有一个自己能够积累知识、积累兴趣的地方。网络带给我非常多的知识和眼界&#xff0c;我也想力所能及的分享我的一些琐碎知识。如果能够帮助到更多的人&#xff0c;那一定是非常棒的事情。 我没有经…

nginx+Lua+cwebp+GraphicsMagick图片压缩

为什么80%的码农都做不了架构师&#xff1f;>>> 图片压缩支持URL&#xff1a;http://lua.img.com/thumb/2018/04/24/w.jpg_900x600.webp 原图片地址为http://lua.img.com/2018/04/24/w.jpg 图片高宽&#xff1a;900x600 转换格式&#xff1a;webp/png/gif/jpg 附上…

html2canvas - 解决办法之图片跨域导致的截图空白

1. 后端支持&#xff1a;图片要是cdn上的地址&#xff0c;并且允许图片跨域&#xff0c;header头中设置应为 Access-Control-Allow-Origin: *2. 前端配置 1 var opts { 2 scale: scale, // 添加的scale 参数 3 canvas: canvas, //自定义 canvas 4 …

html5视频插入?

一、网页中插入视频<!doctype html><html><head><meta charset"utf-8"><title>网页视频测试</title></head><body><div align"center"><embed src"http://player.youku.com/player.php/Typ…
最新文章