1. 程式人生 > >C++寫動態站點之HelloWorld!

C++寫動態站點之HelloWorld!

reat pre ice short share endif 世界 一個 editor

演示樣例源碼下載地址:Fetch_Platform.7z

更復雜的代碼可參考本博客BBS的實現


簡單的說。動態站點就是能夠動態變更的站點。動態變化的內容通常來自後端數據庫。例如以下省略萬字(動態站點

一個個動態的網頁匯集成了一個動態站點,動態網頁在一定的模板上由後端局部替換。使得用戶看到的內容是隨需而變。這裏我們忽略掉數據庫處理部分,直接實現網頁內容的變化,從而了解server端的工作原理。對於你了解整個動態站點的工作過程非常有幫助。

註意:下面過程全都在Windows 7 64上使用Visual C++ 2008 Express編譯使用。如使用不同的環境或工具,請高手自行搞定技術分享

靜態頁

技術分享

動態頁

技術分享


開始使用

IDE

在Visual C++ Express 2008下打開項目方案,

fetch_platform\build\vc2008\fetch_platform.sln,按例如以下圖所看到的配置

技術分享

站點port

站點程序的入口在文件HTTPFormServer.cpp,以下是站點的port。通常為80port。為了避免可能的port沖突。這裏使用8020,站點程序執行起來能夠使用http://localhost:8020/訪問

當然假設你電腦上的80port沒有被其它程序占用。能夠簡單的使用http://localhost/進行訪問

            unsigned short port = 8020;
			if (args.size() > 0) // change default port
				port = (unsigned short) NumberParser::parse(args[0]);


後端

加入服務類

加入一個頭文件DemoService.h

#ifndef DEMO_SERVICE_H
#define DEMO_SERVICE_H

#include "shared_service.h"

class DemoService : public SharedService
{
public:
    void handle(Poco::Net::HTTPServerRequest& req, Poco::Net::HTTPServerResponse& resp,
        Poco::URI& uri, const std::string& fileName);

public:
    static const std::string SERVICE_PREFIX; // 用於URL分發
    
private:
};

#endif // DEMO_SERVICE_H

實現文件DemoService.cpp

#include "demo_service.h"

const std::string DemoService::SERVICE_PREFIX        = "/demo/";

// 凡是地址欄顯演示樣例如以下的都會進入以下這種方法
// http://domain/demo/***
//
void DemoService::handle(Poco::Net::HTTPServerRequest& req, Poco::Net::HTTPServerResponse& resp, 
    Poco::URI & uri, const std::string& fileName)
{
    // 分類處理demo下不同的請求。然後return
    //
    // 否則,假設沒有特別的處理,將直接調用父類的handle方法
    
    // 作為演示樣例。這裏沒有對DemoService進行擴充,感興趣能夠下載BBS的源碼
    // 因此這裏直接交由父類處理
    //
    SharedService::handle(req, resp, uri, fileName);
}

WebServer是怎樣將瀏覽器的請求轉發到DemoService的

答案就在ServiceDispatcher類。詳細例如以下

    // demo service
    if (startsWith(fileName, DemoService::SERVICE_PREFIX))
    {
        DemoService demo;
        demo.handle(req, resp, uri, fileName);
        return;
    }


加入標簽類