9.3.1 ASP概述
1.ASP简介
ASP是位于服务器端的脚本运行环境,通过这种环境,用户可以创建和运行动态的交互式 Web服务器应用程序,如交互式的动态网页,上传与下载等等 。
ASP使用 ActiveX技术基于开放设计环境,用户可以自己定义和制作组件加入其中,使自己的动态网页几乎具有无限的扩充能力。
ASP可利用 ADO(Active Data 0bject,微软的一种新的数据访问模型,从而使得开发基于 WWW的应用系统成为可能。
8.1 计算机网络基本概念
9.3 ASP编程基础
2.ASP的特点
使用 VBScript和 JScript等简单易懂的脚本语言,
结合 HTML代码,完成网站的应用程序开发 。
用 ASP技术设计的网页是以,asp为扩展名的文本文件 。 使用普通的文本编辑器 (如记事本 )就可进行编辑设计 。 容易编写,无须编译,可在服务器端直接执行 。
与浏览器无关 。 用户端只要使用可执行 HTML代码的浏览器即可浏览使用 ASP技术设计的网页 。 ASP
页面所使用的脚本语言均在 Web服务器端执行,
然后把执行结果传送到用户端的浏览器 。
ASP的源程序只在服务器端执行,不会被传到客户端浏览器,因而可以避免源程序外泄,提高了程序的安全性 。
可使用服务器端的脚本来产生客户端的脚本 。
ActiveX服务器元件具有无限可扩充性 。 可以使用 Visual Basic,Java,Visual C++,COBOL等编程语言定制自己所需要的 ActiveX服务器组件 。
3.ASP运行环境
(1)安装 IIS 5.O
如果操作系统是 Windows 2000 Server或者是
Windows 2000 Advanced Server 的话,IIS
5.0已经是默认安装上的 。
如果是 Windows 2000 Professional,则需要安装 IIS 5.0。 从操作系统,控制面板,中找到并双击,添加/删除程序,,单击,添加/
删除 Windows组件,,选择,Internet信息服务 ( IIS),,然后选择详细信息 。
Internet信息服务( IIS)
单击,确定,以后,放入 Windows 2000的安装盘,
出现安装界面,进行安装 。 最后点击,完成,按钮,完成安装 。
安装完毕后,可以测试一下是否安装成功 。 打开浏览器,在浏览器的地址栏中输入
http://localhost或者 http://127.0.0.1
如果安装成功的话,将会出现欢迎界面 。
http://localhost/localhost.asp
http://localhost/iishelp/iis/misc/default.asp
( 2) 配置 IIS 5.0
进入 IIS的管理界面可以在,控制面板,的,管理工具,中打开,Internet服务管理器,。
IIS的管理界面如下图所示 。
鼠标右键点击,默认 Web站点,后,选择,属性,菜单项,在出现的对话框中选择,主目录,选项卡选择此计算机上的目录选择默认的根目录,也可通过浏览来选择其他目录首先在 C盘根目录下建立一个文件夹:,asproot”,
将网站的主目录设置到该目录下,
“主目录,选项卡文档选项,该选项的意义是:
如果 IIS找不到默认打开的文件,就将该目录下的所有文件列出。
在 C:\asproot目录下新建一个文件
,test,txt”,点击默认 Web站点,
在 IIS的管理界面显示该文件。
鼠标右键点击,默认 Web站点,选择,浏览,选项卡,IIS5.0自动打开浏览器,如下图所示。
(3)测试 ASP运行环境
例 9.1让程序输出字符串,你好,中国 !我的祖国,,测试 ASP运 行 环 境,程 序 名 称,9-
01,asp
<html>
<body>
<%
Response.Write "你好,中国 !我的祖国 !"
%>
</body>
</html>
文件命名为 9-01.asp,保存到 c:\asproot目录下 。
在浏览器中输入 http,//localhost,可以看到程序列表,如下图所示 。
单击该 ASP文件,可输出字符串,如下图所示。
4,ASP运行模型
浏览器从 Web服务器上请求,asp文件时,ASP脚本开始运行 。 然后 Web服务器调用 ASP引擎,ASP引擎会全面读取请求的文件,执行所有脚本命令,并将 Web页传送给浏览器 。
由于脚本在服务器上而不是在客户端运行,传送到浏览器上的 Web页是在 Web服务器上生成的 。 ASP
程序的运行与浏览器无关 。 由于只有脚本的结果返回到浏览器,所以服务器端的脚本不易被复制,
用户看不到 ASP页的程序源代码 。
5.ASP的工作原理
Web Server对静态页面请求的处理过程:
(1)当一个用户从浏览器网址栏中输入所要浏览的
Web页面的地址并按,Enter”键后,这个页面请求便通过浏览器送到对应的 Web服务器 。
(2)服务器接到这个请求并根据请求文件的扩展名,htm或者,html的判断出请求一个 HTML的页面是,或者 扩展名为,asp,请求某种操作 。
(3)服务器从目前内存或硬盘上读取相对的 HTML文件并将其传回给用户端浏览器,或者启动 ASP程序,执行请求的操作 。
(4)浏览器将接收到的 HTML程序解释运行并将结果提供给用户 。
浏览器
Web Server
( IIS)
ASP
嵌入式程序数据库其它
下图 9-12所示为简化后 ASP的运行过程。用户向 Web服务器传送一个,asp的页面请求服务器根据请求,asp的扩展名,判断出用户要浏览的是一个 ASP文件从内存或硬盘上读取相对的 ASP文件在服务器这个 ASP程序被编译或解释运行,产生 HTML文件传回给用户端浏览器并由浏览器解释运行
6.创建 ASP页
创建,asp文件非常容易 。 如果要在 HTML文件中添加脚本,只需将该文件的扩展名,htm或,html替换为,asp就可以了 。
脚本是一系列的命令和指令,指示 Web服务器执行操作 。 脚本命令通过定界符与文本区别开来 。
ASP使用定界符 <% 和 % >,在定界符中写入相关命令 。
定界符括入的命令被称为主脚本命令 。 默认情况下,主脚本命令语言是 VBScript。
在 ASP定界符中可以包含任何主脚本语言中合法的语句,表达式,过程或操作符 。
例 9.2:用在 HTML文件中添加脚本的方法创建一个,asp文件 。 在一个 HTML页上显示该页被访问的时间,文件名为 9-02.asp。
<html>
<body>
This paqe was last refreshed on <%=Now %>
</body>
</html>
Web服务器处理该页时,会使用当前的日期和时间替换 <% =Now% >并且将该页返回到浏览器,
VBScript函数 Now返回当前的日期和时间
例 9.3根据访问网页的时间返回相应的问候语 。 文件名为 9-03.asp。
<%
if time>=#12:00:00 AM# And time<#12:00:00 PM#
Then
Greeting="Good Morning!"
else
Greeting="Hello!"
end if
%>
<%=Greeting %>
将值,Good Moming!”或值,Hello!”
存储在变量 greeting中将当前的变量值发送到浏览器正午 12点前浏览该脚本正午 12点以后浏览该脚本
7.ASP的指令
ASP为用户提供了脚本语言以外的指令:输出指令和处理指令 。
( 1) ASP的输出指令 显示表达式 expression的值:
<% =expression% >
例如,sport变量的当前值为 climbing,输出表达式 <% =sport% >,将文字 climbing传送到浏览器 。
( 2) ASP的处理指令 提供处理,asp文件所需信息 。
<% @keyword% >
例如,下面的指令将 VBScript设为该页的主脚本语言:
<%@ LANGUAGE=VBScript %>
处理指令必须出现在,asp文件的第一行 。 不要将处理指令放在包含 #include语句的文件中 。 必须在标记 ( @) 和关键字之间加入一个空格 。 处理指令有下列关键字:
LANGUAGE关键字:设置 Web页的脚本语言 。
CODEPAGE关键字:设置 Web页的字符编码 。
LCID关键字:设置 Web页的 Locale ID 。
ENABLESESSIONSTATE关键字:指定 ASP页是否使用会话状态 。
可以在单个指令中包含多个关键字;关键字/值对之间必须由空格分开,在等号 (=)左右不加空格 。
例 9.4 下面是一个典型的在同一,asp 文件中使用两种脚本语言的例子:
<HTML>
<BODY>
<TABLE>
<%Call Callme%>
</TABLE>
<%Call ViewDate%>
</BODY>
</HTML>
<% %> 符号是标准的 ASP定界符
<!VBScript脚本 >
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Callme
Response.Write
"<TR><TD>Call</TD><TD>Me</TD></TR>"
End Sub
</SCRIPT>
< SCRIPT>和 < /SCRIPT> 之间是脚本语言
<!JavaScript脚本 >
<SCRIPT LANGUAGE=JavaScript RUNAT=Server>
function ViewDate()
{
var x
x=new Date() 当前日期时间
Response.Write(x.toString())
发送当前日期时间到浏览器,返回字符串形式的数值
} // </SCRIPT>
UTC:协调世界时进入
9.3.2 ASP的语句结构
1.选择结构
(1)If...Then...Else 语句例 9.5
<html>
<head>
<title>ifrespond.asp</title>
</head>
<body>
<% fname=request.querystring("Firstname")
lname=request.querystring("Lastname")
If fname="George" and lname="Washington,then %>
Hi.You must be the first president!
<% else %>
Hi! Nice to Meet You
<%end if%>
</body>
</html>
例 9.6
<html>
<body>
<FONT COLOR="Green">
<% If Time < #12:00:00# And Time >= #00:00:00# Then
%>
早上好,今天天气不赖啊 !
<% ElseIf Time < #19:00:00# And Time >= #12:00:00#
Then %>
下午好 !
<% Else %>
哈喽 ! 今晚你有没有去 IRC 聊天 !
<% End If %>
</body>
</html>
(2)Select Case语句例 9.7
<%
fname=request.querystring("Firstname")
lname=request.querystring("Lastname")
name=fname+lname
Select case name
case "georgewashington"
response.write "Hi.You must be the first
president!<p>"
case "ronaldreagan"
response.write "Hi.You must be the actor
president!<p>"
case "jimmycarter"
response.write "Hi.You must be the peanut
farmer president!<p>
case else
response.write "Hi!Nice to Meet You"
End Select
%>
2.循环结构
(1)Do Until,.,Loop
(2)Do..,Loop Until
例 9.8
<html>
<head>
<title>DoLoop.asp</title>
</head>
<body>
<p> 请将今年到本月为止的每个月份的销售结算记录填写在本页之上 。 <P>
<% counter=1
thismonth=month(now( ))
Do while counter < thismonth+1
response.write " " & counter & " 月份,"
response.write
"______________________________" & "<BR><br>"
If counter > 13 then
exit do
end if
counter = counter+1
Loop
%>
<hr></body>
</html>
( 3) For… Next语句例 9.9
<% for i=1 to 6%>
<p><center><img src="smile.gif" width="32"
height="32" alt="晚上好 "></p>
<% next %>
( 4) For Each… Next语句例 9.10
<%
For Each i in d
<d包含 hobby变量 >
Request.querystring("hobby")
Response.Write i & "<BR>"
Next
%>
9.3.3 ASP的内置对象
Active Server Pages 提供内建对象,这些对象使用户更容易收集通过浏览器请求发送的信息,响应浏览器以及存储用户信息 ( 如用户首选项 ) 。
Application 对象
Application 对象可以使给定应用程序的所有用户共享信息 。
Request 对象
使用 Request对象可以从浏览器的最终用户接受请求,包括从 HTML表格用 POST方法或 GET方法传递的参数 。 使用 Request对象能访问发送给服务器的二进制数据,如上载的文件 。
Response 对象
使用 Response 对象可以向浏览器发送信息以便向用户显示它 ; 发送给用户的信息 。 包括直接发送信息给浏览器,重定向浏览器到另一个 URL 。
Server 对象
Server 对象可以创建其他对象并确定服务器特定的属性 。 最常用的方法是创建 ActiveX 组件的实例 (Server.CreateObject)。 其他方法用于将
URL 或 HTML 编码成字符串,将虚拟路径映射到物理路径以及设置脚本的超时期限 。
Session 对象
使用 Session 对象可以维护有关当前用户会话的信息并保存和获取用户会话的状态信息 。 当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除;而用户在应用程序中访问页时,这些变量始终存在 。 也可以使用 Session
方法显式地结束一个会话和设置空闲会话的超时期限 。
1,Request对象
使用 Request对象可以访问任何通过 HTTP请求传递的信息,包括从 HTML表格用 Post方法或 Get方法传递的参数,Cookie和用户认证 。 HTTP 请求包含当前用户的有关信息,在请求前输入的任何数据,以及告诉 Web 服务器如何处理和响应请求的参数 。
(1)Cookie 的基本工作原理 。
Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。
假设在用户请求访问一个网站 www.contoso.com
上的某个页面时,网站的应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie。用户的浏览器在获得页面的同时还得到了这个 Cookie,并且将它保存在用户硬盘上的某个文件夹中。
(1)Cookie 的基本工作原理 。
如果该用户再次访问站点上的页面,当该用户通过 URL输入这个网站的网址时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到这个的站点,网站的应用程序就能确定该用户上一次访问站点的日期和时间。网站可以根据这些信息向用户发送一条消息,也可以检查过期时间或执行其他有用的功能。
Cookie 是与 Web 站点而不是与具体的多个页面关联的。
(2) Cookie 的用途
帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持 Web 应用程序连续性
(即执行,状态管理,)的方法。浏览器和 Web
服务器除了在短暂的实际信息交换阶段以外总是断开的。然而在大多数情况下,都有必要让 Web
服务器在用户请求某个页面时对用户进行识别。
例如,购物站点上的 Web 服务器跟踪每个购物者,
以便站点能够管理购物车和其他的用户相关信息。
Cookie 的作用就类似于名片,它提供了相关的标识信息,可以帮助应用程序确定如何继续执行。
Request对象的语法如下:
Request[,集合 |属性 |方法 ](变量 )
可以使用 Request对象的集合来访问信息,有
Form集合 和 QueryString集合,。
(1)Form集合
HTTP POST 方法用于在 HTTP 请求正文中发送表格数据,当浏览器使用 POST 方法传递请求时,
Request对象的 Form集合检索用 POST方法发送的值,该值是 HTTP请求正文中的表格元素的值 。
语法格式如下:
Request.Form(element){(index)|.count}
参数说明:
element:指定集合要检索的表格元素的名称。
index:可选参数,使用该参数可以访问某参数中多个值中的一个。它可以是 1到 Count之间的任意整数。
Count:集合中元素的个数。
例 9.11 本例将示范如何利用 Request对象的 Form集合属性来取得用户在表单中填写的信息 。 文件名为 9-
11.asp和 9-11.htm。
test9-11.htm内容如下:
<html>
<body bgcolor="#FFFFFF">
<form method="post" action="9-11.asp">
姓名,<input type="text" name="yourname"><br>
性别,<select name="gender">
<option>男 </option>
<option>女 </option>
</select> <br>
留言,<textarea name="message">你好 !
注意多行文本的处理 </textarea> <br>
爱好 (按住 Ctrl键可多选 ):
<select name="hobby" multiple size="4">
<option>电脑 </option>
<option>购物 </option>
<option>电影 </option>
<option>读书 </option>
</select> <br>
<input type="submit" name="Submit" value="
提交 ">
<input type="reset" name="Submit2"
value="Reset">
</form>
</body>
</html>
9-11.asp内容如下:
<%@ Language=VBScript %>
<%
Dim StrName,StrGender,StrM,StrMsg
StrName = Trim(Request.Form("yourname"))
StrGender = Trim(Request.Form("gender"))
StrM = Trim(Request.Form("message"))
StrMsg = Replace(StrM,vbcrlf,"<Br>" & vbcrlf)
%>
vbcrlf:回车符和换行符
Replace函数,将字符串 StrM中的
vbcrlf替换为 "<Br>" & vbcrlf
<HTML><BODY>
姓名,<%= StrName%><Br><Br>
性别,<%= StrGender%><Br><Br>
留言,<Br><Br>
<%=StrM%><Br><Br>
<%=StrMsg%><Br><Br>
实际上,"提交 "按钮的值也被传递,<Br>
<%=Request.Form("Submit")%><Br><Br>
<%
Response.Write " 共 选 择 爱 好 项 数," &
Request.Form("hobby").Count & "<Br>"
Dim I
For I = 1 to Request.Form("hobby").Count
Response.Write Request.Form("hobby")(I)
& "<Br>"
Next
%>
</BODY>
</HTML> 由浏览器传递过来的 hobby值根据用户选择可以有 n项,( I)表示顺序打印各项本例的运行结果如下图所示。
(2)QueryString
在 Web页面上,客户端的信息传送除了使用 form之外,
另一种常见方式为 Querystring。 当一个请求通过
GET方法传递时,获取在一个 URL 中附加的参数值 。
QueryString集合检索 HTTP查询字符串中变量的值,
HTTP查询字符串由问号 (?)后的值指定 。 如:
<A HREF=”example.asp?
string=this is a sample"> string sample</ A>
生成值为,this is a sample”的变量名字符串 。
通过发送表格或由用户在其浏览器的地址框中键入查询也可以生成查询字符串 。
语法格式如下:
Request.QueryString(variable)[(index)|.Count]
例 9.12示范通过 Request对象的 QueeryString数据集合来获取用户数据 。 文件名为 9-12.asp和 9-
12.htm。
9-12.htm内容如下:
<html>
<body bgcolor="#FFFFFF">
<form method="get" action="9-12.asp">
英文姓名,<input type="text" name="Ename"> <br>
中文姓名,<input type="text" name="Cname"><br>
性别,<select name="gender">
<option>男 </option>
<option>女 </option>
</select> <br>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="Reset">
</form>
</body>
</html>
9-12.asp内容如下:
<%@ Language=VBScript%>
<%
Dim StrCname,StrEname,StrGender
StrEname = Trim(Request.QueryString("Ename"))
StrCname = Trim(Request.QueryString("Cname"))
StrGender = Trim(Request.QueryString("gender"))
%>
<HTML>
<BODY>
英文姓名,<%=StrEname%><Br><Br>
中文姓名,<%=StrCname%><Br><Br>
性别,<%=StrGender%><Br><Br>
看看提交的字符串,<Br>
<%=Request.ServerVariables("QueryString")%>
</BODY>
</HTML>
获取预定的服务器变量,诸如表头值、
登录名字或使用的服务器协议等信息
本例的运行结果如下图所示。
例 9.13处理相应单一值的 Query字段 。
这里的链接中包含了一个 Query字段,choice”。 文件名为 9-13.asp和 9-13.htm。
9-13.htm内容如下:
<html>
<body>
<p><font size="5">您需要的服务是,</font></p>
<p><a href="9-13.asp?choice=1">硬件服务 </a></p>
<p><a href="9-13.asp?choice=2">软件服务 </a></p>
<p><a href="9-13.asp?choice=3">其它服务 </a></p>
</body>
</html>
9-13.asp内容如下:
<html>
<body>
<% select case request.QueryString("choice")
case "1"
response.Write("你选择了硬件服务 ")
case "2"
response.Write("你选择了软件服务 ")
case "3"
response.Write("你选择了其它服务 ")
end select
%>
</body>
</html>
当用户在页面中单击任意一个链接时,该链接相应的
Query字段就被提交给服务器,服务器根据保存在
Request.Querystring(“choice”)中的值判断出用户的选择,并做出正确的响应 。 运行结果如下图所示 。
例 9.14 验证表格输入 。
验证方法一,ASP程序将信息提交到 web服务器之前,
先将用户信息进行验证;
验证方法二,ASP程序 创建一个向自身传递信息的表格 。 此例验证,age”中是否为数字,文件名为
9-14-1.asp和 9-14-2.asp。
9-14-1.asp内容如下:
<SCRIPT LANGUAGE="VBScript">
Sub btnEnter_OnClick
Dim TheForm
Set TheForm = Document.MyForm
DEFINE CLASS MyForm AS Form
If IsNumeric(TheForm.Age.Value) Then
Msgbox " Ok"
TheForm.submit
Else
Msgbox "Please enter a numerical age."
End if
End Sub
</SCRIPT>
<html>
<head>
<title>test</title>
<body>
<FORM METHOD= "POST" NAME=MyForm ACTION="9-
14-1.asp" >
Name,<INPUT TYPE="text" NAME="Name" >
Age,<INPUT TYPE="text" NAME="Age" >
<INPUT TYPE="button" NAME="btnEnter"
VALUE="Enter">
</FORM>
</body>
</html>
9-14-2.asp内容如下:
<% If Isnumeric(Request.QueryString("Age"))
then %>
<p>Hello,your age is <% =
Request.QueryString("age")%>
<%Else%>
<p>Please enter a numerical age.
<%End If%>
<html>
<title>test</title>
<body>
<FORM METHOD="GET" ACTION="9-14-2.asp" >
Name,<INPUT TYPE="text" NAME="Name" >
Age,<INPUT TYPE="text" NAME="Age" >
<INPUT TYPE="submit" VALUE="Enter">
</FORM>
</body>
</html>
本例的运行结果如下图所示。
(3) Cookies
当用户第一次请求给定的应用程序中的,asp 文件时,ASP 生成一个 SessionID。 它唯一标识每个 用 户 会 话 。 在 新 会 话 开 始 时,服 务 器 将
Session ID 作为一个 cookie 存储在用户的 Web
浏览器中 。
SessionID 与钥匙很相似,当会话期间用户与应用程序交互时,ASP 可以将用户信息存储在服务器的一个,保险箱,中 。 正象用钥匙能存取保险箱中物品一样,通过在 HTTP 请求标题中发送的用户 SessionID cookie,就能够对该,保险箱,
中的内容进行访问 。 每当 ASP 收到一个页请求时,
就 检 查 HTTP 请 求 标 题,以 获 得 SessionID
cookie。
在会话活动中 cookie 是 Web 服务器嵌在用户的
Web 浏览器中,用来代表用户的令牌 。
当下次同一浏览器请求一页时,浏览器将发送从
Web 服务器收到的 cookie。 cookie 允许有一组信息与用户关联 。
ASP 脚本使用 Response 和 Request 对象的
Cookies 集合,可以获取和设置 cookie 的值 。
Request提供的 Cookies集合允许检索用户在 HTTP
请求中发送的 cookie的值,即允许读 cookie的值 。
这项功能经常被使用在要求认证客户密码以及电子公告板,Web聊天室等 ASP程序中 。
语法格式如下:
Request.Cookies(cookie){(key)|.attribute}
Response.Cookies(cookie)[([(key)|.attribute]
= value
参数说明:
cookie:指定要检索其值的 cookie。
Key:可选参数,用于从 cookie字典中检索子关键字的值 。
Attribute:指定 cookie自身的有关信息 。 如:
HasKeys只读,说明 cookie是否包含关键字 。 可以通过包含一个 key值来访问 cookie字典的子关键字 。
如果访问 cookie字典时未指定 key,则所有关键字都会作为单个查询字符串返回 。
例如,如果 MyCookie有两个关键字,First和 Second,
而在调用 Request.Cookies时并未指定其中任何一个关键字,那么将返回下列字符串 。
First=firstkeyvalue & second=secondkeyvalue
Response.Cookies的使用,例如:
RResponse.Cookies("mycookie")("type1“)="sugar"
RResponse.Cookies("mycookie“)("type2“)="ginger
snap"
%>
例 9.15 cookie应用实例 。 文件名为 9-15.asp:
<%
nickname=request.form("nick")
response.cookies("nick")=nickname
用 response对象将用户名写入 Cookie之中
response.write "欢迎 "&request.cookies("nick")
& "光临小站 ! "
%>
<html>
<body>
<form method="POST" action="9-17.asp">
<p>
<input type="text" name="nick" size="20">
<input type="submit" value="发送 " name="B1">
<input type="reset" value="重填 " name="B2">
</p></form>
</body>
</html>
本例的运行结果如下图所示。
(4)ServerVirables
获取诸如表头值,登录名字或使用的服务器协议等信息 。
在浏览器中浏览网页的时候使用的传输协议是
HTTP,在 HTTP的标题文件中会记录一些客户端的信息,如客户的 IP地址等等,有时服务器端需要根据不同的客户端信息做出不同的反映,这时候就需要用 ServerVirables集合获取所需信息 。 语法格式为:
Request.ServerVariables(服务器环境变量 )
由于服务器环境变量较多,在此仅将一些常用的变量在表 9.1中列出 。
表 9,1
服务器环境变量 描述
ALL_HTTP 客户端发送的所有 HTTP标题文件
CONTENT_LENGTH 客户端发出内容的长度
CONTENT_TYPE 内容的数据类型 。 如:,text/ html”。 同附加信息的查询一起使用,如 HTTP查询 GET、
POST和 PUT
LOCAL_ADDR 返回接受请求的服务器地址 。 如果在绑定多个 IP地址的多宿主机器上查找请求所使用的地址时,这条变量非常重要用
LOGON_USER 客户登录 Windows NT的账号
QUERY_STRING 查询 HTTP请求中问号 (?)后的信息
REMOTE_ADDR 发出请求的远程主机 (client)的 IP地址
REMOTE_HOST 发出请求的主机 (client)名称。如果服务器无此信息,它将设置为空的
REMOTE_ADDR变量
REQUEST_METHOD 该方法用于提出请求。相当于用于 HTTP
的 GET,HEAD,POST等等
SERVER_NAME 出现在自引用 URL中的服务器主机名、
DNS化名或 IP地址
SERVER_PORT 发送请求的端口号例 9.16 使用以下脚本打印出所有的服务器环境变量 。
文件名为 9-16.asp。
<HTML>
<BODY>
<%
Response.Write "运行 ASP文件的路径,"&_
Request.ServerVariables("Script_Name")&"<Br>"
Response.Write "返回 content的数据长度,"&_
Request.ServerVariables("Content_Length")&"<Br>"
Response.Write,返回客户端的 IP地址,"&_
Request.ServerVariables("Remote_Addr")&"<Br>"
被执行的脚本程序的路径客户端接收的脚本字节数
Response.Write "返回浏览器名,"& _
Request.ServerVariables("HTTP_USER_AGENT")&_
"<Br>"
Response.Write "返回主页实际物理路径,"&_
Request.ServerVariables("APPL_PHYSICAL_PATH")&_
"<Br>"
%>
<table>
<tr>
<td align=CENTER bgcolor="#800000" width="109">
<font style="ARIAL NARROW" color="#FFFFFF"
size="2">环境变量名 </font></td>
<td align=CENTER width=459 bgcolor="#800000">
<font style="ARIAL NARROW" color="#FFFFFF"
size="2">内容 </font></td>
</tr>
<tr>
<td bgcolor="#F7EFDE" align=CENTER>
<font style="ARIAL NARROW" size="2">
result1
</font></td>
<td bgcolor="#F7EFDE" align=CENTER>
<font style="ARIAL NARROW" size="2">
result2
</font></td></tr>
</table>
</BODY>
</HTML>
本例的运行结果如下图所示。
2,Response对象
Response对象是用来控制发送给用户的信息,包括直接发送信息给浏览器,重定向浏览器到另一个 URL或设置 Cookie的值 。 语法格式如下:
Response.collection|property|method
(1)属性
① Buffer属性:
指示是否缓冲页输出 。 当缓冲页输出时,只有当前页的所有服务器脚本处理完毕或者调用了 Flush
或 End方法后,服务器才将响应发送给客户端浏览器,服务器将输出发送给客户端浏览器后就不能再设置 Buffer属性 。 因此应该在,asp文件的第一行调用 Response.Buffer。
将缓冲区的数据写入文件
② Charset属性
设置或者返回字体中所用字符集,将字符集名称
( CharsetName) 附加到 Response对象中 content-
type标题的后面 。 格式为:
Response.Charset(CharsetName)
如果某个页包含多个含有 Response.Charset的标记,则每个 Response.Charset都将替代前一个
CharsetName。 这样,字符集将被设置为该页中
Response.Charset的最后一个实例所指定 。
③ ContentType属性
指 定 服 务 器 响 应 的 HTTP 内 容 类 型 。 使用
ContentType 属性可以为发送给用户的内容设置
HTTP 内容类型 字符串 。
默认 内容类型 为 text/HTML。 如果在,asp文件中指定 content-type标题,例如
<% Response.Charset=”gb2312“)% >,
将产生以下结果:
content-type,text/ html; Charset=gb2312。
例如,设置内容类型 application/x-cdf,告诉浏览器用通道定义来解释字节 。
<% Response.ContentType =_
"application/x-cdf" %>
④ Expires属性
指定在浏览器上缓冲存储的页距过期还有多少时间 。
如果用户在某个页过期之前又浏览到此页,就会显示缓冲区中的页面 。
如果设置 <% Response.Expires = 0 %>,则强迫缓存的页面立即过期 。
因为在任何页被发送之前,HTTP 标题必须被送给浏览器,所以可通过将 Response.Expires 属性放在 HTML 标记之前或使用 Response.Buffer 缓存该页 。
⑤ ExpiresAbsolute属性
指定缓存于浏览器中的页面的确切到期日期和时间 。
在未到期之前,若用户返回到该页,该缓存中的页面就显示 。 如果未指定时间,该主页在当天午夜到期 。 如果未指定日期,则该主页在脚本运行当天的指定时间到期 。 如下示例指定页面在 2005年 12月 10
日上午 9点 00分 30秒到期 。
<% Response.ExpiresAbsolute
=#Dec 12,2005 9:00:30#% >
(2)方法
① Clear方法
清除缓冲区中的所有 HTML输出 。 但 Clear方法只清除响应正文而不清除响应标题 。 可以用该方法处理错误情况 。
② End方法
使 Web服务器停止处理脚本并返回当前结果 。 文件中剩余的内容将不被处理 。 如果
response.Buffer 已设置为 TRUE,则调用
Response.End将缓冲内容输出到浏览器 。
③ Flush方法
立即将缓冲区中的内容输出到文件,传递到浏览器 。
但 Response.Buffer需设置为 True。
④ Redirect方法
使浏览器立即重定向到程序指定的 URL。
如果使用 Redirect方法,任何在页中显式设置的响应正文内容都将被忽略 。 此方法不再向客户端发送该页设置的其他 HTTP标题,将产生一个将重定向
URL作为链接包含的自动响应正文 。
例如,发送下列显式标题,其中 URL是传递给该方法的值,
<% Response.redirect(“www.chinabyte.com”)% >
⑤ Write方法
最常用的方法之一,将指定的字符串写到当前的
HTTP输出 。 例如
< % Response.write(" 欢迎进入我的个人天地 ! ")
%>
(3)集合
Response对象只有一个集合,Cookie。
Cookies集合设置 cookie的值 。 若指定的 cookie
不存在,则创建它 。 若存在,则设置新的值并且将旧值删去 。
语法格式为:
Response.cookies(cookie){(key)|.attribute}
=value
cookie指定 cookie的名称 。 如果指定了 key,则该 cookie就是一个字典 。
Response.Cookies 只支持写操作
attribute 指定 cookie 自 身 的 有 关 信 息 。
attribute参数可以是下列之一:
① Domain:若被指定,则 cookie将被发送到对该域的请求中去 。
② HasKeys:指明 cookie是否包含关键字 。 在 Cookie
中遍历子关键字 (Subkeys) 集合时,可以通过使用 HasKeys 先检查 cookie 是否含有子关键字
(Subkeys)。
③ Path:若被指定,则 cookie将只发送到对该路径的请求中 。 如果未设置该属性,则使用应用程序的路径 。
④ Expires:指定 cookie的过期日期 。 为了在会话结束后将 cookie存储在客户端磁盘上,必须设置该日期 。 若此项属性的设置未超过当前日期,则在任务结束后 cookie将到期 。 如果希望 cookie 只在当前的用户会话中被使用,则只需向浏览器发送 cookie。 但是,如果要在用户已经终止或重新启动浏览器之后确认用户,就必须强制浏览器将
cookie 存储在计算机的硬盘上 。 要保存 cookie,
将日期设置为此后的某一天:
<% Response.Cookies("planet")
="Mars"Response.Cookies("planet").Expires
= "January 1,2006" %>
例 9.17本例将示范 Request对象和 Response对象中的
Cookies属性的结合使用 。 文件名为 9-17,asp。
<%
Response.Cookies("aspCookies")("name")="fanc"
Response.Cookies("aspCookies")("sex")="girl"
Response.Cookies("aspCoolies")("Email")_
="kongqy@tom.com"
%>
<html>
<body>
<% For Each Cookiesname in Request.Cookies
If Request.cookies(Cookiesname).haskeys Then
For Each keyCookies In_
Request.Cookies(Cookiesname)
Response.Write"[DIR]" & keyCookies & _
"的内容是,"Response.Write_
Request.Cookies(Cookiesname)(keyCookies) &_
"<br>"
Next
else
Response.Write Cookiesname &"的内容是,"&_
Request.Cookies(Cookiesname) & "<br>"
end if
next
%>
</body>
</html>
进入
本例的运行结果如下图所示。
例 9.18 本例将示范 Request对象和 Response对象中的 Expires,QueryString方法的使用,文件名为 9-18a.asp和 9-18b.asp。
9-18a.asp内容如下:
<html>
<body>
<p>
<%
Dim user
Dim flag
Dim pwd
Dim say
Response.buffer=true '开启缓冲页面功能
Response.ContentType="text/HTML"
Response.Charset="gb2312"
user=Request.Form("username")
pwd=Request.Form("password")
say=Request.QueryString("say")
%>
</p>
<p><form method="POST" action="9-18b.asp"><p>
用户名,<input type="text" name="username“_
size="12"><br>
口 令,<input type="password" name="password“_
size="12"><br>
<input type="submit" value="提交 " name="B1">
<input type="reset" value="取消,_
name="B2"></p> </form>
<% If say=1 then
Response.Write "欢迎书生大驾光临 !"
End If
If say>1 then
Response.Write "欢迎再次光临书生的 ASP 网站 !"
End If
If user="Admin" and pwd="wangzhan" Then
Response.Expires=1
设置该页面在浏览器的缓冲中存储 1分钟后过期
flag=1
Else If user="guest" and pwd="guest" Then
Response.Expires=0 '使缓存的页面立即过期
Response.Clear '清空存储在缓存中的页面
flag=2
Else If user="vip" and pwd="vip" Then
Response.Write_
"欢迎 VIP 光临书生的 ASP 网站 "
flag=3
Else
flag=0
Response.end
'立即停止脚本处理,并将缓存中的页面输出
End If
End if
End if
Response.write "<p><a href='9-18b.asp?flag_
=" & flag & " '>动态网站设计举例 </a></p>"
'将变量 flag 的值传送给 9-18b.asp
%> <p> 动态网站设计举例 </p>
</body>
</html>
9-18b.asp内容如下:
<html>
<body>
<%
Dim say1
say1=Request.QueryString("flag")
Select case say1
case "1"
Response.Redirect "9-18a.asp?say=1"
case "2"
Response.Redirect "9-18a.asp?say=2"
case "3"
Response.Redirect,9-18a.asp?say=3"
case "0"
Response.Redirect "9-18a.asp?say=0“
End Select
%>
</body>
</html>
本例的运行结果如下图所示。
3,Application对象
Application是实现某一特定功能的 Web应用程序 。
由许多文件组成的集合,这个集合中的每一个文件都视为该程序的子程序,而且几个处理相关内容的脚本可以构成一个功能模块,很像在 Windows
下用 Vc++或 VB开发的应用程序 。
(1) Application对象的集合和方法
网站上不同用户可以通过 Application共享信息 。
Application 下 属 的 某 个 文 件 中 建 立 的 组 件
Instance可以被该 Application中的其他所有文件调用 。
服务器上运行的所有 Application都相互独立 。
① Contents集合
Application对象利用 Contents集合保存其相关内容的 。 Application.Contents集合的属性和方法有 Count属性,Remove及 RemoveAll方法 。
对于 Application对象来说,其 Contents集合中的内容是被很多用户共享的,因此不会因为某个甚至全部用户的离开而自行结束,它会一直保存至该 Application被卸载,或服务器重新激活 。
② Lock和 UnLock方法
Application对象可以用来实现网站某一用户群体之间的信息共享,这就需要服务器不断地收集和处理需要共享的信息 。 如果许多用户同一时刻将信息提交给服务器处理,有可能造成信息阻塞 。
为此提供 Lock和 UnLock方法解决这种矛盾 。
当某个 Application调用了 Lock方法后,服务器就不再允许其他用户处理程序对该 Application的内容做修改,直到它调用 UnLock方法解除锁定 。
当需要修改一个 Application的内容时,先调用
Lock方法,并在内容修改完毕后调用 UnLock方法将其解锁,保证信息的完整性 。
例 9.19 用 Application 来记录页面访问次数的程序 。 文件名为 9-19.asp。
<html>
<body>
<%
Dim NumVisits
NumVisits=0
Application.Lock
Application("NumVisits")_
=Application("NumVisits")+1
Application.Unlock
%>
变量存储在 Application对象中欢 迎 光 临 本 网 页,你 是 本 页 的 第
<%=Application("NumVisits")%>位访客 !
</body>
</html>
本例的运行结果如下图所示 。
(2)处理 Application对象的事件
Application对象有两个重要事件:
Application_OnStart和 Application_OnEnd,这两个事件的处理过程写在 Global.asa文件中 。
Application_OnStart事件对应一个 Application
的开始,
Application_OnEnd事件则对应于 Application的结束 。
Global.asa文件 的内容是用来存储事件信息和由应用程序全局使用的对象 。 该文件存放在应用程序 的 根 目 录 中 。 每 个 应 用 程 序 只 有 一 个
Global.asa文件 。
Application_OnStart 事件在首次创建新的会话
( 即 Session_OnStart 事件 ) 之前发生 。 当
WEB 服务器启动并允许对应用程序所包含的文件进行请求时就触发 Application_OnStart 事件 。
Application_OnStart 事件的语法如下,
< SCRIPT LANGUAGE=ScriptLanguage _
RUNAT=Server>
Sub Application_OnStart
……
End Sub
< /SCRIPT>
Application_OnEnd 事件在应用程序退出时于
Session_OnEnd 事件之后发生 。
例 9.20 下列的脚本对 Application对象进行演示 。
文件名为 9-20a.asp和 9-20b.asp
9-20a.asp的内容如下:
<%
dim MyArray()
Redim MyArray(5)
MyArray(0)="hello"
MyArray(1)="someotherstring"
Application.Lock
Application("StoredArray")=MyArray
Application.Unlock
Response.Redirect "9-20b.asp"
%>
9-20b.asp的内容如下:
<%
LocalArray=Application("StoredArray")
LocalArray(1)="there"
Response.Write LocalArray(0) & LocalArray(1)
Application.Lock
Application("StoredArray")=LocalArray
Application.Unlock
%>
运行结果为:
4,Session对象
(1)什么是 Session
Session 对象存储特定的用户会话所需的信息 。
使用 Session对象和由服务器生成的用户 ID,创建的应用程序,可以识别每个来访用户并收集应用程序跟踪用户的首选项或选择内容所要用到的信息 。
当用户请求 ASP 应用程序中的某个页面时,ASP
检查 HTTP 头 信息,查看报文 中是否 有名为
ASPSessionID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯 一 的 值,再 把 这 个 值 作 为 新 ASPSessionID
Cookie值发送给客户端 。 通过向客户程序发送唯一的 Cookie,可以管理服务器上的 Session 对象 。
Session对象是客户端浏览器与服务器之间建立的互动信息的状态 。 每一个不同的用户连接得到不同的 Session。 Session在用户进入网站时由服务器自动产生,并在用户正常离开站点时释放 。
当用户在应用程序的页之间跳转时,存储在
Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在 。
使用 Session可以保存很多与用户相关的信息,例如用户的账号,昵称等;利用 Session,可以跟踪用户在网站上的活动 。
Session对象的常用的属性和方法如下:
① Contents集合
用户信息保存在 Session对象的 Contents集合中,
因此下面两段程序代码效果是相等的:
Session(“custom_color”)=”blue”
Session.Contents (“custom_color”)=”blue”
Contents集合的 Count属性:该 属性用来了 解
Contents集合中数据项的数目 。
例 9.21 在范例中,为 Contents集合建立若干数据项,然后使用循环语句输出该集合的全部内容,使用 Count属性实现 。 文件名为 9-21.asp。
<html>
<body>
<%
dim customer_info
dim interesting(2)
interesting(0)="足球 "
interesting(1)="编程 "
interesting(2)="阅读 "
response.write "sessionID:" & session.sessionid_
& "<p>"
session("爱好 ")=interesting
session("用户名称 ")="mickey"
session("年龄 ")="22"
session("证件号 ")="88567"
response.write "session集合有下面 _
"&session.contents.count&"项内容,<hr>"
for each customer_info in session.contents
if isarray(session.contents(customer_info))
then response.write,数组项目,_
"&customer_info&"<br>“
for each item in _
session.contents(customer_info)
response.write "<li>"&item&"<br>"
next
response.write "</ol>"
else
response.write
customer_info&":"&session.contents(customer_
info)&"<br>“
end if
next
%>
</body> </html>
运行结果如下图所示
② Contents集合提供了两个方法
Remove与 RemoveAll方法,其格式分别为:
Session.contents.remove(Item/Index)
选择性地删除 Contents集合中的某个数据项 ;
Session.contents.removeAll
将该集合的内容全部清除 ;
Item与 Index分别指所要删除的数据项的名称与索引编号 。
③ Timeout属性
Timeout属 性以 分钟 为单 位为该 应用 程序 的
Session对象指定超时时限 。 如果用户在该超时时限之内不刷新或请求网页,则该会话将终止 。
④ SessionID 属性
用户和 Session是一一对应的,当一个 Session开始的时候,服务器会自动为其分配一个 LONG类型的整数作为它的 SessionID。 在活动期间里,对于存取该网站的所有用户来说,SessionID都是惟一的 。
但 是 如 果 Web服 务 器 重 新 激 活,将 重 新 分 配
SessionID。 因此,在建立用户数据库时不能将
SessionlD作为每个用户的标志 。
⑤ Abandon方法
Abandon方法就是用来手动结束一个 Session并释放其占用的资源 。
(2) Session事件
Session 对象有两个时间事件分别是
Session_OnStart和 Session_OnEnd,它们分别在
Session开始和 Session结束的时候被触发 。
Session_OnStart和 Session_OnEnd这两个事件的处理过程写在 Global.asa文件中 。
在编写 Global.asa文件时,该文件中的脚本只能使用 Microsoft规范的,<Script>…… </ script>”标记而不能使用,<% …… % >标记;不能使用 HTML
语言,不能在里面添加任何的输出语句,这是因为
Global.asa在任何时候都不会进行内容输出 。
在 Web站点根目录或一些应用程序的虚拟目录中,
存放 Global.asa的文件
例 9.22 本例将示范如何通过 session对象的两个事件来记录网页被浏览的过程 。 相关文件 global.asa
的内容如下:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart
Session("who")=Request.ServerVariables _
("REMOTE_ADDR")
Session("Host")=Request.ServerVariables _
("REMOTE_Host")
Session("Server")=Request.ServerVariables _
("SERVER_NAME")
Session("StartTime")=NOW
End Sub
Sub Session_OnEnd
Set fs=Server.CreateObject _
("Scripting.FileSystemObject")
Set ts=fs.CreateTextGile _
("d:\zwf\zwf\asp\info.txt",True)
Str="客户 " & Session("Who")
Str=Str & "从 " & Session("StartTime")
Str=Str & "到 " & Now & "浏览本网站 "
ts.Write Str
ts.Close
Set fs=nothing
End Sub
</SCRIPT>
9-22.asp的内容如下:
<html>
<body>
<%
Session.Timeout=1?1分钟
Response.write "您的计算机 IP是," & _
Session("Who") & "<BR>"
Response.write "您的计算机名是," & _
Session("Host") & "<BR>"
Response.write "服务器的名字是," & _
Session("Server") & "<BR>"
Response.write "现在的时间是," & _
Session("StartTime") & "<BR>"
%>
</body></html>
本例的运行结果如下图所示 。
Session 对象会话可以通过以下三种方式启动,
① 一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的,asp 文件,并且该应用程序的
Global.asa 文件包含 Session_OnStart 过程 。
② 用户在 Session 对象中存储了一个值 。
③ 用户请求了一个应用程序的,asp 文件,并且该应用程序的 Global.asa 文件使用 < OBJECT> 标签创建带有会话作用域的对象的实例 。
如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束 。 这段时间的默认值是 20 分钟 。
通过在 IIS服务管理器中设置,应用程序选项,属性页中的,会话超时,属性改变默认超时限制设置 。
5,Server对象
Server对象提供对服务器上的方法和属性的访问,
其中大多数方法和属性是为实用程序的功能服务的 。
语法,Server.Property|method
(1)属性
ScriptTimeout是超时值,在脚本运行超过这一时间之后即作超时处理 。 如下代码指定服务器处理脚本在 100秒后超时:
<% Server,ScriptTimeout=100% >。
( 2) MapPath方法
MapPath方法将指定的相对或虚拟路径映射到服务器 上 相 应 的 物 理 目 录 上 。 语 法 如 下,
Server.MapPath(Path)。
Path指定要映射物理目录的相对或虚拟路径 。 若
Path以一个正斜杠 (/)或反斜杠 (\ )开始,则
MapPath方法返回路径时将 Path视为完整的虚拟路径 。 若 Path不是以斜杠开始,则 MapPath方法返回同,asp文件中已有的路径相对的路径 。
例如
<%= server.mappath("data.txt")%><BR>
<%= server.mappath("script/data.txt")%><BR>
输出结果为:
c:\inetpub\wwwroot\data.txt<BR>
c:\inetpub\wwwroot\script\data.txt<BR>
( 3) CreateObject方法
Server.CreateObject 用于创建已经注册到服务器上的 ActiveX 组件实例 。
其语法如下:
Server.CreateObject("Component Name")
如下例程,
Set Conn=Server.CreateObject("ADODB.Connection")
Conn.Open "connection string"
%>
6,Global.asa文件的使用
Application和 Session对象的两个事件 OnStart
和 OnEnd的脚本都必须写在 Global.asa文件中 。
Global.asa文件其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象 。 该文件的内容是用来存储事件信息和由应用程序全局使用的对象 。
该文件的名称必须是 Global.asa且必须存放在应用程序的根目录中 。 每个应用程序只能有一个
Global.asa文件 。
我们可以用任何支持脚本的语言编写 Global.asa文件中包含的脚本 。 在 Global.asa文件中声明的过程只能从 一 个 或 多 个 与 Application_OnStart,
Application_OnEnd,Session_OnStan和 Session_
OnEnd事件相关的脚本中调用 。
Global.asa文件的结构如下:
<SCRIPT LANGUAGE=" JavaScript'?RUNAT="SERVER">
function Application OnStart()
{
}
function Session_OnStart()
{
}
function Session_OnEnd()
{
}
</SCRIPT>
下面是一个标准的 Global.asa文样:
<SCRIPT LANGUAGE="VBScript" RUNAT="server">
'Session_OnStart当客户首次运行 ASP应用程序中的任何一个页面时运行
'Session_OnEnd当一个客户的会话超时或退出应用程序时运行
'Application_OnStart当任何客户首次访问该应用程序的首页时运行
'Application_OnEnd当该站点的 Web服务器关闭时运行
</SCRIPT>
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
VisitorCountFilename=Server.MapPath("/ex2")+"\
VisitCount.txt"
Set
FileObject=Server.CreateObject("Scripting.File
SystemObject")
Set
Out=FileObject.OpenTextFile(VisitorCountFilena
me,1,FALSE,FALSE)
Application("visitors")=Out.ReadLine
Application("VisitorCountFilename")=VisitorCou
ntFilename
End Sub
=============================================
SUB Application_OnEnd
Set
FileOutObject=Server.CreateObject("Scripting
.FileSystemObject")
Set
Out=FileOutObject.CreateTextFile(Application
("VisitorCountFilename"),TRUE,FALSE)
Out.WriteLine(application("visitors"))
End Sub
'===========================================
Sub Session_OnStart
Session.Timeout=5
Application("visitors")_
=Application("visitors")+1
Session("ID")=Session.SessionID
End Sub
</SCRIPT>
这是一个 ASP页面访问记数器应用程序的 Global文件,首先当客户首次访问该应用程序的首页时,事件 Application_ OnStart定义了在服务器上指定的虚拟目录下新建一个 VisitCount.txt的文本文件,
并将文件的路径和内容保存在应用程序级的变量中 。
而当任何一个客户访问 ASP应用程序中的任何一个页面时,事件 Session _OnStart定义将应用程序级的变量 visitors的值自动加 1。这样,每当有客户访问页面时,变量 visitors都将自动加 1,以起到统计点击率的作用。由于变量 visitors的值是存储在系统内存之中,所以如果服务器关闭或重新启动,
存储在变量中的数据将自动丢失,所以通过定义事件 Application_ OnEnd,在服务器关闭或重启之前将数据写入事先建立的文本文件之中,这样 就能确保当服务器再次启动时,
Application_OnStart过程可以从 VisitCount.txt
文件中读取以前的统计数。
9.3.4 ASP内置组件 ——ActiveX 组件
ActiveX组件是一个存在于 WEB服务器上的文件,
该文件包含执行某项或一组任务的代码,组件可以执行公用任务 。
当用户用 ASP编写服务器端应用程序时,可以利用 Activex组件作为脚本和基于 Web 应用程序的基本构造块,来增强 Web应用程序的功能 。 只要知道如何访问组件提供的对象,可以在不了解组件运作方式的情况下编写 ASP 程序 。 而不必自己去创建执行这些任务的代码 。
当在 WEB 服务器上安装完 ASP 环境后,就可以直接使用它自带的几个常用组件,如 Database
Access 组件 。 也可以从第三方开发者处获得可选的组件,也可以编写自己的组件 。
Activex组件是包含在动态链接库 (.dll)或可执行文件 (.exe)中的可执行代码 。 组件可以提供一个或多个对象以及对象的方法和属性 。
表 9.2列出了 ASP可安装的常用组件 。
表 9.2 常用组件的名称及功能组件名称 功能描述
Ad Rotator 创建一个 Ad Rotator对象,该对象可按指定计划在同一页上自动轮换显示广告
Browser
Capabilities
创建一个 BrowserType对象,该对象决定访问 Web站点的每个浏览器的性能、
类型及版本
Database Access 提供用 ActiveX Data 0bjects(ADO)对数据库的访问
Content Linking 创建一个 NextLink对象,该对象可生成
Web页内容列表,并像书一样将各页顺续连接
File Access组件 提供文件的输入输出访问
Collaboration Data
0bjects for NTS组件可以快速、简便地在 Web页上添加收发邮件功能。该组件只适用于 IIS for
Windows NT Server
MyInfo 创建一个 MyInfo对象,该对象追踪个人信息,例如站点管理员的姓名、地址及显示选择
Counters 创建一个 Counters对象,该对象可以创建、保存、增加或检索任意数量的独立计数器
Content Rotator 自动翻转 Web主页上的 HTML内容字符串
Page Counter 记录并显示 Web页被打开的次数
9.3.5 ASP实现对数据库的访问
1.Web站点使用的数据库
Microsoft Access是一个桌面数据库,一般来说,
Microsoft Access数据库不能支持 30个以上同时访问的用户 。
Microsoft iSQL Server可以支持成千上万同时访问的用户及以太字节 (GB)计算大小的数据库 。 当今
Internet上的一些特大型商用 Web站点使用的都是
Microsoft SQL Server。
微软提供了一个 Upsizing Tools工具,可以利用它将 Microsoft Access数据库转换为 Microsoft SQL
Server数据库 。
2,ASP访问数据库的步骤
ASP访问数据库的步骤如下:
(1)第一步,指定想要连接的数据库,有 DSN方法 。
DSN(Data Source Name 数据源名称 )
在指定了想要连接的数据库后,就可以通过以下方法连接并打开数据库,
<% Set Conn =_
Server.CreateObject("ADODB.Connection")
创建 Connection对象
Conn.Open connstr
使用 Connection对象的 Open方法打开数据
%>
(2)第二步,指定想要执行的 SQL 指令,可以使用
RecordSet。
当连接了数据库后就可以通过 SQL 指令对数据库进行操作,比如查询,删除,更新等等 。 下例在数据库表 datebase 中查询所有姓名中有,A”的记录,
< %
sql="select * from datebase where name like
'%A%'"
Set rs = Conn.Execute(sql)
Conn.close
%>
如下例在数据库表 datebase 中插入一条记录:
<%
strSQL = "INSERT INTO Customers (FirstName,
LastName) VALUES ('Jose','Lugo')"
Conn.Execute(strSQL)
%>
如下例在数据库表 datebase 中更新记录:
<%
Conn.Execute "UPDATE Customers SET FirstName
= 'Jeff' WHERE LastName = 'Smith' "
%>
如下例在数据库表 datebase 中删除记录:
<%
Conn.Execute "DELETE FROM Customers WHERE
LastName = 'Smith'"
%>
Recordset 对象保持查询返回的记录的位置,允许一次一项逐步扫描结果 。 根据 Recordset 对象的指针类型属性设置,可以滚动和更新记录 。
Recordset 的使用方法如下,
Set rs =_
Server.CreateObject("ADODB.Recordset")
创建 Recordset对象
rs.Open ( SQL 指令,Conn,打开方式,锁定类型 )
’ 利用 Recordset对象 open 方法打开数据库
(3)第三步,使用 RecordSet 属性和方法,并显示执行的结果 。
RecordSet对象的一些属性和方法:
rs.Fields.Count,RecordSet 对象的字段总数 。
rs(i).Name:第 i 个字段的名称,i 由 0 算起到
rs.Fields.Count-1。
rs(i):读取第 i 个字段的数据,i 由 0 算起到
rs.Fields.Count-1。
rs(" 字段名称 "),读取指定字段的数据 。
rs.RecordCount,游标中的数据记录总数 。
rs.EOF,是否已指到最后一条记录 。
rs.MoveNext,将指标移到下一笔记录
rs.MovePrev,将指标移到上一笔记录 。
rs.MoveFirst,将指标移到第一笔记录 。
rs.MoveLast,将指标移到最后一笔记录 。
rs.Close,关闭 RecordSet 对象
3,ASP访问数据库的实例
(1)连接数据库例 24:与数据库建立连接,文件名为 9-24.asp。
<%@LANGUAGE=VBScript%>
<%
Option Explicit
Dim Cnn,StrCnn
'创建 Connection 对象
Set Cnn =Server.CreateObject("ADODB.Connection")
StrCnn ="Driver={Microsoft Access Driver_
(*.mdb)};DBQ=" & Server.MapPath("sqlk.mdb")
'使用 Connection 对象的 Open 方法打开数据库
sql.mdb,该数据库用户自己建立
Cnn.Open StrCnn
Response.Write Server.MapPath(“sqlk.mdb") &
"<br>"
Response.Write "数据库连接成功," & Cnn.State
& "<br>"
'使用 Connection 对象的 Close 方法关闭连接
Cnn.close
Response.Write "数据库已经关闭," & Cnn.State
'将 Connection 对象从内存中删除,以释放资源
Set Cnn = Nothing
%>
运行结果如下图所示例 9.25 通过 Open方法和 ConnectionString属性来建立与数据库的连接 。 文件名为 9-25.asp。
<html>
<body>
<%
'用 Connection对象的 Open方法方式建立与数据库的连接
set
conn1=Server.CreateObject("ADODB.Connection")
conn1.Open "DSN=SQLK"
Response.Write " 数 据 库 连 接 成 功," &
Conn1.State & "<br>"
'使用 Connection 对象的 Close 方法关闭连接
Conn1.close
Response.Write " 数 据 库 已 经 关 闭," &
Conn1.State & "<br>"
'将 Connection 对象从内存中删除,以释放资源
set conn1=nothing
'通过设定 Connection对象的 ConnectionString属性来建立与数据库的连接
Set
conn2=Server.CreateObject("ADODB.Connection")
ConnectionString ="DSN=SQLK"
conn2.open ConnectionString
Response.Write " 数 据 库 连 接 成 功," &
Conn2.State & "<br>"
Conn2.close
Response.Write " 数 据 库 已 经 关 闭," &
Conn2.State
Set conn2=nothing
%>
</body>
</html>
9-25.asp的运行结果如图:
在使用这两种方法建立与数据库的连接之前要首先建立 ODBC数据源,例子中的,SQLK”就是 ODBC
数据源的名字 。
用 SQL Server建立的数据库的驱动程序名为
,SQL Server”,Access建立的数据库驱动程序名为,Microsoft Access Driver(*.mdb)”。
例子中的 Set connl=nothing是关闭数据库连接,
也可以用 connl.Close来执行同样的操作 。
例 9.26 使用 Connection对象的 Execute方法在网页中执行 SQL命令,查询 SQLK数据库,学生情况表,中的所有信息 。
<%
Set conn=Server.CreateObject("ADODB.Connection")
Set rs=Server.CreateObject("ADODB.recordset")
conn.open,DSN=SQLK"
Set rs=conn.execute("Select * from 学生情况表 s“
Response.Write "<table border=3>"
Response.Write "<tr>“
For i=0 to rs.Fields.Count-1
Response.Write
"<td>"&Ucase(rs(i).Name)&"</td>"
Next
Response.Write "</tr>"
do While NOT rs.EOF
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&rs(i).Value&"</td>"
Next
rs.MoveNext
Response.Write "</tr>"
Loop
Response.Write "</table>"
Set conn=nothing
%>
运行结果如下图所示
(2)记录集 Recordset对象
如果要对 SQL命令执行的结果进行操作,需要使用 Recordset对象的 Open方法 。
Recordset对象的 open方法用来执行用户向数据库提出的请求,例如执行一个 SQL命令,启动一个指定的数据库表或是调动一个指定的存储过程 。
例 9.27本例共有两个文件,9-27.htm和 9-27.asp。
9-27.htm用来产生向用户收集信息的表单,用户可以指定要查看,学生信息,或,学生成绩,。
9-27.asp用来响应用户的请求 。
9-27.htm的内容如下:
<html>
<body>
<form method=post action=9-27.asp>
<p>查看学生信息请点击这里
<input type=submit name=button value="学生信息 ">
</p>
<p>查看学生成绩请点击这里
<input type=submit name=button value="学生成绩 ">
</p>
</form></body></html>
9-27.asp的内容如下:
<%
const adOpenStatic=3
const adLockReadOnly=1
'建立 Recordset对象
Set rs=Server.CreateObject("ADODB.Recordset")
'提取表单域,button”的值
button=Request.Form("button")
'设定光标类型为静态
CursorType=adOpenStatic
'设定锁定类型为只读
LockType=adLockReadOnly
'如果用户选择,学生信息,则执行下面的代码
If button="学生信息 " Then
source=“select * from 学生情况表 s"
activeConnection="dsn=sql"
rs.open
source,activeConnection,CursorType,LockType
end if
'如果用户选择,学生成绩,则执行下面的代码
If button="学生成绩 " Then
source=“select * from 学生课程成绩表 sc"
ActiveConnection="dsn=sql"
rs.Open
source,ActiveConnection,CursorType,LockType
End if
查询结果以表格的形式输出
Response.Write "<table border=3>"
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write"<td>"&Ucase(rs(i).Name)&"</td>"
Next
Response.Write "</tr>"
返回字符串(表中字段)的大写形式
'输出表格内容
While NOT rs.EOF
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&rs(i).Value&"</td>"
Next
rs.MoveNext
Wend
Response.Write "</table>"
'取消连接
Set rs=nothing
%>
运行结果如下图所示
运行结果如下图所示例 9.28 Recordset访问数据库,文件名为 9-28.asp,
数据库为 SQLK.mdb。
<%
Set conn=_
Server.CreateObject("ADODB.Connection")
conn.Open _
"DBQ=" & Server.MapPath("SQLK.mdb") & "; _
Driver={Microsoft Access Driver (*.mdb)};_
DriverId=25;FIL=MS Access;"
Set rs=Server.CreateObject("ADODB.Recordset")
SqlStr="SELECT Avg(SG) As 平均 From _
学生课程成绩表 SC"
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Avg," & rs("平均 ")
rs.Close
SqlStr = "SELECT Count(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Count(SG)," & rs(0)
rs.Close
SqlStr = "SELECT Count(*) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Count(*)," & rs(0)
rs.Close
SqlStr = "SELECT Sum(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Sum," & rs(0)
rs.Close
SqlStr = "SELECT Min(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Min," & rs(0)
rs.Close
SqlStr = "SELECT Max(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Max," & rs(0)
rs.Close
SqlStr = "SELECT First(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>First(SG)," & rs(0)
rs.Close
SqlStr = "SELECT Last(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Last(SG)," & rs(0)
rs.Close
SqlStr = "SELECT First(SN) From _
学生情况表 S"
rs.Open SqlStr,conn,1,1
Response.Write "<BR>First(SN)," & rs(0)
rs.Close
SqlStr = "SELECT Last(SN) From _
学生情况表 S "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>Last(SN)," & rs(0)
rs.Close
SqlStr = "SELECT StDev(SG) From _
学生课程成绩表 SC "
rs.Open SqlStr,conn,1,1
Response.Write "<BR>StDev," & rs(0)
rs.Close
conn.Close
%> 计算指定字段的标准偏差运行结果如下图所示:
例 9.29 用户登录验证,文件名为 9-29.htm和 9-
29.asp。
使用的数据库为 SQLK.mdb,其中学生情况表:包含
sn,sname,sd,sa字段 。
9-29.htm的内容如下:
<html>
<body>
<form name="form1" meth
<p>用户名
<input name="userid" type="text" id="userid">
</p>
<p> 口令
<input name="psw" type="password" id="psw">
</p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 ">
</p>
</form>
</body>
</html>
9-29.asp的内容如下:
<html>
<body>
<%
username=trim(request.Form("userid"))
password=trim(request.Form("psw"))
dim conn
Set conn = _
Server.CreateObject("ADODB.Connection")
conn.Open"DBQ="&Server.MapPath("SQLK.mdb")&";_
Driver={Microsoft Access Driver (*.mdb)};_
DriverId=25;FILe=MS Access;"
Set TmpRs = _
Server.CreateObject("ADODB.Recordset")
TmpRs.open "select * from 学生情况表 S Where_
userid='"&username&"';",conn,3,3
%>
<% if tmprs.EOF then %>
<script language="vbscript">
MsgBox "该用户不存在,请先注册 !!!!"
location.href="javascript:history.back()"
</script>
<%else if password<>tmprs("psw") then %>
<script language="vbscript">
MsgBox "口令错误,请重新输入密码 !!!!!"
location.href="javascript:history.back()"
</script>
<% else
session("username")=username
tmprs("logins")=tmprs("logins")+1
tmprs.update
response.Write tmprs("logins")
tmprs.close
set tmprs=nothing
conn.close
set conn=nothing
end if
end if
%>
</body>
</html>
运行结果如图所示
(4)数据库的添加及修改例 9.30 添加及修改数据库记录,文件名为 9-30.asp
和 9-30.asp。 使用的数据库是 sqlk.mdb,其中学生情况表 s( sn,sname,sd,sa)
学生课程成绩表 sc(sn,cn,sg)
<html>
<body>
<form name="form1" method="post" _
action="9-30.asp">
<p>学号
<input name="topic" type="text" id="学号 ">
</p>
<p>姓名
<input name="owner" type="text" id="姓名 ">
</p>
<p>申请理由
<textarea name="text" id="text"></textarea>
</p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 ">
</p>
</form>
</body>
</html>
9-30.asp的内容:
<% if request("topic")="" then %>
<script language="vbscript">
MsgBox "学号不能为空 ! "
</script>
<%elseif request("text")="" then %>
<script language="vbscript">
MsgBox "需填写申请理由 ! "
</script>
<% else
owner=request("owner")
set cn=server.CreateObject("ADODB.connection")
DBPath=server.MapPath("sqlk.mdb")
cn.open "driver={Microsoft Access Driver
(*.mdb)};dbq="& DBPath
set
com_rs=server.CreateObject("ADODB.recordset")
com_rs.open "Select * from 学生情况表 s;",_
cn,2,3
com_rs.AddNew
com_rs("sn")=request("学号 ")
com_rs("sd")=request("text")
com_rs("sa")=len(trim(request("text")))
com_rs("sname")=request("姓名 ")
com_rs.update
com_rs.close
response.Write "申请内容已存入数据库中 "
set com_rs=nothing
end if
%>
(5) ASP实现分页显示
ASP实现分页显示方法主要有两种:
第一种方法,将数据库中所有符合查询条件的记录一次性的都读入 recordset中,存放在内存中,
然后通过 ADO Recordset对象所提供的几个专门支持分页处理的属性,PageSize( 页大小 )、
PageCount(页数目 ) 以及 AbsolutePage(绝对页 )
来管理分页处理 。
第二种方法是根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示 。
很明显,当数据库中的记录数达到上万或更多时,
第一种方法的执行效率将明显低于第二种方法,
因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,
那么 ASP 应用程序的执行效率将大受影响 。
当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,
此时一般就采用第一种方法,因为第一种方法的
ASP 程序编写相对第二种方法要简单明了得多 。
(6)Reordset 对象的属性和方法:
BOF属性:游标指到 RecordSet的第一项之前 。
EOF属性,游 标指到 RecordSet的最后一 项之后 。
Move方法:移动指标到 RecordSet中的某一条记录 。
AbsolutePage属性:设定当前记录的位置位于哪页
AbsolutePosition属性:游标在 RecordSet 中的位置 。
PageCount属性:显示 Recordset 对象包括多少,页,
的数据 。
PageSize属性:显示 Recordset 对象每一页显示的记录数 。
RecordCount 属性:显示 Recordset 对象记录总数 。
① BOF 与 EOF 属性
通常使用 BOF与 EOF属性,得知一个 Recordset对象是否包含有记录或者得知移动记录行是否已经超出该
Recordset对象的范围 。
如,< % if not rs.eof then,.,%>
< % if not (rs.bof and rs.eof) %>
若当前记录的位置是在一个 Recordset 对象第一行记录之前时,BOF属性返回 true,反之则返回 false。
若当前记录的位置是在一个 Recordset 对象最后一行记录之后时,EOF属性返回 true,反之则返回
false。
BOF 与 EOF 都为 False:表示指标位于 RecordSet
当中 。
② Move 方法
移动游标到 RecordSet中的某一项记录,语法如下:
rs.Move NumRecords,Start
这里 rs表 示 一 个 想 要 移 动 当 前 记 录 位 置 的
Recordset对象;,NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;,start”
是一个可选的项目,用来指定记录起始的标签 。
如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动 。
MoveFirst方法:将当前记录位置移至第一项记录 。
MoveLast方法,将当前记录位置移至最后一 项 记录 。
MoveNext方法:将当前记录位置移至下一 项 记录 。
MovePrevious方法:将当前记录位置移至上一 项 记录 。
Move[n]方法:移动指标到第 n项 记录,n由 0算起 。
③ AbsolutePage 属性
AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性将
Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于
PageSize 的记录数 )。
与 AbsolutePosition 属性 相 同,AbsolutePage
属性是以 1 为起始的,若当前记录为 Recordset
的第一行记录,AbsolutePage 为 1。
可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置 。
④ AbsolutePosition 属性
确定目前游标在 RecordSet中的位置
AbsolutePosition 属性的数值为目前 游 标相对于第一项的位置 。 第一项的 AbsolutePosition为 1。
在存取 RecordSet时,无法保证 RecordSet每次都以同样的顺序出现 。
若要使用 AbsolutePosition,必须先设定为使用用户端 cursor(游标 ):
rs2.CursorLocation = 3
⑤ PageCount 属性
PageCount 属性,决定 Recordset对象包括多少
,页,的数据 。
这里的,页,是数据记录的集合,大小等于
PageSize 属性的设定,即使最后一页的记录数比 PageSize 的 值 少,最 后 一 页 也 算 是
PageCount 的一页 。 必须注意也并不是所有的数据提供者都支持此项属性 。
⑥ PageSize 属性
决定多少记录组成一个逻辑上的,一页,。
PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,设定并建立一个页的大小,
从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录 。 能随时设定 PageSize属
⑦ RecordCount 属性
用 RecordCount属性来找出一个 Recordset 对象包括多少条记录 。 如:
< % totle=RS.RecordCount %>
运用上述 7个属性分页显示的步骤如下:
首先,我们可以为 PageSize 属性设置一个值,
从而指定从记录组中取出的构成一个页的行数;
然后通过 RecordCount 属性来确定记录的总数;
再用记录总数除以 PageSize 就可得到所显示的页面总数;
最后通过 AbsolutePage 属性就能完成对指定页的访问 。
例 9.31 一个简单的 BBS应用程序,文件名为 bbs.asp。
它的数据库 bbs.mdb中的表,meggase”分别有以下五个字段:
,ID”,每个帖子的自动编号;
,subject”,每个帖子的主题;
,name”,加帖用户的姓名;
,email”,用户的电子邮件地址;
,postdate”,加帖的时间 。
数据库的 DSN 为,bbs”。
显 示 帖 子 分 页 的 所 有 步 骤 放 在 一 个 名 为
,ShowList()”的过程中,方便调用 。
程序如下:
<html>
<head>
<title>bbs</title>
<body>
<% Sub ShowList() %>
<%
'设定开关,指定每一页显示的帖子数目,默认为 3
PgSz=3
Set Conn =_
Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
'查询所有帖子,并按帖子的 ID倒序排列
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write "<P><center>对不起,数据库中没有相关信息 ! </center></P>"
else
RS.PageSize = Cint(PgSz)?设定 PageSize属性的值
'计算可显示的页面的总数
Total=INT(RS.recordcount / PgSz * -1)*-1
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = "上一页 " Then
PageNo=PageNo-1
end if
if ScrollAction = "下一页 " Then
PageNo=PageNo+1
end if
if PageNo < 1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write "<CENTER>"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position < RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write "<P><font color='Navy'>_
<B>数据库查询结果,</B>"
Response.Write "(共有,& RS.RecordCount & "条符合条件的信息,显示 " & pagebegin&"-" &
pagend&")</font></p>"
Response.Write "<TABLE WIDTH=600 BORDER=1_
CELLPADDING=4 CELLSPACING=0_
BGCOLOR=#FFFFFF>"
Response.Write "<TR BGCOLOR=#5FB5E2>_
<FONT SIZE=2><TD><B>主题 </B></TD>_
<TD><B>用户 </B></TD>_
<TD><B>Email</B></TD>_
<TD><B>发布日期 </B></TD>_
</FONT><TR BGCOLOR=#FFFFFF>"
Do while not (RS is nothing)
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount > 0
If n=1 then
Response.Write "<TR BGCOLOR=#FFFFFF>"
ELSE
Response.Write "<TR BGCOLOR=#EEEEEE>"
End If
n=1-n %>
<TD><span style="font-size:9pt">_
<A href='view.asp?key=<% =RS("ID")%>'>_
<% =RS("subject")%></A></span></td>
<TD><span style="font-size:9pt">_
<% =RS("name")%></A></span></td>_
<TD><span style="font-size:9pt">_
<a href="mailto:<% =RS("email")%>">_
<% =RS("email")%></a></span> </TD>
<TD><span style="font-size:9pt">_
<% =RS("postdate")%>
</span> </TD>
</TR>
<%
RowCount = RowCount - 1
RS.MoveNext
Loop
set RS = RS.NextRecordSet
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%>
</TABLE>
<FORM METHOD=GET ACTION="bbs.asp">
<INPUT TYPE="HIDDEN" NAME="pageno“_
VALUE="<% =PageNo %>">
<%
if PageNo > 1 Then
response.write "<INPUT TYPE=SUBMIT_
NAME='ScrollAction' VALUE='上一页 '>"
end if
if RowCount = 0 and PageNo <>Total then
response.write "<INPUT TYPE=SUBMIT_
NAME='ScrollAction' VALUE='下一页 '>"
end if
response.write "</FORM>"
End if
%>
<% 'End Sub %>
</body>
</html>
运行结果如图:
1) JSP 的运行环境和技术特点
执行 JSP时需要在 Web服务器上架设一个编译 JSP
网页的引擎。配置 JSP 环境可以有多种途径,
但主要工作就是安装和配置 Web服务器和 JSP引擎。
下面以 Tomcat作为 JSP引擎,配合 Tomcat、
Apache,IIS这三种 Web服务器来讲述 3种搭建 JSP
运行环境的方案。
建立 JSP运行环境需要的相关软件包括,Java2的软件开发工具 J2SDK; Apache服务器;
Apache组织开发的 JSP引擎 Tomcat服务器,使
Apache支持 Tomcat的插件 mod_jk.dll;使 IIS支持 Tomcat的插件 tc4ntiis.zip。
9.4 JSP技术概述
9.1 JSP技术概述
( 1) 安装 J2SDK
在 Windows下,直接运行下载的 j2sdk-1_4_1_01-
windows-i586.exe文件,根据安装向导安装到一个目录,例如安装到 f:\j2sdk 1.4.1;
( 2) 添加环境变量
在 Win2000环境下配置环境变量 。 右键单击,我的电脑,,在弹出菜单中选择,属性,→,系统特性,→,高级,→,环境变量,,弹出环境变量对话框,就可以编辑系统的环境变量了 。 添加
PATH,JAVA_HOME和 CLASSPATH三个变量,变量值为:
9.1 网络编程概述
9.1 网络编程概述
PATH=% PATH%;f:\j2sdk1.4.1\bin
SET JAVA_HOME=f:\j2sdk1.4.1
SET
CLASSPATH=f:\j2sdk1.4.1\lib\tools.jar。
( 3) JSP环境的配置方案
JSP环境的配置方案有多种,
方案一,J2SDK+ Tomcat。
在这种方案里 Tomcat既作为 JSP引擎又作为 Web
服务器,配置比较简单。
9.1 网络编程概述
9.1 网络编程概述方案二,J2SDK+ Apache+ Tomcat。
虽然 Tomcat也可以作 Web服务器,但其处理静态 HTML的速度比不上 Apache,且其作为 Web服务器的功能远不如 Apache,因此把 Apache和
Tomcat集成起来,用 Apache充当 Web服务器,
而 Tomcat作为专用的 JSP引擎 。 这种方案的配置比较复杂,但是能让 Apache和 Tomcat完美整合,实现强大的功能 。
9.1 网络编程概述
9.1 网络编程概述方案三,J2SDK+ IIS+ Tomcat。
Windows平台下最常用的 Web服务器无疑是
IIS,正常情况下 IIS不支持 JSP,我们可以通过使用一个 IIS到 Tomcat重定向插件,使
IIS能够将所有的 JSP请求发送到 Tomcat执行,可以使 IIS增加处理 JSP的功能 。 如果你已经习惯了使用 IIS,那么可以尝试这种配置 。 配置所需的软件均可从网上下载 。
9.1 网络编程概述
9.1 网络编程概述方案四 ·J2SDK+ Tomcat配置方案
安装 Tomcat可直接运行下载的 jakarta-tomcat-
4.0.1.exe,安装时它会自动寻找 J2SDK的位置 。
例如安装到 f:\tomcat4。 Tomcat安装后,还要配 置 环 境 变 量,添 加 一 个 新 的 环 境 变 量
TOMCAT_HOME,变量值为 f:\tomcat4,添加方法同 J2SDK环境变量的配置方法 。 设置完毕后就可以运行 Tomcat服务器了 。
用 f:\tomcat4\bin\startup.exe启动 Tomcat,
用 f:\tomcat4\bin\shutdown.exe关闭 Tomcat。
启动 Tomcat后,打开浏览器,在地址栏中输
http://localhost:8080( Tomcat默认端口为
8080) 。
9.1 网络编程概述
9.1 网络编程概述
如果在浏览器中看到 Tomcat的欢迎界面,表示 Tomcat工作正常。将编写的 *.jsp放在
f:\Tomcat\webapps\examples\jsp目录下,
在地址栏中输入
http://localhost:8080/examples/jsp/*.js
p则可实现信息发布。
9.1 网络编程概述
9.1 网络编程概述在网页中使用 JavaScript的方法在网页中使用脚本的方法有三种:
( 1) 使用 SCRIPT标记符插入脚本方法是:把脚本标记符 <SCRIPT></ SCRIPT>置于网页上的 HEAD部分或 BODY部分,然后在其中加入脚本程序 。
语法如下:
<SCRIPT language=“JavaScript”,
type="text/javascript">
<!--
在此编写 JavaScript代码 。
//-->
</ SCRIPT>
( 2)直接添加脚本
( 3)链接脚本文件