西城

指尖代码,手上年华

联系 聚合 管理
  20 Posts :: 0 Stories :: 62 Comments :: 0 Trackbacks
例子中的一句代码,用来取得用户从浏览器的输入信息。
cgicc::form_iterator name = cgi.getElement("name");
之前已经创建好Cgicc类。想研究一下Cgicc类究竟做了什么。
可以猜测,在调用getElement之前,Cgicc已经存储好了所有的输入。
Cgicc的构造函数主体如下:
CGICCNS Cgicc::Cgicc(reader_function_t stream_reader)
  : fEnvironment(stream_reader)
{
  fFormData.reserve(40);
  fFormFiles.reserve(5);

  if(stringsAreEqual(getEnvironment().getRequestMethod(), "post"))
    parseFormInput(getEnvironment().getPostData());
  else
    parseFormInput(getEnvironment().getQueryString());
}
在初始化参数表中,首先创建一个CgiEnvironment的类的实例,用来初始化系统信息,读取从服务器传来的各个参数。其中包括请求的方法(POST或者GET)。
然后为两个vector分配存储空间。然后通过查看请求的方法调用相应的函数。下面以post为例:
getEnvironment是一个内联函数,用来返回Cgicc的私有变量fEnvironment.fEnvironment的getPostData()方法返回其私有变量fPostData(std::string);
而在CgiEnvirontment的构造函数中:
    STDNS auto_ptr<char> temp(new char[getContentLength()]);

    // use the appropriate reader function
    if(stream_reader == NULL) {
      STDNS cin.read(temp.get(), getContentLength());
      if((unsigned long)STDNS cin.gcount() != getContentLength())
    throw STDNS runtime_error("I/O error");
    }
    else {
      // user specified a reader function
      if((*stream_reader)
     (temp.get(), getContentLength()) != getContentLength())
    throw STDNS runtime_error("I/O error");
    }

    fPostData = STDNS string(temp.get(), getContentLength());

cin读取用户请求并存至temp中,并复制至fPostData中。这就是我们要处理的数据。(temp使用标准库的auto_ptr,会自动销毁)。


对fPostData的进一步处理则由Cgicc::parserFormInput来做。而parserFormInput则通过对整个字符串的解析将其分成键值对,形成一个FormEntry对象,并存入
fFormData(vector)中。所以,在cgicc类创建之后就可以直接通过查询相应的输入数据。getElement利用标准库算法find_if在vector中查找相应的值。STL中一般
用迭代器查找时若无结果都会将迭代器置于容器后一位,所以判断是否查找成功的代码应该这样写:
if(name != cgi.getElements().end()) {
   // iterator refers to a valid element
}

posted on 2012-03-26 16:47 西城 阅读(2369) 评论(0)  编辑 收藏 引用 所属分类: Cgicc

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理