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不支持)

EJB:http://blog.csdn.net/jojo52013145/article/details/5783677
RMI:http://haolloyin.blog.51cto.com/1177454/332426/

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" 
*/  

原文地址:http://blog.csdn.net/tideseng/article/details/70152387

發佈了53 篇原創文章 · 獲贊 114 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章