todayx.org
          todayx.org
          posts - 39,comments - 60,trackbacks - 0
               摘要: JDBC模板類 概述        Spring JDBC抽象框架core包提供了JDBC模板類,其中JdbcTemplate是core包的核心類,所以其他模板類都是基于它封裝完成的,JDBC模板類是第一種工作模式。          JdbcTemplate類通過模板...  閱讀全文
          posted @ 2012-02-26 09:39 todayx.org 閱讀(2723) | 評論 (0)編輯 收藏

          在軟件這個行業里有些規則是很有殺傷力的,比如很有名的摩爾定律。

          總結出這些規則的意義在于可以大致的照明方向,免得努力來努力去卻走到了陰溝里。

          現實中種種利益紛爭、觀點之爭看似紛繁,但在大時間尺度下來看卻都是規則的實現手段。

          這就好比下圍棋,每一手都要為謀得利益而計算,但結局卻只有三種:贏、輸或和,這就是規則的力量。

           

          民以食為天,所以第一定律從收入開始。

           

          程序員第一定律可以表述為:程序員的收入是技能復雜度和技能實現可能程度的函數。

          如果程序員的工資是S,社會平均水平的工資為A,程序員掌握的技能復雜度為C,實現程度為P。

          那么S = A x C x P。

           

          這里面的實現程度P不太好理解,額外做點說明。

          好比說有人在東北種了很多白菜,并獲得了大豐收。與此同時廣州也確實需要大白菜,按批發價他的這批白菜可以買10萬。

          但關鍵是這個人找不到車皮,大白菜就只能在當地零售,這個時候這批大白菜就只能買1萬塊錢。

          這就是實現程度。

          大白菜內蘊了既定的價值,這種價值并不因為賣多少錢而改變,但這種價值能實現到什么程度則依賴于現實的可能性。

           

          這視乎很簡單,但其實不是,很多人的一生就籠罩在這條定律下面,我們來基于這第一定律繼續做些推導。

           

          • 推論1:越容易上手的技術,其內蘊價值越低。

           

          技能的復雜度C可以大致等價于掌握一門技術所需要的時間。

           

          各種集成的開發環境,各種容易學習的類庫等使軟件開發的門檻降得很低,這對整個產業是有利的,但對個體而言則是不利的。

          你花5個月可以學會的技術,其他人花5個月也可以學會,而5個月可以學會的東西所蘊含的價值一定是低的。

          與之相對5年才可以學會的東西,其內蘊價值一定是高的。

          內蘊價值低,所對應的收入必然偏低。

           

          為避免爭議,我這里就不寫技術的名字了,但大家可以從學習所需要的時間上來對各種技術做個分類。

           

          有時候很多人會有一種錯覺,認為越熱門的技術收益越好。

          這在大多時候是錯的。

          越熱的技術,越成熟的技術越是大眾的,而越是大眾的技術內蘊價值越低,所以收益越不好。

          熱度能夠幫助找到工作,但對技能復雜度C沒有影響。

           

          • 推論2:單純的涉獵廣泛,沒有專精,對收入的影響是負面的。

          各種技術的復雜度大概是呈指數增長的,越到后面前進一步越困難。

          好比說學會5門語言所需要的時間大多時候遠比學精一門語言要短。

          在特定年紀尚,每樣技術都會一點,對提高實現程度P略有幫助,但自身可替代性很強,對技能復雜度C的影響為負面。

          長期來看得不償失。

           

          • 推論3:實現程度P越高,風險越大。

          有些技術領域很窄,上手也慢,實現程度卻高,比如顯卡驅動,打印驅動等。

          但這類工作好比在鋼絲上跳舞:只要能實現自己的價值,那么回報大體不錯,但最怕技術更迭。

          技術一換代,可能多年積累十去六七。

           

          總結來看,程序員要想獲得不錯的收入,第一要掌握稀缺的技術,即技術的內蘊價值要高;第二要找到實現稀缺技術的場景。

          《微軟的秘密》一書中提到,微軟里面優秀的程序員是可以擁有許多輛保時捷的。

          用上面兩條做分解,就會發現原因很簡單:

          一是這樣的人是NT的核心開發人員,這類人員內蘊價值極高,處于稀缺狀態;二是微軟提供了實現這種技能內蘊價值的機會。

          這二者缺一不可。

          #根據大家的回復做了點修改把"實現可能性"替換成了"實現程度"。


          2012世界末日暨環境保護主題站,關注國內外最新2012世界末日信息,旨在通過關注,收集,展示2012世界末日相關資料的方式,喚醒并提高人們保護環境與愛護地球的意識,引導人類保護環境.
          posted @ 2012-02-14 22:03 todayx.org 閱讀(557) | 評論 (4)編輯 收藏

          什么是HTTP協議

          協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器

           

          目前我們使用的是HTTP/1.1 版本

          Web服務器,瀏覽器,代理服務器

          當我們打開瀏覽器,在地址欄中輸入URL,然后我們就看到了網頁。 原理是怎樣的呢?

          實際上我們輸入URL后,我們的瀏覽器給Web服務器發送了一個Request, Web服務器接到Request后進行處理,生成相應的Response,然后發送給瀏覽器, 瀏覽器解析Response中的HTML,這樣我們就看到了網頁,過程如下圖所示

           

           

           

          我們的Request 有可能是經過了代理服務器,最后才到達Web服務器的。

          過程如下圖所示

           

          代理服務器就是網絡信息的中轉站,有什么功能呢?

          1. 提高訪問速度, 大多數的代理服務器都有緩存功能。

          2. 突破限制, 也就是翻-墻了

          3. 隱藏身份。

           

          URL詳解

           URL(Uniform Resource Locator) 地址用于描述一個網絡上的資源,  基本格式如下

          schema://host[:port#]/path/.../[?query-string][#anchor]

          scheme               指定低層使用的協議(例如:http, https, ftp)

          host                   HTTP服務器的IP地址或者域名

          port#                 HTTP服務器的默認端口是80,這種情況下端口號可以省略。如果使用了別的端口,必須指明,例如 http://www.cnblogs.com:8080/

          path                   訪問資源的路徑

          query-string       發送給http服務器的數據

          anchor-             錨

           

          URL 的一個例子

          http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff  Schema:                 http host:                   www.mywebsite.com path:                   /sj/test Query String:           name=sviergn&x=true Anchor:                 stuff

           

          HTTP協議是無狀態的

          http協議是無狀態的,同一個客戶端的這次請求和上次請求是沒有對應關系,對http服務器來說,它并不知道這兩個請求來自同一個客戶端。 為了解決這個問題, Web程序引入了Cookie機制來維護狀態.

           

          HTTP消息的結構

          先看Request 消息的結構,   Request 消息分為3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之間有個空行, 結構如下圖

          第一行中的Method表示請求方法,比如"POST","GET",  Path-to-resoure表示請求的資源, Http/version-number 表示HTTP協議的版本號

          當使用的是"GET" 方法的時候, body是為空的

          比如我們打開博客園首頁的request 如下

          GET http://www.cnblogs.com/ HTTP/1.1 Host: www.cnblogs.com

          下面我們打開Fiddler 捕捉一個博客園登錄的Request 然后分析下它的結構, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息,   如下圖

           

          我們再看Response消息的結構, 和Request消息的結構基本一樣。 同樣也分為三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之間也有個空行,  結構如下圖

          HTTP/version-number表示HTTP協議的版本號,  status-code 和message 請看下節[狀態代碼]的詳細解釋.

          我們用Fiddler 捕捉一個博客園首頁的Response然后分析下它的結構, 在Inspectors tab下以Raw的方式可以看到完整的Response的消息,   如下圖

           

           

          Get和Post方法的區別

          Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個URL地址用于描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應著對這個資源的查,改,增,刪4個操作。 我們最常見的就是GET和POST了。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息.

          我們看看GET和POST的區別

          1. GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的數據放在HTTP包的Body中.

          2. GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.

          3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。

          4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該用戶的賬號和密碼.

           

          狀態碼

          Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

          狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.

          HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別

          1XX  提示信息 - 表示請求已被成功接收,繼續處理

          2XX  成功 - 表示請求已被成功接收,理解,接受

          3XX  重定向 - 要完成請求必須進行更進一步的處理

          4XX  客戶端錯誤 -  請求有語法錯誤或請求無法實現

          5XX  服務器端錯誤 -   服務器未能實現合法的請求

           

          看看一些常見的狀態碼

          200 OK

          最常見的就是成功響應狀態碼200了, 這表明該請求被成功地完成,所請求的資源發送回客戶端

          如下圖, 打開博客園首頁

           

          302 Found

          重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request

          例如在IE中輸入, http://www.google.com. HTTP服務器會返回304, IE取到Response中Location header的新URL, 又重新發送了一個Request.

           

          304 Not Modified

          代表上次的文檔已經被緩存了, 還可以繼續使用,

          例如打開博客園首頁, 發現很多Response 的status code 都是304

          提示: 如果你不想使用本地緩存可以用Ctrl+F5 強制刷新頁面

           

          400 Bad Request  客戶端請求與語法錯誤,不能被服務器所理解

          403 Forbidden 服務器收到請求,但是拒絕提供服務

          404 Not Found

          請求資源不存在(輸錯了URL)

          比如在IE中輸入一個錯誤的URL, http://www.cnblogs.com/tesdf.aspx

           

          500 Internal Server Error 服務器發生了不可預期的錯誤

          503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

           

          HTTP Request header

          使用Fiddler 能很方便的查看Reques header, 點擊Inspectors tab ->Request tab-> headers  如下圖所示.

          header 有很多,比較難以記憶,我們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

          Cache 頭域

          If-Modified-Since

          作用: 把瀏覽器端緩存頁面的最后修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行對比。如果時間一致,那么返回304,客戶端 就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容??蛻舳私拥街?,會丟棄舊文件,把新文件緩存起來,并顯示在瀏覽器中.

          例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

          實例如下圖

           

          If-None-Match

          作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用 本地緩存文件。否則將返回200狀態和新的資源和Etag.  使用這樣的機制將提高網站的性能

          例如: If-None-Match: "03f2b33c0bfcc1:0"

          實例如下圖

           

          Pragma

          作用: 防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣

          Pargma只有一個用法, 例如: Pragma: no-cache

          注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

           

          Cache-Control

          作用: 這個是非常重要的規則。 這個用來指定Response-Request遵循的緩存機制。各個指令含義如下

          Cache-Control:Public   可以被任何緩存所緩存()

          Cache-Control:Private     內容只緩存到私有緩存中

          Cache-Control:no-cache  所有內容都不會被緩存

          還有其他的一些用法, 我沒搞懂其中的意思, 請大家參考其他的資料

           

          Client 頭域

          Accept

          作用: 瀏覽器端可以接受的媒體類型,

          例如:  Accept: text/html  代表瀏覽器可以接受服務器回發的類型為 text/html  也就是我們常說的html文檔,

          如果服務器無法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)

          通配符 * 代表任意類型

          例如  Accept: */*  代表瀏覽器可以處理所有類型,(一般瀏覽器發給服務器都是發這個)

           

          Accept-Encoding:

          作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼);

          例如: Accept-Encoding: gzip, deflate

           

          Accept-Language

          作用: 瀏覽器申明自己接收的語言。 

          語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;

          例如: Accept-Language: en-us

           

          User-Agent

          作用:告訴HTTP服務器, 客戶端使用的操作系統和瀏覽器的名稱和版本.

          我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神 奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器 和其它屬性告訴服務器。

          例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

           

          Accept-Charset

          作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案);

          例如:

           

          Cookie/Login 頭域

          Cookie:

          作用: 最重要的header, 將cookie的值發送給HTTP 服務器

          Entity頭域

          Content-Length

          作用:發送給HTTP服務器數據的長度。

          例如: Content-Length: 38

           

          Content-Type

          作用:

          例如:Content-Type: application/x-www-form-urlencoded

           

          Miscellaneous 頭域

          Referer:

          作用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鏈接到一個朋友那里,他的服務器就能夠從HTTP Referer中統計出每天有多少用戶點擊我主頁上的鏈接訪問他的網站。

          例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

          Transport 頭域

          Connection

          例如: Connection: keep-alive   當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

          例如:  Connection: close  代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

           

          Host(發送請求時,該報頭域是必需的)

          作用: 請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的

          例如: 我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html

          瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下:

          Host:http://www.guet.edu.cn

          此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號

           

          HTTP Response header

          同樣使用Fiddler 查看Response header, 點擊Inspectors tab ->Response tab-> headers  如下圖所示

           我們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

          Cache頭域

          Date

          作用:  生成消息的具體時間和日期

          例如: Date: Sat, 11 Feb 2012 11:35:14 GMT 

           

          Expires

          作用: 瀏覽器會在指定過期時間內使用本地緩存

          例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

           

          Vary

          作用:

          例如: Vary: Accept-Encoding

           

          Cookie/Login 頭域

          P3P

          作用: 用于跨域設置Cookie, 這樣可以解決iframe跨域訪問cookie的問題

          例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

           

          Set-Cookie

          作用: 非常重要的header, 用于把cookie 發送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.

          例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

           

          Entity頭域

          ETag

          作用:  和If-None-Match 配合使用。 (實例請看上節中If-None-Match的實例)

          例如: ETag: "03f2b33c0bfcc1:0"

           

          Last-Modified:

          作用: 用于指示資源的最后修改日期和時間。(實例請看上節的If-Modified-Since的實例)

          例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

           

          Content-Type

          作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集,

          例如:

          Content-Type: text/html; charset=utf-8

          Content-Type:text/html;charset=GB2312

          Content-Type: image/jpeg

           

          Content-Length

          指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程中,Content-Length的方式要預先在服務器中緩存所有數據,然后所有數據再一股腦兒地發給客戶端。

          例如: Content-Length: 19847

           

          Content-Encoding

          WEB服務器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應中的對象。

          例如:Content-Encoding:gzip

           

          Content-Language

          作用: WEB服務器告訴瀏覽器自己響應的對象的語言者

          例如: Content-Language:da

           

          Miscellaneous 頭域

          Server:

          作用:指明HTTP服務器的軟件信息

          例如:Server: Microsoft-IIS/7.5

           

          X-AspNet-Version:

          作用:如果網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本

          例如: X-AspNet-Version: 4.0.30319

          X-Powered-By:

          作用:表示網站是用什么技術開發的

          例如: X-Powered-By: ASP.NET

          Transport頭域

          Connection

          例如: Connection: keep-alive   當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

          例如:  Connection: close  代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。

          Location頭域

          Location

          作用: 用于重定向一個新的位置, 包含新的URL地址

           實例請看304狀態實例

           

          HTTP協議是無狀態的和Connection: keep-alive的區別

          無狀態是指協議對于事務處理沒有記憶能力,服務器不知道客戶端是什么狀態。從另一方面講,打開一個服務器上的網頁和你之前打開這個服務器上的網頁之間沒有任何聯系

          HTTP是一個無狀態面向連接的協議,無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)

          從HTTP/1.1起,默認都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接

           Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-14 21:58 todayx.org 閱讀(331) | 評論 (3)編輯 收藏

          作為一個開發者,尤其是web開發人員,我想你有必要去了解這一系列的處理流程,在這期間,瀏覽器和服務器到底是如何打交道的?服務器又是如何處理的?瀏覽器又是如何將網頁顯示給用戶的呢?......

          疑惑和細節真是太多了。坦白講,要想徹徹底底的弄清楚以上每個疑惑和處理細節,至少需要十本書的厚度,所謂“底層無極限”嘛,而且不同的web服務 器和服務器端編程語言的實現和處理流程不盡相同(但本質都是相通的)。本文中,我將根據http協議的有關知識,跟大家講解一些web開發的本質。不管你 是從事.NET,還是J2EE或者php開發等等,都離不開這些本質。希望你讀完本文,能有新的收獲和見解。由于本人水平和經驗有限,難免有誤,望讀者見 諒。

           

          何為http協議(Hypertext Transfer Protocol,超文本傳輸協議)?

          所謂協議,就是指雙方遵循的規范。http協議,就是瀏覽器和服務器之間進行“溝通”的一種規范。我們在看空間,刷微博...都是在使用http協議,當然,遠遠不止這些應用。

          筆者一直聽說http是屬于“應用層的協議”,而且是基于TCP/IP協議的。這個不難理解,如果你上大學時候學過“計算機網絡”的課程,就一定知 道OSI七層參考協議(我當時是死記硬背的)。如果你接觸過socket網絡編程,就應該明白TCP和UDP這兩種使用廣泛的通信協議(建立連接、三次握 手等等,當然,這不是本文討論的重點)。如圖:

          既然TCP/UDP是廣泛使用的網絡通信協議,那為啥有多出個http協議來呢?

          筆者曾自己動手寫過一個簡單的web服務器處理軟件,根據我的推斷(不一定準確)。UDP協議具有不可靠性和不安全性,顯然這很難滿足web應用的需要。

          而TCP協議是基于連接和三次握手的,雖然具有可靠性,但人具有一定的缺陷。但試想一下,普通的C/S架構軟件,頂多上千個Client同時連接,而B/S架構的網站,十萬人同時在線也是很平常的事兒。如果十萬個客戶端和服務器一直保持連接狀態,那服務器如何滿足承載呢?

          這就衍生出了http協議?;赥CP的可靠性連接。通俗點說,就是在請求之后,服務器端立即關閉連接、釋放資源。這樣既保證了資源可用,也吸取了TCP的可靠性的優點。

          正因為這點,所以大家通常說http協議是“無狀態”的,也就是“服務器不知道你客戶端干了啥”,其實很大程度上是基于性能考慮的。以至于后來有了session之類的玩意。

           

          實戰準備工作:

          在監視網絡方面,windows平臺上有一款叫做Sniffer的優秀軟件,這也是很多“黑客”經常使用的嗅探工具。 在研究http協議時,推薦大家使用一款

          叫作httpwatch的工具。(遺憾的是,該工具是收費的。該咋辦就咋辦,你懂的)。安裝完成后,可以在IE瀏覽器的tools中直接打開(目前也支持firefox)。如圖所示:


           

           

           

           

           

           

          點擊Record,就可以開始監視并記錄http消息了。stop、Clear等等按鈕的功能,這里就不一一介紹了。拿實例來說話,下面就是我記錄訪問main.aspx頁面的時候記錄的,能夠清晰的看到http報文消息的詳細信息,如圖:

          學習http協議,主要需要了解http的請求和響應(當然,還有get、post等請求方式,狀態碼、URI、MIME等)


          首先看看http請求消息(就是瀏覽器丟給服務器的):


          一個http請求代表客戶端瀏覽器向服務器發送的數據。一個完整的http請求消息,包含一個請求行,若干個消息頭(請求頭),換行,實體內容

          請求行:描述客戶端的請求方式、請求資源的名稱、http協議的版本號。 例如: GET/BOOK/JAVA.HTML HTTP/1.1

          請求頭(消息頭)包含(客戶機請求的服務器主機名,客戶機的環境信息等):
          Accept:用于告訴服務器,客戶機支持的數據類型  (例如:Accept:text/html,image/*)
          Accept-Charset:用于告訴服務器,客戶機采用的編碼格式
          Accept-Encoding:用于告訴服務器,客戶機支持的數據壓縮格式
          Accept-Language:客戶機語言環境
          Host:客戶機通過這個服務器,想訪問的主機名
          If-Modified-Since:客戶機通過這個頭告訴服務器,資源的緩存時間
          Referer:客戶機通過這個頭告訴服務器,它(客戶端)是從哪個資源來訪問服務器的(防盜鏈)
          User-Agent:客戶機通過這個頭告訴服務器,客戶機的軟件環境(操作系統,瀏覽器版本等)
          Cookie:客戶機通過這個頭,將Coockie信息帶給服務器
          Connection:告訴服務器,請求完成后,是否保持連接
          Date:告訴服務器,當前請求的時間

          (換行)
          實體內容:
          就是指瀏覽器端通過http協議發送給服務器的實體數據。例如:name=dylan&id=110
          (get請求時,通過url傳給服務器的值。post請求時,通過表單發送給服務器的值)
           
          再看看HTTP響應消息(服務器返回給瀏覽器的):

          一個http響應代表服務器端向客戶端回送的數據,它包括:
          一個狀態行,若干個消息頭,以及實體內容

          響應頭(消息頭)包含:
          Location:這個頭配合302狀態嗎,用于告訴客戶端找誰
          Server:服務器通過這個頭,告訴瀏覽器服務器的類型
          Content-Encoding:告訴瀏覽器,服務器的數據壓縮格式
          Content-Length:告訴瀏覽器,回送數據的長度
          Content-Type:告訴瀏覽器,回送數據的類型
          Last-Modified:告訴瀏覽器當前資源緩存時間
          Refresh:告訴瀏覽器,隔多長時間刷新
          Content- Disposition:告訴瀏覽器以下載的方式打開數據。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                        context.Response.WriteFile("aa.jpg");
          Transfer-Encoding:告訴瀏覽器,傳送數據的編碼格式
          ETag:緩存相關的頭(可以做到實時更新)
          Expries:告訴瀏覽器回送的資源緩存多長時間。如果是-1或者0,表示不緩存
          Cache-Control:控制瀏覽器不要緩存數據   no-cache
          Pragma:控制瀏覽器不要緩存數據          no-cache

          Connection:響應完成后,是否斷開連接。  close/Keep-Alive
          Date:告訴瀏覽器,服務器響應時間

          理解了以上的http請求消息和響應消息,相信你對于http協議已經理解得足夠深刻了。關于http協議的更多具體細節,可以參照http RFC文檔

          大致步驟就是:瀏覽器先向服務器發送請求,服務器接收到請求后,做相應的處理,然后封裝好響應報文,再回送給瀏覽器。瀏覽器拿到響應報文后,再通過 瀏覽器引擎去渲染網頁,解析DOM樹,javascript引擎解析并執行腳本操作,插件去干插件該干的事兒...關于瀏覽器渲染、解析的原理,可以參考 http://kb.cnblogs.com/page/129756/

          說白了,所謂web的本質,無非是:請求/處理/響應 ,任何的web服務器,任何的服務端編程語言,都沒法脫離這個本質。 而瀏覽器端解析html、圖片等靜態內容,呈現給用戶,腳本引擎執行腳本代碼,完成腳本代碼要做的事兒(例如dom操作,css屬性更改,發送ajax請 求等等)。

          筆者淺淺的認為,其實瀏覽器就是一種特殊的Client,而B/S架構也是一種特殊的C/S架構。這里值得一提的是,不同的web服務器和編程語 言,又是如何接收用戶http請求。如何處理,如何響應的呢?筆者拿熟悉的ASP.NET為例,通過反編譯工具查看源代碼(微軟這家伙實在封裝的太好了) 從底層進行了剖析,如圖:

          由于篇幅有限,無法再繼續將asp.net、iis web服務器的細節及底層實現再做進一步地進行剖析了。因為微軟的asp.net技術體系實在龐大,而且很復雜。有時間筆者會繼續更新系列文章,歡迎讀者繼續關注。


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-14 21:56 todayx.org 閱讀(279) | 評論 (0)編輯 收藏
               
          2012世界末日暨環境保護主題站,關注國內外最新2012世界末日信息,旨在通過關注,收集,展示2012世界末日相關資料的方式,喚醒并提高人們保護環境與愛護地球的意識,引導人類保護環境.



                最近一直比較忙,所以一連幾天都沒有更新。本來覺得沒什么,后來有幾個網友都問起為什么沒有更新,才覺得大家對我的博客還是比較關心的。于是覺得挺對不起大家的。終于到了周末,昨天晚上忙乎了一晚上,寫了個Swing演示,今天把它共享出來,算是彌補。 

            

              收到一個朋友的郵件說如何在Swing中實現組件的動畫效果,就像JIDE的那些組件一樣。的確Swing框架的靈活性和可擴展性,使得它非常適合做這樣Makeover工作。我簡單總結一了以下,這種組件不外乎要有以下三種元素:

              1.外觀華麗。這包括使用漸變色,線條和字體反走樣,圖標設計漂亮搶眼,界面變化要柔和等等。但要避免設計太花哨,給人華而不實的感覺。原則上避免顏色太 碎,圖標應以簡潔為主,不可濫用圖片等。技術上沒有多大要求,主要是美工,你需要掌握各種做圖工具,自己最好有好的審美和設計能力。

              2.動畫效果。組件行為變化要柔和化,盡量使用動畫效果,如淡入淡出、滾動彈出等等。技術上最常用的方法是使用javax.swing.Timer。為什 么要使用javax.swing.Timer,這是因為javax.swing.Timer觸發的事件都在EDT上執行,是線程安全的。除此外還需掌握 Java 2D的常用接口及圖像處理的常見技巧。

              3.空間布局。這種組件空間布局的特點是立體、動態、拖拽式的。這和人的認知能力有關。人類認知的特點是具體到抽象。二維、靜態和鍵盤式操作對普通用戶來 說太過抽象和專業化,需要一定的輔助學習才能理解的。而三維、動態、拖拽式操作更貼近于感性的認知范疇。因此這類組件經常有浮動式窗口、組件布局動態變化 及拖拽式操作等特征。實現技術包括布局管理器(LayoutManager)、Swing組件分層結構、Swing事件體系結構以及DnD接口等。   

              美工對于java程序員來說可能比較缺乏,但是華麗外觀不僅僅是美工技術,這包括一些宏觀設計原則。java程序員完全可以通過掌握這些方針原則來提高自 己的設計水平。前面文章介紹那個《Swing外觀設計方針》就是一本這樣的書。至于美工,我覺得如果你有美術天分,那就要充分利用;如果沒有,那么你可以 模仿,熟悉幾種的圖形工具就完全可以不用自己的畫圖做出比較漂亮的圖標、圖片(當然沒有考慮版權問題)。我就是后者,但是我發現我平時只需要PrScrn 鍵(抓圖)、Paint(Windows 畫圖工具,切圖、剪裁、轉換格式)、PowerPoint/OpenOffice Imprise(畫圖)、Google Image(搜索圖片)就已經足夠了。其他所需的技術就需要你掌握Swing和Java 2D方方面面的技術了。當然復雜的組件不僅僅是靠掌握這些技術能解決的,可能你還需要能比較好地熟悉各種編程模式。   

              這個朋友特別提到Windows上的折疊式操作面板,他說:   

              另外,我對JIDE中兩個東西很感興趣,一個是CollapsiblePanel(Windows Explorer左邊的常見任務),點擊后折疊、展開子面板,而且是動畫效果

              因此昨晚就特地試了一下。雖然以前就大概明白使用Timer和布局管理器以及圖像處理就可以實現這些東西,但一直沒有做。昨晚的實驗還是很成功的,大概花 了兩個小時就實現了這個面板。工作過程大概就是分解這些面板組件、解析那部分需要動畫、應該在哪兒觸發何種事件。另外就是編寫這些組件,不斷調試。這個過 程的大部分時間都被效果調整占去了。你需要不斷的運行程序,抓取屏幕,然后將它帖到Paint中,然后放大,然后和Windows上的抓圖比較,包括大 小、尺寸、顏色、字體、微觀變化等等。最后算是基本實現了Windows這個折疊式的面板組件。下面的是我的演示程序的一個抓圖:

          高級Swing組件makeover的三要素   

          這個是淡出淡入動畫效果:

          高級Swing組件makeover的三要素   

              下面的Enable Animation的JCheckBox可以設置是否使用動畫效果。選擇上折疊和展開就具有動畫效果。   

              這個組件的類名是dyno.swing.beans.FolderPane。使用比較簡單: 

              FolderPane fp=new FolderPane();//設置是否有動畫效果,缺省沒有
              fp.setAnimated(true);//添加子面板      
              fp.addFolder("文件和文件夾任務", getFileFolderPane());      
              fp.addFolder("其他位置", getOtherPlacePane());      
              fp.addFolder("詳細信息", getDetailsPane());      
              add(fp, BorderLayout.CENTER);  

                  主要接口有兩個:  

              設置是否要動畫效果      
              public void setAnimated(boolean b)
              添加面板,title是面板標題文字,content是應用程序組件
              public void addFolder(String title, JComponent content)
           
             這個演示的源碼可以從這兒下載,是一個NetBeans工程。編譯之后,直接雙擊foldered_pane.jar既可觀看效果。源代碼中有詳細的注解。

              更新:剛剛修改了一下,現在可以支持JScrollPane,即能放到JScrollPane,并能在動畫時動態的更新JScrollPane狀態。

          高級Swing組件makeover的三要素


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-08 21:26 todayx.org 閱讀(365) | 評論 (2)編輯 收藏
          主站蜘蛛池模板: 历史| 建德市| 宜城市| 加查县| 葫芦岛市| 兰溪市| 梧州市| 怀仁县| 泌阳县| 得荣县| 莎车县| 博野县| 麦盖提县| 甘南县| 健康| 西安市| 六盘水市| 墨竹工卡县| 安平县| 金阳县| 乐安县| 鄂尔多斯市| 长子县| 色达县| 沈阳市| 永福县| 红桥区| 南丰县| 张家口市| 北流市| 汾西县| 铜鼓县| 灵台县| 榆树市| 宝兴县| 罗城| 克东县| 固阳县| 崇礼县| 阿拉善左旗| 蓬安县|