设为首页 收藏本站
| 数控仿真 | 编程软件 | 技术文章 | 数控大赛 | 斐克科技 | 公路造价 | 文档备份 |
| 幸运之门彩票网 | 彩票论坛 | 彩票新闻 | 免费招聘 | 百科问吧 | 百姓族谱 | 小游戏网 |
“打”是数量单位,那么多少个为“一打”呢?A:10个 B:11个 C:12个 D:15个
C#(CSharp) | VC/C++ | C++Builder | ASP(ASP.NET) | SQL Server | OpenGL | CMM | Web | NC | GIS | OS | 免费小游戏 | 彩票论坛
Google
联高软件 > 技术文章 > VB(ASP)/VB.NET > ASP编码优化技巧8则
VB(ASP)/VB.NET | VC/VC++/VC.NET | C#(CSharp) | C++Builder | Java/JSP | EJB/J2EE |
ASP编码优化技巧8则

发表:联高软件www.legalsoft.com.cn,本文被阅读:1

1.声明VBScript变量
在ASP中,对VBScript提供了强劲的支持,能够无缝集成VBScript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与VBScript交互的过程中,很多程序员也惯于不声明VBScript的变量,这样加重了服务器的解析负担,进而影响服务器的响应请求速度。
鉴于此,我们可以象在VB中强制用户进行变量声明一样在VBScript中强制用户进行变量声明。实现方法是:
在ASP程序行首放置<% option explicit%>。
2.对URL地址进行编码
在我们使用ASP动态生成一个带参数URL地址并进行跳转时,在IE中解析很正常,但在NetScrape浏览时却有错误如下:
HTTP Error 400
400 Bad Request
Due to malformed syntax, the request could not be understood by the server.
The client should not repeat the request without modifications.
解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码,例子如下:
<%
URL="xur.asp"
var1="username=" & server.URLencode("xur")
var2="&company=" & server.URLencode("xurstudio")
var3="&phone=" & server.URLencode("021-53854336-186")
response.redirect URL & "?" & var1 & var2 & var3
%>
3.清空对象
当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为"nothing"释放对象占用内存。下面的代码使用数据库内容建立一个下拉列表。代码示例如下:
<% myDSN="DSN=xur;uid=xur;pwd=xur"
mySQL="select * from authors where AU_ID<100"
set conntemp=server.createobject("adodb.connection")
conntemp.open myDSN
set rstemp=conntemp.execute(mySQL)
if rstemp.eof then
response.write "数据库为空"
response.write mySQL
conntemp.close
set conntemp=nothing
response.end
 end if%>
<%do until rstemp.eof %>
<%
rstemp.movenext
loop
rstemp.close
set rstemp=nothing
conntemp.close
set conntemp=nothing
%>
4.使用字符串建立SQL查询
使用字符串来建立查询并不能加快服务器的解析速度,相反,它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是,可以迅速发现程序问题所在,从而便利高效地生成程序。示例如下:
<%mySQL= ""select * "
mySQL= mySQL & "from publishers"
mySQL= mySQL & "where state="NY""
response.write mySQL
set rstemp=conntemp.execute(mySQL)
rstemp.close
set rstemp=nothing
%>
5.使用case进行条件选择
在进行条件选择的时候,尽量使用case语句,避免使用if语句。使用case语句,可以使程序流程化,执行起来也比if语句来的快。示例如下:
<%
  FOR i = 1 TO 1000
   n = i
   Response.Write AddSuffix(n) & "<br>"
  NEXT
  %>
  <%
  Function AddSuffix(num)
numpart = RIGHT(num,1)
SELECT CASE numpart
CASE "1"
IF InStr(num,"11") THEN
num = num & "th"
ELSE
num = num & "st"
END IF
CASE "2"
IF InStr(num,"12") THEN
num = num & "th"
ELSE
num = num & "nd"
END IF
CASE "3"
IF InStr(num,"13") THEN
num = num & "th"
ELSE
num = num & "rd"
END IF
CASE "4"
num = num & "th"
CASE ELSE
num = num & "th"
END SELECT
AddSuffix = num
  END FUNCTION
