1. 程式人生 > >Tomcat伺服器與Http協議之請求(get請求、post請求)和響應

Tomcat伺服器與Http協議之請求(get請求、post請求)和響應

發展歷程

1、最早的web伺服器-NCSA(美國國家超級計算應用中心的縮寫),由於主要開發者的離開,讓其前景變得不明朗。所以一些開發者聚集在一起,對其進行了缺陷修復和增強程式碼,釋出了新的版本Apache,即:“打補丁後的Web伺服器(A Patchy Web Server)”
2、Apache軟體基金會(ASF),1999年成立。

主要職責:
1、通過供給 硬體、通訊和商業基礎設施的形式開放、協作式軟體開發專案 提供基礎。
2、用公司和個人捐贈的資源建立一個獨立法定企業,保證這些資源都用於公益事業
3、為個人志願者提供法律保護手段以避免受ASF專案相關的法律糾紛的影響。
4、保護Apache商標

,以防止其被其他組織濫用。

3、Tomcat工程起源於早期的Java Servlet技術。Servlet是一種可以嵌入特定Web伺服器中的Java應用程式(從此擺脫JavaSE基礎,開始走向web應用),毫無疑問,第一個Servlet容器,即Java Web伺服器是由Sun公司建立的。
於是在1999年的時候,Sun公司把Servlet容器的程式碼贈與ASF,於是 Servlet引擎+Apache Web伺服器=Tomcat伺服器

4、Tomcat伺服器第一版本3.x系列,支援Servlet2.2JSP1.1(所以JSP的出現晚於Servlet)規範。
Tomcat4.0(代號Catalina)釋出

,Catalina對Tomcat的體系結構進行了完成的重構,並建立了新的程式碼庫,支援Servlet2.3和JSP1.2規範

5、作為Servlet容器,Tomcat是龐大的一組標準的主要組成部分,這組標準被整體稱為Java企業版(Java EE)平臺。JavaEE標準定義了一組基於Java的API(應用程式介面),適合為企業建立Web程式~

6、

Java EE API 描述
企業版JavaBeans(EJB) 提供機制以使Java開發者易於使用組建中的擴充套件特性
Java Message(JMS) 提供高效能非同步資訊系統
網路服務API 網路服務的API套件和XML程序
Java 管理擴充套件(JMX) 標準化一個執行時互動式引導和管理應用程式
Java 事務處理API(JTA) 提供高效能非同步資訊系統
網路服務API 網路服務的API套件和XML程序

打好基礎

1、web服務軟體作用:把本地資源共享給外部訪問
2、Tomcat伺服器基本操作:

啟動: %tomcat%/bin/startup.bat  
關閉: %tomcat%/bin/shutdown.bat 
訪問tomcat主頁:
http://localhost:8080 

3、web應用目錄結構

 |- WebRoot   根目錄 
        |-靜態資源(html+css+javascript+images+xml)  可以直接被瀏覽器訪問到的 
        |-WEB-INF                                  不可以直接被瀏覽器訪問到 
            |-classes     存放class位元組碼檔案 
            |-lib         存放jar包檔案 
            web.xml      web應用的配置檔案,配置servlet 

4、Servlet技術: 用java語言開發動態資源的技術

5、HTTP:超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。

1)http協議:對瀏覽器客戶端和伺服器端之間資料傳輸的格式規範。 

2)http請求:瀏覽器->伺服器端 
    格式:  
        請求行(請求方式(GET/POST) 請求資源(URI) http協議版本(http1.1)) 
        請求頭(鍵值對形式存在。 host、user-agent、referer) 
        一個空行 
        實體內容(POST提交的引數) 
    HttpServletRequest物件: 請求物件。獲取請求資訊。 
    請求行:request.getMethod()   request.getRequestURI/getRequestURL()  request.getProtocol(); 
    請求頭: request.getHeader("name")    request.getHeaderNames()   
    實體內容: request.getInputStream()  

    獲取引數資料:(GET或POST) 
        request.getParameter("name")  一個值的引數 
        request.getParameterValues("name"); 多個值的引數 
        request.getParameterNames()    所有引數 

3)http響應: 伺服器->瀏覽器端 
    格式:  
        響應行(http協議版本 狀態碼 描述) 
            常用的狀態碼: 200   302  404   500 
        響應頭( location(結合302狀態碼完成請求重定向功能)、 refresh(定時重新整理)、content-type、                           content-disiposition(以下載方式開啟))  
        一個空行 
        實體內容 
    HttpServletResponse物件: 響應物件。設定響應資訊。 
        響應行: response.setStatus(); 
        響應頭: response.setHeader("name","value") 
        實體內容:  
            (PrintWriter) response.getWriter().writer(); 字元內容 
            (OutputStream)response.getOutputStream().writer();  位元組內容        

