Google CTemplate

在设计web开发方面,通常在展示页面方面需要做到数据逻辑与展示的分离,如果使用传统的cgi c方式,通过printf输出动态html,逻辑有点混乱,程序不够简洁,本人主要介绍使用Google CTemplate开源C++模板引擎。使用ctemplate可以产生html(contains javascript,css,etc),xml,json格式的内容。

CTemplate由两部分组成

1.模板

2.字典

 

1.模板

所谓模板,就是一些预先定义好的输出格式,模板中定义了四种输出规范,分别如下所示

a. 变量 使用{{VARIABLE}}这种方式去定义

b. 段落 使用{{#SEG}} {{/SEG}}这种方式去定义,段落有两种用途,

     一种是显示或者隐藏某个段落,

    另外一种是循环输出,ctemplate模板本身不支持循环,需要使用程序去多次输出。

c. 模板包含 和include类似,就是包含了其他模板(该模板独立存在于另外的模板文件.tpl中),使用方法跟段落类似,只是需要我们去设置包含模板的文件。

d. 注释行 {{!COMMENT}},注释行不会包含在字典中。

 

2.字典

所谓字典,就是一些键值映射关系,字典中的key对应到模板中的具体标记中(如果该标记在字典中存在的话),

如果在字典中没有找到模板对应的标记,那么该标记的值可以认为是空。(模板中的标记是大小写敏感的)

 

构建json模板

View Code
var userinfo_list=
{
    "count":"{{COUNT}}",
    "result":"{{RESULT}}",

{{#ERROR}}
   "errmsg":"{{ERR_MSG}}",
{{/ERROR}}

"userinfo_array":[
   {{#USERINFO_LIST}}
      {
        "code":   "{{CODE}}",
        "userid": "{{USRID}}",
         "sex":    "{{SEX}}",
         "age":    "{{AGE}}",
         "nickname": "{{NICKNAME}}",
         "province":   "{{PROVINCE}}",
          "city": "{{CITY}}"
       },
  {{/USERINFO_LIST}}]

};

上面的模板包含了如下几部分

1.变量COUNT,RESULT,ERR_MSG,CODE,USRID,SEX,AGE,NICKNAME等

2.段落 ERROR,USERINFO_LIST(包括段落开始标记和段落结束标记)

输出程序如下所示

View Code
 1 #include <stdlib.h> 
 2 #include <string> 
 3 #include <iostream>   
 4 #include <CTemplate/CTemplate.h>
 5 
 6 using namespace std;
 7 using namespace ctemplate;
 8 
 9 int COUNT = 5;
10 
11 void main()
12 { 
13     TemplateDictionary dict("json");
14    
15     for(int i = 0; i < count;i++)
16    {
17         TemplateDictionary *dict1 =   dict.AddSectionDictionary("USERINFO_LIST" );
18         dict1->SetValue("CODE","200");    
19         dict1->SetValue("USRID","1");     
20         dict1->SetValue("SEX","m");    
21         dict1->SetValue("AGE","20");    
22         dict1->SetValue("NICKNAME","测试");    
23         dict1->SetValue("PROVINCE","广东");    
24     }
25 
26     dict.SetIntValue("COUNT", count);
27     if(1)
28     {
29         dict.ShowSection( "USERINFO_LIST" ); 
30     }
31 
32     string output; 
33     ctemplate::ExpandTemplate("./userinfo.tpl",     ctemplate::DO_NOT_STRIP, &dict, &output); 
34      std::cout << output; 
35      return 0; 
36 }

段落USERINFO_LIST被输出5次。

posted on 2012-07-18 17:09  ActiveChange  阅读(2087)  评论(0编辑  收藏  举报

导航