人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

ASP.Net Web Page深入探討一

ASP.Net Web Page深入探討一

更新時(shí)間:2022-08-09 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

一、服務(wù)器腳本基礎(chǔ)介紹

首先,我們先復(fù)習(xí)一下Web服務(wù)器頁(yè)面的基本執(zhí)行方式:

1、 客戶(hù)端通過(guò)在瀏覽器的地址欄敲入地址來(lái)發(fā)送請(qǐng)求到服務(wù)器端

2、 服務(wù)器接收到請(qǐng)求之后,發(fā)給相應(yīng)的服務(wù)器端頁(yè)面(也就是腳本)來(lái)執(zhí)行,腳本產(chǎn)生客戶(hù)端的響應(yīng),發(fā)送回客戶(hù)端

3、 客戶(hù)端瀏覽器接收到服務(wù)器傳回的響應(yīng),對(duì)Html進(jìn)行解析,將圖形化的網(wǎng)頁(yè)呈現(xiàn)在用戶(hù)面前

對(duì)于服務(wù)器和客戶(hù)端的交互,通常通過(guò)下面幾種主要方式:

1、 Form:這是最主要的方式,標(biāo)準(zhǔn)化的控件來(lái)獲取用戶(hù)的輸入,F(xiàn)orm的提交將數(shù)據(jù)發(fā)送給服務(wù)器端處理

2、 QueryString:通過(guò)在Url后面帶參數(shù)達(dá)到將參數(shù)傳送給服務(wù)器,這種方式其實(shí)跟Get方式的Form是一樣的

3、 Cookies:這是一種比較特殊的方式,通常用于用戶(hù)身份的確認(rèn)

二、ASP.Net簡(jiǎn)介

傳統(tǒng)的服務(wù)器腳本語(yǔ)言,如ASP、JSP等,編寫(xiě)服務(wù)器腳本的方式大同小異,都是在Html中嵌入解釋或編譯執(zhí)行的代碼,由服務(wù)器平臺(tái)執(zhí)行這些代碼來(lái)生成Html;對(duì)于這類(lèi)似的腳本,頁(yè)面的生存周期實(shí)際上很簡(jiǎn)單,就是從開(kāi)頭至末尾,執(zhí)行完所有的代碼,當(dāng)然用Java編寫(xiě)的Servlet可以編寫(xiě)更復(fù)雜的代碼,但是從結(jié)構(gòu)上看,和JSP沒(méi)什么區(qū)別。

ASP.Net的出現(xiàn),打破了這種傳統(tǒng);ASP.Net采用了CodeBehind技術(shù)和服務(wù)器端控件,加入了服務(wù)器端的事件的概念,改變了腳本語(yǔ)言編寫(xiě)的模式,更加貼近Window編程,使Web編程更加簡(jiǎn)單、直觀;但是我們要看到,ASP.Net本身并沒(méi)有改變Web編程的基本模式,只是封裝了一些細(xì)節(jié)、提供了一些易用的功能,使代碼更容易編寫(xiě)和維護(hù);從某種程度上來(lái)說(shuō),將服務(wù)器端執(zhí)行的方式復(fù)雜化了,這就是我們今天要討論的主體:ASP.Net Web Page的生存周期。

三、ASP.Net請(qǐng)求處理模式

我們說(shuō),ASP.Net的Web Page并沒(méi)有脫離Web編程的模式,所以它仍然是以 請(qǐng)求->接收請(qǐng)求->處理請(qǐng)求->發(fā)送響應(yīng) 這樣的模式在工作,每一次與客戶(hù)端的交互都會(huì)引發(fā)一次新的請(qǐng)求,所以一個(gè)Web Page的生命周期是以一次請(qǐng)求為基礎(chǔ)的。

當(dāng)IIS收到客戶(hù)端的請(qǐng)求的時(shí)候,會(huì)將請(qǐng)求交給aspnet_wp這個(gè)進(jìn)程來(lái)處理,這個(gè)進(jìn)程會(huì)查看請(qǐng)求的應(yīng)用程序域是否存在,如果不存在則會(huì)創(chuàng)建一個(gè),然后會(huì)創(chuàng)建一個(gè)Http運(yùn)行時(shí)(HttpRuntime)來(lái)處理請(qǐng)求,這個(gè)運(yùn)行時(shí)“為當(dāng)前應(yīng)用程序提供一組 ASP.NET 運(yùn)行時(shí)服務(wù)”(摘自MSDN)。

HttpRuntime在處理請(qǐng)求的時(shí)候,會(huì)維護(hù)一系列的應(yīng)用程序?qū)嵗簿褪菓?yīng)用程序的Global類(lèi)(global.asax)的實(shí)例,這些實(shí)例在沒(méi)有請(qǐng)求的時(shí)候,會(huì)存放在一個(gè)應(yīng)用程序池中(實(shí)際上應(yīng)用程序池由另一個(gè)類(lèi)來(lái)維護(hù),HttpRuntime只是簡(jiǎn)單的調(diào)用),每接收到一個(gè)請(qǐng)求,HttpRuntime都會(huì)獲取一個(gè)閑置的實(shí)例來(lái)處理請(qǐng)求,這個(gè)實(shí)例在請(qǐng)求結(jié)束前不會(huì)處理其他的請(qǐng)求,處理完畢之后,它又會(huì)回到池中,“一個(gè)實(shí)例在其生存期內(nèi)被用于處理多個(gè)請(qǐng)求,但它一次只能處理一個(gè)請(qǐng)求。”(摘自MSDN)

當(dāng)應(yīng)用程序?qū)嵗幚碚?qǐng)求的時(shí)候,它會(huì)創(chuàng)建請(qǐng)求頁(yè)面類(lèi)的實(shí)例,執(zhí)行它的ProcessRequest方法來(lái)處理請(qǐng)求,這個(gè)方法也就是Web Page生命周期的開(kāi)始。

四、Aspx頁(yè)面與CodeBehind

在深入了解頁(yè)面的生命周期之前,我們先來(lái)探討一些Aspx與CodeBehind之間的關(guān)系。

<%@ Page language="c#" Codebehind="WebForm.aspx.cs" Inherits="MyNamespace.WebForm" %>

相信使用過(guò)CodeBehind技術(shù)的朋友,對(duì)ASPX頂部的這句話(huà)應(yīng)該是非常熟悉了,我們來(lái)一項(xiàng)一項(xiàng)的分析它:

Page language="c#" 這個(gè)就不用多說(shuō)了吧

Codebehind="WebForm.aspx.cs" 這一句表示綁定的代碼文件

Inherits="MyNamespace.WebForm" 這句非常重要,它表示頁(yè)面繼承的類(lèi)名稱(chēng),也就是CodeBehind的代碼文件中的類(lèi),這個(gè)類(lèi)必須從System.Web.WebControls.Page派生

從上面我們可以分析出,實(shí)際上CodeBehind中的類(lèi)就是頁(yè)面(ASPX)的基類(lèi),到這里,可能有些朋友要問(wèn)了,在編寫(xiě)ASPX的時(shí)候,完全是按照ASP的方式,在Html中嵌入代碼或者嵌入服務(wù)器控件,沒(méi)有看到所謂“類(lèi)”的影子啊?

這個(gè)問(wèn)題實(shí)際上并不復(fù)雜,各位使用ASP.Net編程的朋友可以到你們的系統(tǒng)盤(pán):\WINDOWS\Microsoft.NET\Framework\<版本號(hào)>\Temporary ASP.NET Files這個(gè)目錄下,這個(gè)下面就放了所有本機(jī)上存在的ASP.Net應(yīng)用程序的臨時(shí)文件,子目錄的名稱(chēng)就是應(yīng)用程序的名稱(chēng),然后再下去兩層(為了保證唯一,ASP.Net自動(dòng)產(chǎn)生了兩層子目錄,并且子目錄名稱(chēng)是隨機(jī)的),然后我們會(huì)發(fā)現(xiàn)有很多類(lèi)似:“yfy1gjhc.dll”、“xeunj5u3.dll”這樣的鏈接庫(kù)以及“komee-bp.0.cs”、“9falckav.0.cs”這樣的源文件,實(shí)際上這就是ASPX被ASP.Net動(dòng)態(tài)編譯后的結(jié)果,打開(kāi)這些源文件我們可以發(fā)現(xiàn):

public class WebForm_aspx : MyNamespace.WebForm, System.Web.SessionState.IRequiresSessionState

這就印證了我們前面的說(shuō)法,ASPX是代碼綁定類(lèi)的子類(lèi),它的名稱(chēng)是ASPX文件名加上“_aspx”后綴,通過(guò)研究這些代碼我們可以發(fā)現(xiàn),實(shí)際上所有aspx中定義的服務(wù)器控件都是在這些代碼中生成的,然后動(dòng)態(tài)產(chǎn)生這些代碼的時(shí)候,把原來(lái)在ASPX中嵌入的代碼寫(xiě)在了相應(yīng)的位置。

當(dāng)某個(gè)頁(yè)面第一次被訪問(wèn)的時(shí)候,Http運(yùn)行時(shí)就會(huì)使用一個(gè)代碼生成器去解析ASPX文件并生成源代碼并編譯,然后以后的訪問(wèn)就直接調(diào)用編譯后的dll,這也是為什么ASPX第一次訪問(wèn)的時(shí)候非常慢的原因。

解釋了這個(gè)問(wèn)題,我們?cè)賮?lái)看另一個(gè)問(wèn)題。我們?cè)谑褂么a綁定的時(shí)候,在設(shè)計(jì)頁(yè)面拖一個(gè)控件,然后切換到代碼視圖,就可以直接在Page_Load中使用這個(gè)控件了,既然控件是在子類(lèi)中產(chǎn)生的,那為什么在父類(lèi)中可以直接使用呢?

實(shí)際上我們可以發(fā)現(xiàn),每當(dāng)用VS.Net拖一個(gè)控件到頁(yè)面上,代碼綁定文件中總是會(huì)類(lèi)似這樣的添加一個(gè)聲明:

protected System.Web.WebControls.Button Button1;

我們可以發(fā)現(xiàn)這個(gè)字段被聲明成protected,而且名字與ASPX中控件的ID一致,仔細(xì)想一想,這個(gè)問(wèn)題就迎刃而解了。我們前面提到ASPX的源代碼是被生成器動(dòng)態(tài)生成和編譯的,生成器會(huì)產(chǎn)生動(dòng)態(tài)生成每一個(gè)服務(wù)器控件的代碼,在生成的時(shí)候,它會(huì)檢查父類(lèi)有沒(méi)有聲明這個(gè)控件,如果聲明了,它會(huì)添加類(lèi)似下面的一句代碼:

this.DataGrid1 = __ctrl;

這個(gè)__ctrl就是生成該控件的變量,這時(shí)候它就把控件的引用賦給了父類(lèi)中相應(yīng)的變量,這也是為什么父類(lèi)中的聲明必須為protected(實(shí)際上也可以為public),因?yàn)橐WC子類(lèi)能夠調(diào)用。

然后在執(zhí)行Page_Load的時(shí)候,因?yàn)檫@時(shí)候父類(lèi)的聲明已經(jīng)被子類(lèi)中的初始化代碼賦了值,所以我們就可以使用這個(gè)字段來(lái)訪問(wèn)對(duì)應(yīng)的控件,了解了這些,我們就不會(huì)犯在代碼綁定文件中的構(gòu)造器里使用控件,造成空引用的異常的錯(cuò)誤了,因?yàn)闃?gòu)造器是最先執(zhí)行的,這時(shí)候子類(lèi)的初始化還沒(méi)有開(kāi)始,所以父類(lèi)中的字段是空值,至于子類(lèi)是什么時(shí)候初始化我們放到后面討論。


溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

本類(lèi)教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 兰考县| 缙云县| 仙游县| 牡丹江市| 博乐市| 阜南县| 龙州县| 错那县| 含山县| 台东市| 阿坝| 泽州县| 临夏县| 吴堡县| 金川县| 徐州市| 宁化县| 平远县| 读书| 晋中市| 荣成市| 韩城市| 邹平县| 武强县| 中牟县| 香格里拉县| 海宁市| 汉源县| 方城县| 丰原市| 郓城县| 汝阳县| 友谊县| 遵义县| 大英县| 普格县| 丰顺县| 闸北区| 南郑县| 贵定县| 河东区|