Web開發入門

1、軟體的結構

C/S(Client - Server 客戶端-伺服器端)
**典型應用:**QQ,LOL等
特點:
1)必須下載特定的客戶端程式。
2)伺服器端升級、客戶端升級。

B/S(Browser-Server 瀏覽器-伺服器端)
典型應用:微博網頁版,4399小遊戲(俗稱:網站)
特點:
1)不需要安裝特定的客戶端(只需要安裝瀏覽器即可)
2)伺服器端升級,瀏覽器不需要升級!

例如:就業簽約系統和招聘通~

2、伺服器
從物理上來說,伺服器就是一臺PC機器。8核,8G以上,T來計算,頻寬100M

(這個去查下,詳細講講~)

web伺服器:PC機器安裝一個具有web服務的軟體,成為web伺服器。
資料庫伺服器:PC機器安裝一個具有資料管理服務的軟體,稱之為資料庫伺服器。
郵件伺服器:PC機器安裝一個具有傳送郵件服務的軟體,稱之為郵件伺服器。

3、web服務軟體

web服務軟體的作用:把本地的資源共享給外部訪問。

4、常見的市面上的web服務軟體

WebLogic:BEA公司的產品。收費的。支援JavaEE規範。
WebSphere:IBM公司的產品。收費的。支援JavaEE規範。
JBoss:Redhat公司的產品。收費的。支援JavaEE規範。
Tomcat:開源組織Apache的產品。免費的。支援部分的JavaEE規範。(Servlet、jsp、jdbc,但ejb,rmi不支援)

Tomcat基本使用


2.1 下載並安裝 
    1)到apache官網。www.apache.org     http://jakarta.apache.org(產品的主頁) 
    2)安裝版:window (exe、msi) linux(rmp) 
       壓縮版:window(rar,zip) linux(tar,tar.gz)學習時候使用 
    3)執行和關閉tomcat 
        3.1 啟動軟體 
            a)找到%tomcat%/bin/startup.bat ,雙擊這個檔案 
            b)彈出視窗,顯示資訊(不要關閉次視窗) 
            c)開啟瀏覽器,輸出以下地址 
                http://localhost:8080 
            d)看到一隻貓畫面,證明軟體啟動成功! 

        3.2 關閉軟體 
            a)找到%tomcat%/bin/shutdown.bat,雙擊這個檔案即可! 
            c)開啟瀏覽器,輸出以下地址。看到“無法連線”(最好先清空瀏覽器快取) 

2.2 tomcat軟體使用的常見問題 
    1)閃退問題 
    原因:tomcat軟體是java語言開發的。 tomcat軟體啟動時,會預設到系統的環境變數中查詢一個名稱叫JAVA_HOME的變數。這個變數的作用找到tomcat啟動所需的jvm。 
    解決辦法; 到環境變數中設定JAVA_HOME的變數 
        JAVA_HOME= C:\Program Files\Java\jdk1.6.0_30  (注意別配置到bin目錄下) 

    2)端口占用的錯誤 
    原因: tomcat啟動所需的埠被其他軟體佔用了! 
    解決辦法:  
        a)關閉其他軟體程式,釋放所需埠 
        b)修改tomcat軟體所需埠 
           找到並修改%tomcat%/conf/server.xml檔案           
            <Connector port="8081" protocol="HTTP/1.1"  
                connectionTimeout="20000"  
                redirectPort="8443" /> 

        3)CATALINA環境變數問題 
            原因: tomcat軟體啟動後,除了查詢JAVA_HOME後,還會再查詢一個叫CATALINA_HOME變數,這個變數的作用是設定tomcat的根目錄。 
            解決辦法:建議不要設定CATALINA_HOME變數。檢查如果有的話,清除掉!!! 

2.3 體驗tomcat軟體作用 
    webapps目錄: tomcat共享目錄。需要共享的本地資源放到此目錄中。 

2.4 URL 
    URL全名叫統一資源定位符,用於定位網際網路的資源。 

    問題: http://localhost:8081/myweb/test.html  

    http://     協議。http協議。 
    localhost   域名。為了找到IP地址。 
                    本地域名: localhost 
                    外部域名:www.baidu.com 
    8081       埠。軟體監聽的 
                8080: tomcat預設的埠 
                3306:mysql資料庫的埠 
                1521: orace資料庫的埠。 
    /myweb:   web應用的名稱。預設情況下,在webapps目錄下找 
    /test.html :資源名稱。 

3、Tomcat目錄結構

資料夾名 作用
bin 存放各種平臺下,啟動和關閉Tomcat的指令碼檔案
conf 存放各種配置檔案,最重要的是server.xml和web.xml
lib 存放Tomcat伺服器和web應用都能訪問的jar包
logs Tomcat執行時的日誌檔案,Tomcat未正常啟動,可以在這裡找到問題
temp 存放Tomcat的臨時檔案,接觸不是很多
webapps web釋出目錄,存放web的應用檔案【特別是裡面的Root是Tomcat執行的根目錄檔案】
work 存放各種jsp生成的servlet檔案

4、手動開發動態資源

/* 
5.1 靜態資源和動態資源的區別 
    靜態資源: 當用戶多次訪問這個資源,資源的原始碼永遠不會改變的資源。 
    動態資源: 當用戶多次訪問這個資源,資源的原始碼可能會發生改變 

5.2 動態資源的開發技術 
    Servlet : 用java語言來編寫動態資源的開發技術。 

    Servlet特點: 
        1)普通的java類,繼承HttpServlet類,覆蓋doGet方法 
        2)Servlet類只能交給tomcat伺服器執行!!!!(開發者自己不能執行!!!) 

    Servlet手動編寫步驟: 
        1)編寫一個servlet程式,繼承HttpServlet(匯入tomcat伺服器lib包下的servlet架包)    
            public class HelloServlet extends HttpServlet{ 

                @Override 
                protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
                        throws ServletException, IOException { 
                    //解決中文亂碼問題 
                    resp.setContentType("text/html;charset=utf-8"); 
                    //向瀏覽器輸出內容 
                    resp.getWriter().write("這是第一個servlet程式。當前時間為:"+new Date()); 
                } 
            } 

        2)找到HelloServlet類的bin目錄下的class位元組碼,然後把拷貝到tomcat的一個web應用中WEB-INF/classes目錄下。 
        3)在當前web應用下的web.xml檔案配置Servlet。 

            <!-- 配置一個servlet程式 --> 
            <servlet> 
                <!-- servlet的內部名稱 ,可以自定義--> 
                <servlet-name>HelloServlet</servlet-name> 
                <!-- servlet類名: 包名+簡單類名--> 
                <servlet-class>gz.itcast.d_servlet.HelloServlet</servlet-class> 
            </servlet> 

            <servlet-mapping> 
                <!-- servlet的內部名稱,和上面的名稱保持一致!!!--> 
                <servlet-name>HelloServlet</servlet-name> 
                <!-- servlet的訪問名稱: /名稱 --> 
                <url-pattern>/hello</url-pattern> 
            </servlet-mapping> 

        4)啟動tomcat伺服器,執行訪問 
            訪問servlet:  http://localhost:8080/myweb/  
*/

6、Http協議入門

/* 
6.1 什麼是http協議 
    http協議: 對瀏覽器客戶端和伺服器端之間資料傳輸的格式規範 
    tcp/ip協議:關注的是客戶端與伺服器之間資料是否傳輸成功 
    http協議:是在tcp/ip協議之上封裝的一層協議,關注的是資料傳輸的格式是否規範 

6.2 檢視http協議的工具 
    1)使用火狐的firebug外掛(右鍵->firebug->網路) 
    2)使用谷歌的“審查元素” 
    3)使用系統自帶的telnet工具(遠端訪問工具)                
        atelnet localhost 8080 訪問tomcat伺服器 
        bctrl+] 回車 可以看到回顯 
        c)輸入請求內容                             
            GET /myweb/hello HTTP/1.1 
            Host: localhost:8080 
            Connection: keep-alive 
        d)回車,即可檢視到伺服器響應資訊。 

6.3 http協議內容             
    請求(瀏覽器-->伺服器) 
        GET /day09/hello HTTP/1.1 
        Host: localhost:8080 
        User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 
        Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 
        Accept-Encoding: gzip, deflate 
        Connection: keep-alive 

    響應(伺服器-->瀏覽器) 
        HTTP/1.1 200 OK 
        Server: Apache-Coyote/1.1 
        Content-Length: 24 
        Date: Fri, 30 Jan 2015 01:54:57 GMT 

        this is hello servlet!!! 
*/ 

7、http請求

