﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-eric-随笔分类-ASP</title><link>http://www.blogjava.net/jjshcc/category/44986.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 07 Jul 2010 13:37:46 GMT</lastBuildDate><pubDate>Wed, 07 Jul 2010 13:37:46 GMT</pubDate><ttl>60</ttl><item><title>二级域名如何共享Cookies【转贴 | 2005-12-09】</title><link>http://www.blogjava.net/jjshcc/archive/2010/07/05/325284.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Mon, 05 Jul 2010 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/07/05/325284.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/325284.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/07/05/325284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/325284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/325284.html</trackback:ping><description><![CDATA[之前没哪次实践过，只是听一堆人说不可以或者不成功，今天测试了下，成功实现。<br />
OS：win2003<br />
Browse：IE6，Mozilla1.5，Netscape8.0，Friefox1.0，Opera8.51<br />
<br />
步骤：<br />
1、在iis新建站点3个<font color="#000000">：</font>www.goalercn.com(和
goalercn.com)，img.goalercn.com，blog.goalercn.com<br />
2、在www.goalercn.com下建立文件testcookies.asp，代码如下：<span><br />
<span id="code_121.36278514274242">&lt;% <br />
Response.Cookies("Type") = "Test Cookies"<br />
Response.Cookies("Type").Expires = date()+30<br />
Response.Cookies("Type").Domain = ".goalercn.com"<br />
Response.Cookies("Type").Secure = False<br />
Response.Write Request.Cookies("Type")<br />
%&gt;</span></span><br />
&nbsp;3、在ad.goalercn.com下建立文件testcookies.asp，代码如下：<span><br />
<span id="code_7.182621103473949">&lt;%Response.Write
Request.Cookies("Type")%&gt;</span></span><br />
&nbsp;4、在blog.goalercn.com下建立文件testcookies.asp，代码同上<br />
5、因为是本机测试，修改hosts文件，把4个域名都指向到127.0.0.1，也就是添加如下内容：<br />
&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ad.goalercn.com<br />
&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blog.goalercn.com<br />
&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;www.goalercn.com<br />
&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goalercn.com<br />
6、关闭所有浏览器，开ie,打开http://www.goalercn.com/demo/testcookies.asp，显示出文本内
容：Test&nbsp;Cookies<br />
7、新建窗口，打开http://ad.goalercn.com/temp/testcookies.asp，显示出文本内
容：Test&nbsp;Cookies<br />
8、新建窗口，打开http://blog.goalercn.com/temp/testcookies.asp，同样显示出如上文本内容<br />
9、换其他4个浏览器，都成功。<br />
<br />
注意点：<br />
1、Response.Cookies("Type").Secure&nbsp;=&nbsp;False，Secure属性一定要是false，或者直接不执行这行，如果
Secure&nbsp;=&nbsp;True，则ad和blog的2级域名是取值不了。<br />
2、Response.Cookies("Type").Domain&nbsp;=&nbsp;".goalercn.com"，domain的值，我设置
为"goalercn.com"，也就是没有前面的点，在IE下成功<br />
其他4个浏览器没测试。<br />
3、path我猜是不应该设置的。<br />
4、在局域网内其他机器上，修改host指向到我机器的IP，取值成功。<br />
5、在局域网另外一台机器上架设ad.goalercn.com，把testcookies.asp文件copy过去，同时修改host到当前机器，取值
成功
<img src ="http://www.blogjava.net/jjshcc/aggbug/325284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-07-05 14:51 <a href="http://www.blogjava.net/jjshcc/archive/2010/07/05/325284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Persits.Upload.1  '800a0001' 的解决方法，能解决！</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/22/324144.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 22 Jun 2010 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/22/324144.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/324144.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/22/324144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/324144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/324144.html</trackback:ping><description><![CDATA[<h2><font color="#a02000" face="Arial Narrow">Article PS02022586</font></h2>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td valign="middle" bgcolor="#e0e0e0"><font color="#0050a0" size="4"><strong>800A0001 Unspecified error
            </strong></font></td>
        </tr>
    </tbody>
