asp的日期和时间函数介绍

十二月 29, 2008 作者:FDS   类别:ASP 已经有215次浏览

通过asp的函数得到日期和时间,可以使用日期和时间函数来得到各种格式的日期和时间。

函数 语法 说明 示例
Now Now() 取得系统当前的日期和时间 Dim MyVar MyVar = Now
‘MyVar 包含当前的日期和时间。
Date Date() 取得系统当前的日期 Dim MyDate MyDate = Date
‘MyDate 包含当前系统日期。
Time Time() 取得系统当前的时间 Dim MyTime MyTime = Time
‘返回当前系统时间。
Year Year(Date) 取得给定日期的年份 Dim MyDate, MyYear
MyDate = #October 19, 1962#
‘分派一日期。

MyYear = Year(MyDate)
‘MyYear 包含 1962。

Month Month(Date) 取得给定日期的月份 Dim MyVar MyVar = Month(Now)
‘MyVar包含当前月对应的数字。
Day Day(Date) 取得给定日期是几号 Dim MyDay MyDay = Day(“October 19, 1962″)
‘MyDay包含 19。
Hour Hour(time) 取得给定时间是第几小时 Dim MyTime, MyHour
MyTime = Now MyHour = Hour(MyTime)
‘MyHour 包含代表当前时间的数值。
Minute Minute(time) 取得给定时间是第几分钟 Dim MyVar
MyVar = Minute(Now)
Second Second(time) 取得给守时间是第几秒 Dim MySec
MySec = Second(Now)
‘MySec 包含代表当前秒的数字。
WeekDay WeekDay(Date) 取得给定日期是星期几的整数,1表示星期日,2表示星期一,依此类推 Dim MyDate, MyWeekDay
MyDate = #October 19, 1962#
‘分派日期

MyWeekDay = Weekday(MyDate)
‘MyWeekDay包含 6,MyDate 代表星期五