/* 
GET /day09/hello HTTP/1.1              --請求行 
Host: localhost:8080                   --請求頭(多個key-value物件) 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
                                      --一個空行 
name=eric&password=123456             --(可選)實體內容 

7.1 請求行 
    GET /day09/hello HTTP/1.1      
        #http協議版本 
            http1.0:當前瀏覽器客戶端與伺服器端建立連線之後,只能傳送一次請求,一次請求之後連線關閉。 
            http1.1:當前瀏覽器客戶端與伺服器端建立連線之後,可以在一次連線中傳送多次請求。(基本都使用1.1)(尋找資源等圖片也是一次請求) 
    #請求資源 
        URL:  統一資源定位符。http://localhost:8080/day09/testImg.html。只能定位網際網路資源。是URI                           的子集。 
        URI: 統一資源標記符。/day09/hello。用於標記任何資源。可以是本地檔案系統,區域網的資源(//192.168.14.10/myweb/index.html),                      可以是網際網路。 
    #請求方式 
        常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE   

        常用的請求方式: GET  和 POST     

        表單提交: 
            <form action="提交地址" method="GET/POST">     

            <form> 

        GET  vs  POST 區別 

        1)GET方式提交  
            a)位址列(URI)會跟上引數資料。以?開頭,多個引數之間以&分割。 
                GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1 
                Host: localhost:8080 
                User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 
                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 
                Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 
                Accept-Encoding: gzip, deflate 
                Referer: http://localhost:8080/day09/testMethod.html 
                Connection: keep-alive 

            b)GET提交引數資料有限制,不超過1KB。 
            c)GET方式不適合提交敏感密碼。 
            d)注意: 瀏覽器直接訪問的請求,預設提交方式是GET方式 
        2)POST方式提交 
            a)引數不會跟著URI後面。引數而是跟在請求的實體內容中。沒有?開頭,多個引數之間以&分割。 
                POST /day09/testMethod.html HTTP/1.1 
                Host: localhost:8080 
                User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 
                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8 
                Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 
                Accept-Encoding: gzip, deflate 
                Referer: http://localhost:8080/day09/testMethod.html 
                Connection: keep-alive 

                name=eric&password=123456 

            b)POST提交的引數資料沒有限制。 
            c)POST方式提交敏感資料。 

7.2 請求頭 
    Accept: text/html,image/*            -- 瀏覽器接受的資料型別 
    Accept-Charset: ISO-8859-1           -- 瀏覽器接受的編碼格式 
    Accept-Encoding: gzip,compress       --瀏覽器接受的資料壓縮格式 
    Accept-Language: en-us,zh-           --瀏覽器接受的語言 
    Host: www.it315.org:80               --(必須的)當前請求訪問的目標地址(主機:埠) 
    If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT  --瀏覽器最後的快取時間 
    Referer: http://www.it315.org/index.jsp      -- 當前請求來自於哪裡 
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)  --瀏覽器型別 
    Cookie:name=eric                     -- 瀏覽器儲存的cookie資訊 
    Connection: close/Keep-Alive         -- 瀏覽器跟伺服器連線狀態。close: 連線關閉  keep-alive:儲存連線。 
    Date: Tue, 11 Jul 2000 18:23:51 GMT  -- 請求發出的時間 

7.3 實體內容 
    只有POST提交的引數會放到實體內容中 

7.4 HttpServletRequest物件 
    HttpServletRequest物件作用是用於獲取請求資料。 

        核心的API: 
            請求行:  
                request.getMethod();   請求方式 
                request.getRequetURI()   / request.getRequetURL()   請求資源 
                request.getProtocol()   請求http協議版本 

            請求頭: 
                request.getHeader("名稱")   根據請求頭獲取請求值 
                request.getHeaderNames()    獲取所有的請求頭名稱 

            實體內容: 
                request.getInputStream()   獲取實體內容資料 

7.5 service 和 doXX方法區別 

7.6 案例-獲取瀏覽器的型別(user-agent) 

7.7 案例- 防止非法連結(referer) 
    第1次  CSDN/51CTO  ->  頁面(點選下載) -> 彈出廣告頁面(點選此處下載) -> 開始下載   
    第2次  直接點選此處下載  ->  轉回廣告頁面  ->  開始下載 

        非法連結:                            
            1)直接訪問下載的資源 
            2)不是從廣告頁面過來的連結 

        referer: 當前請求來自於哪裡。 

7.8 傳遞的請求引數如何獲取      
    GET方式: 引數放在URI後面 
    POST方式: 引數放在實體內容中 

    獲取GET方式引數: 
            request.getQueryString(); 
    獲取POST方式引數: 
            request.getInputStream(); 

    問題:但是以上兩種不通用,而且獲取到的引數還需要進一步地解析。 
    所以可以使用統一方便的獲取引數的方式: 

    核心的API: 
    request.getParameter("引數名");  根據引數名獲取引數值(注意,只能獲取一個值的引數) 
    request.getParameterValue("引數名“);根據引數名獲取引數值(可以獲取多個值的引數) 

    request.getParameterNames();   獲取所有引數名稱列表  

7.9 請求引數編碼問題 
    修改POST方式引數編碼: 
        request.setCharacterEncoding("utf-8"); 
    修改GET方式引數編碼: 
        手動解碼:String name = new String(name.getBytes("iso-8859-1"),"utf-8"); 
    指定伺服器編碼: 
        server.xml檔案Connector標籤—>URIEncoding="utf-8" 
*/