【asp源码栏目提醒】:本文主要为网学会员提供“ASP中检查没有数据提交的页面、如何增强ASP程序性能 - 开发文档”,希望对需要ASP中检查没有数据提交的页面、如何增强ASP程序性能 - 开发文档网友有所帮助,学习一下!
indoc.in 文章内容版权归原作者所有 VICHU.NET
ASP中
检查没有数据提交的页面、如何
增强ASP程序性能 用户在访问站点时经常遇到一些烦人的信息比如他们经常不知何故地在
没有实际提交数据给表单时就到了下一个页面或者经常达到一个页面它是以查询字符串的形式转来的比如ID236454。
如果页面没有得到信息就会产生一个大错误。
这经常发生在页面寻找ID或者其他一些信息时而这时用户是使用书签或者
搜索引擎连接到这个页面的。
所以页面需要的信息丢失了页面结束。
你可以通过检查来了解是否有数据被提交从而控制这种情况的
发生然后根据情况显示特定的
错误信息或者执行其他的动作比如重定向到想要的页面。
在下面的3个例子中仅仅在屏幕上
显示一个信息。
将这段代码直接放置在 LANGUAGEVBSCRIPT 下面。
对于一个表单使用POST方法 If Request.Form Then Response.Write p aligncenter font faceArial There Was An Error. br vbCrLf Response.WriteNo Data Was Posted. /font vbCrLf Response.End End If 。
对于一个表单使用PUT和GET方法 这同样
适用于从带有查询字符串
连接而来的页面比如ID236454 If Request.Querystring Then Response.Write p aligncenter font faceArial There Was An Error. br vbCrLf Response.WriteNo Data Was Posted. /font indoc.in 文章内容版权归原作者所有 VICHU.NET vbCrLf Response.End End If 为了含概上面例子中的情况要做下面的工作。
尽管还有简单的方法但是这个例子对于初学者将是很好的
学习基本
原理的方法。
IsData 0 If Request.Form Then IsData IsData 1 If Request.Querystring Then IsData IsData 1 If IsData 0
Then Response.Write p aligncenter font faceArial There Was An Error. br vbCrLf Response.WriteNo Data Was Posted. /font vbCrLf Response.End End If 或者 IsData No If Request.Form Then IsData Yes If Request.Querystring Then IsData Yes If IsData No Then Response.Write p aligncenter font faceArial There Was An Error. br vbCrLf Response.WriteNo Data Was Posted. /font vbCrLf Response.End End If 。
如何增强
ASP程序性能 Session在繁忙站点上使用时有几个缺陷。
繁忙的意思是站点上每秒有上百的页面被请求或者同时有上千的访问用户。
这个技巧对于那些要求水平扩展强的站点非常重要也就是指这些站点它们利用多个服务器完成数据装载或者处理大量容错。
对于小型站点比如
内部网IntranetSession是非常值得提倡的。
indoc.in 文章内容版权归原作者所有 VICHU.NET 再次重申
ASP自动地为每一个首次点击Web服务器的用户创建一个Session每一个Session占有大约10KB的内存生存期默认是20分钟。
使用Session最大的问题不是性能而是扩展性Session不能跨越多个Web服务器一旦在一个服务器上创建了Session它的数据就驻留在那里。
这意味着如果在Web上使用Session你就得为每一个直接
访问存放Session服务器的用户请求设计一个策略。
这就是将用户“粘”在Web服务器上术语“sticky sessions”就来源于此。
如果Web服务器遇到障碍“Stuck”用户就会丢失他们的Session状态因为Session不保留在磁盘上。
再次重申
ASP自动地为每一个首次点击Web服务器的用户创建一个Session每一个Session占有大约10KB的内存生存期默认是20分钟。
使用Session最大的问题不是性能而是扩展性Session
不能跨越多个Web服务器一旦在一个服务器上
创建了Session它的数据就驻留在那里。
这意味着如果在Web上使用Session你就得为每一个
直接访问存放Session服务器的用户请求设计一个策略。
这就是将
用户“粘”在Web服务器上术语“sticky sessions”就来源于此。
如果Web
服务器遇到
障碍“Stuck”用户就会丢失他们的Session状态因为Session不保留在
磁盘上。
许多对任务要求严格的
站点都要设立至少2个Web服务器所以在
设计严格
任务的应用程序时就需要执行“sticky sessions”或者简单地避免使用Session同时也可以采取其他保存用户
状态到独立Web
服务器的管理技术。
如果不使用Session一定要确认将它们关闭这可以通过
Internet服务
管理器实现。
如果决定使用Session可以通过几种
方法来最小化它们的
影响。
可以将不需要Session的内容比如帮助画面访问者
区域等等
移动到关闭Session的
独立ASP应用程序中。
在基础页面上可以给
ASP一个指示让它不需要使用Session。
将下面的代码直接
加入到
ASP页面的头部 使用这个指示的一个
很好的解释是在框架结构中Session创建了一个有趣
的问题。
ASP确保在一个时刻只有
一个来自Session的请求被执行这就确保了如果浏览器为单个用户请求多个页面时只有一个
ASP请求在那时能够接受Session如此就避免了存取Session对象时的多线程
问题。
很不幸在框架结构中的所有页面将按照连续的顺序显示出来一个接一个而不是同时所以用户为了看到整个
框架必须要等很长时间。
规则是如果一定的框架页面没有使用Session就一定要告诉
ASP直接使用EnableSessionStateFalse。
indoc.in 文章
内容版权归原
作者所有 VICHU.
NET 除了使用Session对象还有许多其他管理会话状态的选择。
对于小数量的状态小于4KB我们通常建议使用cookie、
查询字符串变量以及表单隐藏域。
对于象
购物车一样的大数量数据后台数据库是最合适的选择。
如果要编写很多VBScript或者JScript为了提
个性能可以将代码编写成COM对象并且编译使用。
编译代码
基本上比
解释性代码
运行快许多
编译组件对象可通过“early binding”存取其他COM对象这比在脚本中调用组件要有效。
这么做有许多优点 COM对象有益于从
商业规则中独立出表达式规则 COM对象使代码重用变为可能 许多开发者发现用
VBC或者Visual J编写程序比
ASP更容易调试 COM对象也有缺点包括初始开发时间和对不同
编程技巧的需要。
注意将少量
ASP代码做成
COM对象组件不会有好处反而可能导致性能的损失从而失去了编译代码的优势。
怎样组合使用
ASP脚本和COM对象达到最佳性能是一个测试的问题。
我们注意到微软
公司已经大
规模在
Windows
2000/IIS 5.0上提高了脚本与ADO的性能由此随着IIS5.0版本的引进减少了编译代码的性能
优势。
使用Option Explicit 要在
ASP文件中使用Option Explicit定义并且放置到
ASP文件的头部从而强迫开发者在使用前声明
所有的变量。
许多
程序员都认为这在应用程序调试时非常有用因为它避免了产生错误类型变量以及偶然创建新变量的可能。
也许更重要的是声明的变量要大大快于非声明变量。
拷贝经常使用的数据到脚本变量中 在
ASP中存取COM对象时应该拷贝经常使用的对象数据到脚本变量中这样就减少了对COM
对象的方法调用。
这些调用要比存取脚本变量相对来说费时费力。
当存取Collection和Dictionary对象时使用这项技巧也减少了昂贵的查找操作。
通常如果要不止
一次地存取对象数据就应将数据放入脚本变量中对象数据主要也就是Request变量表单和查询字符串变量。
比如站点要传递一个叫做UserID的查询字符串变量假设它将在一个特殊页面被引用12次那么不需要调用Request“UserID”12次只要在
ASP页面的头部分配给UserID一个变量然后在页面中使用它这样做就节省了11次COM方法的调用。
indoc.in 文章内容版权归原作者所有 VICHU.NET 避免再定义数组 争取不要再
定义数组。
考虑到
性能问题如果
机器的
物理内存大小不够最好按最差情况或者最佳情况设置数组的初始尺寸
需要时再重新定义。
在任何可能时使用Server.Transfer而不要用Response.Redirect Response.Redirect告诉浏览器请求另一个不同的页面这常常
用于引导用户到登录页面或者出错处理页面。
由于重
定向强迫了一个新页面请求结果是
浏览器必须要与Web服务器循环2次并且Web服务器
必须处理一个额外的请求。
IIS5.0引进了一个新功能Server.Transfer它执行在同一服务器上的页面传输这将避免额外的浏览器Web服务器的数据
循环形成良好的
系统性能对于用户也有较好的响应
时间。
避免使用服务器变量 存取服务器变量导致Web站点
建立一个
特殊的请求并收集所有的服务器变量而并不是你要求的那个变量。
这类似于在文件夹中取回一个特殊
的文件要想取回一个
文件就得首先获取所在文件夹的信息。
不要存取非法的Request对象比如RequestData对于那些不在Request.Cookies、Request.Form、Request.QueryString或者Request.
ClientCertificate中的
项目隐含就指向了Request.ServerVariables变量而这些变量要比其他集合对象慢得多。
调整Web服务器 有
几个IIS调整参数可以提高站点性能。
比如对于IIS4.0我们经常发现提高
ASP ProcessorThreadMax参数能够
产生重大的效果特别是在那些要等待后台资源比如数据库或中间件产品的站点。
在IIS5.0中你
可以发现调整ASP线程通道要比调整
AspProcessorThreadMax
效果更佳。
最佳的配置设定取决于应用程序代码、支持的硬件设备以及
客户端的
工作量。
发现最佳配置的唯一方法就是测试。
性能是一个很重要的特征。
你需要事先设计好性能
指标否则日后就要为此重新编写程序。
就是说要设想好怎样最佳化地执行
ASP程序 本文提出了一些
优化ASP应用和V
BScript的
技巧许多技巧和
缺陷都经过了研讨。
这里列出的
建议已经在http://
www.microsoft.com 和其他站点上
进行了测试都工作得
非常好。
本文假设你具备
ASP开发
的基本
知识包括VBScript或者JScriptASP应用程序
ASP Session
以及其他
ASP内置对象RequestResponse和Server。
通常
ASP的执行性能远远不仅仅依赖
ASP代码本身在本文的尾部列出了与性能
相关的资源它们含概了
ASP和非
ASP的部分包含ActiveX Data ObjectsADOComponent Object Mo
delCOM数据库indoc.in 文章内容版权归原作者所有 VICHU.NET Database以及
Internet信息服务器IIS的配置。
除了这些还有一些非常好的链接值得你一看。
在Web服务器上缓存经常使用的数据
典型的情况是
ASP页面从后台存储中取回数据然后以超
文本标记语言HTML的形式
形成结果。
不管数据库的速度如何从内存中取回数据要比从后台
存储设备中快得多。
从本地硬盘读取数据通常也非常快。
所以提高性能可以通过缓存服务器上的数据来实现无论是将数据缓存在
内存中或者本地硬盘中。
缓存是经典的“空间换时间”的折中方式。
如果缓存得恰当就可以看到显著的性能提升。
为了让缓存
有效必须保证缓存数据是经常要重用的而且也是计算起来繁琐的。
装满陈旧数据的缓存是对内存的浪费。
不经常
改变的数据是缓存的较好对象因为不需要随时考虑这些数据
更新后的同步操作。
组合框、参考
表格、DHTML代码、扩展标记
语言串、菜单以及站点配置变量包括数据源名字DSNS
Internet协议地址IP以及Web
路径都是很好的缓存对象。
注意要缓存数据
表达式而不是数据本身。
如果一个
ASP页面经常
变化并且很费力去缓存比如整个
产品目录就要考虑预产生
HTML而不是每次发生请求时再描述它。
在Application或Session对象中缓存经常使用的数据
ASP中的Application和Session对象是在内存中缓存数据的便利容器。
你可以将数据赋值给
Application和Session对象这些数据在HTTP调用期间将一直保持在内存中。
Session中的数据是为每一个用户服务的
Application中的数据是所有用户
共享的。
何时需要在Application和Session中装入数据通常当应用程序启动或者会话
开始时数据就被装入了。
为了在这时装入数据在Application OnStart或者Session OnStart中分别添加适当的代码。
这些函数位于文件Global.asa中如果原来不
存在就添加上。
也可以在数据首次需要的时候调入在
ASP页面中添加代码检查数据
是否存在如果没有发现就调入它。
这里有一个例子它
代表了被称为“lazy
evalution”的经典性能处理
技术直到需要时再去计算。
例子如下 对于
不同的数据可以编写类似的函数代码。
数据应该按
什么格式保存任何变量
类型都可以因为所有的脚本变量都是不同的。
比如说可以保存为字符串、整型或者数据。
通常将ADO记录集的内容存储到这些变量类型中一个。
为了从ADO记录集中取出数据需要手工地拷贝数据到VBScript变量中每次一个字段。
使用任意一个ADO
记录集的
函数functions GetRowsGetString 或者 Save ADO 2.5都非常得快速而且
简单这里有个函数描述了如何使用GetRows返回记录集数据的数组 Get Recordset return as an Array Function FetchEmploymentStatusList Dim rs Set rs CreateObjectADODB.Recordset rs.Open select StatusName StatusID from EmployeeStatus _ dsnemployeesuidsapwd FetchEmploymentStatusList rs.GetRows Return data as an Array rs.Close
Set rs Nothing End Function 上述代码的一个更深的技巧是为
列表缓存了HTML。
下面是个简单的例子 Get Recordset return as HTML Option list Function FetchEmploymentStatusList Dim rs fldName s Set rs CreateObjectADODB.Recordset rs.Open select StatusName StatusID from EmployeeStatus _ dsnemployeesuidsapwd s