這一陣子在學java三大框架。卻在學習過程當中發現前面的知識已經忘記了。因此決定寫一篇博客來總結回顧以前的學習。html
1.Servlet是什麼?java
servlet是一個運行在服務器端的小應用程序。經過HTTP協議接受和相應來自Web客戶端的請求。web
提到web客戶端的請求和對web客戶端的響應,必須瞭解HTTP協議。apache
2.HTTP協議設計模式
HTTP協議用於定義web瀏覽器(客戶端)和web服務器(服務器端)之間交換數據的過程以及交換的數據的格式。瀏覽器
(1)請求部分緩存
請求部分包括請求消息行、請求消息頭以及消息正文。tomcat
請求消息行:安全
請求方式 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); 參數表示要跳轉到那裏去。其實質就是請求轉發。注意不是重定向。