ASP.NET 打造互聯(lián)網(wǎng)未來(lái)空間站(3)
發(fā)表時(shí)間:2024-06-10 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]程序員話題 下面我們談一談開(kāi)發(fā)人員如何快速地開(kāi)始ASP.NET的程序設(shè)計(jì)。你發(fā)現(xiàn)ASP.NET中什么東西比ASP更吸引人?有些人說(shuō)是配置,ASP.NET配置起來(lái)更容易嗎?因此,我想談?wù)撽P(guān)于這個(gè)問(wèn)題的一點(diǎn)內(nèi)容。我們的確發(fā)現(xiàn)ASP.NET的一個(gè)優(yōu)點(diǎn)是可以簡(jiǎn)單地配置。由于ASP.NET的應(yīng)用程序是由編譯...
程序員話題
下面我們談一談開(kāi)發(fā)人員如何快速地開(kāi)始ASP.NET的程序設(shè)計(jì)。
你發(fā)現(xiàn)ASP.NET中什么東西比ASP更吸引人?
有些人說(shuō)是配置,ASP.NET配置起來(lái)更容易嗎?因此,我想談?wù)撽P(guān)于這個(gè)問(wèn)題的一點(diǎn)內(nèi)容。我們的確發(fā)現(xiàn)ASP.NET的一個(gè)優(yōu)點(diǎn)是可以簡(jiǎn)單地配置。由于ASP.NET的應(yīng)用程序是由編譯過(guò)的代碼組成,所以不需要注冊(cè)DLL或者停止某些服務(wù)。例如,在今天的ASP環(huán)境中,如果在你的網(wǎng)站上,有一個(gè)非常重要的商業(yè)組件需要被一個(gè)功能更加強(qiáng)大的組件替換時(shí),你將不得不暫停WEB站點(diǎn)的服務(wù),以便使得DLL不被鎖定。然后替換該組件,重新在系統(tǒng)中注冊(cè),重新啟動(dòng)你的WEB站點(diǎn),這樣做的結(jié)果是在某一段的時(shí)間里,你的站點(diǎn)將不能對(duì)外工作。然而,令人興奮的是在ASP.NET中,你不需要在做上面的任何工作,你在也不必考慮那個(gè)該死的regsrv32。你只需要將這個(gè)新的DLL放到與老的DLL系統(tǒng)的目錄下。當(dāng)前訪問(wèn)的新的DLL的請(qǐng)求仍然在工作,新的請(qǐng)求將會(huì)觸發(fā)新的DLL,這一切會(huì)持續(xù)到老的DLL完成所有的請(qǐng)求時(shí)為止。那時(shí),新的DLL就會(huì)代替老的DLL,這一切不會(huì)引發(fā)停機(jī),這一切只需要調(diào)用XCOPY的配置功能,這一切使得我們的工作更有效率,更加簡(jiǎn)潔。
這樣做的好處是不用再考慮哪個(gè)DLL需要關(guān)閉,然后再關(guān)閉它;哪個(gè)DLL中有BUG。是否有一種方式可以使得當(dāng)前應(yīng)用的所有的DLL迅速的被關(guān)閉,還是必須要將WEB站點(diǎn)停掉。
對(duì)我來(lái)說(shuō),保留它前面的版本,后面的版本是一件很容易的事情。只需要利用XCOPY重新配置一下就可以了,那些DLL很快會(huì)被自己替換。
好了,除了前面所見(jiàn)的配置簡(jiǎn)單的這個(gè)特性以外,你們還有那些優(yōu)點(diǎn)足以吸引ASP 程序員快速移植到ASP.NET環(huán)境中?
這個(gè)問(wèn)題問(wèn)得好,如果我是一個(gè)VB程序員,當(dāng)我進(jìn)入ASP編程環(huán)境時(shí),我會(huì)發(fā)現(xiàn),他是如此熟悉,我樂(lè)意立刻在那里編制程序。我不用擔(dān)心那些腳本語(yǔ)言,不用再考慮那種從頭到尾都是線性的處理模型,我可以在ASP.NET中使用更新的邏輯關(guān)系,使用提供的更多新服務(wù)器組件,提供比ASP程序更多的功能。
確實(shí)是這樣的,ASP.NET節(jié)省了我們大量的的開(kāi)發(fā)時(shí)間,你可以在同樣的環(huán)境下開(kāi)發(fā)供ASP+頁(yè)面調(diào)用的DLL,并且可以安全的使用。然而,對(duì)大多數(shù)的開(kāi)發(fā)者來(lái)講,最大的收益來(lái)自于他提供的caching功能。
我們都理解caching功能對(duì)于標(biāo)準(zhǔn)的web頁(yè)面的重要性,客戶端的caching可以使得頁(yè)面很快重現(xiàn),服務(wù)器端的caching存儲(chǔ)了一些已經(jīng)編譯過(guò)的代碼,可以提訪問(wèn)的速度。
我們下面舉一個(gè)caching的例子,一個(gè)在線的商店,這是一個(gè)銷售CD的網(wǎng)上商店,在他的主頁(yè)面上,你列舉了一系列的商品。因此,你使用了數(shù)據(jù)庫(kù)存儲(chǔ)商品信息、價(jià)格信息、種類信息等。當(dāng)ASP腳本訪問(wèn)數(shù)據(jù)庫(kù)時(shí),不可避免地會(huì)有時(shí)間延遲。但是,當(dāng)你使用caching時(shí),一些訪問(wèn)過(guò)的信息將會(huì)留在caching中。當(dāng)請(qǐng)求的信息在caching之內(nèi)被檢索的時(shí)候,caching中的頁(yè)面作為原頁(yè)面輸出,因此,你不必在訪問(wèn)數(shù)據(jù)庫(kù)就可以獲得數(shù)據(jù),因?yàn)樗麄円呀?jīng)在caching中了。.NET框架會(huì)一直監(jiān)視caching中的頁(yè)面,如果這些頁(yè)面相關(guān)的數(shù)據(jù)庫(kù)的信息發(fā)生了變化,他就會(huì)立即更新這些頁(yè)面。因此,你不必?fù)?dān)心得不到最新的數(shù)據(jù)信息。通過(guò)caching的設(shè)置功能你還可以設(shè)置caching的時(shí)間長(zhǎng)度,規(guī)定他在多長(zhǎng)時(shí)間內(nèi)定期更新caching中的內(nèi)容,你也可以在caching中緩存頁(yè)面的點(diǎn)擊數(shù)?傊ㄟ^(guò)caching技術(shù),你實(shí)際上為你站點(diǎn)的用戶提供了快速獲得信息的可能性。在本質(zhì)上,他實(shí)際上直接獲取的是生成好的HTML頁(yè)面,從而避免了一系列的頁(yè)面生成的過(guò)程。
caching將真正幫助網(wǎng)站的開(kāi)發(fā)人員調(diào)整網(wǎng)站的性能以及快速的相應(yīng)客戶的請(qǐng)求。
是的。實(shí)際上你可以看到這樣的情形---網(wǎng)站服務(wù)器每秒鐘可以相應(yīng)更多的點(diǎn)擊數(shù),因?yàn)橛脩舸蟛糠值恼?qǐng)求都落在caching中。
從開(kāi)發(fā)人員的角度來(lái)看,如果他們?cè)诰帉?xiě)第一個(gè)ASP.NET程序時(shí),他們會(huì)遇到哪些大的困難?
我對(duì)您的話感到吃驚,從ASP到ASP.NET并沒(méi)有不可逾越的障礙。他們只是在一些細(xì)節(jié)上有所不同。當(dāng)然有許多的是要引起注意的。例如,我們過(guò)去常用ASP與VB SCRIPT編寫(xiě)程序,當(dāng)我們想創(chuàng)建一個(gè)record set對(duì)象的時(shí)候,我們不得不SET一個(gè)變量等于record set。在ASP.NET中沒(méi)有SET這個(gè)參數(shù),直接就是變量等于ADO records set對(duì)象。所以,在ASP與ASP.NET之間僅有一些小的語(yǔ)法的差異,這些小的語(yǔ)法差異根本不會(huì)影響到頁(yè)面的性能,但是如果你將ASP程序移植到ASP.NET上時(shí),你要注意這些小的差異。實(shí)際上,從ASP遷移到ASP.NET的代碼量是很少的,不必考慮將整個(gè)程序代碼移植,這兩者實(shí)際上是可以并存的。因此你不必強(qiáng)制將你的網(wǎng)站的程序立即移植到ASP.NET上,你可以在新的工作中逐漸采用新的ASP.NET技術(shù)。
我想,你仍然可以像你從前那樣聲明你所有的數(shù)據(jù)類型。你仍然可以使用Server.CreateObject,你仍然可以使用 DIM RS,定義一個(gè)record set對(duì)象,你仍然可以使用DIM RS AS NEW ADO record set這種方式,對(duì)嗎?
這只是我們的一種選擇,在我們最少量的移植級(jí)別里面,你實(shí)際上不用考慮ASP 與ASP.NET的區(qū)別。你仍然可以使用 DIM RS 的方式,并且用這種方式創(chuàng)建與數(shù)據(jù)及相關(guān)的對(duì)象。這兩者之間的主要區(qū)別是一個(gè)是用VB SCRIPT創(chuàng)建的對(duì)象,另一個(gè)是用VB創(chuàng)建的對(duì)象。
這么說(shuō),你們現(xiàn)在是已經(jīng)改變到一種擁有類型的開(kāi)發(fā)語(yǔ)言平臺(tái)上了?
你說(shuō)的很對(duì),我們有數(shù)據(jù)類型了。我們現(xiàn)在更嚴(yán)格的進(jìn)行應(yīng)用程序的內(nèi)存管理,而不是將每一件事情能夠都看成是變量,我們現(xiàn)在可以將不同的事物看成string、 integer、a data set,因此我們可以更好地控制內(nèi)存的使用。
接下來(lái),我們應(yīng)該演示一些代碼用以解釋上面所說(shuō)的一些東西。
好的。我們的第一個(gè)問(wèn)題是移植問(wèn)題。這是一個(gè)典型的ASP代碼的頁(yè)面,我們將從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)放到表中。我們來(lái)看一下這些代碼,我們首先定義了我們的connection 和我們的 record set, 我們創(chuàng)建了這些對(duì)象,我們用SET關(guān)鍵字設(shè)置我們的record set 等于connection的執(zhí)行。接下來(lái)是一個(gè)DO WHILE 循環(huán),將數(shù)據(jù)庫(kù)中的信息顯示在頁(yè)面上。
<%
Dim con, rs
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=SQLOLEDB;server=(local);database=Northwind;UID=sa;PWD=;"
Set rs = con.Execute("SELECT ContactName, City FROM Customers")
%>
<html>
<body>
<table border="0">
<tr>
<td>ContactName</td>
<td>City</td>
</tr>
<%
Do While Not rs.EOF
%>
<tr>
<td><%=rs("ContactName")%></td>
<td><%=rs("City")%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
</body>
</html>
如果轉(zhuǎn)到.NET框架下,僅需要少量的移植工作。我們可以看見(jiàn)哪些東西已經(jīng)被改變了,哪些東西不能使用了。我們?cè)赟et con = Server.CreateObject("ADODB.Connection")和Set rs = con.Execute("SELECT ContactName, City FROM Customers")中所使用的set之類的關(guān)鍵字一去不復(fù)返了。但是在這里我要指出的是,在下面的代碼中,我們?cè)趓s("ContactName")和rs("City")的右邊添加了一個(gè)屬性Value。他的基本含義是,我們可以獲得指定行或者指定列的值。從ASP到ASP.NET也就這些改動(dòng),實(shí)際上有很少的變化,你可以看到ASP與ASP.NET代碼之間幾乎一樣,沒(méi)有什么特別大的變化。
<%
Dim con, rs
con = Server.CreateObject("ADODB.Connection")
con.Open("Provider=SQLOLEDB;server=(local);database=Northwind;UID=sa;PWD=;")
rs = con.Execute("SELECT ContactName, City FROM Customers")
%>
<html>
<body>
<table border="0">
<tr>
<td>ContactName</td>
<td>City</td>
</tr>
<%
Do While Not rs.EOF
%>
<tr>
<td><%=rs("ContactName").Value%></td>
<td><%=rs("City").Value%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
</body>
</html>
這是很吸引人的,那些SET關(guān)鍵字被去掉了,VALUE關(guān)鍵字被引入,代碼本身實(shí)際上沒(méi)有什么變化,因此只要你看看輸出結(jié)果,你就會(huì)發(fā)現(xiàn)他們基本上是一致的。但是,ASP.NET是運(yùn)行在.NET框架下,他的頁(yè)面擴(kuò)展名是.ASPX,當(dāng)然我們?cè)谠擁?yè)面也可以實(shí)現(xiàn)CACHE的功能,只不過(guò)在這個(gè)程序中沒(méi)有用到罷了。如果我們將上面的實(shí)例進(jìn)一步深入下去并且考慮應(yīng)用.NET框架和ASP.NET框架所提供的一些更為便利的手段。例如,用managed providers來(lái)獲取數(shù)據(jù),那么我們將以入下面這個(gè)事例。我們依然工作在SQL 7.0上的NorthWind數(shù)據(jù)庫(kù)中。
.NET提供了一個(gè)重要手段是SQL managed provide,它可以直接連接到SQL上獲得數(shù)據(jù)而不必通過(guò)OLEDB這樣的東西,這種方式經(jīng)過(guò)實(shí)踐被認(rèn)定是大大提高了訪問(wèn)速度。我們可以看一下下面的代碼,他們使用純粹的VB而不是VBs編寫(xiě)的。但是輸出的結(jié)果幾乎一樣讀。我們要做的事情是import 一些namespaces , System.Data,這樣我們就會(huì)有最基本的數(shù)據(jù)處理能力以及獲得對(duì)SQL managed provider訪問(wèn)能力的 SQL namespace。這些代碼的風(fēng)格與前面討論的C#的風(fēng)格好象很一樣,那時(shí)我們使用C#來(lái)處理基于.NET架構(gòu)的各種類庫(kù),現(xiàn)在我們所見(jiàn)到的在VB中的.NET類庫(kù)與C#中的類庫(kù)具有相同的風(fēng)格。
這兩者之間的確是同一種風(fēng)格。如果我用C#編寫(xiě),代碼會(huì)不同,但是namespace(名字空間)是一致的。對(duì)于編寫(xiě)ASP.NET的程序,這兩種方法都是很好的。盡管某些類可能會(huì)有一些不同,但是我們可以僅僅修改幾個(gè)的地方,就可以將VB代碼快速移植成C#代碼。
實(shí)際上,許多代碼將不會(huì)被改變(一直保留下來(lái))。例如,SQL connection 字符串只需要改變一點(diǎn)點(diǎn), SQL select statement 字符串不會(huì)有什么改變。在這里,我們強(qiáng)調(diào)一下,對(duì)于connection 字符串我們不再使用 ADO provider,不再使用SQL OLEDB作為ADO provider,因?yàn)槲覀兪褂昧薙QL managed provider,因此我們提倡使用SQL7.0以上的版本,他能給我們更好的性能。我們創(chuàng)建一個(gè)data set用以保存我們的數(shù)據(jù)以及后來(lái)訪問(wèn)的結(jié)果。我們用SQLDataSetCommand檢索SELECT的結(jié)果,并返回頁(yè)面,將他們插入到data set中,我們命名這個(gè)表為Customers。因此,我們現(xiàn)在有一個(gè)data set對(duì)象,他包含了一個(gè)Customers表。如果需要的話,我們可以加入更多的表和更多的關(guān)系。與ADO records set不同的是,我們現(xiàn)在可以處理更大的事情,我們可以將整張大表分成若干個(gè)小表,而他們之間的關(guān)系去保持不變,這種方式有利于更大的程序應(yīng)用開(kāi)發(fā)。.
<head>
<script runat="server">
Sub Page_Load(Source As Object, E As EventArgs)
Dim ds As New DataSet
Dim dsc As SQLDataSetCommand
dsc = New SQLDataSetCommand("SELECT ContactName, City FROM Customers", _
"server=localhost;database=Northwind;UID=sa;PWD=;")
dsc.FillDataSet(ds, "Customers")
dgCustomers.DataSource = ds.Tables("Customers").DefaultView
dgCustomers.DataBind()
End Sub
</script>
</head>
.
接下來(lái),我們跳過(guò)幾行代碼,直接顯示與ASP data grid server控件相關(guān)的代碼。ASP data grid server的作用是提供一個(gè)最基本的表。我們要做的唯一的一件事情是告訴他我們要在服務(wù)器端運(yùn)行他,他是服務(wù)器端的控件。接下來(lái)我們?cè)O(shè)置the border寬度為零 ,因?yàn)樯厦娴睦又衎order="0"。此外,我們新加了一個(gè)屬性,他用來(lái)改變items的背景色。他用來(lái)標(biāo)識(shí)在ASP表中不同表格項(xiàng)的顏色,這樣便于區(qū)分。當(dāng)然,你要寫(xiě)很多的代碼,用循環(huán)的方式改變每一個(gè)項(xiàng)目的背景色,在這里我們簡(jiǎn)化一下工作,只是標(biāo)志這個(gè)屬性。他表現(xiàn)的色彩是淺灰色。
<body>
<asp:DataGrid id="dgCustomers" runat="server"
AlternatingItemStyle-BackColor="#CCCCCC"
BorderWidth="0"
/>
</body>
</html>