重拾cgi——页面模板

简介: 可能是因为公司里写代码用velocity习惯了,找了google的ctemplate来实现类似的功能。ctemplate相对velocity比较简单,只有变量替换,简单的引用、循环。这里有ctemplate的详细文档,相对来说,就是不能在模板上有太多的逻辑。 首先,前一篇里面贴了dispatche

可能是因为公司里写代码用velocity习惯了,找了google的ctemplate来实现类似的功能。ctemplate相对velocity比较简单,只有变量替换,简单的引用、循环。这里有ctemplate的详细文档,相对来说,就是不能在模板上有太多的逻辑。
首先,前一篇里面贴了dispatcher,通过apache中设置环境变量,设置模板跟路径:
[cce lang=”cpp”]
ctemplate::Template::SetTemplateRootDirectory(input.getenv(“TEMPLATE_PATH”));
[/cce]
然后,通过绑定的处理函数,调用真正的处理uri的函数后,将输出的dictionary对象,和模板合并:
[cce lang=”cpp”]
std::string templatePath;
if(context.dict) //has dict
{
//get template
templatePath = context.dict->name() + ".tpl";
//expend
std::string out;
bool expandResult = ctemplate::ExpandTemplate(templatePath, ctemplate::STRIP_WHITESPACE, context.dict.get(), &out);

if(expandResult) //good, we expend template success
{
context.ostream << cgicc::HTTPHTMLHeader();
context.ostream << out;
}
else //oops, we response 500
{
context.ostream << cgicc::HTTPStatusHeader(500, "Internal Server Error");
context.ostream << "fail to expand template: " << templatePath;
}
}
else
{
//如果没有字典,由对应的函数自己输出
}
[/cce]
这里是有字典输出的逻辑。获取根字典的名字,加上后缀,在根路径中查找对应的模板。然后调用ctemplate的函数,将模板展开。最后,将展开后的内容,通过流输出。
如果没有字典输出,默认当成处理函数中已经自己进行了输出(这里主要是为了让处理函数自己输出json内容)
另外一个分支,如果没有绑定,那么直接输出模板内容:
[cce lang=”cpp”]
// find if there is a template
std::string templatePath = path.substr(1) + ".tpl";
if(ctemplate::mutable_default_template_cache()->LoadTemplate(templatePath, ctemplate::STRIP_WHITESPACE))
{
//expend
std::string out;
bool expandResult = ctemplate::ExpandTemplate(templatePath, ctemplate::STRIP_WHITESPACE,
_emptyDict.get(), &out);
if(expandResult) //good, we expend template success
{
context.ostream << cgicc::HTTPHTMLHeader();
context.ostream << out;
}
else //oops, we response 500
{
context.ostream << cgicc::HTTPStatusHeader(500, "Internal Server Error");
context.ostream << "fail to expand template: " << templatePath;
}
}
else //not bind and not find a template file
{
context.ostream << cgicc::HTTPStatusHeader(404, "not find");
context.ostream << "not find";
}
[/cce]
如果没有绑定,用一个空的字典,展开模板,也就是直接输出模板。如果这都没有找到,那么就返回404。

