C++网站开发MVC框架TreeFrog Framework教程——8.Otama模板

news/2024/5/20 13:00:47/文章来源:https://blog.csdn.net/gg_18826075157/article/details/73266185

Otama模板系统的最大特点在于表现层的纯粹性,使用原生的HTML标签取代形如<%...%>这样的嵌入脚本代码。

使用之前,记得把配置文件(development.ini)中的模板系统设置为Otama

TemplateSystem=Otama

Otama模板文件的后缀名是最一般的.html,区别于ERB模板的.erb,同时它把所有的逻辑代码全部转移到一个独立的文件中,它的后缀是.otm,虽然它是纯C++写的。我们可以这么理解,html文件otm文件相结合等同于ERB系统的erb文件
HTML文件+OTM文件
一般来说每个动作都对应有一套表现逻辑和模板文件,它们的命名分别为动作名.otm动作名.html,它们被放在views/控制器名/目录下。

每当你新创建了一个模板文件,记得要重新编译,因为程序运行时使用的是编译之后的共享库文件。

$ cd views
$ make qmake

1.输出字符串

如果我们想往网页输出Hello world,可以对特定的标签元素添加data-tf属性,它的值必须是@开头,并且只能用字母和下划线。比如在模板文件中(.html文件)中这样写:

<p data-tf="@hello"></p>

然后在表现逻辑文件(.otm文件)中对应地有:

 @hello ~ eh("Hello world");

那么最终生成返回给用户的页面将会是这样的:

<p>Hello world</p>

波浪线(~)的意思是,用右边表达式的返回值去填充data-tf属性值为左边的网页标签,然后data-tf属性则会完全消失。而eh()方法就是返回经过HTML转义得到的字符串。

为了实现同样的效果,我们也可以这么写:

@hello ~= "Hello world"

正如ERB模板系统一样,~eh()函数的组合可以简写为~=;相似地,~echo()函数的组合也可以简写为~==

但是右边不一定非得一定是字面常量,完全可以是一个普通变量甚至是一个对象实例。

2.Otama运算符

联系模板文件中的“标记属性”和表现逻辑代码文件中的变量的是Otama运算符,例如上面的~或者~=
如果这一次我们选择使用另一个运算符——:,例如

@hello : eh("Hello world");

那么最终生成返回给用户的页面将变成这样:

Hello world

<p>标签被完全移除了,因为:运算符会用右边的值完全替代拥有对应标记属性的网页元素。正如~eh()可以简写为~=:eh()也可以简写为:=

@hello := "Hello world"

3.使用控制器传过来的对象实例

正如在ERB中的那样,为了使用控制器的导出变量,我们必须先调用tfetch()或者T_FETCH()宏定义。例如,如果这个变量属于QString类型,那么我们可以这么写:

@hello : tfetch(QString, msg);  eh(msg);

正如在ERB中的那样,通过这种方式获取的变量相当于一个局部变量,注意它的作用范围——从fetch()开始到遇到一个空行。
接下来,我们来研究下如何在两个地方使用同一个导出变量。这种情况下,我们可以通过#init来实现预抓取。这样,在此之后都可以随意使用它,用法如下:

#init : tfetch(QString, msg);@foo1 := msg@foo2 ~= QString("message is ") + msg

其实还有另一种使用导出变量的方法——利用$这个特殊运算符。比如,你可以通过下面的代码直接输出导出变量的值:

@foo1 :=$ obj1

这相当于tfetch()eh()的结合,如果想要实现tfetch()echo()相结合,可以这么写:

@foo1 :==$ obj1

4.实现循环

如果我们想输出一个博客文章列表,那么必不可少地要用到循环。首先,我们要在模板文件中像这样写:

<tr data-tf="@foreach"><td data-tf="@id"></td><td data-tf="@title"></td><td data-tf="@body"></td>
</tr>

然后在表现逻辑文件的内容如下:

 @foreach :tfetch(QList<Blog>, blogList);    /* Fetch processing */for (auto &b, blogList) {%%}@id ~= b.id()@title ~= b.title()@body ~= b.body()

