ASP.NET 網頁製作教本 -- 從基本語法學起 第11章 網頁間的

Download Report

Transcript ASP.NET 網頁製作教本 -- 從基本語法學起 第11章 網頁間的

ASP.NET 網頁製作教本 –
從基本語法學起
第11章 網頁間的資料共用
11-1 網頁間共用資料的基本觀念
同一網頁的資料共用
Somepage.aspx
Somepage.aspx
Page_Load
Page_Load
Button_Click
Button_Click
Somepage.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<Form runat="server">
<asp:TextBox runat="server" id="sData" Visible=False /><P>
<asp:Button runat="server" Text="PostBack"
OnClick="Button_Click"/>
</Form>
</BODY>
</HTML>
Somepage.aspx Part II
<script Language="VB" runat="server">
Dim gData As Integer
Sub Page_Load(sender As Object, e As EventArgs)
gData = gData + 100
sData.Text = Val(sData.Text) + 100
Response.Write( "gData=" & gData & "<br>")
Response.Write( "sData=" & Val(sData.Text) )
End Sub
Sub Button_Click(sender As Object, e As EventArgs)
End Sub
</script>
瀏覽此一網頁
情況
網頁第一次被載入
第一次按下PostBack鈕
第二次按下PostBack鈕
第三次按下PostBack鈕
…
gData的值 sData的值
100
100
100
200
100
300
100
400
Somepage.aspx 的啟示
 一般變數無法做為共用資料,而
Server 控制元件則可以成為同一網
頁在不同狀態下(第一次載入網頁、
按鈕被按下時、事件發生時…等狀
態)的共用資料。
可以成為共用資料的標的物
資料共用之標的物
共用範圍
Server控制元件
Application、Session、Cookie物件、
檔案、資料庫
限同一網頁
涵蓋同一網頁及不同網頁
共用資料的模式
模式
普遍的資料共用方案
同一網頁
同一瀏覽視窗、不同網頁
同一部機器、不同瀏覽視窗
不同機器
Server控制元件
資料傳遞、Session物件、Cookie物件
Cookie物件
Application物件、檔案、資料庫
11-2 Application 物件
Application 物件
Application
物件
伺服端(Server)
客戶端(Client)
客戶端(Client)
利用 Application 物件存放資料的語法

在存取資料的語法上,首先為資料取個
名稱,然後使用以下語法即可存取
Application 物件中的資料:
' 讀取存放在Application物件中的資料
資料 = Application( "資料名稱" )
' 將資料寫入Application物件中
Application( "資料名稱" ) = 資料
app01.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<Form runat="server">
<asp:Button runat="server" Text="PostBack" OnClick="Button_Click"/>
</Form>
</BODY>
</HTML>
app01.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim appData
appData = Application("appData")
appData = appData + 100
Application("appData") = appData
Response.Write( "appData=" & Application("appData") )
End Sub
Sub Button_Click(sender As Object, e As EventArgs)
End Sub
</script>
app01.aspx 網頁
直接把 Application 物件當成資料來使用

節錄 app02.aspx
Sub Page_Load(sender As Object, e As EventArgs)
Application("appData") = Application("appData") + 100
Response.Write( "appData=" & Application("appData") )
End Sub
資料的非同步更新
Application("appData") = Application("appData") + 100


在電腦內部的執行過程會分成:
(1) 讀取 Application(“appData”) 的值。
(2) 將讀取的值加 100。
(3) 將加 100 之後的值寫回
Application("appData")。
如果有兩位連線者同時瀏覽網頁,並且同時執行
以上的步驟 (1),那麼他們所讀取的值相同(假設
等於 100),接著雖然也都執行了步驟 (2)(3) 把加
100 的結果寫回 Application(“appData”) 而得到 200
的結果,但實際上卻少加了 100。
Lock / Unlock

