`
csstome
  • 浏览: 1522684 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

试用EF开发WEB应用程序(6): 解析Query String中的各参数值

阅读更多

题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/在线留言


试用EF开发WEB应用程序(6):解析Query String中的各参数值

之前的文章提到,Query String的主要形式是 name1=value1&name2=value2&...,即由 & 符号分隔的多个“名称=值”文本(有时“值”为空,其形式为“名称=”)。在 CGI / FastCGI 程序(以及 JSP/ASP/PHP/PERL等)中,对QueryString进行文本处理,解析出其各“名称”“值”,以便根据“名称”获取对应的值,是非常普遍的操作。这甚至可以理解的 CGI / FastCGI 程序的核心动作,——没有此动作,大部分程序将无法工作。在EF类库 fastcgi.efn 中,我内置了QueryString解析功能。

QueryString是很规则的文本,处理起来不难,主要应该考虑执行效率。在解析之前,有两个准备工作:1、从环境变量QUERY_STRING中读取QueryString文本;2、对上一步得到的QueryString进行URL解码。然后,正常的解析工作就开始了。下面列出EF类库fastcgi.efn 中解析 QueryString 的C++代码:

void_FCGIClass_ParseQueryString_IfNeed(FCGIClass_FieldsData*pFields)
{
if(pFields->hasParsedQueryString)return;
pFields->hasParsedQueryString = EF_TRUE;

_FCGIClass_Read_QUERY_STRING_IfNeed(pFields);

EFChar
*szQueryString=EF_GET_TEXT(pFields->queryString);
if(szQueryString[0]==myC('\0'))
{
EF_DEC_REF_COUNT(pFields
->queryStringNames);pFields->queryStringNames=EF_EMPTY_ARRAY;
EF_DEC_REF_COUNT(pFields
->queryStringValues);pFields->queryStringValues=EF_EMPTY_ARRAY;
return;
}

EF_MiniMemnames,values;
names.AddInt(
0);names.AddInt(1);names.AddInt(0);
values.AddInt(
0);values.AddInt(1);values.AddInt(0);

EFChar
*ps=szQueryString;
EFChar
*psFrom=szQueryString;
intcount=0;
boolinName
=true;

for(;;ps++)
{
if(*ps==myC('='))
{
names.AddInt((EFInt)_NewEFText(psFrom,ps
-psFrom));
psFrom
=ps+1;
count
++;
inName
=false;
}
elseif(*ps==myC('&'))
{
if(inName)//key1&...
{
names.AddInt((EFInt)_NewEFText(psFrom,ps
-psFrom));
values.AddInt((EFInt)EF_EMPTY_TEXT);
psFrom
=ps+1;
count
++;
continue;
}

values.AddInt((EFInt)_NewEFText(psFrom,ps
-psFrom));
psFrom
=ps+1;
inName
=true;
}
elseif(*ps==myC('\0'))
{
if(*(ps-1)==myC('&'))//key1=value1&
break;

if(inName)//key1
{
names.AddInt((EFInt)_NewEFText(psFrom,ps
-psFrom));
values.AddInt((EFInt)EF_EMPTY_TEXT);
count
++;
}
else
values.AddInt((EFInt)_NewEFText(psFrom,ps
-psFrom));

break;
}
}

names.ReplaceInt(
2*sizeof(EFDWord),count);
values.ReplaceInt(
2*sizeof(EFDWord),count);

EFArraynameArray
=EF_GC_REG_TEXT_ARRAY_DATA(names.Detach());
EFArrayvalueArray
=EF_GC_REG_TEXT_ARRAY_DATA(values.Detach());
EF_DEC_REF_COUNT(pFields
->queryStringNames);pFields->queryStringNames=nameArray;
EF_DEC_REF_COUNT(pFields
->queryStringValues);pFields->queryStringValues=valueArray;

//cachetohashmap
EFText*pNames=(EFText*)((EFByte*)nameArray+3*sizeof(EFDWord));
EFText
*pValues=(EFText*)((EFByte*)valueArray+3*sizeof(EFDWord));
for(inti=count-1;i>=0;i--)
{
pFields
->queryStringNameValueHashmap->Set(EF_GET_TEXT(pNames[i]),pValues[i]);
}
}

代码应该是比较清晰的。首先是处理缓存,如果之前已经解析过一次,直接使用上次解析结果;如果曾经读取(包括进行URL解码)过QueryString,直接使用已经读取并解码后的值,不进行重复工作。接下来是文本解析,得到“名称”数组,及与其对应的“值”数组,这两个数组的成员是一一对应的。最后,依然是缓存,将各“名称”“值”配对放入一个哈希表中,以便此后可以根据“名称”高速查询得到“值”。在EF程序中,当 fcgi.QUERY_STRING(name) 被调用时,除了第一次调用时需进行解析工作外,后续调用则直接从哈希表中查询得到结果,执行效率应该是非常高的。(今后我可能会实际测试一下结果,研究它对程序执行效率的提升究竟有多么明显。) 在上面的C++代码中,对一些非正常的、不合法的QueryString,也有适当的容错处理。

如果代码有错误或疏忽、遗漏之处,请各位批评指正。

注意:本文给出的代码在处理顺序上存在错误,需先分隔再解码,而不应该先解码再分隔!用围棋上的术语说是“次序错了”。这个是必须更正的,有时间我马上处理。

下文预告:“简单计算器”实例程序

分享到:
评论

相关推荐

    基于.netCore 6 +EF 实现webApi增删查改基础应用,开箱即用

    在本文中,我们将深入探讨如何使用`.NET Core 6`框架和`Entity Framework (EF)`来构建一个功能完备的Web API服务,实现数据的增、删、查、改(CRUD)操作。`.NET Core 6`是微软推出的一个高性能、跨平台的开源开发...

    Dome-ASP.NET CORE 6 webapi 使用 EF DBFirst 配合 sql server

    ASP.NET Core 6 WebAPI与Entity Framework (EF) DBFirst结合使用是开发高效、数据库驱动的Web服务的常见方法。这个技术栈允许开发者利用SQL Server的强大功能,同时借助EF简化数据访问层的实现。以下是对这个主题的...

    学习C# .Net6+EFcore+MySQL.zip

    在本课程中,我们将深入探讨如何使用C#编程语言与.NET 6框架,结合Entity Framework Core(简称EF Core)和MySQL数据库进行开发。这是一套完整的教程,旨在帮助初学者和有一定经验的开发者掌握现代Web应用程序开发的...

    EFCore+WebAPi增删改查

    在本项目中,"EFCore+WebApi增删改查"是一个使用Entity Framework Core(简称EFCore)和Web API技术构建的.NET应用示例。这个框架主要用于演示如何通过Web服务接口进行数据操作,如添加、删除、修改和查询,前端展示...

    一个应用.Net中C#技术开发的实用Web案例

    在.NET框架下,C#是一种广泛使用的编程语言,尤其在开发Web应用程序时。这个案例——"一个应用.Net中C#技术开发的实用Web案例",展示了如何利用C#的强大力量来构建一个功能完善的B2C(Business to Consumer)在线...

    【ASP.Net Core Web应用程序】 创建数据库

    ASP.NET Core Web应用程序是Microsoft开发的一个跨平台的框架,用于构建现代、高性能的Web应用。在本场景中,我们关注的重点是如何在ASP.NET Core中创建数据库。这通常涉及到使用Entity Framework Core (EF Core),...

    MVC EF6 web架构

    ### MVC与EF6 Web架构详解 #### 创建相关类(Data Model) 在开发基于MVC模式的应用时,数据模型(Data Model)是整个架构的核心组成部分之一。数据模型主要负责定义应用程序中的业务实体及其属性,它是连接前端...

    asp.net源码:WebSamples,是WEB程序开发的好示例。

    ASP.NET 是微软公司推出的用于构建动态网站、Web应用程序和Web服务的一种强大框架。WebSamples 是一个包含多个ASP.NET示例的集合,它为开发者提供了学习和理解ASP.NET特性和功能的宝贵资源。在这个压缩包中,...

    web聊天室(.net core MVC + signalr + EF + Authorize)

    "web聊天室(.net core MVC + signalr + EF + Authorize)" 描述了一款基于.NET Core MVC框架、使用SignalR实现实时通信、Entity Framework(EF)进行数据库操作,并结合Authorize进行权限控制的Web聊天室应用。...

    ASP.NET数据库应用程序开发教程

    ASP.NET Core同样支持数据库应用开发,并与EF Core紧密结合。 九、部署与调试 在完成ASP.NET数据库应用程序的开发后,可以通过IIS或IIS Express进行本地或远程部署。Visual Studio集成的调试工具能帮助开发者定位并...

    全堆栈ASP。NET核心(.NET 8)web应用程序,具有CRUD、N轮胎体系结构、验证功能.zip

    ASP.NET Core是微软开发的一个开源、跨平台的框架,用于构建高性能、现代化的互联网规模的应用程序。在这个全堆栈的ASP.NET Core项目中,我们关注的是.NET 8版本,它带来了许多新特性和性能改进。这个项目展示了如何...

    EF6+sqlite开发dll集合

    标题中的"EF6+sqlite开发dll集合"表明这是一个关于使用Entity Framework 6(简称EF6)与SQLite数据库的开发库合集。Entity Framework是.NET框架中的一个对象关系映射(ORM)工具,它允许开发者使用面向对象的编程...

    ASP.NET Core 和EF Core官方中文文档

    ASP.NET Core和Entity Framework Core(简称EF Core)是Microsoft开发的两个关键的开源框架,用于构建现代、云就绪的互联网应用程序。ASP.NET Core是下一代的ASP.NET框架,而EF Core是轻量级且高性能的对象关系映射...

    c# MVC完整项目 EF连接数据库 webapi

    在本项目中,我们主要探讨的是C# MVC框架与Entity Framework(EF)的结合使用,以及WebAPI在其中的角色。这个完整的项目实例为初学者提供了一个很好的学习平台,涵盖了数据库操作的基本功能,如新增、修改和删除数据...

    使用C#开发数据库应用程序系统ACCP8.0

    在IT行业中,数据库应用程序系统是不可或缺的一部分,它们用于存储、管理和检索数据,为各种业务...对于希望在IT领域从事数据库应用开发的人员来说,“使用C#开发数据库应用程序系统ACCP8.0”是一次宝贵的学习经历。

    NFine快速开发框架 ASP.NET MVC+EF6+Bootstrap开发框架

    NFine快速开发框架是一款基于ASP.NET MVC、Entity Framework 6(EF6)和Bootstrap构建的高效、便捷的Web应用程序开发工具。这个框架旨在简化开发流程,提高开发效率,同时提供美观的用户界面和强大的功能。 ASP.NET...

    mvc4+ef+linq(b/s) 简单的一个模仿程序

    **标题与描述解析** 标题中的“mvc4+ef+linq(b/s) 简单的一...这个项目是一个很好的实践平台,涵盖了Web开发中的多个核心技术和最佳实践,对于提升开发者在ASP.NET MVC、EF、LINQ以及Web应用开发中的技能非常有帮助。

    Asp.Net Core Web应用程序入门源码

    这个源码包“KibaAspNetCore-master”是针对初学者设计的,旨在帮助他们理解并入门Asp.Net Core Web应用程序的开发。 1. **Asp.Net Core基础** Asp.Net Core是对经典Asp.Net的重构,它采用模块化设计,允许开发者...

    MVC5+EF6依赖注入开发利器

    在IT行业中,MVC5(Model-View-Controller)和Entity Framework 6(简称EF6)是.NET Framework中用于构建Web应用程序的两个关键组件。MVC5是一个设计模式,它将应用程序的业务逻辑、用户界面和数据访问分离开来,...

    web网页设计(c#):学生管理系统

    【标题】"Web网页设计(C#):学生管理系统"是一个使用C#编程语言和Web技术构建的应用程序,主要用于管理教育机构中的学生信息。这个系统通常包括对学生数据的增、删、改、查等基本功能,是计算机科学尤其是软件工程...

Global site tag (gtag.js) - Google Analytics