发新话题
打印

Asp深度揭密(下)

Asp深度揭密(下)


四、Asp组件的开发与使用: 0 k$ z* G( p7 j. q/ @* B: x
$ b! r' o* ]+ E8 G0 W; {/ ^7 }
  
1 c( {+ S) m; M# I4 ]  @7 D0 Y  x% W6 [( v) J+ u' D8 f
1. 组件的特点?  * r+ y' l2 u4 {- R( O
" w, Q% R& F$ I* o3 l/ B" Q% X
l 优点:9 n, {! C. ^- ]* S
n 调用方便,节省代码
- c, H$ \* K( I# C6 un 安全性高
+ i9 E$ ~( b+ T+ un 支持事务处理,多组件联合5 ~: z- b. n- t% z4 ^/ j
n 运行速度快
; b( C" [0 f, Q' C0 hn 升级、修改组件不需修改页面,因此扩展性好, j- |1 t) N' J% j
l 缺点:
# y5 m+ t/ V8 T( l! u  V; A+ nn 开发及调试困难  : \* ~  q$ Z* g* h

" e9 S/ Y' E) {2. 如何使用VB开发?  
: j/ h3 W" d& Y: e
9 X2 E5 X6 j7 y: ^7 L7 z/ E⑴.打开VBNew ProjectActiveX DLL  , }# F" ?8 {3 A7 K1 x
, F3 r# i) e0 Y2 m, `6 O) F; U& K
⑵.修改项目名称为course  3 j5 S7 H* i5 b4 h: C( Z) q$ j4 ]: W+ v
- @/ a" D- p8 p  E/ O( V
  
  d# d) b. i8 Y& |0 h' L5 Z( U8 X  \5 v# [: ^0 Y8 a) M
⑶.修改类模块的名字为conn_db  
2 R1 _8 ~2 `$ K5 }
" ?. I, V1 h) _$ K3 {2 L; N9 x+ p7 v  `5 g8 d) N* {0 e
⑷.Project References,引用COM  Service Type Library和Microsoft Active Server Pages Object Library。    ^; Y* M. W  L
* ^: T- U+ x$ i
⑸.修改类代码如下:  4 j- V+ \' v2 B) E

* h9 i8 V. G3 b7 Z'建立数据库连接并输出数据库字段
0 u3 O2 D% P. ^6 rDim Response As Response
- v$ Z0 A" v) w8 HDim Request As Request' }7 d9 [$ R7 q
Dim Server As Server
& U# n+ }& W0 B& r/ `7 RDim Application As Application
- o8 ]! D; t( Y  R1 UDim Session As Session
5 G6 g6 U1 \! n
6 p9 l: X. X3 C1 N! l7 MPrivate Sub Class_Initialize()
, i% P9 |5 v( \# r# SDim objContext As ObjectContext: t0 O& ~* Q+ w0 M8 g
Set objContext = GetObjectContext()
  e2 V: g2 y" aSet Response = objContext("Response")' i8 w8 p) I# I  O9 M! ^5 b
Set Request = objContext("Request")
& h5 k' \: |0 ?0 z6 I6 vSet Server = objContext("Server")7 I- d9 h/ i1 _3 h' s- B
Set Application = objContext("Application")  H+ \$ B0 y9 A. P" @
Set Session = objContext("Session"). P6 x+ C0 z% B; G( L
End Sub  
& [' g; @# k' U: E) s3 k/ ^6 b: p9 u* e
Sub conn_db(): V. _- [- F" S4 s' R" ^. q
Set conn = CreateObject("adodb.connection")
+ j# ^4 d' z' Vconn.open "course_dsn", "course_user", "course_password"
3 j2 T) }* s& iSet rs = CreateObject("adodb.recordset")
8 w1 X  H+ r8 a+ X3 Frs.open "select * from user_info", conn, 1, 1  
6 c3 c$ S/ q: U2 H, |7 g) Q( E  n) ~
If rs.recordcount  0 Then( R8 y9 f5 i  T' Q5 |
For i = 1 To rs.recordcount
  d1 E, c9 u  EResponse.write "br"  rs("user_name")  "br"- \# z, a: y0 A0 v6 g
If rs.EOF Then Exit For3 ^4 g3 ?" Y9 b, |3 y
rs.movenext
1 L. l4 Y# K4 z& O: F: [  h, J% \Next1 |! Y9 j! v- ]3 z- R. V
End If* m5 v, F. l) y, N
rs.Close
, W1 K, g; ^( t* J7 }6 FSet rs = Nothing& `/ e0 ^9 p3 Q; V; {
conn.Close
; J% _2 `  W* u! o$ j! mSet conn = Nothing. l) A% H# @6 Y; B# ~, C( Q
End Sub  
/ `% g% y* o: u, l; [; A
! ^* t5 a) g. q9 w2 }1 j, T⑹.添加一新类cutstr  
; z7 ?9 f* g. I' W7 y" y' w
3 j2 H( ~* [6 C) Q4 E% V⑺.修改类代码如下:  
" w( T1 i: D$ L- i9 u
- T- J* S, _: W! r'截取字符串
$ h8 R( Q5 ?9 [Function cutstr(str, length)3 {! |. ]* U! G9 Q) z( \$ i
If Len(str)  length Then
$ N9 T& i  }4 [% b) t. F6 Q" d9 A9 qcutstr = Left(str, length)  "..."4 a! ^2 t0 L5 o" ~7 D
Else1 E1 N" m: L& w. z% }
cutstr = str
$ p* ^5 \/ ?9 VEnd If
; k; M/ E/ m# |3 V( W0 PEnd Function  
9 c0 r% Z- `' O. A- P/ p
# M; B: q9 l# N! M5 w⑻.FileSave  ' c% ?; A' p4 o# P) v/ y- o. n

! u- L: m' }, `+ w! t) U⑼.Filemake course.dll  
- p" u$ G, }6 N9 K2 I6 F; ~" T2 Q
3. 注册组件:MTS和regsvr32.exe  - n7 {4 {* E* B4 N0 p6 a+ j( \

5 q2 z% q- t1 C. X4 u% @有两种方式注册组件:MTS和使用regsvr32.exe。MTS是值得推荐的,因为它具有下列优点:# R7 Y& \  [+ u
n 动态卸载平衡,提高组件和基于组件的应用程序的升级性。
$ J& H% A2 A# i/ W9 Z/ Sn 包含公布和提交事件和队列组件的能力,使得更容易与多个组件联合。  
9 y8 `  H$ ~5 l4 h% S( K9 |1 E4 r7 J/ j) y: S
要想使组件具有MTS的特性,必须对组件做少许改动。在NT和98下开发时,必须在项目中引用Microsoft Transaction Server Type Library,在Windows 2000下开发,必须引用COM  Service Type Library。  % e  E, f. n5 @$ r

! A% Q4 i+ y2 B" q& K+ k& x9 m⑴.regsvr32注册:  ! v* a: Z3 Y/ t) P
. s3 c% ^4 p: z; d* R* }3 g
regsvr32.exe是system32下面的一个可执行文件,它将组件信息读入注册表,以便Asp调用。1 _) H3 W( I7 {) h+ s, ]  h( Q
使用命令行进入组件dll文件所在的目录,执行“regsvr32 dll_file_name”即可。  
8 |% }- K! t+ u
/ Q  d, C1 S; Y" {7 L: A. l7 W
2 J1 C8 T2 |% ?# i8 J& y! z运行regedit,在HKEY_CLASSES_ROOT下就会找到course.conn_db项和course.cutstr项,表明组件注册成功。  
: U0 e& ]8 V. B6 t. l8 W
, h, x* g1 [' J! V' v( r, E+ r8 t
⑵.使用MTS注册:  
% ]' Y; l/ j, T2 q' ^2 N" d, i
# I4 F- U5 J+ R$ z, G①.开始程序管理工具组件服务  ! D( Y3 {+ ^6 J+ }: t

; I8 s2 f" N% X) w6 h②.展开目录至如下状态:  3 j9 e4 w4 v+ n0 Q
- T2 ~( k! N! I7 V" c
  : R+ @& n  e; w9 }" Y( R' g9 [) y

& N# P8 z" b( l) @: f③.按照向导,下一步,直到如下对话框,点击“创建一个空的应用程序”:  + ?1 `3 ^- M* v: F" i# ^1 C1 d
$ z4 t/ _& q/ V6 c1 W
  
2 j  e  G; y- f1 i" D+ z% C3 ]+ n; j
④.在接下来的对话框中,为应用程序起名为“course”,其他默认,直至完成  
; g/ y* x  c! ]6 K+ e5 V5 ?2 C" i& \. Y% i. L- c  i6 P
⑤.展开course应用程序,右键,新建一个组件  ; ^0 ?0 K2 `: q, l$ f
8 l/ @5 Y  U2 E) o6 B! W
  
) p" I$ }' w. Q/ K% N/ Z* o9 O& P; k6 i- O- J; r
⑥.按照提示,继续,出现如下对话框时,选择“导入已被注册的组件”  
' i+ l3 I8 C+ l- g& Y9 F* H, E- y& S7 l
  
$ g  X# X7 V2 O$ B5 t' y1 z
6 {$ m. C* Y: z. H⑦.选择我们开发的组件,下一步,直至完成  8 p# E" W7 j, }5 _. j7 O) I
6 ^- T% x! w9 N( C4 e
  6 q" v9 m6 Z) w

4 @: W8 t9 |* c0 L8 P4 e  y# }⑧.这时候,可以发现course应用程序下已经多了两个组件:  
" N4 U8 U3 e' [$ C1 R4 t" c
1 O& c1 V4 h4 i9 K9 q  
1 q. b3 g/ m; }# j4 u: I+ N/ y, {
2 I6 w) F2 z# E- m/ v4. 在Asp中调用组件  ' @! D- Y3 c* M

  w. u+ d* M$ K7 R5 f: E! zasp_use_com.asp* ~: q/ K1 l  X; X0 W
%
  |, ^- z5 X/ K) S'asp调用com组件
, J: j5 b3 }" v" {0 G. g  Hset cutstr_obj=server.createobject("course.cutstr"): Y1 z4 U1 q4 ]
response.write cutstr_obj.cutstr("abcdefghijk",3)"br"
. c$ _! P6 g( m! N2 Cset cutstr_obj=nothing  
) r$ i) U+ z) y& ^/ G9 [
3 H7 g! ^6 M: T8 Aset conn_obj=server.createobject("course.conn_db")! k" \9 v- Q# ^% }
conn_obj.conn_db()1 V& R2 _4 {% f0 L* Q
set conn_obj=nothing0 k% H3 s, S7 z; n# l$ a7 t
%  ) A& x% S  V: ]9 j. {

3 @- g& _6 }; s8 U) E, \+ ?效果:
. ?5 x. t4 B# ~4 vabc...  
+ y6 _, \; D% W- u' \& a  `2 w: z( D" L! @0 s1 P
ahyi  
4 I% Z, ?3 u, f  E) e) ?) v+ S; u- {7 o
" T! S6 \4 T1 |8 }) F; W  N& B, dtuth  
. @3 Q3 f6 Y  g; h
: V/ N' b, I* v" q; Z, K说明调用成功。  
' a# [4 [3 `" @  n( m+ e/ t# g$ ^# |% ]# O! o0 D
5. 卸载组件  
6 P; X5 i% S8 v% H' |! |  M/ t0 t! W
/ K7 C6 V$ p& L8 t⑴.使用regsvr32注册的组件,使用-u开关卸载:  9 R2 ~$ u. T) ~# y

/ X0 k) R( Z. W8 A1 ]; s  
/ A7 t" p3 N; @. [7 Y. ?1 X& V& f/ H2 Q
注意:先进入组件dll所在的目录,然后使用“regsvr32 –u dll_file_name”卸载;卸载后重启IIS即可。  + Y8 o# f/ e+ h# r9 N, p' G. @

0 h5 `, J  j. ]0 t1 ~- j$ H⑵.使用MTS注册的组件,先在“组件服务”中删除对应的应用程序,然后再执行步骤 ⑴ 以彻底卸载组件。  ) W$ [" y' m* g* {; \
7 B# X$ ?" E: y( q, `7 {) ?: e
  
2 M* @+ c+ `4 W% c
1 x# E5 x: H; O4 g6. Dll组件存放位置和权限设定  
8 w1 T& |, j3 b! n* H
( M. f  e% ^% v" ~$ ?⑴.我们只需要把编译生成的Dll文件拷贝出来即可,其他的文件不用做处理
$ W! v0 N, E. N1 }# Q⑵.要把Dll放到Web站点之外,如system32目录里,防止被下载5 s+ O! T2 ?9 A% a3 C
⑶.Dll的文件权设置为System读取,Internet用户遍历文件夹/运行文件
7 t* }9 g, y& j1 @- i⑷.Dll在IIS中去掉所有的权限,如读取,脚本自愿访问等/ `7 u. D5 s% K
经过上述处理,可以确保Dll文件的安全。  
( I3 Z# e" c6 K* f* y# D4 @3 V; i/ Z' e9 k  {) b$ h8 q8 z1 }# I
7. 其他  
, F. {% Q7 d4 x2 P, b+ Y6 J% c8 `
- y# j8 y# y# Y# i如何在组件中使用Asp的对象以方便的将Asp代码移植为COM组件?  / {0 b+ _- A; o: i; o7 a
; T6 Q" w4 \9 ~# y: W! R$ s
8 o# w4 M7 f3 T  r+ A+ m! ?
五、IIS最优化配置  
0 n6 u! z) i7 P+ q
* P/ {9 V, I. O- {8 U& n# q8 `1.Web站点选项卡:IP、端口、虚拟主机、连接、日志
" Z* q$ `! L  `6 G- r" ^2.ISAPI筛选器:加入PHP和JSP支持- {+ }) }' p9 o# n5 |1 J
3.主目录配置选项卡:I IS权限设定(结合文件权)、执行许可、应用程序保护、映射、缓冲、父路径、出错信息- ]" L' ~! [' ^, C; y7 V& F
4.其他选项卡:自定义错误、Http头、目录安全性、文档3 O( M. M6 t, }, v
5.文件压缩带来的好处和坏处  
) u& N) G  Q; Q4 _$ O+ N8 k3 o8 W( X- }2 m" `. h
4 X5 p' J) P: c7 ~. h
六、其他  / m" h8 P" V) R5 E) v2 X
1 j( D) @4 I; c+ @
1. 发送邮件(JMail;Ms smtp)  1 w* f# ^: ^, K: O7 b0 H& b
; \7 ]7 X* y0 b
使用Microsoft Smtp发送电子邮件8 }, R  V. y, D; J" r" Y
⑴.安装Microsoft SMTP Service; E3 ^% m! b' o4 s  [
⑵.设置Microsoft SMTP Service+ V, r# ^. n) w" X  [9 Z
⑶.代码部分:* M2 E/ A# ~7 G0 N6 l
mail_smtp.asp
$ L8 M- [. p0 g% t* w' h/ h5 a%* Q2 @# B0 u$ E$ B6 J1 L- k5 N
sub sendmail(fromwho,towho,subject,body)! ^( Y0 U2 w  ]% {( V% D+ x$ k
dim mymail' ]3 d- \2 g. p3 Y3 g2 o" j! r
set mymail = server.createobject("cdonts.newmail")
; F+ n0 h, B; {8 u8 emymail.from = fromwho  o, A7 Y' [' M5 ^5 \
mymail.to = towho) ^# l% t) w; N5 U! k
mymail.subject = subject3 J1 b% k1 ]& ^7 X" P+ n
mymail.body = body
2 l" {$ o: [7 V- ?* c! ?: dmymail.send+ G1 j4 b; H' ]! y# o
set mymail = nothing8 U$ w3 e1 o" r% _# L- ?; H4 c3 v
end sub3 s5 _! R% Z, S7 D3 v& x
%  
9 S8 v) z2 Y' e4 |5 g( S" x* u" A0 e  b  |6 k
该子程序接受4个与下列各条对应的参数。& V* i  J' `: W- C# Q# k5 R) d- J
l 邮件发送者的email地址
1 a/ u6 ]- B" b% |- G' r! c* Wl 邮件接收者的email地址* r6 x9 g2 o% q4 I0 j
l 邮件主题
$ U5 ?( @: h. X3 Dl 邮件内容  
5 e+ Z5 X8 Z: X3 A
& J3 G6 |1 j% }* b/ @- s* u使用方法:
( w; O8 c: s) A8 _: \%0 G; O6 b; M; g; D. S& v! A9 y1 m
fromWho=…$ q7 P1 N! K& Y+ U. U
toWho=…, {4 U! {6 f' |3 n- g
Subject=…
4 h+ L. R) a/ w" vBody=…  
* w8 Q2 H: L+ N2 ]3 A6 w0 {$ Y8 ?  }2 E: x  G
IF toWho  "" THEN5 q* `/ {# A9 r$ g- O" @
sendMail fromWho, toWho, Subject, Body
3 s$ @+ n# _$ [3 p2 D% tEND IF
8 o# i6 U% O6 b%  
, B4 w% G  }( @& C& A6 s4 `6 g' k
/ ?# x7 O* o/ e使用Jmail发送Email& s, f% U$ r/ }3 _& R
略,有兴趣可以和我探讨,Jmail这个软件我也有。  
: v' |' A' Y$ k
' U% ~! o. p- }# x7 g1 N9 p8 t2. 解压Zip文件(Wscript.Shell和Winzip command line;Java组件)  
  n% D  o& @1 W8 C9 M# o/ N/ q" _6 _4 h" r
