我太懒了 的个人资料我太懒了,比猪还...照片日志列表 工具 帮助

日志


5月26日

使用模板实现ASP代码与页面分离

  每个进行过较大型的ASP-Web应用程序设计的开发人员大概都有如下的经历:ASP代码与页面HTML混淆难分,业务逻辑与显示方式绞合,使得代码难以理解、难以修改;程序编写必须在美工之后,成为项目瓶颈;整合的程序代码和HTML静态页面时,花费大量的时间才能得到理想的效果,兼作了美工。的确,用脚本语言开发Web应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥。
  其它的脚本语言,如JSP、PHP都有自己的解决方案,ASP的后一代产品ASP.NET也实现了代码与页面,似乎直接过渡到ASP是不错的选择。但是总有这样或那样的原因让我们不能或暂时不能放弃ASP直奔.NET大营。从公司角度来看,转换语言是一笔不少的投资,包括雇佣熟手.NET程序员、培训原有程序员、开发工具的转型、开发风格的转型、界面风格转变、接口风格、软件架构、文档、开发流程等等;这还意味着原有的代码必须在新语言环境里重写以实现最佳的效果和稳定性;同时将直接影响这段时间内项目的进度,更有可能导致个别程序员出走。由此看来在您决定转换语言之前,在原基础上寻求一种解决方案,才是最好的选择。
  PHP通过模板实现代码与页面,可供选择的有FastTemplate、PHPLIB、Smarty等多种,其中PHPLIB的影响最大、使用最多。既然如此,我们直接把它搬到ASP来,对于同时使用PHP和ASP的公司还有很有好处:一、美工处理页面时,不管将要套用PHP还是ASP,处理方式是一样,无须经过培训;二、程序员编写代码时,两种语言间的思路接近或一致,相同功能在两种语言实现时,只需拷贝过来略作修改即可,保证了工作效率和项目进度。

1、模板类的设计
  实现代码封装成为模板类,即是为了与PHPLIB兼容,也使得代码方便管理与扩展。
  模板类要实现的目标为:从模板文件中读入显示的HTML代码,将这些显示代码中需要动态数据的地方替换为ASP程序运算所得出的数据,然后按照一定的顺序输出。其中,替换的部分可以自由的设定。因此它必须完成如下任务:
    ·从模板文件中读取显示用的HTML代码。
    ·将模板文件和实际生成的数据结合,生成输出的结果。
    ·允许同时处理多个模板。
    ·允许模板的嵌套。
    ·允许对模板中的某个单独的部分进行处理。

实现方法:
    采用FSO读取模板文件
    采用正则替换实现模板文件和数据的结合
    处理多个模板用数组存储来实现。
    模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁,都可拿来做替换,即可实现。
    单独部分的处理的通过在模板文件中设定标注,然后在正则替换中结合标注来控制,实现部分替换。

2、模板类的实现
  给出具体代码之前,先把主要函数列出,用过PHPLIB的朋友应该对此很熟悉了:
  1)Public Sub set_root(ByVal Value) 设定模板默认目录
  2)Public Sub set_file(ByVal handle,ByVal  filename) 读取文件
  3)Public Sub set_var(ByVal Name, ByVal Value, ByVal Append) 设置映射数据-替换变量
  4)Public Sub unset_var(ByVal Name) 取消数据映射
  5)Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) 设置数据块
  6)Public Sub set_unknowns(ByVal unknowns) 设定未指定映射的标记处理方式
  7)Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append) 执行模板文件与数据的结合
  8)Public Sub p(ByVal Name) 输出处理结果

实现代码:
<%
'=======================================================================
' 本对象中使用了set_var、set_block等命名方法是为了兼容phplib
'=======================================================================
'www.knowsky.com

Class kktTemplate
   
    Private m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
    Private m_ValueList, m_BlockList
    Private m_RegExp   
    ' 构造函数
    Private Sub Class_Initialize
        Set m_ValueList     = CreateObject("Scripting.Dictionary")
        Set m_BlockList     = CreateObject("Scripting.Dictionary")
        set m_RegExp        = New RegExp
        m_RegExp.IgnoreCase = True
        m_RegExp.Global     = True
        m_FileName          = ""
        m_Root              = ""
        m_Unknowns          = "remove"
        m_LastError         = ""
        m_HaltOnErr         = true
    End Sub
   
    ' 析构函数
    Private Sub Class_Terminate
        Set m_RegExp       = Nothing
        Set m_BlockMatches = Nothing
        Set m_ValueMatches = nothing
    End Sub
   
    Public Property Get ClassName()
        ClassName = "kktTemplate"
    End Property
   
    Public Property Get Version()
        Version = "1.0"
    End Property
   
    Public Sub About()
        Response.Write("kktTemplate ASP页面模板类<br>" & vbCrLf &_
                       "程序设计:彭国辉 2004-07-05<br>" & vbCrLf &_
                       "个人网站:<a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
                       "电子邮件:<a href='mailto:kacarton@sohu.com'>kacarton@sohu.com</a><br>")
    End Sub
   
    '检查目录是否存在
    Public Function FolderExist(ByVal path)
        Dim fso
        Set fso = CreateObject("Scripting.FileSystemObject")
        FolderExist = fso.FolderExists(Server.MapPath(path))
        Set fso = Nothing
    End Function
    '读取文件内容
    Private Function LoadFile()
        Dim Filename, fso, hndFile
        Filename = m_Root
        If Right(Filename, 1)<>"/" And Right(Filename, 1)<>"\" Then Filename = Filename & "/"
        Filename = Server.MapPath(Filename & m_FileName)
        Set fso = CreateObject("Scripting.FileSystemObject")
        If Not fso.FileExists(Filename) Then ShowError("模板文件" & m_FileName & "不存在!")
        set hndFile = fso.OpenTextFile(Filename)
        LoadFile = hndFile.ReadAll
        Set hndFile = Nothing
        Set fso = Nothing
        If LoadFile = "" Then ShowError("不能读取模板文件" & m_FileName & "或文件为空!")
    End Function
   
    '处理错误信息
    Private Sub ShowError(ByVal msg)
        m_LastError = msg
        Response.Write "<font color=red style='font-size;14px'><b>模板错误:" & msg & "</b></font><br>"
        If m_HaltOnErr Then Response.End
    End Sub
   
    '设置模板文件默认目录
    'Ex: kktTemplate.set_root("/tmplate")
    '    kktTemplate.Root = "/tmplate"
    '    root = kktTemplate.get_root()
    '    root = kktTemplate.Root
    '使用类似set_root这样的命名方法是为了兼容phplib,以下将不再重复说明
    Public Sub set_root(ByVal Value)
        If Not FolderExist(Value) Then ShowError(Value & "不是有效目录或目录不存在!")
        m_Root = Value
    End Sub
    Public Function get_root()
        get_root = m_Root
    End Function
    Public Property Let Root(ByVal Value)
        set_root(Value)
    End Property
    Public Property Get Root()
        Root = m_Root
    End Property
   
    '设置模板文件
    'Ex: kktTemplate.set_file("hndTpl", "index.htm")
    '本类不支持多模板文件,handle为兼容phplib而保留
    Public Sub set_file(ByVal handle,ByVal  filename)
        m_FileName = filename
        m_BlockList.Add Handle, LoadFile()
    End Sub
    Public Function get_file()
        get_file = m_FileName
    End Function
'     Public Property Let File(handle, filename)
'         set_file handle, filename
'     End Property
'     Public Property Get File()
'         File = m_FileName
'     End Property
   
    '设置对未指定的标记的处理方式,有keep、remove、comment三种
    Public Sub set_unknowns(ByVal unknowns)
        m_Unknowns = unknowns
    End Sub
    Public Function get_unknowns()
        get_unknowns = m_Unknowns
    End Function
    Public Property Let Unknowns(ByVal unknown)
        m_Unknowns = unknown
    End Property
    Public Property Get Unknowns()
        Unknowns = m_Unknowns
    End Property
   
    Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name)
        Dim Matches
        m_RegExp.Pattern = "<!--\s+BEGIN " & BlockTag & "\s+-->([\s\S.]*)<!--\s+END " & BlockTag & "\s+-->"
        If Not m_BlockList.Exists(Parent) Then ShowError("未指定的块标记" & Parent)
        set Matches = m_RegExp.Execute(m_BlockList.Item(Parent))
        For Each Match In Matches
            m_BlockList.Add BlockTag, Match.SubMatches(0)
            m_BlockList.Item(Parent) = Replace(m_BlockList.Item(Parent), Match.Value, "{" & Name & "}")
        Next
        set Matches = nothing
    End Sub
   
    Public Sub set_var(ByVal Name, ByVal Value, ByVal Append)
        Dim Val
        If IsNull(Value) Then Val = "" Else Val = Value
        If m_ValueList.Exists(Name) Then
            If Append Then m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
            Else m_ValueList.Item(Name) = Val
        Else
            m_ValueList.Add Name, Value
        End If
    End Sub
   
    Public Sub unset_var(ByVal Name)
        If m_ValueList.Exists(Name) Then m_ValueList.Remove(Name)
    End Sub
   
    Private Function InstanceValue(ByVal BlockTag)
        Dim keys, i
        InstanceValue = m_BlockList.Item(BlockTag)
        keys = m_ValueList.Keys
        For i=0 To m_ValueList.Count-1
            InstanceValue = Replace(InstanceValue, "{" & keys(i) & "}", m_ValueList.Item(keys(i)))
        Next
    End Function
   
    Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append)
        If Not m_BlockList.Exists(BlockTag) Then ShowError("未指定的 块标记" & Parent)
        If m_ValueList.Exists(Name) Then
            If Append Then m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
            Else m_ValueList.Item(Name) = InstanceValue(BlockTag)
        Else
            m_ValueList.Add Name, InstanceValue(BlockTag)
        End If
    End Sub
   
    Private Function finish(ByVal content)
        Select Case m_Unknowns
            Case "keep" finish = content
            Case "remove"
                m_RegExp.Pattern = "\{[^ \t\r\n}]+\}"
                finish = m_RegExp.Replace(content, "")
            Case "comment"
                m_RegExp.Pattern = "\{([^ \t\r\n}]+)\}"
                finish = m_RegExp.Replace(content, "<!-- Template Variable $1 undefined -->")
            Case Else finish = content
        End Select
    End Function
   
    Public Sub p(ByVal Name)
        If Not m_ValueList.Exists(Name) Then ShowError("不存在的标记" & Name)
        Response.Write(finish(m_ValueList.Item(Name)))
    End Sub
End Class
%>

3、使用例子
  下面举三个例子进行说明。
1)简单的值替换
模板文件为myTemple.tpl,内容:
<html><title>ASP模板简单替换</title><body>
祝贺!你赢了一辆{some_color}法拉利!
</body>

下面是ASP代码(kktTemplate.inc.asp就是上面给出的模板类):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt
my_color = "红色的"
set kkt = new kktTemplate                 '创建模板对象
kkt.set_file "hndKktTemp", "myTemple.tpl" '设置并读取模板文件myTemple.tpl
kkt.set_var "some_color", my_color, false '设置模板变量 some_color = my_color的值
kkt.parse "out", "hndKktTemp", false      '模板变量 out = 处理后的文件
kkt.p "out"                               '输出out的内容
set kkt = nothing                         '销毁模板对象
%>

执行后输出为:
<html><title>ASP模板简单替换</title><body>
祝贺!你赢了一辆红色的法拉利!
</body>


2)循环块演示例子
模板文件myTemple2.tpl:
<html><title>ASP模板-块的演示</title><body>
<table cellspacing="2" border="1"><tr><td>下面的动物您喜欢哪一种</td></tr>
<!-- BEGIN AnimalList -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- END AnimalList -->
</table>
</body>

ASP代码:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim animal, kkt, i
animal = Array("小猪","小狗","小强")
set kkt = new kktTemplate
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "list"
for i=0 to UBound(animal)
    kkt.set_var "animal", animal(i), false
    kkt.parse "list", "AnimalList", true
next
kkt.parse "out", "hndKktTemp", false
kkt.p "out"
set kkt = nothing
%>
 
执行结果:
<html><title>ASP模板-块的演示</title><body>
<table cellspacing="2" border="1"><tr><td>下面的动物您喜欢哪一种</td></tr>
<tr><td><input type="radio" name="chk">小猪</td></tr>
<tr><td><input type="radio" name="chk">小狗</td></tr>
<tr><td><input type="radio" name="chk">小强</td></tr>
</table>
</body>
                                       

3)嵌套块演示
模板文件myTemple3.tpl:
<html><title>ASP模板-嵌套块演示</title>
<body><table width="400" border="1" bordercolor="#000000">
  <tr><td><div align="center">{myname}测试</div></td></tr>
  <tr><td>我的动植物园:</td> </tr>
<!-- BEGIN animalList -->
  <tr><td>{animal}</td></tr>
  <!-- BEGIN plantList -->
    <tr><td>&nbsp;&nbsp;{plant}</td></tr>
  <!-- END plantList -->
<!-- END animalList -->
</table>
</body>
</html>

ASP代码:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt, myname, animal, plant
set kkt = new kktTemplate
myname = "kktTemplate block test..."
animal = array("动物", "植物")
plant  = array(array("小猪","小白","小强"), array("玫瑰","向日葵"))

kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "myname", myname, false
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"

for i=0 to UBound(animal)
   kkt.set_var "animal", animal(i), False
   kkt.unset_var "p" 
   'kkt.set_var "p", "", false
   for j=0 to UBound(plant(i))
        kkt.set_var "plant", plant(i)(j), false
        kkt.parse "p", "plantList", true
   next
   kkt.parse "a", "animalList", true
next
kkt.parse "out", "hndKktTemp", false
kkt.p "out"
%>

执行结果:
<html><title>ASP模板-嵌套块演示</title>
<body><table width="400" border="1" bordercolor="#000000">
  <tr><td><div align="center">kktTemplate block test...测试</div></td></tr>
  <tr><td>我的动植物园:</td> </tr>
  <tr><td>动物</td></tr>
    <tr><td>&nbsp;&nbsp;小猪</td></tr>
    <tr><td>&nbsp;&nbsp;小白</td></tr>
    <tr><td>&nbsp;&nbsp;小强</td></tr>
  <tr><td>植物</td></tr>
    <tr><td>&nbsp;&nbsp;玫瑰</td></tr>
    <tr><td>&nbsp;&nbsp;向日葵</td></tr>
</table>
</body>
</html>


本文提及的所有代码可从此处下载:http://www.freewebs.com/kacarton/web/kktTemplate.rar


4、小结
  本文主要介绍了基于ASP利用模板类实现代码与页面分离的方法,当然还有其它更好的解决方案。本文旨在抛砖引玉各位读者、WEB开发参与进来,多提宝贵意见,多作交流,共同进步!

