首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

【北大天网搜索引擎TSE学习札记】第6节——获取用户输入

2013-01-26 
【北大天网搜索引擎TSE学习笔记】第6节——获取用户输入(一)获取用户在浏览器中输入的查询数据,需要跟web服务

【北大天网搜索引擎TSE学习笔记】第6节——获取用户输入
(一)

        获取用户在浏览器中输入的查询数据,需要跟web服务器进行数据交互,这就用到了前面提到的CGI方式。如果对CGI程序还是不太熟悉,请先阅读相关资料学习(推荐:http://blog.csdn.net/lewsn2008/article/details/8519908)。这里简单叙述一下,CGI程序怎样获取用户在浏览器中输入的数据。

        首先,说明一下,index.html中的定义的form的method属性是“get”,也就是浏览器将以“get模式”向服务器发送数据,服务器的CGI程序也需要以“get模式”来获取数据。用户输入搜索字符串然后点击搜索按钮后,会想服务器发送一个合成的URL,在我的TSE中输入“清华大学”点击搜索按钮得到URL为:http://localhost/yc-cgi-bin/index/TSESearch?word=%C7%E5%BB%AA%B4%F3%D1%A7&www=%CB%D1%CB%F7&cdtype=GB。中间有一个问号将URL分割成两个部分,前一部分为CGI程序的路径,也就是index.html的<form>中action属性指定的CGI程序路径;后一部分是用户请求的数据,数据部分是一个一个的以“&”符号分割的键值对,也就是这样的形式:?key1=value1&key2=value2。再观察一下一共有三个键值对,名字分别为word、www和cdtype,在看看index.html中的<form>定义,发现里面三个<input>标签中的name和这三个键名是一一对应的。所以,很明白了,“get模式”会把<form>中的数据以键值对的形式附加字URL中发送给服务器,所以URL中“word=”后面的字符串“%C7%E5%BB%AA%B4%F3%D1%A7”实际上就是我输入的查询字符串“清华大学”的汉字编码。

        服务器的CGI程序怎样获取URL中附加的数据信息呢?服务器收到用户的请求信息后会把数据设置到环境变量中,所以CGI可以从环境变量来读取数据。这里对环境变量不再赘述,只提提程序中用到的两个非常重要的环境变量:其一是REQUEST_METHOD,它是HTTM请求的模式,即“GET”和“POST”,TSE系统是用的GET模式,index.html定义<form>时里面有一个属性method为get;其二为QUERY_STRING,它就是URL中附加的数据字符串,对应上面的URL的QUERY_STRING为: word=%C7%E5%BB%AA%B4%F3%D1%A7&www=%CB%D1%CB%F7&cdtype=GB,CGI程序需解析这个字符串从中提取出需要的数据(键值对)。

 (二)

        看到第4节中main函数中获取用户输入部分,定义了一个CQuery类对象,该类为搜索功能的实现类,提供加载数据文件、获取用户输入、中文分词、检索关键词等接口。然后调用了CQuery类的GetInputs函数,该函数就是解析QUERY_STRING并提取出键值对。在看该函数的源代码之前,先看一下CQuery类的定义,主要是其中定义的数据成员。


图1

        为什么原作者会写这样的代码呢?也是有原因的。因为,当用户在搜索结果页面中进行新的搜索或者选择显示搜索结果的第几页时,提交的URL的第二个键值对确实是页号(后面分析“显示搜索结果”部分时还将详细说明),该键值对的键名为"start",这种情况下是可以获取HtmlInputs[1].Value赋值给m_iStart。所以设置m_iStart时需要判断键名是不是为"start"。这里我对该函数进行了修改,如下所示:

void CQuery::SetStart(){    if (strcmp(HtmlInputs[1].Name, "start") == 0) {        m_iStart =atoi(HtmlInputs[1].Value);    } else {       m_iStart = 1;//LB_c: 如果URL中没有页号值则设置默认值(默认显示结果的第一页)    }}

热点排行