DateDiff DateDiff(“Var”,Var1,Var2)
Var:日期或时间间隔因子,有如下参数:
yyyy 年 m月 d 日 ww星期 h小时 s秒Var1:第一个日期或时间
Var2:第二个日期或时间,比Var1晚
计算两个日期或时间的间隔 DateDiff(“d”,Date(),#1/1/2005#)
‘返回离2005元旦还有多少

DateDiff(“h”,Date(),#1/1/2005#)
‘返回离2005元旦还有多少小时
DateDiff(“d”,#1/1/2003#,#1/1/2005#)
‘返回两个日期之间的天数

DateAdd DateDiff(“Var”,Var1,Var2)
Var:日期或时间间隔因子:
Var1:日期或时间间隔倍数
Var2:日期或时间的基准
对两个日期或时间作加法 如下示例将 95 年 1 月 31 日加上一个月:NewDate = DateAdd(“m”, 1, “31-Jan-95″)在这个示例中,DateAdd 返回 95 年 2 月 28 日,而不是 95 年 2 月 31 日。如果 date 为 96 年 1 月 31 日,则返回 96 年 2 月 29 日,这是因为 1996 是闰年。如果计算的日期是在公元 100 年之前,则会产生错误。
FormatDateTime FormatDateTime(Date,vbShortDate) 转化为短日期格式 FromatDateTime(Date(),vbLongDate)
“以长日期格式显示
  FormatDateTime(Date,vbLongDate) 转化为长日期格式
  FormatDateTime(Date,vbShortTime) 转化为短时间格式
  FormatDateTime(Date,vbLongTime) 转化为长时间格式

ASP生成静态html页面简单实例

十二月 29, 2008 作者:FDS   类别:ASP 已经有343次浏览

为了SEO,静态化页面是一个重要的步骤,这里介绍一个ASP生成静态html页面简单实例,比较易懂,看以下代码,可以亲自试试看,让后自己在改变下。

createhtml.asp
<%
filename=”test.html”
if request(“body”)<>”" then
set fso = Server.CreateObject(“Scripting.FileSystemObject”)
set fout = fso.CreateTextFile(server.mappath(“”&filename&”"))
fout.write “标题(title):” & request.form(“title”) & “<br>”
fout.write “内容(body):” & request.form(“body”)
fout.close
set fout=nothing
set fso=nothing
end if
%>
<form name=”form1″ method=”post” action=”">
<input name=”title” size=18><br>
  <textarea name=”body”></textarea>
  <br>
  <br>
  <input type=”submit” name=”Submit” value=”生成”>
</form>


然后在浏览器输入打开createhtml.asp这个页面,填写完毕后,就会生成test.html这个文件,里面的内容就是你刚才填写的。

使用ping命令排查网络故障

十二月 24, 2008 作者:FDS   类别:计算机网络 已经有205次浏览

当你的网络出现故障或无法连通时,如何才能简单高效的找出故障?其实只需要一个ping命令,就可以判断TCP/IP协议故障……在“开始”—-“运行”中输入cmd,回车,

1Ping 127.0.0.1

127.0.0.1是本地循环地址,如果本地址无法Ping通,则表明本地机TCP/IP协议不能正常工作。

    2Ping本机的IP地址:

IPConfig查看本机IP,然后PingIP,通则表明网络适配器(网卡或MODEM)工作正常,不通则是网络适配器出现故障。

3Ping同网段计算机的IP

Ping一台同网段计算机的IP(同寝室或隔壁寝室),不通则表明网络线路出现故障; 

4Ping网址:

若要检测一个带DNS服务的网络,在上一步Ping通了目标计算机的IP地址后,仍无法连接到该机,则可PING该机的网络名,比如Ping www.ccnu.edu.cn,正常情况下会出现该网址所指向的IP,这表明本机的DNS设置正确而且DNS服务器工作正常,反之就可能是其中之一出现了故障;同样也可通过Ping计算机名检测WINS解析的故障(WINS是将计算机名解析到IP地址的服务)。

     这四步执行完毕后,网络中的故障所在点就已明确,我们就可以正确的解决问题了。

CCNA专业英文词汇(3)

十二月 24, 2008 作者:FDS   类别:计算机考试 已经有164次浏览

    data circuit-terminating equipment (数据电路终接设备)—– DCE用来间DTE设备提供定时。

  data compression (数据压缩)—– 参见compression。

  data direct VCC (数据直接VCC)—– ATM中两个LEG之间建立的一个双向点到点虚拟控制连接(VCC),是由Phase 1 LAN仿真定义的三个数据连接之一。因为数据直接VCC并不保证QoS,它们通常被留做UBR和ABR连接。对比control distribute VCC和control direct VCC。

  data encapsulation (数据封装)—– 一个协议中的信息在另一个协议的数据部分中被包装或包含的过程。在OSI参考模型中,数据向下流过协议栈时,每一层封装紧接它的上一层。

  data frame (数据帧)—– OSI参考模型数据链路层上的协议数据单元封装。从网络层封装数据包并为在网络介质上传输准备数据。

  datagram (数据报)—– 作为网络层单元无需预先建立虚电路并在介质上传输的一个信息的逻辑集合。IP数据报已经成为因特网的主要的信息单元。在OSI参考模型的各层,术语信元(cell)、帧 (frame)、报文 (message)和段 (segment)也定义这些逻辑信息分组。

  Data Link Control layer (数据链路控制层)—– SNA体系结构模型的第2层,它负责在给定的物理链路上传输数据并相当于OSI参考模型的数据链路层。

  Data Link layer (数据链路层)—– OSI参考模型的第2层,它确保数据通过物理链路的可靠传输,主要涉及物理寻址、线路规程、网络拓扑、出错通知、帧的有序交付及流控。IEEE已进一步分割这一层为MAC子层和LLC子层。也称为链路层。可与SNA模型的数据链路控制层相比。参见Application layer、LLC、MAC、Network layer、Physical layer、Presentation layer、Session layer和Transport layer。

    data terminal equipment (数据终端设备)—– 见DTE。

  DCC 数据国家代码 (Data Country Code)—–ATM论坛开发的、为专网使用设计的两个ATM地址格式之一”对比ICD。

  DCE 数据通信设备 (按JIA定义) 或数据电路终端设备 (按ITU-T定义)—–构成用户到网络接口(如调制解调器)的一个通信网络的机制和链路。DCE提供到网络的物理连接、转发通信量并为DTE和DCE之间的同步数据传输提供一个时钟信号。对比DTE。

  D channel (D信道) 1)数据信道—–一个全双工的、16Kb/s (BRA)或64Kb/s(PRI) ISDN信道。对比B channel、E channel和H channel。2) SNA中,以任意外没提供处理器和主存储器之间的一个连接。

  DDP 数据报交付协议 (Datagram Delivery Protocol)—–用于AppleTalk协议组作为负责通过一个互联网络发送数据报的无连接协议。

  DDR 按需拨号路由选择 (dial-on-demand routing) —–允许路由器按发送站的需要自动开始和结束一个电路交换会话的技术。通过模仿保持激活,该路由器欺骗终端站把会话作为活动的来对待。DDR允许通过一个调制解调器或外部ISDN终端适配器在ISDN或电话线路上进行路由选择。

  DE 丢弃合格 (Discard Eligibility)—–帧中继网络中用来告诉交换机,如果交换机太忙,一个帧可以被丢弃。DE是帧中的一个字段,如果承诺信息率 (CIR)被过度预定或设置为0,由发送路由器打开。

  dedicatedline (专线)—– 不共享任何带宽的点到点连接。

  de-encapsulation (拆装)—– 分层协议使用的技术,其中一层从层协议数据单元 (PDU)中去除报头信息。参见encapsulatio。

  default route (默认路由)—– 用于指导帧的静态路由表条目,它的下一中继段没有在动态路由表中说明清楚。

  delay (延迟)—– 一次事务处埋从发送者开始到他们收到第一个响应之间经过的时间。也是一个数据包从它的源经过一条路径移动到其目的地所需的时间。参见latency。

    demarc (分界)—– 用户驻地设备(CPE)与电话公司载波设备之间的分界点。

  demodulation (解调)—– 已调制信口返回其原始形式的一系列步骤。接收时,调制解调器将模拟信号解调为原始的数宇形式(反过来,将它发送的数字数据调制为模拟信号)。参见modulation。

  demultiplexing (多路分解)—– 将一个由多个输人流组成的多路复用信号转换回单独输出流的过程。参见 multiplexing 。

  designated bridge(指定网桥)—–在从一个网段向路由网桥转发帧的过程中,具有最低路径开销的网桥。

  designated port (指定端口)—– 与生成树协议(STP)一起用来指定转发端口。如果到同一网络有多条链路,STP将关闭-个端口以阻止网络环路。

  designated router (DR,指定路由器)—– 为一个多路访问网络创建LSA的一个OSPF路由器,它是在OSPF操作中为完成其他特殊任务所需要的。最少接有两个路由器的多路访问OSPF网络通过OSPF Hello 协议选择一个路由器,它使多路访问网络止必须邻接的数量降低,因而减少厂路由选择的通信量和数据库的实际大小。

  destination address (目的地地址)—– 接收数据包的网络设备的地址。

  DHCP 动态主机配置协议 (Dynamic Host Configuration Protocol)—– DHCP是BootP协议的一个超集。这意味着它使用BootP一样的协议结构,但是它添加了增强。当客户机请求时,这网个协议使用服务器动态配置客户机。两个主要的增强是地址池和租用时间。

  dial backup (拨号备份)—– 拨号备份连接通常用于为帧中继连接提供冗余。备份链路在一个模拟调制解调器上被激活。

  directed broadcast (直接广播)—–一个数据帧或包被传输到一个远程网段上特定的节点组。直接广播由其广播地址表明,它是所有比特均为1的一个目的地子网地址。

  discovery mode (发现模式)—– 也称为动态配置,这一技术被AppleTalk接口用来从一个工作的节点获得有关附接网络的信息。该信息随后由该接口用于自身配置。

  distance-vector routing algorithm (距离向量路由选择算法)—– 为了发现最短路径,这个路由选择算法组重复一条给定路由中的中继段数,要求每个路由器发送其完整的更新路由表,但只到其邻居。这种路由选择算法有产生环路的趋势,但比链路状态算法简单。参见link-state routing al-gorithm和SPF。

    distribution layer (分配层)—– Cisco三层分层模型的中间层,它有助于设计、安装和维护Cisco分层网络。分配层是接人层设备的连接点。路由选择在这一层完成。

  DLCI 数据链路连接标识符 (Data-Link Connection Identifier)—– 用于标识帧中继网络中的虚电路。

  DLSw 数据链路交换 (Data Link Switching)—– IBM在1992年开发了数据链路交换 (DLSw),以便在基于路由器的网络中提供对SNA(系统网络机构)和NeIOS协议的支持。SNA和NetBIOS是不可路由的协议,不包含任何第3层逻辑网络信息。DLSw将这些协议封装在TCP/IP消息中,这些消息可被路由并是一个远程源路由桥接 (RSRB)的可选办法。

  DLSw+ Cisco的DLSw实现—–除了支持RFC标准,Cisco添加了目的在于增加可缩放性和改善性能及可用性的增强。

  DNS 域名系统 (Domain Name System)—–用于解析主机名到IP地址。

  DSAP 目的地业务接火点(Destination Service Access Point)—–一个网络节点的业务接人点,在数据包的目的地字段中指定。参见SSAP和SAP。

  DSR 数据机准备好 (Data Set Ready)—–当DCE通电并准备好运行时,这个EIA/TIA-232接口电路也占线。

  DSU 数据服务单元 (data service unit)—–这个设备用来使数据终端设备 (DTE)机构上的物理接口适应T-1或E-1之类的传输设备并负责信号定时。它通常与信道服务单元组合在一起并称为CSU/DSU。参见CSU。

  DTE 数据终端设备 (data terminal equipment)—– 任何一个位于用户-网络接口并作为目的地、源或两者的用户端的设备。DTE包括多路复用器、协议转换器和计算机之类的设备。到一个数据网络的连接是由使用该设备产生的时钟信号的数据通信设备 (DCE),如调制解调器所组成。参见DCE。

  UTR 数据终端准备好 (Data Terminal Ready)—– 一条激活的与DCE通信的ETA/TIA-232电路,表示DTE发送或接收数据已准备好的状态。

  DUAL 扩散更新算法 (Diffusing Update Algorithm)—– 用在增强的IGRP中,这个收敛算法在整个路由计算中提供无环路操作。DUAL授权给能同时同步的拓扑版本中涉及的路由器,而不涉及的路由器不受这个改变的影响。参见Enhanced IGRP。

    DVMRP 距离间量组播路由选择协议 (Distance Vector Multicast Routing Protocol)—– 主要基于路由信息协议(RTP),这个因特网网关协议实现一个公共的、浓缩模式IP组播方案,利用TGMP在它的邻居之间传输路由选择数据报。参见IGMP。

  DXI 数据交换接口 (Data Exchange Interface)—– 在RFC 1482中描述,DXI定义一个网络设备 (如路由器、网桥或集线器)的效力。它们对使用一个特殊DSU完成包封装的ATM网络起一个FEP作用。

  dynamic entries (动态条目)—– 用于在第2层和第3层设备中动态地创建硬件地址表或逻辑地址表。

  dynamic routing (动态路由选择)—–网络修订。也称”自适应路由选择”,这个技术自动适应通信量或物埋

  dynamic VLAN (动态DLAN)—– 在一个特殊服务器中创建条目的管理器,该服务器具有互联网络上所有设备的硬件地址。然后该服务器将动态地分配用过的VLAN。

  E-1—– 通常在欧洲使用,以2.048Mb/s速率传输数据的一个广域数字传输方案。E-1传输线路可从公共载波公司租用做为专线使用。

  E.164 1)—– 从标准电话编号系统演变而来,由ITU-T为国际电信编号,尤其是在ISDN、SMDS和BISDN中编号建议的标准。2) 包含E.164格式号码的ATM地址中字段的标志。

  eBGP 外部边界网关协议 (External Border Gateway Protocol)—–用于在不同的自治系统间交换路由信息。

  E channel (E信道)回送信道 (Echo channel)—– 用于电路交换的一个64Kb/s ISDN控制信道。这个信道的专门描述可在1984年的ITU-T ISDN规范中找到,但已从1988版中取消。参见Bchannel 、D channel H channel。

  edge device (边缘设备) 使数据包能基于数据链路和网络层中的信息在老式接口(如以太网和令牌环)和ATM接口间转发的设备。边缘设备不参加任何网络层路由选择协议的运行,它只使用路由描述协议来获得所需的转发信息。

  EEPROM 电可擦可编程只读存储器 (electronically erasable programmable read-onlymemory)—– 出厂之后编程的,这些非易失性的存储器芯片需要时可以使用电功率擦去并且重新编程。奏见EPROM和PROM。

    EFCI 显式前向拥塞指示 (Explicit Forward Congestion Indication)—– ATM网络中ABR业务允许的一种拥塞反馈模式。EFCI可以由立即或某种拥塞状态中的任何网络元素设置。目的地终端系统可以执行一个根据该EFCI值调整并降低该连接的信元速率的协议。参见ABBR。

  EIGRP—– 见Enhanced IGRP。

  ETP 以太网接口处理器 (Ethernet Interface Processor)—– 一个Cisco 7000系列路由器接口处理器卡,提供lOMb/s AUI端口支持以太网版本1和以太网版木2或带高速数据路径到其他接口处理器的IEEE802.3接口。

  ELAN 仿真LAN (emulated LAN)—– 使用一个客户机/服务器模型仿真以太网或令牌环LAN配置的一个ATM网络。多个ELAN可在一个ATM网络上同时存在并构成一个LAN仿真客户机(LEC)、一个LAN仿真服务器、一个广播和未知服务器(BUS)以及一个LAN仿真配置服务器(LECS)。ELAN由LANE规范定义。参见LANE、LEG、LEGS和LES。

  ELAP EtherTalk链路访问协议 (EtherTralk Link Access Protocol)—– 在EtherTalk网络中,标准以太网数据链路层之上构成的链路访问协议。

  encapsulation (封装)—– 分层协、议使用的技术,其中一层给上层协议数据单元(PDU)添加报头信息。例如,因特网术语中。一个数据包应包含一个物理层的报头,跟着一个网络层 (IP)报头,接着是传输层报头 (TCP),后跟应用协议数据。

  encryption (加密)—– 信息转换成杂乱的形式以有效地伪装,从而防止末经授权的访问。每个加密方案使用一些精确定义的算法,在接收端解密过程中由一个相反的算法将其颠倒过来。

  Endpoints (端点)—– 见BGP neighbors。

  end-to-end VLANs (端到端VLAN)—– 跨越交换机结构 (switch-fabric) 从端到端的VLAN; 端到端\VLAN中的所有交换机理解所有配置的VLAN。端到端VLAN根据功能、项目、部门等被配置成允许成员关系。

  Enhanced IGRP (增强的IGRP)—– 增强的内部网关路由选择协议 (Enhanced Interior GatewayRouting Protocol): Cisco创建的一个高级路由选择协议,它结合了链路状态和距离间量协议的优点。增强的IGRP有非凡的收敛属性,包括高操作效率。参见IGP、OSPF和RIP。

  enterprise network (企业网络)—– 在一家大公司或机构中连接主要位置的一个专门拥有和运行的网络。

    EPROM 可擦可编程只读存储器 (ersable programmable read-only memory)—– 出厂之后编程的,这些非易失性的存储器芯片需要时可以使用高功率光擦去并且重新编程。参见EEPROM和PROM。

  ESF 扩展的超帧 (Extended Superframe)—– 由24帧构成,每帧192比特,第193比特提供其他功能,包括定时。这是SF的一个扩展版本。参见SF。

  Ethernet (以太网)—– Xerox公司创建的一个基带LAN规范,然后通过Xerox、Digital Equipment和Tnter公司联合改善。以太网类似于TEEE802.3系列标准并使用CSMA/CD,在各种类型电缆上以lOMb/s速率工作。也称DIX (Digital/Intel/Xerox)以太网。参见lOBaseT、Fast Ethernet和lEEE。

  EtherTalk —– Apple计算机公司的一个数据链路产品,它允许AppleTalk网络由以太网连接。

  excess burstsize (超过突发大小)—– 用户可以超过承诺突发大小通信量的数量。

  excess rate (超过速率)—– 在ATM网络中,超过一个连接的保险速率的通信量。超过速率为最大速率减去保险速率。根据网络资源的可用性,超过通信量在拥塞期间可以被丢弃。对比maximumraten

  EXEC session (EXEC会话)—– 用来描述命令行界面的Cisco术语。EXEC会话存在于用户模式和特权模式。

  expansion (扩展)—– 指挥压缩数据通过一个算法,将信息恢复到它的原始大小的过程。

  expedited delivery (加速交付)—– 可以由一个与其他层或不同网络设备中同一协议层通信的协议层指定的一个选项,要求被识别的数据被更快地处里。

  explorer frame (探测帧)—– 与源路由桥接一起用于在一个发送之前发现到远程桥接网络的路由。

  explorer packet (探测包)—– 由一个源令牌环设备发送的SNA包,用来发现通过源路由桥接网络的路径。

  extended IP accesslist (扩展的IP访问表)—– 通过逻辑地址、网络层报头中的协议字段,甚至传输层报头中的端口字段过滤网络的IP地址表

  extended IPX accesslist (扩展的IPX访问表)—– 通过逻辑IPX地址、网络层报头中的协议字段,甚至传输层报头中的直接字号过滤网络的IPX地址表。

  Extended Setup (扩展的设置)—– 用在设置模式中以配置路由器,它比基本设置模式配置更多的细节。允许多协议支持和接口配置。

ASP创建事务性脚本

十二月 18, 2008 作者:FDS   类别:ASP 已经有172次浏览

商业应用程序常常需要具有在事务内部运行脚本和组件的能力。事务是一种服务器操作,即使该操作包括很多步骤(例如,定货、查看存货、付帐等),也只能整体返回操作是成功还是失败。用户可以创建在事务内部运行的 ASP 脚本,如果脚本的任何一部分失败,整个事务都将会终止。

ASP 事务处理是以 Microsoft® Transaction Server (MTS) 为基础的。Microsoft&reg; Transaction Server (MTS) 是一个事务处理系统,用于开发、配置和管理高性能、可分级的、有鲁棒性的企业 Internet 和 Intranet 服务器应用程序。Transaction Server 为开发分布式的,基于组件的应用程序提供了一个应用程序设计模型。它也为配置和管理这些应用程序提供了一个运行环境。

创建事务性脚本的功能内置在 Internet Information Server 和 Personal Web Server 中。如果您安装了 Microsoft Transaction Server,就可以将组件打包,以使组件在事务内部运行。

关于事务
事务是整体成功或失败的操作。事务处理用于对数据库进行可靠地更新。在对数据库进行许多相关更改或同时更新多个数据库时,要保证所有更改都被正确执行。如果这些更改中的任何一个失败,都需要恢复数据库表的原始状态。

如果没有 MTS,您就需要编写脚本和组件,手工跟踪请求的更改情况,以便在某些更改失败时恢复数据。使用 MTS,您只需简单的将您的脚本和组件声明为“需要事务”并让 MTS 处理事务的一致性。事务处理只适用于数据库访问;MTS 不能对文件系统或其他的非事务性资源的更改进行恢复操作。应用程序所访问的数据库必须为 MTS 所支持。目前,MTS 支持 SQL Server 及任何支持 XA 协议(由 X/Open 协会制定)的服务器。MTS 将继续扩展对其他数据库的支持。

事务不能跨越多个 ASP 页。如果一个事务需要来自多个组件的对象,则须将使用这些对象的操作组合在一个 ASP 页中。例如,假定有一个组件用于更新工资单数据库,还有一个组件用于更新人力资源数据库中的员工记录。为了记录一个员工的新的工资信息,您需要编写这样一个脚本,该脚本在一个事务环境中调用这两个组件,一个用于更新工资单数据库,另一个用于更新人力资源数据库中的员工等级。

声明事务性脚本
在将一个页声明为事务性时,此页中的任何脚本命令和对象都运行在同一个事务环境中。Transaction Server 处理生成事务的细节并决定事务成功(提交)或失败(终止)。要将某个页声明为事务性,可在页首添加 @TRANSACTION 指令:

<%@ TRANSACTION = value %>
value 参数可以是下列之一:

值 意义
Requires_New 启动一个新的事务。
Required 启动一个新的事务。
Supported 不启动事务。
Not_Supported 不启动事务。

@TRANSACTION 指令必须在一页中的第一行,否则将产生错误。必须将该指令添加到需要在事务下运行的每一页中。当脚本处理结束时,当前事务即告结束。

大多数应用程序只有一些特定的操作需要事务环境。例如,一个航空公司的站点可能只需要事务性脚本处理购票和安排座位,而其他所有脚本则无须事务环境即可安全运行。因为事务只须用于需要事务处理的页即可,不要将应用程序的 Global.asa 文件声明为事务性。

如果事务被终止,Transaction Server 将恢复对支持事务的资源的任何更改。目前,仅数据库服务器完全支持事务,因为数据库中的数据对于企业应用是最为关键的。Transaction Server 不对硬盘上的文件、会话和应用程序的变量、集合等的改变进行恢复。然而您可以如下文主题所述,通过编写事务事件来编写恢复变量和集合的脚本。在某些时候,您的脚本也可以显式的提交或终止一个事务,如向文件写数据失败时。

提交或终止脚本
因为 Transaction Server 跟踪事务处理,所以它决定事务是完全成功还是失败。脚本可以通过调用 ObjectContext.SetAbort 显式地声明终止一个事务。 例如,当一个事务在从一个组件收到错误消息、违反商业规范时(例如,帐户余额小于  0)或读写文件等非事务性操作失败时,脚本就需要终止该事务。如果页在事务完成之前超时,也必须终止事务。

编写事务事件
脚本本身不能决定事务是成功还是失败。但是,可以编写提交或终止事务时被调用的事件。例如,假设有一个确认银行帐户的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件来编写对用户的不同响应。

<%@ TRANSACTION = Required %>

<%
‘Buffer output so that different pages can be displayed.
Response.Buffer = True
%>

<HTML>
<BODY>
<H1>Welcome to the online banking service</H1>

<%
Set BankAction = Server.CreateObject(“MyExample.BankComponent”)
BankAction.Deposit(Request(“AcctNum”))
%>

<P>Thank you.  Your transaction is being processed.</P>
</BODY>
</HTML>

<%
‘ Display this page if the transaction succeeds.
Sub OnTransactionCommit()
Response.Write “<HTML>”
Response.Write “<BODY>”
Response.Write “Thank you.  Your account has been credited.”
Response.Write “</BODY>”
Response.Write “</HTML>”
Response.Flush()
end sub
%>

<%
‘ Display this page if the transaction fails.
Sub OnTransactionAbort()
Response.Clear()
Response.Write “<HTML>”
Response.Write “<BODY>”
Response.Write “We are unable to complete your transaction.”
Response.Write “</BODY>”
Response.Write “</HTML>”
Response.Flush()
End sub
%>
在 MTS 资源管理器中登记一个组件
为了参与一个事务,组件必须在 MTS 包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction Server 保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad Rotator 组件。

注册和配置事务性组件可使用 MTS 资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在 MTS 包中注册。不要将组件放在 IIS 内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个 ASP 应用程序使用并以 ASP 应用程序进程运行。使用 MTS 资源管理器可创建新的包并将包的 Activation 属性设置为 Library。

也可以在 Server 包中注册事务性组件。Server 包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用 Server 包。

要使用 MTS 资源管理器,必须安装 Microsoft Transaction Server。

对象作用域
一般情况下,不要将从 MTS 组件中创建的对象存储在 ASP Application 或 Session 对象中。 MTS 对象在事务完成后消失。因为 Session 对象和 Application 对象是为在不同 ASP 页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。

ASP 脚本是已声名的事务的根,即起始点。任何事务性 ASP 页所使用的 MTS 对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS 对象将消失,其中包括存储在 Session 或 Application 对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。

事务排队
从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。

对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。

Microsoft Message Queue Server 使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message Queue Server 保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。

维护ASP应用程序的安全

十二月 18, 2008 作者:FDS   类别:ASP 已经有147次浏览

千万不要轻视正确配置安全设置的重要性。如果不正确配置安全设置,不但会使您的 ASP 应用程序遭受不必要的篡改,而且会妨碍正当用户访问您的 .asp 文件。

Web 服务器提供了各种方法来保护您的 ASP 应用程序免受未授权的访问和篡改。在您读完本主题下的安全信息之后,请花一定的时间仔细检查一下您的 Windows NT 和 Web 服务器安全性文档。

NTFS 权限
您可以通过为单独的文件和目录应用 NTFS 访问权限来保护 ASP 应用程序文件。NTFS 权限是 Web 服务器安全性的基础,它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT 有效帐号的用户试图访问一个有权限限制的文件时,计算机将检查文件的访问控制表 (ACL)。该表定义了不同用户和用户组所被赋予的权限。如果用户的帐号具有打开文件的权限,计算机则允许该用户访问文件。例如,Web 服务器上的 Web 应用程序的所有者需要有“更改”权限来查看、更改和删除应用程序的 .asp 文件。但是,访问该应用程序的公共用户应仅被授予“只读”权限,以便将其限制为只能查看而不能更改应用程序的 Web 页。

维护 Global.asa 的安全
为了充分保护 ASP 应用程序,一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果 Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa 文件,则信息将被返回给浏览器,即便应用程序的其他文件被保护。

注意    一定要对应用程序的文件应用统一的 NTFS 权限。例如,如果您不小心过度限制了一应用程序需要包含的文件的 NTFS 权限,则用户可能无法查看或运行该应用程序。为了防止此类问题,在为您的应用程序分配 NTFS 权限之前应仔细计划。

Web 服务器权限
您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的 ASP 页的方式。不同于 NTFS 权限提供的控制特定用户对应用程序文件和目录的访问方式, Web 服务器权限应用于所有用户,并且不区分用户帐号的类型。

对于要运行您的 ASP 应用程序的用户,在设置 Web 服务器权限时,必须遵循下列原则:

对包含 .asp 文件的虚拟目录允许“读”或“脚本”权限。
对 .asp 文件和其他包含脚本的文件(如 .htm 文件等)所在的虚目录允许“读”和“脚本”权限。
对包含 .asp 文件和其他需要“执行”权限才能运行的文件(如 .exe 和 .dll 文件等)的虚目录允许“读”和“执行”权限。
脚本映射文件
应用程序的脚本映射保证了 Web 服务器不会意外地下载 .asp 文件的源代码。例如,即使您为包含了某个 .asp 文件的目录设置了“读”权限,只要该 .asp 文件隶属于某个脚本映射应用程序,那么您的 Web 服务器就不会将该文件的源代码返回给用户。

Cookie 安全性
ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说,带有相应的 cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies 配置带有用户特定会话信息的 ASP 应用程序。例如,如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店,就可以用 SessionID 跟踪用户漫游整个应用程序时的选择。

SessionID 能否被黑客猜中?
为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问,Web 服务器为每个 SessionID 指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时,服务器取出 SessionID 和被赋予的数字,接着检查是否与存储在服务器上的生成号码一致。若两个号码一致,将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度(64 位),此长度使计算机黑客猜中 SessionID 从而窃取用户的活动会话的可能性几乎为 0。

加密重要的 SessionID Cookie
截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP 应用程序包含私人信息,信用卡或银行帐户号码,拥有窃取的 cookie 的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止 SessionID cookie 被截获。

使用身份验证机制保护被限制的 ASP 内容
您可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT 帐号的用户名和密码。每当用户试图访问被限制的内容时,Web 服务器将进行身份验证,即确认用户身份,以检查用户是否拥有有效的 Windows NT 帐号。

Web 服务器支持以下几种身份验证方式:

基本身份验证   提示用户输入用户名和密码。
Windows NT 请求/响应式身份验证    从用户的 Web 浏览器通过加密方式获取用户身份信息。
然而,Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户身份。

保护元数据库
访问元数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时,须经已通过身份验证的连接,如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前,仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求/响应式身份验证。

使用 SSL 维护应用程序的安全
Secure Sockets Layer (SSL) 3.0 协议作为 Web 服务器安全特性,提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证,并能可靠地确认访问被限制的 Web 站点的用户的身份。

通过 SSL,您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接;以防用户与应用程序间交换的重要信息被截取。

维护包含文件的安全
如果您从位于没有保护的虚拟根目录中的 .asp 文件中包含了位于启用了 SSL 的目录中的文件,则 SSL 将不被应用于被包含文件。因此,为了保证应用 SSL,应确保包含及被包含的文件都位于启用了 SSL 的目录中。

客户资格认证
控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用客户资格登录。客户资格是包含用户身份信息的数字身份证,它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格,第三方组织在发放资格证之前确认用户的身份信息。(通常,这类组织要求姓名、地址、电话号码及所在组织名称;此类信息的详细程度随给予的身份等级而异。)

每当用户试图登录到需要资格验证的应用程序时,用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确,那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。

用于处理资格证明的 ASP 脚本
作为 ASP 应用程序开发人员,您可以编写脚本来检查资格是否存在并读取资格字段。例如,您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。

必须将 Web 服务器配置为接受或需要客户资格,然后才能通过 ASP 处理客户资格;否则,ClientCertificate 集合将为空。

ASP管理会话

十二月 18, 2008 作者:FDS   类别:ASP 已经有150次浏览

成功开发 Web 应用程序的难题之一是在一次用户访问,即会话期间,当用户在一个应用程序的页与页之间跳转的同时,维护用户信息。HTTP 是一种无状态协议,也就是说,Web 服务器将某页的每次访问都当作相互无关的访问来处理;服务器不保留前一次访问的任何信息,即使访问就发生在当前访问的几秒钟之前。正因为这种不记忆以前访问的特性使得编写联机目录之类的应用程序很困难,此类应用程序可能需要跟踪用户在目录的不同页间跳转的同时曾选择过的目录项。

ASP 提供了一个管理会话信息问题的独特方案。使用 ASP Session 对象和由您的服务器生成的特殊用户 ID,您可以创建一个智能应用程序,该应用程序可以识别每个来访的用户并收集应用程序跟踪用户的首选项或选择内容所要用到的信息。

ASP 通过 HTTP cookie 设置用户 ID。HTTP cookie 是存储在用户浏览器上的小文件。因此,如果您正在为不支持 cookie 的浏览器创建应用程序,或者您的客户将浏览器设置为不接受 cookie,请不要使用 ASP 的会话管理功能。

您也可以编写在应用程序启动或结束时运行的脚本。

启动和结束会话
会话可以通过三种方式启动:

一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。
用户在 Session 对象中存储了一个值。
用户请求了一个应用程序的 .asp 文件,并且该应用程序的 Global.asa 文件使用 <OBJECT> 标签创建带有会话作用域的对象的实例。
如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。

对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。

<%  Session.Timeout = 5  %>
您也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。

您也可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL 。

<% Session.Abandon %>
关于 SessionID 和 Cookie
当用户第一次请求给定的应用程序中的 .asp 文件时,ASP 生成一个 SessionID。SessionID 是由一个复杂算法生成的号码,它唯一标识每个用户会话。在新会话开始时,服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中。

SessionID 与钥匙很相似,当会话期间用户与应用程序交互时,ASP 可以将用户信息存储在服务器的一个“保险箱”中。正象用钥匙能存取保险箱中物品一样,通过在 HTTP 请求标题中发送的用户 SessionID cookie,就能够对该“保险箱”中的内容进行访问。每当 ASP 收到一个页请求时,就检查 HTTP 请求标题,以获得 SessionID cookie。

在将 SessionID cookie 存储于用户的浏览器之后,即使用户请求了另一个 .asp 文件,或请求了运行在另一个应用程序中的 .asp 文件,ASP 仍会重用该 cookie 跟踪会话。与此相似,如果用户故意放弃会话或让会话超时,然后再请求另一个 .asp 文件,那么 ASP 将以同一个 cookie 开始新的会话。只有当服务器管理员重新启动服务器或用户重新启动 Web 浏览器时,此时存储在内存中的 SessionID 设置将被清除,用户将会获得新的 SessionID cookie。

通过重用 SessionID cookie,ASP 将发送给用户浏览器的 cookie 数量降为最低。另外,如果您决定您的 ASP 应用程序不需要会话管理,就可以不让 ASP 跟踪会话和向用户发送 SessionID 。

ASP 在以下情况下不发送会话的 cookie:

应用程序的会话状态被禁用。
ASP 页被定义为无会话,即该页包含 <%@ EnableSessionState=False %> 标记。
请注意,SessionID cookie 并不提供跟踪用户对某个 Web 站点的多次访问的永久方法。存储在服务器内存中的 SessionID 信息很容易丢失。如果想跟踪在很长时间内访问您的 Web 应用程序的用户,必须通过在用户的 Web 浏览器中存储一个专门的 cookie,并将 cookie 信息保存到数据库中来创建一个用户标识。

在 Session 对象中存储数据
Session 对象提供了一个可在其中存储信息的动态关联数组。您可以在 Session 对象中存储数值变量和对象变量。

通过对 Session 对象中的命名项赋值,可将变量存储在 Session 对象中。例如,以下命令将两个新变量存储在 Session 对象中:

<%
Session(“FirstName”) = “Jeff”
Session(“LastName”) = “Smith”
%>
通过访问该命名项可从 Session 对象中获取信息。例如,显示 Session(“FirstName”) 的当前值:

Welcome <%= Session(“FirstName”) %>
可以在 Session 对象中存储用户的首选项,然后通过访问首选项来决定将哪一页发送给用户。例如,可以允许用户在您的应用程序的第一页中指定纯文本版本的内容并将这一选择应用到用户此后对该应用程序的所有页的访问上。

<% If Session(“ScreenResolution”) = “Low” Then %>
This is the text version of the page.
<% Else %>
This is the multimedia version of the page.
<% End If %>
您也可以在 Session 对象中存储一个对象实例,但这样做会影响服务器的性能。

管理 Web Farm 的会话
ASP 会话信息存储在 Web 服务器中。浏览器必须向 Web 服务器请求页才能获得用来访问会话信息的脚本。在 Web Farm(其中许多 Web 服务器共同承担响应用户申请的责任)中,用户的请求并不总是被路由到同一个服务器,而是由一个被称为“负载平衡”进程的特殊软件对此 URL 站点的申请分配任意一个空闲的服务器。负载平衡进程使在 Web Farm 中保存会话信息变得更加困难。

为了在一个负载被平衡的站点上使用 ASP 会话管理,必须保证用户会话的所有请求都被定向到同一个 Web 服务器。一种做法是编写一个 Session_OnStart 过程,此过程使用 Response 对象将浏览器重定向到运行该用户会话的 Web 服务器。如果在您的应用程序页中的所有链接都是相对的,那么以后对某一页的所有请求都将被路由到同一个服务器。

例如,某用户要通过请求某一站点的通用 URL:http://www.microsoft.com 来访问一个应用程序。负载平衡进程将申请路由到服务器 server3.microsoft.com。ASP 在此服务器上生成了一个新的用户会话。在 Session_OnStart 过程中,浏览器被重定向给指定的服务器:

<% Response.Redirect(“http://server3.microsoft.com/webapps/firstpage.asp”) %>
浏览器将请求指定的页,并且以后的所有请求都将被路由到同一个服务器。

使用 Cookie
cookie 是 Web 服务器嵌在用户的 Web 浏览器中,用来代表用户的令牌。当下次同一浏览器请求一页时,它将发送从 Web 服务器收到的 cookie。 cookie 允许有一组信息与用户关联。 ASP 脚本使用 Response 和 Request 对象的 Cookies 集合,可以获取和设置 cookie 的值。

设置 cookie
要设置 cookie 的值,可使用 Response.Cookies。如果 cookie 不存在,Response.Cookies 将创建新的 cookie。例如,要向浏览器发送一个有关联值 (“Mars”) 的 cookie 名 (“planet”),可使用下列命令,这些命令必须出现在您的 Web 页的 <HTML> 标记前:

<% Response.Cookies(“planet”)=”Mars” %>
如果您只希望 cookie 在当前的用户会话中被使用,则只需向浏览器发送 cookie。但是,如果要在用户已经终止或重新启动浏览器之后确认用户,就必须强制浏览器将 cookie 存储在计算机的硬盘上。要保存 cookie,可使用 Response.Cookies 的 Expires 属性并将日期设置为此后的某一天:

<%
Response.Cookies(“planet”) = “Mars”
Response.Cookies(“planet”).Expires = “January 1, 1999″
%>
cookie 可有多个值;这样的 cookie 被称为一个带索引的 cookie。每个 cookie 值都被赋予一个关键字;您可以设置一个特定的 cookie 关键字的值。例如:

<% Response.Cookies(“planet”)(“Mars”)=”SpaceMissions” %>
如果某个现有的 cookie 具有关键字值但 Response.Cookies 未指明一个关键字的名称,则该关键字值将被删除。类似的,如果某个现有的 cookie 没有关键字值但 Response.Cookies 指明了关键字的名称和值,则现有的 cookie 值将被删除,并生成新的 key-value 对。

获取 cookie
要获取 cookie 的值,可使用 Request.Cookies 集合。例如,如果用户的 HTTP 请求设置了 planet=Mars,则下列语句将获取值 Mars:

<%= Request.Cookies(“planet”) %>
相似的,要从带索引的 cookie 中获取关键字值,可使用关键字名。例如,如果用户发出下列的 HTTP 请求:

planet=Mars&Mars=SpaceMissions
下列脚本将返回值 SpaceMissions:

<%= Request.Cookies(“planet”)(“Mars”) %>
设置 cookie 路径
由 ASP 存储在用户的 Web 浏览器中的每个 cookie 都包含路径信息。当浏览器请求的文件的位置与在 cookie 中指定的路径相同时,浏览器自动将 cookie 转发给服务器。默认情况下,cookie 路径与包含最初生成 cookie 的 .asp 文件的应用程序名对应。例如,如果在名为 UserApplication 的应用程序中的 .asp 文件生成了一个 cookie,那么每当用户的 Web 浏览器在此应用程序中获取文件时,除其他在路径 /UserApplication 下的 cookie 外,浏览器还要将该 cookie 转发给服务器。

要给 cookie 声明一个不同于默认的应用程序路径的路径,可以使用 ASP 的 Response.Cookies 集合的 Path 属性。例如,下列脚本将路径 SalesApp/Customer/Profiles/ 赋予名为 Purchases 的 cookie:

<%
Response.Cookies(“Purchases”) = “12″
Response.Cookies(“Purchases”).Expires = “January 1, 2001″
Response.Cookies(“Purchases”).Path = “/SalesApp/Customer/Profiles/”
%>
每当包含 Purchases cookie 的 Web 浏览器请求位于路径 /SalesApp/Customer/Profiles/ 或其子目录的文件时,浏览器将 cookie 转发给服务器。

许多 Web 浏览器,包括 Microsoft Internet Explorer 4.0 和 Netscape 浏览器,保留 cookie 路径的大小写。也就是说,如果一个被请求的文件的大小写与保留的 cookie 路径不同,那么浏览器是不会向服务器转发 cookie 的。例如,对于 ASP,虚拟目录 /TRAVEL 和 /travel 是相同的 ASP 应用程序,而对于保留 URL 的大小写的浏览器而言,/TRAVEL 和 /travel 则是两个不同的应用程序。应确保 .asp 文件的所有 URL 具有相同的大小写,以保证用户的浏览器能够转发存储的 cookie。

如果需要,可使用下列语句设置 cookie 路径,使得无论应用程序或路径是什么,只要用户的 Web 浏览器向您的服务器请求文件,就会转发 cookie :

Response.Cookies(“Purchases”).Path = “/”
但是,请注意,在不区分应用程序的情况下向服务器发送 cookie,如果 cookie 包含不应被指定应用程序以外的程序访问的敏感信息,就可能产生安全性问题。

不使用 cookie 而保留状态
并不是所有的浏览器都支持 cookie。即便使用支持 cookie 的浏览器,有些用户也可能喜欢关闭 cookie 支持。如果您的应用程序需要响应不支持 cookie 的浏览器,就必须使用 ASP 会话管理。

如果您不使用 ASP 会话管理,就必须编写您自己的机制以便在您的应用程序页之间传递信息。有两种常规的方法可完成该任务:

向 URL 的查询字符串添加参数。例如:

http://MyServer/MyApp/start.asp?name=Jeff

但是,某些浏览器,在表格被以 GET 方法提交的情况下会丢弃查询字符串中传递的显式参数。

向表格中添加隐含值。例如,以下的 HTML 表格包含一个隐含的控件。此控件在真正的表格中不出现,而且对用户的 Web 浏览器是不可见的。通过 HTTP POST 方法,表格除了传递用户提供的信息外,还传递用户标识。
<FORM METHOD=”POST” ACTION=”/scripts/inform.asp”>
<INPUT TYPE=”text” NAME=”city” VALUE=”">
<INPUT TYPE=”text” NAME=”country” VALUE =”">
<INPUT TYPE=”hidden” NAME=”userid” VALUE= <%=UserIDNum(i) %>
<INPUT TYPE=”submit”  VALUE=”Enter”>
本方法要求传输用户信息的所有链接目标被编码为 HTML 表格。

如果您当前没有使用 ASP 会话管理,请关闭您的应用程序会话支持。当会话启用时,ASP 向每个请求 ASP 页的浏览器发送 SessionID cookie。要关闭会话支持,可清除 Internet 服务管理器中的“应用程序选项”属性页中的“启用会话状态”复选框。

无会话的 ASP 页
ASP 也提供创建无会话页的功能,您可以使用该功能将会话的创建时间推迟到用户访问一个需要会话跟踪的 ASP 页时。

无会话页不执行以下功能:

执行 Session_OnStart 过程。
发送会话 ID cookie。
创建 Session 对象。
访问用 <OBJECT> 标记创建的内建会话对象或会话作用域对象。
与其他会话请求顺序执行。
要将 .asp 配置为无会话,可使用下列语句:

<%@ EnableSessionState=False %>
您应将此脚本置于 .asp 文件的第一行,位于其他脚本之前。默认情况下,若省略此标记,则启用会话跟踪。

无会话 ASP 页通过消除潜在的耗时会话操作,改善服务器的响应性能。例如,考虑以下情况,ASP 页包含某个帧集中的两个 HTML 帧,帧 1 和 帧 2。帧 1 包含一个执行复杂脚本的 .asp 文件,而帧 2 包含一个简单的 .html 文件。因为 ASP 顺序执行(即串行执行)会话请求,所以在帧 1 的脚本被执行之前,您将不会看到帧 2 的内容。但是,如果您将帧 1 设置为无会话,则 ASP 请求将不再被串行处理,浏览器不必等待执行完帧 1 的内容就可以处理帧 2 的内容。

但是,不同帧的多个请求的处理方式最终还要取决于用户 Web 浏览器的配置。某些 Web 浏览器可能不理会您的 .asp 文件的无会话配置,照样串行处理请求。

学会调试ASP脚本

十二月 18, 2008 作者:FDS   类别:ASP 已经有188次浏览

无论您的计划多么精密、经验多么丰富,脚本错误 (bug) 可能在最初就使您的 ASP 服务器端的脚本无法正确运行。也就是说调试,即查找和纠正脚本错误,对开发一个成功的和强健的 ASP 程序是非常重要的。

Microsoft 脚本调试工具
Microsoft&reg; Script Debugger 是一个功能强大的调试工具,它能帮助您迅速查找错误并对服务器端的脚本进行交互测试。Script Debugger 与 Windows Internet Explorer 3.0 版本或更新的版本一起工作。通过它,您可以:

逐行运行服务器端脚本。
在服务器端脚本执行时,打开命令窗口监视变量、属性或数组元素的值。
在特定行设置暂停标记,挂起服务器端脚本(使用调试工具或脚本命令)。
在运行服务器端脚本时跟踪过程。
注意   您可以使用调试工具查看脚本并找到错误所在,但是不能直接编辑脚本。要想改正错误,必须用编辑器编辑脚本然后保存,再运行脚本。

(该功能不能用于 Windows 95 或更高的版本。)

启用调试
在开始调试服务器端脚本之前,您必须首先配置 Web 服务器,使其支持 ASP 调试。

在启用 Web 服务器调试之后,就可以使用下面的任一方法调试脚本:

手工打开 Microsoft 脚本调试器,调试 ASP 服务器端脚本。
使用 Internet Explorer 请求 .asp 文件。如果该文件包含错误或人为添加的停止执行语句,那么 Microsoft 脚本调试程序将自动启动,显示该脚本,并且指出错误来源。
脚本错误
调试服务器端脚本时,您可能会碰到各种类型的错误。其中的某些错误使脚本无法正确执行、程序停止执行或返回错误结果。

语法错误
语法错误是经常碰到的错误,它是由不正确的脚本语法导致的。例如,命令拼写错误或传递给函数的参数不正确都将产生错误。语法错误可能导致您的脚本不能运行。

运行时错误
运行时错误是脚本在执行过程中脚本指令试图执行不可能的动作而导致的。例如,下面的脚本中包含一个被零除(一种非法的数学运算)的函数,将产生运行时错误:

<script language = “VBScript” runat = server>
Result = Findanswer(15)
document.write (“The answer is ” &Result)

Function Findanswer(x)
‘This statement generates a run-time error.
Findanswer = x/0
End Function
</script>
必须纠正导致运行时错误的错误,这样才能使脚本在运行时不被中断。

逻辑错误
逻辑错误通常可能是潜在和难以检测的。如果有因键入错误或程序逻辑流程错误引起的逻辑错误,脚本可能会成功运行,但产生的结果却是错的。例如,一服务器端脚本计划对一个值列表排序,如果本应使用 “<” 符号比较数值,但却使用了“ >” 符号,那么将返回不正确的排序结果。

错误调试技术
可以使用多种不同的调试技术来查找错误的根源并测试应用程序。

实时 (Just-In-Time, JIT) 调试
当一个运行时错误中断了 ASP 脚本的执行时,Microsoft 脚本调试程序自动启动,显示 .asp 文件,将语句指针指向导致错误的行,并产生错误消息。这种调试方式称为实时 (JIT) 调试,计算机将暂停程序的执行。必须用编辑程序纠正这些错误,保存所做的修正,然后再运行脚本。

断点调试
当一个错误发生并且很难找到错误的根源时,可使用预设断点的调试方法。断点将脚本暂停在特定一行。可以在脚本中有疑问处设置一个或多个不同的断点,然后使用调试器去改正脚本中设置的变量或属性的值。当您纠正这些错误之后,可以清除断点以便您的脚本能不间断地运行。

请用 Microsoft 脚本调试程序打开脚本,设置断点。然后用 Web 浏览器请求此脚本。当执行到脚本中含有断点的行时,计算机启动脚本调试程序,并且语句指针会指在设置了断点的行上。

VBScript Stop 语句调试器
通过在服务器端脚本中有问题的部分前面插入 Stop 语句,您也可以将断点添加到用 VBScript 编写的服务器端脚本中。例如,下面的 ASP 脚本包含一个 Stop 语句,用来在显示结果之前暂停执行:

<%
dayvalue = 3
TheDay  =  WeekDayName(dayvalue)
Stop ’set breakpoint here.
Response.Write(“Today is ” + TheDay)
%>
当您在请求 Web 浏览器使用的先前的脚本时,调试程序启动并自动显示 .asp 文件,而且语句指针会指示 stop 语句的位置。一定要记住从交付使用的 .asp 文件中删除 Stop 语句。

用 JScript Debugger 语句调试
要将断点加到用 Microsoft&reg; JScript 编写的服务器端脚本中,可在有疑问的行前插入 debugger 语句。例如,下面的脚本包含了 debugger 语句,每次脚本循环到一个新值时,就会中断执行并自动启动 Microsoft 脚本调试程序。

<%@ Language=”JScript”  %>
<%
for (var count = 1; count <= 10; count++)  {
var eventest = count%2;
debugger       //Sets breakpoint
if (eventest == 0) {
response.write(“Even value is ” + count + “<br>”)
}
}
%>
请记住从交付使用的 .asp 文件中删除 debugger 语句。

注意   不要混淆 debugger 语句和 JScript break 语句。在程序执行期间,break 语句仅退出当前循环,并不激活 Microsoft 脚本调试器,也不暂停程序的执行。

脚本调试技巧
除脚本调试程序外,一套好的调试技巧也能减少花费在分析脚本错误根源上的大量时间。尽管大部分错误是由显而易见的根源导致的,但命令拼写错误或丢失变量、某种类型的逻辑和执行错误也可能因不太明显的根源所致。

用ASP访问数据库

十二月 18, 2008 作者:FDS   类别:ASP 已经有220次浏览

ActiveX Data Objects (ADO) 是一项容易使用并且可扩展的将数据库访问添加到 Web 页的技术。可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源。如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现 ADO 命令语句并不复杂而且容易掌握。同样地,如果您是一个经验丰富的数据库编程人员,您将会正确认识 ADO 的先进的与语言无关性和查询处理功能。

创建 ODBC DSN 文件
在创建数据库脚本之前,必须提供一条使 ADO 定位、标识和与数据库通讯的途径。数据库驱动程序使用 Data Source Name (DSN) 定位和标识特定的 ODBC 兼容数据库,将信息从 Web 应用程序传递给数据库。典型情况下,DSN 包含数据库配置、用户安全性和定位信息,且可以获取 Windows NT 注册表项中或文本文件的表格。

通过 ODBC,您可以选择希望创建的 DSN 的类型:用户、系统或文件。用户和系统 DSN 存储在 Windows NT 注册表中。系统 DSN 允许所有的用户登录到特定的服务器上去访问数据库,而用户 DSN 使用适当的安全身份证明限制数据库到特定用户的连接。文件 DSN 用于从文本文件中获取表格,提供了对多用户的访问,并且通过复制 DSN 文件,可以轻易地从一个服务器转移到另一个服务器。由于以上原因,本主题中的示例将使用文件 DSN。

通过在 Windows 的“开始”菜单打开“控制面板”,您可以创建基于 DSN 的文件。双击“ODBC”图标,然后选择“文件 DSN”属性页,单击“添加”,选择数据库驱动程序,然后单击“下一步”。按照后面的指示配置适用于您的数据库软件的 DSN。

配置 Microsoft Access 数据库的文件 DSN

在“创建新数据源”对话框中,从列表框选择“Microsoft Access Driver”,然后单击“下一步”。
键入您的 DSN 文件名,然后单击“下一步”。
单击“完成”创建数据源。
在“ODBC Microsoft Access 97 安装程序”对话框中,单击“选择”。选择 Microsoft Access 数据库文件 (*.mdb),然后单击“确定”。
注意   由于性能和可靠性的原因,我们极力推荐您使用“客户-服务器数据库引擎”配置由这样一种 Web 应用程序驱动的数据,这些 Web 应用程序必须满足 10 个以上的用户的同时访问。尽管 ASP 可以使用任何 ODBC 兼容的数据库,但它是为使用客户-服务器数据库而设计的,而且经过了严格的测试,这些数据库包括 Microsoft &reg; SQL Server、Oracle 等。

ASP 支持共享文件数据库(如 Microsoft &reg; Access 或 Microsoft &reg; FoxPro)作为有效的数据源。尽管在 ASP 文档中的一些示例使用共享文件数据库,但我们建议只将此类数据库引擎用于开发或有限的配置方案。共享文件数据库可能无法很好地适用于可满足高需求、高质量的 Web 应用程序的客户-服务器数据库。

配置 SQL Server 数据库文件 DSN

注意   如果数据库驻留在远程服务器上,请与服务器管理员联系,获取附加的配置信息;下面的过程使用 SQL Server 的 ODBC 默认的设置,它可能不适用于您的硬件配置。

在“创建新数据源”对话框中,从列表框中选择“SQL Server”,然后单击“下一步”。
键入 DSN 文件的名称,然后单击“下一步”。
单击“完成”创建数据源。
键入运行 SQL 服务程序的服务器的名称、登录 ID 和密码。
在“创建 SQL Server 的新数据源”对话框中,在“服务器”列表框中键入包含 SQL Server 数据库的服务器的名称,然后单击“下一步”。
选择验证登录 ID 的方式。
如果要选择 SQL 服务器验证,请输入一个登录 ID 和密码,然后单击“下一步”。
在“创建 SQL Server 的新数据源”对话框中,设置默认数据库、存储过程设置的驱动程序和 ANSI 标识,然后单击“下一步”。(要获取详细信息,请单击“帮助”。)
在对话框(同样名为“创建 SQL Server 的新数据源”)中,选择一种字符转换方法,然后单击“下一步”。 (详细信息,请单击“帮助”。)
在下一个对话框(同样名为“创建 SQL Server 的新数据源”)中,选择登录设置。
注意   典型情况下, 您只能使用日志来调试数据库访问问题。

在“ODBC Microsoft SQL Server 安装程序”对话框中,单击“测试数据源”。如果 DSN 正确创建,“测试结果”对话框将指出测试成功完成。
SQL server 连接和安全信息
如果您正在开发用于连接远程 SQL Server 数据库的 ASP 数据库应用程序,应考虑以下问题:

连接方案-   您可以选择 TCP/IP 套接字和命名管道的方法访问远程的 SQL Server 数据库。当使用命名管道时,因为在建立连接之前,数据库用户必须被 Windows NT 确认,所以对只有适当的 SQL Server 访问身份而在该计算机上没有 Windows NT 用户帐号的用户可能会被拒绝访问命名管道。作为一种替代方案,使用 TCP/IP 套接字的连接可直接连接到数据库服务器,而不必通过使用命名管道的中间计算机。因为使用 TCP/IP 套接字连接可直接连接到数据库 server,所以通过 SQL Server 的确认,用户就可以获得访问权,而不必通过 Windows NT 的确认。
注意   在连接到远程数据库时使用 TCP/IP 套接字可提高性能。

安全性 -   如果您使用 SQL Server 的 集成或混合安全特性,并且 SQL Server 数据库位于远程服务器上,则不能使用 Windows NT 请求/响应的确认。也就是说,不能将 Windows NT 请求/响应身份证转发到远程计算机上,而只能使用基本身份验证,它根据用户提供用户名和口令信息进行。
有关这一主题的详细信息,请参阅http://www.microsoft.com/sqlsupport/
上的 Microsoft SQL Server 技术支持主页。

配置 Oracle 数据库文件 DSN

首先要确保 Oracle 用户软件被正确地安装要创建 DSN 的计算机上。详细信息,请与服务器管理员联系或参阅数据库软件文档。

在“创建新数据源”对话框中,从列表框中选择“Microsoft ODBC for Oracle”,然后单击“下一步”。
键入 DSN 文件的名称,然后单击“下一步”。
单击“完成”创建数据源。
输入用户名、密码和服务器名,然后单击“确定”。
注意   DSN 文件用 .dsn 扩展名,位于 \Programs\Common Files\ODBC\Data Sources 目录中。

有关创建 DSN 文件的详细信息,请访问 Microsoft ODBC Web 站点:http://microsoft.com/odbc/。

连接数据库
访问数据库信息的第一步是和数据库源建立连接。ADO 提供 Connection 对象,可以使用该对象建立和管理应用程序和 ODBC 数据库之间的连接。Connection 对象具有各种属性和方法,可以使用它们打开和关闭数据库连接,并且发出查询请求来更新信息。

要建立数据库连接,首先应创建 Connection 对象的实例。例如,下面的脚本创建 Connection 对象,接着打开数据库连接:

<%
‘Create a connection object
Set cn = Server.CreateObject(“ADODB.Connection”)
‘Open a connection; the string refers to the DSN
cn.Open  ”FILEDSN=MyDatabase.dsn”
%>
注意    无论在等号 (=) 之前还是之后,DSN 字符串都不能包含空格。

在这种情况下,Connection 对象的 Open 方法引用基于 DSN 的文件,其中包含关于数据库的位置和配置信息。也可以不引用 DSN,直接显式引用供应程序、数据源、用户 ID 和密码。

用 Connection 对象执行查询
用 Connection 对象的 Execute 方法,您可以发出结构化查询语言 (SQL) 查询数据库源并检索结果。SQL 是用于与数据库通讯的工业标准语言,它有许多命令可用来检索和更新信息。

下面的脚本使用 Connection 对象的 Execute 方法在 SQL INSERT 命令的表格中发出查询,该命令将数据插入特定的数据库表格。在下面的示例中,脚本将名称 Jose Lugo 插入名为 Customers 的数据库表中。

<%
‘Define  file based DSN
strDSN = “FILEDSN=MyDatabase.dsn”

‘Instantiate the Connection object and open a database connection
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open strDSN

‘Define SQL SELECT statement
strSQL = “INSERT INTO Customers (FirstName, LastName) VALUES (‘Jose’,'Lugo’)”
‘Use the Execute method to issue a SQL query to database
cn.Execute(strSQL)

%>
注意   基于 DSN 路径字符串的文件在等号(=)前后不应包含空格。

除了 SQL INSERT 命令以外,您也可以使用 SQL UPDATE 和 DELETE 命令更改和删除数据库信息。

用 SQL UPDATE 命令,您可以改变数据库表中各项目值。下面的脚本使用 UPDATE 命令将 Customers 表中每个 LastName 字段包含姓 Smith 记录的 FirstName 字段更改为 Jeff。

<%
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open “FILEDSN=MyDatabase.dsn”
cn.Execute “UPDATE Customers SET FirstName = ‘Jeff’ WHERE LastName = ‘Smith’ ”
%>
要想从数据库表中删除特定的记录,可使用 SQL DELETE 命令。下面的脚本从 Customers 表中删除了所有姓 Smith 的行:

<%
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open “FILEDSN=MyDatabase.dsn”
cn.Execute “DELETE FROM Customers WHERE LastName = ‘Smith’”
%>
注意   在使用 SQL DELETE 命令时,必须谨慎从事。当使用不带 WHERE 子句的 DELETE 命令时,它将删除表中的所有行。一定要包含 SQL WHERE 子句来指定要删除的确切行。

使用 Recordset 对象处理结果
尽管 Connection 对象简化了连接数据库和查询任务,但 Connection 对象仍有许多不足。确切地说,检索和显示数据库信息的 Connection 对象不能用于创建脚本;您必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。

对于检索数据、检查结果、更改数据库,ADO 提供了 Recordset 对象。正如它的名称所暗示的那样,Recordset 对象有许多您可以使用的特性,根据您的查询限制,检索并且显示一组数据库行,即“记录”。 Recordset 对象保持查询返回的记录的位置,允许您一次一项逐步扫描结果。

根据 Recordset 对象的指针类型属性设置,您可以滚动和更新记录。数据库指针可以让您在一组记录中定位到特定的项。指针还用于检索和检查记录,然后在这些记录的基础上执行操作。Recordset 对象有一些属性,可用于精确地控制指针的行为,提高您检查和更新结果的能力。例如,您可以使用 CursorType 和 CursorLocation 属性设置指针的类型,将结果返回给客户端应用程序(结果通常保留在数据库服务器上)并显示其他用户对数据库的最后一次更改。

检索记录
一个成功的数据库应用程序都使用 Connection 对象建立链接并使用 Recordset 对象处理返回的数据。通过“协调”两个对象的特定功能,您可以开发出几乎可以执行任何数据处理任务的数据库应用程序。例如,下面的服务器端脚本使用 Recordset 对象执行 SQL SELECT 命令。SELECT 命令检索一组基于查询限制的信息。查询也包含 SQL WHERE 子句,用来缩小查询的范围。此例中,WHERE 子句将查询限制为所有的 Customers 数据库表中包含的姓 Smith 的记录。

<%
‘Establish a connection with data source
strDSN  = “FILEDSN=MyDatabase.dsn”
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open strDSN

‘Instantiate a Recordset object
Set rsCustomers = Server.CreateObject(“ADODB.Recordset”)

‘Open a recordset using the Open method
‘ and use the connection established by the Connection object
strSQL = “SELECT FirstName, LastName FROM Customers WHERE LastName = ‘Smith’ ”
rsCustomers.Open  strSQL, cn

‘Cycle through record set and display the results
‘ and increment record position with MoveNext method
Set objFirstName = rsCustomers(“FirstName”)
Set objLastName = rsCustomers(“LastName”)
Do Until rsCustomers.EOF
Response.Write objFirstName & ” ” & objLastName & “<BR>”
rsCustomers.MoveNext
Loop

%>
注意,在前面的例子中,用来建立数据库连接的 Connection 对象和 Recordset 对象使用该连接从数据库中检索结果。当您需要精确地设置和数据库建立链接所采用的方式时,这个方法是非常有用的。例如,如果您需要在连接尝试失败之前指定等待的时间,则需要使用 Connection 对象去设置属性。但是,如果您仅仅想使用 ADO 默认的连接属性建立连接,则应该使用 Recordset 对象的 Open 方法去建立链接:

<%
strDSN  = “FILEDSN=MyDatabase.dsn”
strSQL = “SELECT FirstName, LastName FROM Customers WHERE LastName = ‘Smith’ ”
Set rsCustomers = Server.CreateObject(“ADODB.Recordset”)

‘Open a connection using the Open method
‘and use the connection established by the Connection object
rsCustomers.Open  strSQL, strDSN

‘Cycle through the record set, display the results,
‘ and increment record position with MoveNext method
Set objFirstName = rsCustomers(“FirstName”)
Set objLastName = rsCustomers(“LastName”)
Do Until rsCustomers.EOF
Response.Write objFirstName & ” ” & objLastName & “<BR>”
rsCustomers.MoveNext
Loop
%>
当使用 Recordset 对象的 Open 方法建立一个连接时,必须使用 Connection 对象去保证链接的安全。

用 Command 对象改善查询
通过 ADO Command 对象,可以象用 Connection 对象和 Recordset 对象那样执行查询,唯一的不同在于用 Command 对象您可以在数据库源上准备、编译您的查询并且反复使用一组不同的值来发出查询。这种方式的编译查询的优点是您可以最大程度地减少向现有查询重复发出修改的请求所需的时间。另外,您还可以在执行之前通过您的查询的可变部分的选项使 SQL 查询保持局部未定义。

Command 对象的 parameter 集合减少了您的麻烦,使您不必在每次重新发出查询时重新建立查询。例如,如果需要有规律地更新基于库存清单的 Web 系统中的供应和价格信息,可以用下面的方法预先定义查询:

<%
‘Open a connection using Connection object Command object
‘does not have an Open method for establishing a connection
strDSN = “FILEDSN=MyDatabase.dsn”
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open strDSN

‘Instantiate Command object; use ActiveConnection property to attach
‘connection to Command object
Set cm= Server.CreateObject(“ADODB.Command”)
Set cm.ActiveConnection = cn

‘Define SQL query
cm.CommandText = “INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)”

‘Save a prepared (or pre-compiled) version of the query specified in CommandText
‘property before a Command object’s first execution.
cm.Prepared = True

‘Define query parameter configuration information
cm.Parameters.Append cm.CreateParameter(“material_type”,200, ,255 )
cm.Parameters.Append cm.CreateParameter(“quantity”,200, ,255 )

‘Define and execute first insert
cm(“material_type”) = “light bulbs”
cm(“quantity”) = “40″
cm.Execute

‘Define and execute second insert
cm(“material_type”) = “fuses”
cm(“quantity”) = “600″
cm.Execute
%>
请检查上面的例子,您将注意到,脚本用不同的数值重复构建和发出一个 SQL 查询,而没有重新定义和重发送查询到数据库源。用 Command 对象编译查询也可避免 SQL 查询引起的合并字符串和表格变量问题。特别是,通过使用 Command 对象的 Parameter 集合可以避免与定义字符串、日期、时间变量的类型有关的问题。例如,包含“’”的 SQL 查询值可能导致查询失败:

strSQL = “INSERT INTO Customers (FirstName, LastName) VALUES (‘Robert’,'O’Hara’)”
注意,姓 O’Hara 中包含一个“’”,它与在 SQL VALUES 关键字中用来表示数据的“’”冲突。通过将查询数值作为 Command 对象参数绑定,可以避免此类问题。

结合 HTML 表格和数据库访问
包含 HTML 表格的 Web 页可使用户远程查询数据库并且检索特定的信息。用 ADO 您可以创建非常简单的脚本来收集用户表格信息、创建自定义的数据库查询以及将信息返回给用户。使用 ASP Request 对象,您可以检索输入到 HTML 表格的信息并将这些信息合并到 SQL 语句中。例如,下面的脚本模块将 HTML 表格提供的信息插入表格中。此脚本用 Request 对象的 Form 集合收集用户信息。

<%
‘Open a connection using Connection object. The Command object
‘does not have an Open method for establishing a connection
strDSN = “FILEDSN=MyDatabase.dsn”
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open strDSN

‘Instantiate Command object
‘and  use ActiveConnection property to attach
‘connection to Command object
Set cm= Server.CreateObject(“ADODB.Command”)
Set cm.ActiveConnection = cn

‘Define SQL query
cm.CommandText = “INSERT INTO MySeedsTable (Type) VALUES (?)”

‘Define query parameter configuration information
cm.Parameters.Append cm.CreateParameter(“type”,200, ,255 )

‘Define and execute insert
cm(“type”) = Request(“SeedType”)
cm.Execute

%>
管理数据库连接
设计一个能经得起考验的 Web 数据库应用程序(例如为几千个客户服务的联机购物应用程序)的最大挑战,在于如何合理地管理数据库连接。打开并且保持数据库连接,即使在没有信息传输时,也会严重耗费数据库服务器的资源并且可能会导致连接性问题。设计良好的 Web 数据库应用程序将回收数据库连接并能够补偿由于网络堵塞造成的延迟。

使连接超时
活动的突然增长可能使数据库服务器变得十分笨拙,大量增加建立数据库连接的时间。结果是,过长的连接延时将降低数据库的性能。

用 Connection 对象的 ConnectionTimeout,您可以限制放弃连接尝试并发出错误消息之前应用程序等待的时间。例如,下面的脚本设置 ConnectionTimeout 属性,在取消连接尝试之前等待 20 秒:

Set cn = Server.CreateObject(“ADODB.Connection”)
cn.ConnectionTimeout = 20
cn.Open “FILEDSN=MyDatabase.dsn”

默认的 ConnectionTimeout 属性是 30 秒。

注意   在将 ConnectionTimeout 属性合并到数据库应用程序之前,一定要确保连接提供程序和数据源支持该属性。

共享连接
经常建立和中断数据库连接的 Web 数据库应用程序可能会降低数据库服务器的性能。ASP 支持用 ODBC 3.5 的共享特性有效管理连接。连接共享维持打开的数据库连接并管理不同的用户共享该连接,以维持其性能和减少空闲的连接数。对每一个连接请求,连接池首先确定池中是否存在空闲的连接。如果存在,连接池返回连接而不是建立到数据库的新连接。

如果希望将 ODBC 驱动程序加入到连接共享中,则必须配置数据库驱动程序并在 Windows NT 注册表中设置驱动程序的 CPTimeout 属性。当 ODBC 断开连接时,连接被存入池中,而不是被断开。CPTimeout 属性决定在连接池中的连接保留的时间长度。如果在池中连接保留的时间比 CPTimeout 设置的时间长,则连接将被关闭并且从池中删除。CPTimeout 的默认值是 60 秒。

您可以通过创建如下设置的注册表键来有选择地设置 CPTimeout 的属性,从而启用特定 ODBC 数据库驱动程序的连接池:

\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout
(REG_SZ, units are in seconds)

例如,下面的键将 SQL Server 驱动程序的连接池的超时设置定为 180 秒(3 分钟)。

\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180
注意   默认情况下,通过将 CPTimeout 设置为 60 秒,Web 服务器将激活 SQL Server 的连接池。

使用跨页连接
尽管您可以通过存储 ASP 的 Application 对象的连接重复使用跨页连接,但是,始终使连接保持打开是不必要的,也没有充分利用连接池的优点。如果有许多用户需要连接到同一个 ASP 数据库应用程序,一个好方法就是,将跨页连接字符串置于 ASP 的 Application 对象中,重复使用数据库连接。例如,可以在 Global.asa 文件的 Application_OnStart 事件过程中指定连接字符串,如下面的脚本所示:

Application.lock
Application(“ConnectionString”) = “FILEDSN=MyDatabase.dsn”
Application.unlock

然后,在每一个访问数据库的 ASP 文件中写入:

<OBJECT RUNAT=Server ID=cn PROGID=”ADODB.Connection”> </OBJECT>
要想创建连接对象的实例,请使用以下脚本:

cn.Open Application(“ConnectionString”)
对于打开的连接,可以在页尾写入以下脚本,关闭连接:

cn.Close
在单个用户需要重复使用跨页连接的情况下,使用 Session 对象连接比使用 Application 对象更好。
关闭连接
要想更好地使用连接池,就应尽快地关闭数据库连接。默认情况下,当脚本执行完以后,连接将被终止。当不再需要连接时将其关闭,就可以减少对数据库服务器的要求并可以使其他用户能够使用该连接。

可以使用 Connection 对象的 Close 方法终止 Connection 对象和数据库之间的连接。下面的脚本打开连接,然后将其关闭:

<% strDSN = “FILEDSN=MyDatabase.dsn”
Set cn = Server.CreateObject(“ADODB.Connection”)
cn.Open
cn.Close
%>

ASP中使用HTML表单

十二月 18, 2008 作者:FDS   类别:ASP 已经有361次浏览

使用 ASP Request 对象,您可以创建一个简单而功能强大的脚本来收集和处理 HTML 表单数据。在本主题中,您将不仅学会如何创建基本的表单处理脚本,而且还将获得用于验证 Web 服务器和用户浏览器上的表单信息的一些有用技术。

关于 HTML 表单
HTML 表单是收集 Web 信息最常用的方法,是在 Web 页上提供用户界面控件的特殊的 HTML 标记的排列。文本框、按钮和复选框都是典型的控件,这些控件使用户和 Web 页实现交互,并且将信息提交给 Web 服务器。

下面的 HTML 示例产生一个表单,在表单中,用户可以输入姓名、年龄并包含一个将这些信息提交给 Web 服务器的按钮。该表单也包含了一个隐含的控件(Web 浏览器不显示),可以用该控件向 Web 浏览器传递附加信息。

<FORM METHOD=”POST” ACTION=”myfile.asp”>
<INPUT TYPE=”text” NAME=”firstname”>
<INPUT TYPE=”text” NAME=”lastname”>
<INPUT TYPE=”text” NAME=”age”>
<INPUT TYPE=”hidden” NAME=”userstatus” VALUE= “new”>
<INPUT TYPE=”submit”  VALUE=”Enter”>
</FORM>
处理 ASP 输入的表单
在表单向 Web 服务器提交信息时,用户的 Web 浏览器请求用 HTML <FORM > 标记的 ACTION 属性所指定的 .asp 文件(在前面的例子中,该文件被称为 Myfile.asp)。.asp 文件包含了处理表单值(如显示结果表或从数据库查询信息)的脚本。

可以通过三种途径用 .asp 文件收集 HTML 表单的值

静态的 .htm 文件可以包含一个将其数值邮送给 .asp 文件的表单。
.asp 文件可以创建一个将其信息邮送给另一个 .asp 文件的表单。
.asp 文件可以创建一个将其信息邮送给自身的表单,即包含该表单的文件。
前两个方法的操作方式相同,当表单与网关程序交互时,除 ASP 之外,可以包含读取和响应用户选择的命令。

创建一个包含表单定义且传送信息给自身的 .asp 文件较复杂,但却是有很强功能的处理表单的方法。这一过程在 验证表单输入 中演示。

获得表单输入
ASP Request 对象提供了两种集合,在很大程度上简化了检索附加在 URL 请求上的表单信息的任务。

QueryString 集合
QueryString 集合获取作为跟在请求的 URL 的问号后面的文本传递给 Web 服务器的值。通过使用 HTTP GET 方法或手工将表单的值添加到 URL,表单的值可以被附加在请求的 URL 之后。

例如,如果先前的表单示例使用 GET 方法 (ACTION = “GET”) 且用户键入 Jeff、Smith 和 30,那么下面的 URL 请求将被发送给服务器:

http://scripts/Myfile.asp?firstname=Jeff&lastname=Smith&age=30&userstatus=new

Myfile.asp 包含下面的表单处理脚本:

Hello, <%= Request.QueryString(“firstname”) %>   <%= Request.QueryString(“lastname”) %>.
You are  <%= Request.QueryString(“age”) %>  years old.

<%
If Request.QueryString(“userstatus”)  = “new user” then
Response.Write”This is your first visit to this Web site!”
End if
%>
在这种情况下,Web 服务器将返回下面的文本给用户的 Web 浏览器:

Hello, Jeff Smith. You are 30 years old. This is your first visit to this Web site!
QueryString 集合有一个可选参数,可用来访问显示在请求正文中的多个值中的一个。也可以使用 Count 属性计算一个特殊类型的值的出现次数。

例如,表单包含一个多项目的列表框可以提交下面的请求:

http://list.asp?food=apples&food=olives&food=bread

您也可以使用下面的命令去对多个值计数:

Request.QueryString(“food”).Count
如果想显示多个值的类型,List.asp 应包含下面的脚本;

<%Total = Request.QueryString(“food”).Count%>
<%For i = 1 to Total%>
<%= Request.QueryString(“food”)(i)  %> <BR>
<%Next%>
上述脚本将显示:
apples
olives
bread
Form 集合
当使用 HTTP GET 方法去向 Web 服务器传递长而复杂的表单值时,将可能丢失信息。大多数的 Web 服务器倾向于严格控制 URL 查询字符串的长度,以便用 GET 方法传送的冗长的表单值被截断。如果您需要从表单发送大量信息到 Web 服务器,就必须使用 HTTP POST 方法。此法用于在 HTTP 请求正文中发送表单数据,而且发送的字符的个数可以无限多。也可以使用 ASP Request 对象的 Form 集合检索用 POST 方法发送的值。

Form 集合与 QueryString 集合存储数值的方式相同。例如,如果用户用一长串名称填充表单,您就可以用下面的脚本检索这些名称:

<% For i = 1 to Request.Form.Count %>
<% =Request.Form(“names”)(i) %>
<% Next %>
验证表单输入
一个好的表单处理脚本在处理数据前,应先验证输入表单的信息是否有效。验证脚本可以检验用户输入到表单的信息类型是否正确。例如,如果您的 Web 站点包含一个表单,该表单允许用户计算财务信息,那么在处理结果之前,需要验证用户确实输入了数值信息而不是文本。

一个非常方便的验证表单输入的方法是创建一个向自身传递信息的表单。在这种情况下,.asp 文件包含可获取信息的表单。例如,下面的脚本通过向自身传递信息来验证用户是否在 “age” 表单字段中输入了数值:

<% If Isnumeric(Request.QueryString(“Age”)) then %>
<p>Hello, your age is <%=Request.QueryString(“age”)%>
<%Else %>
<p>Please enter a numerical age.
<%End If %>

<FORM METHOD= “POST”  ACTION=”verify.asp”  >
Name: <INPUT TYPE=”text” NAME=”Name” >
Age:  <INPUT TYPE=”text” NAME=”Age” >
<INPUT TYPE=”submit” VALUE=”Enter”>
</FORM>
在这个例子中,脚本也在包含表单的同一 Verify.asp 文件中。表单通过在 ACTION 属性中指定 Verify.asp 向自身传送信息。

您也可以创建客户端脚本来检验用户是否输入了有效的信息。验证用户在 Web 浏览器上的输入除了更迅速地向用户提示表单项错误外,还可以减少 Web 服务器的网络流量。下面的脚本运行在用户的 Web 浏览器上,在将信息提交到 Web 服务器之前,验证用户信息。

<SCRIPT LANGUAGE=”VBScript”>
<!–
Sub btnEnter_OnClick
Dim TheForm
Set TheForm = Document.MyForm
If IsNumeric(TheForm.Age.Value) Then
TheForm.submit
Else
Msgbox “Please enter a numerical age.”
End if
End Sub
//–>
</SCRIPT>

<FORM  METHOD= “POST” NAME= MyForm  ACTION=”myfile.asp”  >
Name: <INPUT TYPE=”text” NAME=”Name” >
Age:  <INPUT TYPE=”text” NAME=”Age” >
<INPUT TYPE=”button” NAME=”btnEnter”  VALUE=”Enter”>
</FORM>

Page 1 of 712345»...Last »