漂浮flash代码

<DIV id=img style="POSITION: absolute">
<OBJECT
codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0
height=108 width=150 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><PARAM NAME="movie" VALUE="chun66/flash/piaofu.swf"><PARAM NAME="quality" VALUE="high">
            <embed src="chun66/flash/piaofu.swf" quality=high
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"
type="application/x-shockwave-flash" width="150" height="108">    </embed>  
</OBJECT></DIV>


<SCRIPT language=JavaScript>
<!-- Begin
var step = 1;
var delay = 30;
var height = 0;
var Hoffset = 0;
var Woffset = 0;
var yon = 0;
var xon = 0;
var pause =false;
var interval;
var name = navigator.appName;
if(name == "Microsoft Internet Explorer") name = true;
else name = false;
var xPos = 20;
if(name) var yPos = document.body.clientHeight;
else var yPos = window.innerHeight;
function changePos() {
if(name) {
width = document.body.clientWidth;
height = document.body.clientHeight;
Hoffset = img.offsetHeight;
Woffset = img.offsetWidth;
img.style.left = xPos + document.body.scrollLeft;
img.style.top = yPos + document.body.scrollTop;
}
else {
height = window.innerHeight;
width = window.innerWidth;
Hoffset = document.img.clip.height;
Woffset = document.img.clip.width;
document.img.pageY = yPos + window.pageYOffset;
document.img.pageX = xPos + window.pageXOffset;
}
if (yon) {
yPos = yPos + step;
}
else {
yPos = yPos - step;
}
if (yPos < 0) {
yon = 1;
yPos = 0;
}
if (yPos >= (height - Hoffset)) {
yon = 0;
yPos = (height - Hoffset);
}
if (xon) {
xPos = xPos + step;
}
else {
xPos = xPos - step;
}
if (xPos < 0) {
xon = 1;
xPos = 0;
}
if (xPos >= (width - Woffset)) {
xon = 0;
xPos = (width - Woffset);
   }
}
function start() {
if(name) img.visibility = "visible";
else document.img.visibility = "visible";
interval = setInterval('changePos()',delay);
}
function pauseResume() {
if(pause) {
clearInterval(interval);
pause = false;
}
else {
interval = setInterval('changePos()',delay);
pause = true;
   }
}
start();
//  End -->
</SCRIPT>

链接下滑线为点划线css样式表

<STYLE type="text/css">
a:link {color: #666666;
 font-family: "variable";
text-decoration: none
}
a:visited {color: #666666;
 font-family: "variable";
 text-decoration: none
}


a:active {color: #000099;
 font-family: variable;
 text-decoration: none
}


a:hover {
color: #CC0000; TEXT-DECORATION:none; border-left-width:1; border-right-width:1; border-top-width:1; border-bottom-style:dotted; border-bottom-width:1
}

a:visited:hover {
text-decoration: none;
 color: #00000
}


</style>

不间断滚动字幕代码

<HTML>
<HEAD>
<TITLE>无标题文档</TITLE>
</HEAD>

<BODY>

 

 

 


<div style="width:200px;height:150px;overflow:hidden">
<table cellspacing=0 cellpadding=5 bgcolor=#F8F8F8 style="position:relative;top:0px;width:200px;table-layout:fixed" id=news>
<tbody> <tr> <td valign=top height=150>

</td></tr> </tbody>
<script language=javascript>
    //重复一次新闻内容
    document.write(news.tBodies[0].innerHTML)
  </script> </table></div>
<script language=javascript>
  //实现不间断滚动
  function newsScroll()
  {
    news.style.pixelTop=(news.style.pixelTop-1)%(news.clientHeight/2);
  }
  timer1=setInterval('newsScroll()',40)  //更改第二个参数可以改变速度,值越小,速度越快。
</script> <br><br>

 

 

 


</BODY>
</HTML>

IIS系列教程

【IIS系列教程】

第一节:Internet Information Server 安全机制的工作方式 

    Internet Information Server 建立在 Windows NT 安全机制模型之上。Windows NT 安全机制通过请求分配用户帐号和密码帮助保护计算机及其资源。可使用限制这些帐号的用户权力来控制访问计算机资源。可使用 Windows NT 文件系统 (NTFS) 分配计算机上的文件夹和文件权限。禁止用户向文件夹中或从文件夹中复制文件,或禁止用户执行某个文件夹中的文件,来控制访问文件夹和文件。 
    除了 Windows NT 安全特征,还可使用“Internet 服务管理器”设置只读或只执行虚拟目录。Internet Information Server 还提供了一种方法用特定 IP 地址拒绝用户访问计算机。IIS 支持安全套接字层 (SSL) 协议,它保护客户和服务器之间的加密数据传送。 
    当 IIS Web 服务器接收浏览器信息请求时,它判定请求是否有效。下面的说明简单地概括了每个请求上使用的安全性进程。  
下节解释如何配置 Windows NT 和 Internet 服务以保护您的系统。  

IIS系列教程  

第二节:控制匿名访问  

    在许多 Web 服务器上,大部分 WWW、FTP、和 gopher 访问是匿名的;即客户请求不包含用户名和密码。这出现在下面情况中:  
    FTP 客户以用户名“匿名”登录。  

          所有 gopher 请求。  

    Web 浏览器请求在 HTTP 头文件中不包含用户名和密码(此情况在与大多数浏览器连接的新 Web 连接上是默认的)。  
    即使用户不以个人用户名和密码登录,仍然可控制和监视匿名访问。每个 Internet 服务保留 Windows NT 用于进程匿名请求的用户名和密码。接收匿名请求时,服务“假装”配置为“匿名登录”用户的用户。当资源的访问控制列表 (ACL) 判断时,如果匿名登录用户具有访问请求资源的权限,则请求成功。如果匿名登录用户不具有权限,请求失败。通过要求用户提供有效的用户名和密码,此过程称为身份验证,可配置 WWW 服务以响应失败的匿名请求。  

          配置匿名用户帐号  
    可在 Internet 服务管理器的“服务”属性页(用于 WWW、FTP 和 gopher 服务)中查看和监视匿名登录用户帐号。在相同的计算机上运行的每个服务可使用相同或不同的匿名登录用户帐号。将匿名登录用户帐号包括在文件或文件夹 ACL 中可以精确地控制匿名客户可用的资源。  
    匿名登录用户帐号必须是提供 Web 服务的服务器上有效的 Windows NT 用户帐号,密码必须与计算机的用户数据库中此用户的密码相匹配。设置“策略”菜单中的“用户权力”,将用户帐号和密码配置在 Windows NT 用户管理器中。匿名登录用户帐号必须具有“本地登录”用户权力。  
    在建立 Internet Information Server 过程中 将自动创建 IUSR_computername(随机生成密码)。例如,如果计算机名为 marketing1,则匿名访问帐号名是 IUSR_marketing1。  
    以默认方式,所有 Web 客户请求使用此帐号。换句话,使用 IUSR_computername 帐号将 Web 客户登录到计算机上。IUSR_计算机名帐号只允许本地登录到提供 Web 服务的 服务器 。  
    注意 IUSR_computername 帐号也被添加到 Guests 组中。如果已经更改了 Guests 组的设置,则那些更改也适用于 IUSR_computername 帐号。应该检查 Guests 组的设置以确保它们适合于 IUSR_computername 帐号。  
    对于 WWW 和 FTP 服务,可允许或禁止匿名服务(所有 gopher 请求均为匿名)。对 Web 每个服务(WWW、FTP 和 gopher),可更改用于匿名请求的用户帐号,并更改此帐号的密码。  

          允许匿名访问  
    在 Internet 服务管理器中,双击 WWW 服务或 FTP 服务以显示其属性页,然后单击“服务”选项卡。  
    对于 WWW 服务,选定“允许匿名”复选框。对于 FTP 服务,选定“允许匿名连接”复选框。  
    单击“确定”。  

          更改用于匿名访问的帐号或密码  
   
    在 Internet 服务管理器中,双击服务以显示其属性页,然后单击“服务”选项卡。  
    在“匿名登录”用户名框中,键入新的用户名。  
    默认用户帐号是 IUSR_computername,此处 computername 是您的服务器的名称。建立 Internet Information Server 时自动创建此帐号。  
           
          将自动为 IUSR_computername 帐号创建随机生成的密码。  
     
    在“密码”框中,键入新密码,注意 如果更改此帐号的密码,则必须在用户管理器中为用户指定新密码。  
    单击“确定”。  

          使用域控制器上的匿名帐号  

    将 Internet Information Server 安装到主域或从域控制器时,在域的用户帐号数据库中创建匿名登录用户帐号。当 Internet Information Server 安装在域成员服务器,或单独的服务器时,在本地计算机上创建此帐号。  
    如果在同一个域的多个域控制器上安装 Internet Information Server ,则在域用户数据库中为每个 Internet 服务器计算机创建一个独立的用户帐号。因为每个用户名是唯一的,且包含着相关计算机的名称,所以不会造成任何冲突。然而,可以发现在用于所有域中的 Internet Information Server 域控制器的域中创建一个匿名登录用户帐号更方便。这可以简化 ACL 的管理。要这样做,依照这些步骤:  
    1.在“域用户管理器”中,创建域中的新匿名登录用户帐号。确保此帐号成为适当的组的成员,被分配安全性密码,并给予“用户权力”(在“策略”菜单中)以便本地登录。  
    2.在 Internet 服务管理器的“服务”属性页中,指定新匿名登录用户名和密码。必须为域中所有主和从域控制器上运行的每个 Internet Information Server 服务作这一工作。  
    3.在域中的其它域控制器上安装 Internet Information Server 之后,确保使用 Internet 服务管理器来修改匿名登录用户名和密码以匹配那些以“域用户管理器”创建的内容。为每个安装的 Internet Information Server 服务做这一工作。  
    如果只允许通过 IUSR_computername 帐号远程访问,则远程用户不能提供用户名和密码,并且只具有分配此帐号的权限。这防止计算机窃贼企图以欺骗或非法获得的密码访问敏感信息。对于一些情况提供了最后的安全性。  

IIS系列教程  

第三节:控制用户或组的访问  

    通过使用 Windows NT 用户管理器指定允许哪种用户或用户组可在服务器上操作,可以控制对 Web 节点的访问。可通过要求 Web 客户请求以提供在完成请求之前定制的 Internet Information Server 用户名和密码,可以更进一步控制访问。  

           设置用户帐号  

    Windows NT 安全机制通过要求分配的用户帐号保护您的计算机及其资源。运行 Windows NT 的计算机上的每次操作标识何人正使用操作。例如,用于登录到 Windows NT 上的用户名和密码标识您是谁,并定义授权您在计算机上进行的操作。  
    通过在“策略”菜单中设置用户权力,在“用户管理器”中配置在计算机上授权用户所进行的操作。用户权力授权用户在系统上执行某个动作,包括本地登录权力,它是如果使用 Basic 身份验证时用户所要求的用于 Internet 服务的权力。  
    如果正使用 Windows NT Challenge/Response 身份验证,用户使用 Internet 服务则要求从网络访问本机的权力。每个人以默认方式拥有此权力。  
    要增加安全性,请参照这些指示:  
    1.对于 IUSR_computername 帐号、Guests 组或 Everyone 组只给予本地登录或从网络访问本机权力。  
    2.确保系统上所有用户帐号,特别是具有管理权力的那些帐号,拥有难于猜测的密码。特别是,选定好的管理员密码(长的、混合大小写的字母密码是最好的)并设置合适的帐号规则。使用“用户管理器”设置密码,或在系统登录提示中键入密码。  
    3.确保指定帐号密码到期的速度(这使得用户有规律地更改密码),并设置其他规则,例如在拒绝用户之前可以忽视几个错误的登录企图。使用这些规则以防止完全或随机的密码侵袭,尤其是在具有管理访问的帐号上。可使用“用户管理器”设置这些规则。  
    4.将 Administrator 组的成员限制为可信赖的个人。  
    5.如果使用访问控制的预定义 Windows NT 用户帐号 INTERACTIVE 和 NETWORK,则确保这些用户帐号可访问 Web 节点中的文件。为使匿名客户请求或使用 Basic 身份验证的客户请求可访问文件,则 INTERACTIVE 用户必须可以访问请求的文件。为使使用 Windows NT Challenge/Response 身份验证协议的客户请求可访问文件,则 NETWORK 用户必须可以访问文件。  

          要求用户名和密码  

    可将对 Web 节点的访问仅限制为身份验证的客户;即提供有效用户名和密码的 Web 客户。使用身份验证时,不允许访问,除非提供有效的用户名和密码。如果只想要授权的个人访问您的 Web 节点或由 NTFS 控制的特定部分,则密码身份验证很有用。可以同时允许匿名登录访问和授权访问。  
    WWW 服务提供了两种形式的身份验证:Basic 和 Windows NT Challenge/Response(有时称为“NTLM”)。  
    Basic 身份验证不是在客户和服务器之间加密传送。因为 Basic 身份验证以基本的未加密形式通过网络发送客户的 Windows NT 用户名和密码,入侵者可以很容易地知道用户名和密码。  
    只有 Microsoft Internet Explorer 2.0 版本或之后的版本才支持的 Windows NT Challenge/Response 身份验证保护密码,提供通过网络的安全登录。在 Windows NT Challenge/Response 身份验证中,从客户上获得的用户帐号是将用户登录到客户计算机上所使用的帐号。因为此帐号,包括其 Windows NT 域,必须是 基于 Windows NT 运行 Internet Information Server 的服务器上的有效帐号,Windows NT Challenge/Response 身份验证在 Intranet 环境中非常有用,这里客户和服务器计算机在同一个域或信任域中。因为增强的安全性,Microsoft 建议在任何必要的时候使用密码身份验证的 Windows NT Challenge/Response 方法。  
    以默认方式允许您具有 Basic 和 Windows NT Challenge/Response 身份验证。如果浏览器支持 Windows NT Challenge/Response,则使用这种身份验证方法。否则使用 Basic 身份验证。只有 Internet Explorer 2.0 或其以后的版本当前支持 Windows NT Challenge/Response 身份验证。  
    可以对所有 FTP 服务请求或只对失败的匿名请求要求客户身份验证。FTP 服务只支持 Basic 身份验证,因此,如果您允许匿名连接则节点更安全。如果只允许匿名 FTP 连接则节点最安全。  

          允许 WWW 服务的身份验证  

    在 Internet 服务管理器中,双击 WWW 服务以显示其属性菜单,然后单击“服务”选项卡。  
    选定“基本(明文文本)”,“Windows NT Challenge/Response”,或二者都选。  
    单击“确定”。  

          允许 FTP 服务的身份验证  
    在 Internet 服务管理器中,双击 FTP 服务以显示其属性页,然后单击“服务”选项卡。  
    允许失败的匿名连接身份验证,清除(删除)“只允许匿名连接”复选框。  
    要求所有要被授权的客户请求,清除“允许匿名连接”复选框。  
    警告 与 HTTP Basic 身份验证一样,FTP 和 WWW Basic 身份验证通过网络在明文文本(即未加密)中发送密码。  

          匿名登录与客户身份验证的交互  

    对于 WWW 服务和 FTP 服务允许匿名连接和客户身份验证。本节解释两种方法都允许时 IIS Web 服务器如何响应这些访问方法。  
    注意如果不允许客户身份验证,只允许匿名连接,则包含用户名和密码的客户请求作为匿名连接处理,服务器忽视用户名和密码。  

          WWW 服务  
  
    WWW 服务接收包含证件(用户名和密码)的客户请求时,“匿名登录”用户帐号不用于处理此请求。相反,客户接收的用户名和密码由服务使用。如果使用指定用户名和密码时不授予服务访问被请求资源的权限,则请求失败,并将错误通知返回客户。  
    当因为“匿名登录”用户帐号不具有访问资源的权限而匿名请求失败时,到用户的响应表明 WWW 服务支持哪一种身份验证方案。如果响应表明服务被配置的客户支持 HTTP Basic 身份验证,则大部分 Web 浏览器将显示用户名和密码对话框,并将匿名请求作为含证件的请求再次发布,其中包括用户输入的用户名和密码。  
    如果 Web 浏览器支持 Windows NT Challenge/Response 身份验证协议,并将 WWW 服务配置为支持此协议,则由于不适当权限而失败的匿名 WWW 请求将导致自动使用 Windows NT Challenge/Response 身份验证协议。然后浏览器将从客户向服务发送用户名和加密密码。使用客户的用户信息再处理客户请求。  
    如果 WWW 服务配置为既支持 Basic 又支持 Windows NT Challenge/Response,则 Web 服务器在到 Web 浏览器的头文件中返回两种身份验证方法。然后 Web 浏览器选择要使用的方法。因为 Windows NT Challenge/Response 协议首先在头文件中列出,则支持 Windows NT Challenge/Response 协议的浏览器将使用它。不支持 Windows NT Challenge/Response 协议的浏览器将使用 Basic 身份验证。当前,只有 Internet Explorer 2.0 或其后的版本支持 Windows NT Challenge/Response 身份验证。  

          FTP 服务  

    当 FTP 服务接收包含证件(用户名和密码)的客户请求时,“匿名登录”用户帐号不用于处理请求。相反,客户所接收的用户名和密码由服务使用。如果服务在使用指定的用户名和密码时未被授权访问请求的资源,则请求失败,并且将错误通知返回客户。  
    当匿名请求因为“匿名登录”用户不具有访问所需资源的权限而失败时,服务器则以错误消息响应。大部分 Web 浏览器将显示用户名和密码对话框,并将匿名请求作为含证件的请求再次发布,其中包括用户输入的用户名和密码。  
    警告 因为 FTP 服务(和 WWW Basic 身份验证)通过网络发送加密的用户名和密码,入侵者可能使用协议分析程序来阅读用户名和密码。  

          创建自定义的身份验证方案  

    如果需要服务不直接支持 WWW 请求身份验证方案,则获得 Win32 Software Development Kit (SDK) 的备份,并阅读关于如何开发用户写入的处理请求身份验证的 ISAPI 过滤器动态链接库 (DLL) 的 ISAPI 过滤器详细说明。通过 Microsoft Developer Network 可获得 Win32 SDK 。详细信息,请参阅 Microsoft 的宿主页 http://www.microsoft.com)。  