</table>
<h4><font face="Arial" size="2">
Problem Description </font></h4>
<blockquote><font face="Arial" size="2">
When uploading files with AspUpload 3.0 (and higher),
the following error may be thrown by the <strong> Save </strong> method:
</font>
<p><font face="Arial" size="2">
<font color="#ff0000">
<strong>
Persits.Upload.1 (0x800A0001) <br />
Unspecified error
</strong>
</font>
</font></p>
</blockquote>
<h4><font face="Arial" size="2"> Solution </font></h4>
<blockquote><font face="Arial" size="2">
In most cases it means that your upload script
uses Request.Form or Request.QueryString prior to calling Upload.Save .
As a result, the BinaryRead method of the Request object fails.
</font>
<p><font face="Arial" size="2">
You must never use Request.Form in your upload script because
the ENCTYPE="multipart/form-data" attribute of your form makes this
collection unusable. Use  <strong> Upload.Form </strong>  instead.
Remeber, however, that the  <strong> Upload.Form </strong>  collection is
populated by a call to Upload.Save, therefore you can only use
Upload.Form <em>after</em> a successful call to Upload.Save. <br />
</font></p>
<p><br />
</p>
<p><font face="Arial" size="2"><br />
</font></p>
</blockquote>
简单来说,就是说你使用了这个组件 就不要再使用 Request.Form or Request.QueryString 来获取参数，都要用Upload.Form来获取，不然就报错这个错
<img src ="http://www.blogjava.net/jjshcc/aggbug/324144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-22 12:07 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/22/324144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VB数组详解</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/12/323410.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Sat, 12 Jun 2010 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/12/323410.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/323410.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/12/323410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/323410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/323410.html</trackback:ping><description><![CDATA[一、数组的概念<br />
&nbsp;&nbsp;&nbsp; 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素，每个数组元素都有一个编号，这个编号叫做下标，我们可以通过
下标来区别这些元素。数组元素的个数有时也称之为数组的长度。<br />
&nbsp;&nbsp;&nbsp; 一般情况下，数组的元素类型必须相同，可以是前面讲过的各种基本数据类型。但当数组类型被指定为<span style="color: red;">变体型时，它的各个元素就可以是不同的类型</span>。<br />
数组和变量一样，也是有作用域的，按作用域的不同可以把数组分为：过程级数组(或称为局
部数组)、模块级数组以及全局数组。<br />
&nbsp;&nbsp;&nbsp; 二、定长数组和动态数组<br />
&nbsp;&nbsp;&nbsp; 定长数组<br />
&nbsp;&nbsp; 定长数组的长度是在定义时就确定的，在<a href="http://www.programbbs.com/doc/">程序</a>运行过程中是固定不变的。其定义格式为： <br />
&nbsp;&nbsp; Dim
数组名([下界TO]上界)[As类型名]<br />
&nbsp;&nbsp; 其中，数组的下界和类型是可选的。所谓下界和上界，就是数组下标的最小值和最大值。缺省下界时，vB默
认的下界是0，但通常人们习惯上是从1开始的，因此 我们可以设置让数组的默认下界为1，这需要在每个模块的&#8220;(声明)&#8221;部分添加一行代码：<br />
&nbsp;&nbsp; 如果定
义数组时不指定其类型，默认是变体型的。<br />
&nbsp; 下面举例说明定长数组的定义：<br />
&nbsp; ①Dim a(1 to 3)As Integer<br />
&nbsp; ②Dim
b(5 to 9)As String<br />
&nbsp; ③Dim c(7)As Integer<br />
&nbsp; ④Dim d(6)<br />
&nbsp;&nbsp;&nbsp;&nbsp; 其中，例①定义了一个具有三
个元素的整型数组，其下标从1到3。例②定义了一个具有五个元素的字符型数组，其下标从5到9。<span style="color: red;">例③缺省了下界，它定义了一个具有八个元素的整型数组，其下标从0到7</span>。例④则缺省了下界和类型，定义的是具有七个元素的变体型数组，其下标从0到6。如果在该模块的&#8220;(声明)&#8221;部分添加了Option
base 1，则例③和例④的下标都是从l开始了。<br />
在定义定长数组时，其上界和下界必须是常数或常量表达式。<br />
&nbsp;&nbsp;&nbsp; 动态数组<br />
在
很多情况下，数组的长度事先是无法预测的，而且有时可能需要在<a href="http://www.programbbs.com/doc/">程序</a>中
改变数组的长度以适应新的情况，因此出现了动态数组。动态数组是在定义数组只指定数组名及其类型，等以后知道数组的长度或需要改变数组长度时再用
&#8220;ReDim&#8221;指定它的长度。现举例如下：<br />
&nbsp;&nbsp;&nbsp; Dim X AS Integer<br />
&nbsp;&nbsp;&nbsp; Dim a()As String<br />
&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;
ReDim a(x)<br />
&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp; X=X+3<br />
&nbsp;&nbsp;&nbsp; ReDim a(x)<br />
&nbsp;&nbsp;&nbsp; 其中的&#8220;&#8230;&#8221;代表其它代码。这段代码首先定
义了一个整型变量和—个字符型的动态数组，之后经过一系列运算后使变量X得到一个定值，再使用&#8220;ReDim&#8221;指定数组的长度，最后根据需要又再一次改变了
数组的长度。<br />
&nbsp;&nbsp;&nbsp; 虽然可以一次或多次改变动态数组的长度，但当重新指定数组长度时，数组内原有的数据降会被清除。如果既想改变数组的长度，又想保留数
组原有的数据，则在使用&#8220;ReDim&#8221;时需要加上&#8220;Preserve&#8221;关键字。例如：ReDim Preserve
a(x)。但要注意，如果缩小数组长度，那么数组中超出新的下界到上界之间的元素将清除，即使使用了&#8220;Preserve'&#8217;关键字，也不会保留这些元素，
如果仍然访问这些元素将会引起&#8220;下标越界&#8221;的错误!<br />
&nbsp;&nbsp; 当不需要再使用某个动态数组时，我们可以使用&#8220;Erase&#8221;删除该数组，以释放该数组占用的内存空间，例如：Erase a()。<br />
三、多维数组及数组元素的引用<br />
&nbsp;&nbsp; 一个数组可以是一维的，也可以是多维。当需要表示平面中的一个点坐标，
就需要用到二维数组;表示空间中的一个点时，就需要用到三维数组。多维数组的定义格式为：<br />
&nbsp;&nbsp;&nbsp; Dim数组名([下界TO]上界[，TO
上界[下界 TO]&nbsp;&nbsp;&nbsp; [，&#8230;])[AS类型名]<br />
多维数组的定义格式与—一维数组基本上是一致的，只是多加几个上界和下界。<br />
&nbsp;&nbsp;&nbsp; 现在举例
如下：<br />
&nbsp;&nbsp;&nbsp; Dim a(1 TO 3,1 TO 4)&nbsp;&nbsp;&nbsp; As Integer<br />
&nbsp; &nbsp; Dim b(5, 9)&nbsp;&nbsp;&nbsp; As Siring<br />
&nbsp;&nbsp;&nbsp; Dim
b(4, 3) <br />
&nbsp;&nbsp;&nbsp; 这三行语句分别定义了一个两维数组，第一个指定了下界及类型;第二个只指定了类型&nbsp;&nbsp;&nbsp;
使用默认的下界;最后一个下界和类型都没有指定，其类型是变体型的。<br />
&nbsp;&nbsp; 对数组元素的引用，是数组名加下标的形式。例如：<br />
&nbsp;&nbsp; Dim
a(5)as Integer<br />
&nbsp;&nbsp; Dim b(3,4)as Integer<br />
&nbsp;&nbsp; a(1)=3<br />
&nbsp;&nbsp; a(2)=5<br />
&nbsp;&nbsp; a(3)=a(1)+a(2)<br />
&nbsp;&nbsp; b(2,1)=a(2)
<br />
&nbsp;&nbsp; msgbox a(3)<br />
&nbsp;&nbsp; msgbox b(2,1）<br />
&nbsp; 在此例中，先对数组a的前三个元素赋值，再给数组b的一个元素赋值，最后显
示两个数组元素的值。用数组元素时，其下标不要超出了下界至上界的范围。<br />
<br />
<img src ="http://www.blogjava.net/jjshcc/aggbug/323410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-12 10:46 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/12/323410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改进ASP程序中的字符串处理性能</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/10/323216.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 10 Jun 2010 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/10/323216.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/323216.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/10/323216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/323216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/323216.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; color: rgb(58,58,58); font-size: 12px" class="Apple-style-span"><strong>简介</strong><br />
　　<br />
　　编写 ASP 页面时，开发人员实际上是创建一个格式化的文本流，通过 ASP 提供的 Response 对象写入 Web 客户端。创建此文本流的方法有多种，而您选择的方法将对 Web 应用程序的性能和可缩放性产生很大影响。很多次，在我帮助客户优化其 Web 应用程序的性能时，发现其中一个比较有效的方法是更改 HTML 流的创建方式。本文将介绍几种常用技术，并测试它们对一个简单的 ASP 页面的性能所产生的影响。<br />
　　<br />
　　<strong>ASP 设计</strong><br />
　　<br />
　　许多 ASP 开发人员都遵循良好的软件工程原则，尽可能地将其代码模块化。这种设计通常使用一些包含文件，这些文件中包含对页面的特定不连续部分进行格式化生成的函数。这些函数的字符串输出（通常是 HTML 表格代码）可以通过各种组合创建一个完整的页面。某些开发人员对此方法进行了改进，将这些 HTML 函数移到 Visual Basic COM 组件中，希望充分利用已编译的代码提供的额外性能。<br />
　　<br />
　　尽管这种设计方法很不错，但创建组成这些不连续 HTML 代码组件的字符串所使用的方法将对 Web 站点的性能和可缩放性产生很大的影响，无论实际的操作是在 ASP 包含文件中执行还是在 Visual Basic COM 组件中执行。<br />
　　<br />
　　<strong>字符串连接</strong><br />
　　<br />
　　请看以下 WriteHTML 函数的代码片断。名为 Data 的参数只是一个字符串数组，其中包含一些要格式化为表格结构的数据（例如，从数据库返回的数据）。<br />
　　<br />
　　Function WriteHTML( Data )<br />
　　Dim nRep<br />
　　For nRep = 0 to 99<br />
　　sHTML = sHTML &amp; vbcrlf _<br />
　　&amp; "&lt;TR&gt;&lt;TD&gt;" &amp; (nRep + 1) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 0, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 1, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 2, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 3, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 4, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 5, nRep ) &amp; "&lt;/TD&gt;&lt;/TR&gt;"<br />
　　Next<br />
　　WriteHTML = sHTML<br />
　　End Function<br />
　　<br />
　　这是很多 ASP 和 Visual Basic 开发人员创建 HTML 代码时常用的方法。sHTML 变量中包含的文本返回到调用代码，然后使用 Response.Write 写入客户端。当然，这还可以表示为直接嵌入不包含 WriteHTML 函数的页面的类似代码。此代码的问题是，ASP 和 Visual Basic 使用的字符串数据类型（BSTR 或 Basic 字符串）实际上无法更改长度。这意味着每当字符串长度更改时，内存中字符串的原始表示形式都将遭到破坏，而且将创建一个包含新字符串数据的新的表示形式：这将增加分配内存和解除分配内存的操作。当然，ASP 和 Visual Basic 已为您解决了这一问题，因此实际开销不会立即显现出来。分配内存和解除分配内存要求基本运行时代码解除各个专用锁定，因此需要大量开销。当字符串变得很大并且有大块内存要被快速连续地分配和解除分配时，此问题变得尤为明显，就像在大型字符串连接期间出现的情况一样。尽管这一问题对单用户环境的影响不大，但在服务器环境（例如，在 Web 服务器上运行的 ASP 应用程序）中，它将导致严重的性能和可缩放性问题。<br />
　　<br />
　　下面，我们回到上述代码片段：此代码中要执行多少个字符串分配操作？答案是 16 个。在这种情况下，&#8220;&amp;&#8221;运算符的每次应用都将导致变量 sHTML 所指的字符串被破坏和重新创建。前面已经提到，字符串分配的开销很大，并且随着字符串的增大而增加，因此，我们可以对上述代码进行改进。<br />
　　<br />
　　<strong>快捷的解决方案</strong><br />
　　<br />
　　有两种方法可以缓解字符串连接的影响，第一种方法是尝试减小要处理的字符串的大小，第二种方法是尝试减少执行字符串分配操作的数目。请参见下面所示的 WriteHTML 代码的修订版本。<br />
　　<br />
　　Function WriteHTML( Data )<br />
　　<br />
　　Dim nRep<br />
　　<br />
　　For nRep = 0 to 99<br />
　　sHTML = sHTML &amp; ( vbcrlf _<br />
　　&amp; "&lt;TR&gt;&lt;TD&gt;" &amp; (nRep + 1) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 0, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 1, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 2, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 3, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 4, nRep ) &amp; "&lt;/TD&gt;&lt;TD&gt;" _<br />
　　&amp; Data( 5, nRep ) &amp; "&lt;/TD&gt;&lt;/TR&gt;" )<br />
　　Next<br />
　　<br />
　　WriteHTML = sHTML<br />
　　<br />
　　End Function<br />
　　<br />
　　乍一看，可能很难发现这段代码与上一个代码示例的差别。其实，此代码只是在 sHTML = sHTML &amp; 后的内容外面加上了括号。这实际上是通过更改优先顺序，来减小大多数字符串连接操作中处理的字符串大小。在最初的代码示例中，ASP 编译器将查看等号右边的表达式，并从左到右进行计算。结果，每次重复都要进行 16 个连接操作，这些操作针对不断增长的 sHTML 进行。在新版本中，我们提示编译器更改操作顺序。现在，它将按从左到右、从括号内到括号外的顺序计算表达式。此技术使得每次重复包括 15 个连接操作，这些操作针对的是不会增长的较小字符串，只有一个是针对不断增长的大的 sHTML。图 1 显示了这种优化方法与标准连接方法在内存使用模式方面的比较。<br />
　　
<center>　<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20051209072618_01.jpg" width="421" height="287" /><a style="color: rgb(102,97,75); text-decoration: none" href="http://www.webjx.com/upfiles/20051209/20051209072618_01.jpg" target="_blank"></a></center><br />
　　
<center>图 1：标准连接与加括号连接在内存使用模式方面的比较</center><br />
　　<br />
　　在特定情况下，使用括号可以对性能和可缩放性产生十分显著的影响，后文将对此进行进一步的说明。<br />
　　<br />
　　StringBuilder<br />
　　<br />
　　我们已经找到了解决字符串连接问题的快捷方法，在多数情况下，此方法可以达到性能和投入的最佳平衡。但是，如果要进一步提高构建大型字符串的性能，需要采用第二种方法，即减少字符串分配操作的数目。为此，需要使用 StringBuilder。StringBuilder 是一个类，用于维护可配置的字符串缓冲区，管理插入到此缓冲区的新文本片断，并仅在文本长度超出字符串缓冲区长度时对字符串进行重新分配。Microsoft .NET 框架免费提供了这样一个类 (System.Text.StringBuilder)，并建议在该环境下进行的所有字符串连接操作中使用它。在 ASP 和传统的 Visual Basic 环境中，我们无法访问此类，因此需要自行创建。下面是使用 Visual Basic 6.0 创建的 StringBuilder 类示例（为简洁起见，省略了错误处理代码）。<br />
　　<br />
　　Option Explicit<br />
　　<br />
　　' 默认的缓冲区初始大小和增长系数<br />
　　Private Const DEF_INITIALSIZE As Long = 1000<br />
　　Private Const DEF_GROWTH As Long = 1000<br />
　　<br />
　　' 缓冲区大小和增长<br />
　　Private m_nInitialSize As Long<br />
　　Private m_nGrowth As Long<br />
　　<br />
　　' 缓冲区和缓冲区计数器<br />
　　Private m_sText As String<br />
　　Private m_nSize As Long<br />
　　Private m_nPos As Long<br />
　　<br />
　　Private Sub Class_Initialize()<br />
　　' 设置大小和增长的默认值<br />
　　m_nInitialSize = DEF_INITIALSIZE<br />
　　m_nGrowth = DEF_GROWTH<br />
　　' 初始化缓冲区<br />
　　InitBuffer<br />
　　End Sub<br />
　　<br />
　　' 设置初始大小和增长数量<br />
　　Public Sub Init(ByVal InitialSize As Long, ByVal Growth As Long)<br />
　　If InitialSize &gt; 0 Then m_nInitialSize = InitialSize<br />
　　If Growth &gt; 0 Then m_nGrowth = Growth<br />
　　End Sub<br />
　　<br />
　　' 初始化缓冲区<br />
　　Private Sub InitBuffer()<br />
　　m_nSize = -1<br />
　　m_nPos = 1<br />
　　End Sub<br />
　　<br />
　　' 增大缓冲区<br />
　　Private Sub Grow(Optional MinimimGrowth As Long)<br />
　　' 初始化缓冲区（如有必要）<br />
　　If m_nSize = -1 Then<br />
　　m_nSize = m_nInitialSize<br />
　　m_sText = Space$(m_nInitialSize)<br />
　　Else<br />
　　' 只是增长<br />
　　Dim nGrowth As Long<br />
　　nGrowth = IIf(m_nGrowth &gt; MinimimGrowth,<br />
　　m_nGrowth, MinimimGrowth)<br />
　　m_nSize = m_nSize + nGrowth<br />
　　m_sText = m_sText &amp; Space$(nGrowth)<br />
　　End If<br />
　　End Sub<br />
　　<br />
　　' 将缓冲区大小调整到当前使用的大小<br />
　　Private Sub Shrink()<br />
　　If m_nSize &gt; m_nPos Then<br />
　　m_nSize = m_nPos - 1<br />
　　m_sText = RTrim$(m_sText)<br />
　　End If<br />
　　End Sub<br />
　　<br />
　　' 添加单个文本字符串<br />
　　Private Sub AppendInternal(ByVal Text As String)<br />
　　If (m_nPos + Len(Text)) &gt; m_nSize Then Grow Len(Text)<br />
　　Mid$(m_sText, m_nPos, Len(Text)) = Text<br />
　　m_nPos = m_nPos + Len(Text)<br />
　　End Sub<br />
　　<br />
　　' 添加一些文本字符串<br />
　　Public Sub Append(ParamArray Text())<br />
　　Dim nArg As Long<br />
　　For nArg = 0 To UBound(Text)<br />
　　AppendInternal CStr(Text(nArg))<br />
　　Next nArg<br />
　　End Sub<br />
　　<br />
　　' 返回当前字符串数据并调整缓冲区大小<br />
　　Public Function ToString() As String<br />
　　If m_nPos &gt; 0 Then<br />
　　Shrink<br />
　　ToString = m_sText<br />
　　Else<br />
　　ToString = ""<br />
　　End If<br />
　　End Function<br />
　　<br />
　　' 清除缓冲区并重新初始化<br />
　　Public Sub Clear()<br />
　　InitBuffer<br />
　　End Sub<br />
　　<br />
　　此类中使用的基本原则是，在类级别将变量 (m_sText) 用作字符串缓冲区，并使用 Space$ 函数以空格字符填充此缓冲区以将其设置为特定的大小。如果要将更多文本与现有文本连接在一起，则在检查缓冲区的大小足以存放新文本后，使用 Mid$ 函数在正确位置插入文本。ToString 函数将返回当前存储在缓冲区中的文本，并将缓冲区的大小调整为能够容纳此文本的正确长度。使用 StringBuilder 的 ASP 代码如下所示：<br />
　　<br />
　　Function WriteHTML( Data )<br />
　　<br />
　　Dim oSB<br />
　　Dim nRep<br />
　　<br />
　　Set oSB = Server.CreateObject( "StringBuilderVB.StringBuilder" )<br />
　　' 用大小和增长系数初始化缓冲区<br />
　　oSB.Init 15000, 7500<br />
　　<br />
　　For nRep = 0 to 99<br />
　　oSB.Append "&lt;TR&gt;&lt;TD&gt;", (nRep + 1), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 0, nRep ), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 1, nRep ), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 2, nRep ), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 3, nRep ), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 4, nRep ), "&lt;/TD&gt;&lt;TD&gt;", _<br />
　　Data( 5, nRep ), "&lt;/TD&gt;&lt;/TR&gt;"<br />
　　Next<br />
　　<br />
　　WriteHTML = oSB.ToString()<br />
　　Set oSB = Nothing<br />
　　<br />
　　End Function<br />
　　<br />
　　使用 StringBuilder 需要一定的开销，因为每次使用此类时都必须创建它的实例，并且在创建第一个类实例时必须加载包含此类的 DLL。对 StringBuilder 实例进行额外方法调用时也需要开销。使用加括号的&#8220;&amp;&#8221;方法时，StringBuilder 如何执行取决于多个因素，包括连接的数目、要构建的字符串的大小以及选择的 StringBuilder 字符串缓冲区的初始化参数的性能。请注意，在多数情况下，将缓冲区中所需的空间量估计得略高一些要远远好于让其不断增长。<br />
　　<br />
　　<strong>内置方法</strong><br />
　　<br />
　　ASP 包含一种非常快捷的创建 HTML 代码的方法，只需多次调用 Response.Write。Write 函数使用隐式优化的字符串缓冲区，此缓冲区能够提供非常优秀的性能特性。修改后的 WriteHTML 代码如下所示：<br />
　　<br />
　　Function WriteHTML( Data )<br />
　　<br />
　　Dim nRep<br />
　　<br />
　　For nRep = 0 to 99<br />
　　Response.Write "&lt;TR&gt;&lt;TD&gt;"<br />
　　Response.Write (nRep + 1)<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 0, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 1, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 2, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 3, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 4, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;TD&gt;"<br />
　　Response.Write Data( 5, nRep )<br />
　　Response.Write "&lt;/TD&gt;&lt;/TR&gt;"<br />
　　Next<br />
　　<br />
　　End Function<br />
　　<br />
　　虽然这段代码很可能为我们提供最佳的性能和可缩放性，但在某种程度上已经破坏了封装，因为现在会将函数内部的代码直接写入 Response 流，所以调用代码丧失了一定程度的控制权。另外，移动此代码（例如，移入 COM 组件）将变得更加困难，因为此函数与 Response 流存在依赖关系。<br />
　　<br />
　　<strong>测试</strong><br />
　　<br />
　　上面提到的四种方法分别通过一个简单的 ASP 页面（包含一个由虚拟字符串数组提供数据的单个表格）进行了测试。我们使用 Application Center Test? (ACT) 从单个客户端（Windows? XP Professional，PIII-850MHz，512MB RAM）针对 100Mb/sec 网络中的单个服务器（Windows 2000 Advanced Server，双 PIII-1000MHz，256MB RAM）执行了测试。ACT 配置为使用 5 个线程，以模拟 5 个用户连接至网站时的负载。每个测试都包括 20 秒预热时间和随后的 100 秒负载时间，在负载期间创建了尽可能多的请求。<br />
　　<br />
　　通过更改主表格循环中的重复次数，针对不同数目的连接操作重复运行测试，如 WriteHTML 函数中的代码片断所示。运行的每个测试都使用上文提到的四种不同的方法执行。<br />
　　<br />
　　<strong>结果</strong><br />
　　<br />
　　下面的一系列图表显示了各种方法对整个应用程序吞吐量的影响，以及 ASP 页面的响应时间。通过这些图表，我们可以了解应用程序支持的请求数目，以及用户等待页面下载至浏览器所需的时间。<br />
　　<br />
　　表 1：使用的连接方法缩写的说明<br />
　　
<center>　<a style="color: rgb(102,97,75); text-decoration: none" href="http://www.chinaitlab.com/www/imgfiles/2005.4.20.9.51.59.2.GIF" target="_blank"><img style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; word-break: break-all; border-left-width: 0px; padding-top: 0px" title="点击在新窗口查看原始图片" src="http://www.chinaitlab.com/www/imgfiles/2005.4.20.9.51.59.2.GIF" onload="java_script_:if(this.width  alt="  ? /></a></center><br />
　　在模拟典型 ASP 应用程序工作负荷方面，此测试与实际情况相差甚远，从表 2 中可以明显看到，即使重复 420 次，此页面仍不是特别大。现在很多复杂的 ASP 页面在这些数字上都是比较高的，设置有可能超出此测试范围的限制。<br />
　　<br />
　　表 2：测试示例的页面大小和连接数目<br />
　　
<center>　<a style="color: rgb(102,97,75); text-decoration: none" href="http://www.chinaitlab.com/www/imgfiles/2005.4.20.9.52.7.3.GIF" target="_blank"><img style="padding-bottom: 0px; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; word-break: break-all; border-left-width: 0px; padding-top: 0px" title="点击在新窗口查看原始图片" src="http://www.chinaitlab.com/www/imgfiles/2005.4.20.9.52.7.3.GIF" onload="java_script_:if(this.width  alt="  ? /></a></center><br />
　　
<center>　<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20051209072632_2.jpg" width="421" height="287" /><a style="color: rgb(102,97,75); text-decoration: none" href="http://www.webjx.com/upfiles/20051209/20051209072632_2.jpg" target="_blank"></a></center><br />
　　
<center>图 2：吞吐量结果图</center><br />
　　<br />
　　从图 2 的图表中可以看到，正如我们所预期的，多重 Response.Write 方法 (RESP) 在测试的整个重复测试范围中为我们提供了最佳的吞吐量。但令人惊讶的是，标准字符串连接方法 (CAT) 的下降如此巨大，而加括号的方法 (PCAT) 在重复执行 300 多次时性能依旧要好很多。在大约重复 220 次之处，字符串缓存带来的性能提高超过了 StringBuilder 方法 (BLDR) 固有的开销，在这一点以上，在此 ASP 页面中使用 StringBuilder 所需的额外开销是值得的。<br />
　　
<center>　<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20051209072644_3.jpg" width="421" height="287" /><a style="color: rgb(102,97,75); text-decoration: none" href="http://www.webjx.com/upfiles/20051209/20051209072644_3.jpg" target="_blank"></a></center><br />
　　
<center>图 3：响应时间结果图</center><br />
　　
<center><a style="color: rgb(102,97,75); text-decoration: none" href="http://www.webjx.com/upfiles/20051209/20051209072657_4.jpg" target="_blank"></a></center>
<div align="center"><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/20051209072657_4.jpg" width="421" height="287" /></div>
<br />
　　
<center>图 4：省略 CAT 的响应时间结果图</center><br />
　　<br />
　　图 3 和图 4 中的图表显示了按&#8220;到第一字节的时间&#8221;测量的响应时间（以毫秒为单位）。因为标准字符串连接方法 (CAT) 的响应时间增加过快，所以又提供了未包括此方法的图表（图 4），以便分析其他方法之间的差异。有一点值得注意，多重 Response.Write 方法 (RESP) 和 StringBuilder 方法 (BLDR) 随重复次数的增加呈现一种近似线性的增长，而标准连接方法 (CAT) 和加括号的方法 (PCAT) 则在超过一定的阈值之后开始迅速增加。<br />
　　<br />
　　<strong>小结</strong><br />
　　<br />
　　本文着重讲述了如何在 ASP 环境中应用不同的字符串构建技术，这些内容同样适用于所有使用 Visual Basic 代码创建大型字符串的方案，例如手动创建 XML 文档。以下原则可以帮助您确定哪种方法最适合您的需要。<br />
　　<br />
　　首先尝试加括号的&#8220;&amp;&#8221;方法，尤其是在处理现有代码时。这种方法对代码结构的影响微乎其微，但您会发现应用程序的性能将显著增强，甚至会超出预定目标。<br />
　　<br />
　　在不破坏所需的封装级别的情况下使用 Response.Write。使用此方法，可以避免不必要的内存内字符串处理，从而提供最佳的性能。<br />
　　<br />
　　使用 StringBuilder 构建真正大型或连接数目较多的字符串。<br />
　　<br />
　　尽管您可能未看到本文所示的这种性能增长，但我已在真实的 ASP Web 应用程序中使用了这些技巧，只需要很少的额外投入就可以在性能和可缩放性方面获得很大的提高。</span></span> 
<img src ="http://www.blogjava.net/jjshcc/aggbug/323216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-10 11:33 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/10/323216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>权限被拒绝错误当试图 [重新编译一个 ASP 的 DLL 时</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/05/322817.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Sat, 05 Jun 2010 00:30:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/05/322817.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322817.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/05/322817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322817.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 试图重新编译 Windows 95 或 Windows 98 的计算机运行 Microsoft 个人 Web 服务器 （PWS） 4.0 的上一个自定义 ActiveX 动态链接库 (DLL) 时，您可能会收到一条错误消息类似于以下内容： <br />
权限被拒绝： &lt;filepath&gt;' <br />
其中 &lt;filepath&gt; 是路径以在活动服务器页面 (ASP) DLL。</font></p>
<p><font style="background-color: #cce8cf">如果您试图重命名 DLL 在 Windows 资源管理器中的，您可能会看到一条错误消息类似于以下内容： <br />
不能重命名 &lt;filename&gt;，请执行下列操作： 访问被拒绝。 </font></p>
<p><font style="background-color: #cce8cf">请确保磁盘未满或写保护<br />
而且文件当前未在使用中。 <br />
其中 &lt;filename&gt; 是 DLL 的文件名。</font></p>
<p><font style="background-color: #cce8cf">如果试图删除该 DLL 在 Windows 资源管理器中的，您可能会看到一条错误消息类似于以下内容： <br />
不能删除 &lt;filename&gt;: 访问被拒绝 </font></p>
<p><font style="background-color: #cce8cf">请确保磁盘未满或写保护<br />
而且文件当前未在使用中。 <br />
&nbsp;<br />
原因<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当 ASP 实例化自定义 ActiveX DLL 使用 Server.CreateObject("ActiveX.Class")DLL 获取实例化，在本例中为...当 ASP 实例化自定义 ActiveX DLL 使用 <br />
Server.CreateObject("ActiveX.Class")</font></p>
<p><font style="background-color: #cce8cf">DLL 获取实例化，在本例中为 PWS 在 Web 服务进程中。 一旦被实例化 DLL PWS 不会释放该 DLL。 <br />
&nbsp;<br />
解决方案<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 停止并重新 PWS 启动从 SysTray 图标不能释放上 ActiveX DLL 是实例化一个活动服务器页面 (ASP) 的锁。 若要解除锁定 DLL 上的，...停止并重新 PWS 启动从 SysTray 图标不能释放上 ActiveX DLL 是实例化一个活动服务器页面 (ASP) 的锁。&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font style="background-color: #cce8cf">若要解除锁定 DLL 上的，PWS 必须手动停止使用命令提示。 默认状态下，Pws.exe 驻留在文件夹 C:\Windows\System\Inetsrv。 若要停止 PWS，键入以下命令： <br />
windows\system\inetsrv\pws.exe /stop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后，您可以重新启动 PWS 手动重新从命令提示符，启动时通过使用以下命令： <br />
windows\system\inetsrv\pws.exe /start<br />
&nbsp;&nbsp;&nbsp;&nbsp; 一旦停止 PWS，这将释放 ActiveX DLL。 如有必要，请重新编译 DLL。 一次 PWS 的重新启动它将再次 DLL 时锁定它获取 ASP 通过实例化。</font></p>
<font style="background-color: #cce8cf">
<p><br />
<br />
另一个解决方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在运行行键入: net stop iisadmin/y，然后按 Enter。这将在 DLL 中运行生成时停止所有服务。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成 DLL 完成后键入: net start w3svc 从运行的行。您的服务将再次为最多。 <br />
&nbsp;</font></p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-05 08:30 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/05/322817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决DLL组件注册成功但无法使用的问题</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/04/322696.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Fri, 04 Jun 2010 00:31:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/04/322696.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322696.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/04/322696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322696.html</trackback:ping><description><![CDATA[一个很简单的问题，但是研究半天，给出标准答案，XP或2003下<br />
如FSO，在NTFS格式下<br />
Regsvr32 %systemroot%\system32\scrrun.dll<br />
如果注册成功，但ASP中依然无法使用<br />
先看scrrun.dll在NTFS格式下的权限，看是否加入user组中，如没有请用下命令<br />
cacls %systemroot%\system32\scrrun.dll /d guests<br />
而在FAT32格式下面，因为没有文件权限，无需要上面的步骤<br />
而注册表中依然有用户权限<br />
请查看HKEY_CLASSES_ROOT\Scripting.FileSystemObject的权限，请加上User组可读可运行权限<br />
同理，别的DLL组件能注册成功但无法使用也大多是这种问题<a href="http://www.pcjx.net/" target="_blank">。</a> <br />
<br />
简单的回答一下，因为IIS的登录用户不是DLL注册时候的用户。解决方法 把IIS用户改为你这个DLL注册的用户，或者 有没有办法把这个DLL注册给所有用户！不知道你懂没，反正就这么点回答了！administrator 设置密码，而且IIS用户那里自己输入administrator 和密码 别去查找！ 
<img src ="http://www.blogjava.net/jjshcc/aggbug/322696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-04 08:31 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/04/322696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP国际化多语言详细方案 </title><link>http://www.blogjava.net/jjshcc/archive/2010/06/03/322626.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 03 Jun 2010 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/03/322626.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322626.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/03/322626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322626.html</trackback:ping><description><![CDATA[1.ASP部分
<br />
a.建立语言包
<br />
1.在各个子系统建立"语言包"目录 ,
<br />
如BBS--&gt; language --&gt;Simplified
<br />
---&gt;Traditional
<br />
---&gt;English
<br />
2 为每个ASP,js,HTC 建立语言文件,如ACMBBStopic.asp.lang ,treeview.htc.lang ,
<br />
用来存放语言全局变量。
<br />
如目录Language\English\ ACMBBSShow.asp.lang
<br />
Public Const LangRollway="reverse roll"
<br />
Public Const LangInvaildUser="invaild user"
<br />
Public Const LangMailbox="mail box"
<br />
Public Const LangSysSetup="system setup"
<br />
Public Const LangACMBBS="Acer BBS"
<br />
Public Const LangBulltn="Acer bulltin"
<br />
Public Const LangPersnSetup="personal setting"
<br />
Public Const LangPublicTools="Public Tools"
<br />
如目录Language\ Simplified \ ACMBBSShow.asp.lang
<br />
Public Const LangRollway="反向滚动"
<br />
Public Const LangInvaildUser="非法用户"
<br />
Public Const LangMailbox="邮件资料夹"
<br />
Public Const LangSysSetup="系统设置"
<br />
Public Const LangACMBBS="明碁网咖"
<br />
Public Const LangBulltn="公告栏"
<br />
Public Const LangPersnSetup="个人设定"
<br />
Public Const LangPublicTools="群组工具"
<br />
语言全局变量命名规则;
<br />
必须是VBscript 变量定义方式 Public Const
<br />
变量名为 ： "Lang" + Message Descption
<br />
<br />
b. 设定Global.asa
<br />
SUB Session_OnStart
<br />
Session.CODEPAGE="1252" '1252En '950繁体 '936简体
<br />
Session.Contents("Language")="EngLish" 'EngLish 'Traditional
'Simplified
<br />
Session.Contents("StrCharset")="big5" 'iso-8859-1 'big5 'gb2312
<br />
End Sub
<br />
c. 引用语言包
<br />
1.建立 BBS--&gt; language --&gt;script 目录, IncludeLang.vbs
<br />
2.在各个asp,js,HTC头部
<br />
<br />
<br />
3.使用思想
<br />
o 将 *.lang 等语言包用Function GetFileContents 读到变量中,
<br />
o 使用vbscript中EXECUTE方法在Server执行
<br />
IncludeLang.vbs 内容如下
<br />
<br />
'//'*********************************************************
<br />
'// ' Purpose: open include 文件
<br />
'// ' Inputs: strIncludeFile 路径
<br />
'// ' Returns: All Text
<br />
'//'*********************************************************
<br />
<br />
Function GetFileContents(strIncludeFile)
<br />
On Error Resume Next
<br />
Dim objFSO
<br />
Dim objText
<br />
Dim strPage
<br />
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
<br />
Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
<br />
GetFileContents= objText.ReadAll
<br />
objText.Close
<br />
Set objText = Nothing
<br />
Set objFSO = Nothing
<br />
IF Err Then
<br />
Response.Write "Error open this language package file&lt;&lt;" &amp;
strIncludeFile &amp; "&gt;&gt;!"
<br />
Response.End
<br />
END IF
<br />
End Function
<br />
<br />
'//'*********************************************************
<br />
'// ' Purpose: 动态 include 文件
<br />
'// ' Inputs: strIncludeFile 路径,语言种类
<br />
'// ' Returns: 执行变量到全局变量
<br />
'//'*********************************************************
<br />
Function IncludeLangFile(StrFileName,Language)
<br />
On Error Resume Next
<br />
dim StrLangPackagePath
<br />
dim StrLanguagePath
<br />
StrLanguagePath=Language
<br />
StrLangPackagePath="./Language/" &amp; StrLanguagePath &amp; "/"
&amp; StrFileName
<br />
Execute(GetFileContents(StrLangPackagePath))
<br />
IF Err Then
<br />
Response.Write "Error Include this language package file&lt;&lt;"
&amp; strIncludeFile &amp; "&gt;&gt;! check the file's syntax"
<br />
Response.End
<br />
END IF
<br />
End Function
<br />
2.图片部分
<br />
为带有汉字图片建立 BBS--&gt; language --&gt;simplified--&gt;Image
<br />
---&gt;traditional--&gt;Image
<br />
---&gt;English --&gt;Image
<br />
动态Include
<br />
<br />
<br />
<br />
3.COM部分
<br />
使用resource file 控制语言版本,由系统自动判断语言版本
<br />
<br />
注意： resource file 简体字码必须在简体机器输入，繁体字码必须在繁体机器输入
<br />
<br />
<br />
4.其他
<br />
<br />
多语言版本参考规则﹕
<br />
1.英文翻译长度尽量与汉语长度相当。
<br />
2.要符合各个版本的语言习惯。
<br />
3.英文版中Title ,text标签文本﹐按钮文本﹐select option 中英文单词 首字母大写,但
<br />
介词﹐连词 ,冠词 使用小写。
<br />
4. 英文版中缩写全部使用大写。
<br />
5. 英文版中check ,radio ,英文首字母大写.
<br />
6. 英文版中状态信息使用小写。
<br />
<br />
<img src ="http://www.blogjava.net/jjshcc/aggbug/322626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-03 15:36 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/03/322626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP中调用DLL示例</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/01/322482.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 01 Jun 2010 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/01/322482.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322482.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/01/322482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322482.html</trackback:ping><description><![CDATA[&nbsp;这篇文章主要是为想将自己的ASP水平提高的人写的!把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码.这篇文章写出来,也是为了给想开发组件网友上一堂入门课! 下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了.
<p>　　服务器端组件
<p>　　首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器.
<p>　　当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到〈% %&gt;标签之间的代码,并且执行它(也可以是〈script runat=server&gt;〈/script&gt;之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源.
<p>　　想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立Dynamic Linked Libraries (DLL文件),它能在IIS上直接运行(如果有asp文件来请求的话).
<p>　　系统和软件的要求
<p>　　你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.
<p>　　我们开始吧
<p>　　启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口从中选择Microsoft Active Server Pages Object Library.
<p>　　给工程和类命名
<p>　　现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍.
<p>　　如何改名,我就不想多说了!我们的工程名改为Exmaple,类名为Helloword
<p>　　怎样使用工程和类
<p>　　现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下:
<p>　　Set ObjReference = Server.CreateObject("ProjectName.ClassName")
<p>　　对于我们工程的引用就是:Set ObjReference = Server.CreateObject("Example1.HelloWorld")
<p>　　现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序,我们执行它的代码如下:
<p>〈%<br />
Set ObjReference = Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;
<p>　　为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage子函数.如下:
<p>Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)<br />
Set MyScriptingContext = PassedScriptingContext<br />
End Sub
<p>　　
<p>　　现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码:
<p>Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)<br />
Set MyScriptingContext = PassedScriptingContext<br />
Set MyApplication = MyScriptingContext.Application<br />
Set MyRequest = MyScriptingContext.Request<br />
Set MyResponse = MyScriptingContext.Response<br />
Set MyServer = MyScriptingContext.Server<br />
Set MySession = MyScriptingContext.Session<br />
End Sub
<p><br />
　　以后我们就能用在VB中用MyApplication来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在OnStartPage之前来申明这些变量:
<p>Private MyScriptingContext As ScriptingContext<br />
Private MyApplication As Application<br />
Private MyRequest As Request<br />
Private MyResponse As Response<br />
Private MyServer As Server<br />
Private MySession As Session
<p>　　
<p>　　使用ASP的对象我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下:
<p>　　用ASP中实现:<br />
〈%<br />
MyTempVariable = Request.Form("userName")<br />
Response.Write ("you entered "&amp; MyTempVariable &amp; "as your user name")<br />
%&gt;
<p>　　在VB中实现:
<p>MyTempVariable = MyRequest.Form("userName")<br />
MyResponse.Write ("you entered "&amp; MyTempVariable &amp; "as your user name")
<p><br />
　　通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response.另一件我们得注意的是,我们得在我们的建立的类中,写上OnEndPage子函数,这个OnStartPage是相反的!OnStartPage是创建对象,OnEndPage是消毁对象.
<p>　　
<p>Public Sub OnEndPage()<br />
Set MyScriptingContext = Nothing<br />
Set MyApplication = Nothing<br />
Set MyRequest = Nothing<br />
Set MyResponse = Nothing<br />
Set MyServer = Nothing<br />
Set MySession = Nothing<br />
End Sub
<p>　　
<p>　　SayHello方法我们来建立一个子函数,用于显示"Holle World".这个SayHello方法只是HelloWorld这个类中一个子函数,我们以后会在ASP中用以下的显示这个方法
<p>〈%<br />
Set ObjReference = Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;
<p>　　SayHello的程序,很简单的!
<p>Public Sub SayHello()<br />
MyResponse.Write ("Hello World")<br />
End Sub
<p>　　
<p>　　现在一个小型的组件编写完成,剩下的工作就是编译这个组件,在"工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp吧!然后就用在菜单中选择"make exmaple1.dll",将其编译成DLL文件.一个组件就真正完成了!
<p>　　注意,编译了此组件那么你就得先把你的PWS关掉,然后再编译此组件.否则VB就会告诉你些组件在使用中.
<p>　　在ASP中使用我们的自己的组件.
<p>　　当你更正了在编译中的错误,成功地编译了example1这个工程,现在你就得拿出你最喜欢的HTML编辑器来写下下面的语句,保存为ASP文件.
<p>　　〈HTML&gt;〈HEAD&gt;〈TITLE&gt;Example 1〈/TITLE&gt;〈/HEAD&gt;
<p>　　〈BODY&gt;
<p>〈%<br />
Set ObjReference = Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;
<p>　　〈/BODY&gt;〈/HTML&gt;
<p>　　运行后即可看到结果:
<p>　　Hello World
<p>　　注册组件
<p>　　如果你想和你的朋友,邻居分享你的组件,那么你就得在你的系统上注册你的组件.我们一般使用Regsvr32.exe来注册组件.注册后你的组件会出现在Win95/Win98的windows/system目录中.下面是一个注册的例子:
<p>　　Regsvr32.exe C:/wwwroot/Example1/Example1.dll
<p>　　在你的系统中,VB会自动给你注册,所以你很少用到Regsvr32.exe
<p>　　我们这里只是写了一个非常小的组件,你们可以写好自己的更大的组件,而且还可以用VB中的很多控件.
<p>　　让我们用组件来扩展我们的程序的功能吧!也希望多多的看到我们中国人的组件.<br />
</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-01 20:34 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/01/322482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VB生成DLL封装ASP代码一个例子：连接access数据库等</title><link>http://www.blogjava.net/jjshcc/archive/2010/06/01/322436.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Tue, 01 Jun 2010 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/06/01/322436.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322436.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/06/01/322436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322436.html</trackback:ping><description><![CDATA[封装为dll会带来很多的好处，主要包括只是产权的保护，以及效率和安全性能的提升。这个例子中被封装的dll文件可以隐藏access数据库的实际路径。<br />
<br />
VB生成的DLL封装ASP代码来连接数据库（Access）。<br />
<br />
本文用一个最简单的连接access数据库的例子来说明如何将asp代码封装为dll文件。<br />
<br />
我们用vb，最常见的方式来封装asp代码。<br />
<br />
我们需要封装的对象如下: <br />
<br />
'Proconn.asp<br />
dim ProConn<br />
set ProConn=Server.CreateObject("ADODB.CONNECTION")<br />
ProConn.Open "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" &amp; Server.MapPath("DB.asp")<br />
<br />
我们将下面的部分封装<br />
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" &amp; Server.MapPath("DB.asp")<br />
<br />
分析一下这段要封装的内容，<br />
它的前半部分就是一个字符串：<br />
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="<br />
用&amp;连接上后半部分的另一个字符串。<br />
后半部分的另一个字符串是Server.MapPath对象函数的返回值。<br />
<br />
下面开始这个封装的操作过程。<br />
首先<br />
新建一个VB下的ActiveX DLL工程，工程的名称Project1更改成ConDBDLL<br />
方法class1的名称更改成cs<br />
工程名和方法名会在调用这个DLL的时候使用到，大家可以按照自己命名规则定义，但请注意好好使用。<br />
这个DLL的代码部分书写如下：<br />
<br />
Dim rp As Response<br />
Dim rq As Request<br />
Dim ap As Application<br />
Dim sr As Server<br />
Dim sn As Session<br />
<br />
Public Sub OnStartPage(MyScriptingContext As ScriptingContext)<br />
Set rp = MyScriptingContext.Response<br />
Set rq = MyScriptingContext.Request<br />
Set sr = MyScriptingContext.Server<br />
Set ap = MyScriptingContext.Application<br />
Set sn = MyScriptingContext.Session<br />
End Sub<br />
<br />
Public Sub OnEndPage()<br />
Set rp = Nothing<br />
Set rq = Nothing<br />
Set sr = Nothing<br />
Set ap = Nothing<br />
Set sn = Nothing<br />
End Sub<br />
'以上语句是必须的，将原本的对象作了简化处理，并在两个基本函数中作了处理<br />
<br />
Public Function ConnectDB() As Variant<br />
ConnectDB = "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="<br />
End Function<br />
'上面这个函数是处理前半部分字符串的，直接返回这个字符串的内容<br />
<br />
'另外定义下面这个函数来处理后半部分内容<br />
Public Function DBPath() As Variant<br />
DBPath = sr.MapPath("DB.asp")<br />
End Function<br />
'注意上面使用的是sr，不要使用成Server了<br />
<br />
到了关键的一步，给这个工程添加"Microsoft Active Server Pages ObjectContext Object Library" 的 Reference<br />
添加方法，选择菜单中的"Project"-&gt;"Reference",在打开的对话框里选择。<br />
对了，还要选择上"microsoft activeX data objects 2.6 library"<br />
<br />
进行完以上操作，我们就可以编译生成DLL了，（别忘了前面的改工程名和方法名）<br />
<br />
准备好数据库文件DB.asp (由DB.mdb更改后缀而成，密码123)<br />
<br />
下面就是调用封装的连接数据库的asp文件代码： <br />
<br />
由于是自己创建的DLL，把它拷贝到相应的目录后，必须注册才能使用。<br />
注册的方法，在&#8220;运行&#8221;中执行：<br />
Regsvr32.exe dllname.dll<br />
<br />
取消这个DLL的注册的方法是：Regsvr32.exe /u dllname.dll<br />
<br />
注册完毕，我们的工作基本上就做完了，现在我们可以使用这样的封装方法连接具有针对性的数据库了。<br />
<br />
不过有一点需要特别注意的是：<br />
由于<br />
Dim ConDB<br />
set ConDB=Server.CreateObject("ConDBDLL.Conn")<br />
'ConDB就是创建的DLL对象<br />
这是在ASP中创建的对象，包括ProConn，那么我们在任何使用到（引用）ProConn.asp的其他ASP文件中记得释放这两个对象！<br />
ProConn.close<br />
set ProConn=nothing<br />
set ConDB=Nothing<br />
否则系统会由于对象没有释放，而变得越来越不堪重负。<br />
<br />
关于这个封装ASP代码连接Access数据库的方法，我想完全适用其他数据库的连接方法。<br />
<br />
<br />
再例如，下面的封装的例子：<br />
<br />
首先要申明变量：<br />
<br />
Private WenScriptingContext As ScriptingContext<br />
Private WenApplication As Application<br />
Private WenRequest As Request<br />
Private WenResponse As Response<br />
Private WenServer As Server<br />
Private WenSession As Session<br />
<br />
为了在WenConnection类中使用ASP的内建对象,必须在此类中写一个OnStartPage子函数。那是因为无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用。这个ScriptingContext包括了全部的ASP方法和属性，这使得我们有能力访问所有ASP的对象。<br />
<br />
Public Sub OnStartPage (PassedScriptingContext As ScriptingContext)<br />
Set WenScriptingContext = PassedScriptingContext<br />
Set WenApplication = WenScriptingContext.Application<br />
Set WenRequest = WenScriptingContext.Request<br />
Set WenResponse = WenScriptingContext.Response<br />
Set WenServer = WenScriptingContext.Server<br />
Set WenSession = WenScriptingContext.Session<br />
End Sub<br />
<br />
我们既然用OnStartPage函数来创建对象，那么我们这里就用OnEndPage子函数来释放对象：<br />
<br />
Public Sub OnEndPage()<br />
Set WenScriptingContext = Nothing<br />
Set WenApplication = Nothing<br />
Set WenRequest = Nothing<br />
Set WenResponse = Nothing<br />
Set WenServer = Nothing<br />
Set WenSession = Nothing<br />
End Sub<br />
<br />
接下来定义两个函数RsResult()和DataSource()：<br />
<br />
Public Function Rs(strsql As String) As Recordset<br />
Dim oConn As Connection<br />
Dim oRs As Recordset<br />
Dim strconnstring As String<br />
strconnstring = "driver={sql server};server=ServerName;uid=sa;pwd=;" &amp; _<br />
"database=DataBaseName"<br />
oConn.Open strconnstring<br />
oRs.ActiveConnection = oConn<br />
strsql="Select * From tableName"<br />
oRs.Open strsql, oConn, 1, 3<br />
Set Rs = oRs<br />
End Function <br />
<br />
Public Function DataSourceConnection() As Variant<br />
DataSourceConnection = "driver={sql server};server=ServerName;uid=sa;pwd=;database=DataBaseName"<br />
End Function<br />
<br />
三、 存工程名为WenADODB.vbp和保存类名为WenConnection.cls，然后点击&#8220;文件&#8221;—&gt;&#8220;生成WenADODB.DLL&#8221;编译成动态连接库文件。VB在编译好动态连接库文件的同时也将该组件注册到注册表里了，要是想在另外一台机器上注册该组件的话，请用以下指令注册或反注册：<br />
<br />
Regsvr32 x:\路径\WenADODB.dll x:\路径\为WenADODB.dll文件存放的盘符和路径<br />
<br />
Regsvr32 /u x:\路径\WenADODB.dll 参数U为反注册<br />
<br />
四、 在ASP文件中调用WenADODB.dll组件的例子。<br />
<br />
&lt;%<br />
<br />
Set Conn=Server.CreateObject("WenADODB.WenConnection") &#8216;调用组件创建对象实例<br />
objConn=Conn.DataSourceConnection()<br />
application("strconn")=objConn <br />
<br />
set Rs=Server.CreateObject("ADODB.Recordset")<br />
sql="select * from TableName order by ID DESC"<br />
Rs.open sql,application("strconn"),1,3<br />
%&gt;<br />
&lt;Table align="center" border="1"&gt;<br />
&lt;% <br />
if Rs.Bof and Rs.Eof then<br />
Response.Write "暂时还没有任何数据。"<br />
else<br />
Do while not Rs.Eof <br />
%&gt;<br />
&lt;tr width=100%&gt;<br />
&lt;td width=50%&gt;&lt;%=Rs("Field1")%&gt;&lt;/td&gt;&lt;td width=50%&gt;&lt;%=Rs("Field2")%&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;%<br />
Rs.MoveNext<br />
Loop<br />
end if<br />
Rs.Close;Set Rs=Nothing<br />
%&gt;<br />
&lt;/Table&gt;<br />
<br />
五、 小结<br />
<br />
我们这里只是编写了一个连接数据库的简单的动态连接库文件，利用VB的强大组件编写功能还可以写出功能更加强大跟齐全的组件，来完成更加实用的任务 <br />
<br />
关键字 如何把ASP编写成DLL <br />
<br />
这篇文章主要是把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码.<br />
下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了.<br />
<br />
服务器端组件<br />
<br />
首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器.<br />
<br />
当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到〈%%&gt;标签之间的代码,并且执行它(也可以是〈scriptrunat=server&gt;〈/script&gt;之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源.<br />
<br />
想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立DynamicLinkedLibraries(DLL文件),它能在IIS上直接运行(如果有asp文件来请求的话).<br />
<br />
系统和软件的要求<br />
<br />
你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.<br />
<br />
我们开始吧<br />
<br />
启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有MicrosoftActiveServerPagesObjectLibrary,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口<br />
从中选择MicrosoftActiveServerPagesObjectLibrary.<br />
<br />
给工程和类命名<br />
<br />
现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍.<br />
<br />
如何改名,我就不想多说了!<br />
我们的工程名改为Exmaple,类名为Helloword<br />
<br />
怎样使用工程和类<br />
<br />
现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下:<br />
<br />
SetObjReference=Server.CreateObject("ProjectName.ClassName")<br />
<br />
对于我们工程的引用就是:<br />
SetObjReference=Server.CreateObject("Example1.HelloWorld")<br />
现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序,我们执行它的代码如下:<br />
<br />
<br />
〈%<br />
SetObjReference=Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;<br />
<br />
<br />
为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage<br />
子函数.如下:<br />
<br />
<br />
PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)<br />
SetMyScriptingContext=PassedScriptingContext<br />
EndSub<br />
<br />
<br />
<br />
现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码:<br />
<br />
<br />
PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)<br />
SetMyScriptingContext=PassedScriptingContext<br />
SetMyApplication=MyScriptingContext.Application<br />
SetMyRequest=MyScriptingContext.Request<br />
SetMyResponse=MyScriptingContext.Response<br />
SetMyServer=MyScriptingContext.Server<br />
SetMySession=MyScriptingContext.Session<br />
EndSub<br />
<br />
<br />
以后我们就能用在VB中用MyApplication来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在OnStartPage之前来申明这些变量:<br />
<br />
<br />
PrivateMyScriptingContextAsScriptingContext<br />
PrivateMyApplicationAsApplication<br />
PrivateMyRequestAsRequest<br />
PrivateMyResponseAsResponse<br />
PrivateMyServerAsServer<br />
PrivateMySessionAsSession<br />
<br />
<br />
<br />
使用ASP的对象<br />
<br />
我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下:<br />
<br />
用ASP中实现:<br />
〈%<br />
MyTempVariable=Request.Form("userName")<br />
Response.Write("youentered"&amp;MyTempVariable&amp;"asyourusername")<br />
%&gt;<br />
<br />
<br />
在VB中实现:<br />
<br />
<br />
MyTempVariable=MyRequest.Form("userName")<br />
MyResponse.Write("youentered"&amp;MyTempVariable&amp;"asyourusername")<br />
<br />
<br />
<br />
通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response.<br />
另一件我们得注意的是,我们得在我们的建立的类中,写上OnEndPage子函数,这个OnStartPage是相反的!OnStartPage是创建对象,OnEndPage是消毁对象.<br />
<br />
<br />
<br />
PublicSubOnEndPage()<br />
SetMyScriptingContext=Nothing<br />
SetMyApplication=Nothing<br />
SetMyRequest=Nothing<br />
SetMyResponse=Nothing<br />
SetMyServer=Nothing<br />
SetMySession=Nothing<br />
EndSub<br />
<br />
<br />
<br />
SayHello方法<br />
<br />
我们来建立一个子函数,用于显示"HolleWorld".这个SayHello方法只是HelloWorld这个类中一个子函数,我们以后会在ASP中用以下的显示这个方法<br />
<br />
<br />
〈%<br />
SetObjReference=Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;<br />
<br />
<br />
<br />
SayHello的程序,很简单的!<br />
<br />
PublicSubSayHello()<br />
MyResponse.Write("HelloWorld")<br />
EndSub<br />
<br />
<br />
<br />
现在一个小型的组件编写完成,剩下的工作就是编译这个组件,在"工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp吧!然后就用在菜单中选择"makeexmaple1.dll",将其编译成DLL文件.一个组件就真正完成了!<br />
<br />
<br />
注意,编译了此组件那么你就得先把你的PWS关掉,然后再编译此组件.否则VB就会告诉你些组件在使用中.<br />
<br />
在ASP中使用我们的自己的组件.<br />
<br />
当你更正了在编译中的错误,成功地编译了example1这个工程,现在你就得拿出你最喜欢的HTML编辑器来写下下面的语句,保存为ASP文件.<br />
<br />
<br />
〈HTML&gt;<br />
〈HEAD&gt;<br />
〈TITLE&gt;Example1〈/TITLE&gt;<br />
〈/HEAD&gt;<br />
<br />
〈BODY&gt;<br />
<br />
〈%<br />
SetObjReference=Server.CreateObject("Example1.HelloWorld")<br />
ObjReference.SayHello<br />
%&gt;<br />
<br />
〈/BODY&gt;<br />
〈/HTML&gt;<br />
<br />
运行后即可看到结果:<br />
<br />
HelloWorld<br />
<br />
注册组件<br />
<br />
如果你想和你的朋友,邻居分享你的组件,那么你就得在你的系统上注册你的组件.我们一般使用Regsvr32.exe来注册组件.注册后你的组件会出现在Win95/Win98的windows/system目录中.下面是一个注册的例子:<br />
<br />
Regsvr32.exeC:/wwwroot/Example1/Example1.dll<br />
<br />
<br />
在你的系统中,VB会自动给你注册,所以你很少用到Regsvr32.exe<br />
<br />
这里只是写了一个非常小的组件,你可以写好自己的更大的组件,而且还可以用VB中的很多控件. <br />
<br />
<br />
附录：建立注册DLL和反注册DLL文件的快捷方式<br />
有的程序员经常要注册或者反注册自己写的dll文件，加一个快捷方式会减少自己的工作量：<br />
<br />
Windows Registry Editor Version 5.00<br />
<br />
<br />
[HKEY_CLASSES_ROOT\dllfile\shell]<br />
<br />
<br />
[HKEY_CLASSES_ROOT\dllfile\shell\register]<br />
<br />
<br />
[HKEY_CLASSES_ROOT\dllfile\shell\register\command]<br />
<br />
@="regsvr32 %1"<br />
<br />
<br />
[HKEY_CLASSES_ROOT\dllfile\shell\Unregister]<br />
<br />
"Command"="regsvr32 %1 /u"<br />
<br />
<br />
[HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]<br />
<br />
@="regsvr32 %1 /u"<br />
<br />
当我们需要注册或者反注册dll时，只要在该dll文件上按下鼠标右键即可！<br />
<br />
<br />
<br />
附录注册和注销dll文件的方法：<br />
一个快速注册 DLL 及 OCX 的方法 <br />
有时候我们在 VB 中要引用某一个 DLL 或 OCX 时，会出现文件未注册的讯息，这时，我们可以使用人工注册的方法，也就是直接在命令列中使用 regsvr32.exe 来做，做法如下： <br />
<br />
文件注册：C:\Windows\System\Regsvr32.exe C:\Windows\System\Test.ocx<br />
取消注册：C:\Windows\System\Regsvr32.exe /u C:\Windows\System\Test.ocx<br />
<br />
这些动作我们也可以直接写到程序中，使用 Shell 来执行，但是我现在要说的，都不是上面提到的方法！<br />
<br />
<br />
<br />
1、在资源管理器中找到 C:\Windows\System\Regsvr32.exe 并【复制】 ( 按鼠标右键选复制 )<br />
2、将目录移到 C:\Windows\SendTo 后，执行【贴上快捷方式】 ( 按鼠标右键选贴上快捷方式 )<br />
3、将快捷方式名称改成【REGISTER】<br />
4、OK<br />
<br />
现在，如果您想替某一个文件做注册动作，例如：C:\Windows\System\Test.ocx，您只要打开资源管理器，找到 C:\Windows\System\Test.ocx，按鼠标右键选【传送到】【REGISTER】即可完成注册动作了！<br />
<br />
注：有一个地方要注意的是，Regsvr32.exe 只能注册 32 位的文件！如果要用它来注册 16 位的文件，会有错误讯息产生。 <br />
<br />
<br />
附录 某些dll文件的功能：<br />
一、轻松修复IE浏览器<br />
<br />
　　很多经常上网的朋友都有过 这样的遭遇：IE不能打开新的窗口，用鼠标点击超链接也没有任何反应。这时重装IE一般能解决问题。其实不必这么麻烦，使用Regsvr32命令就可以轻松搞定。<br />
<br />
　　在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 actxprxy.dll&#8221;命令，点击&#8220;确定&#8221;按钮，这时会弹出一个信息对话框&#8220;DllRegisterServer in actxprxy.dll succeeded&#8221;，点击&#8220;确定&#8221;；然后再在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 shdocvw.dll&#8221;命令，单击&#8220;确定&#8221;即可。重新启动后IE已经被轻松修复了。<br />
<br />
二、解决Windows无法在线升级的问题<br />
<br />
　　Windows的漏洞很多，每隔一段时间就需要使用&#8220;Windows Update&#8221;升级程序进行在线升级，不过&#8220;Windows Update&#8221;经常出现无法使用的情况，这时，我们可以使用Regsvr32来解决这个问题。<br />
<br />
　　在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 wupdinfo.dll&#8221;，点击&#8220;确定&#8221;按钮，这样在系统中就重新注册了&#8220;Windows Update&#8221;组件，重新启动后问题已经解决。<br />
<br />
三、防范网络脚本病毒有新招<br />
<br />
　　网络脚本病毒嵌在网页中，上网时在不知不觉中机器就会感染上这种病毒。笔者认为单纯使用杀毒软件并不能有效地防范这些脚本病毒，必须从病毒传播的机理入手。网络脚本病毒的复制、传播都离不开FSO对象（File System Object，文件系统对象），因此禁用FSO对象就能有效地控制脚本病毒的传播。操作方法很简单：<br />
<br />
　　在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 /u scrrun.dll&#8221;就可以禁用FSO对象；如果需要使用FSO对象，键入&#8220;regsvr32 scrrun.dll&#8221;命令即可。<br />
<br />
四、卸载Win XP自带的&#8220;鸡肋&#8221;功能<br />
<br />
　　Win XP以功能强大而著称，但有些功能却常常令人有&#8220;鸡肋&#8221;之感，比如Win XP自带的ZIP功能和图片预览功能，不仅占用了系统资源，功能也远不如第三方软件强大。其实用Regsvr32命令可以很容易地卸载这些功能。<br />
<br />
　　在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 /u zipfldr.dll&#8221;，单击&#8220;确定&#8221;按钮，弹出卸载成功信息框后就完成了ZIP功能的卸载；要恢复ZIP功能，键入&#8220;regsvr32 zipfldr.dll&#8221;即可。同样，卸载图片预览功能也很简单，在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 /u thumbvw.dll&#8221;即可；如果要恢复该功能，只须键入&#8220;regsvr32 thumbvw.dll&#8221;。<br />
<br />
五、让WMP播放器支持RM格式<br />
<br />
　　很多朋友喜欢用Windows Media Player（以下简称WMP）播放器，但是它不支持RM格式，难道非得安装其它播放软件吗?笔者有办法。<br />
<br />
　　以Win XP为例，首先下载一个RM格式插件，解压缩后得到两个文件夹： Release（用于Windows 9x）和Release Unicode （用于Windows 2000/XP）；将Release Unicode文件夹下的RealMediaSplitter.ax文件拷贝到&#8220;系统盘符\WINDOWS\System32\&#8221;目录下；在&#8220;开始&#8594;运行&#8221;中键入&#8220;regsvr32 RealMediaSplitter.ax&#8221;，点击&#8220;确定&#8221;即可。接着下载解码器，如Real Alternative，安装后就能用WMP播放RM格式的影音文件了。<br />
<br />
附录：注册和反注册dll文件的批处理<br />
<br />
<br />
<br />
dll.bat<br />
------------------------------<br />
@Regsvr32.exe AdminDLL.dll<br />
<br />
<br />
un.bat<br />
-------------------------------------<br />
@Regsvr32.exe /u AdminDLL.dll <br />
<script language="javascript" src="/gg/contentad2.js"></script>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-06-01 12:47 <a href="http://www.blogjava.net/jjshcc/archive/2010/06/01/322436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual Basic高效编程：改进VB/COM+应用程序</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/31/322380.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Mon, 31 May 2010 11:03:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/31/322380.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/322380.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/31/322380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/322380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/322380.html</trackback:ping><description><![CDATA[<div>
<div>译者序</div>
<div>原书序</div>
<div>致谢</div>
<div>第1章 由随意编程转变为遵循软件工程原则</div>
<div>1.1 规则1-1：最大限度地发挥VB编译期类型检查的潜能</div>
<div>1.1.1 在每个模块的顶端使用Option Explicit语句</div>
<div>1.1.2 避免不经意地使用Variant数据类型</div>
<div>1.1.3 在VB IDE中运行时，使用Start With Full Compile命令</div>
<div>1.2 规则1-2：使用Debug.Assert显式声明假设</div>
<div>1.3 规则1-3：编译期条件不同时，考虑使用#If语句</div>
<div>1.4 规则1-4：抛出错误以提示异常</div>
<div>1.5 规则1-5：有效的错误处理：局部捕获，全局处理</div>
<div>1.6 规则1-6：了解类型和类的区别</div>
<div>1.7 规则1-7：采用面向对象的设计方法</div>
<div>1.8 规则1-8：推荐采用用户自定义类型而不是类来定义值类型</div>
<div>1.9 规则1-9：一般任务的自动化</div>
<div><br />
</div>
<div>第2章 设计、构建和使用基于COM的组件</div>
<div>2.1 规则2-1：从接口的角度进行思考</div>
<div>2.2 规则2-2；使用自定义接口</div>
<div>2.3 规则2-3：最好使用IDL独立定义自定义接口</div>
<div>2.4 规则2-4：使用自定义回调避免基于类的事件的局限性</div>
<div>2.5 规则2-5：要谨慎保持兼容性</div>
<div>2.5.1 脚本客户端程序</div>
<div>2.5.2 已编译的客户端程序</div>
<div>2.5.3 版本兼容的接口</div>
<div>2.6 规则2-6：选用正确的COM激活技术</div>
<div>2.6.1 COM激活</div>
<div>2.6.2 New操作符</div>
<div>2.6.3 CreateObject</div>
<div>2.6.4 GetObject</div>
<div>2.6.5 GetObjectContext.CreateInstance和Server.CreateObject</div>
<div>2.6.6 性能考虑</div>
<div>2.7 规则2-7：慎重使用Class_Terminate</div>
<div>2.8 规则2-8：根据会话而不是实体来建模</div>
<div>2.9 规则2-9：除了简单的小规模应用系统，避免使用ActiveX可执行程序</div>
<div><br />
</div>
<div>第3章 MTS、COM+和VB-中间层</div>
<div>3.1 规则3-1：理解MTS和COM+应用程序设计</div>
<div>3.2 规则3-2：不要在MTS或COM+中使用单例</div>
<div>3.3 规则3-3：了解New、CreateObject及GetObjectContext.CreateInstance的适用场合</div>
<div>3.3.1 MTS和Windows NT4</div>
<div>3.3.2 COM+和Windows 2000</div>
<div>3.3.3 使用New遇到的更多问题</div>
<div>3.4 规则3-4：理解使用SetComplete的真实目的</div>
<div>3.5 规则3-5：对事务自动中止方式的思考</div>
<div>3.6 规则3-6：不要重新设计DBMS</div>
<div>3.7 规则3-7：不必配置所有组件</div>
<div>3.8 规则3-8：避免将以后会后悔的东西编译进DLL</div>
<div>3.9 规则3-9：将代码从MTS向COM+移植的实践技巧</div>
<div>3.9.1 在COM+中不再需要调用GetObjectContext.CreateInstance</div>
<div>3.9.2 将Me作为参数传递时，不再需要调用SafeRef</div>
<div>3.9.3 当事务中的次要对象返回错误时要小心；可能会获得形如"Method～of Object Failed～"的错误信息，而不是所指定的在错误传播之前返回的丰富错误信息</div>
<div>3.9.4 使用ObjectConstruct字符串</div>
<div>3.9.5 在COM+应用程序中进行进程内调用时执行声明性安全校验</div>
<div>3.9.6 在COM+中刷新组件命令不再是必需的</div>
<div>3.9.7 在安装Windows 2000以前版本的计算机上，COM+导出的客户安装程序需要Microsoft Installer(MSI)</div>
<div>3.10 规则3-10：编写运行于MTS和COM+中的代码的实践技巧</div>
<div>3.10.1 创建对象时坚持使用GetObjectContext.CreateInstance</div>
<div>3.10.2 使用可编程控制的安全措施对访问权限进行校验，而不要依赖于声明性安全措施</div>
<div>3.10.3 事务性方法调用失败时，在次要对象中最好使用DisableCommit而不是SetAbort</div>
<div>3.10.4 不要无意中将DLL安装到用户计算机上</div>
<div>3.10.5 坚持使用ObjectContext接口</div>
<div>3.10.6 分发对象引用时继续使用SafeRef</div>
<div><br />
</div>
<div>第4章 Web和VB</div>
<div>4.1 规则4-1：理解IIS体系结构</div>
<div>4.1.1 IIS的内部结构</div>
<div>4.1.2 提高服务器的可扩缩性</div>
<div>4.2 规则4-2：管理应用程序状态以达到最高效率</div>
<div>4.2.1 使用BAS模块数据</div>
<div>4.2.2 使用SPM</div>
<div>4.2.3 使用ASP Application对象</div>
<div>4.2.4 权衡各种方案的利弊</div>
<div>4.3 规则4-3：管理会话状态以达到最大可扩缩性</div>
<div>4.3.1 将会话限制在单机上</div>
<div>4.3.2 在客户机上存储会话信息</div>
<div>4.3.3 使用cookie</div>
<div>4.3.4 QueryString变量</div>
<div>4.3.5 隐藏的表单域</div>
<div>4.3.6 在数据库中存储状态信息</div>
<div>4.4 规则4-4：理解DCOM和HTTP的区别</div>
<div>4.4.1 使用RPC和DCOM进行通信</div>
<div>4.4.2 使用HTTP通信</div>
<div>4.4.3 在分布式应用程序中不使用ASP</div>
<div>4.4.4 使用HTTP的不利方面</div>
<div>4.5 规则4-5：为脚本环境（如ASP）编写COM组件</div>
<div>4.5.1 创建默认接口</div>
<div>4.5.2 向可编写脚本的对象传递参数</div>
<div>4.5.3 关于自定义接口</div>
<div>4.5.4 解决方案</div>
<div>4.6 规则4-6：理解COM对象与ASP之间如何交互</div>
<div>4.6.1 ASP内置对象</div>
<div>4.6.2 VB COM对象和STA</div>
<div>4.6.3 充分利用STA线程模型</div>
<div>4.6.4 在VB中如何访问ASP内置对象</div>
<div>4.6.5 直接访问ASP内置对象的好处</div>
<div>4.6.6 使用ASP内置对象的弊端</div>
<div>4.7 规则4-7：使用XML代替专有数据传输格式</div>
<div>4.8 规则4-8：慎重考虑表示和业务逻辑的关系</div>
<div>4.8.1 使用MTS组件</div>
<div>4.8.2 使用WebClasses</div>
<div>4.9 规则4-9：从数据到表示的XSLT实现</div>
<div>4.9.1 XSLT的概念</div>
<div>4.9.2 XSLT方法的好处</div>
<div>4.9.3 使用过程方法转换数据集</div>
<div>4.9.4 利用XSLT的方法转换数据集</div>
<div>4.9.5 XSLT的缺点</div>
<div><br />
</div>
<div>第5章 VB高效数据访问</div>
<div>5.1 规则5-1：高效访问的基础：往返开销、SQL语句和数据提供者</div>
<div>5.1.1 使往返开销最少</div>
<div>5.1.2 确定发送SQL查询的最好方法</div>
<div>5.1.3 选择合适的提供者</div>
<div>5.2 规则5-2：不要过分封装数据访问</div>
<div>5.2.1 纯粹的面向对象技术</div>
<div>5.2.2 追求纯粹OOD效果的不足之处</div>
<div>5.2.3 解决办法：使用存储过程</div>
<div>5.2.4 如果需要多个数据库服务器该如何处理</div>
<div>5.3 规则5-3：切莫将数据库连接当代数据成员</div>
<div>5.4 规则5-4：死锁是常见的-防错性程序开发</div>
<div>5.4.1 锁定</div>
<div>5.4.2 串行化事务和锁管理器</div>
<div>5.4.3 死锁</div>
<div>5.4.4 在应用程序设计中尽量减小死锁的几率</div>
<div>5.4.5 将事务运行时间降到最短</div>
<div>5.4.6 将锁定时间降至最短&nbsp;</div>
<div>5.5 规则5-5：尽可能使用firehose游标</div>
<div>5.6 规则5-6:作出正确的数据搜索决策（避免滥用SelectSingleNode）</div>
<div>5.6.1 Seek-and-Find组件</div>
<div>5.6.2 了解解决具体问题需选用哪一种方法</div>
</div>
<img src ="http://www.blogjava.net/jjshcc/aggbug/322380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-31 19:03 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/31/322380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用application提高ASP数据显示效率</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/27/321999.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 27 May 2010 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/27/321999.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321999.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/27/321999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321999.html</trackback:ping><description><![CDATA[当数据上到好几万多条时,要调用几条数据在页面显现,ASP就会慢如蜗牛.最糟糕的是,当n多用户打开页面拜访的时分,每个用户每次都要读取数据库一次,
这无疑降低了效率,很明显, 假如能把数据能保具有内存上,然后读取,无疑放慢了速度. <br />
所谓缓存其实就是在内存中开辟一个用来保存数据的空间. <br />
使用缓存你就不必屡次的拜访你保具有硬盘上的数据了，由于这些数据我们希望每个用户都能看到成效一样,考虑使用的是application对象,由于它是
一切拜访者的共用的对象,存储的消息和定义的事情能够为一切者拜访者使用,这里要使用asp内置对象application了. <br />
关于application: <br />
2个办法[lock 和 unlock], <br />
2个集合[content 和 staticobjects], <br />
2个事情[开端的application_onstart 和 application_end] <br />
application变量不会由于用户的分开而消失,一旦建立,不断等到网站关闭和程序卸载为止,正由于如此,使用的时分要特别当心!,否则会占用内存
(虚拟主机提供商很不高兴了). <br />
我们是把数据写入一个自定义的application里面,在制定的工夫读取刷新的,大致思绪就是这样. <br />
<br />
实例演示.先建立一个简单的数据库,写个function读取一下,写入一个dim变量temp中: <br />
<br />
程序代码 <br />
&lt;%　　Function DisplayRecords() <br />
'这个函数本来给一个变量temp付上记载的值 <br />
Dim sql, conn, rs <br />
'符合条件的sql语句 <br />
sql = "Select id, [szd_f], [szd_t] FROM admin" <br />
'打开数据库连接 <br />
Set conn = Server.CreateObject("ADODB.Connection") <br />
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ="&amp;Server.MapPath("db.mdb") <br />
Set rs = Server.CreateObject("ADODB.Recordset") <br />
rs.Open sql, conn, 1, 3 <br />
'当符合sq语句l的数据没有显现完毕时 <br />
If Not rs.EOF Then <br />
'给temp变量赋值 <br />
Dim temp <br />
temp = "&lt;table width=""90%"" align=""center""" <br />
temp = temp &amp; " border=""1"" bordercolor=""silver""" <br />
temp = temp &amp; " cellspacing=""2"" cellpadding=""0""&gt;" <br />
temp = temp &amp; "&lt;tr bgcolor=""#CCDDEE""&gt;&lt;td width=""5%""" <br />
temp = temp &amp; "&gt;ID&lt;/td&gt;&lt;td&gt;操作&lt;/td&gt;" <br />
temp = temp &amp; "&lt;td&gt;数值&lt;/td&gt;&lt;/tr&gt;" <br />
While Not rs.EOF <br />
temp = temp &amp; "&lt;tr&gt;&lt;td bgcolor=""#CCDDEE""&gt;" <br />
temp = temp &amp; rs("ID") &amp; "&lt;/td&gt;&lt;td&gt;" &amp;
rs("szd_f") <br />
temp = temp &amp; "&lt;/td&gt;&lt;td&gt;" &amp; rs("szd_t") <br />
temp = temp &amp; "&lt;/td&gt;&lt;/tr&gt;" <br />
rs.MoveNext <br />
Wend <br />
temp = temp &amp; "&lt;/table&gt;" <br />
'temp赋值完毕,把它再前往给函数 <br />
DisplayRecords = temp <br />
Else <br />
DisplayRecords = "Data Not Available." <br />
End If <br />
'开释内存 <br />
rs.Close <br />
conn.Close <br />
Set rs = Nothing <br />
Set conn = Nothing <br />
End Function %&gt; <br />
<br />
ok,上面的函数改造完毕,调用的时分就是DisplayRecords. <br />
上面是application大显本领了: <br />
<br />
程序代码 <br />
&lt;%'该函数是写入缓存 <br />
Function DisplayCachedRecords(Secs) <br />
Dim retVal, datVal, temp1 <br />
'Secs是每次要刷新数据的工夫, retVal是数据,datVal是剩余工夫 <br />
retVal = Application("cache_demo") '获得appliction的值 <br />
datVal = Application("cache_demo_date") '获得appliction的值 <br />
'判别datVal 的值,也就是要计算工夫过来了没 <br />
If datVal = "" Then <br />
'假如是空,datVal值为当前工夫按秒加上secs定义的工夫 <br />
datVal = DateAdd("s",Secs,Now) <br />
End If <br />
'temp1是判别当前工夫和datVal的秒差 <br />
temp1 = DateDiff("s", Now, datVal) <br />
'假如retVal已经是上面函数的前往值且工夫大于0 <br />
If temp1 &gt; 0 And retVal &lt;&gt; "" Then <br />
'本函数前往记载数 <br />
DisplayCachedRecords = retVal <br />
Response.Write "&lt;b&gt;&lt;font color=""green""&gt;利用缓存读取数据" <br />
Response.Write " ... (" &amp; temp1 &amp; "
秒剩余)&lt;/font&gt;&lt;/b&gt;" <br />
Response.Write "&lt;br&gt;&lt;br&gt;" <br />
Else <br />
'retVal 是空的话,就赋予DisplayRecords的值给变量temp2 <br />
Dim temp2 <br />
temp2 = DisplayRecords() <br />
'保存到Application.------------------&gt;重点 <br />
Application.Lock <br />
Application("cache_demo") = temp2 <br />
Application("cache_demo_date") = DateAdd("s",Secs,Now) <br />
Application.UnLock <br />
DisplayCachedRecords = temp2 <br />
' 这里随便写上了记载的缓存的过来工夫,绝对总秒数倒差 : <br />
Response.Write "&lt;b&gt;&lt;font color=""red""&gt;刷新缓存显现 ..." <br />
Response.Write "&lt;/font&gt;&lt;/b&gt;&lt;br&gt;&lt;br&gt;" <br />
End If <br />
End Function <br />
%&gt; <br />
<br />
<br />
说明完毕. <br />
<br />
调用办法:&lt;%=DisplayCachedRecords(20)%&gt;
<img src ="http://www.blogjava.net/jjshcc/aggbug/321999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-27 11:44 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/27/321999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft.XMLHttp组件的属性方法</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/26/321934.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Wed, 26 May 2010 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/26/321934.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/321934.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/26/321934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/321934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/321934.html</trackback:ping><description><![CDATA[<p>一、使用步骤：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、创建XMLHTTP对象 //需MSXML4.0支持<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、打开与服务端的连接，同时定义指令发送方式，服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通HTTP指令传送一样，可以用"GET"方法或"POST"方法指向服务端的服务网页。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、发送指令。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、等待并接收服务端返回的处理结果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、释放XMLHTTP对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、XMLHTTP方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Open（ bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrMethod：&nbsp;&nbsp; 数据传送方式，即GET或POST。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrUrl：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务网页的URL。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varAsync：&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否同步执行。缺省为True，即同步执行，但只能在DOM中实施同步执行。用中一般将其置为False，即异步执行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrUser：&nbsp;&nbsp;&nbsp;&nbsp; 用户名，可省略。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrPassword：用户口令，可省略。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send（ varBody ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varBody：指令集。可以是XML格式数据，也可以是字符串，流，或者一个无符号整数数组。也可以省略，让指令通过Open方法的URL参数代入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRequestHeader（ bstrHeader, bstrvalue ）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrHeader：HTTP 头(header)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bstrvalue： HTTP 头(header)的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果Open方法定义为POST，可以定义表单方式上传：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlhttp.setRequestHeader（ "Content-Type", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "application/x-www-form-urlencoded"）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三、XMLHTTP属性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onreadystatechange：在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseBody：&nbsp;&nbsp;&nbsp;&nbsp; 结果返回为无符号整数数组。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseStream：&nbsp;&nbsp;&nbsp; 结果返回为IStream流。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseText ：&nbsp;&nbsp;&nbsp;&nbsp; 结果返回为字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseXML：&nbsp;&nbsp;&nbsp;&nbsp; 结果返回为XML格式数据。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体的使用方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建XMLHTTP对象的语句如下：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set objXML = CreateObject("Msxml2.XMLHTTP") 或<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set objXML = CreateObject("Microsoft.XMLHTTP")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Or for version 3.0 of XMLHTTP, use:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象创建后调用Open方法对Request对象进行初始化，语法格式为：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objXML.open http-method,url,async,userID,password</p>
<p>&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Open方法中包含了5个参数，前三个是必要的，后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http-method：HTTP的通信方式，比如GET或是POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url：接收XML数据的服务器的URL地址。通常在URL中要指明ASP或CGI程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; async：一个布尔标识，说明请求是否为异步的。如果是异步通信方式(true)，客户机就不等待服务器的响应；如果是同步方式(false)，客户机就要等到服务器返回消息后才去执行其他操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userID：用户ID，用于服务器身份验证<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password：用户密码，用于服务器身份验证</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLHTTP对象的Send方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用Open方法对Request对象进行初始化后，调用Send方法发送XML数据：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objXML.send()</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send方法的参数类型是Variant，可以是字符串、DOM树或任意数据流。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发送数据的方式分为同步和异步两种。在异步方式下，数据包一旦发送完毕，就结束Send进程，客户机执行其他的操作；而在同步方式下，客户机要等到服务器返回确认消息后才结束Send进程。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLHTTP对象中的readyState属性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值　　说明<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 　　Response对象已经创建，但XML文档上载过程尚未结束<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 　　XML文档已经装载完毕<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 　　XML文档已经装载完毕，正在处理中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 　　部分XML文档已经解析<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 　　文档已经解析完毕，客户端可以接受返回消息</p>
<p>&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户机处理响应信息，客户机接收到返回消息后，进行简单的处理，基本上就完成了C/S之间的一个交互周期。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户机接收响应是通过XMLHTTP对象的属性实现的：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseText：将返回消息作为文本字符串；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseBody：将返回消息作为HTML文档内容；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseXML：将返回消息视为XML文档，在服务器响应消息中含有XML数据时使用；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseStream：将返回消息视为Stream对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下是一个简单的例子：类似新闻小偷</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objXML.open "GET","http://www.alexa.com",false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objXML.send()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.write(objXML.responseText)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整个步骤很明显：建立、打开、发送和接受。<br />
</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/321934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-26 17:18 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/26/321934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP开发中的(VBScript)类基础学习</title><link>http://www.blogjava.net/jjshcc/archive/2010/05/13/320777.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 13 May 2010 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/05/13/320777.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/320777.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/05/13/320777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/320777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/320777.html</trackback:ping><description><![CDATA[ASP中的<strong>Session</strong>本身是可以储存对象的，它可以保存基本变量，数组，自动化对象(Automation
Object)等，但在储存自定义类的对象时会碰到问题。
<p>如下面的代码：</p>
<p>
</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word;" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000;">以下是引用片段：<br />
            &lt;%<br />
            If
            isempty(Session("node")) Then Set Session("node")=New ListNode<br />
            Set
            n=Session("node")<br />
            Response.Write n.Content<br />
            %&gt;</font></td>
        </tr>
    </tbody>
