📄 asp深度揭密(下).htm
字号:
<TD align=middle class=p4
colSpan=2><B>Asp深度揭密(下)</B></FONT><BR>2002-9-9 动网先锋
</TD></TR>
<TR>
<TD class=p4 colSpan=2>
<BLOCKQUOTE><BR>四、Asp组件的开发与使用:
<P></P>
<P>1. 组件的特点?</P>
<P>l 优点:<BR>n 调用方便,节省代码<BR>n 安全性高<BR>n 支持事务处理,多组件联合<BR>n
运行速度快<BR>n 升级、修改组件不需修改页面,因此扩展性好<BR>l 缺点:<BR>n 开发及调试困难</P>
<P>2. 如何使用VB开发?</P>
<P>⑴.打开VB>>New Project>>ActiveX DLL</P>
<P>⑵.修改项目名称为course</P>
<P></P>
<P>⑶.修改类模块的名字为conn_db</P>
<P><BR>⑷.Project>> References,引用COM+ Service Type
Library和Microsoft Active Server Pages Object Library。</P>
<P>⑸.修改类代码如下:</P>
<P>'建立数据库连接并输出数据库字段<BR>Dim Response As Response<BR>Dim Request As
Request<BR>Dim Server As Server<BR>Dim Application As
Application<BR>Dim Session As Session<BR><BR>Private Sub
Class_Initialize()<BR>Dim objContext As ObjectContext<BR>Set
objContext = GetObjectContext()<BR>Set Response =
objContext("Response")<BR>Set Request =
objContext("Request")<BR>Set Server = objContext("Server")<BR>Set
Application = objContext("Application")<BR>Set Session =
objContext("Session")<BR>End Sub</P>
<P>Sub conn_db()<BR>Set conn =
CreateObject("adodb.connection")<BR>conn.open "course_dsn",
"course_user", "course_password"<BR>Set rs =
CreateObject("adodb.recordset")<BR>rs.open "select * from
user_info", conn, 1, 1</P>
<P>If rs.recordcount > 0 Then<BR>For i = 1 To
rs.recordcount<BR>Response.write "<br>" &
rs("user_name") & "<br>"<BR>If rs.EOF Then Exit
For<BR>rs.movenext<BR>Next<BR>End If<BR>rs.Close<BR>Set rs =
Nothing<BR>conn.Close<BR>Set conn = Nothing<BR>End Sub</P>
<P>⑹.添加一新类cutstr</P>
<P>⑺.修改类代码如下:</P>
<P>'截取字符串<BR>Function cutstr(str, length)<BR>If Len(str) >
length Then<BR>cutstr = Left(str, length) &
"..."<BR>Else<BR>cutstr = str<BR>End If<BR>End Function</P>
<P>⑻.File>>Save</P>
<P>⑼.File>>make course.dll</P>
<P>3. 注册组件:MTS和regsvr32.exe</P>
<P>有两种方式注册组件:MTS和使用regsvr32.exe。MTS是值得推荐的,因为它具有下列优点:<BR>n
动态卸载平衡,提高组件和基于组件的应用程序的升级性。<BR>n
包含公布和提交事件和队列组件的能力,使得更容易与多个组件联合。</P>
<P>要想使组件具有MTS的特性,必须对组件做少许改动。在NT和98下开发时,必须在项目中引用Microsoft
Transaction Server Type Library,在Windows 2000下开发,必须引用COM+ Service
Type Library。</P>
<P>⑴.regsvr32注册:</P>
<P>regsvr32.exe是system32下面的一个可执行文件,它将组件信息读入注册表,以便Asp调用。<BR>使用命令行进入组件dll文件所在的目录,执行“regsvr32
dll_file_name”即可。</P>
<P><BR>运行regedit,在HKEY_CLASSES_ROOT下就会找到course.conn_db项和course.cutstr项,表明组件注册成功。</P>
<P><BR>⑵.使用MTS注册:</P>
<P>①.开始>>程序>>管理工具>>组件服务</P>
<P>②.展开目录至如下状态:</P>
<P></P>
<P>③.按照向导,下一步,直到如下对话框,点击“创建一个空的应用程序”:</P>
<P></P>
<P>④.在接下来的对话框中,为应用程序起名为“course”,其他默认,直至完成</P>
<P>⑤.展开course应用程序,右键,新建一个组件</P>
<P></P>
<P>⑥.按照提示,继续,出现如下对话框时,选择“导入已被注册的组件”</P>
<P></P>
<P>⑦.选择我们开发的组件,下一步,直至完成</P>
<P></P>
<P>⑧.这时候,可以发现course应用程序下已经多了两个组件:</P>
<P></P>
<P>4. 在Asp中调用组件</P>
<P>asp_use_com.asp<BR><%<BR>'asp调用com组件<BR>set
cutstr_obj=server.createobject("course.cutstr")<BR>response.write
cutstr_obj.cutstr("abcdefghijk",3)&"<br>"<BR>set
cutstr_obj=nothing</P>
<P>set
conn_obj=server.createobject("course.conn_db")<BR>conn_obj.conn_db()<BR>set
conn_obj=nothing<BR>%></P>
<P>效果:<BR>abc...</P>
<P>ahyi</P>
<P>tuth</P>
<P>说明调用成功。</P>
<P>5. 卸载组件</P>
<P>⑴.使用regsvr32注册的组件,使用-u开关卸载:</P>
<P></P>
<P>注意:先进入组件dll所在的目录,然后使用“regsvr32 –u
dll_file_name”卸载;卸载后重启IIS即可。</P>
<P>⑵.使用MTS注册的组件,先在“组件服务”中删除对应的应用程序,然后再执行步骤 ⑴ 以彻底卸载组件。</P>
<P></P>
<P>6. Dll组件存放位置和权限设定</P>
<P>⑴.我们只需要把编译生成的Dll文件拷贝出来即可,其他的文件不用做处理<BR>⑵.要把Dll放到Web站点之外,如system32目录里,防止被下载<BR>⑶.Dll的文件权设置为System读取,Internet用户遍历文件夹/运行文件<BR>⑷.Dll在IIS中去掉所有的权限,如读取,脚本自愿访问等<BR>经过上述处理,可以确保Dll文件的安全。</P>
<P>7. 其他</P>
<P>如何在组件中使用Asp的对象以方便的将Asp代码移植为COM组件?</P>
<P><BR>五、IIS最优化配置</P>
<P>1.Web站点选项卡:IP、端口、虚拟主机、连接、日志<BR>2.ISAPI筛选器:加入PHP和JSP支持<BR>3.主目录配置选项卡:I
IS权限设定(结合文件权)、执行许可、应用程序保护、映射、缓冲、父路径、出错信息<BR>4.其他选项卡:自定义错误、Http头、目录安全性、文档<BR>5.文件压缩带来的好处和坏处</P>
<P><BR>六、其他</P>
<P>1. 发送邮件(JMail;Ms smtp)</P>
<P>使用Microsoft Smtp发送电子邮件<BR>⑴.安装Microsoft SMTP
Service<BR>⑵.设置Microsoft SMTP
Service<BR>⑶.代码部分:<BR>mail_smtp.asp<BR><%<BR>sub
sendmail(fromwho,towho,subject,body)<BR>dim mymail<BR>set mymail =
server.createobject("cdonts.newmail")<BR>mymail.from =
fromwho<BR>mymail.to = towho<BR>mymail.subject =
subject<BR>mymail.body = body<BR>mymail.send<BR>set mymail =
nothing<BR>end sub<BR>%></P>
<P>该子程序接受4个与下列各条对应的参数。<BR>l 邮件发送者的email地址<BR>l 邮件接收者的email地址<BR>l
邮件主题<BR>l 邮件内容</P>
<P>使用方法:<BR><%<BR>fromWho=…<BR>toWho=…<BR>Subject=…<BR>Body=…</P>
<P>IF toWho <> "" THEN<BR>sendMail fromWho, toWho, Subject,
Body<BR>END IF<BR>%></P>
<P>使用Jmail发送Email<BR>略,有兴趣可以和我探讨,Jmail这个软件我也有。</P>
<P>2. 解压Zip文件(Wscript.Shell和Winzip command line;Java组件)</P>
<P>⑴.安装Winzip 8.1以上<BR>⑵.安装Winzip command
line<BR>⑶.将工作目录的文件权设置为Internet用户可以读取、写入和修改<BR>⑷.代码部分:<BR>unzip_a_zipfile.asp<BR><%<BR>'用shell对象启动程序<BR>'zip_path是具体zip文件的路径,如c:\test.zip<BR>'path是存放解压后文件的路径<BR>'ond是命令行参数<BR>set
wshshell = server.createobject("wscript.shell")<BR>issuccess =
wshshell.run ("wzunzip -ond "&zip_path&"
"&path,1,true)</P>
<P>'删除zip文件<BR>set
myfileobject=server.createobject("scripting.filesystemobject")<BR>myfileobject.deletefile
zip_path</P>
<P>'判断是否成功以继续操作<BR>if issuccess = 0 then
<BR>'成功<BR>...<BR>else<BR>'失败<BR>...<BR>end if<BR>%></P>
<P>3. 操作XML文件</P>
<P>本次交流时间有限,有时间再做详细探讨</P>
<P>4.文件上传</P>
<P>⑴.安装文件上传组件Asp
fileup(支持多文件上传,文件类型及大小判断,文件上传后改名等)<BR>⑵.重起IIS以使上传组件生效<BR>⑶.设置上传目录的文件权为Internet用户可以读取、写入和修改<BR>⑷.代码部分<BR>upload_file.htm<BR><style
type="text/css"><BR><!--<BR>.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;}<BR>a:link {color: #1B629C; text-decoration:
none}<BR>a:hover {color: #FF6600; text-decoration:
underline}<BR>a:visited {text-decoration:
none}<BR>--><BR></style></P>
<P><center><BR><form enctype="multipart/form-data"
method="post" action="upload_file.asp"
name="Upload"><BR><input type="hidden" name="CopyrightInfo"
value="http://www.chinaasp.com"><BR>请选择文件:<input type="file"
name="file1"
class="input"><br><br><BR>请选择文件:<input
type="file" name="file2"
class="input"><br><br><BR></form><BR><br><br><BR><a
href="javascript:document.Upload.submit();"> 提 交
</a><BR></center></P>
<P><BR>upload_file.asp<BR><%<BR>on error resume next</P>
<P>'定义获得文件后缀的函数<BR>function
getfileextname(filename)<BR>pos=instrrev(filename,".")<BR>if
pos>0 then
<BR>getfileextname=mid(filename,pos+1)<BR>else<BR>getfileextname=""<BR>end
if<BR>end function</P>
<P>'定义获取文件正名的函数<BR>function
getfilename(filename)<BR>lens=len(filename)-len(getfileextname(filename))-1<BR>getfilename=left(filename,lens)<BR>end
function</P>
<P>'创建文件上传组件的对象<BR>set
fileup=server.createobject("chinaasp.upload")</P>
<P>'循环读取用户上传的文件,并保存在服务器上<BR>for each f in fileup.files</P>
<P>'当用户没有选择文件或文件大小超过10m时返回到选择上传文件的页面<BR>if f.filename="" or
f.filesize>10485500 then response.redirect
"upload_file.htm"</P>
<P>'获取保存的路径<BR>path=server.mappath("upload_file.asp")<BR>path=left(path,len(path)-15)</P>
<P>'保存文件<BR>f.saveas
path&getfilename(f.filename)&"."&getfileextname(f.filename)</P>
<P>next</P>
<P>response.redirect "upload_file.htm"<BR>%></P>
<P>5.驱动器/目录/文件操作</P>
<P>本次交流时间有限,有时间再做详细探讨</P>
<P>6.
Asp编写与调试经验:cookies和session如何选择、cookies数量陷阱、页面过期和缓冲设定、移植性如何保证、如何应付内部服务器500错误……</P>
<P>1.Cookies和Session的选择:<BR>⑴.共同特点<BR>⑵.不同之处:<BR>①.工作方式<BR>②.过期条件<BR>③.对服务器的性能影响</P>
<P>2.Cookies数量陷阱:<BR>IIS可以保存一般的cookies不超过20个,再定义新的Cookies以前的Cookies的值就丢失了,这样对大型应用显然局限性非常大,如何解决这个问题呢?<BR>答案是使用二维Cookies。</P>
<P>例子:</P>
<P>测试一维Cookies数量极限:<BR>test_cookies_1.asp<BR><%<BR>for i=1 to
50<BR>response.cookies("cookies_"&i)=i<BR>next<BR>%></P>
<P><BR>test_cookies_2.asp<BR><%<BR>for i=1 to
50<BR>response.write
request.cookies("cookies_"&i)&"<br>"<BR>next<BR>%></P>
<P>效果:<BR>先访问test_cookies_1.asp,再访问test_cookies_2.asp,,发现了什么?</P>
<P><BR>test_cookies_3.asp<BR><%<BR>for i=1 to
50<BR>response.cookies("cookies_"&i)=i<BR>next</P>
<P>for i=1 to 50<BR>response.write
request.cookies("cookies_"&i)&"<br>"<BR>next<BR>%></P>
<P>效果:<BR>没有Cookies丢失!!!!</P>
<P>测试二维Cookies数量极限:<BR>test_cookies_4.asp<BR><%<BR>for i=1 to
301<BR>response.cookies("tuht")("cookies_"&i)=i<BR>next<BR>%></P>
<P><BR>test_cookies_5.asp<BR><%<BR>for i=1 to
301<BR>response.write
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -