版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第7章模塊6——站點計數(shù)7.1【任務(wù)14】站點計數(shù)器實現(xiàn)
【本章提要】
本章以校園在線超市系統(tǒng)中站點計數(shù)模塊的實現(xiàn)為中心,詳細(xì)介紹Application對象及Global.asax文件在Web應(yīng)用程序系統(tǒng)中的作用,并介紹用戶控件的應(yīng)用方法。
【學(xué)習(xí)目標(biāo)】
·掌握Application對象的使用。
·掌握Global.asax文件的使用。
·掌握用戶控件的應(yīng)用。
任務(wù)描述
在校園在線超市系統(tǒng)中,希望在站點中的所有頁面顯示當(dāng)前在線人數(shù)(包括匿名用戶和已登錄用戶),并自動累加用戶訪問量,在網(wǎng)頁上顯示站點的累計訪問量。7.1【任務(wù)14】站點計數(shù)器實現(xiàn)
必備知識
知識1Application對象
1.Application對象簡介
在ASP.NET中,Application對象代表ASP.NETWeb應(yīng)用程序的運行實例。一個Web站點可以包含不止一個ASP.NET應(yīng)用程序,而每個ASP.NET應(yīng)用程序的運行實例都可以由一個Applicaition對象來表達。
Application對象可以用來在整個應(yīng)用程序中共享信息,在.NET中對應(yīng)HttpApplicationState類,意指“應(yīng)用程序狀態(tài)”。可以直接在應(yīng)用程序狀態(tài)中存儲變量和對象。實際上,應(yīng)用程序狀態(tài)變量是給定ASP.NET應(yīng)用程序的全局變量,它的生命周期從請求該Web應(yīng)用程序的第一個頁面開始,到該Web站點關(guān)閉,或程序顯式清除Application變量時結(jié)束。
實際上,ASP.NET開發(fā)人員可以考慮將任何對象作為全局變量存儲在Application對象中,Application維護了一個鍵/值對集合,用鍵/值來區(qū)分集合中的不同項目。當(dāng)使用鍵/值存儲了一個數(shù)值時,就可以在Web應(yīng)用程序的不同頁面中使用該數(shù)值,從而達到數(shù)據(jù)共享的目的。
2.使用Application對象保存信息
1)
Application對象常用的屬性和方法
Application對象常用的屬性如表7-1所示。表7-1Application對象常用的屬性表7-2Application對象常用的方法下面對某些屬性和方法作具體說明。
①將新的對象添加到HttpApplicationState集合中。
Application["chat"]=TextBox1.Text;
Application.Add("chat",TextBox1.Text);
②獲取單個HttpApplicationState對象的值。
Label1.Text=Application["chat"].ToString();
Label1.Text=Application.Get("chat").ToString();③更新HttpApplicationState集合中的對象值。
Application.Set("chat",TextBox1.Text);
④從HttpApplicationState集合中移除命名對象。
Application.Remove("chat");
⑤從HttpApplicationState集合中移除所有對象。
Application.Remove();
Application.Clear();
2)應(yīng)用程序狀態(tài)同步
ASP.NET并發(fā)處理客戶端的請求,應(yīng)用程序中的多個線程可以同時訪問存儲在應(yīng)用程序狀態(tài)中的值,所以有可能存在多個用戶同時存取同一個Application對象的情況。這樣就有可能出現(xiàn)多個用戶修改同一個Application對象的情形,造成數(shù)據(jù)不一致的問題。
HttpApplicationState類提供兩種方法,即Lock和Unlock來解決對Application對象的訪問同步問題,一次只允許一個線程訪問應(yīng)用程序狀態(tài)變量。對Application對象調(diào)用Lock方法可以鎖定當(dāng)前Application對象,以便讓當(dāng)前用戶線程單獨進行寫入或修改。當(dāng)寫入或修改完成后,對Application對象調(diào)用Unlock方法,解除對當(dāng)前Application對象的鎖定,這樣其他用戶線程才能夠?qū)pplication對象進行修改。
只有當(dāng)調(diào)用Lock的用戶線程對Application對象調(diào)用相應(yīng)的Unlock方法時才會解除對其他用戶線程的修改限制。Lock方法和UnLock方法應(yīng)該成對使用。代碼如下:
Application.Lock();
Application["chat"]=TextBox1.Text;
Application.UnLock();
如果沒有顯示調(diào)用Unlock方法解除鎖定,則當(dāng)請求完成、請求超時或請求執(zhí)行過程中出現(xiàn)未處理的錯誤并導(dǎo)致請求失敗時,.NETFramework將自動解除鎖定。這種自動取消鎖定會防止應(yīng)用程序出現(xiàn)死鎖。知識2Global.asax文件
每個ASP.NET站點對應(yīng)一個Global.asax文件,該文件存儲在站點的虛擬根目錄下。Global.asax文件可以處理應(yīng)用程序和會話(開始和結(jié)束)用來初始化應(yīng)用程序變量和會話變量的事件。Global.asax文件是可選的。如果沒有定義此文件,ASP.NET頁面會假定沒有定義任何應(yīng)用程序或會話的事件處理程序。
Global.asax文件是一個聲明文件,用來在Web應(yīng)用程序運行時處理事件,如圖7-1所示。
圖7-1頁面請求處理過程
Global.asax文件支持三種類型的事件:請求頁面時激發(fā)的事件、發(fā)送被請求的頁時激發(fā)的事件和條件應(yīng)用程序事件,各事件的描述分別如表7-3、表7-4和表7-5所示。表7-3請求頁面時激發(fā)的事件表7-4發(fā)送被請求的頁時激發(fā)的事件表7-5條件應(yīng)用程序事件在下面的例子中使用Application對象實現(xiàn)了一個簡單的聊天室。使用框架結(jié)構(gòu),底部頁面用于書寫聊天內(nèi)容,頂部用于顯示內(nèi)容并每隔幾秒鐘刷新一次。
底部頁面主要代碼如下:
protectedvoidButton1_Click(objectsender,EventArgse){
stringtab="";
stringnewline="\r";
stringnewMessage=TextBox2.Text+":"+tab+TextBox3.Text+newline+Application["Chat"];
if(newMessage.Length>500){
newMessage=newMessage.Substring(0,499);
}
Application["Chat"]=newMessage;
TextBox3.Text="";
}頂部頁面主要代碼如下:
protectedvoidPage_Load(objectsender,EventArgse){
TextBox1.Text=(string)Application["chat"];
}
其效果如圖7-2所示。
圖7-2頁面瀏覽效果圖知識3Literal控件
Literal控件用于將靜態(tài)文本呈現(xiàn)在ASP.NET頁上,并使用服務(wù)器代碼操縱該文本。與Label控件不同,Literal控件不將任何HTML元素添加到文本上。例如,想要創(chuàng)建可以編程方式操縱的文本元素的簡單垂直列表,可以通過將Label控件或Literal控件的Text屬性設(shè)置為要發(fā)送到Web頁的HTML內(nèi)容的方法來進行。如果使用Label控件,則該控件被包裝在<span>標(biāo)記中。<span>不以任何顯而易見的方式影響該頁的呈現(xiàn)。如果使用Literal控件,將不添加<span>標(biāo)記,這使您的代碼更為簡單,但無法將樣式應(yīng)用于Literal控件的內(nèi)容,即Literal控件是無法定位的。因此,Literal可能不適合于創(chuàng)建標(biāo)題,也無法使用客戶端代碼確定控件的位置。
下面例子中顯示一個簡單頁,該頁在運行時顯示標(biāo)題新聞。該頁的主體包括Literal控件。
<body>
<form
runat="server">
<H1><asp:Literal
id="Headline"
runat=server
/></H1>
</form>
</body>
將代碼添加到Page_Load事件中以在運行時設(shè)置控件的Text屬性。
private
void
Page_Load(object
sender,
System.EventArgs
e){
Headline.Text
=
"New
Web
Site
Announced";
}知識4用戶控件
1.用戶控件的概念
用戶控件是能夠被其他ASP.NETWeb窗體作為服務(wù)器控件導(dǎo)入的ASP.NET頁。類似于Web服務(wù)器控件(運行在服務(wù)器上的組件),用戶控件提供了UI和其他相關(guān)的功能。當(dāng)創(chuàng)建好用戶控件之后,就可以在同一個Web應(yīng)用程序的其他頁面中使用它。
用戶控件是以
.ascx為文件擴展名的ASP.NET頁。用戶控件使你能夠很容易劃分和重用通用UI功能,并將其用于你的各個ASP.NETWeb應(yīng)用程序中。與Web窗體類似,可以使用任何文本編輯器編寫這些控件,或者使用代碼隱藏類開發(fā)它們。此外,用戶控件也是在第一次請求時進行編譯,然后存放在服務(wù)器內(nèi)存中以減少對后續(xù)請求的響應(yīng)時間。但是,與Web窗體不同的是,不能單獨請求用戶控件,它必須被包含在Web頁中才能正常運行。
1)用戶控件的組成
用戶控件由HTML和代碼組成,但由于用戶控件是被Web窗體使用的,因此它們不包含<HEAD>、<BODY>或<FORM>等HTML標(biāo)記,而由每個使用用戶控件的Web窗體包含這些標(biāo)記。
當(dāng)Web窗體使用一個用戶控件時,該用戶控件就參與了該Web窗體事件的生命周期。而且,因為用戶控件是一個ASP.NET頁,所以它擁有自己的頁面邏輯。例如,用戶控件可以在它的Page_Load事件過程中處理自己的回發(fā)功能。
2)用戶控件與關(guān)聯(lián)的代碼隱藏類
與Web窗體一樣,用戶控件也有一個與其相關(guān)聯(lián)的代碼隱藏類。@Page指令用來鏈接Web窗體中的代碼隱藏類文件,而@Control指令用來在用戶控件頁中引用代碼隱藏類文件。@Control指令僅能和用戶控件一起使用,且每個
.ascx文件中只能包含一個@Control指令。例如,為WebUserControl1的用戶控件引用某個代碼隱藏類,使用下面的@Control指令:
<%@ControlLanguage="C#"CodeFile="WebUserControl.ascx.cs"
AutoEventWireup="true"Inherits="WebUserControl"%>
3)用戶控件與Web服務(wù)器控件
用戶控件與Web服務(wù)器控件有所不同。Web服務(wù)器控件不僅包括窗體類型控件(如按鈕和文本框),而且包括特殊的控件,如日歷。
用戶控件一旦創(chuàng)建,就能在整個項目的Web窗體中使用。然而,因為沒有將用戶控件編譯成程序集,所以與其他類型控件不同,它們存在下列限制:
·在每個使用控件的Web應(yīng)用程序中,都必須保存一個該控件的副本。
·無法在VisualStudio.NET工具箱中加載用戶控件,這樣,必須通過將控件從解決方案資源管理器拖放到Web窗體中來創(chuàng)建它們。
·Web窗體加載用戶控件后將其初始化,這意味著直到Web窗體的Page_Load事件發(fā)生后,才會更新用戶控件的屬性值。
2.使用用戶控件的原因
1)使用用戶控件的優(yōu)勢
用戶控件有多種用途,如創(chuàng)建標(biāo)題和導(dǎo)航條,以及在Web應(yīng)用程序項目中重復(fù)使用代碼塊。開發(fā)Web應(yīng)用程序時使用用戶控件有很多優(yōu)點:
·用戶控件是自包含的。它們提供了單獨的變量命名空間,這意味著用戶控件的方法和屬性不會與宿主頁面中任何已存在的方法和屬性沖突。
·用戶控件可以在宿主頁面內(nèi)多次使用而不會引起屬性和方法的沖突。
·用戶控件和主宿主頁面的編寫語言可以不同。
2)共享用戶控件
單一的用戶控件可以由一個Web應(yīng)用程序的所有頁共享。然而,一個Web應(yīng)用程序中的
.aspx頁不能容納另外一個Web應(yīng)用程序中的用戶控件。要在多個Web應(yīng)用程序中使用同一個用戶控件,必須將其復(fù)制到每個Web應(yīng)用程序的虛擬根目錄下。
要在多個Web應(yīng)用程序中共享控件,也可以創(chuàng)建一個Web自定義控件,由其充當(dāng)可共享的用戶控件。Web自定義控件的創(chuàng)建比用戶控件的創(chuàng)建要困難得多。因為,與用戶控件不同的是,Web自定義控件不能采用VisualStudio.NET的可視化工具創(chuàng)建,所有開發(fā)都由代碼來完成。
3.添加用戶控件
可以把一個用戶控件放在任何ASP.NETWeb窗體中。引用用戶控件的頁稱為宿主頁,控件包含在該宿主頁面中。
1)包含用戶控件
通過使用@Register指令,可以將用戶控件包含在ASP.NETWeb窗體中,代碼如下:
<%@Registersrc="WebUserControl.ascx"tagname="WebUserControl"
tagprefix="uc1"%>
TagPrefix屬性為用戶控件確定唯一的命名空間,因此可以區(qū)分多個同名的用戶控件。TagName屬性是用戶控件的唯一名稱。Src屬性表示用戶控件文件的虛擬路徑。
2)使用用戶控件
用@Register指令注冊用戶控件之后,可以像放置普通Web服務(wù)器控件那樣,在Web窗體中放置用戶控件標(biāo)記。下面的代碼把兩個用戶控件添加到一個Web窗體中:
<uc1:WebUserControlID="WebUserControl1"runat="server"/>
<uc1:WebUserControlID="WebUserControl2"runat="server"/>
當(dāng)請求主Web窗體時,運行庫編譯用戶控件文件,頁面就可以使用它。
3)使用GET和SET屬性
在宿主頁面的事件過程中,可以通過申明用戶控件來訪問其屬性。下面的代碼是聲明兩個用戶控件的示例:
protectedWebUserControlWebUserControl1;
protectedWebUserControlWebUserControl2;
在上面的代碼示例中,WebUserControl是實現(xiàn)用戶控件的類名。變量名(WebUserControl1或WebUserControl2)必須和向Web窗體中增加用戶控件時使用的ID屬性名相同。
下面的例子中調(diào)用了用戶控件WebUserControl1和WebUserControl2的GET屬性:
Label1.Text=(WebUserControl1.pNum+WebUserControl2.pNum).ToString();
下面的例子中調(diào)用用戶控件WebUserControl1和WebUserControl2的SET屬性,以在用戶控件中顯示常量5和7:
WebUserControl1.pNum=5;
WebUserControl2.pNum=7;
4.創(chuàng)建用戶控件
1)創(chuàng)建新的用戶控件
創(chuàng)建新的用戶控件的步驟如下:
①在VisualStudio.NET的解決方案資源管理器中,右擊某個Web應(yīng)用程序項目,指向“添加”,然后單擊“添加Web用戶控件”。
②為控件命名,然后單擊“打開”,這樣就創(chuàng)建了擴展名是.ascx的頁。
③增加UI元素。就像創(chuàng)建ASP.NETWeb窗體一樣,創(chuàng)建一個頁面,從VisualStudio.NET的工具箱或是寫HTML來添加UI元素。④為UI元素和頁面事件添加事件過程和創(chuàng)建其他ASP.NET頁面類似,可將事件過程添加到代碼隱藏類。
⑤創(chuàng)建和宿主頁面交互的公共屬性。公共屬性允許宿主Web窗體讀寫用戶控件上的UI元素的值。
2)將現(xiàn)有的Web窗體轉(zhuǎn)換為用戶控件
①刪除所有<HTML>、<BODY>和<FORM>標(biāo)記。
②如果頁面中存在
@Page指令,把它修改成
@Control指令。雖然
@Control支持大多數(shù)的
@Page屬性,但仍須確認(rèn)沒有它不支持的屬性。
③為文件重命名,使該名稱能夠反映文件的用途,然后把文件的擴展名從
.aspx修改成
.ascx。
3)宿主頁
宿主頁就是包含了用戶控件的Web窗體。這個頁應(yīng)當(dāng)用流布局,以避免用戶控件內(nèi)容和頁面內(nèi)容的重疊。
宿主頁不能直接訪問用戶控件的UI元素。當(dāng)使用用戶控件的公共屬性來公開控件的UI元素時,可使宿主頁能夠使用UI元素。
例如,如果一個用戶控件包含一個文本框,就需要為這個文本框增加一個公共屬性,以便宿主頁能夠讀寫文本框中的值。以下代碼顯示的是包含一個文本框和兩個輸入驗證控件的用戶控件的HTML部分:
<%@ControlLanguage="C#"AutoEventWireup="true"
CodeFile="WebUserControl.ascx.cs"Inherits="WebUserControl"%>
<asp:TextBoxID="txtNum"runat="server"></asp:TextBox>
<asp:RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"
ControlToValidate="txtNum"ErrorMessage="youmustenteravalue">
</asp:RequiredFieldValidator>
<asp:RangeValidatorID="RangeValidator1"runat="server"
ControlToValidate="txtNum"
ErrorMessage="pleaseenteranumberbetween0and99"MaximumValue="99"
MinimumValue="0"Type="Integer">
</asp:RangeValidator>
要向宿主頁公開文本框的值,必須創(chuàng)建一個公共屬性。例如,在代碼隱藏類中的下列代碼創(chuàng)建了一個名為pNum的屬性。pNum屬性公開了用戶控件中該文本框控件的Text屬性。
publicintpNum{
get {
returnConvert.ToInt32(txtNum.Text);
}
Set {
txtNum.Text=Convert.ToString(value);
}
}
用戶控件的所有公共的變量、屬性和方法都可作為這個控件在宿主頁中的屬性和方法。在前面的示例中,可在宿主頁中將pNum屬性作為控件屬性來訪問。如果用戶控件名為userText1,則可以讀寫userText1.pNum屬性。同樣,如果在用戶控件中創(chuàng)建了一個公共方法,它就會變成宿主頁中所能使用的方法。
任務(wù)實現(xiàn)
步驟1打開校園在線超市ASP.NET網(wǎng)站,在“解決方案資源管理器”中打開“添加新項”對話框,在模板列表中選擇“Web用戶控件”,給出用戶控件的名稱為“Count.ascx”,如圖7-3所示。
圖7-3添加新項對話框步驟2在“Count.ascx”文件中添加Table標(biāo)簽、Label控件和Literal控件,并對所有控件和標(biāo)簽進行屬性設(shè)置。其設(shè)計界面效果如圖7-4所示。
圖7-4“Count.ascx”文件設(shè)計界面顯示效果其對應(yīng)的HTML代碼如下,
<%@ControlLanguage="C#"AutoEventWireup="true"CodeFile="Count.ascx.cs"Inherits="Count"%>
<tablestyle="width:135px">
<tr>
<tdalign="center">
<asp:LabelID="Label1"runat="server"Text="當(dāng)前訪問人數(shù):">
</asp:Label>
<asp:LiteralID="Literal2"runat="server"Text="0">
</asp:Literal>
</td>
</tr>
<tr>
<tdalign="center">
<asp:LabelID="Label2"runat="server"Text="訪問總?cè)藬?shù):">
</asp:Label>
<asp:LiteralID="Literal1"runat="server"Text="0">
</asp:Literal>
</td>
</tr>
</table>步驟3在“解決方案資源管理器”中雙擊打開母版頁文件“MasterPage.master”,從“解決方案資源管理器”中拖入用戶控件文件“Count.ascx”放在指定的位置,如圖7-5所示。
圖7-5“MasterPage.master”文件局部設(shè)計界面顯示效果步驟4在“解決方案資源管理器”中打開“添加新項”對話框,在模板列表中選擇“全局應(yīng)用程序類”,名稱為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度標(biāo)磚及環(huán)保涂料采購合同3篇
- 2024年版東莞市土地使用權(quán)出讓合同
- 2025廠房買賣合同-航空航天產(chǎn)業(yè)基地產(chǎn)權(quán)交易及配套設(shè)施移交3篇
- 2024標(biāo)準(zhǔn)二手車交易協(xié)議樣本一
- 2024校長任期管理與績效提升聘用合同規(guī)范文本2篇
- 2024標(biāo)準(zhǔn)個人勞務(wù)合作協(xié)議模板版
- 2024年食品包裝OEM供應(yīng)協(xié)議
- 2025年度教育機構(gòu)實驗室場地借用及設(shè)備維護協(xié)議3篇
- 2024年閣樓銷售協(xié)議綜合版版B版
- 2024年網(wǎng)球賽事:場館租借合同3篇
- 2024年杭州師范大學(xué)附屬醫(yī)院招聘高層次緊缺專業(yè)人才筆試真題
- 山東省煙臺市2025屆高三上學(xué)期期末學(xué)業(yè)水平診斷政治試卷(含答案)
- 2025北京石景山初二(上)期末數(shù)學(xué)真題試卷(含答案解析)
- 商場停車場管理制度
- 北師大版四年級下冊數(shù)學(xué)課件第1課時 買文具
- 青貯產(chǎn)品銷售合同樣本
- 2024年冷庫倉儲服務(wù)協(xié)議3篇
- 中國轎貨車的車保養(yǎng)項目投資可行性研究報告
- 人工智能在體育訓(xùn)練中的應(yīng)用
- 2024年全國職業(yè)院校技能大賽高職組(體育活動設(shè)計與實施賽項)考試題庫(含答案)
- 2024-2030年中國液態(tài)金屬行業(yè)市場分析報告
評論
0/150
提交評論