1. 程式人生 > >Javaweb學習筆記(二):servlet初體驗、HTTP協議

Javaweb學習筆記(二):servlet初體驗、HTTP協議

目錄

1.Servlet體驗

1.1servlet的繼承體系

1.2手動開發動態web資源

1.3工具開發動態資源

2.HTTP協議

2.1概念

2.2請求資訊

2.2.1請求行

2.2.2請求頭

2.2.3空行與實體內容

2.3HttpServletRequest物件

2.4響應資訊

2.4.1響應行

2.4.2響應頭

2.5HttpServletResponse物件


1.Servlet體驗

1.1servlet的繼承體系

Servlet程式是sun公司開發用於開發web資源技術,任何 一個類只需要實現了Servlet介面那麼就可以稱作為是一個servlet程式。如果是繼承GenericServlet,那麼不管訪問的方式是get還是post都會呼叫service方法。如果是繼承HttpServlet,那麼如果是get的提交方式就會呼叫doGet、如果是Post的提交方式就會呼叫doPost。 在實際開發中基本上所有的程式設計師都是繼承HttpServlet。

1.2手動開發動態web資源

Servlet是用的java類,需繼承HttpServlet類(在Tomcat安裝目錄的lib目錄下,有servlet-api.jar,複製到eclipse的新建目錄lib中,並將其新增到編譯路徑),並覆蓋doGet方法

Servlet類只能交給tomcat伺服器執行,開發者自己不能執行。

Servlet手動編寫步驟:

  1. 編寫一個servlet程式,繼承HttpServlet
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類的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的對映配置 -->

<servlet-mapping>

    <!-- servlet的內部名稱,和上面的名稱保持一致!!!-->

    <servlet-name>HelloServlet</servlet-name>

    <!-- servlet的對映路徑: /名稱 -->

    <url-pattern>/hello</url-pattern>

</servlet-mapping>

4)啟動tomcat伺服器,在瀏覽器中訪問, http://localhost:8080/myweb/hello

1.3工具開發動態資源

在MyEclipse中:

1)建立web project (javaweb工程),勾選webRoot

2)在WebRoot下建立靜態資原始檔,

3)在src下建立動態資原始檔

3.1 new -> Servlet( servlet的程式碼生成器)

3.2 寫pacakge名、class名 ,勾選繼承doGET方法,修改mapping URL的訪問名稱(以/開頭)

4)關聯tomcat伺服器

window-> Preferences - > MyEcplise -> servers -> Tomcat 6.x (選中enable)

修改管理地址:E:\Java\apache-tomcat-6.0.39

5)部署web project應用。(拷貝web應用到tomcat的webapps目錄下)

點選Deploy MyEclipse J2EE Project to Server,選擇 Tomcat6.x

6)啟動tomcat伺服器

點選Run/Stop/Restart myEclipse Servers,選擇 Tomcat 6.x 選擇start

7)訪問servlet

在瀏覽器中,輸入http://localhost:8081/day08_web/hello

具體展示:

 

Web應用開發好後,若想供外界訪問,需要把web應用所在目錄交給web伺服器管理,這個過程稱之為虛似目錄的對映。

2.HTTP協議

2.1概念

瀏覽器向伺服器傳送請求,伺服器對瀏覽器做出響應。httphypertext transfer protocol超文字傳輸協議)協議是對瀏覽器和伺服器端之間資料傳輸的格式規範

 

http的協議版本:

http1.0:當前瀏覽器客戶端與伺服器端建立連線之後,只能傳送一次請求,一次請求之後連線關閉。

http1.1:當前瀏覽器客戶端與伺服器端建立連線之後,可以在一次連線中傳送多次請求。(基本都使用1.1)

http協議請求的一般內容:

GET方式:請求行,請求頭(以鍵值對的形式出現),一個空行。

POST方式:請求行,請求頭,一個空行,實體內容(引數列表)。

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

                                          --一個空行(http協議規範)

name=eric&password=123456               --(可選)實體內容

http協議響應的一般內容:

HTTP/1.1 200 OK                    --響應行

Server: Apache-Coyote/1.1         --響應頭(key-vaule)

Content-Length: 24 

Date: Fri, 30 Jan 2015 01:54:57 GMT

                                     --一個空行

this is hello servlet!!!           --實體內容

2.2請求資訊

2.2.1請求行

有三部分組成,請求方式、請求資源、協議版本。如:  GET /day09/hello HTTP/1.1     

①請求方式

請求方式:GET 、POST、HEAD、TRACE、PUT、CONNECT 、DELETE

常用的請求方式:GET 和POST

例如在表單提交

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

</form>

GET方式提交

a)位址列(URI)會跟上引數資料。以?開頭,多個引數之間以&分割