⑴.安装Winzip 8.1以上9 H+ ^2 h7 ^- p/ |4 @
⑵.安装Winzip command line
+ B% a- {7 u( Y( f; P⑶.将工作目录的文件权设置为Internet用户可以读取、写入和修改7 l0 r) ^# U( G2 v( y' F
⑷.代码部分:: o: P+ ~$ x+ t* e5 k5 g; j: A/ V
unzip_a_zipfile.asp2 O) k( j6 \# b: K! b
%
( J. B+ |9 @4 I4 g7 z% S'用shell对象启动程序
0 e5 @) L$ R& `. g) J9 ?" J'zip_path是具体zip文件的路径,如c:\test.zip
& N% x, ]. I# q5 T& j& d'path是存放解压后文件的路径9 a& R( e' b$ Z$ p$ `
'ond是命令行参数6 A1 x% q, Z" Q9 O6 A" M
set wshshell = server.createobject("wscript.shell")
2 X0 A0 S* \8 [, S8 ~) Lissuccess = wshshell.run ("wzunzip -ond "zip_path" "path,1,true)  $ y0 r% D0 v. E( T$ W) l, W
) N3 U, `+ h6 D; V
'删除zip文件' K0 w: r$ {  ?. s
set myfileobject=server.createobject("scripting.filesystemobject")" W9 Y3 {& `, h& Z' A
myfileobject.deletefile zip_path  
0 G. \' C$ X* z' e8 ]$ y0 l3 f3 e
6 i; {3 i7 n: W'判断是否成功以继续操作% a" f' B& a% @* l
if issuccess = 0 then
# C; A5 B1 F* M+ |% E8 P'成功
+ b5 G: Y2 e# u8 Y1 g; g8 Q! w..." Q% s4 {% O) ~& Y" }) q. S
else
& U+ _2 ?* M$ k$ E0 Q7 K7 z'失败1 l  G! a0 o% H: i* |
...( \3 G% \9 @! R- ^, o( h4 S
end if& D3 w8 A# ~$ O4 A& A: L0 ]- d" P4 x
%  
$ m0 L( O3 `0 L, \5 m  l" J# \$ Y/ P
3. 操作XML文件  ! E; _" O4 H+ L# h

0 r) R/ R1 I4 o! a" o: ~: U# B本次交流时间有限,有时间再做详细探讨  
1 D, [. y$ C) w0 ]8 H
. m: b/ H: [9 o% i8 \4.文件上传  4 [5 n8 ]+ o! j4 V2 x5 O4 O

( F: y! u- u  A6 Z& ?⑴.安装文件上传组件Asp fileup(支持多文件上传,文件类型及大小判断,文件上传后改名等)7 p& L- j; t) i1 R0 P: d$ @" P, @
⑵.重起IIS以使上传组件生效# a% I" s4 J: R5 e# v0 r
⑶.设置上传目录的文件权为Internet用户可以读取、写入和修改
4 M) a8 X+ W* ^6 z3 o' l' }1 R4 R* Z⑷.代码部分
/ q1 M8 E3 B; T( ]0 Dupload_file.htm! ?) S9 D0 E; n2 G9 Y+ J4 J
style type="text/css"$ @9 g0 {3 I. ~# l. \1 N9 {% A* u& P
!--
3 F( c9 r+ t# k. H.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;}
; L: J6 ~% G) C3 U; B" Ma:link {color: #1B629C; text-decoration: none}# T6 w0 S8 O! i( H5 m6 x, b8 \
a:hover {color: #FF6600; text-decoration: underline}
7 f5 y. g( u0 [9 Ya:visited {text-decoration: none}
/ W( |$ o; N2 C( _1 t9 f7 s' k--) U, e4 ~+ n- D
/style  : ^8 R3 k! }7 B' B# M5 ?( U

1 z$ @; G0 ~2 `/ F4 U% u' ]: _5 `center9 g5 o6 G, c# B2 c2 {/ m
form enctype="multipart/form-data" method="post" action="upload_file.asp" name="Upload"  v8 ]: J( U! F' I  k9 d
input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com"2 {8 f7 K  [0 N' p2 w
请选择文件:input type="file" name="file1" class="input"brbr' @# q  e: T/ t  {$ y0 y  l
请选择文件:input type="file" name="file2" class="input"brbr
- H% k: x# n* M( U' h4 \( {1 C/form6 C7 n$ [4 S- O+ x: Z# a: A
brbr
! D8 v0 Z: }5 J) H4 h4 P' ^: K6 ?a href="javascript:document.Upload.submit();" 提 交 /a
  q7 U& x! R  z& |2 q: `/ j  J/ n/center  
; V  v# J: r# o; q& g2 C4 u& L+ W
8 k+ ^( w( P, I+ u4 I
9 B# w( P$ ]- Q+ s# E8 Xupload_file.asp* ^6 E6 j: S6 ~' n. ^2 K
%6 ?( n. S1 k0 K$ a/ w
on error resume next  
" F: T7 V5 K' ^2 L
4 L- V$ t% x) t'定义获得文件后缀的函数
, D7 M/ `- q5 c# p! M  jfunction getfileextname(filename)
+ t% A) o! n! D  dpos=instrrev(filename,".")1 R# |! [7 V9 g5 K+ L
if pos0 then
" X9 B* x  m8 H1 a; ]getfileextname=mid(filename,pos 1)
( S2 c( }# v* X* g+ _' T" F" `else5 |( p- n' X0 t
getfileextname=""
% |2 h  X4 z  S8 e/ w6 a1 gend if! D1 \# t% L! ?0 g4 [0 n; ^
end function  + @% N; D; J; Q) a" ^- O/ o7 Z1 U
( M8 V: x& D- c& X
'定义获取文件正名的函数
1 g) c, H6 d  [8 H4 X/ \$ n% Afunction getfilename(filename)
1 T4 Z3 e: J! v% {lens=len(filename)-len(getfileextname(filename))-1% b# f% B5 b4 Q' v
getfilename=left(filename,lens)
' z2 S- v' V; u) A! tend function  
8 I  `1 y! i3 `4 P0 b) ^5 E$ d! z8 E) E  z9 P2 b) [
'创建文件上传组件的对象
' m9 R. p7 v( iset fileup=server.createobject("chinaasp.upload")  $ w& _' `- `# B  N. U

# x0 V7 s1 H: ?* k9 `'循环读取用户上传的文件,并保存在服务器上
( t$ g) p1 |: E& s* d/ F5 d& k: afor each f in fileup.files  
( X' o- |9 ?: |) u5 z
& C4 T9 k/ p$ z" A+ ?'当用户没有选择文件或文件大小超过10m时返回到选择上传文件的页面1 Z/ K% V+ ]7 H% a$ j- I" J
if f.filename="" or f.filesize10485500 then response.redirect "upload_file.htm"  
+ @' m1 [6 }' D9 e! }' m! W" m) {# B% s9 A1 E. F1 h
'获取保存的路径- e! ]6 o7 S$ j! {0 m5 Q
path=server.mappath("upload_file.asp")
' _- J! g3 }( E5 f" opath=left(path,len(path)-15)  
# r) t" a/ V# Y- b# e% ^' ^/ v# g( v9 J; e% y1 a; u! [
'保存文件
- D1 J" [6 v; \5 k; p! n* A) ?f.saveas pathgetfilename(f.filename)"."getfileextname(f.filename)    t) t9 _( J4 M  m1 d% W- V
) V9 g( h8 ^* z
next  " w6 s% V7 H& F' l/ H/ Y" {

0 q3 m: ?1 S) Z# ]& B/ U# cresponse.redirect "upload_file.htm"
. S6 U* g8 C6 {8 p. z4 N5 y%  ( Q. T/ F9 O# V6 q- }3 W* W

! l6 r1 w6 r: c1 }+ k# \5 b) y3 S5.驱动器/目录/文件操作  
9 z( N$ R7 h2 |
8 E1 N$ @  ?4 f) E& \" y本次交流时间有限,有时间再做详细探讨  
8 @2 g9 `% |5 T8 G3 B6 o4 F$ O2 U  g$ ~; Q! N
6. Asp编写与调试经验:cookies和session如何选择、cookies数量陷阱、页面过期和缓冲设定、移植性如何保证、如何应付内部服务器500错误……  
! ?/ @" D# G! e( x5 ?1 M( t4 }5 U5 l& w0 K1 I2 M
1.Cookies和Session的选择:4 I: u8 Z* C4 @5 ~8 w
⑴.共同特点
, m0 |# K- e* S, y; n: j8 {9 w⑵.不同之处:- t3 K* F* O! v" O# r
①.工作方式
7 R; o5 l$ T/ B. e8 b8 u( Z②.过期条件
( U3 i6 v- J: x0 S  v! f% y0 @' |③.对服务器的性能影响  7 Y( u! a& y5 U: ]% x8 U
# v2 {2 _/ b6 S1 W% S
2.Cookies数量陷阱:; r; m' A9 c- T7 I9 T) c
IIS可以保存一般的cookies不超过20个,再定义新的Cookies以前的Cookies的值就丢失了,这样对大型应用显然局限性非常大,如何解决这个问题呢?$ q2 B; _0 Y. T3 Z$ K/ C
答案是使用二维Cookies。  5 w# D9 n5 j% u5 B5 b& _

) i: ]- p# X$ k+ `. N  f: B例子:  7 d5 R1 i9 I% X/ D

0 g/ J/ l7 R  B测试一维Cookies数量极限:
; C0 d0 a+ Y' X" l% ytest_cookies_1.asp
8 C  G5 W# d. E8 c; L* F%9 g- u8 P/ m# A7 {7 q' G
for i=1 to 50' ?4 N( w# h5 v5 v; I
response.cookies("cookies_"i)=i) G2 n5 a# V9 g; \' B! M6 Y
next
3 N: e- i' v  S0 Q- E$ E%  
$ B  q: l9 p9 P: Y& Z& H
  z; |6 M1 W. U( S8 @  }* z6 L' |! f5 S9 r: Y; z& F, Q
test_cookies_2.asp+ n' w0 E& g# Q7 F5 h; k$ `0 g  Y6 d
%
! i# ^) M( V5 zfor i=1 to 500 \7 ~; P% p' Z6 D  ^# J9 R
response.write request.cookies("cookies_"i)"br". U5 I, `5 Z  X
next
# d1 t2 r" g1 h* {9 c%    s/ a0 b: J! A
+ Q6 I/ A: W: I/ M: f+ o0 |% v# p4 V
效果:5 W/ J6 T6 i5 `, I/ l1 |) \! L9 q
先访问test_cookies_1.asp,再访问test_cookies_2.asp,,发现了什么?  
+ b$ z9 X' E& _0 F& x5 E: k5 F- X3 o  B) Y+ S
+ ?6 B: K1 ?% |6 x$ T/ S
test_cookies_3.asp
6 r, |. e7 H/ x0 G%
7 {  X3 v/ X1 \: S! V2 Pfor i=1 to 50# c- O  T7 F/ s0 K" C
response.cookies("cookies_"i)=i
3 t# Z, I8 E3 {0 F4 d2 _9 `; Unext  5 l" ^. ^, N6 _( ^7 p* Z& c* R

) X0 e( I; L! e  V. Yfor i=1 to 50, S! y! l1 b/ d+ Q& U
response.write request.cookies("cookies_"i)"br"' X0 @$ _, ]3 {3 l
next
$ ^3 f2 T# d6 m% p, V8 n8 C%  ; U. ]7 R, i) m2 d2 Z- Q
" c( k( S# U3 J' b! |; [
效果:( q* L" r( g& P; m
没有Cookies丢失!!!!  + P3 C! u+ v- Y3 u3 K% e, I: l

( `3 U; `! K. m$ A测试二维Cookies数量极限:: H+ y/ x$ L* F8 Y! K1 v& }. U- D( h
test_cookies_4.asp9 L, F5 ?& h2 y' \2 ]: J
%
1 j- t6 \' f* U# yfor i=1 to 301
) D$ g( B8 ~" O7 V* Y1 B% @response.cookies("tuht")("cookies_"i)=i
: r3 L8 S& \  {9 Xnext; t. q6 A! }/ d5 W8 p
%  
: v: U0 S6 [% V4 Y8 J1 Z- @
+ v" i, a/ I) e* ^
; D2 C1 w; ]% y, p* O$ w7 K0 Mtest_cookies_5.asp
& U2 b) }, \5 u) Z3 }: A( g: p%
" a: h0 Q1 N3 }) W  N! V+ d% s( Ffor i=1 to 301
' l! E! X6 L2 ?" Nresponse.write request.cookies("tuht")("cookies_"i)"br"
$ T' }, i2 w3 X+ ]next
1 a9 ~/ ]3 k# P%  
  C" M; I! x0 ]: L: j: q5 U) n0 o4 p! z: |& J: |
