Javaweb學習筆記(二):servlet初體驗、HTTP協議
目錄
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手動編寫步驟:
- 編寫一個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概念
瀏覽器向伺服器傳送請求,伺服器對瀏覽器做出響應。http(hypertext 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() //向瀏覽器傳送位元組實體內容