標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: Asp深度揭密(下) 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
bababa
Groupie
Groupie


加入: 2004/5月/29
Online Status: Offline
回復: 46
Posted: 2004/5月/29 3:46下午 | IP記錄 引用 bababa

四、Asp元件的開發與使用:

1.    元件的特點?

l    優點:
n    調用方便,節省程式碼
n    安全性高
n    支持事務處理,多元件聯合
n    執行速度快
n    升級、修改元件不需修改網頁,因此擴展性好
l    缺點:
n    開發及調試困難

2.    如何使用VB開發?

1.打開VB>>New Project>>ActiveX DLL

2.修改項目名稱為course



3.修改類模塊的名字為conn_db


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

5.修改類程式碼如下:

from www.knowsky.com

'建立資料庫連接並輸出資料庫字段
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

6.增加一新類cutstr

7.修改類程式碼如下:

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

8.File>>Save

9.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。

1.regsvr32註冊:

regsvr32.exe是system32下面的一個可執行文件,它將元件訊息讀入註冊表,以便Asp調用。
使用命令行進入元件dll文件所在的目錄,執行「regsvr32 dll_file_name」即可。


執行regedit,在HKEY_CLASSES_ROOT下就會找到course.conn_db項和course.cuts tr項,表明元件註冊成功。


2.使用MTS註冊:

1.開始>>程式>>管理工具>>元件服務

2.展開目錄至如下狀態:



3.按照嚮導,下一步,直到如下對話框,點擊「創建一個空的應用程式」:



4.在接下來的對話框中,為應用程式起名為「course」,其他默認,直至完成

5.展開course應用程式,右鍵,新建一個元件



6.按照提示,繼續,出現如下對話框時,選擇「導入已被註冊的元件」



7.選擇我們開發的元件,下一步,直至完成



8.這時候,可以發現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.    卸載元件

1.使用regsvr32註冊的元件,使用-u開關卸載:



注意:先進入元件dll所在的目錄,然後使用「regsvr32 –u dll_file_name」卸載;卸載後重啟IIS即可。

2.使用MTS註冊的元件,先在「元件服務」中刪除對應的應用程式,然後再執行步驟 1 以徹底卸載元件。



6.    Dll元件存放位置和權限設定

1.我們只需要把編譯生成的Dll文件拷貝出來即可,其他的文件不用做處理
2.要把Dll放到Web網站之外,如system32目錄裡,防止被下載
3.Dll的文件權設置為System讀取,Internet使用者遍歷文件夾/執行文件
4.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發送電子郵件
1.安裝Microsoft SMTP Service
2.設置Microsoft SMTP Service
3.程式碼部分:
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元件)

1.安裝Winzip 8.1以上
2.安裝Winzip command line
3.將工作目錄的文件權設置為Internet使用者可以讀取、寫入和修改
4.程式碼部分:
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.文件上傳

1.安裝文件上傳元件Asp fileup(支持多文件上傳,文件類型及大小判斷,文件上傳後改名等)
2.重起IIS以使上傳元件生效
3.設置上傳目錄的文件權為Internet使用者可以讀取、寫入和修改
4.程式碼部分
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如何選擇、coo kies數量陷阱、網頁過期和緩衝設定、移植性如何保證、如何應付內部服務器500錯誤……

1.Cookies和Session的選擇:
1.共同特點
2.不同之處:
1.工作方式
2.過期條件
3.對服務器的性能影響

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.移植性的保證
        1.包含文件
        <!--#incl ude file="top.asp" -->
        2.使用server.m appath尋找文件路徑,避免在網頁中直接使用絕對路徑
        3.盡量使用元件封裝業務 邏輯

    5.調試內部服務器500的錯誤
        1.設置IIS顯示具體的 錯誤訊息
2.分步調試,由上而下
    3.列印某些重要的變量的值,檢查是否為我們預期
4.根據經驗來判斷錯誤

7.    操作Word文檔

1.安裝Office 2000,其中Word 2000必選
2.設置IE中Internet的安全性:ActiveX控件和外掛全部啟用
3.設置工作目錄的文件權為Internet及System讀取/修改/寫入
4.編寫模版course.dot
5.具體程式碼:
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,f alse,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)&filenam es&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驅動為c ourse_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
Back to Top 查看 bababa's 資料 搜索其他貼子 bababa 訪問 bababa's
 

如果你想回復的話你必須首先 login
如果你還沒有注冊的話你必須首先 注冊

  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.1914 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
美材批發
美材, Cosmetic
www.elady.tw/beauty_org
保養品批發
名牌保養品、保養品批發
gb.perfume.com.tw/skincare
飾品批發
飾品、飾品批發
gb.perfume.com.tw/ornament