其中最重要的就是%%这个符号,它指代的是整个带@foreach属性值的标签元素,比如在上面的例子中就是<tr></tr>
这样,for(auto %b,blogList){}中的每一次循环都会输出一个<tr>...</tr>结构块。

 <tr><td>100</td><td>Hello</td><td>Hello world!</td>
</tr><tr><td>101</td><td>Good morning</td><td>This morning ...</td>
</tr><tr>:    (← 不断重复)

同理,data_tf这个属性会消失不见。

5.动态增加属性

我们可以使用Otama运算符来对网页元素动态增加指定属性,例如我们有这样一个标记元素:

<span data-tf="@spancolor">Message</span>

现在,假设我们这样写表现逻辑的代码:

@spancolor + echo("class=\"c1\" title=\"foo\"");

那么,最后我们得到的页面将会是:

<span class="c1" title="foo">Message</span>

在这里,+运算符就实现了增加属性的功能。同时,我们也可以这么写:

@spancolor +== "class=\"c1\" title=\"foo\""

因为echo()等同于==,或者还可以这么写:

@spancolor +== a("class", "c1") | a("title", "foo")

这里的a()方法会创建一个带属性的HTML超链接标签,同时可以使用|来连接它们。但是如果你在这里使用echo()方法来代替==,那么最终的输出结果将会变成这样的字符串——key1=”val1”, key2=“val2”……

6.生成超链接

举个例子,如果我们的模板文件内容如下:

<a class="c1" data-tf="@foo">Back</a>

然后,表现逻辑代码文件的内容如下:

@foo :== linkTo("Back", urla("index"))

那么,最终生成的页面代码将会是:

<a href="/Blog/index/">Back</a>

因为:运算符会完全完全替代原来的网页元素,然后linkTo(内容,连接地址)方法又会生成一个新的<a>标签。如果你想保留原来模板中的<a>标签的属性,而不是完全替换,可以这么写:

@foo :== linkTo("Back", urla("index"), Tf::Get, "", a("class", "c1"))

如果你不想重复写两次class="c1",也可以考虑使用|==运算符。它会合并前后两组属性从而生成一个新的标签,比如:

@foo  |== linkTo("Back", urla("index"))

最终生成的网页代码为:

<a class="c1" href="/Blog/index/">Back</a>

值得注意的是,如果两个地方都出现了同一个属性,那么将优先取值为表现逻辑代码的。

7.生成表单

使用表单进行POST数据时,最好开启CSRF(跨站请求伪造)的检查功能。生成<form>的做法跟生成<a>有多少相似的地方,比如我们会在模板文件这样写:

<form method="post" data-tf="@form">

然后在表现逻辑这么写:

@form |== formTag( ... )

8.隐藏一个网页元素

我们可以使用@dummy标记属性来隐藏一个网页元素,比如:

<div><p>Hello</p><p data-tf="@dummy">message ..</p>
</div>

最终生成的页面将会是:

<div><p>Hello</p>
</div>

9.删除标签而保留内容

有时候,你真的需要这个功能,比如布局文件已经输出了<html>元素,然后你在模板端就不需要重复在输出,但是仍需要保留<html>...</html>内部的内容,那么可以这么写:

<html data-tf="@dummytag"><p>Hello</p>
</html>

最终输出结果如下:

<p>Hello</p>

10.导入头文件

因为表现逻辑代码是由C++写成的,所以必不可少地要导入相应的头文件。我们可以这样导入我们自己编写的头文件:

include "blog.h" 
include "user.h"

但是一些基础的TreeFrog框架头文件会自动导入,我们无需再多此一举。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_858948.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始开发一个大型网站

从零开始开发一个大型网站 更新&#xff1a;前端代码已全部由TypeScript进行重写 这是本人第一个从零开始开发一个大型网站&#xff08;前后端部署代码&#xff09;&#xff0c;是一个内容分享社区&#xff0c;详细信息见github。目前还是开发中后期&#xff0c;随后还要进行…