一个绑定函数的例子:
[cce lang=”cpp”]
void handle(Context &context)
{
std::vector<Volume> volumes;
//FIXME: mock数据
Volume v1 ("1", "a", "cover_1.png", 5);
Volume v2 ("2", "b", "cover_2.png", 1);

volumes.push_back(v1);
volumes.push_back(v2);

boost::shared_ptr<ctemplate::TemplateDictionary> listPageDict(new ctemplate::TemplateDictionary("list"));
for(int i = 0; i < volumes.size(); ++i)
{
ctemplate::TemplateDictionary *listSection = listPageDict->AddSectionDictionary("LIST_SECTIONS");
listSection->SetIntValue("id", volumes[i].id());
listSection->SetValue("name", volumes[i].name());
listSection->SetValue("cover_img_path", volumes[i].cover_path());
}

context.dict = listPageDict;
}
[/cce]
对应的模板文件:
[cce]
< !DOCTYPE html>
< html>
<head>
<meta charset="utf-8" />
<title>title</title>
</head>
<body>
<ol>
{{#LIST_SECTIONS}}
<li>name: {{name}}</li>
{{/LIST_SECTIONS}}
</ol>
</body>
< /html>
[/cce]
最后输出就是刚在Volume对象的name字段。


转载自:https://coolex.info/blog/341.html

目录
相关文章
|
小程序 开发工具 开发者
【已解决】微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
3306 0
【已解决】微信小程序编译后白屏(The resource was preloaded using link preload but not used within a few seconds ...)
|
PyTorch TensorFlow 算法框架/工具
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
本文提供了在Ubuntu 18.04操作系统的NVIDIA Jetson平台上安装深度学习和计算机视觉相关库的详细步骤,包括PyTorch、OpenCV、ONNX、TensorFlow等。
1412 1
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
|
缓存 监控 前端开发
WEB前端三大主流框架:React、Vue与Angular
在Web前端开发中,React、Vue和Angular被誉为三大主流框架。它们各自具有独特的特点和优势,为开发者提供了丰富的工具和抽象,使得构建复杂的Web应用变得更加容易。
4218 6
|
安全 Java 应用服务中间件
渗透测试-JBoss 5.x/6.x反序列化漏洞
渗透测试-JBoss 5.x/6.x反序列化漏洞
406 14
|
机器学习/深度学习 人工智能 监控
计算机视觉技术在安防领域的应用深度解析
【7月更文挑战第28天】计算机视觉技术作为人工智能领域的重要分支,在安防领域的应用前景广阔。通过不断提升技术性能和解决实际应用中的问题,计算机视觉技术将进一步提升安防工作的效率和准确性,为公共安全和社会稳定贡献更大的力量。
|
Linux 持续交付 开发工具
版本控制系统的选择:Git vs. Mercurial
【6月更文挑战第20天】Git vs. Mercurial: 两者都是流行的DVCS,Git由Linus Torvalds创建,以其速度和复杂分支管理著称,适合大型项目和有经验的开发者。Mercurial,由Matt Mackall开发,以其简洁命令行和易用性吸引初学者。Git社区更大,扩展更丰富,而Mercurial在某些场景下可能更直观。选择取决于项目需求、团队经验和偏好。
|
机器学习/深度学习 人工智能 自然语言处理
学习人工智能常用名词解释
人工智能是当今科技领域中备受关注的热门话题,涵盖了众多令人兴奋的技术和应用。包括机器学习、深度学习、自然语言处理、计算机视觉等众多领域的重要概念。从监督学习、无监督学习到增强学习,从卷积神经网络、循环神经网络到生成对抗网络,这些名词解释详尽地介绍了人工智能技术的基础理论和应用方法。无论你是初学者还是专业人士,这些名词解释都将为你提供一个全面的人工智能知识体系。在不断涌现的新技术和应用中,人工智能必将在未来的各个领域中扮演更为重要的角色。
743 1
|
安全 jenkins 持续交付
Jenkins 构建触发器指南
描述 这个触发器允许你通过发送HTTP请求远程触发Jenkins Job的构建。通常用于将Jenkins集成到自动化流程中,例如在持续集成/持续交付(CI/CD)中。 配置步骤 进入Jenkins Job的配置页面,找到 "构建触发器" 部分。 勾选 "触发远程构建 (例如,使用脚本) / Trigger builds remotely (e.g., from scripts)"。 安全令牌 提供一个安全令牌(Token),确保只有知道令牌的请求才能触发构建。 比如:JENKINS_URL/job/freedom/build?token=TOKEN_NAME JENKINS_URL: 这是你J
1190 1
|
监控 安全 数据处理
《数据治理简易速速上手小册》第4章 数据安全与合规性(2024 最新版)
《数据治理简易速速上手小册》第4章 数据安全与合规性(2024 最新版)
428 0
|
存储 Linux 虚拟化
Hyper-v 设置静态IP 搭建集群
Hyper-v 设置静态IP 搭建集群