C++写动态站点之HelloWorld!

演示样例源码下载地址:Fetch_Platform.7z

更复杂的代码可參考本博客BBS的实现

简单的说。动态站点就是能够动态变更的站点。动态变化的内容通常来自后端数据库。例如以下省略万字(动态站点

一个个动态的网页汇集成了一个动态站点,动态网页在一定的模板上由后端局部替换。使得用户看到的内容是随需而变。这里我们忽略掉数据库处理部分,直接实现网页内容的变化,从而了解server端的工作原理。对于你了解整个动态站点的工作过程非常有帮助。

注意:下面过程全都在Windows 7 64上使用Visual C++ 2008 Express编译使用。如使用不同的环境或工具,请高手自行搞定

静态页

动态页



watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlwbGlw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

開始使用

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;
    }

加入标签类

标签类负责动态替换模板里的内容,这里的标签最重要的部分就是标签名,必须保证唯一性

标签类必须与.jsp前端网页配合使用才干实现动态显示网页的效果

头文件

#ifndef DEMO_TAG_H
#define DEMO_TAG_H

#include "Poco/Net/base_tag.h"

class DemoTag : public Poco::Net::BaseTag
    /// Generates the number of the last hit shown on this page.
{
public:
    DemoTag();
    ~DemoTag();

#ifndef USING_STENCIL_SERIALIZE
    virtual void printEndTag(Poco::Net::PageRequest* req, Poco::Net::PageResponse* resp);
        /// Called when the parser reaches the end tag.
        ///
        /// @param request The page request.
        /// @param response The page response.
        /// @throws Exception If there was an exception.
#endif
};

#endif // DEMO_TAG_H

实现部分

#include "demo_tag.h"

DemoTag::DemoTag()
{
#if !defined(_DEBUG) || defined(USING_STENCIL_SERIALIZE)
	_type = DEMO_TAG;
#endif
}

DemoTag::~DemoTag()
{
}

#ifndef USING_STENCIL_SERIALIZE
void DemoTag::printEndTag(Poco::Net::PageRequest* req, Poco::Net::PageResponse* resp)
{
    std::string type = getParameter("type");

    // 这里依据不同的type返回不同的字符串给浏览器
    // 实现动态网页的效果
    if (type == "chinese")
    {
        resp->print("你好。世界!");
    }
    else
        resp->print("Hello World!");
}
#endif

必须将该标签类进行注冊后,WebServer才会认识

见BaseTagManager类

void BaseTagManager::registerAllTags()
{
	BaseTagFactory& tagFactory = BaseTagFactory::defaultFactory();
	tagFactory.registerTagClass("demo",                 new Instantiator<DemoTag, BaseTag>);

/*
 * The following will be used to create new object while loading from file
 */
#if !defined(_DEBUG) || defined(USING_STENCIL_SERIALIZE)

	tagFactory.registerTagClass(DEMO_TAG,             new Instantiator<DemoTag, BaseTag>);

#endif // NDEBUG || USING_SERIALIZE_TAG
}

至此当有来自浏览器的请求时,WebServer就能够实现动态输出网页了

前端

新建jsp文件

前端的资源所有放在root文件夹下,WebServer操作网页的根文件夹就在此。

在root目录下,我们新建一个demo的目录,再新建一个.jsp的文件。jsp扩展名用来告诉WebServer当前请求的是一个动态网页

