免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7770 | 回复: 31
打印 上一主题 下一主题

发布一个比较老旧的Web开发C++类库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-28 17:10 |只看该作者 |倒序浏览
本帖最后由 pi1ot 于 2012-06-05 12:33 编辑

发布一个比较老旧的Web开发C++类库

代码地址:
https://code.google.com/p/webapplib/
https://github.com/pi1ot/webapplib

简单说明:
WebAppLib是一系列主要用于类Unix操作系统环境下WEB开发的C++类库。设计目的是通过提供使用简单方便、相对独立的C++类和函数来简化CGI程序开发过程中的常见操作,提高开发效率。

背景介绍:
这个类库已经非常老旧了,是我03年到05年间开发维护的,05年之前曾应用于多个新浪项目,包括当时的论坛、聊天、用户库、CMS等,05年后随着新浪前端应用开发全面转向PHP,逐渐没人用了,现在大概只剩下少数历史比较悠久的项目还在继续使用吧。一开始是作为本人学习C++的练手项目开始的,后来用的人逐渐增多,其间陆陆续续升级了七八个版本,应该说大部分代码的稳定性已经经历过了考验,考虑到一点点个人感情因素,现在简单整理一下发布出来,没有任何使用上的限制,大概也不会有后续更新。这次发布之前做了一下整理,重构了一些类库和函数的命名,删除了很多已经证明并不需要的冗余接口。

建议:
现在Web开发的主流显然不是C++,不过如果你想学习或者了解一下CGI开发的细节,可以作为参考,或者如果你已经有一个以C++为主体代码的项目,需要一点简单的Web包装,又不想学习或者引入一门新的脚本语言,可以试试看这个WebAppLib

其他:
webapp::String 的实现,受当时知识水平的限制,为了能沿用 std::string 的全部接口,是 public 继承自std::string的,现在看来显然不是一个说得过去的方案,只是在那几年的使用场景中,似乎也没有发现有不稳定的情况,所以现在懒得去修改了,各位自行决定是否使用吧。
附说明,摘自《Effective C++》
条款14: 确定基类有虚析构函数:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。

类库和函数列表:
String继承并兼容与std::string的字符串类,增加了开发中常用的字符串处理函数
Cgi支持文件上传的CGI参数读取类
CookieHTTP Cookie设置与读取类
MysqlClientMySQL数据库连接类,MySQL连接处理C函数接口的C++封装
MysqlDataMySQL查询结果数据集类,MySQL查询结果数据提取C函数接口的C++封装
Template支持在模板中嵌入条件跳转、循环输出脚本的 HTML 模板类
HttpClientHTTP/1.1通信协议客户端类
DateTime日期时间运算、格式化输出类
TextFile固定分隔符文本文件读取解析类
ConfigFileINI格式配置文件解析类
FileSystem文件系统操作函数库
Encode字符串编码解码函数库
Utility系统调用与工具函数库