IIS系列教程  

第四节:设置文件夹和文件权限  

    由于 Windows NT 用户的缘故,每次访问资源,例如文件、HTML 页面或 Internet Server API (ISAPI) 应用程序,由服务来完成。服务在企图读或执行客户资源时使用用户的用户名和密码。可以有两种方法控制服务文件和文件夹:  
    在 Windows NT 文件系统 (NTFS) 中设置访问权限  
    在 Internet 服务管理器中设置访问权限  
    注意 文件分配表 (FAT) 文件系统分区不支持访问控制。然而,可以使用转换实用程序将 FAT 分区转换为 NTFS。关于此实用程序的详细信息,请参阅 Windows NT 文档。  

          设置 NTFS 权限  

    应将数据文件放置于 NTFS 分区。NTFS 提供数据文件的安全性和访问控制。可使用 NTFS 为特定用户和服务限制访问某部分文件系统。特别是,对于任何 Internet 发布服务,它是将访问控制列表 (ACL) 用于数据文件的好主意。  
    ACL 以特定 Windows NT 用户帐号或用户组允许或拒绝访问相关文件或文件夹。当由于客户请求 Internet 服务企图读或执行文件时,由服务提供的用户帐号必须具有读或执行文件的权限,正如在适当的时候由与文件相关的 ACL 来判定一样。如果用户帐号不具有访问文件的权限,则请求失败并返回响应,通知客户访问已被拒绝。  
    使用 Windows NT 资源管理器配置文件和文件夹 ACL。通过指定允许访问的用户和组以及他们可具有对特定文件和目录的何种类型的访问,NTFS 文件系统给予您很好的文件控制权。例如,一些用户具有只读访问权,而另一些用户则具有读、修改和写访问权。应该确保允许或拒绝 IUSR_computername 或身份验证帐号访问特定资源。  
    应该注意“每人”组包含着所有用户和组,包括 IUSR_computername 帐号和 Guests 组。组 Everyone 以默认方式具有 NTFS 驱动器上创建的所有文件的完全控制权。 。 如果在 NTFS 设置和 Microsoft Internet Information Server 设置之间有冲突,则使用最严格的设置.该检查 Web 节点中所有文件的安全性设置,并适当地调整。通常应该使用下表中的设置:  
    建议的 NTFS 访问权限  
    内容 读访问  
    程序 读与执行访问  
    数据库 读与写访问  

          保护 NTFS 驱动器上的文件  

    使用 Internet 服务管理器中的“目录”属性页,将文件放于 NTFS 驱动器并将其添加到 Web 节点。  
    在 Windows NT 资源管理器中,用鼠标右键单击想要保护的文件夹(目录)(选定节点根以保护整个节点),选择“属性”。  
    在“属性”对话框中,选择“安全”选项卡。  
    在“安全”对话框中,选择“权限”。  
    在“目录权限”中单击“添加”以增加用户和组。  
    在“添加用户和组”对话框中,添加应该具有访问权的用户。  
    单击“确认”。  
    在“目录权限”对话框中,选定应该具有权限的用户和组。  
    从“访问类型”列表框中,选择想要给予选定用户或组的权限级别。  
    单击“确认”。  

          审核文件访问  

    判定某人是否已经获得对敏感文件的未授权访问,可以审核 NTFS 文件和文件夹的访问权限。例如,可检查特定用户组的成员读文件的企图。应该定期考察审核报告以便检查未授权访问。在文件或文件上设置审核,使用域用户管理器 以允许 File and Object Access 的审核,然后使用 Windows NT 资源管理器指定要审核哪个文件以及要审核哪类文件访问事件。要考察审核条目,使用事件查看器。  
    关于设计文件和文件夹审核规则的详细信息,请参阅 Windows NT 文档。  

第五节:设置 WWW 目录访问权  

    在 Internet Service Manager 中创建 Web 发布目录(文件夹)时,可以为定义的主目录或虚拟目录及其中所有的文件夹设置访问权限。这些权限是有 WWW 服务提供的那些,是 NTFS 文件系统提供的权限之外的部分。权限是:  
    1.读;读权限允许 Web 客户读或下载存储在主目录或虚拟目录中的文件。如果客户为目录中没有读权限的文件发送一个请求,则 Web 服务器返回一个错误。通常,应该给予包含要发布信息(例如 HTML 文件)的目录读权限。应该为包含公用网关接口 (CGI) 应用程序和 Internet Server 应用程序编程接口 (ISAPI) DLL 的目录取消读权限,以防止客户下载应用程序文件。  
    2.执行;执行权限允许 Web 客户运行存储在主目录或虚拟目录中的程序和脚本。如果客户发送请求,运行不具有执行权限的文件夹中的程序或脚本,则服务器返回一个错误。为了安全,不要给予内容文件夹执行权限。  
    客户请求可用下面两种方法之一调用 CGI 应用程序或 Internet Server 应用程序编程接口 (ISAPI) 应用程序:  
    可在请求 (URL) 中指定可执行 CGI 或 ISAPI DLL 的文件名。示例 URL 是:  
    http://inetsrvr.microsoft.com/s cripts/httpodbc.dll/s cripts/pubs.idc?lname=Smith  
    此请求要有效,文件 Httpodbc.dll 必须存储在 Web “发布树”中的某一位置(在本示例中,是脚本文件夹中包含内容文件的目录结构),将其存储其中的文件夹必须具有选定的执行权限。这种方法中,管理员可允许应用程序(CGI 或 ISAPI)从少量仔细监视的目录中运行。  
    配置 CGI 和 SAPI 应用程序的另一种方法是使用 Web File Extension Mapping 特性,允许您的可执行和 DLL 存储在 Web 发布树以外的其它位置。示例 URL 是: http://inetsrvr.microsoft.com/s cripts/pubs.idc?lname=Smith  
    在本示例中,脚本文件 (Pubs.idc) 存储在允许执行权限的 Web 发布树的文件夹中。服务接收请求后,将使用文件名扩展映射以判定在何处查找应用程序,哪个可以存储在任何位置。这项技术防止用户通过在 URL 中增加参数直接调用 CGI 和 ISAPI 应用程序。因此是更安全的机制,并且对于所有 Web 应用程序和脚本很有用。详细信息,请参阅第十章“配置注册项” 中的“与应用程序(脚本映射)相关的注释”。  

          设置目录的访问权限  

    在 Internet 服务管理器中,双击 WWW 服务以显示其属性页,然后单击“目录”选项卡。  
    选定想要为其设置权限的文件夹。  
    单击“编辑属性”。  
    为允许 Web 客户读和下载文件夹的内容,选定“读”复选框。  
    为允许 Web 客户运行文件夹中的程序和脚本,选定“执行”复选框。  
    单击“确认”,然后再单击“确认”。  
    注意 我们建议在文件夹上设置执行访问或 读访问,但不是两种。可执行的脚本和程序都应该保存在与静态 Web 内容分离的虚拟根中。  

IIS系列教程  

第六节:通过 IP 地址控制访问权  

    可以配置 Microsoft Internet Information Server 以允许或拒绝访问特定 IP 地址。例如,可以通过拒绝从特定 IP 地址访问您的服务器来排除入侵的个人,或防止整个网络访问您的服务器。相反,可以有选择地允许特定节点访问您的服务。在 Internet 上排除未知用户,IP 地址安全性可能最有用。  
    参照“高级”属性页中的 Internet Information Server 设置,检查每个被接收报文的源 IP 地址。如果将 Internet Information Server 配置为除了列为这项规则例外的计算机,其它计算机都允许访问,则拒绝含有包括在那个列表中的 IP 地址的任何计算机的访问。相反,如果将 Internet Information Server 配置为拒绝所有 IP 地址,则除了已特别允许 IP 地址访问的用户以外,将拒绝所有远程用户的访问。  

          拒绝访问特定计算机或计算机组  

    在 Internet Service Manager 的“高级”属性页中,选择“允许访问”按钮。  
    单击“添加”。  
    在“IP 地址”框中,键入您的节点将拒绝访问的计算机 IP 地址,或单击“IP 地址”框旁边的按钮以使用 DNS 名,例如 www.company.com。  
    要拒绝访问计算机组,选定“计算机组”。在“IP 地址”和“子网掩码”框中,键入将要拒绝的 IP 地址和子网掩码。  
    单击“确认”。  
    除了在“访问”状态为“拒绝”的窗口中的计算机,将允许访问所有计算机。  
    在“高级”属性页中,单击“确认”。  

          允许访问特定计算机或计算机组  

    在 Internet Service Manager 的“高级”属性页中,选择“拒绝访问”按钮。  
    此步骤除了那些特别允许访问的以外,将拒绝访问所有计算机。  
    单击“添加”。  
    在“IP 地址”框中,键入将允许访问的计算机 IP 地址,或单击“IP 地址”框旁边的按钮以使用 DNS 名,例如 www.company.com。  
    允许访问特定计算机组,选定“计算机组”。在“IP 地址”和“子网掩码”框中,键入将允许访问的组的 IP 地址或子网掩码。  
    单击“确认”。  
    除了“访问”状态为“允许”的窗口中的那些以外,将拒绝访问所有计算机。  
    在“高级”属性页中,单击“确认”。  

IIS系列教程  

第七节:运行其它网络服务  

    应该考察连接 Internet 的所有计算机上使用的全部网络服务。  

          只运行所需要的服务  

    在系统上运行的服务越少,在可利用的管理中发生的错误越少。使用“控制面板”中的 Services 应用程序取消 Internet 服务器上不完全必要的服务  

          从 Internet 网卡上解开不必要的服务  

    使用“控制面板”中“网络”应用程序内的绑定特性从任何连接 Internet 的网卡上解开任何不必要的服务。例如,可使用 Server 服务从您的内部网络中的计算机上复制新的图象和文档,但您可能不希望远程用户从 Internet 上 直接访问 Server 服务。  
    如果需要在私人网络上使用服务,取消连接任何与 Internet 相连接的网卡 Server 的服务。可通过 Internet 使用 Windows NT Server 服务,然而,应该充分理解安全性含义,并遵守 Windows NT Server 许可协议要求条目。  
    当正使用 Windows NT Server 服务时,您正使用 Microsoft 联网(服务器消息块 [SMB] 协议而非 HTTP 协议),并且所有 Windows NT Server 许可协议要求仍旧适用。HTTP 连接不适用于 Windows NT Server 特许要求。  

          检查网络共享权限  

如果在 Internet 网卡上运行服务,确保在系统上双检查设置在已创建共享上的权限。还应该双检查包含在共享文件夹中的文件上设置的权限,以确保设置正确。  

          不允许目录浏览  

    除非是方案的一部分,否则不应该在“目录”属性页中允许目录浏览。目录浏览潜在地暴露了整个 Web 发布文件的结构;如果配置不正确,则有将程序文件或其它文件暴露给未授权访问的危险。如果默认页面 (Default.htm) 未出现并允许目录浏览,则 WWW 服务将返回包含指定目录中文件列表的 Web 页面。通常建议将 Default.htm 页面放于您不希望被浏览的目录中。  