b)GET提交引數資料有限制,不超過1KB。

c)GET方式不適合提交敏感密碼。

d)注:瀏覽器直接訪問的請求,預設提交方式是GET方式

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

POST方式提交

a)引數不URI後面。而是跟在請求的實體內容中。

b)POST提交的引數資料沒有限制。

c)POST方式提交敏感資料

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

②請求資源 

URI: 統一資源標記符。(如:/day09/hello用於標記任何資源可以是本地檔案系統,區域網的資源,也可以是網際網路。

URL:  統一資源定位符。(如:http://localhost:8080/day09/testImg.html只能定位網際網路資源。是URI的子集。

③協議版本

2.2.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  -- 請求發出的時間

2.2.3空行與實體內容

一個空行:http協議資料規範

實體內容:post提交的引數列表

2.3HttpServletRequest物件

HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,開發人員通過這個物件的方法,可以獲得客戶這些資訊

HttpServletRequest物件用於獲取請求資訊當繼承HttpServlet類之後,在重寫的doGet方法或doPost方法中:

獲取請求行:

request.getMethod();    //請求方式


request.getRequetURI()  //請求資源

request.getRequetURL()


request.getProtocol()   //請求協議版本

獲取請求頭:

request.getHeader("名稱")   //根據請求頭獲取請求值

request.getHeaderNames()    //獲取所有的請求頭名稱

獲取實體內容:

request.getInputStream()   //獲取post方式實體內容資料

GET方式引數URI後面,獲取方式

request.getQueryString();

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

request.getParameter("引數名");  //根據引數名獲取引數值,只能獲取一個值 的引數

request.getParameterValue("引數名“);//根據引數名獲取引數值,可以獲取 多個值的引數

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

getParameter()方法預設使用iso-8859-1編碼解析,所以對中文引數可能會出現亂碼。

修改POST方式引數編碼:

在呼叫getParameter()方法之前先設定:

request.setCharacterEncoding("utf-8");

修改GET方式引數編碼:

只能針對每一個引數,進行手動解碼:

String name = new String(name.getBytes("iso-8859-1"),"utf-8");

2.4響應資訊

HTTP/1.1 200 OK                      --響應行

Server: Apache-Coyote/1.1           --響應頭(key-vaule)

Content-Length: 24 

Date: Fri, 30 Jan 2015 01:54:57 GMT

                                       --一個空行

this is hello servlet!!!              --實體內容(瀏覽器看到的內容)

2.4.1響應行

包含協議版本、狀態碼、狀態描述三個部分。

 狀態碼用於表示伺服器對請求的處理結果,它是一個三位的十進位制數。響應狀態碼分為5類,如下所示:

狀態碼

含義

100~199

表示成功接收請求,要求客戶端繼續提交下一次請求才能完成整個處理過程

200~299 

表示成功接收請求並已完成整個處理過程,常用200

300~399

為完成請求,客戶需進一步細化請求。例如,請求的資源已經移動一個新地址,常用302、307和304

400~499

客戶端的請求有錯誤,常用404

500~599

伺服器端出現錯誤,常用 500

常見的狀態:

200 :  表示請求處理完成並完美返回

302:   表示請求需要進一步細化。
404:   表示客戶訪問的資源找不到。

500:   表示伺服器的資源傳送錯誤。(伺服器內部錯誤)

2.4.2響應頭

常見響應頭如下:

 

Location: http://www.it315.org/index.jsp  --表示重定向的地址,該頭和302的狀態碼一起使用。

Server:apache tomcat                        --表示伺服器的型別

Content-Encoding: gzip                -- 表示伺服器傳送給瀏覽器的資料壓縮型別

Content-Length: 80                    --表示伺服器傳送給瀏覽器的資料長度

Content-Language: zh-cn               --表示伺服器支援的語言

Content-Type: text/html; charset=GB2312   --表示伺服器傳送給瀏覽器的資料型別及內容編碼

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --表示伺服器資源的最後修改時間

Refresh: 1;url=http://www.it315.org     --表示定時重新整理

Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器以下載方式開啟資源(下載檔案時用)

Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --表示伺服器傳送給瀏覽器的cookie資訊(會話管理用)

Expires: -1                           --表示通知瀏覽器不進行快取

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive           --表示伺服器和瀏覽器的連線狀態

2.5HttpServletResponse物件

HttpServletResponse物件用來修改響應資訊:
 

//響應行:

response.setStatus()  //設定狀態碼

//響應頭:

response.setHeader("name","value")       //設定指定引數列表

//實體內容:

response.getWriter().writer();           // 向瀏覽器傳送字元實體內容

response.getOutputStream().writer()      //向瀏覽器傳送位元組實體內容