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 檔案中,然後才傳送到第二個
網頁將編輯後的內容顯示出來。