第八节:用安全套接字层 (SSL) 保护数据传输  

    本章的前面小节已经讲解了保护您的服务器防止未授权访问。这节讨论使用密码技术保护数据从服务器中和到其中传输的协议。  
    Microsoft Internet Information Server 提供一种在其服务协议 (HTTP) 和 TCP/IP 之间提供分层数据安全性的协议。这种安全性协议称为安全套接字层 (SSL),为 TCP/IP 连接提供数据加密、服务器身份验证和消息完整性。  
    SSL 是提交给 W3C 工作组关于安全性的协议,它被视为 Internet 上 Web 浏览器和服务器的标准安全性措施。SSL 提供了用于启动 TCP/IP 连接的安全性“信号交换”。这种信号交换导致客户和服务器同意将使用的安全性级别,并履行连接的任何身份验证要求。此后,SSL 的唯一作用是加密和解密要使用的应用程序协议的字节流(例如 HTTP)。这意味着 HTTP 请求和 HTTP 响应中的所有信息将完全被加密,包括客户正请求的 URL,任何提交形式内容(例如信用卡号)、任何 HTTP 访问身份验证信息(用户名和密码)以及从服务器返回到客户的所有信息。  
    SSL 允许的服务器可以通过 Internet 发送和接收到 SSL 允许客户(浏览器)的私人通信,例如 Microsoft Internet Explorer 2.0 或其以后的版本。  
    SSL 加密的传输较之未加密传输速度要慢。为避免降低整个节点的性能,则考虑 SSL 仅使用于处理高度敏感信息的虚拟文件夹,例如包含信用卡信息的形式提交。  
    允许 Web 服务器上的 SSL 安全性要求下列步骤:  
    1.生成密钥对文件和请求文件。  
    2.从身份验证权限中请求一个证书。  
    3.在服务器上安装证书。  
    4.激活 WWW 服务文件夹上的 SSL 安全性。  
    要点 允许 SSL 安全性时请记住下面各点:  
    1.可在 Web 节点的根上(默认方式时,\InetPub\Wwwroot)或在一个或多个虚拟文件夹上允许 SSL 安全性。  
    2.一旦允许和正确配置,只有 SSL 允许的客户能够与 SSL 允许的 WWW 文件夹通信。  
    3.指向 SSL 允许的 WWW 文件夹上文档的 URL 必须使用 URL 中的“https://”替换“http://”。任何使用 URL 中“http://”的链接将不能在安全的文件夹上工作。  
    4.生成密钥对  
    作为允许 Web 服务器上安全套接字层 (SSL) 安全性进程的一部分,需要生成密钥对,然后获得 SSL 证书。新的密钥管理器应用程序(用产品安装并定位于 Internet Server 程序组中)简化了这一过程:  

          生成密钥对  

    在“Microsoft Internet 服务器”子菜单中,单击“密钥管理器”,或单击“Internet 服务管理器”工具栏上的“密钥管理器”图标。  
    从“密钥”菜单中,单击“创建新密钥”。  
    在“创建新密钥和批准请求”对话框中,填入请求的信息,如下所示:  

          密钥名  

    为要创建的密钥分配一个名称。  

          密码  

    指定密码以加密私人密钥。  

          位  

    以默认方式 密钥管理器 生成长度为 1024 位的密钥对。要指定长度为 512 或 768 的密钥在此框中作出正确的选择。指定更多的位,则安全性更大。在国际版本中,创建的每个密钥的长度是 512 位。  

          组织  

    高级的国际标准化组织 (ISO) 注册,高层组织或公司名。  

          组织单位  

    公司内您所在的部门,例如市场部。  

          公共名  

    服务器域名,例如 www. mycompany.com。  

          国家  

    两字母的 ISO 国家名,例如 US, FR, AU, UK 等。  

          州/省  

    例如 Washington, Alberta, California 等。  

          地点  

    公司所在的城市,例如 Redmond 或多伦多。  

          请求文件  

    键入将被创建的请求文件名。  
    完成表格后,单击“确认”。  
    提示时,再次键入在表格中键入的密码,然后单击“确认”。  
    图标显示为要被创建的密钥。当已经创建密钥时,屏幕显示给您新密钥的信息和如何获得证书。  
    5. 阅读“新密钥信息”屏幕之后,单击“确认”。  
    6. 从“服务器”菜单选择“提交改变”保存新密钥。  
    7. 当询问是否想要承认现在所有的改变时,单击“确认”。  
    您的密钥将显示在为之创建密钥的计算机名下面的“密钥管理器”窗口中。密钥以默认方式生成在本地计算机上。  
    注意 不要在任何域中使用逗号。逗号被视为域的末尾,并将生成无效的请求而不警告。  

          在另一个服务器上生成密钥对  

    可在另一个服务器上建立密钥对,并在此处安装证书。从“服务器”菜单中,单击“连接到服务器”,然后参照前面“生成密钥对”下的过程。  
    一旦已经生成密钥对,必须获得证书,然后以密钥对安装此证书。关于获得证书的信息,请参阅“获得证书”和“用密钥对安装证书”。  

          获得证书  

    由“密钥管理器”生成的密钥直到从身份验证中获得有效的证书,例如 VeriSign,才能在 Internet 上使用。向身份验证发送证书请求文件以获得有效证书。直到这样做以后,密钥将存在于其宿主计算机上,但不能使用。关于获得 VeriSign 证书的指令,请在http://www.verisign.com/microsoft/ 下参考 VeriSign 的 Web 节点。  

          用密钥对安装证书  

    完成证书请求之后,将从 Certifi  
   cate Authority 中接收签名的证书(完整的细节请教证书授权)。密钥管理器程序将创建类似下面示例的文件:  

-----BEGIN CERTIFICATE-----  

JIEBSDSCEXoCHQEwLQMJSoZILvoNVQECSQAwcSETMRkOAMUTBhMuVrM  

mIoAnBdNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMRwwGgYDVQ  

QLExNQZXJzb25hIENlcnRpZmljYXRlMSQwIgYDVQQDExtPcGVuIE1hc  

mtldCBUZXN0IFNlcnZlciAxMTAwHhcNOTUwNzE5MjAyNzMwWhcNOTYw  

NTE0MjAyOTEwWjBzMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXUlNBIER  

hdGEgU2VjdXJpdHksIEluYy4xHDAaBgNVBAsTE1BlcnNvbmEgQ2VydG  

lmaWNhdGUxJDAiBgNVBAMTG09wZW4gTWFya2V0IFRlc3QgU2VydmVyI  

DExMDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDU/7lrgR6vkVNX40BA  

q1poGdSmGkD1iN3sEPfSTGxNJXY58XH3JoZ4nrF7mIfvpghNi1taYim  

vhbBPNqYe4yLPAgMBAAEwDQYJKoZIhvcNAQECBQADQQBqyCpws9EaAj  

KKAefuNP+z+8NY8khckgyHN2LLpfhv+iP8m+bF66HNDUlFz8ZrVOu3W  

QapgLPV90kIskNKXX3a  

------END CERTIFICATE-----  

          安装证书  

    在“Internet 服务器”程序组中,单击“密钥管理器”。  
    在“密钥管理器”窗口中,选定与签名的证书相匹配的密钥对。  
    如果您已经备份了密钥对文件,首先需要将其载入。关于指令,请参阅本章前面的“载入密钥对文件”。  
    从“密钥”菜单,选择“安装密钥证书”。  
    从列表中(例如 Certif.txt)选定证书文件,然后单击“打开”。  
    当提示时,键入用于创建密钥对中的密码。  
    将密钥和证书结合,并存储在服务器的注册处。  
     
          从“服务器”菜单中,选择“提交改变”。  
     
    当询问是否现在要接受所有的改动时,单击“确认”。  
    可参照本章前面的“备份密钥”的过程来备份密钥和证书的组合。  
    注意 如果在安装证书的同时不指定 IP 地址,同一个证书将适用于所有系统上创建的虚拟服务器。如果在一个服务器上将多个节点作为宿主,则可通过添加 IP 地址,例如 10.191.28.45,指定只用于特殊服务器 IP 地址的证书。  

          配置目录要求 SSL  

    如果已经使用证书,必须允许 Internet 服务管理器上的 SSL 特性。可在 Web 节点中任何可用的虚拟文件夹上要求 SSL,并在“目录”属性页上配置。  

          要求 SSL  

    在 Internet 服务管理器中,双击 WWW 服务以显示其属性页,然后单击“目录”选项卡。  
    选定要求 SSL 安全性的文件夹,然后单击“编辑属性”。  
    选定“要求安全 SSL 通道”选项,然后单击“确认”。  
     
          将密钥对移动到另一个服务器  

    创建密钥对之后,可使用密钥管理器将密钥对移动到另一个服务器。  

          将密钥对移动到另一个服务器  

    从“服务器”菜单中,单击“连接到服务器”,键入想要将密钥对移入其中的服务器名,然后单击“确认”。  
    服务器名出现在服务器列表中(左列)。  

          选定想要移动的密钥。  

    从“编辑”菜单中,单击“剪切”。  

          选定想要将密钥对移入其中的服务器。  

    从“编辑”菜单中,单击“粘贴”。  
    以复制命令代替剪切,可以用相同的过程将密钥对复制到另一个服务器。  

          备份密钥  

    用密钥管理器将信息从注册处下载到硬盘上的文件,然后为了安全保存将其复制或移动到软盘或磁带中。可以用已安装的证书备份私人密钥对或密钥。  

          备份密钥或私人密钥对文件  

    从“密钥管理器”的“密钥”菜单中,选择 “导出密钥”然后是“备份文件”。  
    读取将敏感信息下载到硬盘的警告之后,单击“确认”。  
    在“文件名”框中键入密钥名,然后单击“保存”。  
           
          分配文件扩展名 .req 并将器存入硬盘驱动器中。然后将其复制或移动到软盘或磁带。  

          载入备份密钥  

    可用 Import 命令将备份密钥或私人密钥对文件载入密钥管理器。  

          载入备份密钥  

    从“密钥管理器”的“密钥”菜单中,选择“导入密钥”然后是“备份文件”。  
    从列表中选定文件名,单击“打开”。  
    载入由 Keygen.exe 和 Setkey.exe 创建的密钥  
    如果已经用 Keygen.exe 命令从命令行生成密钥对,并且以 Setkey.exe 安装一个证书,则可用命令 Import 将其载入“密钥管理器”。  
  
          载入密钥  

    从“密钥管理器”的“密钥”菜单中,选择“导入密钥”然后是“KeySet ”。  
    在“私人密钥对文件”框中,键入密钥对的文件名或单击“浏览 ”然后选定文件。  
    在“证书文件”框中,键入证书的文件名或单击“浏览”然后选定文件。  
    单击“确认”。  
    在“私人密钥密码”框中键入私人密钥的密码,然后单击“确认”。  

         SSL 配置和操作的建议  

    Microsoft 建议为了安全性和公共内容,使用单独的内容命令(例如 C:\InetPub\Wwwroot\Secure-Content 与 C:\InetPubWwwroot\Public-Content)。  
    将密钥文件保存在安全的地方,万一在将来需要此文件。在完成所有建立步骤之后,将密钥文件保存在软盘中并从本地系统中删除,是个好主意。不要忘记分配密钥文件的密码。

 
                运行iis的最小ntfs权限

编辑整理:momo

本文介绍了正常运行iis所需要的最小ntfs权限,当iis不能正常运行或者想严格限制权限的时候可以参照此文,以下是操作的7个步骤。

1、  选取整个硬盘:
system:完全控制
administrator:完全控制
(允许将来自父系的可继承性权限传播给对象)

2、  \program files\common files:
everyone:读取及运行
     列出文件目录
     读取
(允许将来自父系的可继承性权限传播给对象)

3、  \inetpub\wwwroot:
iusr_machine:读取及运行
         列出文件目录
         读取
(允许将来自父系的可继承性权限传播给对象)

4、  \winnt\system32:
选择除inetsrv和centsrv以外的所有目录,去除“允许将来自父系的可继承性权限传播给对象”选框,复制。

5、  \winnt:
选择除了downloaded program files、help、iis temporary compressed files、offline web pages、system32、tasks、temp、web以外的所有目录,去除“允许将来自父系的可继承性权限传播给对象”选框,复制。

6、  \winnt:
everyone:读取及运行
     列出文件目录
     读取
(允许将来自父系的可继承性权限传播给对象)

7、  \winnt\temp:(允许访问数据库并显示在asp页面上)
everyone:修改
(允许将来自父系的可继承性权限传播给对象)

这样,你就拥有了一个权限严格而又可以正常运行的iis系统了。

form表单提交后弹出没有工具栏的窗口

<script language="javascript">
function xxx()
{win = window.open("","xxx","width=100,height=100")}
</script>
<form action="xxx.asp" target="xxx" onsubmit="return xxx()">
<input type="submit" value="submit">
</form>

ASP设计常见问题及解答精要

