IT学习者 | 文章大全 | 技术文档 | 桌面壁纸 | 实用查询 | 网络电台 | 成语 | 歇后语 | 网址 | 下载 | 周公解梦 | 生日密码 | 电视剧365 | Flash
 您现在的位置: IT学习者 >> 文章大全 >> 网络编程 >> ASP技术

Asp深度揭密

【 来源:网络  更新时间:2005-10-30 | 字体:

一、Asp基本知识

1.Asp是Active Server Pages的简称,是解释型的脚本语言环境;
2.Asp的运行需要Windows操作系统,9x下需要安装PWS;而NT/2000/XP则需要安装Internet Information Server(简称IIS);
3.Asp和JSP的脚本标签是“<%%>”,PHP的则可以设定为多种;
4.Asp的注释符号是“'”;
5.使用附加组件,可以扩展Asp的功能。

例子:

HelloWorld_1.asp
<%="Hello,world"%>

效果:
Hello,world


HelloWorld_2.asp
<%
for i=1 to 10
response.write "Hello,world"
next
%>

效果:
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world
Hello,world

注意:Asp不区分大小写;变量无需定义也可使用,转换方便;语法检查很松。


二、Asp内置对象的使用:

可以使用下面的任何ASP内置对象,而不必在ASP脚本中特别声明。

1. Request:

定义:可用来访问从浏览器发送到服务器的请求信息,可用此对象读取已输入HTML表单的信息。

集:
Cookies:含有浏览器cookies的值
Form:含有HTML表单域中的值
QueryString:含有查询字符串的值
ServerVariables:含有头和环境变量中的值

例子:

request_url.asp
<%
'获取用户输入,并存入变量
user_id=request.querystring("user_id")
user_name=request.querystring("user_name")

'判断用户输入是否正确
if user_id="" then
response.write "User_id is null,please check it"
response.end
end if
if user_name="" then
response.write "User_name is null,please check it"
response.end
end if

'打印变量
response.write user_id&"<br>"
response.write user_name
%>

效果:
当访问http://10.1.43.238/course/request_url.asp?user_name=j时:
User_id is null,please check it
当访问http://10.1.43.238/course/request_url.asp?user_name=j&user_id=my_id时:
my_id
j

思考:变量是如何在URL中传递和被Asp页面获取的?


