ASP入門(六)-Response對象


Response對象可以從服務器向用戶發送輸出的結果。

Response幾種常用方法

方法 描述
BinaryWrite 向瀏覽器輸出二進制的內容
Clear 清除已經緩沖的HTML輸出
End 停止處理當前的頁面,並返回當前的結果
Flush 立即發送已緩沖的HTML輸出
Redirect 把用戶重定向到另一個URL
Write 向輸出寫指定的字符串

Write方法

Write方法前面已經接觸過了,用於向瀏覽器輸出一個字符串,例如下面的代碼:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body>
<h1>
<% Response.Write("Hello World") %>
</h1>
</body>
</html>

會向瀏覽器輸出“Hello World”字樣,它並不包含任何HTML代碼,因此,如果你想向瀏覽器輸出完整的HTML代碼,則需要一並寫在Response.Write中。


BinaryWrite方法

BinayWrite方法主要是在沒有任何字符轉換的情況下直接向輸出寫數據,此方法可以用於從數據庫向瀏覽器寫圖像數據(BLOB)。語法如下:

Response.BinaryWrite data

參數data是必須的,內容為被發送的二進制信息。

下面的測試,來看看WriteBinaryWrite的區別,代碼如下:

20150811001

然后在Firefox瀏覽器中“查看頁面源代碼”,我們發現了稍許不同,如下圖:

20150811002


Redirect方法

它的作用是將瀏覽器的訪問重定向到另一個頁面。下面的例子中我們在頁面的開始對當前時間進行判斷,如果是白天進入Day.html頁面,如果是黑夜進入Night.html頁面。代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
  Dim Hours
  Hours = Hour(Now()) '獲取當前小時數
  If Hours < 18 Then '小於18點跳轉到Day.html頁面
    Response.Redirect("Day.html")
  Else '>=18點跳轉到Night.html頁面
    Response.Redirect("Night.html")
  End If  
%>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Response.Redirect</title>
</head>
<body></body>
</html>

當使用Response.Redirect方法后,實際上ASP向瀏覽器發送了一個HTTP 301的重定向的HTTP頭,瀏覽器會根據這個HTTP頭重新請求新的頁面。


Flush、End和Clear方法

這三個方法都涉及到了IIS的緩存操作。IIS是運行ASP的網站服務器軟件,當ASP對網頁內容進行輸出操作時,實際上是將網頁的輸出事先放置在IIS的一個緩沖區內,等到需要發送給用戶的時候才統一發送,避免了多次輸出的通訊開銷。

下面的代碼用來展示Flush的用法,其中的過程Sleep會將程序暫停一段時間,這樣才能看到Flush的效果,代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Buffer = true %>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Response.Flush演示代碼</title>
</head>
<body>
<%
Dim j
Sub Sleep 'Sleep延時程序,為了看清楚Flush效果
  Dim i
  For i = 1 To 1000000
  Next
End Sub

For J = 1 To 1000
  Response.Write(J & "  ")
  Response.Flush() '嘗試有這個和沒有這個的區別
  Sleep
Next
%>
</body>
</html>

在Firefox40.0版本中測試效果如下:

20150812002


下面的代碼將演示Clear方法的效果,如下圖所示:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Buffer = true %>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Response.Clear演示代碼</title>
</head>
<body>
<p>This is some text I want to send to the user.</p>
<p>No, I changed my mind. I want to clear the text.</p>
<% Response.Clear()'緩沖區將清理,上面的所有HTML都將不顯示 %>
</body>
</html>

在Firefox40.0版本中測試,將得到一個空白頁面,我們通過“查看頁面源代碼”右鍵菜單,看看源代碼是什么樣子的,如下圖:

20150812003


下面的代碼中我們將繼續演示End方法的使用,代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Buffer = false %>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Response.End演示代碼</title>
</head>
<body>
<p>
I am writing some text. This text will never be<br>
<% Response.End() '立刻輸出當前緩沖區,並終止 %>
<!-- 接下來的HTML將不會輸出到客戶端 -->
finished! It's too late to write more!</p>
</p>
</body>
</html>

Firefox40.0版本中測試結果如下圖:

20150812004

通過查看“查看頁面源代碼”,我們看看源代碼有什么不一樣?如下圖:

20150812005


Response幾種常用屬性

屬性 描述
Buffer 規定是否緩沖頁面的輸出
Charset 將字符集的名稱追加到Response對象的content-type頭部
ContentType 設置Response對象的HTTP內容類型
Expires 設置頁面在失效前的瀏覽器緩存時間
ExpiresAbsolute 設置頁面緩存失效的日期和時間
IsClientConnected 指示客戶端是否已從服務器斷開

Buffer屬性我們再一次實驗一個代碼(將上面Flush的代碼稍作修改),如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Buffer = false '設置不緩存 %>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Response.Flush演示代碼</title>
</head>
<body>
<%
Dim j
Sub Sleep 'Sleep延時程序,為了看清楚Flush效果
  Dim i
  For i = 1 To 1000000
  Next
End Sub

For J = 1 To 1000
  Response.Write(J & "  ")
  Sleep '暫停一下,為了看清楚效果
Next
%>
</body>
</html>

在Firefox中測試效果和Flush的代碼一樣效果,逐個輸出了數字。

Buffer屬性可規定是否對輸出進行緩沖。通常情況下,ASP 腳本在服務器端執行,每句的執行結果都會發送到客戶端的瀏覽器上顯示出來。當輸出設置緩存時,服務器會阻止向瀏覽器的響應,直到所有的服務器腳本均被處理,或者直到腳本調用了 Flush 或 End 方法。

注意:如果要設置此屬性,它應當位於 .asp 文件中的 <html> 標簽之前。