作为微软推出的网页与数据库解决方案,ASP由于有微软得天独厚的操作系统等技术后盾支持,因此得到了迅速的发展,并且正受到越来越多的欢迎,在目前在电子商务网站的建设中有很多都使用ASP来编写程序。

  近来有很多的读者向我们咨询学习ASP的方法和在学习中遇到的一些问题,其中有一些是初学者经常遇到和面临的问题。为了让读者在学习ASP的过程中加深对ASP的了解,并能够有效地解决遇到的问题,我们特别收集了比较有代表性的一些问题,在此列举出来并一一给予解答,希望能在这有限的篇幅里为你学习ASP助一臂之力。

  1、问题:ASP是一种编程语言吗?

  答:ASP不是编程语言,而是一种开发环境。ASP提供了一个在服务器端执行指令的环境,它利用了特殊的符号()来区分HTML与必须经过服务器翻译才能送往客户端的命令。它可以执行的指令包括HTML语言,Microsoft VBScript和Microsoft Jscript等,因此可以制作出功能强大的Web应用程序。

  2、问题:在Web服务器上容纳多个Web站点,能使用PWS吗?

  答:在PWS上只能容纳一个Web站点。为了在相同的计算机上容纳多个Web站点,需要使用Windows NT Server或Windows 2000 Server/Professional和IIS。

  3、问题:如何使用6个内置ASP对象?

  答:ASP提供了多个内嵌对象,无须建立就可以在指令中直接访问和使用它们,这六个对象主要有:请求(Request)对象、响应(Response)对象、工作阶段(Session)对象、应用程序(Application)对象、服务器(Server)对象、Cookies对象,这六个对象中的服务器(Server)对象可加载其他组件,这可以扩展ASP的功能。

  使用Server.CreateObject所建立的对象,它的生命周期在它建立时开始,在它所在的网页程序结束时结束。如果想要让该对象跨网页使用,则可以用Session对象来记录Server.CreateObject所建立的对象。

  4、问题:为什么在使用Response.Redirect的时候出现以下错误:“标题错误,已将HTTP标题写入用户端浏览器,对任何HTTP的标题所作的修改必须在写入页内容之前”?

  答:Response.Redirect可以将网页转移至另外的网页上,使用的语法结构是这样的:Response.Redirect网址,其中网址可以是相对地址或绝对地址,但在IIS4.0使用与在IIS5.0使用有所不同。
  在IIS4.0转移网页须在任何数据都未输出至客户端浏览器之前进行,否则会发生错误。这里所谓的数据包括HTML的卷标,例如:< HTML>,< BODY>等,而在IIS5.0中已有所改进,在IIS5.0的默认情况下缓冲区是开启的,这样的错误不再产生。

  在Response对象中有一Buffer属性,该属性可以设置网站在处理ASP之后是否马上将数据传送到客户端,但设置该属性也必须在传送任何数据给客户端之前。

  为保险起见,无论采用何种ASP运行平台,在页面的开始写上< % Response.Buffer=True %>,将缓冲区设置为开启,这样的错误就不会发生了。

  5、问题:缓冲输出对于网页传输有没有影响?

  答:在比较大的Web页中,第一部分在浏览器中出现可能会有一些延迟,但是加载整个Web页的速度比不用缓冲要快。

  6、问题:在没有表单提交时查询字符串的值是否可以使用Request.QueryString集合?

  答:Request对象用于读取浏览器的数据,它除了可以读取表单字段的内容,还可以用来读取附带在网址后面的参数,无论请求字符串怎样添加到链接地址中对Request来说都没有什么不同。使用get方法提交一个表单,还是跟随一个附加查询串的链接查询字符串中所有的值,都可以使用Request.QueryString集合。

  7、问题:我在ASP脚本中写了很多的注释,这会不会影响服务器处理ASP文件的速度?

  答:在编写程序的过程中,作注释是良好的习惯。经国外技术人员测试,带有过多注释的ASP文件整体性能仅仅会下降0.1%,也就是说在实际应用中基本上不会感觉到服务器的性能下降的。

  8、问题:需不需要在每个ASP文件的开头使用< % @LANGUAGE=VBScript % >?

  答:在每个ASP文件的开头使用< % @LANGUAGE=VBScript %>代码是用来通知服务器现在使用VBScript来编写程序,但因为ASP的预设程序语言是VBScript,因此忽略这样代码也可以正常运行,但如果程序的脚本语言是JavaScrip,就需要在程序第一行指明所用的脚本语言。
9、问题:我有没有必要在每一个ASP文件中使用“Option Explicit”?

  答:在实际应用中,VBScript变量的概念已经模糊了,允许直接使用变量,而不用Dim声明变量,但这并不是一个好习惯,容易造成程序错误,因为可能重复定义一个变量。我们可以在程序中使用Option Explicit语句,这样在使用一个变量的时候,必须先声明它,如果使用了没有经过声明的变量,运行时,程序就会出错。

  实践证明,ASP文件中使用“Option Explicit”可以使得程序出错机会降到最少,并且会大大提升整体性能。

  10、问题:运行ASP文件时有什么安全措施?

  答:ASP提供了很好的代码保护机制,所有的ASP代码都在服务器端执行而只返回给客户端代码执行结果。但仍不排除恶意人士对Web服务器的刻意破坏,所以在编写ASP文件时更要注意安全问题。

  虽然在ASP中引入文件以inc作为扩展名,在这里仍建议以ASP作为引文件的扩展名。当这些代码在安全机制不好的Web Server上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在Web Server上,如果没有定义好解析某类型(比如inc)的动态连接库时,该文件以源码方式显示。

  另外,不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立数据源名称DSN(Date Source Name),在DSN中存储了有关连接到指定数据提供者的信息,包括:“数据库的物理位置,用于访问数据库的驱动程序的类型,访问数据库的驱动程序所需要的任何其他参数”,在进行数据库访问时可以直接访问该DSN。

  11、问题:评介Web数据库管理系统时,应该考虑哪些问题?

  答:在评价一个Web数据库管理系统时,必须考虑到三方面的问题:多用户问题;所建立的Web数据库应该是关系型的;数据库的安全性问题。
  12、问题:ADO是什么,它是如何操作数据库的?

  答:ADO的全名是ActiveX Data Object(ActiveX数据对象),是一组优化的访问数据库的专用对象集,它为ASP提供了完整的站点数据库解决方案,它作用在服务器端,提供含有数据库信息的主页内容,通过执行SQL命令,让用户在浏览器画面中输入,更新和删除站点数据库的信息。

  ADO主要包括Connection,Recordset和Command三个对象, 它们的主要功能如下:

  ·Connection对象:负责打开或连接数据库文件;
  ·Recordset对象:存取数据库的内容;
  ·Command对象:对数据库下达行动查询指令,以及执行SQL Server的存储过程。

  13、问题:使用Recordset对象和Command对象来访问数据库的区别在哪里?

  答:Recordset对象会要求数据库传送所有的数据,那么数据量很大的时候就会造成网络的阻塞和数据库服务器的负荷过重,因此整体的执行效率会降低。
利用Command对象直接调用SQL语句,所执行的操作是在数据库服务器中进行的,显然会有很高的执行效率。特别是在服务器端执行创建完成的存储过程,可以降低网络流量,另外,由于事先进行了语法分析,可以提高整体的执行效率。

  14、问题:是否必须为每一个Recordset对象创建一个Connection对象?

  答:可以同时对不同的Recordset对象使用相同的Connection对象,以节省资源。

  15、问题:什么是数据库管理系统(DBMS)?

  答:数据库为了保证存储在其中的数据的安全和一致,必须有一组软件来完成相应的管理任务,这组软件就是数据库管理系统,简称DBMS,DBMS随系统的不同而不同,但是一般来说,它应该包括以下几方面的内容:

  数据库描述功能:定义数据库的全局逻辑结构,局部逻辑结构和其他各种数据库对象;
  数据库管理功能:包括系统配置与管理,数据存取与更新管理,数据完整性管理和数据安全性管理;
  数据库的查询和操纵功能:该功能包括数据库检索和修改;
  数据库维护功能:包括数据引入引出管理,数据库结构维护,数据恢复功能和性能监测。

  为了提高数据库系统的开发效率,现代数据库系统除了DBMS之外,还提供了各种支持应用开发的工具。

  16、问题:当前流行的WEB数据库管理系统有哪些?

  答:当前流行的Web数据库管理系统有微软的SQL Server、Oracle、DB2、Sybase,小规模的企业多使用Access。

17、问题:在ASP中使用ADO的AddNew方法和直接使用“Insert into...”语句有何不同?哪种方式更好?

  答:ADO的AddNew方法只是将“Insert into ”语句封装了起来,所以,当对大量数据进行操作的时候,直接使用SQL语句将会大大加快存取数据的速度,因为它减少了ADO的“翻译”时间,由于SQL语句所执行的操作是直接在数据库服务器中进行的,尤其在数据量很大的时候有显著的优势。

  18、问题:为什么我在ASP中使用标准的插入记录语句 insert into books(name,email) values(“kitty”, “kitty@263.com”)会出错?

  答:SQL(Structured Query Language/结构式查询语言)是IBM公司在1970年代所发展出来的数据查询语言,它现在已经成为关系型数据库查询语言的标准。SQL语句是一种以英文为基础的程序语言,可以使用它来添加,管理以及存取数据库。

  在SQL语句中添加时的字符串虽然可以使用双引号,但在ASP中却需要使用单引号才能正常执行。所以应当写成insert into books(name,email) values(‘kitty’,‘kitty@263.com’)。

  19、问题:什么是ActiveX 控件? 在哪里可以得到这些ActiveX控件?

  答:Microsoft ActiveX控件是由软件提供商开发的可重用的软件组件。除了ASP的内嵌对象外,另外安装进来的ActiveX控件也可以在ASP中使用,这样可以节省许多宝贵的开发时间,在ASP中其实也内嵌了很多的ActiveX控件可以使用。

  使用ActiveX控件,可以很快地Web应用程序、以及开发工具中加入特殊的功能。例如,使用AdRotator对象来制作广告滚动板,使用FileSystemObject对象进行文件存取,使用Marquee对象实现滚动文字。

  现在,已有1000多个商用的ActiveX控件,开发ActiveX控件可以使用各种编程语言,如C,C++等,以及微软公司的 Visual Java开发环境Microsoft Visual J++。 ActiveX控件一旦被开发出来,设计和开发人员就可以把它当作预装配组件,用于开发客户程序。以此种方式使用 ActiveX控件,使用者无需知道这些组件是如何开发的,在很多情况下,甚至不需要自己编程,就可以完成网页或应用程序的设计。

  目前由第三方软件开发商提供的商用控件有1000多种。微软ActiveX组件库(ActiveX Component Gallery)中存着有关信息以及相关的连接,它们指向微软及第三方开发商提供的各种 ActiveX 控件。在微软ActiveX组件库(ActiveX Component Gallery)中,可以找到开发Internet增强型ActiveX 控件的公司列表。
  20、问题:为什么使用strStartPort=(Request.Form ("catmenu_0")语句取到表单中起始站点的值在数据库却找不到?

  答:这是因为取到的起始站点的值可能有空格,比如原意是“杭州”,但是由于空格存在,ASP程序取到的值可能就是“ 杭州”,而数据库中只有“杭州”的记录,当然就找不到了,解决的方法是利用Trim 函数将字符串两头空格全部去除,相应的语句为:
strStartPort=TRIM(Request.Form("catmenu_0"))

  21、问题:在ASP中当变量的生命周期结束后,有几种保留变量内容的方法?

  答:任何导致网页结束的操作,比如当按下浏览器的“刷新”按钮,或者关闭了浏览器,再重新打开它,都会导致变量生命周期的结束。

  如果希望在网页结束执行时,还能够保留变量的内容,以备下一次执行时使用,就可以借助Application对象来实现。比如可以利用Application对象来制作统计网站访问量的计数器。

  Session对象跟Application对象一样,可以在网页结束时将变量的内容存储下来,但是与Application对象不同的是,每个联机是一个独立的Session对象,简单地说就是所有联机上网者只会共享一个Application对象,但每位联机上网者却会拥有自己的Session对象。

  Application对象与Session对象可以帮我们把信息记录在服务器端,而Cookies对象则会借助浏览器提供的Cookies功能将信息记录在客户端。有一点要注意,Cookies是记录在浏览器的信息,所以数据的存取并不象存取其他ASP对象(信息存储在Server端)那么简单,就实际运行来看,只有在浏览器开始浏览Server的某一网页,而Server尚未下载任何数据给浏览器之前,浏览器才能够与Server进行Cookies数据的交换。

  22、问题:对象使用完后应该怎么办?

  答:当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为“nothing”来释放对象占用的内存,否则会因为对象太多导致WEB服务站点运行效率降低乃至崩溃,相应语句如下:

  < %
  对象.close
  set对象= nothing
  % >


23、问题:在ASP文件中读取HTML的表单字段有几种方法?

  答:Request对象除了可以用来读取附带在网址后面的参数以外,也可以读取HTML表单字段的内容,经常使用的语法结构如下:

  < Form name =Formname method=“Get|Post”Action=“URL”>< Form >
其中的method可以接受Get或Post两种传输的方法,其中的Post是允许传输大量数据的方法,而Get方法会将所要传输的数据附在网址后面,然后一起送达服务器,因此传送的数据量就会受到限制,但是执行效率却比Post方法好。

  使用Get或Post方法都可以将数据送至服务器,使用Request对象接收数据的相对应方法如下:

  Get:Request.QueryString(“字段名称”),也可以写成Request (“字段名称”)
  Post:Request.Form (“字段名称”),也可以写成Request (“字段名称”)

  24、问题:如何提高使用Request集合的效率?

  答:在使用Request集合时,由于包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量。

  25、问题:在ASP页面中既可以使用VBScript,也可以使用Jscript,混合使用脚本引擎好吗?

  答:虽然在ASP页面中既可以使用VBScript,也可以使用JScript。但是在同一个页面上同时使用JScript和VBScript则是不可取的。因为服务器必须实例化并尝试缓存两个(而不是一个)脚本引擎,这在一定程度上增加了系统负担。因此,从性能上考虑,不应在同一页面中混用多种脚本引擎。

  26、问题:当我们建立了一个ASP文件,并且符合语法时,通过浏览器输入以下地址,或通过资源管理器打开浏览:c:\inetpub\wwwroot\a.asp,将出现无法运行的错误,并提示权限不对或文件无法访问,为何不能正常运行ASP文件?

  答:这是因为ASP文件首先要求站点是具备“执行(脚本)”属性的;然后要求按照URL格式输入地址,而不是DOS格式,我们需要在电脑上安装好并启动Web服务平台,并确保ASP文件存放在Web服务器的虚拟目录下,就可以通过HTTP的格式来浏览,在浏览器的地址栏输入:“http:// Web站点名称(或站点的IP地址)/ASP文件名称”,回车后就可以在浏览器中看到服务器执行ASP文件的结果。

  27、问题:什么是ASP.NET?它与ASP有什么关系?

  答:Active Server Pages(ASP,活动服务器页面)就是一个比较简单编程环境,在其中,可以混合使用HTML、脚本语言以及少量组件来创建服务器端的Internet应用程序;

  ASP.NET是微软力推的功能强大的编程环境,可以使用C#等多种高级语言及脚本语言、HTML、XML、XSL等来创建基于网络的应用程序。ASP.NET将C#作为一种面向对象语言,在很多方面来看,C#将成为微软的与Java相似的语言。 C#是ASP.NET开发中一个最重要的功能,微软会将C#发展成为Java的强劲对手。这也是微软.Net框架的一个重要组成部分。我认为C#是微软在编程语言领域击败对手的主要工具。

  ASP.NET在面向对象性、数据库连接、大型站点应用等方面都优于ASP程序,ASP.NET还提供更多的其他方面的新特性,例如:内置的对象缓存和页面结果缓存;内置的XML支持,可用于XML数据集的简单处理;服务器控制提供了更充分的交互式制等。

  ASP.NET依然完全锁定在微软的操作系统中,要真正发挥ASP.NET潜力,你要使用C#或vb.net。这两种语言将成为ASP.NET标准的核心的脚本语言。


 

ASP常见问题及解答

1.如何 最小化、最大化、关闭窗口
答:<objectid=hh1classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<paramname="command"value="minimize"></object>
<objectid=hh2classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<paramname="command"value="maximize"></object>
<objectid=hh3classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<paramname="command"value="close"></object>

<inputtype=buttonvalue=最小化onclick=hh1.click()>
<inputtype=buttonvalue=最大化onclick=hh2.click()>
<inputtype=buttonvalue=关闭onclick=hh3.click()>

2.如何静止页面缓存
答:htm网页
<metahttp-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control"content="no-cache,must-revalidate">
<metahttp-equiv="expires"content="wed,26feb199708:21:57gmt">
或者<metahttp-equiv="expires"content="0">
asp网页
response.expires=-1
response.expiresabsolute=now()-1
response.cachecontrol="no-cache"
php网页
header("expires:mon,26jul199705:00:00gmt");
header("cache-control:no-cache,must-revalidate");
header("pragma:no-cache");

3.如何检查一段字符串是否全由数字组成
<scriptlanguage="javascript"><!--
functionchecknum(str){returnstr.match(/\d/)==null}
alert(checknum("1232142141"))
alert(checknum("123214214a1"))
//--></script>

4.如何获取机器信息
答本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=request.servervariables("server_name")%>
服务器ip<%=request.servervariables("local_addr")%>
服务器端口<%=request.servervariables("server_port")%>
服务器时间<%=now%>
iis版本<%=request.servervariables"server_software")%>
脚本超时时间<%=server.scripttimeout%>
本文件路径<%=server.mappath(request.servervariables("script_name"))%>
服务器cpu数量<%=request.servervariables("number_of_processors")%>
服务器解译引擎<%=scriptengine&"/" & scriptenginemajorversion &"." &