简单范例:
  1. /// \file example.cpp
  2. /// 代码示例文件,演示一个简单CGI流程

  3. #include <iostream>
  4. #include "webapplib.h"

  5. using namespace webapp;

  6. int main() {
  7.         /***************************************************************************
  8.         演示完整的CGI应用程序流程,模拟WEB查询动作       
  9.         1、读取CGI参数和Cookie数据(String、Cgi、Cookie)
  10.         2、使用读取到的参数调用权限检查接口(ConfigFile、HttpClient)
  11.         3、使用读取到的参数查询数据库(MysqlClient)
  12.         4、使用日志文件记录用户请求(FileSystem、Utility、Encode)
  13.         5、更新用户端Cookie(Cookie、DateTime)
  14.         6、显示HTML页面(Template)
  15.         ***************************************************************************/       

  16.         ////////////////////////////////////////////////////////////////////////////
  17.         // 1、读取CGI参数和Cookie数据(Cgi、Cookie)
  18.        
  19.         Cgi cgi;
  20.         Cookie cookie;
  21.         String username = cgi["username"];
  22.         String usercookie = cookie["usercookie"];
  23.        
  24.         /*提示 webapp::Cgi在读不到CGI环境变量时会运行在调试模式,提示输入CGI参数值*/
  25.        
  26.         ////////////////////////////////////////////////////////////////////////////
  27.         // 2、使用读取到的参数调用权限检查接口(ConfigFile、HttpClient)
  28.        
  29.         ConfigFile conf( "example.conf" );
  30.         String check_interface = conf["check_interface"];
  31.        
  32.         cout << "---------------------------------------------------------" << endl;
  33.         cout << "check user privilege from:" << check_interface << endl;
  34.        
  35.         HttpClient www;
  36.         www.request( check_interface + "?username=" + username );
  37.         if ( www.done() && www.content()=="CHECK_PASS" ) {
  38.                 cout << "check pass" << endl;
  39.         } else {
  40.                 cout << "check fail" << endl;
  41.         }
  42.        
  43.         ////////////////////////////////////////////////////////////////////////////
  44.         // 3、使用读取到的参数查询数据库(MysqlClient)
  45.         String value;
  46.         #ifndef _WEBAPPLIB_NOMYSQL

  47.         String sql;
  48.         sql.sprintf( "SELECT value FROM table WHERE user='%s'", escape_sql(username).c_str() );
  49.        
  50.         MysqlClient mysqlclient;
  51.         MysqlData mysqldata;

  52.         mysqlclient.connect( "example.mysql.com", "user", "pwd", "database" );
  53.         if ( mysqlclient.is_connected() ) {
  54.                 if ( mysqlclient.query(sql,mysqldata) ) {
  55.                         value = mysqldata( 0, "value" );
  56.                 } else {
  57.                         cout << mysqlclient.error() << endl;
  58.                 }
  59.         }

  60.         #endif //_WEBAPPLIB_NOMYSQL

  61.         ////////////////////////////////////////////////////////////////////////////
  62.         // 4、使用日志文件记录用户请求(FileSystem、Utility、Encode)
  63.        
  64.         String log_path = "/tmp/";
  65.         String log_file = log_path + "/logfile.txt";
  66.         if ( !file_exist(log_path) || !is_dir(log_path) ) {
  67.                 make_dir( log_path );
  68.         }

  69.         file_logger( log_file, "username:%s", username.c_str() );
  70.         file_logger( log_file, "usermd5:%s", md5_encode(username).c_str() );
  71.        
  72.         cout << "---------------------------------------------------------" << endl;
  73.         String file_content;
  74.         file_content.load_file( log_file );
  75.         cout << file_content << endl;

  76.         ////////////////////////////////////////////////////////////////////////////
  77.         // 5、更新用户端Cookie(Cookie、DateTime)
  78.        
  79.         DateTime now;
  80.         DateTime expires = now + ( TIME_ONE_DAY*3 ); // Cookie有效期为三天
  81.         cookie.set_cookie( "username", username, expires.gmt_datetime() );
  82.        
  83.         ////////////////////////////////////////////////////////////////////////////
  84.         // 6、显示HTML页面(Template)
  85.        
  86.         Template page("example.tmpl");
  87.         page.set( "username", username );
  88.         page.set( "value", value );
  89.        
  90.         // 显示查询结果
  91.         cout << "---------------------------------------------------------" << endl;
  92.         http_head();
  93.         page.print();
  94. }
复制代码
代码中使用的配置文件和模板文件
example.conf
  1. # comments
  2. check_interface = http://example.com/check
复制代码
example.tmpl
  1. welcome {{$username}}!
  2. you query result is here:
  3. {{$value}}
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-05-28 17:17 |只看该作者
比wt如何?

论坛徽章:
0
3 [报告]
发表于 2012-05-28 17:30 |只看该作者
刚搜了一下你说的wt,我感觉大概唯一能和它相提并论的就是...我的文档也是用doxygen生成的

论坛徽章:
0
4 [报告]
发表于 2012-05-28 18:08 |只看该作者
回复 3# pi1ot


你用doxygen?唔,这是一个好东西。

论坛徽章:
0
5 [报告]
发表于 2012-05-28 19:32 |只看该作者
刚看了下wt,写那库的人脑子不好!
非常的不好!

前端的GUI,用后端C++生成,简直化玉帛为糟糠。



论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2012-05-28 21:26 |只看该作者
代码相当工整啊。

论坛徽章:
0
7 [报告]
发表于 2012-05-28 23:00 |只看该作者
回复 5# AD8018


cgi一向就是这个逻辑。凑合吧。看起来还是不错。

论坛徽章:
0
8 [报告]
发表于 2012-05-29 09:53 |只看该作者
回复 7# walleeee

cgi妄图入侵html内部元素,从来没成功过。

在C/C++写成的浏览器的基础了,有了WEB界面,
程序员本应该享受用WEB实现界面的便捷性。
这个倒好,重新将WEB界面用cgi包装,还是C++的,说作者脑子进水不为过。

cgi用来当生成某文本的途径比较好,
再接上一点数据格式的支持,比如json之类,就足够好。


   

论坛徽章:
0
9 [报告]
发表于 2012-05-29 10:00 |只看该作者
不然怎么表现自己是牛人呢?!

论坛徽章:
0
10 [报告]
发表于 2012-05-29 10:41 |只看该作者
回复 8# AD8018


相当同意你的说法

用html做界面本来就比用C++继承来继承去方便,写两行html就能够出来的界面,干嘛非跑去写C++类

不说别的,就CU论坛这个界面,拿那个wt写写看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP