與剛接觸ASP.NET頁面的開發人員交談時,他們通常向我提出的第一個問題就是:“那個ViewState到底是什么?”他們的語氣中流露出的那種感覺,就象我來到一家異國情調的餐館,侍者端上一道我從未見過的菜餚時的那種感覺-既疑惑不解,又充滿好奇。但肯定有人認為它不錯,否則就不會提供了。所以,我會先嘗一嘗,或許會喜歡上它,盡管它看上去的確很古怪!
對於ViewState也是如此,但是如果適應了它的風格,您會發現在許多情況下,您將樂於在自己的ASP.NET應用程序中使用ViewState,因為它可以幫助您使用更少的代碼完成更多的工作。但是,有時也會對ViewState完全棄之不用。下面我們就這兩種情況分別進行闡述,不過,讓我們先回答什么是ViewState這個問題。
答案:ViewState用於維護頁面的UI狀態
Web是沒有狀態的,ASP.NET頁面也沒有狀態,它們在到服務器的每個往返過程中被實例化、執行、呈現和處理。作為Web開發人員,您可以使用眾所周知的技術(如以會話狀態將狀態存儲在服務器上,或將頁面回傳到自身)來添加狀態。下面我們以圖1中的注冊窗體為例進行論述。
圖1:恢復回傳的窗體值
從上圖中可以看出,我為便餐選擇了一個無效的值。此窗體與Web上的多數窗體一樣友好,它在出現錯誤的字段旁邊顯示一條有用的錯誤消息和一個星號。而且,窗體中還顯示了我在其他文本框和下拉列表中輸入的所有有效值。這在某種程度上是可能的,因為HTML窗體元素會在HTTP標頭中將其當前值從瀏覽器發送到服務器。您可以使用ASP.NET跟蹤來查看回傳的窗體值,如圖2所示。
圖2:HTTP窗體中回傳的值(通過ASP.NET跟蹤顯示)
在ASP.NET之前,通過多次回傳將值恢復到窗體字段中完全是頁面開發人員的責任,他們將不得不從HTTP窗體中逐個拾取回傳值,然后再將其推回字段中。幸運的是,現在ASP.NET可以自動完成這項任務,從而為開發人員免除了一項令人厭煩的工作,同時也無需再為窗體編寫大量的代碼。但這並不是ViewState。
ViewState(英文)是一種機制,ASP.NET使用這種機制來跟蹤服務器控件狀態值,否則這些值將不作為HTTP窗體的一部分而回傳。例如,由Label控件顯示的文本默認情況下就保存在ViewState中。作為開發人員,您可以綁定數據,或在首次加載該頁面時僅對Label編程設置一次,在后續的回傳中,該標簽文本將自動從ViewState中重新填充。因此,除了可以減少繁瑣的工作和代碼外,ViewState通常還可以減少數據庫的往返次數。
ViewState的工作原理
ViewState確實沒有什么神秘之處,它是由ASP.NET頁面框架管理的一個隱藏的窗體字段。當ASP.NET執行某個頁面時,該頁面上的ViewState值和所有控件將被收集並格式化成一個編碼字符串,然后被分配給隱藏窗體字段的值屬性(即<inputtype=hidden>)。由於隱藏窗體字段是發送到客戶端的頁面的一部分,所以ViewState值被臨時存儲在客戶端的瀏覽器中。如果客戶端選擇將該頁面回傳給服務器,則ViewState字符串也將被回傳。在上面的圖2中可以看到ViewState窗體字段及其回傳的值。
回傳后,ASP.NET頁面框架將解析ViewState字符串,並為該頁面和各個控件填充ViewState屬性。然后,控件再使用ViewState數據將自己重新恢復為以前的狀態。
關於ViewState還有三個值得注意的小問題。
如果要使用ViewState,則在ASPX頁面中必須有一個服務器端窗體標記(<formrunat=server>)。窗體字段是必需的,這樣包含ViewState信息的隱藏字段才能回傳給服務器。而且,該窗體還必須是服務器端的窗體,這樣在服務器上執行該頁面時,ASP.NET頁面框架才能添加隱藏的字段。
頁面本身將20字節左右的信息保存在ViewState中,用於在回傳時將PostBack數據和ViewState值分發給正確的控件。因此,即使該頁面或應用程序禁用了ViewState,仍可以在ViewState中看到少量的剩余字節。
在頁面不回傳的情況下,可以通過省略服務器端的<form>標記來去除頁面中的ViewState。
充分利用ViewState
ViewState為跨回傳跟蹤控件的狀態提供了一條神奇的途徑,因為它不使用服務器資源、不會超時,並且適用於任何瀏覽器。如果您要編寫控件,那么肯定需要了解如何在控件中維護狀態(英文)。
開發人員在編寫頁面時同樣可以按照幾乎相同的方式來利用ViewState,只是有時頁面會包含不由控件存儲的UI狀態值。您可以跟蹤ViewState中的值,使用的編程語法與會話和高速緩存的語法類似:
[VisualBasic]
|
[C#]
|
Session,ViewState用法
基本理論:
session值是保存在服務器內存上,那么,可以肯定,大量的使用session將導致服務器負擔加重. 而viewstate由於只是將數據存入到頁面隱藏控件里,不再占用服務器資源,因此, 我們可以將一些需要服務器"記住"的變量和對象保存到viewstate里面. 而sesson則只應該應用在需要跨頁面且與每個訪問用戶相關的變量和對象存儲上. 另外,session在默認情況下20分鍾就過期,而viewstate則永遠不會過期.
數據類型:
但viewstate並不是能存儲所有的.net類型數據,它僅僅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定義的一些類型.
其他考慮
當然,任何事物都有兩面性, 使用viewstate會增加頁面html的輸出量,占用更都的帶寬,這一點是需要我們慎重考慮的. 另外, 由於所有的viewstate都是存儲在一個隱藏域里面,用戶可以很容易的通過查看源碼來看到這個經過base64編碼的值.然后再經過轉換就可以獲取你存儲其中的對象和變量值.
其實,對於viewstate的安全性問題,asp.net還給我們提供了更多的選擇.一般如果要保護viewstate有兩種方式: 一種是防篡改,一種是加密. 一說到防篡改,我們就想起了使用散列代碼. 沒錯, 我們可以在頁面頂部加入如下代碼:Page EnableViewStateMAC=true。這樣asp.net就會自動的在viewstate中追加一個散列碼,在頁面回傳時,服務器根據回傳的viewstate生成一個散列碼,再與回傳的散列碼相比較,如果不對,則丟棄該viewstate,同時控件將恢復初試狀態. (默認情況下asp.net是通過SHA1算法而不是md5算法來生成散列,不過這個可以在machine.config里面配置machineKey validation="MD5"即可),而viewstate加密就更簡單了, 只要在machine.config里設置一下machineKey validation="3DES"即可實現用des加密viewstate了.
使用方法
怎么在客戶端,存取ViewState?
應用環境
一些與安全性無關,數據量較小,需要長時間操作的參數,應該用ViewState存取。
在webgis中,地圖的各種相關狀態,如zoom, center, layers, visibility等,用viewstate存取的話,就不存在session過期的問題,網頁可以永遠使用,甚至可以下載保存,在進行地圖請求,或iframe到第三方的應用中。
Asp.net中的ViewState用法
昨天看到一個文章,作者在自己的頁面中定義了幾個全局變量,類型是static,但是這樣的定義會存在問題,當一個用戶訪問的時候不會有問題,但是當大量用戶並發訪問系統的時候,頁面中的這些static類型的全局變量就會出現問題了,然后作者改用了Session變量保存以前由static類型全局變量紀錄的數據,因為Session是狀態量,只是和某個訪問進程相關,這樣就不會出現由於static類型引起的問題了。
但是這樣的話系統中的Session就太多了,我總認為這樣不太好,雖然每個一個Session都有一個ID不會沖突。ASP.NET引入了ViewState,可以記錄同一個頁面的不同PostBack中的一些數據值。
所以我的解決方法是:使用例如ViewState["name"]這樣的形式記錄以前static的全局變量,這樣就可以避免這個問題了,因為我的系統是在局域網使用的,ViewState帶來的多余的數據量可以忽略不計了。
asp.net ViewState用法:
ASP.NET中的ViewState是ASP.NET中用來保存WEB控件回傳時狀態值一種機制.在WEB窗體(FORM)的設置為runat="server",這個窗體(FORM)會被附加一個隱藏的屬性_VIEWSTATE._VIEWSTATE中存放了所有控件在ViewState中的狀態值.
ViewState是類Control中的一個域,其他所有控件通過繼承Control來獲得了ViewState功能.它的類型是system.Web.UI.StateBag,一個名稱/值的對象集合.
當請求某個頁面時,ASP.NET把所有控件的狀態序列化成一個字符串,然后做為窗體的隱藏屬性送到客戶端.當客戶端把頁面回傳時,ASP.NET分析回傳的窗體屬性,並賦給控件對應的值.當然這些全部是由ASP.NET負責的.
定義ViewState屬性
Public int PageCount
{
get{return(int)ViewState["PageCount"];}
set{ViewState["PageCount"]=value;}
}
使用ViewState的條件
如果要使用ViewState,則在ASPX頁面中必須有一個服務器端窗體標記(<formrunat=server>).窗體字段是必需的,這樣包含ViewState信息的隱藏字段才能回傳給服務器.而且,該窗體還必須是服務器端的窗體,這樣在服務器上執行該頁面時,ASP.NET頁面框架才能添加隱藏的字段.
Page的EnableViewState屬性值為true.
控件的EnableViewState屬性值為true.
提醒:
1.當存在頁面回傳時,不需要維持控件的值就要把ViewState禁止.
2.ViewState的索引是大小寫敏感的.
3.ViewState不是跨頁面的.
4.為了能包存在ViewState中,對象必須是可流化或者定義了TypeConverter.
5.控件TextBox的TextMode屬性設置為Password時,它的狀態將不會被保存在ViewState中,這應該是出於安全性的考慮.
6.在頁面沒有回傳或重定向或在回傳中轉到(transfer)其他頁面時不要使用ViewState.
7.在動態建立控件時要小心它的ViewState.
8.當禁止一個程序的ViewState時,這個程序的所有頁面的ViewState也被禁止了.
9.只有當頁面回傳自身時ViewState才是持續的.
設置ViewState
ViewState可以在控件,頁,程序,全局配置中設置.缺省情況下EnableViewState為true.如果要禁止所有頁面ViewState功能,可以在程序配置中把EnableViewState設為false.
要想學好Java,首先要知道Java的大致分類。我們知道,自從Sun推出Java以來,就力圖使之無所不包,所以Java發展到現在,按應用來分主要 分為三大塊:J2SE,J2ME和 J2EE,這也就是Sun ONE(Open Net Environment)體系。J2SE就是Java2的標准版,主要用於桌面應用軟件的編程;J2ME主要應用於嵌入是系統開發,如手機和PDA的編 程; J2EE是Java2的企業版,主要用於分布式的網絡程序的開發,如電子商務網站和ERP系統。J2SE開發桌面應用軟件比起VC,VB,DEPHI這些 傳統開發語言來說,優勢好象並不明顯。J2ME對於初學者來說,好象又有點深奧,而且一般開發者很難有開發環境。所以現在應用最廣泛又最好學的就是 J2EE了。J2EE又包括許多組件,如 Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要學習起來可不是一兩天的事。
那么又該如何學習J2EE呢?當然Java語法得先看一看的,I/O包,Util包,Lang包你都熟悉了嗎?然后再從JSP學起。如果你學過HTML, 那么事情要好辦的多,如果沒有,那你快去補一補HTML基礎吧。其實JSP中的Java語法也不多,它更象一個腳本語言,有點象ASP。然后你就該學一學 Servlet了。Servlet就是服務器端小程序,他負責生成發送給客戶端的HTML文件。JSP在執行時,也是先轉換成Servlet再運行的。雖 說JSP理論上可以完全取代Servlet,這也是SUN推出JSP的本意,可是Servlet用來控制流程跳轉還
是挺方便的,也令程序更清晰。接下來你應該學習一下Javabean了,可能你早就看不管 JSP在HTML中嵌Java代碼的混亂方式了,這種方式跟ASP又有什么區別呢?還好,SUN提供了Javabean可以把你的JSP中的Java代碼 封裝起來,便於調用也便於重用。接着就是 EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean還是有區別的。它是一個體系結構,你可以搭建更安全、更穩定的企業應用。它 的大量代碼已由中間件(也就是我們常聽到的Weblogic,Websphere這些J2EE服務器)完成了,所
以我們要做的程序代碼量很少,大部分工作都在設計和配置中間件上。至於JDBC,就不用我多說了,你如果用java編過存取數據庫的程序,就應該很熟悉。還有,如果你要用 Java編發送電子郵件的程序,你就得看看Javamail了。
好了,對Java和J2EE有了一些基本概念之后,你就應該編一些程序了,千萬不要紙上談兵哦。最好找一些有實例且帶光盤的書來看,這樣看到好的程序就可 以直接Ctrl+C 再Ctrl+V,也不用勞您老大架再親自把它 再輸一遍吧,再說直接復制還不用怕出錯,何樂而不為呢!還有就是要經常上一些好的Java編程文章,有好的文章要Cut下來,有問題盡管問,只要問題不是 太傻,一般高手都會回答你的。下面介紹幾個好的Java方面的編程網站:
CSDN論壇 http://www.csdn.net/ 中國最有名的技術論壇,《程序員》雜志就是他們出版的,你可以在上面提出問題,馬上就有人回答你,如果你覺得好,你可以給那人加分;
Java研究組織http://www.javaresearch.org/ 上面有很多原創文章,高手還是挺多 的;
Java開發者 http://www.chinajavaworld.com/ 那里Java資料比較全;
java.com.cn http://www.java.com.cn/ 看這域名就知道有多牛,注冊用戶快接近一 萬了,同時在線人數也在一千左右,人氣很旺的;
IBM的開發者網絡 http://www-900.ibm.com/developerWorks/cn/java/index.shtml
IBM永遠的藍色巨人!!!
那么我書也看了,程序也做了,別人問我的問題我都能解決了,是不是就成為高手了呢?當然沒那么簡單,這只是萬里長征走完了第一步。不信?那你出去接一個項 目,你知道怎么下手嗎,你知道怎么設計嗎,你知道怎么組織人員進行開發嗎?你現在腦子里除了一些散亂的代碼之外,可能再沒有別的東西了吧!你現在最缺的是 實際的工作經驗,而不是書本上那些憑空想出來的程序。所以你快去找一份Java的編程工作來做吧(如果是在校學生可以去做兼職啊),在實踐中提高自己,那 才是最快的。不過你得祈
禱在公司里碰到一個高手,而且他還願意不厭其煩地教你,這樣好象有點難哦!
還有一個辦法就是讀開放源碼的程序了。我們知道開放源碼大都出自高手,他們設 計合理,考慮周到,再加上有廣大的程序員參與,代碼的價值自然是字字珠嘰,鏗鏘有 力(對不起,偶最近《金裝四大才子》看多了)。學Java必讀的兩個開源程序就是Jive 和Pet Store.。Jive是國外一個非常著名的BBS程序,完全開放源碼。論壇的設計采用 了很多先進的技術,如Cache、用戶認證、Filter、XML等,而且論壇完全屏蔽了對數據庫的訪問,可以很輕易的在不同數據庫中移植。論壇還有方便 的安裝和管理程序,這是
我們平時編程時容易忽略的一部份(中國程序員一般只注重編程的技術含量,卻完全不考慮用戶的感受,這就是我們與國外軟件的差距所在)。Jive 的資料在很多網站上都有,大家可以找來研究一下。相信你讀完代碼后,會有脫胎換骨的感覺。遺憾的是Jive 從2.5以后就不再無條件的開放源代碼,同時有licence限制。不過幸好還有中國一流的Java程序員關注它,外國人不開源了,中國人就不能開源嗎? 這里向大家推薦一個漢化的Jive版本—J道。Jive(J道版)是由中國Java界大名鼎鼎的banq在Jive 2.1版本基礎上改編而成, 全中文,增加了一些實用功能,如貼圖,用戶頭像和用戶資料查詢等,而且有一個開發團隊在不斷升級。你可以訪問banq的網站http://www.jdon.com/ 去下載,或到同濟技術論壇的服務器上ftp://nro.shtdu.edu.cn去下,安裝上有什么問題,可以到論壇上去提問。Pet Store.(寵物店)是SUN公司為了演示其J2EE編程規范而推出的開放源碼的程序,應該很具有權威性,想學J2EE和EJB的朋友不要錯過了。
你一定會高興地說,哈哈,原來成為Java高手就這么簡單啊!記得Tomjava也曾碰到過一個項目經理,號稱Java很簡單,只要三個月就可以學會。其 實說這種話的人就如當年小日本號稱“三個月拿下中國”一樣大言不慚。不是Tomjava潑你冷水,你現在只是學到了Java的骨架,卻還沒有學到Java 的精髓。接下來你得研究設計模式了。設計模式是高級程序員真正掌握面向對象核心思想的必修課。設計模式並不是一種具體"技術", 它講述的是思想,它不僅僅展示了接口或抽象類在實際案例中的靈活應用和智慧,讓你
能夠真正掌握接口或抽象類的應用,從而在原來的Java語言基礎上躍進一步,更重要的是,設計模式反復向你強調一個宗旨:要讓你的程序盡可能的可重用。關於設計模式的資料,還是向大家推薦banq的網站http://www.jdon.com/ ,他把GOF的23種模式以通俗易懂的方式詮釋出來,純Java描述,真是經典中的經典。有時間再研究一下MVC結構(把Model-View- Control分離開的設計思想)吧,現在很流行的Structs就是它的一種實現方式,不過Structs用起來實在是很繁,我們只要學習其精髓即可, 我們完全可以設計自己的MVC結構。然后你再研究一下軟件Refactoring(重整)和極限XP編程,相信你 又會上一個台階。
做完這些,你不如整理一下你的Java代碼,把那些經典的程序和常見的應用整理出來,再精心打造一番,提高其重用性和可擴展性。你再找幾個志同 道合的朋友成立一個工作室吧,你可以去承接一些項目做了,一開始可能有些困難,可是你有技術積累,又考慮周全,接下項目來可以迅速作完,相信大家以后都會 來找你的,所以 Money就嘩啦啦的 來了。。。。。。
當然你也可以參加一些開源項目,一方面可以提高自己,另一方面也是為中國軟件事業做貢獻嘛!開發者在互聯網上用CVS合作開發,用QQ,MSN,E-mail討論聯系,天南海北的程序員分散在各地卻同時開發同一個軟件,是不是很有意思呢?
下面介紹兩個好的開源項目網站:
湖北省軟件公共開發平台http://gro.clinux.org/
共創聯盟http://cosoft.org.cn/
哇,好高興哦,我終於成為高手了!非也,非也。古人雲:“山外有山、人外有人”。
你知道計算機界現在的發展形勢嗎?你知道微軟的.NET藍圖和SUN ONE計划之間的明爭暗斗嗎?你知道計算機技術將向何處發展嗎?其實從各大計算機廠商最近的動作,都可以看出來“Web服務將是下一代互聯網應用的制高點 ”,而微軟的.NET藍圖和SUN ONE計划的斗爭焦點,也就是Web服務。 Web服務就是一個嶄新的分布式計算模型,它是一系列標准的綜合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同語言編寫的軟件能夠輕 易的集成起來,使網絡資源和Web站點變成一種服務而不是混亂的垃圾場。不遠的將來,我們就可以在家里點擊一下鼠標,就可以完成出門旅游的全部准備工作, 包括定飛機票,定旅游線路,定好房間等。請注意,這所有的一切都是Web站點間自動完成的,再也不用象現在一樣,表面上是電子商務,實際上很多環節都是人 工操作。也許你會覺得這是天方夜談,不過就近的說,你也很有可能承接一個項目,要集成兩個企業的ERP系統。很有可能上游企業的系統是用Dephi編的, 而下游企業的系統是用Java編的。你說你是Java高手,大家都看者你怎么做呢。所以啊,你還得學習新技術,如Web服務,而且你Dephi也要懂一點 吧(Dephi6現在已經提供Web服務的控件了)。 你編的Java系統,可能要和.NET集成,所以你.NET要懂一點吧?到最后,你可能發現你已經成為Java高手了,但很多時間卻在搞別的技術。太極張 三豐里說,最厲害的招式就是沒有招式,可能就是這個道理吧!
因為剛剛興起,所以網上Web服務的資料不是很多,我還是給大家推薦幾個網站吧:
中國UDDI技術聯盟http://www.uddi-china.org/
(IBM的開發者網絡的XML&Web Service專欄:
http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服務的力推者
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/JavaNormandy/archive/2010/01/30/5271558.aspx