%>
6.使用adovbs.inc文件中定义的常量打开记录集
打开记录集时,可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在\inetpub\iissamples\IISamples目录下面。下面列举几个常用的游标类型和锁定类型。
游标类型:adOpenFowardOnly游标只能向前;adOpenKeyset游标可向前或者向后,如一用户添加记录,新记录不会出现在记录集中;adOpenDynamic游标动态随意;adOpenStatic记录集不对其他用户造成的记录修改有所反映。
锁定类型:adLockReadOney不能修改记录集中的记录;adLockPessimistic在编辑一条记录时锁定它;adLockOptimstic调用记录集Update方法时才锁定记录;adLockBatchOpeimstic记录只能成批更新。
<!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
<%
connectme="DSN=xur;uid=xur;pwd=xur"
sqltemp="select * from publishers where name="xur""
set rstemp=Server.CreateObject("adodb.Recordset")
rstemp.open sqltemp, connectme, adOpenStatic,adLockOptimstic
response.write rstemp.recordcount & " records in<br>" & sqltemp
rstemp.close
set rstemp=nothing
%>
7.避免在使用global.asa文件中进行对象定义
由于global.asa文件中的内容可以为站点内所有文件引用,无疑,在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义:
<%SUB application_onstart
set application("theCONN")=server.createobject("adodb. connection")
END SUB %>;
这样就可以在站点任何代码中做类似引用:
<%
mySQL="select * from publishers where state="xur"
set rstemp=application("theconn").execute(mySQL)
%>
同样地,可以在session_onstart函数中创建记录集对象
<%SUB session_onstart
set session("rstemp")=server.createobject("adodb.recordset")
END SUB %>
然后在站点也面中进行如下引用:
<%
mySQL="select * from publishers where state="xur"
set session("rstemp")=conntemp.execute(mySQL)
%>
但这样做的同时也有很大的负面影响,由于Application和Session变量都只有在关闭网站的时候才释放占用的资源,所以Session参数会浪费大量不必要内存,而且此时Application变量成为服务器性能的瓶颈。
解决方法:建立定义对象ASP页面,在需要进行调用这些对象的页面上,引入这张ASP页面。假设定义对象的ASP页面名称为define.asp,则只要在对应ASP页面中加入以下语句就能引入该页面。
<!--#INCLUDE VIRTUAL="/define.asp" -->
在进行页面引进时,最好在待引进的ASP文件中不要包含<%@LANGUAGE="VBSCRIPT"%>语句。因为在ASP文件中,只能有一句由@来定义的脚本解析语言。
8.安全防护
ASP提供了很好的代码保护机制,所有的ASP代码都在服务器端执行而只返回给客户端代码执行结果。即便这样,在老版本的IIS中还可以在文件名后面加::$DATA来查看ASP的源代码,这已经属于Web Server安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。
虽然在ASP中建议引入文件以inc作为扩展名,在这里仍建议以ASP作为引文件的扩展名。当这些代码在安全机制不好的Web Server上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在Web Server上,如果没有定义好解析某类型(比如inc)的动态连接库时,该文件以源码方式显示。
不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立DSN(Date Source Name),而在进行数据库访问时直接访问该DSN。

