• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            西城

            指尖代碼,手上年華

            聯系 聚合 管理
              20 Posts :: 0 Stories :: 62 Comments :: 0 Trackbacks
            #include <iostream>
            #include <vector>
            #include <string>

            #include "cgicc/Cgicc.h"
            #include "cgicc/HTTPHTMLHeader.h"
            #include "cgicc/HTMLClasses.h"

            using namespace std;
            using namespace cgicc;

            int 
            main(int argc, 
                 char **argv)
            {
               try {
                  Cgicc cgi;

                  // Send HTTP header
                  cout << HTTPHTMLHeader() << endl;

                  // Set up the HTML document
                  cout << html() << head(title("cgicc example")) << endl;
                  cout << body() << endl;

                  // Print out the submitted element
                  form_iterator name = cgi.getElement("name");
                  if(name != cgi.getElements().end()) {
                     cout << "Your name: " << **name << endl;
                  }

                  // Close the HTML document
                  cout << body() << html();
               }
               catch(exception& e) {
                  // handle any errors - omitted for brevity
               }
            }
            這是官方教程中的一個例子,我想從這個例子的分析中弄明白cigcc庫工作的一些基本原理。這個例子中包括了對接收
            數據的處理以及對瀏覽器的輸出。

            首先輸出http header。HTTPHTMLHeader是一個類,它的繼承體系是MStreamable->HTTPHeader->
            HTTPContentHeader->(HTTPHTMLHeader,HTTPPlainHeader,HTTPXHTMLHeader).從名字上可以看出,因為繼承自MStreamable,HTTPHTMLHeader應該是重載了cout操作符。

            MStreamable中的提供了一個純虛函數:
             virtual void
              render(STDNS ostream& out)                 const = 0;
            還有一個右元函數:
            friend CGICC_API STDNS ostream& 
              operator<<(STDNS ostream& outconst MStreamable& obj);
            這就是其中實現重載的函數。其實現就是調用obj.reader(out);基類想要實現相應的功能,只需實現reader函數即可.HTTPHeader是一個抽象基類,不需要實現此函數。HTTPContentHeader實現了這個函數。
            CGICCNS HTTPContentHeader::render(STDNS ostream& out)    const
            {
              out << "Content-Type: " << getData() << STDNS endl;

              STDNS vector<HTTPCookie>::const_iterator iter; 
              for(iter = getCookies().begin(); iter != getCookies().end(); ++iter)
                out << *iter << STDNS endl;
              
              out << STDNS endl;
            }
            HTTPContentHeader創建時,將“text/html"傳給HTTPContentHeader的構造函數即可,HTTPContentHeader會繼續將此參數往上傳至HTTPHeader,然后通過getData調用取出。


            CIGCC中將每一個標簽都定義為一個類。比如以下幾個
            BOOLEAN_ELEMENT (html,       "html");       // HTML document
            BOOLEAN_ELEMENT (head,       "head");       // document head
            BOOLEAN_ELEMENT (title,      "title");      // document title
            ATOMIC_ELEMENT  (meta,       "meta");       // meta data
            BOOLEAN_ELEMENT (style,      "style");      // style sheet
            BOOLEAN_ELEMENT (body,       "body");       // document body

            BOOLEAN_ELEMENT是一個宏
            #define BOOLEAN_ELEMENT(name, tag) \
            TAG(name, tag); typedef HTMLBooleanElement<name##Tag> name

            TAG也是一個宏
            #define TAG(name, tag) \
            class name##Tag   \
            public: inline static const char* getName() { return tag; } }
            這個宏展開就是一個類。
            以“html"為例,其相應的類為
            class htmlTag
            {
                   public:
                  inline static const char* getName()
                  {return "html";}
            };
            而后面的typedef則導致
            html= HTMLBooleanElement<htmlTag>. 
            HTMLBooleanElement是一個模板類,用相應的標簽實例化后,
            html()=HTMLBooleanElemnt<htmlTag>()-------->構造函數。而HTMLBooleanElement
            的繼承體系則是MStreamable-->HTMLElement-->HTMLBooleanELemnt<Tag>,依然是可輸出的。
            這一次reader的函數實現是在HTMLELement類中。其實現的細節暫時可不必探究。

            獲取輸入那塊上篇已講過,此處略去。
            posted on 2012-03-26 22:24 西城 閱讀(1349) 評論(1)  編輯 收藏 引用 所屬分類: Cgicc

            Feedback

            # re: cgicc解析(2)——頭以及標簽 2012-03-27 09:41 tb
            很好啊   回復  更多評論
              

            久久久精品国产免大香伊| 久久国内免费视频| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 一级a性色生活片久久无少妇一级婬片免费放 | 国产成人久久AV免费| 精品久久久中文字幕人妻| 久久精品中文字幕一区| 国产成人久久精品麻豆一区| 99热热久久这里只有精品68| 婷婷久久综合九色综合绿巨人| 麻豆精品久久久久久久99蜜桃| 99精品久久精品一区二区| 久久久精品波多野结衣| 久久亚洲精品国产精品| 国产一区二区三区久久精品| 午夜视频久久久久一区 | 久久精品国产影库免费看| 久久精品国产第一区二区| 日本人妻丰满熟妇久久久久久| 国产香蕉97碰碰久久人人| 亚洲AV无码久久寂寞少妇| 94久久国产乱子伦精品免费| 日产精品久久久久久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久国产成人午夜AV影院| 久久久久人妻精品一区二区三区 | 日韩精品久久久久久免费| 久久久久亚洲精品男人的天堂| 久久夜色精品国产噜噜亚洲AV| 国产日韩欧美久久| 97久久久精品综合88久久| 亚洲午夜无码久久久久| 亚洲欧美国产精品专区久久| 国产日韩欧美久久| 91精品婷婷国产综合久久| 国内精品伊人久久久久av一坑| 亚洲AⅤ优女AV综合久久久| 久久国产成人精品国产成人亚洲| 日本精品久久久久中文字幕8| 久久久久久久尹人综合网亚洲| 久久精品国产免费一区|