每个框架都有需要知道的地方,想不到cppcms这个web框架里面官方有例子的。下面将对官方的几个例子进行整理。
ps: 官方入门教程在这里
http://cppcms.com/wikipp/en/page/cppcms_1x_tut_hello
[ps]环境搭建之类的请参考:
http://www.52play.net/blog/post?id=64
http://www.52play.net/blog/post?id=66
第一个例子是hello world。
首先,打开的qt creator,然后在main.cpp里面添加如下代码:
#include#include #include #include #include class hello : public cppcms::application { public: hello(cppcms::service &srv) : cppcms::application(srv) { } virtual void main(std::string url); }; void hello::main(std::string /*url*/) { response().out() << "\n" "\n" " Hello World
\n" "\n" "\n"; } int main(int argc,char ** argv) { try { cppcms::service srv(argc,argv); srv.applications_pool().mount( cppcms::applications_factory() ); srv.run(); } catch(std::exception const &e) { std::cerr << e.what() << std::endl; } }
然后,值得注意的是,cppcms启动的时候需要一个设置文件--config.js,代码如下:
{ "service" : { "api" : "http", "port" : 8080 }, "http" : { "script_names" : [ "/hello" ] } }
好了,将这个文件保存到某个地方,譬如我就放到了:
/home/too-white/conf/web.config.js
然后在启动程序的时候将文件路径传进去,具体这样做:
在打开“项目”标签找到“run”的标签,然后在command line arguments里面添加:
-c /home/too-white/conf/web.config.js
如下图所示:
好了,执行查看结果:
好了,hello world例子讲解完毕。
这一小节要要用到模板引擎。
原文在:
http://cppcms.com/wikipp/en/page/cppcms_1x_tut_hello_templates
原文在:
http://cppcms.com/wikipp/en/page/cppcms_1x_tut_url_mapping
例子代码:
#include#include #include #include #include #include #include #include class hello : public cppcms::application { public: hello(cppcms::service &srv) : cppcms::application(srv) { dispatcher().assign("/number/(\\d+)",&hello::number,this,1); mapper().assign("number","/number/{1}"); dispatcher().assign("/smile",&hello::smile,this); mapper().assign("smile","/smile"); dispatcher().assign("",&hello::welcome,this); mapper().assign(""); mapper().root("/hello"); } virtual void number(std::string num); virtual void smile(); virtual void welcome(); }; void hello::number(std::string num) { int no = atoi(num.c_str()); response().out() << "The number is " << no << "
\n"; response().out() << "Go back"; } void hello::smile() { response().out() << ":-)
\n"; response().out() << "Go back"; } void hello::welcome() { response().out() << "Welcome To Page with links
\n" "1
\n" "15
\n" ":-)
\n"; } int main(int argc,char ** argv) { try { cppcms::service srv(argc,argv); srv.applications_pool().mount( cppcms::applications_factory() ); srv.run(); } catch(std::exception const &e) { std::cerr << e.what() << std::endl; } }
运行以后:
运行成功。
原文在这里:
http://cppcms.com/wikipp/en/page/cppcms_1x_tut_hierarchy
上一个小节讲的是相当于一个控制器里面有多个action,那么怎么实现多个控制器,每个控制器多个action呢?这就是这一个小节要做的。
下面的代码例子与原文有所不同,因为原文的demo不太符合实际。
要实现的控制器:
1、user控制器,里面有:get【获取用户信息】,login【用户登录】,uploadAvatar【用户上传头像】三个接口。要求访问方式为:/user/get/用户的账号id即:userId , /user/login , /user/uploadAvatar
2、首页控制起【index】,getIndexBanner【获取首页广告】,getHotNews【获取热门新闻】
首先,设置web.config.js 为【具体设置参考第一小节hello world的例子】,
{ "service" : { "api" : "http", "port" : 8080 }, "http" : { "script_names" : [ "/" ] } }
值得注意,我这里先剧透一下,script_names是一个很重要的参数:
相当于虚拟目录的作用:
譬如:如果正常你在程序配置的访问路径是 /user/get/20001 ,那么假如 script_names=/ 就可以直接用 /user/get/20001
进行访问,否则 访问路径就是 script_names + /user/get/20001.
代码结构如下:
各个其中IndexController和UserController分别是子模块,webapphandler是总入口模块。
分别有:
indexcontroller.h
#pragma once #include#include #include #include #include #include #include #include #include #include class IndexController : public cppcms::application { public: IndexController (cppcms::service &srv); void index(); void getIndexBanner(); void getHotNews(); };
indexcontroller.cpp
#include "indexcontroller.h" IndexController::IndexController (cppcms::service &srv): cppcms::application(srv) { dispatcher().assign("",&IndexController::index,this); mapper().assign(""); dispatcher().assign("/getIndexBanner",&IndexController::getIndexBanner,this); mapper().assign("getIndexBanner","/getIndexBanner"); dispatcher().assign("/getHotNews",&IndexController::getHotNews,this); mapper().assign("getHotNews","/getHotNews"); } void IndexController::index(){ response().out() << "这是默认地址,无此接口的。"; } void IndexController::getIndexBanner() { response().out() << "【接口】获得首页广告"; } void IndexController::getHotNews() { response().out() << "【接口】获得热门新闻列表"; }
usercontroller.h
#pragma once #include#include #include #include #include #include #include #include #include #include class UserController: public cppcms::application { public: UserController(cppcms::service &srv); void get(std::string strUserId); void login(); void uploadAvatar(); };
usercontroller.cpp
#include "usercontroller.h" UserController::UserController(cppcms::service &srv): cppcms::application(srv) { dispatcher().assign("/get/(\\d+)",&UserController::get,this,1); mapper().assign("get","/get/{1}"); dispatcher().assign("/login",&UserController::login,this); mapper().assign("login","/login"); dispatcher().assign("/uploadAvatar",&UserController::uploadAvatar,this); mapper().assign("uploadAvatar","/uploadAvatar"); } void UserController::get(std::string strUserId){ response().out() << "【接口】获取个人信息:当前您要获取的用户的id是:"<
入口模块:
webapphandler.h
#pragma once #include#include #include #include #include #include #include #include #include #include class WebAppHandler: public cppcms::application { public: WebAppHandler(cppcms::service &srv); void intro(); void index(); }; webapphandler.cpp
#include "webapphandler.h" #include "controller/indexcontroller.h" #include "controller/usercontroller.h" WebAppHandler::WebAppHandler(cppcms::service &srv): cppcms::application(srv) { //--这里解释一下吧。 //--这段代码的意思是:只要匹配到前面的url【去掉script_names即虚拟目录】是由/index开头的话,那么就 //--跳到 我们设定好的new IndexController(srv)这个实例里面进行处理, //--譬如:如果是:/index/getHotNews ,那么就满足这个条件并且,需要处理的【截取到的action】的url部分是: //--getHotNews attach( new IndexController(srv), "index", "/index{1}" // mapping ,"/index(/(.*))?", 1); // dispatching attach( new UserController(srv), "user", "/user{1}" ,"/user(/(.*))?", 1); // dispatching //--从上面往下,如果不满足前面两条规则,就判断是否满足 /intro dispatcher().assign("/intro",&WebAppHandler::intro,this); mapper().assign("intro","/intro"); //--默认的页面。 dispatcher().assign("",&WebAppHandler::index,this); mapper().assign(""); } void WebAppHandler::intro(){ response().out()<<"这是AppHandler的描述页面,暂无意义。"; } void WebAppHandler::index(){ response().out()<<"你好这是默认网站首页" <<"
注意,除掉虚拟路径,你可以访问一下几个demo接口地址" << "
" <<"/user/get/20001 /user/login /user/uploadAvatar
" << "/index/getHotNews /index/getIndexBanner
" << "/intro" ; }
好了,程序的入口函数main.cpp是:
#include#include #include #include #include #include #include #include #include "webapphandler.h" int main(int argc,char ** argv) { //--这是demo程序,记得在执行的时候添加上 -c 你的配置文件路径 try { cppcms::service app(argc,argv); app.applications_pool().mount(cppcms::applications_factory ()); app.run(); } catch(std::exception const &e) { std::cerr<
那么执行之后会有这些页面显示:
首页:
其他页面:
结语
本篇文章主要参考了官网,对cppcms这个c++的网站框架进行试用,并且给出部分实际试用例子。
下一篇文章将阐述在实际生产环境下 略显复杂的 c++ 项目如何分模块进行调用,开发。
ps: 想要下载项目源代码的请到这里下载:
c++多模块web项目实践方案【cmake+cppcms+boost+fmt】