ASP提速技巧五则
技巧之一:提高使用Request集合的效率
访问一个ASP集合来提取一个值是费时的、占用计算资源的过程。因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量。例如将代码写成下面的形式以加快脚本引擎处理速度:
strTitle=Request.Form("Title")
strFirstName=Request.Form("FirstName") 
strLastName=Request.Form("LastName") 
If Len(strTitle) Then strTitle=strTitle & " " 
If strFirstName="" Then strFullName=strTitle & " " & strLastName 
Elseif Len(strFirstName)=1 Then
strFullName=strTitle & strFirstName & ". " & strLastName
Else
strFullName=strTitle & strFirstName & " " & strLastName 
End If
技巧之二:直接访问适当的集合
如果不是别无选择,否则不要使用strPage=Request("page")的这样的形式来获取参数,因为这将按顺序搜索全部的集合—QueryString、Form、Cookies、ClientCertificate、ServerVarible直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。
例如,可能希望搜索满足客户请求的WEB服务器名称,这通过出现在每个查询中的Request.ServerVarables集合中寻找"SERVER_NAME"来实现。然而,假如其他的集合也包含名为"SERVER_NAME"的值(键名不区分大小写),当使用Request("server_Name")时,就会得到错误的结果。总而言之,应尽可能直接访问适当的集合。
技巧之三:在费时操作前使用Response.IsClientConnected属性
使用Response.IsClientConnected是观察用户是否仍连到服务器并正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查游览者是否已离线:
…… Code to create first part of the page
If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If
…… Code to create next part of page
技巧之四:优化ASP中的ADO操作
通常面言,数据构成了WEB站点的实际内容。所以,优化ADO操作以加速ASP代码执行,十分有用:
a. 仅选择所需的列:当打开ADO记录集时,除非需要获得所有的列,否则不应自动地使用表名(即SELECT *)。使用单独的列意味着将减少发送到服务器或从服务器取出的数据量。即使需要使用全部列,单独地命名每个列也会获得最佳的性能,因为服务器不必再解释这些列的名字。
b. 尽可能的使用存储过程。存储过程是预先编译的程序,含有一个已经准备好的执行计划,所以比SQL语句执行更快。
c. 使用适当的光标和锁定模式。如果所做的全部工作只是从记录集中读取数据,并将其显示在屏幕上,那么就使用缺省的只能前移、只读的记录集。ADO用来维护记录和锁定的细节的工作越少,执行的性能就越高。
d. 使用对象变量。当遍历记录集时一个肯定能提高性能的方法是使用对象变量指向集合中的成员。例如:
While Not RsGc.EOF
Response.Write "工程名称:" & RsGc("GcMC") & "(工程代码:" & RsGc("GcCode") & ")
" 
RsGc.MoveNext
Wend
可以用改写为下面的代码以加快执行:
set GcMc=RsGc("GcMc")
set GcCode=RsGc("GcCode") 
While Not rsGc.EOF Response.Write "工程名称:" & GcMc & "(工程代码:" & GcCode & ")
" RsGc.MoveNext 
Wend
新的代码建立了对象变量的引用,所以可以使用对象变量而不是实际的变量,这意味着脚本引擎的工作减少了,因为在集合中进行索引的次数变少了。
技巧五:不要混用脚本引擎
我们知道,ASP页面中既可以使用VBScript,也可以使用JScript。但是在同一个页面上同时使用JScript和VBScript则是不可取的。因为服务器必须实例化并尝试缓存两个(而不是一个)脚本引擎,这在一定程度上增加了系统负担。因此,从性能上考虑,不应在同一页面中混用多种脚本引擎。
 联高软件 > 技术文章 > VB(ASP)/VB.NET
·超酷三维汉字特效 (1587)
·用HttpWebRequest和正则表达式提取网页中的链接 (2438)
·五种常见的ASP.NET安全缺陷 (1372)
·ASP+与ASP有什么不同 (1384)
·ASP.NET移植须知 (1306)
·ASP和ASP.NET的MD5加密中文结果不同原因 (227)
·使用ASP.NET 2.0 输出缓存替换的功能实现“甜圈缓存(Donut Caching)” (196)
·在ASP.NET中自动给URL地址加上超链接 (255)
·asp重定向 (286)
·不用 EOF 以加快记录循环(vb) (315)
·ASP程序员学习C#之超级攻略 (528)
·ASP和ASP.NET的MD5加密中文结果不同原因 (227)
·ASP.NET2.0中实现跨页面提交 (475)
·C#参考之访问关键字:BASE、THIS (285)
·在C#中应用哈希表(HASHTABLE) (773)
·在 ASP.NET 中使用计时器(Timer) (653)
·ASP.NET缓存:方法和最佳实践 (265)
·防止对 Visual Basic .NET 或 C# 代码进行反相工程 (219)
·压缩ASP.NET中的ViewState (316)
·ASP.net的RUL重写 (221)
 最新文章