使用MVC框架开发网站(一)

概述 本章您将学会&#xff1a; 1.MVC的概念及使用 2.MVC与ASP.NET的区别 3.路由和URL导向 4.控制器和视图 5.模型与模型状态 6.过滤器 7……. 第1章_MVC与ASP.NET的区别 1.1概述 MVC是一种流行的Web应用架构技术&#xff0c;他把Web应用划分成Model、Controller和V…

利用beego开发网站(一)

在这里&#xff0c;我将分享我这段时间学到的关于怎样搭建一个简单的beego项目&#xff0c;分享的东西仅仅是入门级别。 一&#xff0c;安装golang的开发工具和语言的编译工具&#xff08;如果本步骤不会的话&#xff0c;请去golang中国社区查阅资料进行开发搭建&#xff09; 我…

使用ThinkPHP框架快速开发网站(多图)

使用ThinkPHP框架快速搭建网站 这一周一直忙于做实验室的网站&#xff0c;基本功能算是完成了。比较有收获的是大概了解了ThinkPHP框架。写一些东西留作纪念吧。如果对于同样是Web方面新手的你有一丝丝帮助&#xff0c;那就更好了挖。 以前用PHP做过一个很蹩脚的网站&#xff0…

node爬虫_爬取斗图啦网站上的表情包

最近在学习node.js,做点不是人的事情&#xff1a;爬取网站上的表情包 实现步骤&#xff1a; 1、分析网站的结构&#xff1a; 斗图啦这个网站是服务器渲染的&#xff0c;直接打开网站就可以获取到完整的html信息。 我们可以看到下面两张图就是我们需要获取的信息 2、使用的插…

良心安利卧室su模型素材网站

前方干货满满&#xff0c;建议先收藏再看哦&#xff01;为大家整理卧室su模型素材&#xff0c;总有满足你需求的一款&#xff0c;除此之外&#xff0c;免费&#xff0c;资源质量好&#xff0c;一键打包下载&#xff0c;你还不心动吗&#xff1f; 因为小编的工作原因&#xff0…

必备 免费人物虚幻模型素材网站

前方干货满满&#xff0c;建议先收藏再看哦&#xff01;为大家整理人物虚幻模型素材&#xff0c;总有满足你需求的一款&#xff0c;除此之外&#xff0c;免费&#xff0c;资源质量好&#xff0c;一键打包下载&#xff0c;你还不心动吗&#xff1f; 本人曾经也是废大把时间寻找…

超全机械设备 机器3dm犀牛资源素材网站整理

想必大家都在为找机械设备 机器3dm犀牛资源而头疼吧&#xff0c;今天小编都为大家整理好咯&#xff0c;上资源的机械设备 机器3dm犀牛资源&#xff0c;大家喜欢的可以先行收藏哈&#xff0c;之后会持续更新哒~ 接下来就给大家介绍一下我珍藏已久的网站&#xff1a;爱给网&…

良心安利办公室样机模板素材网站

因为工作的原因&#xff0c;我会经常使用到素材网站&#xff0c;各个平台的模式不太一样&#xff0c;内容也各有特点。刚开始接触素材网站都是一头雾水&#xff0c;走了很多弯路&#xff0c;一些很简单的操作都花去很长的操作时间.....今天给大家安利办公室样机模板素材网站&am…

超全公园sketchup模型素材网站整理

想必大家都在为找公园sketchup模型而头疼吧&#xff0c;今天小编都为大家整理好咯&#xff0c;超多的公园sketchup模型资源&#xff0c;大家喜欢的可以先行收藏哈&#xff0c;之后会持续更新哒~ 接下来就给大家介绍一下我珍藏已久的网站&#xff1a; 爱给网&#xff0c;我的工…

宝藏又小众的飞机cc0高清摄影图片素材网站分享