scriptengineminorversion & "." & scriptenginebuildversion%>
服务器操作系统<%=request.servervariables("os")%>

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

14:23:01Z  得分:3 
 
 
?
1.如何让日期相减
日期减去天数等于第二个日期
<scriptlanguage=javascript>
functioncc(dd,dadd)
{
//可以加上错误处理
vard=newdate(dd.replace("-","/"))
d.setdate(d.getdate()+dadd)
alert(d.getfullyear()+"年"+(d.getmonth()+1)+"月"+d.getdate()+"日")
}
cc("2002-2-28",2)
</script>

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

14:25:16Z  得分:2 
 
 
?
1.怎样通过asp的手段来检查来访者是否用了代理
<%ifrequest.servervariables("http_x_forwarded_for")<>""then
response.write"<fontcolor=#ff0000>您通过了代理服务器,"&_
"真实的ip为"&request.servervariables("http_x_forwarded_for")
endif
%>

 
Top
 
 回复人: inelm(木野狐) ( ) 信誉:133  2003-11-07 14:51:43Z  得分:0 
 
 
?
分类:    错误及常见错误代码
问题描述: 网页错误,无法显示。
解决办法:

1) 服务器端配置 iis 中 “允许客户端调试”,“发送具体的asp 错误"
2) 客户端 ie -> 工具 -> Internet 选项 -> 高级 -> 把 "显示友好http 错误”这个

选项去掉
这样就能看到错误信息了。

 
Top
 
 回复人: summercat(飘轩) ( ) 信誉:110  2003-11-07 15:05:34Z  得分:3 
 
 
?
获得窗口的大小
document.body.clientWidth,document.body.clientHeight
document.body.offsetWidth,document.body.offsetHeight

 
Top
 
 回复人: summercat(飘轩) ( ) 信誉:110  2003-11-07 15:06:49Z  得分:2 
 
 
?
判断一个表是否存在:
if exists (select * from dbo.sysobjects where id = object_id('表名') and

OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table 表名
GO
从publish 表中取出第 n 条到第 m 条的记录:
SELECT TOP m-n+1 *
FROM publish
WHERE (id NOT IN
     (SELECT TOP n-1 id
     FROM publish))

id 为publish 表的关键字

 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:09:15Z  得分:2 
 
 
?
http://www.tjhgc.com/xxrl.zip

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

15:09:43Z  得分:2 
 
 
?
分类:    js程序

1.如何实现连续滚动

<div id="marquees"><br/><br/>

数据里面读出来的<br/>
</div>

<script language="JavaScript">

marqueesHeight=200;
stopscroll=false;

with(marquees){
  style.width=0;
  style.height=marqueesHeight;
  style.overflowX="visible";
  style.overflowY="hidden";
  noWrap=true;
  onmouseover=new Function("stopscroll=true");
  onmouseout=new Function("stopscroll=false");
}
document.write('<div id="templayer" style="position:absolute;z-

index:1;visibility:hidden"></div>');

preTop=0; currentTop=0;

function init(){
  templayer.innerHTML="";
  while(templayer.offsetHeight<marqueesHeight){
    templayer.innerHTML+=marquees.innerHTML;
  }
  marquees.innerHTML=templayer.innerHTML+templayer.innerHTML;
  setInterval("scrollUp()",10);
}
document.body.onload=init;

function scrollUp(){
  if(stopscroll==true) return;
  preTop=marquees.scrollTop;
  marquees.scrollTop+=1;
  if(preTop==marquees.scrollTop){
    marquees.scrollTop=templayer.offsetHeight-marqueesHeight;
    marquees.scrollTop+=1;
  }
}
</script>


 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:12:10Z  得分:3 
 
 
?
只针对图片:

<form name=form1 onsubmit="return mm()">
<input type=file name=meizz><br/>
<input type=submit value=submit></form>

<SCRIPT LANGUAGE="JavaScript"><!--
function mm()
{
  var s = document.form1.meizz.value;
  if(s=="")return false;
  var img = new Image();
  img.src = s;
  alert("高 = "+ img.height + "\n宽 = "+ img.width);
  alert("fileSize = "+ img.fileSize +" 字节");
  return(img.fileSize <= 40000);
}
//--></SCRIPT>

 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:13:42Z  得分:3 
 
 
?
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键
<table border oncontextmenu=return(false)><td>no</table> 可用于Table

2. <body onselectstart="return false"> 取消选取、防止复制

3. onpaste="return false" 不准粘贴

4. oncopy="return false;" oncut="return false;" 防止复制

5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标

7. <input style="ime-mode:disabled"> 关闭输入法

8. 永远都会带着框架
<script language="javascript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// --></script>

9. 防止被人frame
<SCRIPT LANGUAGE=javascript><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>

10. <noscript><iframe src=*.html></iframe></noscript> 网页将不能被另存为

11. <input type=button value=查看网页源代码
onclick="window.location = 'view-source:'+ 'http://www.csdn.net/'">

12. 怎样通过asp的手段来检查来访者是否用了代理
<% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
response.write "<font color=#FF0000>您通过了代理服务器,"& _
"真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
%>

13. 取得控件的绝对位置

//javascript
<script language="javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"\nleft="+l);
}
</script>

//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>

14. 光标是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart('character',e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">

15. 判断上一页的来源
asp:
request.servervariables("HTTP_REFERER")

javascript:
document.referrer

16. 最小化、最大化、关闭窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="Close"></OBJECT>

<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE

17.
<%
'定义数据库连接的一些常量
Const adOpenForwardOnly = 0 '游标只向前浏览记录,不支持分页、Recordset、

BookMark
Const adOpenKeyset = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,

但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
Const adOpenDynamic = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修

改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
Const adOpenStatic = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,

增加或删除记录都不会反映到记录集中。支持向前或向后移动

Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改
Const adLockPessimistic = 2 '当编辑时立即锁定记录,最安全的方式
Const adLockOptimistic = 3 '只有在调用Update方法时才锁定记录集,而在此前的其

他操作仍可对当前记录进行更改、插入和删除等
Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是

在批处理方式下完成的

Const adCmdText = &H0001
Const adCmdTable = &H0002
%>

18. 网页不会被缓存
HTM网页
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">
ASP网页
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 1
Response.cachecontrol = "no-cache"
PHP网页
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

19. 检查一段字符串是否全由数字组成
<script language="javascript"><!--
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

20. 获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight

21. 怎么判断是否是字符
if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

22.TEXTAREA自适应文字行数的多少
<textarea rows=1 name=s1 cols=27

onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>

23. 日期减去天数等于第二个日期
<script language=javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() +

"日")
}
cc("12/23/2002",2)
</script>

24. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>

25.获得本页url的request.servervariables("")集合
Response.Write "<TABLE border=1><!-- Table Header --

><TR><TD><B>Variables</B></TD><TD><B>value</B></TD></TR>"
for each ob in Request.ServerVariables
Response.Write "<TR><TD>"&ob&"</TD><TD>"&Request.ServerVariables(ob)

&"</TD></TR>"
next
Response.Write "</TABLE>"

26.
本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables"SERVER_SOFTWARE")%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎<%=ScriptEngine & "/"& ScriptEngineMajorVersion

&"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统<%=Request.ServerVariables("OS")%>

27.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

28. 检测某个网站的链接速度:
把如下代码加入<body>区域中:
<script language=javascript>
tim=1
setInterval("tim++",100)
b=1

var autourl=new Array()
autourl[1]="www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]="www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="www.cctv.com"

function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》

<input type=text name=url"+i+" size=40> =》<input type=button value=GO