</table>
&lt;%
<p>If isempty(Session("node")) Then Set Session("node")=New ListNode</p>
<p>Set n=Session("node")</p>
<p>Response.Write n.Content</p>
<p>%&gt;</p>
<p>还是上面的ListNode这个类，这段代码意图在一个用户会话中只保留一个ListNode的对
象。所以在用户第一次访问该网页时，会生成ListNode的一个对象，并保存在Session("node")中;后面访问该网页时，因为
Session("node")不为空了，所以不会生成一个新的对象，而是到 Session("node")中取出保存的对象。</p>
<p>理论上应该也会输出100，但是问题来了，ASP一直会报错：</p>
<p>Microsoft VBScript runtime error '800a01b6'</p>
<p>Object doesn't support this property or method: 'n.Content'</p>
<p>用n.Type也会出错。同样的代码翻译成PHP，运行却是可以通过的。为什么?</p>
<p>个人分析下来，认为Session可以保存对象是没错，只是VBScript中类型转换的机制太
弱，而且没有显式的强制类型转换供用户使用，无法将
Session("node")正确转换为ListNode类型。因为是自定义的类，我们只能在每个页面中都出现类的定义语句，这样在ASP看来，每次读
取这个页面时，ListNode类都是一个新类，所以就不认得Session中的这个类的对象了。</p>
<p><strong>结论：</strong>尽量不要想到用Session或Application来存储ASP中自定义类的对象。如果
确实需要，可以考虑用COM来编写类，然后在VBScript中用：Set Session("obj") =
Server.CreateObject("YourApp.YourClass")来创建一个对象，然后即可实现上面预想的功能了。</p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/320777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-05-13 10:07 <a href="http://www.blogjava.net/jjshcc/archive/2010/05/13/320777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>