天天各大网站找飞机cc0高清摄影图片素材&#xff1f;最后空手而归&#xff1f;今天为大家推荐飞机cc0高清摄影图片素材网站&#xff0c;质量上乘适合资源慌缺的你&#xff0c;话不多说准备开始收藏吧&#xff01; 因为小编的工作原因&#xff0c;经常会使用到飞机cc0高清摄影图…

超全伏特加免抠摄影素材网站整理

因为工作的原因&#xff0c;我会经常使用到素材网站&#xff0c;各个平台的模式不太一样&#xff0c;内容也各有特点。刚开始接触素材网站都是一头雾水&#xff0c;走了很多弯路&#xff0c;一些很简单的操作都花去很长的操作时间.....今天给大家安利伏特加免抠摄影素材网站&am…

实验·搭建nginx网站

实验搭建nginx网站 实验环境 CentOS 7.6 nginx源码包 nginx-1.12.2.tar 实验步骤>开启nginx统计模块并可以正常访问 #创建用户nginx [rootlocalhost opt]# useradd -M -s /sbin/nologin nginx#安装环境 [rootlocalhost opt]# yum -y install gcc gcc-c pcre pcre-dev…

世界各国语言学习网站

世界各国语言学习网站 来自 佳人 卿本佳人发表 收录于昨天 59 分享 转自&#xff1a; 鲜果网 世界各国语言学习资源&#xff0c;没有找不到的&#xff0c;只有想不到的&#xff0c;保证你一辈子也学不完…… 篇幅比较长&#xff0c;是按地域分的&#xff0c;这里先列个地域清…

美国科技博客网站gadgetcrave.com近日评出世界现代史上10大最为重要的技术和产品

美国科技博客网站gadgetcrave.com近日评出世界现代史上10大最为重要的技术和产品&#xff0c;其中电灯、电话、电视、电脑和互联网等技术和产品上榜。gadgetcrave.com网站称&#xff0c;这次评选去掉了那些对于公众而言直观性较低(如晶体管、电力和内燃机等)的技术和产品&#…

JavaScript系列—性能优化之《网站性能优化实战——从12.67s到1.06s的故事》

本篇博文来源于网络 226 人赞同了该文章 原文作者&#xff1a;IMWeb jerryOnlyZRJ 原文链接&#xff1a; 网站性能优化实战--从12.67s到1.06s的故事 - 腾讯Web前端 IMWeb 团队社区 史上最全面、最完整的网站性能监测与优化策略 0.引言 作为互联网项目&#xff0c;最重要的便…

编译ASP.NET网站项目,以及部署网站到本地localhost服务器上实现独立运行

1.准备步骤 操作系统&#xff1a;windows 10 IDE&#xff1a;visual studio 2017 我们创建了一个网站项目后&#xff0c;“解决方案资源管理器”中能看到我们编写好的项目文件 准备好源文件后就可以开始编译工作。 2.发布Web应用&#xff0c;进行编译 右键项目名称&#xff0c;…

Apache+mono实现ASP.NET网站在ubuntu服务器上运行

要求&#xff1a;提前安装好Apache2 安装mono mono是一个用来在linux环境下运行.NET的应用 mono官网安装方法 安装库到ubuntu 16.04上&#xff08;其余版本参考上方官方说明&#xff09;&#xff1a; sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-…

如何让外网访问自己写的网站

由内网映射到外网 准备材料实现步骤 准备材料 写好的工程应用 &#xff1b;natapp&#xff0c;获取注册点这里&#xff1a;Here&#xff1b; 实现步骤 注册并实名认证&#xff1b;购买隧道&#xff0c;免费隧道&#xff1b;见图&#xff1a; 复制authtoken&#xff1b;让本…

Python实战项目之模拟浏览器访问京东网站并输入关键字自动搜索

Python实战项目之模拟浏览器访问京东网站并输入关键字自动搜索 1、下载安装PyCharm 下载网址&#xff1a;http://www.jetbrains.com/pycharm/ 2、下载chromedriver 下载网址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 3、在PyCharm环境安装selenium库…