Charset屬性向 Response 對象中 content-type 頭部追加字符集名稱。默認字符集是 ISO-LATIN-1。

注意:此屬性可接受任何字符串,不論是否為合法的字符集名稱。

我們新建一個ASP空頁面,沒有任何ASP代碼,運行后content-type頭部是什么樣子呢?代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Resposne.Charset</title>
</head>

<body>
</body>
</html>
通過在Firefox中測試運行,瀏覽器中右鍵菜單“ 查看元素”,然后選擇【 網絡 | 消息頭】,在相應頭信息里可以看到 Content-Type內容只是 “text/html”
  20150812007
我們重新修改代碼,使用Charset屬性指定一個字符集,如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Charset = "utf-8" %>
<!doctype html>
<html>
<head>

再次在Firefox中查看消息頭信息,Content-Type內容變成了 “text/html; Charset=utf-8”

20150812008

Charset屬性用來動態指定這個編碼的,它有時在AJAX形式調用的網頁中用到。


ExpiresExpiresAbsolute兩個屬性用來控制瀏覽器對於當前網頁的緩存時間,在緩存時間之內,重復訪問網頁將直接從瀏覽器的緩存中調用而不再從服務器上獲取。二者的區別在於Expires指定過期時間距離當前時間的間隔,而ExpiresAbsolute用於指定過期的絕對時間。

Expires示例

下面代碼指示頁面不會緩存,將Expires值設置為-1,如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.Expires = -1 '不緩存%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Resposne.Expires和ExpiresAbsolute</title>
</head>
<body>
<p>This page will be refreshed with each access!!!!</p>
</body>
</html>

通過Firefox的“查看元素”功能,我們能看到DateExpires時間差別:

20150812009

同理,如果將Expires設置為10,即相差10分鍾,結果分析如下:

20150812010


ExpiresAbsolute示例

下面的代碼將使頁面在10天后過期,如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% 
'將在10天后過期
Response.ExpiresAbsolute = DateAdd("d", 10, Date()) 
%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Resposne.Expires和ExpiresAbsolute</title>
</head>
<body>
<p>這個頁面將在10天后過期並更新</p>
</body>
</html>

通過Firefox分析后,顯示Expires內容如下:

20150812011

小知識:

DateAdd函數返回已添加指定時間間隔的日期。

     DateAdd(interval, number, date)

interval參數可以設置為年、季度、月、當年的第幾天、日、當周的第幾天、當年的第幾周、小時、分、秒。

number參數設置時間間隔,對未來的日期使用正值,對過去的日期使用負值。

date參數指定被添加的時間間隔的日期的變量或文字。


IsClientConnected屬性指示客戶端是否已經與服務器斷開連接。

示例代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Resposne.IsClientConnected</title>
</head>
<body>
<%
If Response.IsClientConnected = true then 
  Response.Write("The user is still connected!")
Else
  Response.Write("The user is not connected!")
End If
%>
</body>
</html>

ContentType屬性為Response對象設置HTTP內容類型,ASP頁面如果沒有設置ContentType屬性,那么默認的Content-Type頭部是這樣的(Firefox查看元素),如下( ”text/html”):

20150812012

我們舉個例子,此例子將會打開一個Excel電子表格,代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% Response.ContentType = "application/vnd.ms-excel" %>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Resposne.ContentType</title>
</head>
<body>
<table>
<tr>
  <td>1</td>
  <td>2</td>
  <td>3</td>
  <td>4</td>
</tr>
<tr>
  <td>5</td>
  <td>6</td>
  <td>7</td>
  <td>8</td>
</tr>
</table>
</body>
</html>

通過測試,提示當前頁面用Excel打開,如下圖:

20150812013

點擊“打開,通過 Microsoft Excel()默認”后,就會看到Excel的處理內容了,如下圖:

20150812014

小知識:

如果獲得某種類型的MIME類型呢?出了百度之外,你可以通過你注冊表的HKEY_CLASSES_ROOT分支下查看相應的某種類型的鍵值,例如xls格式的MIME類型是application/vnd.ms-excel

20150812015


Response集合

Response有一個Cookies的集合,這個集合用於向瀏覽器輸出Cookies。

為什么要使用Cookies呢?HTTP協議是一個無狀態的協議,服務器並不知道客戶端兩次請求之間的聯系,而Cookies的設計使得服務器可以通過Cookies在客戶端存儲一些信息,並在服務器端讀取,從而實現例如用戶登錄保存等功能。

Cookies 集合用於設置或取得 cookie 的值。如果 cookie 不存在,就創建它,並賦予它規定的值。

注意:Response.Cookies 命令必須位於 <html> 標簽之前。

語法:
Response.Cookies(name)[(key)|.attribute]=value

variablename=Request.Cookies(name)[(key)|.attribute]

語法看着嚇人,通過下面的代碼我們將要學習如何設置Cookies,並讀取Cookies,其實很簡單,代碼如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<% '設置Cookies
Response.Cookies("user")("firstname") = "John"
Response.Cookies("user")("lastname") = "Smith"
Response.Cookies("user")("country") = "Norway"
Response.Cookies("user")("age") = "25"
'在這里我們設置了名為user的Cookies,其中又包含多個值
%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Response.Cookies</title>
</head>
<body>
<h1>Cookies讀取示例</h1>
<% '將設置好的Cookies讀取出來,並輸出到瀏覽器
Dim x
For Each x in Request.Cookies("user")
  Response.Write(x & " : " & y & " = " & Request.Cookies("user")(x))
  Response.Write("<br>")
Next
%>
</body>
</html>

代碼的開頭設置了名為user的Cookies,並且包含多個值,<body>中將名為user的Cookies讀取出來並顯示,在Firefox中測試分析如下:

20150812016


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM