小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          #

          最近使用發現了個問題,在下面的介紹使用maven建立web工程的時候有個選項: -DarchetypeArtifactId=maven-archetype-webapp,假如你把這其中的大寫A不小心成了小寫,則在pom.xml中,生成的將是jar包,而不再是war包了。這兩天看了看ant和maven,感覺受益不小,以前總以為自己會ant和maven呢,老認為不用很學習的ant和mvn也有這么大的學問阿,把我的心得寫寫: maven:   創建一個web-app工程:   mvn archetype:create -DgroupID=[類-包的名字] -DartifactID=[應用的名稱] -DrarchetypeArtifactID=maven-archetype-webapp 請注意,上面的語句是不正確的,如果這樣寫了就會出下面的錯誤: BUILD ERROR  Error creating from archetype [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Error creating from archetype Embedded error: Artifact ID must be specified when creating a new project from an archetype. [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ 這是新手很容易犯的錯誤!改正方法是把上面的“ID”改為“Id”,這樣就可以正確的建立一個工程了!給定兩個簡單模型: Application: mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app |-- pom.xml `-- src     |-- main     |   `-- java     |       `-- ce     |           `-- demo     |               `-- mvn     |                   `-- App.java     `-- test         `-- java             `-- ce                 `-- demo                     `-- mvn                         `-- AppTest.java web-app: mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp-DarchetypeArtifactId=maven-archetype-webapp |-- pom.xml `-- src     `-- main         `-- webapp             |-- index.jsp             |-- WEB-INF                 `-- web.xml
          使用如下命令可以建立一個Struts2 Starter應用程序
          mvn archetype:create
          -DgroupId=tutorial
              -DartifactId=tutorial
              -DarchetypeGroupId=org.apache.struts \
              -DarchetypeArtifactId=struts2-archetype-starter \
              -DarchetypeVersion=2.0.5-SNAPSHOT
          -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository
           
          參數含義:
           
          參數 含義
          groupId 當前應用程序隸屬的Group的ID,通常是公司所有應用程序的根目錄,例如:com.jpleasure
          artifactId  當前應用程序的ID
          package 代碼生成時使用的根包的名字,如果沒有給出,默認使用archetypeGroupId
          archetypeGroupId 原型(archetype)的Group ID,因為我們這里使用的是Struts2的原型,所以這里總是org.apache.struts
          archetypeArtifactId  原型(archetype)ID
          archetypeVersion  原型(archetype)版本
          remoteRepositories  包含原型(archetype)的遠程資源庫的列表,如果部署在標準的maven資源庫或者本地,這不需要標記本項

           
          一些相關的Maven命令(注意要再項目目錄中運行)
          構建
          mvn install
          創建IntelliJ IDEA項目文件
          mvn idea:idea
          創建Eclipse項目文件
           mvn eclipse:eclipse
          運行測試
          mvn test
          清除
          mvn clean
          打包
          mvn package
          獲得需要的JAR文件
          mvn initialize
          使用Jetty運行
          mvn jetty:run 在使用此命令之前,需要在xml配置文件中作如下改動:

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
            <modelVersion>4.0.0</span-->modelVersion>  
            <groupId>com.mycompany.webapp</span-->groupId>  
            <artifactId>myweb</span-->artifactId>  
            <packaging>war</span-->packaging>  
            <version>1.0-SNAPSHOT</span-->version>  
            <name>myweb Maven Webapp</span-->name>  
            <url>http://maven.apache.org</span-->url>  
            <dependencies>  
              <dependency>  
                <groupId>junit</span-->groupId>  
                <artifactId>junit</span-->artifactId>  
                <version>3.8.1<!--</span-->version>  
                <scope>test<!--</span-->scope>  
              </span-->dependency>  
            </span-->dependencies>  
            <build>  
              <finalName>myweb</span-->finalName> 
              <!-- 添加以下6行插件配置代碼 -->

              <plugins>  
                <plugin>  
                  <groupId>org.mortbay.jetty</groupId>  
                  <artifactId>maven-jetty-plugin</artifactId>  
                </plugin>  
              </plugins> 
              <!-- 添加以上6行插件配置代碼 -->
            </build>  
          </project> 
          請注意,在./src/main/目錄下面見一個java文件夾,以存放bean,這需要手動來建立:
          mkdir $webapp/src/main/java

          Maven2較maven1有較大的變化,這里推薦使用maven2并不僅僅因為它是高的版本. 其中變化較大的是在它建立的項目中,只有一個pom.xm配置文件.這里是我的一個工程的配置文件拷貝 attachment/200710/pom.xml.... 你會發現其中的代碼如下   <project>
                  <modelVersion>4.0.0</modelVersion>
                  <groupId>com.last999</groupId>
                  <artifactId>bbs</artifactId>
                  <packaging>war</packaging>
                  <version>1.3</version>
                  <name>bbs</name>
                  <url>last999.com</url>
                  <description>mybbs</description>

                  <dependencies>
                  <!-- Junit -->
                  <dependency>
                     <groupId>junit</groupId>
                     <artifactId>junit</artifactId>
                     <version>4.4</version>
                     <scope>test</scope>
                  </dependency>
          .......................
           

          項目都是在<project>中設定,加入要添加新的開源框架,你只需要到maven源的老家走一趟,查到你需要的版本:比如我們現在需要使用struts.那么我們只需要添加以下幾行:
          <dependency>
                      <groupId>org.apache.struts</groupId>
                      <artifactId>struts2-core</artifactId>
                      <version>2.0.9</version>
           </dependency>
                如果再需要和spring集成,除了添加spring需要的包外,你只需要添加:
          <dependency>
                      <groupId>org.apache.struts</groupId>
                      <artifactId>struts2-spring-plugin</artifactId>
                      <version>2.0.9</version>
                  </dependency>
          其他一切就 讓maven給你自動完成吧!


          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zql2002/archive/2008/06/12/2537770.aspx

          posted @ 2009-10-27 11:35 小菜毛毛 閱讀(1160) | 評論 (0)編輯 收藏

          每隔一段時間,就會收到些類似的消息:
          怎么學好軟件開發? 我已經學完了A,我接下來該學B還是C?

          其實這樣的問題,真的是一言難復。如何學習,是一個很復雜的話題,尤其是眼下業內的技術名詞日新月異,亂花迷人眼,使得新人更加看不清。所以才激發了我關于“技術族譜”的設想,本意就是想通過一個機制來理順知識之間的關系,分享每個人的學習經驗,新人借鑒老人的學習路徑,從而減少走彎路的現象。

          記得2007年的時候,一次團隊內部開總結會,我在白板上隨手畫過一個開發相關知識的結構圖,當時還有團隊成員拿相機拍下來,現在想想,也許對某些人有一定的指導意義,于是今天整理了一下發出來,如下圖所示:


          一些相關的解釋:

          學校里的課程沒用嗎?
          答:肯定有用。
          計算機專業的經典理論課,意義非凡:計算機組成原理、計算機體系結構、操作系統、編譯原理、數據結構。操作系統中的內存管理算法、進程調度算法、并發控制算法,都是非常經典的,你會在很多其它地方發現這些算法的應用或者變體。編譯原理有助于我們理解編程語言是如何工作的,如何用范式來表達復雜的語法,編譯原理中的狀態機相關知識,也是開發者手中的強大武器。數據結構就更不用說了,List,Map,Tree,是編程中廣泛使用的。

          快餐式軟件開發培訓的問題何在?
          一個典型的快餐式培訓班,先教java語言,然后教SSH,然后給個千篇一律的虛擬項目做一下,最后號稱培養出來一批“WEB開發”程序員。我覺得,如果之前沒有任何基礎,僅靠這樣的培訓,那么出來真的只能做非常程式化的工作。我一直提倡穩扎穩打,從下向上學起這樣的方式,缺點是不如容易出效果。所以從兩個方向入手,一邊學基礎,一邊學應用,互相印證,也是不錯的學習路徑。

          軟件開發的門檻在提高嗎?
          我覺得是的,當然,我說的不包括hello world這樣的示例程序的開發。雖然現在程序語言比十年前強大很多,工具要好用很多,但要想寫出一個有點意義的軟件,需要了解的知識多了很多,需要配置的環境復雜了很多。看看有多少初學者被java的ClassPath所困擾,您就明白我說的意思了。

          開發不僅僅是學一門語言!
          開發的本質是用程序控制計算機做一件事。基本上,任何有價值的程序都有內政和外交。內政就是程序的處理流程、數據加工算法、并發控制。外交就是網絡通信、IO、數據庫訪問,以及通過各種協議和其它系統進行交互。很多知識,尤其是外交相關的知識,僅僅學習一門語言是不夠的。

          誤區:很多人花大量精力關注最上層,比如:新的框架、新的工具、各種處理問題的技巧等等。但偏偏這一部分的變化最快,您在這上面投入的精力保值能力最差。技術有很強的相似性,比如,如果您真正掌握了javascript,那么掌握Ext或者JQuery只是熟悉對方的編程習慣和API而已,沒必要為了這些新名詞而疲于奔命。

          一家之言,歡迎拍磚或者交流。

          ----

          答問:

          sun_blackh 發表于2009年9月30日 8:18:27
          不好。不知道各種通信協議在什么地方。為什么要把tcp/ip單獨拿出來?質量意識顯得很突兀,和整體沒有關系。雖然它很重要。什么是框架?它應該在哪里?我想LZ沒有仔細推敲過。

          答:
          知識體系中,越是向上,則越是偏向應用層的東西。“各類協議”,只是一個泛指,協議太多了,在一個人的知識結構中,只學習跟自己工作和興趣需要的即可,比如,如果你做網管,可以關心SNMP,JMX;如果你做WEB開發,可以關心SOAP,AJAX;如果你做SP,可以關注各類短信網關的協議等等。TCP/IP之所以要單拿出來,那絕對是有道理的,TCP/IP是一個協議棧,我覺得只要你想做網絡方面的開發,那是必須要學習的,TCP/IP已經是一種不可替代的標準了。
          “框架”和剛才對“各類協議”的解釋是一樣的,并不特指哪種框架,而是一個統稱,是根據需要去學習的,比如:SSH,比如:JQUERY,比如:EXT,比如:Reason等等。
           質量意識你覺得突兀嗎?我覺得它就應該貫穿軟件開發的方方面面,它并不是一項具體的技術,但卻要時時刻刻掛在心中。

          chgaowei 發表于2009年10月2日 星期五 11:08:53  IP:舉報
          這個模型很不錯。我想在補充幾個: 1、領域知識。 2、軟件工程。 3、算法,數據庫,網絡基礎應該放在下面。 4、質量意識換成軟件工程。
          答:
          您補充的挺好,領域知識,或者說業務知識,的確很重要。
          關于“軟件工程”,如果代替“質量意識”,這個我覺得值得商榷,因為我覺得軟件工程并不能代表高質量軟件的全部,你覺得呢。
          算法,我個人的意見認為,并不能作為一個底層的東西,對于多數人來說,應該算是可選項,對于某些特殊軟件開發,比如視頻編解碼、搜索引擎等等,可能算法是必須的基礎,可能連數學都要算上。
          而 網絡 和 數據庫,按我的原意,應該是程序語言、數據庫、網絡作為三個并列的知識領域,為了圖的緊湊型,所以把數據庫和網絡豎起來了,但我覺得數據庫和網絡并不是構成軟件開發的必要基礎,可以選修。

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jinxfei/archive/2009/09/27/4602449.aspx

          posted @ 2009-10-07 21:22 小菜毛毛 閱讀(650) | 評論 (0)編輯 收藏

          前幾天看到盧亮的 Larbin 一種高效的搜索引擎爬蟲工具 一文提到 Nutch,很是感興趣,但一直沒有時間進行測試研究。趁著假期,先測試一下看看。用搜索引擎查找了一下,發現中文技術社區對 Larbin 的關注要遠遠大于 Nutch 。只有一年多前何東在他的竹筍炒肉中對 Nutch 進行了一下介紹

          Nutch vs Lucene
          Lucene 不是完整的應用程序,而是一個用于實現全文檢索的軟件庫。
          Nutch 是一個應用程序,可以以 Lucene 為基礎實現搜索引擎應用。

          Nutch vs GRUB
          GRUB 是一個分布式搜索引擎(參考)。用戶只能得到客戶端工具(只有客戶端是開源的),其目的在于利用用戶的資源建立集中式的搜索引擎。
          Nutch 是開源的,可以建立自己內部網的搜索引擎,也可以針對整個網絡建立搜索引擎。自由(Free)而免費(Free)。

          Nutch vs Larbin
          "Larbin只是一個爬蟲,也就是說larbin只抓取網頁,至于如何parse的事情則由用戶自己完成。另外,如何存儲到數據庫以及建立索引的事情 larbin也不提供。[引自這里
          Nutch 則還可以存儲到數據庫并建立索引。
          Nutch Architecture.png
          [引自這里

          Nutch 的早期版本不支持中文搜索,而最新的版本(2004-Aug-04 發布了 0.5)已經做了很大的改進。相對先前的 0.4 版本,有 20 多項的改進,結構上也更具備擴展性。0.5 版經過測試,對中文搜索支持的也很好。

          下面是我的測試過程。

          前提條件(這里Linux 為例,如果是 Windows 參見手冊):

          • Java 1.4.x 。因為我的系統上安裝的Oracle 10g 已經有 Java 了。設定環境變量:NUTCH_JAVA_HOME 。
            [root@fc3 ~]# export NUTCH_JAVA_HOME=/u01/app/oracle/product/10.1.0/db_1/jdk/jre
                
          • Tomcat 4.x 。從這里下載。
          • 足夠的磁盤空間。我預留了 4G 的空間。

          首先下載最新的穩定版:

          [root@fc3 ~]# wget http://www.nutch.org/release/nutch-0.5.tar.gz
          

          解壓縮:

          [root@fc3 ~]# tar -zxvf nutch-0.5.tar.gz
          ......
          [root@fc3 ~]# mv nutch-0.5 nutch
          

          測試一下 nutch 命令:

          [root@fc3 nutch]# bin/nutch
          Usage: nutch COMMAND
          where COMMAND is one of:
          crawl             one-step crawler for intranets
          admin             database administration, including creation
          inject            inject new urls into the database
          generate          generate new segments to fetch
          fetchlist         print the fetchlist of a segment
          fetch             fetch a segment's pages
          dump              dump a segment's pages
          index             run the indexer on a segment's fetcher output
          merge             merge several segment indexes
          dedup             remove duplicates from a set of segment indexes
          updatedb          update database from a segment's fetcher output
          mergesegs         merge multiple segments into a single segment
          readdb            examine arbitrary fields of the database
          analyze           adjust database link-analysis scoring
          server            run a search server
          or
          CLASSNAME         run the class named CLASSNAME
          Most commands print help when invoked w/o parameters.
          [root@fc3 nutch]#
          

          Nutch 的爬蟲有兩種方式

          • 爬行企業內部網(Intranet crawling)。針對少數網站進行。用 crawl 命令。
          • 爬行整個互聯網。 使用低層的 inject, generate, fetchupdatedb 命令。具有更強的可控制性。

          以本站(http://www.dbanotes.net)為例,先進行一下針對企業內部網的測試。

          在 nutch 目錄中創建一個包含該網站頂級網址的文件 urls ,包含如下內容:
          http://www.dbanotes.net/
          

          然后編輯conf/crawl-urlfilter.txt 文件,設定過濾信息,我這里只修改了MY.DOMAIN.NAME:

          # accept hosts in MY.DOMAIN.NAME
          +^http://([a-z0-9]*\.)*dbanotes.net/
          

          運行如下命令開始抓取分析網站內容:

          [root@fc3 nutch]# bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4 >& crawl.log
          

          depth 參數指爬行的深度,這里處于測試的目的,選擇深度為 2 ;
          threads 參數指定并發的進程 這是設定為 4 ;

          在該命令運行的過程中,可以從 crawl.log 中查看 nutch 的行為以及過程:

          ......
          050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
          050102 200336 crawl started in: crawl.demo
          050102 200336 rootUrlFile = urls
          050102 200336 threads = 4
          050102 200336 depth = 2
          050102 200336 Created webdb at crawl.demo/db
          ......
          050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
          050102 200336 crawl started in: crawl.demo
          050102 200336 rootUrlFile = urls
          050102 200336 threads = 4
          050102 200336 depth = 2
          050102 200336 Created webdb at crawl.demo/db
          050102 200336 Starting URL processing
          050102 200336 Using URL filter: net.nutch.net.RegexURLFilter
          ......
          050102 200337 Plugins: looking in: /u01/nutch/plugins
          050102 200337 parsing: /u01/nutch/plugins/parse-html/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/parse-pdf/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/parse-ext/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/parse-msword/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/query-site/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/protocol-http/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/creativecommons/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/language-identifier/plugin.xml
          050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
          050102 200337 logging at INFO
          050102 200337 fetching http://www.dbanotes.net/
          050102 200337 http.proxy.host = null
          050102 200337 http.proxy.port = 8080
          050102 200337 http.timeout = 10000
          050102 200337 http.content.limit = 65536
          050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n
          utch-agent@lists.sourceforge.net)
          050102 200337 fetcher.server.delay = 1000
          050102 200337 http.max.delays = 100
          050102 200338 http://www.dbanotes.net/: setting encoding to GB18030
          050102 200338 CC: found http://creativecommons.org/licenses/by-nc-sa/2.0/ in rdf of http:
          //www.dbanotes.net/
          050102 200338 CC: found text in http://www.dbanotes.net/
          050102 200338 status: 1 pages, 0 errors, 12445 bytes, 1067 ms
          050102 200338 status: 0.9372071 pages/s, 91.12142 kb/s, 12445.0 bytes/page
          050102 200339 Updating crawl.demo/db
          050102 200339 Updating for crawl.demo/segments/20050102200336
          050102 200339 Finishing update
          64,1           7%
          050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
          050102 200337 logging at INFO
          050102 200337 fetching http://www.dbanotes.net/
          050102 200337 http.proxy.host = null
          050102 200337 http.proxy.port = 8080
          050102 200337 http.timeout = 10000
          050102 200337 http.content.limit = 65536
          050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html;
          nutch-agent@lists.sourceforge.net)
          050102 200337 fetcher.server.delay = 1000
          050102 200337 http.max.delays = 100
          ......
          

          之后配置 Tomcat (我的 tomcat 安裝在 /opt/Tomcat) ,

          [root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
          [root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
          [root@fc3 webapps]# cd /opt/Tomcat/webapps/
          [root@fc3 webapps]# jar xvf ROOT.war
          [root@fc3 webapps]# ../bin/catalina.sh start
          

          瀏覽器中輸入 http://localhost:8080 查看結果(遠程查看需要將 localhost 換成相應的IP):

          nutch web search interface.png

          搜索測試:

          nutch web search result.png

          可以看到,Nutch 亦提供快照功能。下面進行中文搜索測試:

          nutch web Chinese search result.png

          注意結果中的那個“評分詳解”,是個很有意思的功能(Nutch 具有一個鏈接分析模塊),通過這些數據可以進一步理解該算法。

          考慮到帶寬的限制,暫時不對整個Web爬行的方式進行了測試了。值得一提的是,在測試的過程中,nutch 的爬行速度還是不錯的(相對我的糟糕帶寬)。

          Nutch 目前還不支持 PDF(開發中,不夠完善) 與 圖片 等對象的搜索。中文分詞技術還不夠好,通過“評分詳解”可看出,對中文,比如“數據庫管理員”,是分成單獨的字進行處理的。但作為一個開源搜索引擎軟件,功能是可圈可點的。畢竟,主要開發者 Doug Cutting 就是開發 Lucene 的大牛

          參考信息

          posted @ 2009-09-24 12:58 小菜毛毛 閱讀(480) | 評論 (0)編輯 收藏

          posted @ 2009-09-24 12:54 小菜毛毛 閱讀(409) | 評論 (0)編輯 收藏

          想做一個搜索引擎,最近瀏覽了許多社區,發現Lucene和Nutch用的很多,而這兩個我總感覺難以區分概念,于是在查了些資料。下面是Lucene和Nutch創始人Doug Cutting 的訪談摘錄:

           Lucene其實是一個提供全文文本搜索的函數庫,它不是一個應用軟件。它提供很多API函數讓你可以運用到各種實際應用程序中。現在,它已經成為Apache的一個項目并被廣泛應用著。這里列出一些已經使用Lucene的系統。

          Nutch是一個建立在Lucene核心之上的Web搜索的實現,它是一個真正的應用程序。也就是說,你可以直接下載下來拿過來用。它在Lucene的基礎上加了網絡爬蟲和一些和Web相關的東東。其目的就是想從一個簡單的站內索引和搜索推廣到全球網絡的搜索上,就像Google和Yahoo一樣。當然,和那些巨人競爭,你得動一些腦筋,想一些辦法。我們已經測試過100M的網頁,并且它的設計用在超過1B的網頁上應該沒有問題。當然,讓它運行在一臺機器上,搜索一些服務器,也運行的很好。

             總的來說,我認為LUCENE會應用在本地服務器的網站內部搜索,而Nutch則擴展到整個網絡、Internet的檢索。當然LUCENE加上爬蟲程序等就會成為Nutch,這樣理解應該沒錯吧


          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/rokii/archive/2008/03/01/2137450.aspx

          posted @ 2009-09-24 12:53 小菜毛毛 閱讀(378) | 評論 (0)編輯 收藏

          淺析HTTP協議

          HTTP協議是什么?

          簡單來說,就是一個基于應用層的通信規范:雙方要進行通信,大家都要遵守一個規范,這個規范就是HTTP協議。

          HTTP協議能做什么?

          很多人首先一定會想到:瀏覽網頁。沒錯,瀏覽網頁是HTTP的主要應用,但是這并不代表HTTP就只能應用于網頁的瀏覽。HTTP是一種協議,只要通信的雙方都遵守這個協議,HTTP就能有用武之地。比如咱們常用的QQ,迅雷這些軟件,都會使用HTTP協議(還包括其他的協議)。

          HTTP協議如何工作?

          大家都知道一般的通信流程:首先客戶端發送一個請求(request)給服務器,服務器在接收到這個請求后將生成一個響應(response)返回給客戶端。

          在這個通信的過程中HTTP協議在以下4個方面做了規定:

          1.         RequestResponse的格式

          Request格式:

          HTTP請求行
          (請求)頭
          空行
          可選的消息體

          注:請求行和標題必須以<CR><LF> 作為結尾(也就是,回車然后換行)。空行內必須只有<CR><LF>而無其他空格。在HTTP/1.1 協議中,所有的請求頭,除Host外,都是可選的。

           

          實例:

          GET / HTTP/1.1

          Host: gpcuster.cnblogs.com

          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

          Accept-Language: en-us,en;q=0.5

          Accept-Encoding: gzip,deflate

          Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

          Keep-Alive: 300

          Connection: keep-alive

          If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT

          Response格式:

          HTTP狀態行
          (應答)頭
          空行
          可選的消息體

           

          實例:

          HTTP/1.1 200 OK

          Cache-Control: private, max-age=30

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

          Content-Encoding: gzip

          Expires: Mon, 25 May 2009 03:20:33 GMT

          Last-Modified: Mon, 25 May 2009 03:20:03 GMT

          Vary: Accept-Encoding

          Server: Microsoft-IIS/7.0

          X-AspNet-Version: 2.0.50727

          X-Powered-By: ASP.NET

          Date: Mon, 25 May 2009 03:20:02 GMT

          Content-Length: 12173

           

          ­消息體的內容(略)

           

                 詳細的信息請參考:RFC 2616

                 關于HTTP headers的簡要介紹,請查看:Quick reference to HTTP headers

          2.         建立連接的方式

          HTTP支持2中建立連接的方式:非持久連接和持久連接(HTTP1.1默認的連接方式為持久連接)

          1)         非持久連接

          讓我們查看一下非持久連接情況下從服務器到客戶傳送一個Web頁面的步驟。假設該貝面由1個基本HTML文件和10個JPEG圖像構成,而且所有這些對象都存放在同一臺服務器主機中。再假設該基本HTML文件的URL為:gpcuster.cnblogs.com/index.html。

          下面是具體步騾:

          1.HTTP客戶初始化一個與服務器主機gpcuster.cnblogs.com中的HTTP服務器的TCP連接。HTTP服務器使用默認端口號80監聽來自HTTP客戶的連接建立請求。

          2.HTTP客戶經由與TCP連接相關聯的本地套接字發出—個HTTP請求消息。這個消息中包含路徑名/somepath/index.html。

          3.HTTP服務器經由與TCP連接相關聯的本地套接字接收這個請求消息,再從服務器主機的內存或硬盤中取出對象/somepath/index.html,經由同一個套接字發出包含該對象的響應消息。

          4.HTTP服務器告知TCP關閉這個TCP連接(不過TCP要到客戶收到剛才這個響應消息之后才會真正終止這個連接)。

          5.HTTP客戶經由同一個套接字接收這個響應消息。TCP連接隨后終止。該消息標明所封裝的對象是一個HTML文件。客戶從中取出這個文件,加以分析后發現其中有10個JPEG對象的引用。

          6.給每一個引用到的JPEG對象重復步騾1-4。

          上述步驟之所以稱為使用非持久連接,原因是每次服務器發出一個對象后,相應的TCP連接就被關閉,也就是說每個連接都沒有持續到可用于傳送其他對象。每個TCP連接只用于傳輸一個請求消息和一個響應消息。就上述例子而言,用戶每請求一次那個web頁面,就產生11個TCP連接。

          2)         持久連接

          非持久連接有些缺點。首先,客戶得為每個待請求的對象建立并維護一個新的連接。對于每個這樣的連接,TCP得在客戶端和服務器端分配TCP緩沖區,并維持TCP變量。對于有可能同時為來自數百個不同客戶的請求提供服務的web服務器來說,這會嚴重增加其負擔。其次,如前所述,每個對象都有2RTT的響應延長——一個RTT用于建立TCP連接,另—個RTT用于請求和接收對象。最后,每個對象都遭受TCP緩啟動,因為每個TCP連接都起始于緩啟動階段。不過并行TCP連接的使用能夠部分減輕RTT延遲和緩啟動延遲的影響。

          在持久連接情況下,服務器在發出響應后讓TCP連接繼續打開著。同一對客戶/服務器之間的后續請求和響應可以通過這個連接發送。整個Web頁面(上例中為包含一個基本HTMLL文件和10個圖像的頁面)自不用說可以通過單個持久TCP連接發送:甚至存放在同一個服務器中的多個web頁面也可以通過單個持久TCP連接發送。通常,HTTP服務器在某個連接閑置一段特定時間后關閉它,而這段時間通常是可以配置的。持久連接分為不帶流水線(without pipelining)和帶流水線(with pipelining)兩個版本。如果是不帶流水線的版本,那么客戶只在收到前一個請求的響應后才發出新的請求。這種情況下,web頁面所引用的每個對象(上例中的10個圖像)都經歷1RTT的延遲,用于請求和接收該對象。與非持久連接2RTT的延遲相比,不帶流水線的持久連接已有所改善,不過帶流水線的持久連接還能進一步降低響應延遲。不帶流水線版本的另一個缺點是,服務器送出一個對象后開始等待下一個請求,而這個新請求卻不能馬上到達。這段時間服務器資源便閑置了。

          HTTP/1.1的默認模式使用帶流水線的持久連接。這種情況下,HTTP客戶每碰到一個引用就立即發出一個請求,因而HTTP客戶可以一個接一個緊挨著發出各個引用對象的請求。服務器收到這些請求后,也可以一個接一個緊挨著發出各個對象。如果所有的請求和響應都是緊挨著發送的,那么所有引用到的對象一共只經歷1RTT的延遲(而不是像不帶流水線的版本那樣,每個引用到的對象都各有1RTT的延遲)。另外,帶流水線的持久連接中服務器空等請求的時間比較少。與非持久連接相比,持久連接(不論是否帶流水線)除降低了1RTT的響應延遲外,緩啟動延遲也比較小。其原因在于既然各個對象使用同一個TCP連接,服務器發出第一個對象后就不必再以一開始的緩慢速率發送后續對象。相反,服務器可以按照第一個對象發送完畢時的速率開始發送下一個對象。

          3.         緩存的機制

          HTTP/1.1中緩存的目的是為了在很多情況下減少發送請求,同時在許多情況下可以不需要發送完整響應。前者減少了網絡回路的數量;HTTP利用一個“過期(expiration)”機制來為此目的。后者減少了網絡應用的帶寬;HTTP用“驗證(validation)”機制來為此目的。

          HTTP定義了3種緩存機制:

          l Freshness allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.

          l Validation can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header to see if it has changed.

          l Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.

          關于web緩存方面的內容可以參考:Caching Tutorial for Web Authors and Webmasters英文版)(中文版

          4.         響應授權激發機制

          這些機制能被用于服務器激發客戶端請求并且使客戶端授權。

          詳細的信息請參考:RFC 2617: HTTP Authentication: Basic and Digest Access

          5.        基于HTTP的應用

          1 HTTP代理

          原理

          index_img3

          分類

          1. 透明代理
          2. 非透明代理
          3. 反向代理

          index_img4

          index_img5

          2 多線程下載

            1. 下載工具開啟多個發出HTTP請求的線程
            2. 每個http請求只請求資源文件的一部分:Content-Range: bytes 20000-40000/47000
            3. 合并每個線程下載的文件

          3 HTTPS傳輸協議原理

          兩種基本的加解密算法類型

          對稱加密:密鑰只有一個,加密解密為同一個密碼,且加解密速度快,典型的對稱加密算法有DES、AES等

          index_img6

          非對稱加密:密鑰成對出現(且根據公鑰無法推知私鑰,根據私鑰也無法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密算法有RSA、DSA等

          index_img7

          HTTPS通信過程

          index_img8

          優點

            1. 客戶端產生的密鑰只有客戶端和服務器端能得到
            2. 加密的數據只有客戶端和服務器端才能得到明文
            3. 客戶端到服務端的通信是安全的

           

          4 開發web程序時常用的Request Methods

          HEAD

          (Head方法)要求響應與相應的GET請求的響應一樣,但是沒有的響應體(response body)。這用來獲得響應頭(response header)中的元數據信息(meta-infomation)有(很)幫助,(因為)它不需要傳輸所有的內容。

          TRACE

          (Trace方法告訴服務器端)返回收到的請求。客戶端可以(通過此方法)察看在請求過程中中間服務器添加或者改變哪些內容。

          OPTIONS

          返回服務器(在指定URL上)支持的HTTP方法。通過請求“*”而不是指定的資源,這個方法可以用來檢查網絡服務器的功能。

          CONNECT

          將請求的連接轉換成透明的TCP/IP通道,通常用來簡化通過非加密的HTTP代理的SSL-加密通訊(HTTPS)。

          5 用戶與服務器的交互

            1. 身份認證
            2. cookie
            3. 帶條件的GET

          6 基于Socket編程編寫遵循HTTP的程序

           

           

          后記:

          這篇文章只是對HTTP協議做了一個大概介紹,很多細節都有遺漏,請有興趣的朋友閱讀RFC 2616

          學習HTTP協議的好書:

          1.O'Reilly - HTTP Pocket Reference:這是一本比較簡短的介紹HTTP協議的書,可以作為入門讀物

          2.O'Reilly - HTTP The Definitive Guide:這是一本寶典級別的書,因為它包含的內容實在多,可以作為全面學習的HTTP協議的首選讀物

          3.Sams - HTTP Developers Handbook:這是比HTTP The Definitive Guide稍微比HTTP The Definitive Guide簡單。不過從我的感覺,這本書比HTTP The Definitive Guide要好,因為它篇幅比較少,介紹的是HTTP精髓,我認為這本書應該是web程序員的首選讀物

          posted @ 2009-09-19 12:27 小菜毛毛 閱讀(357) | 評論 (0)編輯 收藏

               摘要: 輕松為應用程序構建搜索和索引功能 ...  閱讀全文
          posted @ 2009-09-17 19:45 小菜毛毛 閱讀(352) | 評論 (0)編輯 收藏

          Web開發有用的技術書籍

          關鍵字: lucene ajax jquery html css

          在Web項目的開發過程中,可能對你很有幫助的基本書籍推薦,不要小看基礎!

            • JFreechat:Web開發中設計到統計曲線,報表顯示的,用他吧,不過感覺他的API有點繁雜。
            • Java設計模式:設計模式在我們的開發中無處不在,學習他的思路可以說非常重要!
            • Javascript權威指南:由于Ajax的出現,Javascript變得越來越重要,是Web開發中的利器!
            • Lunece:Web開發中全文檢索的必備
            • JNI:在Web開發中,不可避免的有時會調用dll,Java調用Dll的根本思想在于JNI,舉個例子:
            Java代碼 復制代碼
            1. //編寫JAVA文件,其中測試類為DllTest,代碼如下:   
            2. public class DllTest    
            3. {   
            4. public static void main(String[] args)   
            5. {   
            6.   test a=new test();   
            7.   a.HelloWorld();   
            8.   System.out.println(a.cToJava());   
            9. }   
            10. }   
            11. //編寫JNI代碼,其中類名為test,如下:   
            12. public class test {   
            13.   static    
            14.   {   
            15.     System.loadLibrary("MyNative");   
            16.   }   
            17.      
            18.   //以下函數只做申明,在C中實現   
            19.   public native static void HelloWorld();   
            20.   public native static String cToJava();   
            21.   
            22. }   
            23. //使用javac得到class文件,然后使用javah命令得到.h文件   
            24. //編寫C++代碼,MyNative如下:   
            25. 使用win32 Dynamic-link Library新建一個新空工程,新建一個c++文件,命名為MyNative.cpp,代碼如下:   
            26. #include <stdio.h>   
            27. #include "test.h"  
            28. JNIEXPORT void JNICALL Java_test_HelloWorld   
            29.   (JNIEnv *env, jclass jobject)   
            30. {   
            31.     printf("hello world!\n");   
            32. }   
            33. JNIEXPORT jstring JNICALL Java_test_cToJava   
            34.   (JNIEnv *env, jclass obj)   
            35. {   
            36.     jstring jstr;   
            37.     char str[]="Hello World!\n";   
            38.     jstr=env->NewStringUTF(str);   
            39.     return jstr;   
            40. }   
            41. 函數申明要和test.h中的函數申明保持一致,否則就出錯,使用rebuild all命令,得到MyNative.dll文件,拷貝到test.java同一目錄下。   
            42. 運行DllTest類,就得到結果,這里我們就實現用c++來實現具體函數功能的方法,當然這是最簡單的JNI應用了。  
             
            posted @ 2009-09-04 12:51 小菜毛毛 閱讀(1028) | 評論 (0)編輯 收藏

            常用建站參考網站大本營

            關鍵字: css div 建站

            在我個人開發網站的過程中,經常會參考一些網站,我不擅長美工,所以一般頁面都喜歡直接拿來用,再自己修飾一下,以下一些網站是我經常訪問的,共享給大家:

            1. 站酷(http://www.zcool.com.cn/ ):擁有豐富的網站資源與模板,很棒
            2. 51js和blueidea(http://bbs.51js.comhttp://www.blueidea.com ) :主要看一些js高手們探討的帖子。
            3. JQuery官網(http://jquery.com ):不用說了
            4. http://www.freecsstemplates.org/ :很多老外上傳的免費模板,有些付費的看看效果圖也不錯,然后自己動手寫,非常有參考價值

            不知道大家有沒有補充的,在建站的過程中,有沒有經常參考的網站呢?歡迎討論!

             

            網友補充:

            1. CSS資源和學習網站(http://www.52css.com/
            2. http://www.w3school.com.cn/
            posted @ 2009-09-04 12:49 小菜毛毛 閱讀(199) | 評論 (0)編輯 收藏

            JAVA 書籍比較全的網站 http://ajava.org/book/
            posted @ 2009-09-02 16:20 小菜毛毛 閱讀(379) | 評論 (0)編輯 收藏

            僅列出標題
            共17頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 
            主站蜘蛛池模板: 宝应县| 伊宁县| 肃南| 平原县| 罗田县| 成都市| 抚顺市| 榕江县| 临猗县| 东兴市| 武功县| 黄龙县| 鲁甸县| 奎屯市| 大洼县| 锡林郭勒盟| 海兴县| 盐池县| 华亭县| 泰兴市| 定襄县| 邢台县| 荥经县| 商河县| 杭锦旗| 铜川市| 寻乌县| 乐东| 安化县| 永春县| 山东| 夹江县| 蒙城县| 上思县| 定兴县| 东阳市| 遂溪县| 吴忠市| 分宜县| 上饶县| 垫江县|