java网页写多了,没事用c++写着玩。cgi,应该算是非常老了,它的最大好处,就是弄成可执行程序放进去就OK了。
因为平时只会用apache,这里使用的http服务器都是apache2。
为了使用类似java servlet方式,自己来绑定uri和执行方法,通过写一个dispatcher和rewrite来搞定。
首先,需要将所有访问重写到这个dispatcher上,这里是一个简单的rewrite规则:
代码如下 | 复制代码 |
RewriteEngine On RewriteRule ^/cgi-bin/(.*)$ /cgi-bin/cppweb/$1 [L,PT,QSA] |
这里cppweb是一个编译出来的可执行程序,rewrite后面的参数:
L:最后一条匹配的规则
PT:执行完成后继续执行其他处理(这里主要是为了应用alias配置)
QSA:追加query string
这样,如果请求/cgi-bin/a,内部会被重写成/cgi-bin/cppweb/a。
后面就是cppweb的实现了。为了方便,对于cgi的处理,采用了gnu的cgicc库,它对很对cgi操作进行了封装。
大致实现:
代码如下 | 复制代码 |
int main(int argc, char **argv) { REGISTER_URL("/list", List, handle); REGISTER_URL("/video/new", VideoNew, handle); cgicc::Cgicc cgi; cgicc::CgiEnvironment env = cgi.getEnvironment(); cgicc::CgiInput input = cgicc::CgiInput(); ctemplate::Template::SetTemplateRootDirectory(input.getenv("TEMPLATE_PATH")); Context ctx = {cgi, input, std::cout}; Handler::instance().handleFunc(env.getPathInfo(), ctx); return 0; } |
前面两行暂时忽略,是用来对url和处理的函数进行绑定用的,后面进行介绍。这里先创建cgicc对象,它主要封装了cgi环境变量和输入、输出。这里后面可以参考cgicc里面的实例,将cgi改造成fastcgi。刚刚重写的url,这里可以通过cgi中的环境变量path info来或者,cgicc中将这个环境变量封装成了一个独立的方法。如刚才重写后的url /cgi-bin/cppweb/a,这里获取到的path info就是/a,然后就可以通过/a和最终处理业务逻辑的函数绑定在一起就搞定了。
这里还介绍下自定义环境变量的用法。上面的代码里面获取了环境变量TEMPLATE_PATH,最为输出模板的查询根路径,直接在apache配置中增加:
代码如下 | 复制代码 |
SetEnv TEMPLATE_PATH /tmp/mycppweb/templates |
这样就能在运行时获取到这个模板路径了,网站可以通过类似的方式定义其他参数,类似j2ee里面的web.xml差不多吧。
永劫无间手游测试服 安卓版v1.0.262342
下载永劫无间手游台服 安卓版v1.0.262342
下载永劫无间手游国际服 安卓版v1.0.262342
下载永劫无间手游豌豆荚版 安卓版v1.0.262342
下载曼德拉男孩 最新版v2025.1.1
曼德拉男孩是一款专为女性玩家准备的治愈类恋爱游戏,在这里玩家
游戏开发者无限金币版 最新版v1.0.16
游戏开发者内置菜单版是一款非常好玩的模拟经营类手游,内部有功
没有中间商赚差价内购版 最新版v23.7.3
没有中间商赚差价免广告是一款非常好玩的模拟经营类手游,无需看
我的世界某不科学的空岛下载mcbbs 最新版v隔壁老王
我的世界某不科学的空岛整合包是一款像素风格的模拟沙盒游戏,该
洗衣店模拟器无限钞票免广告版 v2.2.2
洗衣店模拟器无限钞票版是一款模拟经营类手游,玩家们将在游戏中