当然你也能够使用随意其它的扩展名,假设想使用其它的扩展名,你须要改动SharedService::handle方法的例如以下部分

    if (file.exists() && file.isFile())
    {
        if (endsWith(newFileName, std::string(".jsp"))) // 以jsp结尾的文件表示动态网页
        {
#ifdef _DEBUG
            Poco::Net::Executer* root = _parser.parse(FETCH_WWWROOT, Path(newFileName).toString());
#else

加入标签

在后端代码部分,我们已经加入过标签处理类,这里须要加入前端部分,仅仅有这两边相应起来,一个真正的动态网页才干正常工作

index.jsp

<fetch:demo/>
<br>
<fetch:demo type="chinese"/>

标签说明

<fetch:demo/>。fetch没有实际作用但不能省略,可用来搜索标签。关键部分在于demo。这个是与后端的

tagFactory.registerTagClass("demo",                 new Instantiator<DemoTag, BaseTag>);

想相应的,假设你想自己新建个别的标签。全然參照demo这个做就可以

<br>,是个标准HTML标签。表示换行

<fetch:demo type="chinese"/>。跟第一行比。多了type="chinese"。这里你也能够改成其它的,但形式必须保证一致。比方你能够改成value="english"。那么相应后端的DemoTag部分中的

std::string type = getParameter("type");

则须要改成

std::string value = getParameter("value");

小结

尽管连图加上代码占领了不少篇幅,实际上仅仅须要例如以下3个步骤就可以实现一个简单的动态站点

  1. 加入Service类,并在ServiceDispatcher中依据文件名称分发
  2. 加入Tag类。并在BaseTagManager中注冊
  3. 加入jsp网页。注意与Tag类配合

假设你有精力,也能够研究一下其它代码,只是大部分时间你差点儿不用关心或改变它们。

时间: 2024-08-24 19:32:42

C++写动态站点之HelloWorld!的相关文章

C++写动态网站之HelloWorld!

示例源代码下载地址:Fetch_Platform.7z 更复杂的代码可参考本博客BBS的实现 简单的说,动态网站就是可以动态变更的网站,动态变化的内容通常来自后端数据库,如下省略万字(动态网站) 一个个动态的网页汇集成了一个动态网站,动态网页在一定的模板上由后端局部替换,使得用户看到的内容是随需而变,这里我们忽略掉数据库处理部分,直接实现网页内容的变化,从而了解服务器端的工作原理,对于你了解整个动态网站的工作过程很有帮助. 注意:以下过程全都在Windows 7 64上使用Visual C++

一周自学动态站点设计

(站点为:http://chentingpc.me) 设计这个站点的框架与0.1版本号的实现,花了总共六天多的时间,将近五六十个小时.实际上,在做需求分析.页面与系统设计的时间占了将近四天,而真正动态功能的部分仅仅花了两天时间来完毕.当然,这当中包含了从零開始对站点的设计与实现的相关语言与工具(HTML.CSS.Javascript.PHP.Mysql)的学习:除了以前用wordpress与discuz之类的框架搭建过站点的经历,我对HTML.CSS.Javascript.PHP.Mysql的编

&lt;数据结构系列1&gt;封装自己的数组——手写动态泛型数组

哈哈,距离上一次写博客已经快过去半个月了,这这这,好像有点慢啊,话不多说,开始我们的手写动态泛型数组 首先是我们自己写一个自己的动态数组类,代码如下所示: public class Array<E> { //成员变量:数据,大小 private E[] data; private int size; //构造函数,传入数组的容量capacity public Array(int capacity) { data=(E[])new Object[capacity]; size=0; } //无参

手写动态代理(抄的)

如图1所示,动态代理的使用 这篇文章讲解动态代理的原理,以及如何手写动态代理. 以下是有关动态代理的使用,这是JDK默认帮我们实现的动态代理. public class Main implements InvocationHandler { static Person person=new PersonImp(); public static void main(String[] args) throws Throwable { Person o = (Person)Proxy.newProxy

powerbasic为powerbuilder写动态库之二

前几天写的动态库遇到个新问题,当动态库参数为结构体时,程序不能调用,一调用就崩掉.经过向群里大侠请教,最后终于解决. powerbasic中传递字符串用ASCIIZ*N 定长字符串时powerbuilder用character abc[n] 接收 powerbasic中传递指针时 dim str_prt asciiz prt powerbuilder用 string 接收 powerbasic定义结构如下时 TYPE mytype str_name AS ASCIIZ PTR str_id AS

如何学习struts并写第一个程序HelloWorld

在编写这个程序前,我觉得盲目地去跟着视频来敲代码或者看完视频后就去练习并不是个好办法.我的做法是:一.去把Struts框架的原理搞清楚,也可以去struts的官方网站 http://struts.apache.org 查阅,它的原理图如下: 简单介绍一下这个原理图的大致意思: (1).客户端发送请求后提交到一系列的过滤器,主要有三层,并且有一定顺序,先是ActionContextCleanUp过滤器,然后再到其他过滤器(SiteMesh等),再到FilterDispatcher过滤器. (2).

用JSP写动态网页

JSP作为动态网页开发技术,有一套自己的元素,它除了HTML静态内容之外,还包括指令.表达式.JSP小脚本.声明.标准动作.注释等元素. JSP页面由静态内容.指令.表达式.小脚本.声明.标准动作.注释等元素构成. JSP中包括基本动态元素有 : 1.注释    2.指令   3.Java代码段   4.表达式   5.声明 JSP文件中有:1.HTML静态部分   2.<%Java代码段%>执行的动态部分 JSP中的注释: 1.HTML注释: <! -- 要注释的内容-- > J

JS写动态分页样式效果

效果图如下: html: <body> <div> <table id="btnbox"> <tbody> <tr><td> <a href="#" class="btn">上一页</a> <a href="#" index="1">1</a> <a href="#&quo

CSS写动态下拉菜单 -----2017-03-27

动态网站第一步:动态下拉菜单 关键点: overflow:hidden max-height xx:hover {} 设置当鼠标移上之后的效果 transition:   设置过度时间 cursor:  设置鼠标效果 opacity: 设置透明度 0-1 如下图所示 <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <sty