不讓任何兩位連線者同時執行以上的
「Application("appData") =
Application("appData") + 100」敘述,而
要避免此一情事的發生,須把程式改成:
Application.Lock ' 鎖定 Application 物件
Application("appData") = Application("appData") + 100
Application.UnLock
' 解除 Application 物件的鎖定
節錄 app03.aspx
Sub Page_Load(sender As Object, e As EventArgs)
Application.Lock
' 鎖定 Application 物件
Application("appData") = Application("appData") + 100
Response.Write( "appData=" & Application("appData") )
Application.UnLock ' 解除 Application 物件的鎖定
End Sub
Application 物件的生命週期
IIS
網頁
網頁
Application 物件生於此
變數生於此
變數的
生命週期
變數滅於此
變數生於此
變數的
生命週期
變數滅於此
… 其他網頁
Application 物件滅於此
Application 物件
的生命週期
Application 物件的實際應用(1)
Application 物件的實際應用 (2)
網頁狀態
AppNoUse.aspx
第一次瀏覽 開啟股票行情表
第二次瀏覽 開啟股票行情表
第三次瀏覽 開啟股票行情表
第四次瀏覽 開啟股票行情表
…
AppUse.aspx
1.開啟股票行情表
2.將股票行情表寫入Application物件
讀取Application物件之中的股票行情表
讀取Application物件之中的股票行情表
讀取Application物件之中的股票行情表
節錄 AppNoUse.aspx Part I
Sub OpenDataBase_And_BindToDataGrid()
Dim Conn As OleDbConnection
Dim Adpt As OleDbDataAdapter
Dim Ds
As DataSet
Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" )
Conn = New OleDbConnection( Provider & ";" & DataBase )
Conn.Open()
Dim SQL = "Select * From 股票行情表"
Adpt = New OleDbDataAdapter( SQL, Conn )
節錄 AppNoUse.aspx Part II
Ds = New Dataset()
Adpt.Fill(Ds, "股票行情表")
MyGrid.DataSource = Ds.Tables( "股票行情表
" ).DefaultView
MyGrid.DataBind()
Conn.Close()
End Sub
節錄 AppUse.aspx Part I
Sub OpenDataBase_And_BindToDataGrid()
If Not Application("股票行情表") Is Nothing Then
MyGrid.DataSource = Application("股票行情表").DefaultView
MyGrid.DataBind()
Exit Sub ' 退出副程式, 不用開啟資料庫
End If
Dim Conn As OleDbConnection
Dim Adpt As OleDbDataAdapter
Dim Ds
As DataSet
節錄 AppUse.aspx Part II
Dim Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
Dim Database = "Data Source=" & Server.MapPath( "Sample.mdb" )
Conn = New OleDbConnection( Provider & ";" & DataBase )
Conn.Open()
Dim SQL = "Select * From 股票行情表"
Adpt = New OleDbDataAdapter( SQL, Conn )
節錄 AppUse.aspx Part III
Ds = New Dataset()
Adpt.Fill(Ds, "股票行情表")
' 增加此一敘述
Application("股票行情表") = Ds.Tables( "股票行情表" )
MyGrid.DataSource = Ds.Tables( "股票行情表" ).DefaultView
MyGrid.DataBind()
Conn.Close()
End Sub
11-3 Session 物件
Session 物件

Session 物件跟 Application 物件一樣,可
儲存網頁間的共用資料,但可用範圍不
及 Application 物件,僅侷限於同一瀏覽
視窗的不同網頁,不過其特色是每一個
瀏覽視窗各自擁有獨立的 Session 物件,
在作業上,瀏覽視窗之間不會互相干擾,
這是它的優點。
利用 Session 物件存放資料的語法

利 用 Session 物 件 存 放 資 料 的 語 法 與
Application 物件完全相同,例如:
appData = Application("appData")
sesData = Session("sesData")
' 讀取Application物件的資料
' 讀取Session物件的資料
Application("appData") = appData
Session("sesData") = sesData
' 將資料寫入Application物件
' 將資料寫入Session物件
session.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<Form runat="server">
<asp:Button runat="server" Text="PostBack" OnClick="Button_Click"/>
</Form>
</BODY>
</HTML>
session.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Session("sesData") = Session("sesData") + 100
Response.Write( "sesData=" & Session("sesData") )
End Sub
Sub Button_Click(sender As Object, e As EventArgs)
End Sub
</script>
session.aspx 網頁
session.aspx 網頁測試的技巧

同時開啟兩個瀏覽器並且同時瀏覽
session.aspx,結果 sesData 的變化如下:
情況
網頁第一次被瀏覽
第一次按下PostBack
第二次按下PostBack
第三次按下PostBack
…
第一個瀏覽器
SesData = 100
SesData = 200
SesData = 300
SesData = 400
第二個瀏覽器
SesData = 100
SesData = 200
SesData = 300
SesData = 400
Session 物件與 Application 物件
的比較
Server
Server
瀏覽視窗
Session 物件
瀏覽視窗
瀏覽視窗
Session 物件
瀏覽視窗
…
瀏覽視窗
Application
物件
…
Session 物件
瀏覽視窗
(a) 瀏覽視窗與 Session 物件的關係 (b) 瀏覽視窗與 Application 物件的關係
Session 物件與資料傳遞的比較
(a)資料傳遞 Input.aspx
(b)Session 物件
Server.Transfer/
Response.Redirect
共用資料
swrite.aspx
Show.aspx
sread.aspx
寫入
讀取
共用資料
檢視 Input.aspx 的程式部分
Sub Button_Click(sender As Object, e As EventArgs)
Dim URL
URL = "Show.aspx?Name=" & Server.URLEncode(Name.Text) & _
"&Tel=" & Server.URLEncode(Tel.Text) & _
"&Addr=" & Server.URLEncode(Addr.Text)
Server.Transfer( URL )
End Sub

以上程式會讀取 Name、Tel、Addr 三個
欄位的資料,編碼後以 Server.Transfer 方
法傳給 Show.aspx 網頁。
將 Input.aspx 另存為
swrite.aspx,並將程式修改
Sub Button_Click(sender As Object, e As EventArgs)
Session("Name") = Name.Text
Session("Tel")
= Tel.Text
Session("Addr") = Addr.Text
Response.Redirect( "sread.aspx" ) ' 使用Server.Transfer亦可
End Sub

以上程式會讀取 Name、Tel、Addr 三個
欄位的資料,然後寫到 Session 物件中,
最後將網頁轉向 sread.aspx。
檢視 Show.aspx 的程式部分
Sub Page_Load(sender As Object, e As
EventArgs)
Data.Text = "姓名: " & Request("Name") &
"<P>"
Data.Text &= "電話: " & Request("Tel") & "<P>"

Data.Text &= "地址: " & Request("Addr")
以上程式利用 Request("資料") 的方法讀
End
Sub
取附帶在網址中的資料,然後將其顯示
在網頁上。
將 Show.aspx 另存為
sread.aspx,並將程式修改
Sub Page_Load(sender As Object, e As EventArgs)
Data.Text
= "姓名: " & Session("Name") & "<P>"
Data.Text &= "電話: " & Session("Tel") & "<P>"
Data.Text &= "地址: " & Session("Addr")
End Sub
 以上只要將
Request 改成 Session 即可程
式會讀取 Session 物件中的 Name、Tel、
Addr 資料,然後將其顯示在網頁上。
Session 物件與資料傳遞
兩者的差異 (1)
 在共用資料方面
:資料傳遞要透過
Server.Transfer 或 Response. Redirect
來 傳遞資料,藉以達到共用資料的
目的;而對 Session 物件來說,卻是
一方把資料寫到Session物件,而另
一方再讀取Session物件中的資料。
Session 物件與資料傳遞
兩者的差異 (2)

在切換網頁方面,資料傳遞的工作模式
一定要呼叫 Server.Transfer 或
Response.Redirect 切換網頁藉以傳遞資料;
但 Session 物件除了可以用
Server.Transfer 或 Response.Redirect 切換
網頁之外,上網者直接在瀏覽器的網址
欄輸入網址,或是程式提供連結讓上網
者選取,也是切換網頁的方法。
Session 物件與資料傳遞
兩者的差異 (3)

在共用對象方面,資料傳遞僅限於資料
傳遞者與資料接收者雙方可以共用資料,
Session 物件卻沒有這個限制,只要有某
一個網頁將資料寫入 Session 物件中,其
他網頁都可以存取該 Session 物件中的資
料,如下圖:
網頁一
網頁三
Session
物件
網頁二
網頁四
…其他網頁
使用 Session 物件不可不知的事情
--上網者關閉了 Cookie 功能(1)

IE 6.x 版的 Cookie 設定
1.選取功能表「工具/網際網路選項」
5.如果選取「接受」,
表示開啟 Cookie。
2.選取
4.核取
3.按下
5.如果選取「封鎖」,
表示關閉 Cookie。
使用 Session 物件不可不知的事情
--上網者關閉了 Cookie 功能(2)

IE 5.x 版的 Cookie 設定
1.選取功能表「工具/Internet選項」
2.選取
4.捲到這裡
5.開啟 Cookie
5.關閉 Cookie
5.開啟 Cookie
5.關閉 Cookie
3.按下
解決方案一

在「歡迎頁」或「登入頁」告訴上網者
“本網頁須使用 Cookie 功能”,請他開
啟Cookie ,網頁架構大致如下:
歡迎頁
或
登入頁
寫入
其他網頁
Session
物件
讀取
Welcome.aspx 與 Course.aspx
切換網頁
Welcome.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<H3>歡迎使用 ASP.NET 網頁製作教本 -- 第二章<HR></H3>
<H3>進入 ASP.NET 網頁製作的準備工作</H3>
<BLOCKQUOTE>
2-1 ASP.NET 相關技術概說<BR>
2-2 使用 HTML 的基本觀念<BR>
2-3 常用的 HTML 標示
</BLOCKQUOTE>
<A HREF="Course.aspx">進入課程網頁</A>
Welcome.aspx Part II
<HR>本網頁必須開啟 Cookie 方可正常運作,
<A HREF="UseCook.htm">瞭解如何開啟 Cookie</A>。
</BODY>
</HTML>
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Session("WelcomePage") = "Passed"
End Sub
</script>
Course.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<H3>Course.aspx -- 進入 ASP.NET 網頁製作的準備工作<HR></H3>
<H3>2-1 ASP.NET 相關技術概說</H3>
<Blockquote>先撇開網際網路的技術問題...
</Blockquote>
<H3>2-2 使用 HTML 的基本觀念</H3>
<Blockquote>上一節筆者說過,在ASP.NET網頁的製作中...
</Blockquote>
<H3>2-3 常用的 HTML 標示</H3>
<Blockquote>上一個段落筆者談了許多HTML的基本觀念...
</Blockquote>
<HR>
</BODY>
</HTML>
Course.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
If Session("WelcomePage") <> "Passed" Then ' Cookie未開啟
Response.Redirect( "Welcome.aspx" )
Else ' Cookie為開啟的
End If
End Sub
</script>
解決方案二(1)

先決定哪一個目錄的網頁其 Session 物件
可在 Cookie 未開啟的情況下依然能正常
工作,然後在該目錄中置入以下的
web.config 檔案:
<configuration>
<system.web>
<sessionState mode="InProc" cookieless="true" />
</system.web>
</configuration>
解決方案二 (2)

1.
接著進行以下的設定:
開啟 Internet Information Services:過
程是開啟「控制台 -> 系統管理工具 ->
Internet Information Services」 。
解決方案二 (3)

依序展開「本機電腦->網站->預設的網
站->kjaspx->ch11」,如下圖:
2.按下滑鼠右鈕
3.選取
1.展開至kjaspx/ch11目錄
解決方案二 (4)

出現「Cookieless 內容」視窗,如下圖:
1.按下
2.按下
解決方案二 (5)

完成以上設定之後,請關閉瀏覽器的
Cookie, 然 後 瀏 覽 Cookieless 目 錄
session.aspx 網頁,此一網頁複製自 ch11
目錄的 session.aspx(參見本節一開始的介
紹),但 Cookieless 目錄 session.aspx 網頁
可 以 正 常 工 作 , 而 ch11 目 錄 的
session.aspx 卻不然。
Cookieless 的玄機 (1)
網址中多了一串莫名其妙的文字
Cookieless 的玄機 (2)

當我們瀏覽 Cookieless 目錄的
session.aspx 網頁時,所輸入的網址是:
http://localhost/kjaspx/ch11/Cookieless/session.aspx

但顯示在瀏覽器的網址欄卻多了一串莫
名其妙的文字, ASP.NET 就是利用這一
串額外多出來的文字來辨識不同的連線
者,藉以將其資訊記錄在 Session 物件中。
斷了線的 Session 物件 (1)

1.
不想讓 Session 物件的資料被釋放,
應變的方案可能有:
延長IIS斷線的時間:設定Session
的 TimeOut 屬性,敘述如下:
Session.TimeOut = N
' 單位:分鐘
斷了線的 Session 物件 (2)
2. 使用「資料傳遞」工作模式:如果
相關的網頁不多,可以考慮藉助資
料傳遞的工作模式來共用資料。
3.使用 Cookie 物件:Cookie 物件可以
讓我們把連線者的資訊記錄在瀏覽
器,資料的存放將可以不受連線時
間的影響。
筆者的建議

先評估 Session 物件被釋放會對網頁造成
何種程度的影響,若沒什麼影響,可以
不理會 Session 物件被釋放的問題。
1. 進入歡迎頁
Welcome.aspx
3. 進入課程網頁
4.
轉回
5. 進入課程網頁
2. 上廁所20分鐘
Course.aspx
OK
11-4 Cookie 物件
Cookie 物件(1)

Cookie 物件跟 Application 及 Session 物
件一樣都可以存放共用資料,但
Application 及 Session 物件會把共用資料
存放在 Server 的記憶體中,而 Cookie
物件則會藉助瀏覽器所提供的 Cookie 功
能將資料存放在 Client(客戶端)的檔案或
記憶體中。
Cookie 物件(2)

在共用對象方面,Cookie 物件與 Session
物件比較像,在預設的情況下,每個連
線者擁有各自的 Cookie 物件,如下圖:
Client Server
Client Server
Cookie資料
瀏覽器
Cookie物件
瀏覽器
Session物件
記憶體
Cookie資料
瀏覽器
Cookie物件
瀏覽器
Session物件
記憶體
Session物件
記憶體
…
Cookie資料
瀏覽器
(b) Cookie 物件
…
Cookie物件
瀏覽器
(a) Session 物件
利用 Cookie 物件存放資料的語法

Cookie 是附屬於 Response 及 Request 物
件的子物件,使用時須在前面加上
「Response.」及「Request.」,例如:
Response.Cookies("data1").Value = 100 ' 寫入資料到Cookie
data1 = Request.Cookies("data1").Value ' 讀取Cookie的資料

寫入 Cookie 要使用 Response.Cookies,
而讀取 Cookie 則是使用
Request.Cookies(注意 Cookies 有 s),
此外,還要加上 .Value 。
Request.Cookies 沒有資料時
#01
#02
#03
#04

Dim data1, data2
Response.Cookies("data1").Value = 100
data1 = Request.Cookies("data1").Value
data2 = Request.Cookies("data2").Value
要避免錯誤,敘述 #04 要修改成:
#04 Dim cookie As HttpCookie
#05 cookie = Request.Cookies("data2")
#06 If Not cookie Is Nothing Then ' 表示 Cookie 含有資料
#07
data2 = Request.Cookies("data2").Value
#08 Else
#09
data2 = ""
#10 End If
' 或設定成 0 …,表示沒有資料
錯誤寫法一
(×) Cookies("data1").Value = data1
(×) data1 = Cookies("data1").Value

Cookies 不是獨立的物件,而是附屬於
Request 物件及 Response 物件,正確的寫
法應該是:
(○) Response.Cookies("data1").Value =
data1
(○) data1 =
Request.Cookies("data1").Value
錯誤寫法二
(×) Response.Cookie("data1").Value = data1
(×) data1 = Request.Cookie("data1").Value

Cookies 忘了加上 s,正確的寫法應該是:
(○) Response.Cookies("data1").Value =
data1
(○) data1 = Request.Cookies("data1").Value
錯誤寫法三
(×) Request.Cookies("data1").Value =
data1
(×) data1 =
 Request 物件的用途是讀取瀏覽器的資
Response.Cookies("data1").Value
料、而 Response 物件的用途則是下傳
(寫入)資料到瀏覽器,如下圖:
讀取
瀏覽器
Cookies
Request
Response
寫入
IIS
Cookie物件的應用(一)
Welcome
.aspx
寫入
Course
.aspx
Session
物件
Welcome2
.aspx
寫入
讀取
Course2
.aspx
Cookie
物件
讀取
Welcome2.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<H3>歡迎使用 ASP.NET 網頁製作教本 -- 第二章<HR></H3>
<H3>進入 ASP.NET 網頁製作的準備工作</H3>
<BLOCKQUOTE>
2-1 ASP.NET 相關技術概說<BR>
2-2 使用 HTML 的基本觀念<BR>
2-3 常用的 HTML 標示
</BLOCKQUOTE>
<A HREF="Course2.aspx">進入課程網頁</A>
<HR>本網頁必須開啟 Cookie 方可正常運作,
<A HREF="UseCook.htm">瞭解如何開啟 Cookie</A>。
</BODY>
</HTML>
Welcome2.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Response.Cookies("WelcomePage").Value = "Passed"
End Sub
</script>
Course2.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<H3>Course2.aspx -- 進入 ASP.NET 網頁製作的準備工作<HR></H3>
<H3>2-1 ASP.NET 相關技術概說</H3>
<Blockquote>先撇開網際網路的技術問題...
</Blockquote>
<H3>2-2 使用 HTML 的基本觀念</H3>
<Blockquote>上一節筆者說過,在ASP.NET網頁的製作中...
</Blockquote>
<H3>2-3 常用的 HTML 標示</H3>
<Blockquote>上一個段落筆者談了許多HTML的基本觀念...
</Blockquote>
<HR>
</BODY>
</HTML>
Course2.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim cookie As HttpCookie
cookie = Request.Cookies("WelcomePage")
If cookie Is Nothing Then ' "WelcomePage" Cookie 不存在
Response.Redirect( "Welcome2.aspx" )
End If
Then
If Request.Cookies("WelcomePage").Value <> "Passed"
Response.Redirect( "Welcome2.aspx" )
End If
End Sub
</script>
Cookie 物件與 Session 物件的
優劣比較
物件
斷線問題 可儲存的資料
Session物件 有
Cookie物件 無
除了文數字,還有物件
只有文數字
Cookie 的生命週期
物件
Session
生
瀏覽器被執行時
Application IIS開始執行時
物件
Cookie
生
滅
1. 瀏覽器結束執行時
2. 瀏覽器超過一段時間沒
有向IIS索求任何網頁
IIS結束執行時或關機
滅
瀏覽器被執行時 瀏覽器結束執行時
設定 Cookie 的生命週期

Cookie 將滅於瀏覽器結束執行時,其實
這只對了一半,因為只要經過設定,
Cookie 就可以在瀏覽器結束執行之後,
依然儲存在檔案中,而當瀏覽器下次啟
動時,會自動將其載回瀏覽器。
設定 Cookie 的有效期限(1)

想要在瀏覽器結束執行時,將儲存於
Cookie 中的資料保存下來,可在執行
「Response.Cookies(“資料”).Value = 資
料」之後,設定其Expires屬性,例如:
Response.Cookies("UserID").Value = "kjwang"
Response.Cookies("UserID").Expires =
"9/28/2005"
設定 Cookie 的有效期限(2)

如果我們設定了 Cookie 的使用期限(例
如以上的 “UserID”),則該 Cookie 將成
為瀏覽器之間共用的 Cookie,也就是說,
每一個開啟的瀏覽器都可以存取到此一
Cookie;但對於沒有設定使用期限的
Cookie 而言,則只屬於當時執行之瀏覽
器,如下圖:
設定 Cookie 的有效期限(3)
沒有設定使用
期限的Cookie
各自擁有
沒有設定使用
期限的Cookie
各自擁有
沒有設定使用
期限的Cookie
各自擁有
瀏覽器
瀏覽器
…
瀏覽器
共用 設定使用期
限的Cookie
設定 Cookie 的有效天數

設定的是「從本日算起若干日以內」有
效,此時可採用以下方法:(假設10日有
效)
Dim ExpireDate As Date
Response.Cookies("UserID").Value = "kjwang"
ExpireDate = DateAdd(DateInterval.Day, 10, Now) ' 10日內有效
Response.Cookies("UserID").Expires = Format(ExpireDate,
"M/dd/yyyy")
Cookie 物件的應用(二) 之一

瀏覽 Login.aspx 網頁
Cookie 物件的應用(二) 之二

請先關閉瀏覽器,然後重新開啟瀏覽器,
最後再瀏覽 Login.aspx 網頁,結果我們
可以看到「帳號」欄位依然保留著我們
先前所輸入的資料,而即使過一些時日
再瀏覽此一網頁,結果也是相同的。
Login.aspx Part I
<HTML>
<BODY BgColor="#FFFFFF">
<H3>Login.aspx -- 請登入帳號及密碼<HR></H3>
<Form runat="server">
帳號:<asp:TextBox runat="server" id="Account" /><p>
密碼:<asp:TextBox runat="server" id="Password" Textmode="Password" /><p>
<asp:Button runat="server" Text="登入" OnClick="Button_Click"/>
<HR><asp:Label runat="server" id="Msg" />
</Form>
</BODY>
</HTML>
Login.aspx Part II
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim cookie As HttpCookie
cookie = Request.Cookies("Account")
If Not cookie Is Nothing Then
Account.Text = Request.Cookies("Account").Value
End If
End Sub
Sub Button_Click(sender As Object, e As EventArgs)
Response.Cookies("Account").Value = Account.Text
Response.Cookies("Account").Expires = "12/31/2999"
Msg.Text = "登入成功!"
End Sub
</script>
11-5 檔案(File)
檔案(File)

檔案在共用資料中所扮演的角色跟
Application 物件類似,可供不同連線者
(不同機器)的所有網頁共用,不過其生命
週期比 Application 物件長,Application
物件會在IIS結束執行或關機時結束其生
命週期,而檔案則不受此一限制。
StreamReader 物件與檔案的讀取

StreamReader 是讀取檔案專用的物件,附
屬於 System.IO 命名空間,使用前要先利用
以下標示匯入 System.IO 命名空間:
<%@ Import Namespace="System.IO" %>

利用 New StreamReader() 建立
StreamReader 物件,如下:
Dim PathName As String = Server.MapPath("sample.txt")
Dim sReader As StreamReader
' 宣告一StreamReader物件
sReader = New StreamReader( PathName, Encoding.Default )
讀取檔案的方法

如果 New StreamReader() 成功地建立了
StreamReader 物件,即表示成功地開啟
了檔案,並且將檔案的內容安排成串流
(stream)形式,讀取資料的常用方法有:
讀取資料的方法
ReadLine
ReadToEnd
意義
讀取串流的下一行資料
讀取串流接下來的所有資料
串流與資料的讀取(1)

假設 sReader 為開啟 sample.txt 檔案所
得到的串流,而 sample.txt 的內容如下:
作者=王國榮
出版社=旗標
書名=ASP.NET 網頁製作教本

那麼串流表示成 作者=王國榮 CR LF 出版社=旗標 CR LF
(註:其中的 CR LF
為跳行字元)。
…
串流與資料的讀取(2)

如果使用 ReadLine 讀取其中的資料,則
每一次都會讀到 CR LF 的位置,假設讀
取三次,那麼三次的內容分別如下:
Dim S As String
S = sReader.ReadLine()' S 等於 "作者=王國榮"
S = sReader.ReadLine()' S 等於 "出版社=旗標"
S = sReader.ReadLine()' S 等於 "書名=ASP.NET 網頁製作教本"
串流與資料的讀取(3)

請注意利用 ReadLine 所讀取的內容中並
未包含 CR LF,但如果我們使用
ReadToEnd 方法讀取,則所讀取的內容
將包含 CR LF ,例如:
Dim S As String
S = sReader.ToEnd()
' S等於 作者=王國榮 CR LF 出版社=旗標 CR LF
…
P.540 實例一

利用 ReadToEnd 方法讀取 sample.txt 檔
案的內容,並且將其顯示在瀏覽器上面。
fread01.aspx
<%@ Import Namespace="System.IO" %>
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim PathName As String = Server.MapPath("sample.txt")
Dim sReader As StreamReader
sReader = New StreamReader( PathName, Encoding.Default )
Dim S As String
S = sReader.ReadToEnd()
sReader.Close() ' 關閉檔案
Response.Write( "<pre>" & S & "</pre>" )
End Sub
</script>
P.541 實例二

利用 ReadLine 方法讀取 sample.txt 檔案
的內容,並且將其顯示在瀏覽器上面。

利用 ReadLine 讀取檔案所有內容的程
式架構如下:
Dim S As String
S = sReader.ReadLine()' 讀取第一行
While Not S Is Nothing ' 判斷是否有讀取到資料
' ...
S = sReader.ReadLine()
' 繼續讀取下一行
End While
sReader.Close()
' 關閉檔案
fread02.aspx
<%@ Import Namespace="System.IO" %>
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim PathName As String = Server.MapPath("sample.txt")
Dim sReader As StreamReader
sReader = New StreamReader( PathName, Encoding.Default )
Dim S As String
S = sReader.ReadLine()
' 讀取第一行
While Not S Is Nothing
' 判斷是否有讀取到資料
Response.Write( S & "<br>" )
S = sReader.ReadLine() ' 繼續讀取下一行
End While
sReader.Close()
' 關閉檔案
End Sub
</script>
P. 542 練習 (1)

寫一網頁 EditTxt.aspx 讓使用者編輯
sample.txt 檔案的內容,而按下「傳送」
鈕時,將其內容顯示在 EditDsp.aspx 網
頁中,如下圖:
P. 542 練習 (2)
EditTxt.aspx
EditDsp.aspx
StreamWriter 物件與檔案的寫入

StreamWriter 是寫入檔案專用的物件,也
附屬於 System.IO 命名空間,使用前要先
利用以下標示匯入 System.IO 命名空間:
<%@ Import Namespace="System.IO" %>

接 著 是 利 用 New StreamWriter() 建 立
StreamWriter 物件,例如:
Dim PathName As String = Server.MapPath("sample2.txt")
Dim sWriter As StreamWriter ' 宣告一StreamWriter物件
sWriter = New StreamWriter( PathName, False, Encoding.Default )
寫入檔案的方法

寫入資料到檔案常用的方法有 Write 、
WriteLine 及 Flush:
寫入資料的方法
Write
WriteLine
Flush
意義
寫入資料到串流中
寫入一行資料到串流中
將串流中的資料寫入檔案
P.544 實例

利用 ReadToEnd 及 Write 方法將
sample.txt 檔案的所有內容複製到
sample2.txt。
CopyFile.aspx Part I
<%@ Import Namespace="System.IO" %>
<script Language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim PathName
As String = Server.MapPath("sample.txt")
Dim sReader As StreamReader
sReader = New StreamReader( PathName, Encoding.Default )
Dim PathName2 As String = Server.MapPath("sample2.txt")
Dim sWriter As StreamWriter
sWriter = New StreamWriter( PathName2, False,
Encoding.Default)
CopyFile.aspx Part II
Dim S As String
S = sReader.ReadToEnd()
sWriter.Write( S )
sWriter.Flush()
sReader.Close()
sWriter.Close()
Response.Write( "將 sample.txt 複製到 sample2.txt, OK!" )
End Sub
</script>
P. 545 練習

承 p.542 練習,我們希望在第一個網頁
按下「傳送」鈕之後,先將其寫回
sample.txt 檔案中,然後才傳送到第二個
網頁將編輯後的內容顯示出來。