浏览 4155 次
锁定老帖子 主题:发布一个比较老旧的Web开发C++类库
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||
发表时间:2012-05-28
最后修改:2012-06-05
代码地址: 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: 确定基类有虚析构函数:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。 类库和函数列表:
简单范例: /// \file example.cpp /// 代码示例文件,演示一个简单CGI流程 #include <iostream> #include "webapplib.h" using namespace webapp; int main() { /*************************************************************************** 演示完整的CGI应用程序流程,模拟WEB查询动作 1、读取CGI参数和Cookie数据(String、Cgi、Cookie) 2、使用读取到的参数调用权限检查接口(ConfigFile、HttpClient) 3、使用读取到的参数查询数据库(MysqlClient) 4、使用日志文件记录用户请求(FileSystem、Utility、Encode) 5、更新用户端Cookie(Cookie、DateTime) 6、显示HTML页面(Template) ***************************************************************************/ //////////////////////////////////////////////////////////////////////////// // 1、读取CGI参数和Cookie数据(Cgi、Cookie) Cgi cgi; Cookie cookie; String username = cgi["username"]; String usercookie = cookie["usercookie"]; /*提示 webapp::Cgi在读不到CGI环境变量时会运行在调试模式,提示输入CGI参数值*/ //////////////////////////////////////////////////////////////////////////// // 2、使用读取到的参数调用权限检查接口(ConfigFile、HttpClient) ConfigFile conf( "example.conf" ); String check_interface = conf["check_interface"]; cout << "---------------------------------------------------------" << endl; cout << "check user privilege from:" << check_interface << endl; HttpClient www; www.request( check_interface + "?username=" + username ); if ( www.done() && www.content()=="CHECK_PASS" ) { cout << "check pass" << endl; } else { cout << "check fail" << endl; } //////////////////////////////////////////////////////////////////////////// // 3、使用读取到的参数查询数据库(MysqlClient) String value; #ifndef _WEBAPPLIB_NOMYSQL String sql; sql.sprintf( "SELECT value FROM table WHERE user='%s'", escape_sql(username).c_str() ); MysqlClient mysqlclient; MysqlData mysqldata; mysqlclient.connect( "example.mysql.com", "user", "pwd", "database" ); if ( mysqlclient.is_connected() ) { if ( mysqlclient.query(sql,mysqldata) ) { value = mysqldata( 0, "value" ); } else { cout << mysqlclient.error() << endl; } } #endif //_WEBAPPLIB_NOMYSQL //////////////////////////////////////////////////////////////////////////// // 4、使用日志文件记录用户请求(FileSystem、Utility、Encode) String log_path = "/tmp/"; String log_file = log_path + "/logfile.txt"; if ( !file_exist(log_path) || !is_dir(log_path) ) { make_dir( log_path ); } file_logger( log_file, "username:%s", username.c_str() ); file_logger( log_file, "usermd5:%s", md5_encode(username).c_str() ); cout << "---------------------------------------------------------" << endl; String file_content; file_content.load_file( log_file ); cout << file_content << endl; //////////////////////////////////////////////////////////////////////////// // 5、更新用户端Cookie(Cookie、DateTime) DateTime now; DateTime expires = now + ( TIME_ONE_DAY*3 ); // Cookie有效期为三天 cookie.set_cookie( "username", username, expires.gmt_datetime() ); //////////////////////////////////////////////////////////////////////////// // 6、显示HTML页面(Template) Template page("example.tmpl"); page.set( "username", username ); page.set( "value", value ); // 显示查询结果 cout << "---------------------------------------------------------" << endl; http_head(); page.print(); } 代码中使用的配置文件和模板文件 example.conf # comments check_interface = http://example.com/check example.tmpl welcome {{$username}}! you query result is here: {{$value}} 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||
发表时间:2012-07-03
最近刚学C++,恰巧遇到需要html模板处理类,目前只会写简单的变量替换,有空看看楼主这个,学习一下for循环方面的处理。
|
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||
发表时间:2012-07-04
有什么问题可以在这里留言或者给我email发信。
|
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||
发表时间:2012-07-04
最后修改:2012-07-04
很高兴,有幸能阅读到这份代码,可以作为我学习的标准。
目前只是粗略翻了一下,string 等类的封装很实用。 |
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||
发表时间:2012-08-10
和我以前写的一个有些类似,思路是一样的
|
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||
发表时间:2012-11-12
我这里也有一个:http://wooce.iteye.com/blog/517021
|
|||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||