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


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

一、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的功能。
from www.knowsky.com

例子:

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"%>

效果:
1.當關閉IIS的緩衝功能,訪問該網頁時出錯
a
答覆對像 錯誤 'ASP 0156 : 80004005'
頭錯
/course/response_buffer.asp,行3
HTTP 頭已經寫入到 客戶瀏覽器。任何 HTTP 頭的修改必須在寫入頁內容之前。
2.當關閉IIS的緩衝功能,去掉文件第一行的註釋,則網頁重定向成功
3.當打開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。

1.用ODBC方式連接SQL Server:
1.配置ODBC
2.連接程式碼:
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對這個資料庫有操作權限)。

    2.用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操作資料庫。

例子:

1.聯合使用connection和recordset操作資料庫

use_db_1.asp
<%
Set conn=Server.CreateObject("ADODB.Connection")  &nbs p; '創建連接資料庫的對象
conn.Open "course_dsn","course_user","course_password"  &nbs p; '使用該對像連接資料庫
Set rs=Server.CreateObject("ADODB.RecordSet")   & nbsp;        '創建記錄集對 像
rs.Open "select * from user_info",conn,1,1        ;         '使用記錄 集對像打開資料庫
if rs.recordcount>0 then         &n bsp;         &n bsp;         &n bsp;  '如果有記錄
response.write "User_id  User_name<br>"
for i=1 to rs.recordcount       &nbs p;         &nbs p;         &nbs p;    '循環讀取所有紀錄
response.write rs("id")&"       &nbs p;"&rs("user_name")&"<br>"
'向瀏覽器輸出紀錄的字段
rs.movenext        & nbsp;         & nbsp;         & nbsp;         & nbsp;         ' 指針下移一行
if rs.eof then exit for         &nb sp;         &nb sp;         &nb sp;  '如果到達記錄集底部則退出循環
next
end if
%>

效果:
User_id  User_name
1        ahyi
3        test


2.只使用connection操作資料庫:

use_db_2.asp
<%
Set conn=Server.CreateObject("ADODB.Connection")  &nbs p; '創建連接資料庫的對象
conn.Open "course_dsn","course_user","course_password"  &nbs p; '使用該對像連接資料庫
conn.execute "delete from user_info"
%>

效果:
user_info表中所有資料被刪除

思考:兩種方式有和區別?各應用於什麼場合?

3.如何使用事務處理、儲存過程和視圖?

1.使用儲存過程

    1.定義好儲存過程

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

    2.在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")&"','"&reques t.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,adparamreturnv alue)
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對象。

2.使用事務處理

1.Asp內嵌的事務支持

例子:
use_transaction_1.asp
<%
'Asp中使用事務
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "course_dsn","course_user","course_password"
conn.begintrans       &nb sp;'開始事務

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       &n bsp;        '提交事務
set rs=nothing
conn.close
set conn=nothing
response.write "交易成功!"
response.end
end if
%>

2.資料庫級的事務

    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")&"','"&reques t.querystring("password")&"'"

set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
set rs=nothing
conn.close
set conn=nothing
%>
    
討論:兩種方式的優劣?

3.使用視圖
    在資料庫中定義好視圖之後,在Asp中如同使用一個表一樣來使用視圖

4.一個資料庫分頁的例子

db_page.asp
<%
on error resume next
Set conn=Server.CreateObject("ADODB.Connection")  &nbs p; '創建連接資料庫的對象
conn.Open "course_dsn","course_user","course_password"  &nbs p; '使用該對像連接資料庫
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  &nbs p;     '目前頁為page參數指定的頁
    for i=1 to rs.pagesize        ' 根據pagesize參數的大小循環顯示目前頁中的紀錄
        response.wri te "User_id:"&rs("id")&"<br>"
        response.wri te "User_name:"&rs("user_name")&"<br><br>"
        rs.movenext& nbsp;         & nbsp;     '紀錄指針下移
        if rs.eof then exit for    '如果到達紀錄集底部則退出循環
    next
end if

'顯示翻頁按鈕
if page>1 then
    response.write "<a href="&request.servervariables("document_name")&"?pa ge=1>第一頁</a> "
    response.write "<a href="&request.servervariables("document_name")&"?pa ge="&(page-1)&">上一頁</a> "
end if
if page<>rs.pagecount then
    response.write "<a href="&request.servervariables("document_name")&"?pa ge="&(page+1)&">下一頁</a> "
    response.write "<a href="&request.servervariables("document_name")&"?pa ge="&rs.pagecount&">最後一頁</a> "
end if
response.write"頁碼:"&page&"/"&rs.pagecount

'關閉對象,釋放內存
rs.close
set rs=nothing
conn.close
set conn=nothing
%>

思考:分頁過程中使用了哪些額外的屬性
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.2031 seconds.

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