JAVA--Servlet複習
1.Servlet是什麼?
servlet是一個執行在伺服器端的小應用程式。通過HTTP協議接受和相應來自Web客戶端的請求。
提到web客戶端的請求和對web客戶端的響應,必須瞭解HTTP協議。
2.HTTP協議
HTTP協議用於定義web瀏覽器(客戶端)和web伺服器(伺服器端)之間交換資料的過程以及交換的資料的格式。
(1)請求部分
請求部分包括請求訊息行、請求訊息頭以及訊息正文。
請求訊息行:
請求方式 URI 協議/版本
[GET|POST] uri http/1.1
請求訊息頭
Accept-[Charset|Encoding|Language]:告訴伺服器瀏覽器可接受的MIME型別(即客戶端能接受什麼型別的檔案)。
Accept-Charset:客戶端瀏覽器支援哪種字符集
Accept-Encoding:客戶端瀏覽器能進進行解碼的資料編碼方式。eg.gzip
Accept-Language:客戶端瀏覽器希望接受的語言種類。
Host:初始URL中的主機和埠號
Referer:包含一個url,使用者從該url代表的頁面出發訪問當前請求的頁面。
Content-Type:內容型別。告訴伺服器,客戶端瀏覽器傳輸資料的MIME型別(檔案傳輸型別).eg.application/x-www-form-urlencoded;
User-Agent:瀏覽器型別;IE,Chrome
Content-Length:請求訊息正文的長度
Connection:表示是否需要持久連線。預設為Keep-Alive(持久連線)。
Cookie:設定伺服器使用Set-Cookie傳送的http cookie。
Date:請求時間
訊息正文:
當請求方式是POST時,才能看到訊息正文
(2)響應部分
響應部分包括響應訊息行、響應訊息頭和響應正文
響應訊息行:
協議/版本 響應狀態碼 對響應狀態碼的描述
HTTP/1.1 200 OK
響應狀態碼包括:
200 正常
302/307 重定向
304 未修改(表示當前客戶端快取的版本是最新版)
404 伺服器上不存在客戶端請求的資源
500 伺服器內部錯誤
響應訊息頭:(常用)
Location:指示新的資源的位置。通常和302/307一起使用完成請求重定向
Server:apache tomcat指示伺服器的型別
Content-Encoding:gzip伺服器傳送的資料採用的編碼型別
Content-Length:80 告知客戶端瀏覽器響應正文的長度
Content-Language:zh-cn 伺服器傳送的文字的語言
Content-Type:text/html;charset=GB2312伺服器傳送的內容的MIME型別(檔案的傳輸型別)
Refresh:1;url=http://www.xxx.com指示客戶端重新整理的頻率,單位為秒。可用於還剩幾秒跳轉頁面。
Content-Dispositation:attachment;filename=aaa.zip 告訴客戶端這是要下載的檔案
Set-Cookie:xx=xx 伺服器端傳送的Cookie
響應正文:
在網頁右鍵檢視原始碼即可檢視
3.Servlet生命週期
例項化-》初始化-》服務-》銷燬
出生:(例項化new-》初始化init)第一次訪問servlet時出生
活著:(服務service)應用活著,servlet就活著
死亡:(銷燬)應用解除安裝了,servlet就銷燬。
注:可通過在註解@WebServlet中配置load-on-startup,使servlet在伺服器啟動時就建立
4.Servlet的三種建立方式
(1)實現javax.servlet.Servlet介面
(2)繼承javax.servlet.GenericServlet類(介面卡模式)重寫service方法
介面卡模式,GenericSelvlet是個抽象類,只有service方法是抽象方法,其餘的都已經實現了servlet的方法
(3)繼承javax.servlet.http.HttpServlet類(模板方法設計模式) 常用。但注意不要重寫servic()方法。只重寫doGet()和doPost()即可。因為HttpServlet的service方法中使用的是doget和dopost方法
5.Serlvet配置url-pattern
匹配規則:
優先順序:絕對匹配 > /開頭匹配 > 副檔名方式匹配
絕對匹配是指沒有使用萬用字元*,*代表任意字串。
/* 任意字元都能識別
*.字串 以*.字串結尾的請求都可以訪問。
/action/* 以/action開頭的請求都可以訪問
如果url-pattern的值是/,表示執行預設對映。所有的資源都可以訪問。
6.Servlet的執行緒安全
Servlet只建立一次,銷燬一次。每次訪問都是多執行緒。所以有執行緒安全問題。所以不要寫全域性變數,只寫區域性變數,使用者不共用變數。
7.ServletConfig的使用
作用1:獲取Servlet的配置資訊。
作用2:獲得ServletContext物件
1 第一種方式獲得配置資訊,其實就是獲得web.xml裡面servlet標籤下的init-param標籤內的param-value 2 private ServletConfig config; 3 @Override 4 public void init(ServletConfig config) throws ServletException { 5 this.config = config; 6 } 7 第二種方式獲得config配置資訊*/ 8 String encoding = this.getServletConfig().getInitParameter("encoding"); 9 10 第三種方式獲得配置資訊 11 String encoding = this.getInitParameter("encoding");//為什麼能使用this.get...是因為該類是繼承了httpservlet,httpservlet繼承了GenericServlet 12 //然後GenericServlet的getIniParameter()返回servletconfig內的getinitParameter方法,所以 13 //就可以直接呼叫。
1 獲取ServletContext物件 2 String name = (String) this.getServletContext().getAttribute("name");
8.ServletContext
ServletContext代表的是整個應用。一個應用只有一個ServletContext物件。單例項。ServletContext物件實際上就是一個Map(setAttribute和getAttribute)。
常用方法:
域物件:setAttribute(sString , Object ) ,getAttribute(String ) ,rmoveAttribute(String)
獲取全域性配置資訊:getInitParameter(String ) 根據配置檔案中<context-param>標籤下的name得到value
獲取資源路徑:getRealPath(String path) 根據資源名稱得到資源的絕對路徑。可以得到當前應用任何位置的任何資源。
實現servlet的轉發:getRequestDispatcher(String path); 引數表示要跳轉到那裡去。其實質就是請求轉發。注意不是重定向。