效果:4 h' _0 \# o; [
使用这种方式可以使用201*20=4020个Cookies!!!!  * ~+ p3 c1 P8 x' ?( R  h
$ U3 N' J" |8 G
3.页面过期和缓冲设定
8 B9 k) r5 g$ |5 d& ]5 N%
$ R  \$ ?# y! |/ K* }'过期和缓冲处理. C; u: v5 O1 L  z1 F# ~
response.buffer=true
  C" e4 e, q' _' G8 h  ?response.cachecontrol="no-chache"! l4 Z; m! t$ J8 a2 G
response.expiresabsolute=now()-10 ~" D2 j) |$ U* n2 p
response.expires=03 F, T6 r* d3 `: |4 a
%" o0 N! x  P3 u+ b# j
html中还可以做设定:- L# z1 _5 ]( u8 L9 }: G/ S
meta content="no-cache" http-equiv="Pragma"
8 Y- j9 V0 C) }' lmeta HTTP-EQUIV="Expires" CONTENT="0"  
; y/ }3 T% m( Q2 D- T6 j# |0 x, ^3 f- t* E  x3 i
4.移植性的保证% N7 z/ J0 T/ N# ]
⑴.包含文件
2 t2 X+ W- ^3 D!--#include file="top.asp" --
8 E& F2 t. F) _1 h⑵.使用server.mappath寻找文件路径,避免在页面中直接使用绝对路径4 n' y$ B- \7 s  t5 r  }+ X8 [
⑶.尽量使用组件封装业务逻辑  2 i1 i+ D/ B& K, K) d1 F
2 [: N  O% r2 `4 f" C5 f1 U5 W' ]
5.调试内部服务器500的错误
6 d* E- Q" [  F) r; j4 K⑴.设置IIS显示具体的错误信息) [& x1 ]6 L. l" \
⑵.分步调试,由上而下
5 z1 W) h4 D0 y/ i( [4 S8 ]9 n5 v7 P⑶.打印某些重要的变量的值,检查是否为我们预期9 S( ]6 Y2 Z: u6 x4 e
⑷.根据经验来判断错误  
0 j) a# m. v9 \8 S  I5 |  V2 F. o  N" D- ?% f" u
7. 操作Word文档  9 A) a4 N! W4 A0 O3 k3 x7 ?$ `

# S; n7 a6 T0 {⑴.安装Office 2000,其中Word 2000必选
/ |' _6 h/ h2 K2 z, {- E⑵.设置IE中Internet的安全性:ActiveX控件和插件全部启用8 e; C' A% T; ?. r
⑶.设置工作目录的文件权为Internet及System读取/修改/写入4 M' W4 [1 ?/ R( W7 r/ `6 j
⑷.编写模版course.dot
$ i! _- H; O9 I  V' }) T⑸.具体代码:
: q5 p9 P0 R$ n$ K1 Gopr_doc_inc.asp! Y0 u! g; A( ^% F
%
" E  G1 x: T1 M" ^9 LResponse.write "Dim Var_Num"  chr(13)6 w. V3 }" L- ~0 H) {! {; x
Response.write " Var_Num = 2 "  chr(13)0 Y. _/ @! s+ n; F
Response.write "Dim varstrings(2)"  chr(13)
4 G- q5 j8 T% G( a* ~( `' sResponse.write "varstrings(0)="  chr(34)  "起草人:"  chr(34)  chr(13)! y3 v5 h2 z, D
Response.write "varstrings(1)="  chr(34)  "日期:"  chr(34)  chr(13)# U/ h8 X% ]4 |( x2 ~5 X
Response.write "Dim varValues(2)"  chr(13), |- O  f+ j9 u" s3 K
Response.write "varValues(0)="  chr(34) "起草人:涂海涛" chr(34)  chr(13)8 O/ @* x9 i% M$ J4 c$ w
Response.write "varValues(1)="  chr(34)  "日期:"date() chr(34)  chr(13)
/ J9 [( s  ?4 \, b6 |%  5 X1 ^, K+ F) [
. w+ A+ S' z% _, }! ~$ q
Sub instead(word): `& F( j+ t4 J% w; i
Set myRange = word.ActiveDocument.Content
' ^9 [* z! O" `1 `, E; U% C- Nfor i=0 to Var_Num - 1 4 p( }; ^' E" }8 f0 H
call myRange.Find.Execute(varStrings(i),false,false,false,false,false,false,false,false,varValues(i),2); z  v; a  N2 s1 ^6 p' r# E( E7 {
Next  |( ?! e9 @; X) @9 U) d" z- |, g  g
End Sub  
7 E, A+ K/ R8 ]$ F& K$ d: ^' {  D1 n4 S: Z" t# q
2 S! N; u; L1 m
opr_doc.asp; z& ?. I+ P- o4 @
%
- E; M) S3 I4 [3 e- l3 e'获取保存的路径$ z% p- A2 d" a8 e
path=server.mappath("opr_doc.asp")
9 z0 Y  w; l0 A' v9 H' _/ opath=left(path,len(path)-11)& B7 b8 S8 Z) V  n
filenames=path"test.doc"  
! J3 [1 N. u+ H, |) k6 H8 K9 b6 }4 D5 M
w1="word.activedocument.saveAs"chr(32)chr(34)filenameschr(34)
7 L0 U, L* p# M" p! A0 ww2="wApp.Documents.open"chr(32)chr(34)filenameschr(34)
  H' {7 ?: |/ N! h0 }2 z, G$ c5 B+ V%
9 L6 @/ k# e$ Escript language="vbscript"* R* y, A: v: D0 u- F
On Error Resume Next
. R+ v7 p1 ]' F, P'生成指定文件名的Word文档; T( F9 h, J7 j# z4 g8 i
Dim word/ N4 h0 R5 T1 C+ i; G7 x% a
set word = CreateObject("Word.Application")
9 p7 G/ P) H% X; H& D, X" Iif Err.number  0 Then
9 @# D0 ?0 K; [) H* s- |4 eAlert "发生错误,请确认文件是否存在"2 c0 |% e8 p: {5 m8 m+ ?& }7 P
else% t! d* L0 y2 W3 @$ s% c8 c- a, c
word.visible = False
4 S- ^) w0 K1 q3 X$ `) Qword.documents.open "%response.write path%course.dot"
+ n/ \, d: P8 J4 r9 H2 w%Response.write w1%
: M8 D4 L; G  H' @word.documents.close) z5 Y7 }4 e: S  j$ l/ I
set word=nothing9 Y: ]6 o" a" f3 y8 C* |# M
end if  5 i: R' i! z: ~  I
4 |- O% G' W  p2 k% k+ r% a
!--#include file="opr_doc_inc.asp"--  
  }* l$ O! d0 m8 O8 l. x/ v4 N& X3 ~5 c: }( |! `( ~
Dim wApp7 T0 V1 [* I' i* P: j
Set wApp = CreateObject("Word.Application"); D! R" T: C+ z# D& E5 \
If Err.number  0 Then$ j# V1 e7 k: f' l4 r' X% X8 y0 N$ C
Alert "发生错误,请确认文件是否正确创建"
$ Z, q5 U( z3 welse1 Z! M6 C* d$ g6 g, B5 m, [
wApp.visible = True
9 u$ p' N& R* L7 r) b" D, d9 Q; u* D2 d%Response.write w2%" @# ]7 E; x% P; b% @& P
call instead(wApp)
8 Q% y& [8 [8 u' r2 i4 dset wApp=nothing
1 ?) v# b+ O( }end if6 `1 s2 ~3 H5 h( S5 J
/script    y: E7 D4 g1 e" D1 e
5 k8 p6 j3 e0 U5 x; O5 L2 `# G
效果:看看生成了doc文件吗?这个新建的doc文件和模版文件有什么区别?起草人和日期发生了变化了吗?保存一下,看看新生成的doc文件的内容。  3 Z# j9 F6 B. o% F" H! ]2 J
/ h" t2 T& p$ F6 v' u1 q

* f1 z1 b* t7 T附:
3 F  K: s% J' {) S& R' M2 m, \1.以上全部代码在Windows 2000 Server SP2 IIS 5.0 MS SQL Server 2000 Office 2000下测试通过
. r/ ?6 G" ?6 f' Y9 d6 ?2.配置数据库:数据库名course,用户course_user,密码course_password,ODBC驱动为course_dsn,端口为2433,描述表结构的脚本在共享目录下。
8 U* N- Y) t7 Q, j3.Asp fileup、Jmail、Winzip 8.1、Winzip command line这几个软件请自行下载。- Y" V- H( X1 V1 c
4.数据库脚本文件:; v8 O: o' f7 g% `5 c( ]( q
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[output_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)& x* D' O: C& Z! S& j1 z
drop procedure [dbo].[output_1]
# N$ c2 U6 b3 W: oGO  $ N3 }$ X. l& j  C- k4 x
3 N9 s% w' w4 S9 R, Q. n' z0 P
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[return_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)6 Y4 p4 |! n5 I+ [8 O5 R
drop procedure [dbo].[return_1]
- a" w. A* Q; \3 ~* R: r5 LGO  
/ Y; Z* W9 x  a* g4 R
8 q6 Y- y! c; P: t  W& sif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)  d" ]1 P/ Y4 b7 J! @9 Q0 N
drop procedure [dbo].[user_info_1]
  Q0 d. O: w9 ]* }. ]GO  # E2 N0 R" F! n- C6 i6 L& h  {8 g
7 x& y2 L/ d' Z1 G3 K) v$ B
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
0 A3 r; }3 V2 Vdrop procedure [dbo].[user_info_2]+ [' I0 j; M; v: L* D3 H
GO  0 R/ y8 C! r1 n. ]% {% `7 G5 V

; `4 o' R5 G2 O# ]+ J1 y% X) U' D0 wif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info_3]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
! I5 p8 k( v2 x3 }' e6 e  C, @8 \3 ndrop procedure [dbo].[user_info_3]
' `$ n) n2 w2 V: RGO  
9 l4 [% n! ^5 W( d- y* i* X2 {0 r2 e$ `  L* M# }
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[user_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
& A, w% X( y7 n' G, D5 Rdrop table [dbo].[user_info]
; C, H) p1 d3 x8 jGO  
/ K* E, H- `9 m0 G% {6 W" P' h' J% O8 ?3 P: V# b
CREATE TABLE [dbo].[user_info] (3 L) I- o( H3 x: j( v( V
[id] [int] IDENTITY (1, 1) NOT NULL ,1 r' @2 w9 S. K. d7 K5 _, L3 i; P3 y
[user_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
& a, J! V6 U; A[password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL 9 e) N1 V3 R, Q- B
) ON [PRIMARY]3 f/ r: x7 o! D& v/ h3 Z* c, J
GO  : g; j2 _0 }5 T: v: i

9 s6 q+ C& O. ^  [ALTER TABLE [dbo].[user_info] WITH NOCHECK ADD . W% k6 r: I! i: p
CONSTRAINT [PK_user_info] PRIMARY KEY CLUSTERED
+ [5 i0 c- D# k(. Q4 s6 u7 A/ z" C/ O( B
[user_name]. }! g0 i# R% l3 t4 h
) ON [PRIMARY] & Q' y, E' y, E$ P
GO  
3 t8 F+ @' g4 p0 J9 s2 i! p( {+ o. Y! d, n3 z" ?/ O& b( a) P
SET QUOTED_IDENTIFIER OFF 9 v$ D5 f/ v: T0 C0 p0 H0 ^0 p8 F
GO
7 p8 v4 H* h" n+ Y' ?5 K( Q4 I3 KSET ANSI_NULLS OFF
1 c* f0 |/ e3 KGO  % O. S2 p$ X. S4 B2 p* O
. k" H! h* z& B3 b$ {  N6 ~  H
CREATE PROCEDURE [output_1]: F" u: J2 d/ |0 F* b  K
@sid int output$ F0 r% |/ o: X7 f: u- M9 _9 x  }
AS
) T* b+ S" r7 pset @sid=2
. `1 O% w5 S. J4 N. B0 R- ]; S' w2 a, GGO
5 O$ E) U, p# H2 K; SSET QUOTED_IDENTIFIER OFF
9 k+ s, ~( R( N4 xGO$ d* b" G6 G* Q) v' \" o
SET ANSI_NULLS ON
8 q7 }* G( B7 w* o* f3 I. BGO  
! _6 T' x2 [- e& `3 t
0 u6 m, U5 j% I, s: ]SET QUOTED_IDENTIFIER OFF 4 m$ k' b' _  y4 X
GO
* e, k% `; r: ^1 aSET ANSI_NULLS OFF
2 s  g7 K7 K6 Z' P' RGO  
' n  {# V3 s& S% x
' z( z- j% A& ^- Q1 c8 ]* JCREATE PROCEDURE [return_1]
. h1 r( J2 i2 ]+ k( g1 U4 m, P(@user_name varchar(40),@password varchar(20))- W$ ~7 P1 p9 W4 ~" D( }
AS
1 z- n2 A4 P$ _$ K$ P/ dif exists(select id from user_info where user_name=@user_name and password=@password)
  x' ~* [- [7 [8 M5 r' p% \return 1) m7 g  o% M. q
else$ f3 q4 J& F1 u' z
return 0
& `$ ^3 _  d6 o! RGO$ m8 Z8 e! n. I: F# S) W! x
SET QUOTED_IDENTIFIER OFF 0 C+ n: f: h( W1 M  D* f6 Z! |4 _& Q
GO1 {* n% s) x! C$ f! I: O% b. ]
SET ANSI_NULLS ON $ m$ B2 W3 I3 ^$ S
GO  
7 S* N) l) m5 @. [9 x1 Z+ k
/ X% @/ E- p, k" U8 USET QUOTED_IDENTIFIER ON
' n; F: v* i& d  _' M! }: MGO9 m; F' q  i' P6 C0 q( f
SET ANSI_NULLS OFF
& I; ]% ]* N2 J$ }: h+ N4 r6 V/ lGO  
! I  H3 A/ }% s& t! b+ \) I/ D2 t# V+ N3 |* B- \
CREATE PROCEDURE [user_info_1]- m4 w+ z1 }7 y+ b2 P6 m& H0 U1 D
(@user_name varchar(40),@password varchar(20))
" [6 P, B5 P8 R1 fAS* h) r1 D2 b( v5 a0 i1 P
select id from user_info where user_name=@user_name and password=@password
6 C- s- z# T% V* EGO
$ h/ R4 E5 A! J3 p: R4 HSET QUOTED_IDENTIFIER OFF ) T6 d; X1 ^% ?* E
GO% J% F4 V9 x- [4 |% Z% D0 M1 j
SET ANSI_NULLS ON . I8 g" M4 h2 `$ H9 i' V
GO  
, n( L' U- z5 }6 ~" Q2 K) j! ?3 c9 J. q
) Y6 @$ O% x/ i6 VSET QUOTED_IDENTIFIER OFF : A8 K2 S: U) S0 K2 J* Y
GO
6 N9 Q5 M- v& {$ I/ q5 zSET ANSI_NULLS OFF
: @- B& U9 J7 M! F2 WGO  : Z6 z. y% f$ t* r! j" c- o) G

. t/ @9 ^2 C% a- \% j/ gCREATE PROCEDURE [user_info_2]
: @- h  _' a2 R- A9 j* A(@user_name varchar(40),@password varchar(20))3 X4 E2 s$ u1 q3 s  |6 o
AS
# \# @$ N7 h2 B. {SET XACT_ABORT ON
+ E/ |. [8 l" Y. R" h5 {2 z2 ]BEGIN TRANSACTION6 w) }8 [' l3 j
delete from user_info where user_name=@user_name and password=@password6 ]5 K6 ?5 n2 [" T6 O2 Q
COMMIT TRANSACTION8 _- w/ u- }' c; p
SET XACT_ABORT OFF3 U$ c. u2 a& e- M% @! z# t
GO
" n& P- n$ V- W  C2 c: _SET QUOTED_IDENTIFIER OFF
: M2 ]4 V2 M: P4 d. J4 ZGO( L3 p  N: }; i1 q
SET ANSI_NULLS ON 9 m1 O$ o8 k% ~( A$ h7 T5 |% W
GO  
" C# W. A# h/ \# V$ F# ~& x* T5 y: _7 Q
SET QUOTED_IDENTIFIER OFF
0 M) e6 M3 Y( j$ Y! V. nGO
( J5 f$ @1 G: ]6 QSET ANSI_NULLS OFF
) A; k/ n2 P& uGO  
' _, I! T/ n6 I) p: ^$ U
% V0 H* p! Y. p" A! H3 MCREATE PROCEDURE [user_info_3] AS
; b  X8 \# O5 ~, p- Y/ e. u7 Eselect * from user_info
, L. W3 _7 e0 I$ I  i+ tGO5 a8 Z$ W: B4 p7 r' i1 Z5 @/ \: ?
SET QUOTED_IDENTIFIER OFF
2 J8 X) ^3 U9 ^/ |8 e7 G0 sGO
" E, o3 W* i$ ?SET ANSI_NULLS ON 5 N: y  x9 Z: r( T+ k
GO



点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹

TOP

发新话题