直播中
1. 組件的特點(diǎn)?
l 優(yōu)點(diǎn):
n 調(diào)用方便,節(jié)省代碼
n 安全性高
n 支持事務(wù)處理,多組件聯(lián)合
n 運(yùn)行速度快
n 升級(jí)、修改組件不需修改頁面,因此擴(kuò)展性好
l 缺點(diǎn):
n 開發(fā)及調(diào)試?yán)щy
2. 如何使用VB開發(fā)?
⑴.打開VB>>New Project>>ActiveX DLL
⑵.修改項(xiàng)目名稱為course
⑶.修改類模塊的名字為conn_db
⑷.Project>> References,引用COM+ Service Type Library和Microsoft Active Server Pages Object Library。
⑸.修改類代碼如下:
'建立數(shù)據(jù)庫連接并輸出數(shù)據(jù)庫字段
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是值得推薦的,因?yàn)樗哂邢铝袃?yōu)點(diǎn):
n 動(dòng)態(tài)卸載平衡,提高組件和基于組件的應(yīng)用程序的升級(jí)性。
n 包含公布和提交事件和隊(duì)列組件的能力,使得更容易與多個(gè)組件聯(lián)合。
要想使組件具有MTS的特性,必須對組件做少許改動(dòng)。在NT和98下開發(fā)時(shí),必須在項(xiàng)目中引用Microsoft Transaction Server Type Library,在Windows 2000下開發(fā),必須引用COM+ Service Type Library。
⑴.regsvr32注冊:
regsvr32.exe是system32下面的一個(gè)可執(zhí)行文件,它將組件信息讀入注冊表,以便Asp調(diào)用。
使用命令行進(jìn)入組件dll文件所在的目錄,執(zhí)行“regsvr32 dll_file_name”即可。
運(yùn)行regedit,在HKEY_CLASSES_ROOT下就會(huì)找到course.conn_db項(xiàng)和course.cutstr項(xiàng),表明組件注冊成功。
⑵.使用MTS注冊:
①.開始>>程序>>管理工具>>組件服務(wù)
②.展開目錄至如下狀態(tài):
③.按照向?qū)?,下一步,直到如下對話框,點(diǎn)擊“創(chuàng)建一個(gè)空的應(yīng)用程序”:
④.在接下來的對話框中,為應(yīng)用程序起名為“course”,其他默認(rèn),直至完成
⑤.展開course應(yīng)用程序,右鍵,新建一個(gè)組件
⑥.按照提示,繼續(xù),出現(xiàn)如下對話框時(shí),選擇“導(dǎo)入已被注冊的組件”
⑦.選擇我們開發(fā)的組件,下一步,直至完成
⑧.這時(shí)候,可以發(fā)現(xiàn)course應(yīng)用程序下已經(jīng)多了兩個(gè)組件:
4. 在Asp中調(diào)用組件
asp_use_com.asp
<%
'asp調(diào)用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
說明調(diào)用成功。
5. 卸載組件
⑴.使用regsvr32注冊的組件,使用-u開關(guān)卸載:
注意:先進(jìn)入組件dll所在的目錄,然后使用“regsvr32 –u dll_file_name”卸載;卸載后重啟IIS即可。
⑵.使用MTS注冊的組件,先在“組件服務(wù)”中刪除對應(yīng)的應(yīng)用程序,然后再執(zhí)行步驟 ⑴ 以徹底卸載組件。
6. Dll組件存放位置和權(quán)限設(shè)定
⑴.我們只需要把編譯生成的Dll文件拷貝出來即可,其他的文件不用做處理
⑵.要把Dll放到Web站點(diǎn)之外,如system32目錄里,防止被下載
⑶.Dll的文件權(quán)設(shè)置為System讀取,Internet用戶遍歷文件夾/運(yùn)行文件
⑷.Dll在IIS中去掉所有的權(quán)限,如讀取,腳本自愿訪問等
經(jīng)過上述處理,可以確保Dll文件的安全。
7. 其他
如何在組件中使用Asp的對象以方便的將Asp代碼移植為COM組件?
五、IIS最優(yōu)化配置
1.Web站點(diǎn)選項(xiàng)卡:IP、端口、虛擬主機(jī)、連接、日志
2.ISAPI篩選器:加入PHP和JSP支持
3.主目錄配置選項(xiàng)卡:I IS權(quán)限設(shè)定(結(jié)合文件權(quán))、執(zhí)行許可、應(yīng)用程序保護(hù)、映射、緩沖、父路徑、出錯(cuò)信息
4.其他選項(xiàng)卡:自定義錯(cuò)誤、Http頭、目錄安全性、文檔
5.文件壓縮帶來的好處和壞處
六、其他
1. 發(fā)送郵件(JMail;Ms smtp)
使用Microsoft Smtp發(fā)送電子郵件
⑴.安裝Microsoft SMTP Service
⑵.設(shè)置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個(gè)與下列各條對應(yīng)的參數(shù)。
l 郵件發(fā)送者的email地址
l 郵件接收者的email地址
l 郵件主題
l 郵件內(nèi)容
使用方法:
<%
fromWho=…
toWho=…
Subject=…
Body=…
IF toWho <> "" THEN
sendMail fromWho, toWho, Subject, Body
END IF
%>
使用Jmail發(fā)送Email
略,有興趣可以和我探討,Jmail這個(gè)軟件我也有。
2. 解壓Zip文件(Wscript.Shell和Winzip command line;Java組件)
⑴.安裝Winzip 8.1以上
⑵.安裝Winzip command line
⑶.將工作目錄的文件權(quán)設(shè)置為Internet用戶可以讀取、寫入和修改
⑷.代碼部分:
unzip_a_zipfile.asp
<%
'用shell對象啟動(dòng)程序
'zip_path是具體zip文件的路徑,如c:\test.zip
'path是存放解壓后文件的路徑
'ond是命令行參數(shù)
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
'判斷是否成功以繼續(xù)操作
if issuccess = 0 then
'成功
...
else
'失敗
...
end if
%>
3. 操作XML文件
本次交流時(shí)間有限,有時(shí)間再做詳細(xì)探討
4.文件上傳
⑴.安裝文件上傳組件Asp fileup(支持多文件上傳,文件類型及大小判斷,文件上傳后改名等)
⑵.重起IIS以使上傳組件生效
⑶.設(shè)置上傳目錄的文件權(quán)為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
'定義獲得文件后綴的函數(shù)
function getfileextname(filename)
pos=instrrev(filename,".")
if pos>0 then
getfileextname=mid(filename,pos+1)
else
getfileextname=""
end if
end function
'定義獲取文件正名的函數(shù)
function getfilename(filename)
lens=len(filename)-len(getfileextname(filename))-1
getfilename=left(filename,lens)
end function
'創(chuàng)建文件上傳組件的對象
set fileup=server.createobject("chinaasp.upload")
'循環(huán)讀取用戶上傳的文件,并保存在服務(wù)器上
for each f in fileup.files
'當(dāng)用戶沒有選擇文件或文件大小超過10m時(shí)返回到選擇上傳文件的頁面
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.驅(qū)動(dòng)器/目錄/文件操作
本次交流時(shí)間有限,有時(shí)間再做詳細(xì)探討
6. Asp編寫與調(diào)試經(jīng)驗(yàn):cookies和session如何選擇、cookies數(shù)量陷阱、頁面過期和緩沖設(shè)定、移植性如何保證、如何應(yīng)付內(nèi)部服務(wù)器500錯(cuò)誤……
1.Cookies和Session的選擇:
⑴.共同特點(diǎn)
⑵.不同之處:
①.工作方式
②.過期條件
③.對服務(wù)器的性能影響
2.Cookies數(shù)量陷阱:
IIS可以保存一般的cookies不超過20個(gè),再定義新的Cookies以前的Cookies的值就丟失了,這樣對大型應(yīng)用顯然局限性非常大,如何解決這個(gè)問題呢?
答案是使用二維Cookies。
例子:
測試一維Cookies數(shù)量極限:
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,,發(fā)現(xiàn)了什么?
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丟失?。。。?/P>
測試二維Cookies數(shù)量極限:
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個(gè)Cookies?。。?!
3.頁面過期和緩沖設(shè)定
<%
'過期和緩沖處理
response.buffer=true
response.cachecontrol="no-chache"
response.expiresabsolute=now()-1
response.expires=0
%>
html中還可以做設(shè)定:
<meta content="no-cache" http-equiv="Pragma">
<meta HTTP-EQUIV="Expires" CONTENT="0">
4.移植性的保證
⑴.包含文件
<!--#include file="top.asp" -->
⑵.使用server.mappath尋找文件路徑,避免在頁面中直接使用絕對路徑
⑶.盡量使用組件封裝業(yè)務(wù)邏輯
5.調(diào)試內(nèi)部服務(wù)器500的錯(cuò)誤
⑴.設(shè)置IIS顯示具體的錯(cuò)誤信息
⑵.分步調(diào)試,由上而下
⑶.打印某些重要的變量的值,檢查是否為我們預(yù)期
⑷.根據(jù)經(jīng)驗(yàn)來判斷錯(cuò)誤
7. 操作Word文檔
⑴.安裝Office 2000,其中Word 2000必選
⑵.設(shè)置IE中Internet的安全性:ActiveX控件和插件全部啟用
⑶.設(shè)置工作目錄的文件權(quán)為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 "發(fā)生錯(cuò)誤,請確認(rèn)文件是否存在"
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 "發(fā)生錯(cuò)誤,請確認(rèn)文件是否正確創(chuàng)建"
else
wApp.visible = True
<%Response.write w2%>
call instead(wApp)
set wApp=nothing
end if
</script>
效果:看看生成了doc文件嗎?這個(gè)新建的doc文件和模版文件有什么區(qū)別?起草人和日期發(fā)生了變化了嗎?保存一下,看看新生成的doc文件的內(nèi)容。
附:
1.以上全部代碼在Windows 2000 Server SP2+IIS 5.0+MS SQL Server 2000+Office 2000下測試通過
2.配置數(shù)據(jù)庫:數(shù)據(jù)庫名course,用戶course_user,密碼course_password,ODBC驅(qū)動(dòng)為course_dsn,端口為2433,描述表結(jié)構(gòu)的腳本在共享目錄下。
3.Asp fileup、Jmail、Winzip 8.1、Winzip command line這幾個(gè)軟件請自行下載。
4.數(shù)據(jù)庫腳本文件:
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