MYCP开发指南系列之:开发第一个C++ Servlet

红薯 发布于 2011/01/05 10:23
阅读 1K+
收藏 3

1.1    开发第一个 C++ Servlet

C++ Servlet CSP 一样,是MYCPweb 层组件,用于输出动态HTML 页面,实现web 应用的界面显示。关于CSP 的开发规范请看《CSP_1_1.pdf 》文档,本节主要简单描述Servlet 的开发流程。

1.1.1   cspServlet.cpp 文件

新建一个cspServlet.cpp 文件,或者利用VC 新建一个普通DLL 类型工程项目。

1.1.2   添加头文件

#include <CGCBase/httpapp.h>

using namespace cgc;

1.1.3   实现标准 doGET 函数

extern "C" HTTP_STATUSCODE CGC_API doGET(const cgcHttpRequest::pointer & request, cgcHttpResponse::pointer response)

{

     cgcSession::pointer session = request->getSession();

     response->println("<HTML>" );

     response->println("<TITLE>MYCP Web Server</TITLE>" );

     response->println("<h1>Get Sample</h1>" );

     response->println("<h2>Session Info:</h2>" );

     if (session->isNewSession())

     {

         response->println("This is a new session." );

     }else

     {

         response->println("This is not a new session." );

     }

     response->println("<h2>Headers:</h2>" );

     std::vector<cgcKeyValue::pointer> headers;

     if (request->getHeaders(headers))

     {

         for (size_t i=0; i<headers.size(); i++)

         {

              cgcKeyValue::pointer keyValue = headers[i];

              response->println("%s: %s" , keyValue->getKey().c_str(), keyValue->getValue()->getStr().c_str());

         }

     }else

     {

         response->println("Not header info." );

     }

     response->println("<h2>Propertys:</h2>" );

     std::vector<cgcKeyValue::pointer> parameters;

     if (request->getParameters(parameters))

     {

         for (size_t i=0; i<parameters.size(); i++)

         {

              cgcKeyValue::pointer keyValue = parameters[i];

              response->println("%s = %s" , keyValue->getKey().c_str(), keyValue->getValue()->getStr().c_str());

         }

     }else

     {

         response->println("Not property." );

     }

     response->println("</HTML>" );

     return STATUS_CODE_200;

}

1.1.4   编译部署

编译cspServlet 工程,生成cspServlet.dll 或者libcspServlet.so 文件,复制文件到$(MYCP_BINPATH)/modules 目录。

修改$(MYCP_BINPATH)/conf/modules.xml 文件,在app 配置项增加一个组件配置项;

<app>

<module>
<file>cspServlet</file>

<allowall>1</allowall>
</module>


</app>


<!-- 设置组件文件,允许开放所有函数。-->

 

1.1.5   测试 cspServlet 组件

打开浏览器,输入http://127.0.0.1:81/servlet/cspServlet ,访问cspServlet 组件的doGET 函数,如下图:

 


http://127.0.0.0:81 是服务器域名或IP 地址,后面带servlet 是固定格式,用于访问所有的C++ Servlet 组件,默认访问doGET 函数。

下图演示带参数访问cspServlet 组件的doGET 函数:


1.1.6   开发自定义函数

如下代码实现一下自定义函数HelloWorld

extern "C" HTTP_STATUSCODE CGC_API doHelloWorld(const cgcHttpRequest::pointer & request, cgcHttpResponse::pointer response)

{

     response->println("<HTML>" );

     response->println("<TITLE>MYCP Web Server</TITLE>" );

     response->println("<h1>HelloWorld Sample</h1>" );

     response->println("</HTML>" );

     return STATUS_CODE_200;

}

1.1.7   测试自定义函数

打开浏览器,输入http://127.0.0.1:81/servlet/cspServlet/HelloWorld ,访问cspServlet 组件的doHelloWorld 函数,如下图:

 


1.1.8   支持 Servlet 函数

MYCP 除了支持以下标准HTTP 函数,还支持自定义函数:

l         doGET

l         doPOST

l         doPUT

l         doDELETE

l         doHEAD

l         doOPTIONS

l         doTRACE

l         doCONNECT

1.1.9   总结

C++ Servlet 支持实现CSP 相同功能,输出动态HTML 页面,CSP 不用编译,而Servlet 需要,所以UI 层面层建议使用CSP 做开发,而Servlet 做为辅助开发,帮助实现业务处理文件的功能。

可以利用Servlet 支持的其他标准函数,如doPUTdoDELETE 等,配合输出XML 数据,实现REST 风格开发框架。

加载中
0
C**
C**

有直接用C++开发出来的网站?网页?

0
ddatsh
ddatsh

别有一翻风味啊

0
于忠达
于忠达

呵呵,c也搞java风格了

0
张林
张林

这是好事,看来以后可以出C sevlet框架了

0
Lunar_Lin
Lunar_Lin

不错. 我也一直都有这样的思路,不过没有任何动力(钱~~~)去实现它. 有人做出来 真好! 嘿嘿.

  挺担心:  请求页面时加载一个dll, 结束后再free dll, 效率可能比较差. 而缓存过多的dll 也恐成为麻烦根源.

 可能是我庸人自扰吧.

     另外对dll的代码 没有约束..(不过你在dll里乱搞,害自己的Web服务器出故障,也是活该.), 个人想法是利用开源软件gcc, 程序员写好基本的C++代码,但不编译成dll, 而是由Web容器自己在部署的时候 调用gcc编译成dll, 这样可以限制加载的模块和允许使用的头文件(通过编译错误禁用 系统的api和其它不合适的本地代码).

    瞎想一气. 欢迎板砖.

0
Lunar_Lin
Lunar_Lin

每每看到什么 C++ Web编程 不如java 等等. C++有种写个牛逼的web服务, 什么的, 心情格外郁闷.

  哈哈. 不是不能. 做一个应用,本来就受到业界发展方向以及流行口味的影响.没办法的事情.

  另外个人觉得使用C/C++配合lua也很好. lua是效率非常高的脚本语言. 如果有很好的支持,应用在Web上应该不错.

0
akee
akee
看来开源中国社区这里的气氛不错,以后要多来这里学习交流了.
返回顶部
顶部