request_form.htm
<style type="text/css">
<!--
.input {background-color: #FFFFFF; border-bottom: black 1px solid;border-left: black 1px solid; border-right: black 1px solid;border-top: black 1px solid; color: #000000;font-family: Georgia; font-size: 9pt;color: midnightblue;}
a:link {color: #1B629C; text-decoration: none}
a:hover {color: #FF6600; text-decoration: underline}
a:visited {text-decoration: none}
-->
</style>

<center>
<form name="course" action="request_form.asp" method="post">
User_id:<input type="text" name="user_id" maxlength="20" class="input"><br><br>
User_name:<input type="text" name="user_name" maxlength="30" class="input">
</form>
<br><br>
<a href="javascript:document.course.submit();"> 提 交 </a>
</center>

request_form.asp
<%
'获取用户输入,并存入变量
user_id=request.form("user_id")
user_name=request.form("user_name")

'判断用户输入是否正确
if user_id="" then
response.write "User_id is null,please check it"
response.end
end if
if user_name="" then
response.write "User_name is null,please check it"
response.end
end if

'打印变量
response.write user_id&"<br>"
response.write user_name
%>

注意:form的action的指向,request_form.asp和request_url.asp在源代码上的区别?

2. Response:

定义:用来向浏览器回发信息,可用此对象从脚本向浏览器发送输出。

集:
Cookies:在浏览器中加入一个cookie

方法:
End:结束脚本的处理
Redirect:将浏览器引导至新页面
Write:向浏览器发送一个字符串

属性:
Buffer:缓存一个ASP
CacheControl:由代理服务器控制缓存
ContentType: 规定响应的内容类型
Expires:浏览器用相对时间控制缓存
ExpiresAbsolute:浏览器用绝对时间控制缓存

例子:

response_redirect.asp
<%
'去google看看吧
response.redirect "http://www2.google.com"
response.end
%>


response_cookies.asp
<%
'设置和读取cookies
response.cookies("time_now")=now()
response.write request.cookies("time_now")
%>

效果:
当访问http://10.1.43.238/course/response_cookies.asp时:
2002-9-1 16:20:40


response_buffer.asp
<%'response.buffer=true%>
<a href="a">a</a>
<%response.redirect "request_form.htm"%>

效果:
①.当关闭IIS的缓冲功能,访问该页面时出错
a
答复对象 错误 'ASP 0156 : 80004005'
头错
/course/response_buffer.asp,行3
HTTP 头已经写入到 客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。
②.当关闭IIS的缓冲功能,去掉文件第一行的注释,则页面重定向成功
③.当打开IIS的缓冲功能,无论是否去掉文件第一行的注释,页面重定向都成功

3. Server

定义:可在服务器上使用不同实体函数,如在时间到达前控制脚本执行的时间。还可用来创建其他对象。

方法:
CreateObject:创建一个对象实例
HTMLEncode:将字符串转化为使用特别的HTML字符
MapPath:把虚拟路径转化成物理路径
URLEncode:把字符串转化成URL编码的
ScriptTimeout:在终止前,一个脚本允许运行的秒数

例子:

server_htmlencode.asp
<%
'html encode
response.write server.htmlencode("a""time_now")
%>

效果:
a"time_now
查看源文件时显示为:a"time_now

思考:为什么不是a""time_now这种效果?源文件是怎么了?


server_mappath.asp
<%
'mappath
response.write server.mappath("server_mappath.asp")
%>

效果:
G:\asp_www\test\course\server_mappath.asp

思考:如何获取站点根目录的实际路径?如何获取某个目录的实际路径?


server_urlencode.asp
<%
'url encode
response.write server.urlencode("a\time_now")
%>

效果:
a%5Ctime%5Fnow

4. Application

定义:用来存储、读取用户共享的应用程序信息,如可以用此对象在网站的用户间传送信息,当服务器重启后信息丢失。

方法:
Lock:防止其它用户访问Application集
Unlock:使其它用户可以访问Application集

事件:
OnEnd:由终止网络服务器、改变Global.asa文件触发
OnStart:由应用程序中对网页的第一次申请触发

例子:

application_counter.asp
<%
'一个使用Application制作的简单计数器
Application.lock
Application("clicks")=Application("clicks")+1
Application.unlock

response.write "您是本站第 "&Application("clicks")&" 位访客!"
response.write "<br><br>您来自 "&request.servervariables("remote_addr")
%>

效果:
您是本站第 1 位访客!

您来自 10.1.43.238

思考:本例中lock和unlock有何作用?

5. Session

定义:存储、读取特定用户对话信息,如可存储用户对网站的访问信息,当服务器重启后信息丢失。

方法:
Abandon:处理完当前页面后,结束一个用户会话

属性:
Timeout:用户会话持续时间(分钟数)

事件:
OnEnd:在Session Timeout时间以外,用户不再申请页面触发该事件
OnStart:由用户对网页的第一次申请时触发

例子:

session_counter.asp
<%
'一个使用Session制作的简单计数器
session("clicks")=session("clicks")+1

response.write "您是本站第 "&session("clicks")&" 位访客!"
response.write "<br><br>您来自 "&request.servervariables("remote_addr")
%>

效果:
您是本站第 1 位访客!

您来自 10.1.43.238

思考:既然session和application都能做到计数,那它们之间有什么区别?如果要做到满100重新开始计数如何实现?

三、使用Asp操作数据库:

1.通过ODBC或者OLE方式连接的区别?

现在有两种连接数据库的方法。一方面,可以用ODBC产生一个连接,这种连接与任何有ODBC驱动器的数据库(即基本上是市场上所有的数据库)兼容;另一方面,可以用原始OLE DB提供商产生一个连接。

该用哪个提供商?尽可能用原始OLE DB提供商,因为它提供了对数据更有效的访问。Microsoft正逐步用OLE DB取代ODBC标准,应该仅仅在没有原始OLE DB提供商时使用ODBC。

⑴.用ODBC方式连接SQL Server:
①.配置ODBC
②.连接代码:
conn_odbc.asp
<%
Set Conn = Server.CreateObject("ADODB.Connection")
'Conn.Open "DSN=course_dsn;UID=course_user;PWD=course_password;DATABASE=course"
Conn.Open "course_dsn","course_user","course_password"
%>
注意:在配置MyDSN时若指定默认数据库为course则上述代码作用想同,否则第二行的连接方式更有灵活性,可以指定连接某个数据库(当然,前提是course_user对这个数据库有操作权限)。

⑵.用OLE方式连接SQL Server:
conn_ole.asp
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PROVIDER=SQLOLEDB;DATA SOURCE=10.1.43.238,2433; UID=course_user;PWD=course_password;DATABASE=course"
%>

2.操作数据库:Connection和Recordset

联合使用connection和recordset操作数据库,或者只使用connection操作数据库。

例子:

⑴.联合使用connection和recordset操作数据库

use_db_1.asp
<%
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
conn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
Set rs=Server.CreateObject("ADODB.RecordSet") '创建记录集对象
rs.Open "select * from user_info",conn,1,1 '使用记录集对象打开数据库
if rs.recordcount>0 then '如果有记录
response.write "User_id User_name<br>"
for i=1 to rs.recordcount '循环读取所有纪录
response.write rs("id")&" "&rs("user_name")&"<br>"
'向浏览器输出纪录的字段
rs.movenext '指针下移一行
if rs.eof then exit for '如果到达记录集底部则退出循环
next
end if
%>

效果:
User_id User_name
1 ahyi
3 test


⑵.只使用connection操作数据库:

use_db_2.asp
<%
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
conn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
conn.execute "delete from user_info"
%>

效果:
user_info表中所有数据被删除

思考:两种方式有和区别?各应用于什么场合?

3.如何使用事务处理、存储过程和视图?

⑴.使用存储过程

①.定义好存储过程

CREATE PROCEDURE [output_1]
@sid int output
AS
set @sid=2

CREATE PROCEDURE [return_1]
(@user_name varchar(40),@password varchar(20))
AS
if exists(select id from user_info where user_name=@user_name and password=@password)
return 1
else
return 0

CREATE PROCEDURE [user_info_1]
(@user_name varchar(40),@password varchar(20))
AS
select id from user_info where user_name=@user_name and password=@password

CREATE PROCEDURE [user_info_2]
(@user_name varchar(40),@password varchar(20))
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
delete from user_info where user_name=@user_name and password=@password
COMMIT TRANSACTION
SET XACT_ABORT OFF

CREATE PROCEDURE [user_info_3] AS
select * from user_info

②.在Asp中调用

use_proc.asp
<!-- #include virtual="/adovbs.inc" -->
<%
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"

'使用recordset调用带两个输入参数和返回纪录集的存储过程
'CREATE PROCEDURE [user_info_1]
'(@user_name varchar(40),@password varchar(20))
'AS
'select id from user_info where user_name=@user_name and password=@password
response.write "普通的调用方法:<br>"
set rs=server.createobject("adodb.recordset")
sql="user_info_1 '"&request.querystring("user_name")&"','"&request.querystring("password")&"'"
rs.open sql,conn,1,1
response.write rs("id")&"<br>"
rs.close

'使用recordset调用无输入参数,返回纪录集的存储过程,可以使用recordcount等属性
'CREATE PROCEDURE [user_info_3] AS
'select * from user_info
response.write "<br>返回纪录集,可以使用recordcount等属性:"
sql="exec user_info_3"
rs.open sql,conn,1,1
for i=1 to rs.recordcount
response.write "<br>"&rs("user_name")
rs.movenext
next
rs.close
set rs=nothing

'使用command调用带输出参数的存储过程
'CREATE PROCEDURE [output_1]
'@sid int output
'AS
'set @sid=2
response.write "<br><br>调用带输出参数的存储过程:<br>"
set cmd=server.createobject("adodb.command")
cmd.activeconnection=conn
cmd.commandtext = "output_1"
cmd.parameters.append cmd.createparameter("@sid",adinteger,adparamoutput)
cmd("@sid")=10
cmd.execute()
bbb=cmd("@sid")
response.write bbb&"<br>"
set cmd=nothing

'使用command调用带两个输入参数和返回值的存储过程
'CREATE PROCEDURE [return_1]
'(@user_name varchar(40))
'AS
'if exists(select id from user_info where user_name=@user_name)
'return 1
'else
'return 0
response.write "<br>调用带两个输入参数和返回值的存储过程:<br>"
set cmd=server.createobject("adodb.command")
cmd.activeconnection=conn
cmd.commandtype = adcmdstoredproc
cmd.commandtext = "return_1"
cmd.parameters.append cmd.createparameter("@return_value",adinteger,adparamreturnvalue)
cmd.parameters.append cmd.createparameter("@user_name",advarchar,adparaminput,40)
cmd.parameters.append cmd.createparameter("@password",advarchar,adparaminput,20)
cmd("@user_name")="tuth"
cmd("@password")="yyuyu"
cmd.execute()
rrr=cmd("@return_value")
response.write rrr
set cmd=nothing

conn.close
set conn=nothing
%>

效果:
访问http://10.1.43.238/course/use_proc.asp?user_name=ahyi&password=ttt时,出现如下

普通的调用方法:
12

返回纪录集,可以使用recordcount等属性:
ahyi
tet
tuth

调用带输出参数的存储过程:
2

调用带两个输入参数和返回值的存储过程:
1

注意:若存储过程无参数,则调用的sql语句直接为存储过程名,一个参数为“存储过程名 参数”,若是多个参数,则“存储过程名 参数1,参数2,……,参数n”;如果在sql语句中加入exec,则在返回的记录集中可以使用recordcount等属性;如果想获得存储过程的返回值或输出参数,可以使用command对象。

⑵.使用事务处理

①.Asp内嵌的事务支持

例子:
use_transaction_1.asp
<%
'Asp中使用事务
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"
conn.begintrans '开始事务

sql="delete from user_info"
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,3,3
if conn.errors.count>0 then '有错误发生
conn.rollbacktrans '回滚
set rs=nothing
conn.close
set conn=nothing
response.write "交易失败,回滚至修改前的状态!"
response.end
else
conn.committrans '提交事务
set rs=nothing
conn.close
set conn=nothing
response.write "交易成功!"
response.end
end if
%>

②.数据库级的事务

i.创建存储过程

CREATE PROCEDURE [user_info_2]
(@user_name varchar(40),@password varchar(20))
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
delete from user_info where user_name=@user_name and password=@password
COMMIT TRANSACTION
SET XACT_ABORT OFF

ii.在Asp中调用

use_transaction_2.asp
<%
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"

sql="user_info_2 '"&request.querystring("user_name")&"','"&request.querystring("password")&"'"

set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
set rs=nothing
conn.close
set conn=nothing
%>

讨论:两种方式的优劣?

⑶.使用视图
在数据库中定义好视图之后,在Asp中如同使用一个表一样来使用视图

4.一个数据库分页的例子

db_page.asp
<%
on error resume next
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
conn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
set rs=server.createObject("adodb.recordset")
sql="select * from user_info order by id desc"
rs.open sql,conn,1,1

if rs.recordcount>0 then '如果有记录
rs.pagesize=2 '每页最多显示2条纪录
'从URL获取当前要显示的页
page=cint(request("page"))
'页面参数异常处理
if page="" then page=1
if page<1 then page=1
if page>= rs.pagecount then page=rs.pagecount
rs.absolutepage=page '当前页为page参数指定的页
for i=1 to rs.pagesize '根据pagesize参数的大小循环显示当前页中的纪录
response.write "User_id:"&rs("id")&"<br>"
response.write "User_name:"&rs("user_name")&"<br><br>"
rs.movenext '纪录指针下移
if rs.eof then exit for '如果到达纪录集底部则退出循环
next
end if

'显示翻页按钮
if page>1 then
response.write "<a href="&request.servervariables("document_name")&"?page=1>第一页</a> "
response.write "<a href="&request.servervariables("document_name")&"?page="&(page-1)&">上一页</a> "
end if
if page<>rs.pagecount then
response.write "<a href="&request.servervariables("document_name")&"?page="&(page+1)&">下一页</a> "
response.write "<a href="&request.servervariables("document_name")&"?page="&rs.pagecount&">最后一页</a> "
end if
response.write"页码:"&page&"/"&rs.pagecount

'关闭对象,释放内存
rs.close
set rs=nothing
conn.close
set conn=nothing
%>

思考:分页过程中使用了哪些额外的属性?

四、Asp组件的开发与使用:

1. 组件的特点?

l 优点:
n 调用方便,节省代码
n 安全性高
n 支持事务处理,多组件联合
n 运行速度快
n 升级、修改组件不需修改页面,因此扩展性好
l 缺点:
n 开发及调试困难

2. 如何使用VB开发?

⑴.打开VB>>New Project>>ActiveX DLL

⑵.修改项目名称为course


⑶.修改类模块的名字为conn_db


⑷.Project>> References,引用COM+ Service Type Library和Microsoft Active Server Pages Object Library。

⑸.修改类代码如下:

'建立数据库连接并输出数据库字段
Dim Response As Response
Dim Request As Request
Dim Server As Server
Dim Application As Application
Dim Session As Session

Private Sub Class_Initialize()
Dim objContext As ObjectContext
Set objContext = GetObjectContext()
Set Response = objContext("Response")
Set Request = objContext("Request")
Set Server = objContext("Server")
Set Application = objContext("Application")
Set Session = objContext("Session")
End Sub

Sub conn_db()
Set conn = CreateObject("adodb.connection")
conn.open "course_dsn", "course_user", "course_password"
Set rs = CreateObject("adodb.recordset")
rs.open "select * from user_info", conn, 1, 1

If rs.recordcount > 0 Then
For i = 1 To rs.recordcount
Response.write "<br>" & rs("user_name") & "<br>"
If rs.EOF Then Exit For
rs.movenext
Next
End If
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub

⑹.添加一新类cutstr

⑺.修改类代码如下:

'截取字符串
Function cutstr(str, length)
If Len(str) > length Then
cutstr = Left(str, length) & "..."
Else
cutstr = str
End If
End Function

⑻.File>>Save

⑼.File>>make course.dll

3. 注册组件:MTS和regsvr32.exe

有两种方式注册组件:MTS和使用regsvr32.exe。MTS是值得推荐的,因为它具有下列优点:
n 动态卸载平衡,提高组件和基于组件的应用程序的升级性。
n 包含公布和提交事件和队列组件的能力,使得更容易与多个组件联合。

要想使组件具有MTS的特性,必须对组件做少许改动。在NT和98下开发时,必须在项目中引用Microsoft Transaction Server Type Library,在Windows 2000下开发,必须引用COM+ Service Type Library。

⑴.regsvr32注册:

regsvr32.exe是system32下面的一个可执行文件,它将组件信息读入注册表,以便Asp调用。
使用命令行进入组件dll文件所在的目录,执行“regsvr32 dll_file_name”即可。


运行regedit,在HKEY_CLASSES_ROOT下就会找到course.conn_db项和course.cutstr项,表明组件注册成功。


⑵.使用MTS注册:

①.开始>>程序>>管理工具>>组件服务

②.展开目录至如下状态:


③.按照向导,下一步,直到如下对话框,点击“创建一个空的应用程序”:


④.在接下来的对话框中,为应用程序起名为“course”,其他默认,直至完成

⑤.展开course应用程序,右键,新建一个组件


⑥.按照提示,继续,出现如下对话框时,选择“导入已被注册的组件”


⑦.选择我们开发的组件,下一步,直至完成


⑧.这时候,可以发现course应用程序下已经多了两个组件:


4. 在Asp中调用组件

asp_use_com.asp
<%
'asp调用com组件
set cutstr_obj=server.createobject("course.cutstr")
response.write cutstr_obj.cutstr("abcdefghijk",3)&"<br>"
set cutstr_obj=nothing

set conn_obj=server.createobject("course.conn_db")
conn_obj.conn_db()
set conn_obj=nothing
%>

效果:
abc...

ahyi

tuth

说明调用成功。

5. 卸载组件

⑴.使用regsvr32注册的组件,使用-u开关卸载:


注意:先进入组件dll所在的目录,然后使用“regsvr32 –u dll_file_name”卸载;卸载后重启IIS即可。

⑵.使用MTS注册的组件,先在“组件服务”中删除对应的应用程序,然后再执行步骤 ⑴ 以彻底卸载组件。


6. Dll组件存放位置和权限设定

⑴.我们只需要把编译生成的Dll文件拷贝出来即可,其他的文件不用做处理
⑵.要把Dll放到Web站点之外,如system32目录里,防止被下载
⑶.Dll的文件权设置为System读取,Internet用户遍历文件夹/运行文件
⑷.Dll在IIS中去掉所有的权限,如读取,脚本自愿访问等
经过上述处理,可以确保Dll文件的安全。

7. 其他

如何在组件中使用Asp的对象以方便的将Asp代码移植为COM组件?


五、IIS最优化配置

1.Web站点选项卡:IP、端口、虚拟主机、连接、日志
2.ISAPI筛选器:加入PHP和JSP支持
3.主目录配置选项卡:I IS权限设定(结合文件权)、执行许可、应用程序保护、映射、缓冲、父路径、出错信息
4.其他选项卡:自定义错误、Http头、目录安全性、文档
5.文件压缩带来的好处和坏处
六、其他

1. 发送邮件(JMail;Ms smtp)

使用Microsoft Smtp发送电子邮件
⑴.安装Microsoft SMTP Service
⑵.设置Microsoft SMTP Service
⑶.代码部分:
mail_smtp.asp
<%
sub sendmail(fromwho,towho,subject,body)
dim mymail
set mymail = server.createobject("cdonts.newmail")
mymail.from = fromwho
mymail.to = towho
mymail.subject = subject
mymail.body = body
mymail.send
set mymail = nothing
end sub
%>

该子程序接受4个与下列各条对应的参数。
l 邮件发送者的email地址
l 邮件接收者的email地址
l 邮件主题
l 邮件内容

使用方法:
<%
fromWho=…
toWho=…
Subject=…
Body=…

IF toWho <> "" THEN
sendMail fromWho, toWho, Subject, Body
END IF
%>

使用Jmail发送Email
略,有兴趣可以和我探讨,Jmail这个软件我也有。

2. 解压Zip文件(Wscript.Shell和Winzip command line;Java组件)

⑴.安装Winzip 8.1以上
⑵.安装Winzip command line
⑶.将工作目录的文件权设置为Internet用户可以读取、写入和修改
⑷.代码部分:
unzip_a_zipfile.asp
<%
'用shell对象启动程序
'zip_path是具体zip文件的路径,如c:\test.zip
'path是存放解压后文件的路径
'ond是命令行参数
set wshshell = server.createobject("wscript.shell")
issuccess = wshshell.run ("wzunzip -ond "&zip_path&" "&path,1,true)

'删除zip文件
set myfileobject=server.createobject("scripting.filesystemobject")
myfileobject.deletefile zip_path

'判断是否成功以继续操作
if issuccess = 0 then
'成功
...
else
'失败
...
end if
%>

3. 操作XML文件

本次交流时间有限,有时间再做详细探讨

4.文件上传

⑴.安装文件上传组件Asp fileup(支持多文件上传,文件类型及大小判断,文件上传后改名等)
⑵.重起IIS以使上传组件生效
⑶.设置上传目录的文件权为Internet用户可以读取、写入和修改
⑷.代码部分
upload_file.htm
<style type="text/css">
<!--
.input {background-color: #FFFFFF; border-bottom: black 1px solid;border-left: black 1px solid; border-right: black 1px solid;border-top: black 1px solid; color: #000000;font-family: Georgia; font-size: 9pt;color: midnightblue;}
a:link {color: #1B629C; text-decoration: none}
a:hover {color: #FF6600; text-decoration: underline}
a:visited {text-decoration: none}
-->
</style>

<center>
<form enctype="multipart/form-data" method="post" action="upload_file.asp" name="Upload">
<input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com">
请选择文件:<input type="file" name="file1" class="input"><br><br>
请选择文件:<input type="file" name="file2" class="input"><br><br>
</form>
<br><br>
<a href="javascript:document.Upload.submit();"> 提 交 </a>
</center>


upload_file.asp
<%
on error resume next

'定义获得文件后缀的函数
function getfileextname(filename)
pos=instrrev(filename,".")
if pos>0 then
getfileextname=mid(filename,pos+1)
else
getfileextname=""
end if
end function

'定义获取文件正名的函数
function getfilename(filename)
lens=len(filename)-len(getfileextname(filename))-1
getfilename=left(filename,lens)
end function

'创建文件上传组件的对象
set fileup=server.createobject("chinaasp.upload")

'循环读取用户上传的文件,并保存在服务器上
for each f in fileup.files

'当用户没有选择文件或文件大小超过10m时返回到选择上传文件的页面
if f.filename="" or f.filesize>10485500 then response.redirect "upload_file.htm"

'获取保存的路径
path=server.mappath("upload_file.asp")
path=left(path,len(path)-15)

'保存文件
f.saveas path&getfilename(f.filename)&"."&getfileextname(f.filename)

next

response.redirect "upload_file.htm"
%>

5.驱动器/目录/文件操作

本次交流时间有限,有时间再做详细探讨

6. Asp编写与调试经验:cookies和session如何选择、cookies数量陷阱、页面过期和缓冲设定、移植性如何保证、如何应付内部服务器500错误……

1.Cookies和Session的选择:
⑴.共同特点
⑵.不同之处:
①.工作方式
②.过期条件
③.对服务器的性能影响

2.Cookies数量陷阱:
IIS可以保存一般的cookies不超过20个,再定义新的Cookies以前的Cookies的值就丢失了,这样对大型应用显然局限性非常大,如何解决这个问题呢?
答案是使用二维Cookies。

例子:

测试一维Cookies数量极限:
test_cookies_1.asp
<%
for i=1 to 50
response.cookies("cookies_"&i)=i
next
%>


test_cookies_2.asp
<%
for i=1 to 50
response.write request.cookies("cookies_"&i)&"<br>"
next
%>

效果:
先访问test_cookies_1.asp,再访问test_cookies_2.asp,,发现了什么?


test_cookies_3.asp
<%
for i=1 to 50
response.cookies("cookies_"&i)=i
next

for i=1 to 50
response.write request.cookies("cookies_"&i)&"<br>"
next
%>

效果:
没有Cookies丢失!!!!

测试二维Cookies数量极限:
test_cookies_4.asp
<%
for i=1 to 301
response.cookies("tuht")("cookies_"&i)=i
next
%>


test_cookies_5.asp
<%
for i=1 to 301
response.write request.cookies("tuht")("cookies_"&i)&"<br>"
next
%>

效果:
使用这种方式可以使用201*20=4020个Cookies!!!!

3.页面过期和缓冲设定
<%
'过期和缓冲处理
response.buffer=true
response.cachecontrol="no-chache"
response.expiresabsolute=now()-1
response.expires=0
%>
html中还可以做设定:
<meta content="no-cache" http-equiv="Pragma">
<meta HTTP-EQUIV="Expires" CONTENT="0">

4.移植性的保证
⑴.包含文件
<!--#include file="top.asp" -->
⑵.使用server.mappath寻找文件路径,避免在页面中直接使用绝对路径
⑶.尽量使用组件封装业务逻辑

5.调试内部服务器500的错误
⑴.设置IIS显示具体的错误信息
⑵.分步调试,由上而下
⑶.打印某些重要的变量的值,检查是否为我们预期
⑷.根据经验来判断错误

7. 操作Word文档

⑴.安装Office 2000,其中Word 2000必选
⑵.设置IE中Internet的安全性:ActiveX控件和插件全部启用
⑶.设置工作目录的文件权为Internet及System读取/修改/写入
⑷.编写模版course.dot
⑸.具体代码:
opr_doc_inc.asp
<%
Response.write "Dim Var_Num" & chr(13)
Response.write " Var_Num = 2 " & chr(13)
Response.write "Dim varstrings(2)" & chr(13)
Response.write "varstrings(0)=" & chr(34) & "起草人:" & chr(34) & chr(13)
Response.write "varstrings(1)=" & chr(34) & "日期:" & chr(34) & chr(13)
Response.write "Dim varValues(2)" & chr(13)
Response.write "varValues(0)=" & chr(34) &"起草人:涂海涛"& chr(34) & chr(13)
Response.write "varValues(1)=" & chr(34) & "日期:"&date()& chr(34) & chr(13)
%>

Sub instead(word)
Set myRange = word.ActiveDocument.Content
for i=0 to Var_Num - 1
call myRange.Find.Execute(varStrings(i),false,false,false,false,false,false,false,false,varValues(i),2)
Next
End Sub


opr_doc.asp
<%
'获取保存的路径
path=server.mappath("opr_doc.asp")
path=left(path,len(path)-11)
filenames=path&"test.doc"

w1="word.activedocument.saveAs"&chr(32)&chr(34)&filenames&chr(34)
w2="wApp.Documents.open"&chr(32)&chr(34)&filenames&chr(34)
%>
<script language="vbscript">
On Error Resume Next
'生成指定文件名的Word文档
Dim word
set word = CreateObject("Word.Application")
if Err.number > 0 Then
Alert "发生错误,请确认文件是否存在"
else
word.visible = False
word.documents.open "<%response.write path%>course.dot"
<%Response.write w1%>
word.documents.close
set word=nothing
end if

<!--#include file="opr_doc_inc.asp"-->

Dim wApp
Set wApp = CreateObject("Word.Application")
If Err.number > 0 Then
Alert "发生错误,请确认文件是否正确创建"
else
wApp.visible = True
<%Response.write w2%>
call instead(wApp)
set wApp=nothing
end if
</script>

效果:看看生成了doc文件吗?这个新建的doc文件和模版文件有什么区别?起草人和日期发生了变化了吗?保存一下,看看新生成的doc文件的内容。


附:
1.以上全部代码在Windows 2000 Server SP2+IIS 5.0+MS SQL Server 2000+Office 2000下测试通过
2.配置数据库:数据库名course,用户course_user,密码course_password,ODBC驱动为course_dsn,端口为2433,描述表结构的脚本在共享目录下。
3.Asp fileup、Jmail、Winzip 8.1、Winzip command line这几个软件请自行下载
4.数据库脚本文件:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[output_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[output_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[return_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[return_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[user_info_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[user_info_2]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_3]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[user_info_3]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[user_info]
GO

CREATE TABLE [dbo].[user_info] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[user_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[user_info] WITH NOCHECK ADD
CONSTRAINT [PK_user_info] PRIMARY KEY CLUSTERED
(
[user_name]
) ON [PRIMARY]
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [output_1]
@sid int output
AS
set @sid=2
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [return_1]
(@user_name varchar(40),@password varchar(20))
AS
if exists(select id from user_info where user_name=@user_name and password=@password)
return 1
else
return 0
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_1]
(@user_name varchar(40),@password varchar(20))
AS
select id from user_info where user_name=@user_name and password=@password
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_2]
(@user_name varchar(40),@password varchar(20))
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
delete from user_info where user_name=@user_name and password=@password
COMMIT TRANSACTION
SET XACT_ABORT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [user_info_3] AS
select * from user_info
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

相 关 文 章
没有相关文章
相 关 软 件
没有相关下载
逃生 放生 黄玫瑰 想太多 那滋味 擦肩而过 放手去爱 北京欢迎你 依然在一起 吻得太逼真 感动天感动地 坐上火车去拉萨 怎么会狠心伤害我
心碎 冲动 小太阳 别碰我 蒲公英 千山万水 改变自己 一定要爱你 等爱的玫瑰 陷入爱里面 北极星的眼泪 最后一次的温柔 亲爱的那不是爱情
光荣 火花 坏女人 日不落 樱花草 为你写诗 独家记忆 夏天的味道 寂寞才说爱 忘不掉的伤 爱上你是个错 第三者的第三者 地球人都知道我爱你
假如 相思 是非题 有缘人 舍不得 我的答铃 死而无憾 外滩十八号 越爱越难过 123木头人 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错
加入收藏留言建议自助友情链接普通友情链接站长的Blog
版权所有   COPYRIGHT 2002-2008 ★IT学习者★ ALL RIGHTS RESERVED.