onclick=window.open(this.form.url"+i+".value)><br/>")
document.write("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)document.write("<img

src=http://"+autourl[i]+"/"+Math.random()+" width=1 height=1 onerror=auto

('http://";+autourl[i]+"')>")}
run()</script>

29. 各种样式的光标
auto :标准光标
default :标准箭头
hand :手形光标
wait :等待光标
text :I形光标
vertical-text :水平I形光标
no-drop :不可拖动光标
not-allowed :无效光标
help :?帮助光标
all-scroll :三角方向标
move :移动标
crosshair :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize


 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:31:18Z  得分:3 
 
 
?
键盘触发事件
http://expert.csdn.net/Expert/topic/1465/1465399.xml?temp=.3390619
SQL 攻击
http://expert.csdn.net/Expert/topic/1498/1498450.xml?temp=.5907099
outerHTML and innerHTML
http://expert.csdn.net/Expert/topic/1627/1627154.xml?temp=.2553369
列表框间选项间移动的脚本
http://expert.csdn.net/Expert/topic/2142/2142148.xml?temp=1.272219E-02
限制只能输入数字和小数点
http://expert.csdn.net/Expert/topic/2293/2293880.xml?temp=.387417
无组件上传类
http://expert.csdn.net/Expert/topic/1348/1348149.xml?temp=.7916529
日历控件
http://expert.csdn.net/Expert/topic/1473/1473298.xml?temp=.1580011
如何调用[文件另存为... ]对话框?
http://expert.csdn.net/Expert/topic/1492/1492264.xml?temp=.4600031

 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:38:07Z  得分:3 
 
 
?
一个我刚刚学习asp时候天天看,天天学的例子,学了好长时间才精通这个程序
http://www.codeproject.com/asp/ute/ute_301.zip
介绍在:
http://www.codeproject.com/asp/ute.asp

一个我刚刚学习asp写日历程序时候的经典例子,也学习了2天,感觉很好
http://www.codeproject.com/asp/ezevents/EzEvents_src.zip
介绍在:
http://www.codeproject.com/asp/ezevents.asp
一句话:老外玩模块化编程就是牛,玩面向对象也是牛!而我!水牛!

 
Top
 
 回复人: awaysrain(绝对零度)(新的一年,新的开始) ( ) 信誉:155  2003-11-07

15:38:27Z  得分:0 
 
 
?
强烈推荐xxrl(孔曰成仁,孟曰取E)的http://www.tjhgc.com/xxrl.zip这个东西,东东

多多啊


 
Top
 
 回复人: stefli((桂电)) ( ) 信誉:106  2003-11-07 15:43:05Z  得分:3 
 
 
?
收藏中...................................
俺也来个
图片显示控制:
<script language="JavaScript">
<!--
var flag=false;
function DrawImage(ImgD){
   var image=new Image();
   image.src=ImgD.src;
   if(image.width>0 && image.height>0){
    flag=true;
    if(image.width/image.height>= 360/270){
     if(image.width>360){ 
     ImgD.width=360;
     ImgD.height=(image.height*360)/image.width;
     }else{
     ImgD.width=image.width; 
     ImgD.height=image.height;
     }
     ImgD.alt=image.width+"×"+image.height;
     }
    else{
     if(image.height>270){ 
     ImgD.height=270;
     ImgD.width=(image.width*270)/image.height;    
     }else{
     ImgD.width=image.width; 
     ImgD.height=image.height;
     }
     ImgD.alt=image.width+"×"+image.height;
     }
    }
}
//-->
</script>

 

调用格式:
<img src="a.gif" onload="javascript:DrawImage(this);"

 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 15:54:54Z  得分:3 
 
 
?
用asp把doc转换成html
doc2html.vbs

'**********************************************************
'
'    调用方法:doc2html c:\doc2html c:\doc2html
'    调用方法:doc2html -s c:\doc2html\a.doc c:\doc2html
'
'**********************************************************

Dim Objword
Dim Objdoc
Dim Objfso
Dim Strsource
Dim Strtarget
Dim Bbatch

'得到命令行参数,有三种可能的格式:[-s] 要进行转换的源文件目录或文件 转换成

Html文件后保存的目录
Function Getparams()
Dim Objarg
     If Wscript.Arguments.Count >= 2 Then
          If  Wscript.Arguments.Item(0) = "-s" Or Wscript.Arguments.Item(0) =

"-S" Then
               Strsource = Wscript.Arguments.Item(1)
               Strtarget = Wscript.Arguments.Item(2)
               Bbatch = False
          Else
               Strsource = Wscript.Arguments.Item(0)
               Strtarget = Wscript.Arguments.Item(1)
               Bbatch = True
          End If
     Else
          Wscript.Quit(1)
     End If
End Function

Function Batchprocessing()
Dim Objfolder
Dim Objfile
Dim Lpos
Dim Strfilename
     Lpos = 0
     Set Objfolder = Objfso.Getfolder(Strsource)
     For Each Objfile In Objfolder.Files
          Lpos = Instr(1,Mid(Objfile.Path,Len(Objfile.Path) - 3,4),"Doc",1)
          If Lpos > 0 Then
               Strfilename = Objfso.Getbasename(Objfile.Path)
               Wordinterface Objfile.Path,Strfilename
          End If
     Next
End Function


Function Singleprocessing()
Dim Objfile
     Set Objfile = Objfso.Getfile(Strsource)
     Strfilename = Objfso.Getbasename(Objfile.Path)
     Wordinterface Objfile.Path,Strfilename
End Function

Function Wordinterface(Strfilename,Formattedfilename)
     Objword.Documents.Open Strfilename
     Set Objdoc = Objword.Activedocument
     'Stop
     'set The Title Of The Document To Match The Filename
     Objdoc.Builtindocumentproperties(1) = Formattedfilename
     '1 = Wdpropertytitle In Vba

     Objdoc.Saveas Strtarget & "\" & Formattedfilename & ".htm",8
     'objdoc.Saveas "C:\Doc2Html\" & Formattedfilename & ".htm",8
     On Error Resume Next
     Objdoc.Close
End Function

'stop
Set Objfso = Createobject("Scripting.FileSystemObject")
Set Objword = Createobject("Word.Application")
Objword.Visible = False
Call Getparams

If Bbatch Then
     Call Batchprocessing
Else
     Call Singleprocessing
End If

Objword.Quit
Set Objword = Nothing


 
Top
 
 回复人: quady(这个世界好难混) ( ) 信誉:97  2003-11-07 16:52:46Z  得分:0 
 
 
?
都是精华啊!建议新人多来看看。

 
Top
 
 回复人: xxrl(孔曰成仁,孟曰取E) ( ) 信誉:112  2003-11-07 17:16:06Z  得分:0 
 
 
?
i'll go home see you later.

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

17:17:58Z  得分:3 
 
 
?
1.自己写的将小写金额换成大写

<%
'****人民币大小写转换格式****
dim str(9)
str(0)="零"
str(1)="壹"
str(2)="贰"
str(3)="叁"
str(4)="肆"
str(5)="伍"
str(6)="陆"
str(7)="柒"
str(8)="捌"
str(9)="玖"
aa=Request.form("source")
hh=formatnumber(aa,2,-1)
aa=replace(hh,".","")
aa=replace(aa,",","")
for i=1 to len(aa)
s=mid(aa,i,1)
mynum=str(s)
select case(len(aa)+1-i)
case 1: k= mynum&"分"
case 2: k= mynum&"角"
case 3: k= mynum&"元"
case 4: k= mynum&"拾"
case 5: k= mynum&"佰"
case 6: k= mynum&"仟"
case 7: k= mynum&"万"
case 8: k= mynum&"拾"
case 9: k= mynum&"佰"
case 10: k= mynum&"仟"
end select
m=m&k
next
%>


<html>
<head>
<title>数字转换</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<!--
Elseif(s=".") then
n=m
i=i+2
for j=i to len(aa)
s=mid(aa,i,1)
mynum=str(s)
select case(len(aa)+1-i)
case 1: p= mynum&"分"
case 2: p= mynum&"角"
end select
m=m&p
next
-->

<body bgcolor="#FFFFFF">
<form method="post" name="forma">
<input type="text" name="source" value="<%=hh%>">
=
<input type="text" name="result" value="<%=m%>" size="40">

<input type="submit" name="Submit" value="提交 " >
</form>
</body>
</html>

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

17:22:25Z  得分:3 
 
 
?
'获取中文字符串拼音首字母串的函数
<%
response.write "<link href=style.css rel=stylesheet>"
if request.form("content")="" then
response.write "<center><form method=post action=""""><input name=content

type=text>__<input type=submit></form>"
else
function getpychar(char)
tmp=65536+asc(char)
if(tmp>=45217 and tmp<=45252) then
getpychar= "A"
elseif(tmp>=45253 and tmp<=45760) then
getpychar= "B"
elseif(tmp>=45761 and tmp<=46317) then
getpychar= "C"
elseif(tmp>=46318 and tmp<=46825) then
getpychar= "D"
elseif(tmp>=46826 and tmp<=47009) then
getpychar= "E"
elseif(tmp>=47010 and tmp<=47296) then
getpychar= "F"
elseif(tmp>=47297 and tmp<=47613) then
getpychar= "G"
elseif(tmp>=47614 and tmp<=48118) then
getpychar= "H"
elseif(tmp>=48119 and tmp<=49061) then
getpychar= "J"
elseif(tmp>=49062 and tmp<=49323) then
getpychar= "K"
elseif(tmp>=49324 and tmp<=49895) then
getpychar= "L"
elseif(tmp>=49896 and tmp<=50370) then
getpychar= "M"
elseif(tmp>=50371 and tmp<=50613) then
getpychar= "N"
elseif(tmp>=50614 and tmp<=50621) then
getpychar= "O"
elseif(tmp>=50622 and tmp<=50905) then
getpychar= "P"
elseif(tmp>=50906 and tmp<=51386) then
getpychar= "Q"
elseif(tmp>=51387 and tmp<=51445) then
getpychar= "R"
elseif(tmp>=51446 and tmp<=52217) then
getpychar= "S"
elseif(tmp>=52218 and tmp<=52697) then
getpychar= "T"
elseif(tmp>=52698 and tmp<=52979) then
getpychar= "W"
elseif(tmp>=52980 and tmp<=53640) then
getpychar= "X"
elseif(tmp>=53689 and tmp<=54480) then
getpychar= "Y"
elseif(tmp>=54481 and tmp<=62289) then
getpychar= "Z"
else '如果不是中文,则不处理
getpychar=char
end if
end function
function getpy(str)
for i=1 to len(str)
getpy=getpy&getpychar(mid(str,i,1))
next
end function
content=request.form("content")
response.write "<center>"&getpy(content)&chr(10)
response.write "<br><br><br><a href=# onclick=javascript:history.go(-1)>返回

</a>"
end if
%>

 
Top
 
 回复人: vivisogood(新人类~~~~(Fuck 小日本~~)) ( ) 信誉:100  2003-11-07

17:24:11Z  得分:3 
 
 
?
--------------------------------------------
ip限制函数
'******************************
'Function CheckIp(cInput_Ip,cBound_Ip)
'Created by qqdao, qqdao@263.net 2001/11/28
'说明:首先需要根据;号循环,然后判断是否含有"-",如果有则进行拆分处理,最后判

断是否在范围内
'参数: cInput_Ip,代检查的ip
' cBound_Ip,给定的范围格式为,单个ip,和范围ip,范围ip最后使用”-“分割,如果是

“*”则必须放到最后一位
'                每个范围后添加":ALLOW"表示允许登陆,添加":REFUSE"表示拒绝登

陆。多个范围用”;“隔开
'                 例如192.168.1*.*:ALLOW;192.168.1.1:ALLOW;192.168.1.1-

10:REFUSE"
'返回值: true/false
'更新:2001/12/05  支持ALLOW,REFUSE支持’*‘,不想对?支持,因为和*差不多
'******************************
function CheckIp(cInput_Ip,cBound_Ip)
dim cSingle_Ip,cTemp_IP,cStart_IP,cEnd_Ip
CheckIp = false
cSingle_Ip=split(cBound_Ip,";")

        for i=0 to ubound(cSingle_Ip)
            if Instr(cSingle_Ip(i),"REFUSE") <> 0 then    '就是拒绝了
                 cTemp_IP = left(cSingle_Ip(i),instr(cSingle_Ip(i),":")-1)
          
      if Instr(cTemp_IP,"*") <> 0 then  '是宽范围
          cStart_IP = left(cTemp_IP,instr(cTemp_IP,"*")-1)
          if left(cInput_Ip,len(cStart_IP))=cStart_IP then
           CheckIp = false
           exit function
          end if
             end if

      if Instr(cTemp_IP,"-") = 0 then
   cStart_IP = cTemp_IP
   cEnd_Ip   = cTemp_IP
      else
   cStart_IP = left(cTemp_IP,instr(cTemp_IP,"-")-1)
   cEnd_Ip   = left(cStart_IP,InStrRev(cStart_IP,".")-1)+"."+mid

(cTemp_IP,instr(cTemp_IP,"-")+1)
      end if

      if  Ip2Str(cInput_Ip)>=Ip2Str(cStart_IP) and Ip2Str(cInput_Ip)<=Ip2Str

(cEnd_Ip) then
          CheckIp = false
          exit function
      end if

     elseif Instr(cSingle_Ip(i),"ALLOW") <> 0 then    '允许
          
                 cTemp_IP = left(cSingle_Ip(i),instr(cSingle_Ip(i),":")-1)
         
      if Instr(cTemp_IP,"*") <> 0 then          '是宽范围
          cStart_IP = left(cTemp_IP,instr(cTemp_IP,"*")-1)
          if left(cInput_Ip,len(cStart_IP))=cStart_IP then
           CheckIp = true
          end if
             end if

      if Instr(cTemp_IP,"-") = 0 then
   cStart_IP = cTemp_IP
   cEnd_Ip   = cTemp_IP
      else
   cStart_IP = left(cTemp_IP,instr(cTemp_IP,"-")-1)
   cEnd_Ip   = left(cStart_IP,InStrRev(cStart_IP,".")-1)+"."+mid

(cTemp_IP,instr(cTemp_IP,"-")+1)
      end if

      if  Ip2Str(cInput_Ip)>=Ip2Str(cStart_IP) and Ip2Str(cInput_Ip)<=Ip2Str

(cEnd_Ip) then
          CheckIp =true
      else
          CheckIp =false
      end if
     end if
       next

end function

 
Top
 
 回复人: lovedogdog(天目湖鱼头) ( ) 信誉:99  2003-11-07 17:42:10Z  得分:0 
 
 
?
挖到宝贝了

 
Top
 
 回复人: whb147(dodo) ( ) 信誉:100  2003-11-07 17:45:33Z  得分:3 
 
 
?
取当前网页的地址全名,以便返回用
<%
Function GetUrl()
  On Error Resume Next
  Dim strTemp
 If LCase(Request.ServerVariables("HTTPS")) = "off" Then
  strTemp = "http://"
 Else
  strTemp = "https://"
  End If
  strTemp = strTemp & Request.ServerVariables("SERVER_NAME")
  If Request.ServerVariables("SERVER_PORT") <> 80 Then strTemp = strTemp &

":" & Request.ServerVariables("SERVER_PORT")
  strTemp = strTemp & Request.ServerVariables("URL")
  If Trim(Request.QueryString) <> "" Then strTemp = strTemp & "?" & Trim

(Request.QueryString)
  GetUrl = strTemp
End Function
'Response.write GetUrl()
url1=GetUrl()
url1=Server.URLEncode(url1)

%>

 
Top
 
 回复人: whb147(dodo) ( ) 信誉:100  2003-11-07 17:51:43Z  得分:5 
 
 
?
上传文件时,显示进度条程序

在需要引用进度条的也面上用
<script language="javascript" src="../ShowProcessBar.js"></script>

然后,
<input type="submit" value="开始上传" name="B1" IsShowProcessBar="True">
传参数 true

ShowProcessBar.js
——————————————————————————————————————

———
AddProcessbar();
var bwidth=0;
var swidth = document.all.waiting.clientWidth;

function CheckIsProcessBar(obj)
{
if (obj.IsShowProcessBar=="True")
{
return false;
}
else
{
return true;
}
}

function CheckClick(e)
{
if (e == 1)
{
if (bwidth<swidth*0.98){
bwidth += (swidth - bwidth) * 0.025;
if (document.all)document.sbar.width = bwidth;
else document.rating.clip.width = bwidth;
setTimeout('CheckClick(1);',1000);

}
}
else
{
if(document.all)
{
if(document.all.waiting.style.visibility == 'visible')
{document.all.waiting.style.visibility = 'hidden';
bwidth = 1;}
whichIt = event.srcElement;

while (CheckIsProcessBar(whichIt))
{
whichIt = whichIt.parentElement;
if (whichIt == null)return true;
}


document.all.waiting.style.pixelTop = (document.body.offsetHeight -

document.all.waiting.clientHeight) / 2 + document.body.scrollTop;
document.all.waiting.style.pixelLeft = (document.body.offsetWidth -

document.all.waiting.clientWidth) / 2 + document.body.scrollLeft;
document.all.waiting.style.visibility = 'visible';
if(!bwidth)CheckClick(1);
bwidth = 1;

}

else
{

if(document.waiting.visibility == 'show')
{document.waiting.visibility = 'hide';
document.rating.visibility = 'hide';
bwidth = 1;}
if(e.target.href.toString() != '')
{
document.waiting.top = (window.innerHeight - document.waiting.clip.height) /

2 + self.pageYOffset;
document.waiting.left = (window.innerWidth - document.waiting.clip.width) / 2

+ self.pageXOffset;
document.waiting.visibility = 'show';
document.rating.top = (window.innerHeight - document.waiting.clip.height) / 2

+ self.pageYOffset+document.waiting.clip.height-10;
document.rating.left = (window.innerWidth - document.waiting.clip.width) / 2

+ self.pageXOffset;
document.rating.visibility = 'show';
if(!bwidth)CheckClick(1);
bwidth = 1;
}
}
return true;
}
}

function AddProcessbar()
{

var Str=""
Str+= "<div id=waiting style=position:absolute;top:50px;left:100px;z-

index:1;visibility:hidden >";
Str+= "<layer name=waiting visibility=visible zIndex=2 >"
Str+= "<table border=2 cellspacing=1 cellpadding=0 bordercolorlight=#FFFFFF

bordercolordark=#C0C0C0 bgcolor=#E0E0E0>"
Str+= " <tr>"
Str+= " <td bgcolor=#E0E0E0 height=30px width=300px align=center>"
Str+= " <font color=black>数据正在处理中...</font>"
Str+= " </td>"
Str+= " </tr>"
Str+= " <tr>"
Str+= " <td bgcolor=#E0E0E0>"
Str+= " <img width=1 height=10 name=sbar style=background-color:#6699cc>"
Str+= " </td>"
Str+= " </tr>"
Str+= "</table> "
Str+= "</layer>"
Str+= "</div>"
document.write(Str)

if(document.all)document.onclick = CheckClick;
}


 
Top
 
 回复人: quady(这个世界好难混) ( ) 信誉:97  2003-11-07 18:13:22Z  得分:3 
 
 
?
既然是常见问题,我也来几个。
控制滚动:
=============

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>

<body style="margin:0px">
<table width="110" border="0" align="center" cellpadding="2" cellspacing="0"

height="300px">
  <tr>
    <td id="i">
<marquee id="mar" direction="up" behavior="slide" height="100px"

style="background-Color:#00ff00">
 <div style="background-Color:#ff0000" id="div">
      <p><a href="#">分类一</a></p>
      <p>分类二</p>
      <p>分类三</p>
      <p>分类四</p>
      <p>分类五</p>
      <p>分类六</p>
    </div>
</marquee>
<div id="div"></div>
 </td>
  </tr>
  <tr>
    <td>
      <input type="button" name="btnUp" value="向上" onMouseOver="UpScroll

();" onMouseOut="StopScroll();">
      <input name="btnDown" type="button" value="向下"

onMouseOver="DownScroll();" onMouseOut="StopScroll();">
    </td>
  </tr>
</table>
<script language="JavaScript">
var timer;
var mar = document.all.mar;
var div = document.all.div;
var h1 = div.offsetHeight;
var h2 = mar.height;
//向上移动
function UpMarquee(){
 if(mar.scrollTop>=h1)
  StopScroll();
 else 
  mar.scrollTop+=1;
}
function DownMarquee(){
 if(mar.scrollTop<=h2)
  StopScroll();
 else
  mar.scrollTop-=1;
 //alert(mar.scrollTop);
}
//循环调用向下移动函数
function UpScroll(){
 //alert(mar.scrollTop);
 //StopScroll();
 timer = setInterval('UpMarquee()',50);//循环调用
}
//循环调用向上移动函数
function DownScroll(){
 //StopScroll();
 timer = setInterval('DownMarquee()',50);//循环调用
}
//清除循环调用
function StopScroll(){
 clearInterval(timer);
}
</script>
</body>
</html>

=======================================================
检查时间:
================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
<script language="JavaScript">
function isValid(vlu)
{
 var tmp1 = "";
 var i = 0;
 var bool = true;
 vlu += ":";
 i = vlu.indexOf(":");
 tmp = vlu.substr(0,i);
 vlu = vlu.substr(i+1,vlu.length);
 bool = isErr(tmp) & isErr1(tmp) & isErr2(tmp);
 i = vlu.indexOf(":");
 tmp = vlu.substr(0,i);
 vlu = vlu.substr(i+1,vlu.length);
 bool &= isErr(tmp) & isErr1(tmp) & isErr3(tmp);
 i = vlu.indexOf(":");
 tmp = vlu.substr(0,i);
 vlu = vlu.substr(i+1,vlu.length);
 bool &= isErr(tmp) & isErr1(tmp) & isErr3(tmp);
 if(bool == true)
  alert("ok.");
 else
  alert("The time is incorrect.");
}
function isErr(vlu)
{
 var bool = vlu.indexOf("-") >= 0 ? false : true;
 bool &= vlu.indexOf(".") >= 0 ? false : true;
 return bool;
}
function isErr1(vlu)
{
 return isNaN(parseInt(vlu)) ? false : true;
}
function isErr2(vlu)
{
 return parseInt(vlu) > 23 ? false : true;
}
function isErr3(vlu)
{
 return parseInt(vlu) > 59 ? false : true;
}
//isValid("25:59:00");
</script>
</head>

<body>
<input name="txtTime" type="text" id="txtTime" value="09:05:59">
<input type="button" name="Submit" value="°&acute;&Aring;&yen;"

onClick="isValid(document.all.txtTime.value);">
</body>
</html>


 
Top
 
 回复人: quady(这个世界好难混) ( ) 信誉:97  2003-11-07 18:17:16Z  得分:3 
 
 
?
调用Css做颜色变换:
======================

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>&Icirc;&THORN;±ê&Igrave;&acirc;&Icirc;&Auml;&micro;&micro;</title>
<style type="text/css">
<!--
.red {
 background-color: #FF0000;
}
.blue {
 background-color: #0000FF;
}
.yellow {
 background-color: #FFFF00;
}
.green {
 background-color: #00FF00;
}
.black {
 background-color: #000000;
}
.white {
 background-color: #FFFFFF;
}
.cyan {
 background-color: #00FFFF;
}
.purple {
 background-color: #FF00FF;
}
-->
</style>
<script language="javascript">
var timer;
var arrColor = new Array

("red","green","yellow","blue","black","white","cyan","purple");
var index1 = 0;
var index2 = 7;
function ChangeColor1()
{
 for(var i=0; i<8; i++)
 {
  if(index1 == 8) index1 = 0;
  document.all('t'+(i+1)).className = arrColor[index1];
  document.all('b'+(i+1)).innerText = document.all('t'+

(i+1)).className;
  document.all('b'+(i+1)).style.color = arrColor[index1++];
 }
 if(index1 == 8) index1 = 0;
 index1++;
}
function ChangeColor2()
{
 for(var i=8; i>0; i--)
 {
  if(index2 == 0) index2 = 8;
  document.all('c'+i).className = arrColor[--index2];
  document.all('f'+i).innerText = document.all

('c'+i).className;
  document.all('f'+i).style.color = arrColor[index2];
 }
 if(index2 == 0) index2 = 8;
 --index2;
}
</script>
</head>

<body onLoad="setInterval('ChangeColor1()',500);setInterval('ChangeColor2

()',500);">
<table width="720" border="1" align="center" cellpadding="0" cellspacing="0">
  <colgroup>
   <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
 <col width="12.5%">
  </colgroup>
  <tr>
    <td id="t1" class="red" height="30">&nbsp;</td>
    <td id="t2" class="green">&nbsp;</td>
    <td id="t3" class="yellow">&nbsp;</td>
    <td id="t4" class="blue">&nbsp;</td>
    <td id="t5" class="black">&nbsp;</td>
    <td id="t6" class="white">&nbsp;</td>
    <td id="t7" class="cyan">&nbsp;</td>
    <td id="t8" class="purple">&nbsp;</td>
  </tr>
  <tr style="font-size:10px" align="center">
    <td id="b1" height="30">&nbsp;</td>
    <td id="b2">&nbsp;</td>
    <td id="b3">&nbsp;</td>
    <td id="b4">&nbsp;</td>
    <td id="b5">&nbsp;</td>
    <td id="b6">&nbsp;</td>
    <td id="b7">&nbsp;</td>
    <td id="b8">&nbsp;</td>
  </tr>
  <tr>
   <td colspan="8" height="100">&nbsp;</td>
  </tr>
  <tr>
    <td id="c1" class="red" height="30">&nbsp;</td>
    <td id="c2" class="green">&nbsp;</td>
    <td id="c3" class="yellow">&nbsp;</td>
    <td id="c4" class="blue">&nbsp;</td>
    <td id="c5" class="black">&nbsp;</td>
    <td id="c6" class="white">&nbsp;</td>
    <td id="c7" class="cyan">&nbsp;</td>
    <td id="c8" class="purple">&nbsp;</td>
  </tr>
  <tr style="font-size:10px" align="center">
    <td id="f1" height="30">&nbsp;</td>
    <td id="f2">&nbsp;</td>
    <td id="f3">&nbsp;</td>
    <td id="f4">&nbsp;</td>
    <td id="f5">&nbsp;</td>
    <td id="f6">&nbsp;</td>
    <td id="f7">&nbsp;</td>
    <td id="f8">&nbsp;</td>
  </tr>
</table>
</body>
</html>


 
Top
 
 回复人: luluso(luluso) ( ) 信誉:99  2003-11-07 18:22:49Z  得分:3 
 
 
?
见识了,呵呵强。
ASP中怎么运行一个服务器端程序呢
Set WShShell = Server.CreateObject("WScript.Shell")

RetCode = WShShell.Run("d:\xxx.exe", 1, True)

 
Top
 
 回复人: yangzixp(扬子.net) ( ) 信誉:100  2003-11-08 09:30:10Z  得分:3 
 
 
?
'-----------------------------------------------------------
'功能: 过虑HTML字符
'输入:字符串
'输出:经格式化后的字符串
function HTMLEncode(fString)
if not isnull(fString) then
    fString = replace(fString, ">", "&gt;")
    fString = replace(fString, "<", "&lt;")

    fString = Replace(fString, CHR(32)&CHR(32), "&nbsp;&nbsp;")
    fString = Replace(fString, CHR(9), "&nbsp;")
    fString = Replace(fString, CHR(34), "&quot;")
    fString = Replace(fString, CHR(39), "&#39;")
    fString = Replace(fString, CHR(13), "")
    fString = Replace(fString, CHR(10) & CHR(10), "</P><P> ")
    fString = Replace(fString, CHR(10), "<BR> ")

    HTMLEncode = fString
end if
end function

 
Top
 
 回复人: yangzixp(扬子.net) ( ) 信誉:100  2003-11-08 09:31:31Z  得分:3 
 
 
?
'参数:系统(如:product,article),条件(如果是数值,则默认为categoryID的值),排序,
'每页显示记录数,模式(more:显示更多字样,page:显示翻页导航),
'翻页导航模式(number:显示数字,page:显示上一页,下一页),记录显示模版名(显示记录

的过程名)
class List
 dim p_system '系统表,如tblProduct,tblArticle
 dim p_where '条件
  dim p_orderBy '排序
 dim p_recordCount '每页显示记录数
   dim p_horizontal '每行显示记录数
   dim p_mode '列表模式,参数:more(更多模式,显示更多字样),page(列表

模式,显示翻页导航)
   dim p_moreURL '更多模式时的URL 
 dim p_paginationMode '翻页导航模式,参数:number(数字导航,显示

如:1,2,3,4),page(翻页导航,显示如:上一页,下一页)
   dim p_models '列表模版过程
   dim p_table '列表的table标签
   dim p_page '页码
    dim p_member '是否显示会员产品
 dim p_groupWhere
 
  Private Sub Class_Initialize
     p_system=""
  p_where=""
  p_orderBy=" order by categoryID,orderBy,postdate"
  p_recordCount=15
  p_horizontal=4
  p_mode=""
  p_moreURL=""
  p_paginationMode="page"
  p_models=""
  p_table="<table width=100% border=0 align=center

cellpadding=0 cellspacing=0 bordercolor=#CCCCCC  style='border-collapse:

collapse'>"
  p_page=1
  p_member=false
  p_groupWhere="groupID=0"
 End Sub
 
   Property Let system(value)
  p_system=value
 end property
   Property Let where(value)
  if isInt(value) then
   p_where=" where categoryID="&value
  else
   p_where=" where ("&value&")"
  end if
 end property
   Property Let orderBy(value)
  p_orderBy=" order by "&value
 end property
   Property Let recordCount(value)
  p_recordCount=value
 end property
   Property Let horizontal(value)
  p_horizontal=value
 end property
   Property Let mode(value)
  p_mode=value
 end property
   Property Let moreURL(value)
  p_moreURL=value
 end property
   Property Let paginationMode(value)
  p_paginationMode=value
 end property
   Property Let models(value)
  p_models=value
 end property
   Property Let table(value)
  p_table=value
 end property
   Property Let page(value)
  if getNumeric(value)<1 then
   p_page=1
  else
   p_page=int(value)
  end if
 end property
   Property Let member(value)
 
  p_member=value
  
  if p_member then
   authorizationID=getValue

("tblMember","authorizationID","memberID="&session("memberID"))
   if authorizationID="" or authorizationID=0 then
    authorizationID=getValue

("tblGroup","authorizationID","groupID="&session("groupID"))
   end if
   virtual=getValue

("tblAuthorization","virtual","authorizationID="&authorizationID)
   authArr=split(virtual,",")
   for i=0 to ubound(authArr)
    if i=0 then
     p_groupWhere="groupID="&getValue

("tblGroup","groupID","authorizationID="&authArr(i))
    else
     p_groupWhere=p_groupWhere&" or

groupID="&getValue("tblGroup","groupID","authorizationID="&authArr(i))
    end if
   next
  else
   p_groupWhere="groupID=0"
  end if
 end property
 
 '列表过程
 public sub List()
  dim rs
  dim where
  
  if p_where="" then
   where=" where "&p_groupWhere&" and publish=1"
  else
   where=p_where&" and ("&p_groupWhere&") and publish=1"
  end if

 

  strSql="select * from "&p_system&where&p_orderBy
  'response.write strSql
  'response.end
  set rs=getRecord(strSql)
 
  if rs.eof then
   response.write convertEncode(lgeNoRecord,gb,language)
   exit sub
  end if
 
  rs.pageSize=p_recordCount
  
  if rs.pagecount<p_page then p_page=rs.pagecount
  
  rs.AbsolutePage=p_page
 
  dim ii
  response.write p_table
  for i=1 to p_recordCount
   if rs.eof then
    exit for
   end if
   response.write "<tr>"
   for ih=0 to p_horizontal
    if ii=p_recordCount then
     exit for
    end if
    if rs.eof then
     response.write "<td width=" & 1/

(p_horizontal+1)*100 & "% >&nbsp;</td>"
    else
     response.write "<td width=" & 1/

(p_horizontal+1)*100 & "% >"
     execute "call " & p_models
     response.write "</td>"
     rs.movenext
    end if
    ii=ii+1
   next
   response.write "</tr>"
  next
  response.write "</table>"

  if p_mode="more" then
   response.write "<div align=right>"&p_moreURL&"</div>"
  end if
  if p_mode="page" then
   response.write "<table width=100% border=0

cellspacing=0 cellpadding=3><tr><td align=right>"
   call pagination

(p_page,rs.recordCount,rs.pageCount,p_paginationMode)
   response.write "</td></tr></table>"
  end if
 end sub
end class
'-------------------------------列表过程结束--------------------------------

-----------------------------

 
Top
 
 回复人: zhanghao5188(linux) ( ) 信誉:100  2003-11-08 10:00:24Z  得分:0 
 
 
?
精華,建義寫一本書!呵呵!

 
Top
 
 回复人: xiaoxo(iei) ( ) 信誉:95  2003-11-08 10:47:00Z  得分:2 
 
 
?
当我第一次浏览该网页news.asp时可以。但我刷新一下出现下面的错误
-------------------------------------------
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21'

ODBC 驱动程序不支持所需的属性。

/sql/news.asp,行5

-----------------------------------------------------
我的conn.asp 是这样的。
<%
set conn =server.CreateObject ("adodb.connection")
conn.Open "driver={SQL Server};server=

(local);uid=news;password=2222;database=news"
%>

该news.asp
<!--#include file="conn.asp" -->
<%
set rs=server.createobject("adodb.recordset")
sql="select * from newsType where flag=1"
rs.open sql,conn,1,1
%>
<body>
<%=rs("typeid")%>
<% rs.close
set rs=nothing
%></body>

然后我在conn.asp的文件里加了这句话<%on error resume next%>‘就可以了。
<!--#include file="conn.asp" -->
<%on error resume next%>‘就是这句话'
<%
set rs=server.createobject("adodb.recordset")
sql="select * from newsType where flag=1"
rs.open sql,conn,1,1
%>
<body>
<%=rs("typeid")%>
<% rs.close
set rs=nothing%>

该news.asp
<!--#include file="conn.asp" -->
<%on error resume next%>‘这句话"
<%
set rs=server.createobject("adodb.recordset")
sql="select * from newsType where flag=1"
rs.open sql,conn,1,1
%>
<body>
<%=rs("typeid")%>
<% rs.close
set rs=nothing
%></body>

 
UBB转换:
http://expert.csdn.net/Expert/topic/1360/1360322.xml?temp=.9789087

屏蔽后退键:
http://expert.csdn.net/Expert/topic/1556/1556985.xml?temp=.4249231

生成XML文件:
http://search.csdn.net/expert/topic/3/306/2002/4/15/649096.htm