• <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>

            西城

            指尖代碼,手上年華

            聯(lián)系 聚合 管理
              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
               }
            }
            這是官方教程中的一個(gè)例子,我想從這個(gè)例子的分析中弄明白cigcc庫(kù)工作的一些基本原理。這個(gè)例子中包括了對(duì)接收
            數(shù)據(jù)的處理以及對(duì)瀏覽器的輸出。

            首先輸出http header。HTTPHTMLHeader是一個(gè)類(lèi),它的繼承體系是MStreamable->HTTPHeader->
            HTTPContentHeader->(HTTPHTMLHeader,HTTPPlainHeader,HTTPXHTMLHeader).從名字上可以看出,因?yàn)槔^承自MStreamable,HTTPHTMLHeader應(yīng)該是重載了cout操作符。

            MStreamable中的提供了一個(gè)純虛函數(shù):
             virtual void
              render(STDNS ostream& out)                 const = 0;
            還有一個(gè)右元函數(shù):
            friend CGICC_API STDNS ostream& 
              operator<<(STDNS ostream& outconst MStreamable& obj);
            這就是其中實(shí)現(xiàn)重載的函數(shù)。其實(shí)現(xiàn)就是調(diào)用obj.reader(out);基類(lèi)想要實(shí)現(xiàn)相應(yīng)的功能,只需實(shí)現(xiàn)reader函數(shù)即可.HTTPHeader是一個(gè)抽象基類(lèi),不需要實(shí)現(xiàn)此函數(shù)。HTTPContentHeader實(shí)現(xiàn)了這個(gè)函數(shù)。
            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創(chuàng)建時(shí),將“text/html"傳給HTTPContentHeader的構(gòu)造函數(shù)即可,HTTPContentHeader會(huì)繼續(xù)將此參數(shù)往上傳至HTTPHeader,然后通過(guò)getData調(diào)用取出。


            CIGCC中將每一個(gè)標(biāo)簽都定義為一個(gè)類(lèi)。比如以下幾個(gè)
            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是一個(gè)宏
            #define BOOLEAN_ELEMENT(name, tag) \
            TAG(name, tag); typedef HTMLBooleanElement<name##Tag> name

            TAG也是一個(gè)宏
            #define TAG(name, tag) \
            class name##Tag   \
            public: inline static const char* getName() { return tag; } }
            這個(gè)宏展開(kāi)就是一個(gè)類(lèi)。
            以“html"為例,其相應(yīng)的類(lèi)為
            class htmlTag
            {
                   public:
                  inline static const char* getName()
                  {return "html";}
            };
            而后面的typedef則導(dǎo)致
            html= HTMLBooleanElement<htmlTag>. 
            HTMLBooleanElement是一個(gè)模板類(lèi),用相應(yīng)的標(biāo)簽實(shí)例化后,
            html()=HTMLBooleanElemnt<htmlTag>()-------->構(gòu)造函數(shù)。而HTMLBooleanElement
            的繼承體系則是MStreamable-->HTMLElement-->HTMLBooleanELemnt<Tag>,依然是可輸出的。
            這一次reader的函數(shù)實(shí)現(xiàn)是在HTMLELement類(lèi)中。其實(shí)現(xiàn)的細(xì)節(jié)暫時(shí)可不必探究。

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

            Feedback

            # re: cgicc解析(2)——頭以及標(biāo)簽 2012-03-27 09:41 tb
            很好啊   回復(fù)  更多評(píng)論
              

            国产69精品久久久久9999APGF| 国产精品美女久久久免费| 国产精品熟女福利久久AV| 久久香蕉综合色一综合色88| 久久精品国产清高在天天线| 久久电影网一区| 久久天天躁狠狠躁夜夜2020| 99久久国产综合精品女同图片 | 久久久久久久尹人综合网亚洲| 久久久久久亚洲精品成人| 香港aa三级久久三级| 久久久国产精华液| 国产精品欧美亚洲韩国日本久久| 奇米影视7777久久精品人人爽 | 久久久久99精品成人片牛牛影视| 婷婷国产天堂久久综合五月| 国产精品久久一区二区三区| 亚洲精品午夜国产va久久| 国产69精品久久久久99尤物| 亚洲AV日韩AV天堂久久| 亚洲国产综合久久天堂| 国产精品免费久久| 国产人久久人人人人爽| 一本色道久久88综合日韩精品 | 久久美女人爽女人爽| 少妇人妻88久久中文字幕| 久久久不卡国产精品一区二区 | 久久中文精品无码中文字幕| 国产精品美女久久久| 97精品伊人久久久大香线蕉 | 国产精品久久久久久吹潮| 偷窥少妇久久久久久久久| 欧美久久一级内射wwwwww.| 欧美一区二区精品久久| 狠狠色丁香久久综合五月| 东京热TOKYO综合久久精品| 一本久道久久综合狠狠爱| 精品国产青草久久久久福利| 久久人人爽人人人人爽AV| 久久无码国产专区精品| 久久久久亚洲AV无码专区首JN|