问题:如何理解CPPCMS application中的dispatcher()和mapper().
#include <cppcms/application.h>
#include <cppcms/applications_pool.h>
#include <cppcms/service.h>
#include <cppcms/http_response.h>
#include <cppcms/url_dispatcher.h>
#include <cppcms/url_mapper.h>
#include <iostream>
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");
}
void number(std::string num){
int no = atoi(num.c_str());
response().out() << "The number is " << no << "<br/>\n";
response().out() << "<a href='" << url("/") <<"'>Go back</a>";
}
void smile(){
response().out() << ":-) <br/>\n";
response().out() << "<a href='" << url("/") << "'>Go back</a>";
}
void welcome(){
response().out() <<
"<h1> Welcome to Page with links </h1>\n"
"<a href='" << url("/number", 1) << "'>1</a><br>\n"
"<a href='" << url("/number", 15) << "'>15</a><br>\n"
"<a href='" << url("/smile") << "' >:-)</a><br>\n";
}
};
int main(int argc, char **argv){
try{
cppcms::service srv(argc, argv);
srv.applications_pool().mount(cppcms::applications_factory<hello>());
srv.run();
}
catch(std::exception const &e){
std::cerr << e.what() << std::endl;
}
}
问题解决:CPPCMS web application不同于PHP脚本,而是一个整体的应用程序。因此,每当接收到REQUEST时,根据一些元变量(meta-variable)如PATH_INFO, QUERY STRING等将REQUEST分配给不同的应用程序处理句柄(成员函数)。但是QUERY STRING更适合的是PHP编写的页面, PATH_INFO更适合应用在整体化的CGI应用程序上。
基于此,DISPATCHER这个类产生了,这个类的主要功能就是将正则表达式与成员函数进行进行绑定,当然也附带传递函数调用参数。
理解了dispatcher(),那如何理解mapper()呢?其实个人认为这个mapper()的实际作用不是十分大。仔细看hello类中的成员函数,里面均调用了url(std::string)语句,这个语句在api reference文档写的十分清楚,实际就是调用mapper。通过给出一个key, 可以查询到对应的正则表达式,然后通过给定的参数构建部分PATH_INFO。
示例: url("/number", 15)
1. "/"作为mapper().root, = "/hello"
2. "number" 对应的value = "/number/{1}" /* mapper().assign("number", "/number/{1}"); */
3. 步骤2获取的value可以绑定一个参数,并且传递的参数15应放置在1的位置。
4. 所以最终形成path_info就是/hello/number/15.
当然,我说作用不大的原因是,如果CPPCMS框架不提供mapper组件时,我想大多数DEVELOPER在实际开发网站的过程中也会构建相同功能的工具吧。不过,想来cppcms的作者心是够细的,都为我们提供了如此细节的工具了。
当然mapper()也不是一点作用不起,我们知道CGI的RESPONSE消息有四种类型(document response, local redirect response, client redirect response, client redirect response with document), 其中后面的三种涉及到response header域location的重建。mapper()此时无疑帮你很大忙,因为无需再次解析path_info元变量了。
结论:
1. dispatcher()的主要功能就是通过正则表达式匹配path_info元变量,跟应用程序的句柄进行绑定。也同时让我们了解到了作为standalone cgi application与传统分配请求到不同PHP脚本的不同之处。
2. mapper()最多算一个工具类,帮助developer轻易构建script-URI.
分享到:
相关推荐
总的来说,理解和熟练运用Laravel的`Dispatcher`对于提升应用的架构质量和性能至关重要。通过事件驱动编程和命令调度,你可以创建出更加灵活、可扩展的系统,同时保持代码的整洁和模块化。在实践中,不断地学习和...
### XML中的filter-mapping与dispatcher使用详解 在Java Web开发中,过滤器(Filter)是十分重要的组件之一,主要用于处理客户端请求或响应服务器反馈时的数据处理任务,如编码转换、登录验证、敏感词过滤等。而在...
4. **跨平台**:作为开源软件,Dispatcher很可能支持多种操作系统和环境,如Linux、Windows和MacOS。 5. **社区支持**:开源社区通常会提供文档、示例、讨论论坛等资源,帮助用户理解和使用项目。 6. **版本控制**:...
在IT行业中,Dispatcher通常指的是一个分发器或者调度器,它在不同的通信协议之间起着桥梁的作用。在Java编程中,实现各种通信协议是构建...对于开发者来说,深入理解这些协议及其Java实现是提升技能和解决问题的关键。
在Laravel框架中,Dispatcher(任务分发器)是一个核心组件,它负责处理异步任务和计划任务。本文将深入探讨Laravel中的任务调度和分发机制,以及如何使用Dispatcher来实现更高效、灵活的任务管理。 ### Laravel ...
### 深入理解Go语言中的Dispatcher #### 引言 在现代软件开发中,Go语言因其简洁高效、并发模型独特等特性而受到广大开发者们的青睐。本文将深入探讨Go语言中的Dispatcher概念及其应用场景,旨在帮助读者更好地...
OpenWrt Dispatcher是OpenWrt固件中的一个关键组件,主要负责处理HTTP请求,并将这些请求路由到相应的处理模块。LuCI(Luci意为...对于开发和维护OpenWrt的Web界面来说,理解和掌握这些函数的用法是至关重要的。
Dispatcher是多线程编程中的一个重要概念,特别是在Java和Spring框架中。Dispatcher主要负责调度任务,协调并发执行的各个部分,确保程序的高效运行和资源的合理分配。在本主题中,我们将深入探讨Dispatcher如何实现...
在当前的工程和产品设计领域中,自动化工具的集成是提高效率和减少错误的重要手段。本文档详细介绍了如何将Teamcenter 12(TC12)与Solidworks 2019进行集成,同时侧重于通过Dispatcher服务来进行JT文件格式转换的...
struts.xml文件中新增以下内容: <!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...
总的来说,`org.apache.struts2.dispatcher.FilterDispatcher`是Struts 2框架中一个至关重要的组件,负责请求的分发和Action的调用,对于理解和掌握Struts 2的运行机制具有重要意义。开发者需要熟悉其工作原理和配置...
plexus-sec-dispatcher-1.3.jar
在Windows Presentation Foundation (WPF) 中,UI线程和后台线程之间的通信是通过Dispatcher对象实现的。Dispatcher提供了Invoke和BeginInvoke两种方法,用于在UI线程上执行操作。这两个方法在处理异步操作和异常时...
kamailio-etcd-dispatcher 将针对Asterisk的服务发现添加到Kamailio,让Kamailio... kamailio-etcd-dispatcher是kamailio-etcd-dispatcher和Docker下Asterisk的高可用性设置的一部分。 确保检查出 ,其中包含有关使用C
Dispatcher设计模式是一种用于消息分派和处理的模式,在软件工程中,它充当消息和处理函数之间的适配器角色。在Dispatcher模式中,消息通常与特定的消息ID相关联,而Dispatcher负责根据消息ID将消息分派到对应的处理...
-- 指定请求url与action映射器,默认为org.apache.struts2.dispatcher.mapper.DefaultActionMapper
主要介绍了Zend Framework教程之分发器Zend_Controller_Dispatcher用法,结合实例形式详细分析了分发器Zend_Controller_Dispatcher的结构,功能,使用技巧与相关注意事项,需要的朋友可以参考下