·如何使用SQLSERVER2000中的XML功能
·超强C#图片上传,加水印,自动生成缩略图
·C#中用SYSTEM.XML读写XML说明与代码
·C#取真实IP地址及分析
·C#+DIRECT3D9.0开发实例之月亮绕着地球转
·ASP程序员学习C#之超级攻略
·通过C#实现集合类纵览.NETCOLLECTIONS及
·C#开发WAP程序实例
·C#3.0中对象初始化器和集合初始化器
·C#3.0新特性速览
·ASP和ASP.NET的MD5加密中文结果不同原因
·CSS截取固定长度字符串
·简单实用的C#分词源代码(含词库素材下载
·C#高效分页代码(不用存储过程)
·SERVER.TRANSFER是在两个页面之间进行传
·一个克隆对象的C#基类
·C#语言FTP客户端代码
·递归枚举排列、组合的C#源码
·在C#.NET中跟踪代码的运行过程
·ASP.NET2.0中实现跨页面提交
·C#通用的数据操作类
·常用的C#数据检查类
·C#中的域(FIELD)和属性(PROPERTY)
·C#编码规范和编程好习惯
·C#编码好习惯
·用C#实现C/S模式下软件自动在线升级
·C#参考之访问关键字:BASE、THIS
·C#实现遗传算法模拟花朵的进化
·用C#的类实现数据结构的堆栈算法
·在C#中应用哈希表(HASHTABLE)
·用C#生成中文汉字验证码的基本原理
·C#.NET支付宝接口
·在C#中利用SHARPZIPLIB进行文件的压缩和
·程序员必须知道的SQLSERVER数据库优化技
·360度全方位比较C#和VB
·C#设计模式之建造者(BUILDER)模式示例源
·C#抽象工厂模式的几种实现方法及比较
·用设计模式固化C#程序
·数据结构与算法(C#实现)系列---二叉树
·在C#中建立复杂的、灵活的SQL查询/命令
·解读C#中的正则表达式
·对C#开发的两个基本原则的深入讨论
·正则表达式使用高级技巧之组的概念
·模板和泛型如何配合使用
·C#中提供的VB不支持的新特性
·关于C#在LUCENE.NET下的中文切词
·无废话C#设计模式之十:FLYWEIGHT
·无废话C#设计模式之十一:COMPOSITE
·无废话C#设计模式之十二:BRIDGE
·无废话C#设计模式之十三:DECORATOR
 热门文章
·程序员必须知道的SQLSERVER数据库优化技
·OpenGL 入门教程(一)
·OpenGL基础篇
·使用回调函数(VC & Delphi)
·OpenGL 入门教程(二)
·数控加工技术试题库
·C++Builder的一些技巧
·矩阵相乘的快速算法
·如何实现进程间数据通讯技术
·数控考题(二)
·矩阵求逆的快速算法
·数控试题(一)
·第一个三角形:NeHe的OpenGL第二课
·Universal Geospatial Data Exchange
·TServerSocket和TClientSocket的使用
·地理信息系统中的常规网络分析功能及相关
·选择与反馈 (OpenGL)
·数控车床加工编程典型实例分析
·函数调用的几个概念:_stdcall,_cdecl..
·OpenGL 入门教程(三)
·Dijkstra 最短路径算法的一种高效率实现
·OpenGL 入门教程(六)
·OpenGL 入门教程(四)
·应用程序的网上升级-VB
·自己绘制True type font字体
·OpenGL 入门教程(五)
·数控车床基本坐标关系及几种对刀方法比较
·数控机床标准M代码
·OpenGL 入门教程(七)
·关于VC多文档应用中OpenGL的使用
免费小游戏
宠物连连看

真人美女换装

美女脱衣服

美女胴体猜猜看

调戏床上美女

黄金矿工
“打”是数量单位,那么多少个为“一打”呢?A:10个 B:11个 C:12个 D:15个
| 幸运之门 | 免费招聘 | 小游戏网 | 百科问吧 | 国际机票 | 我的信息 | 技术文章 | 文档备份 | 公路造价软件 | 联系我们 | 广告代理 | 媒体合作 | 免责条款 |
北京联高软件开发有限公司 1999-2008© 京ICP备05034864号 工商
地址:北京市海淀区中关村北二条13号中科科仪1号楼5层 地图
电话:010-82386887 010-62343002