`
qqsunkist
  • 浏览: 33006 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

理解cppcms中的dispatcher和mapper

 
阅读更多

问题:如何理解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

    总的来说,理解和熟练运用Laravel的`Dispatcher`对于提升应用的架构质量和性能至关重要。通过事件驱动编程和命令调度,你可以创建出更加灵活、可扩展的系统,同时保持代码的整洁和模块化。在实践中,不断地学习和...

    xml里filter-mapping中的dispatcher的使

    ### XML中的filter-mapping与dispatcher使用详解 在Java Web开发中,过滤器(Filter)是十分重要的组件之一,主要用于处理客户端请求或响应服务器反馈时的数据处理任务,如编码转换、登录验证、敏感词过滤等。而在...

    Dispatcher,.zip

    4. **跨平台**:作为开源软件,Dispatcher很可能支持多种操作系统和环境,如Linux、Windows和MacOS。 5. **社区支持**:开源社区通常会提供文档、示例、讨论论坛等资源,帮助用户理解和使用项目。 6. **版本控制**:...

    dispatcher

    在IT行业中,Dispatcher通常指的是一个分发器或者调度器,它在不同的通信协议之间起着桥梁的作用。在Java编程中,实现各种通信协议是构建...对于开发者来说,深入理解这些协议及其Java实现是提升技能和解决问题的关键。

    Laravel开发-dispatcher 任务分发器

    在Laravel框架中,Dispatcher(任务分发器)是一个核心组件,它负责处理异步任务和计划任务。本文将深入探讨Laravel中的任务调度和分发机制,以及如何使用Dispatcher来实现更高效、灵活的任务管理。 ### Laravel ...

    深入理解Go语言中的Dispatcher

    ### 深入理解Go语言中的Dispatcher #### 引言 在现代软件开发中,Go语言因其简洁高效、并发模型独特等特性而受到广大开发者们的青睐。本文将深入探讨Go语言中的Dispatcher概念及其应用场景,旨在帮助读者更好地...

    dispatcher.doc

    OpenWrt Dispatcher是OpenWrt固件中的一个关键组件,主要负责处理HTTP请求,并将这些请求路由到相应的处理模块。LuCI(Luci意为...对于开发和维护OpenWrt的Web界面来说,理解和掌握这些函数的用法是至关重要的。

    Dispatcher 多线登录,辅助登录

    Dispatcher是多线程编程中的一个重要概念,特别是在Java和Spring框架中。Dispatcher主要负责调度任务,协调并发执行的各个部分,确保程序的高效运行和资源的合理分配。在本主题中,我们将深入探讨Dispatcher如何实现...

    【工具集成】Solidworks2019集成TC12调Dispatcher转JT.pdf

    在当前的工程和产品设计领域中,自动化工具的集成是提高效率和减少错误的重要手段。本文档详细介绍了如何将Teamcenter 12(TC12)与Solidworks 2019进行集成,同时侧重于通过Dispatcher服务来进行JT文件格式转换的...

    Struts2_s2-016&017&ognl2.6.11_patch漏洞补丁

    struts.xml文件中新增以下内容: &lt;!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --&gt; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...

    org.apache.struts2.dispatcher.FilterDispatcher

    总的来说,`org.apache.struts2.dispatcher.FilterDispatcher`是Struts 2框架中一个至关重要的组件,负责请求的分发和Action的调用,对于理解和掌握Struts 2的运行机制具有重要意义。开发者需要熟悉其工作原理和配置...

    plexus-sec-dispatcher-1.3.jar

    plexus-sec-dispatcher-1.3.jar

    WPF 使用 Dispatcher 的 InvokeAsync 和 BeginInvoke 的异常处理差别.rar

    在Windows Presentation Foundation (WPF) 中,UI线程和后台线程之间的通信是通过Dispatcher对象实现的。Dispatcher提供了Invoke和BeginInvoke两种方法,用于在UI线程上执行操作。这两个方法在处理异步操作和异常时...

    kamailio-etcd-dispatcher:观看etcd键以更新kamailio dispatcher.list

    kamailio-etcd-dispatcher 将针对Asterisk的服务发现添加到Kamailio,让Kamailio... kamailio-etcd-dispatcher是kamailio-etcd-dispatcher和Docker下Asterisk的高可用性设置的一部分。 确保检查出 ,其中包含有关使用C

    利用ORACLE PL_SQL PACKAGE实现DISPATCHER设计模式.pdf

    Dispatcher设计模式是一种用于消息分派和处理的模式,在软件工程中,它充当消息和处理函数之间的适配器角色。在Dispatcher模式中,消息通常与特定的消息ID相关联,而Dispatcher负责根据消息ID将消息分派到对应的处理...

    struts2框架1

    -- 指定请求url与action映射器,默认为org.apache.struts2.dispatcher.mapper.DefaultActionMapper

    Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解

    主要介绍了Zend Framework教程之分发器Zend_Controller_Dispatcher用法,结合实例形式详细分析了分发器Zend_Controller_Dispatcher的结构,功能,使用技巧与相关注意事项,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics