CppCMS不知不覺已經用了很久了,產品也開發了幾個。不過CppCMS的版本一直在演化,1.0已經正式發布,文檔也在不斷增加和更新。本篇從自己的體會談談模板系統(template system).
下面這篇文章系統的介紹了template system。本文部分選取其中的例子,但是從我的角度重新解釋。作者的文章有時候不是那麼容易理解。
http://cppcms.com/wikipp/en/page/cppcms_1x_templates_gen
用模板自動產生C++類
由於CppCMS也是MVC系統,所以很自然需要瞭解一下後端通過C++程式渲染頁面的機制。也就是View。
<% skin purple %> <% view master uses data::master %> <% template render() %> ... <% end template %> <% end view %><% end skin %>
上面的代碼配置了skin,view和template。這些代碼最終都會被CppCMS翻譯成C++代碼。
view master 會被實現為一個名叫master的C++類,這個master類所在的namespace叫做purple,由skin指定。
template render()會被實現為master類的render()函數
...代表了網頁的HTML代碼(也可包含很多CSS/JavaScript代碼),這些都會被專程render函數內部的C++代碼,比如:
virtual void render() {#line 25 "/home/chenshu/my_git/cml/cppweb/template/welcome.tmpl"out()<<"\r\n""<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n""<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n""<head>\r\n""<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n""<title>cml</title>\r\n""<style type=\"text/css\">\r\n""<!--\r\n"
上面的代碼來自我的一個網站軟體。篇幅較長,只顯示片段。
out()<<"..." 就是將網頁內容寫入到HTTP Response的內容裡面,然後返回到瀏覽器。
最終父類
所有view標記產生的類都最終繼承了cppcms::base_view了。比如上面的master類,由於沒有指定父類,因此直接從base_view繼承。
引用成員的使用
view標記裡面的uses語句代表這個類master內部有一個成員變數data::master.
在類中的定義如下:
data::master& data;
同時會建立一個master的建構函式類接收參數初始化該引用成員。比如:
master(std::ostream &_s,data::master &_data): cppcms::base_view(_s),data(_data)
文本替換
<%= name %> 裡面的name是可以被替換的,比如在tmpl檔案裡面用到了<%= base_url %>,實際上會被替換成C++代碼:(<% name %>用法已經被廢除,總是要加上=)
out()<<cppcms::filters::escape(data.base_uri);
因此我們必須確保data::master類裡面有base_uri公有成員變數.
看到這裡很自然就會思考,如果寫成<%=base_uri()%>函數形式是否可以?是否會被翻譯成如下C++代碼?
out()<<cppcms::filters::escape(data.base_uri());
經過測試,當然可以。