servlet簡介轉載自 http://www.cnblogs.com/libingbin/
阿新 • • 發佈:2018-11-27
1.Servlet
[1] Servlet簡介
> Server + let
> 意為:執行在伺服器端的小程式。
> Servlet實際上就是一個介面。
- 狹義上的Servlet,指的就是Servlet介面
- 廣義上的我們認為凡是實現Servlet介面的類,我們都稱他是一個Servlet *****
> Servlet的作用:
1.接收使用者傳送的請求
2.呼叫其他的java程式來處理請求
3.根據處理結果,返回給使用者一個頁面
> Servlet的HelloWorld
1.建立一個類並實現Servlet介面
2.在web.xml檔案中對Servlet進行配置
<servlet>
<servlet-name>別名</servlet-name>
<servlet-class>全類名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>別名</servlet-name>
<url-pattern>需要servlet處理的請求地址</url-pattern>
</servlet-mapping>
> Servlet的三個名字:
<servlet-name>
- Servlet的別名,程式設計師通過別名對Servlet進行配置
<servlet-class>
- Servlet的全類名,伺服器通過全類名來建立Servlet的例項
<url-pattern>
- Servlet對映的請求地址,使用者通過該地址訪問Servlet
[2] Servlet的生命週期
> Servlet的生命週期,指Servlet的物件從被建立到被銷燬的過程。
> Servlet的生命週期方法:
1.構造器:
- Servlet第一次處理請求時,會呼叫構造器,來建立Servlet例項。
- 只會呼叫一次,Servlet是單例模式,他是以多執行緒的方式呼叫service()方法.
- Servlet不是執行緒安全,所以儘量不要再service()方法中操作全域性變數。
2.init()方法:
- 構造器呼叫之後馬上被呼叫,用來初始化Servlet,只會呼叫一次。
3.service()方法:
- Servlet每次處理請求時都會呼叫service()方法,用來處理請求,會呼叫多次。
4.destroy()方法:
- Servlet物件銷燬前(WEB專案解除安裝時)呼叫,用來做一些收尾工作,釋放資源。
[3] 相關介面
①ServletConfig
代表:當前Servlet的配置資訊,每一個Servlet都有其唯一對應的ServletConfig。
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.atguigu.servlet.AServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</init-param>
</servlet>
獲取:由Tomcat伺服器建立,最終作為引數傳遞到init()方法中,我們可以在init()方法直接使用。
當我們通過繼承HttpServlet建立Servlet時,由於父類已經實現ServletConfig介面,
所以我們可以在Servlet中直接呼叫ServletConfig的方法。
功能:
【1】 獲取Servlet的別名
【2】 獲取當前Servlet的初始化引數。
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</init-param>
【3】 獲取當前WEB應用的ServletContext物件。
②ServletContext
代表:當前的WEB應用,一個WEB應用對應一個唯一的ServletContext物件,
ServletContext物件在專案啟動時建立,在專案解除安裝時銷燬。
獲取:通過ServletConfig的getServletContext()方法獲取。
功能:
【1】 可以獲取整個WEB應用的初始化引數
<context-param>
<param-name>phone</param-name>
<param-value>1388888888</param-value>
</context-param>
【2】 可以獲取資源的真實路徑(物理路徑),主要在檔案的上傳和下載時使用。
【3】 可以作為一個域物件在不同的web資源之間共享資料。(下回分解)
[4] GenericServlet
- 通用Servlet的父類
- 相比Servlet介面GenericServlet更加簡單一些,但是我們最終實際上使用的HttpServlet
[5] HttpServlet
- HttpServlet繼承了GenericServlet,而GenericServlet實現Servlet介面
- 所以我們可以同構繼承HttpServlet來建立一個Servlet。
- HttpServlet重寫service()方法:
1.在該方法中先將ServletRequest和ServletResponse
強轉為了HttpServletRequest和HttpServletResponse。
2.然呼叫過載的service()方法,並將剛剛強轉得到物件傳遞到過載的方法中。
- 過載service(HttpServletRequest request , HttpServletResponse response)
1.在方法中獲取請求的方式(get或post)
2.在根據不同的請求方式去呼叫不同的方法:
如果是GET請求,則呼叫doGet(HttpServletRequest request , HttpServletResponse response)
如果是post請求,則呼叫doPost(HttpServletRequest request , HttpServletResponse response)
- 結論:
當通過繼承HttpServlet來建立一個Servlet時,我們只需要根據要處理的請求的型別,來重寫不同的方法。
處理get請求,則重寫doGet()
處理post請求,則重寫doPost()
[6] HttpServletRequest
代表:瀏覽器傳送給伺服器的請求報文。
獲取:該物件由Tomcat伺服器建立,最終作為引數傳遞到doGet或doPost方法中,我們可以在這兩個方法中直接使用。
功能:
【1】獲取使用者傳送的請求引數
request.getParameter("username");
【2】獲取專案的名字(用來設定絕對路徑)
request.getContextPath();
【3】作為一個域物件,在不同的WEB資源之間共享資料。
【4】請求的轉發
request.getRequestDispatcher("target.html").forward(request, response);
[7] HttpServletResponse
代表:伺服器傳送給瀏覽器的響應報文。
獲取:該物件由Tomcat伺服器建立,最終作為引數傳遞到doGet或doPost方法中,我們可以在這兩個方法中直接使用。
功能:
【1】響應給瀏覽器一個網頁或者是網頁片段(設定的是響應報文的響應體)
response.getWriter("");
【2】請求的重定向
response.sendRedirect("target.html");
轉發和重定向:(掌握)
轉發 重定向
請求的次數: 1 2
發生的位置 伺服器內部 瀏覽器
瀏覽器位址列 不改變 改變
瀏覽器的感知 不知道 知道
[8] 字元編碼
> 當用戶通過表單向Servlet傳送中文請求引數時,Servlet獲取到內容會產生亂碼,
當Servlet向瀏覽器響應中文內容時,也會產生亂碼。
> 瀏覽器和伺服器之間通訊時,中文內容時不能直接傳送的,需要對中文進行編碼。
> 編碼:
- 將字元轉換為二進位制碼的過程叫編碼。
> 解碼:
- 將二進位制碼轉換為普通字元的過程叫解碼。
> 編碼和解碼所採用的規則我們稱為字符集。
> 產生亂碼問題的根本原因:
編碼和解碼所採用的字符集不同。
> 解決方法:
統一編碼和解碼的字符集為UTF-8。
> 常見字符集:
1.ASCII
2.ISO8859-1
3.GBK
4.GB2312
5.UTF-8
> 請求編碼
- 請求是瀏覽器傳送給伺服器的。
- 瀏覽器 --> 伺服器
- 瀏覽器 編碼
> 瀏覽器的會自動使用網頁的字符集對引數進行編碼
UTF-8的張三:%E5%BC%A0%E4%B8%89
GBK的張三:%D5%C5%C8%FD
> 所以我們只需要統一網頁的字符集為UTF-8即可。
- 伺服器 解碼
post請求
> request解碼時預設字符集時iso8859-1,但是iso壓根就不支援中文
> post請求在servlet中解碼,所以我們只需要指定request的字符集即可。
> 我們可以通過如下方法,來設定request的字符集:
request.setCharacterEncoding("utf-8");
> 注意:
該方法要在request.getParameter()第一次呼叫之前呼叫
get請求
> get請求是通過url地址傳遞請求引數,url中的請求引數將會被Tomcat伺服器自動解碼。
> Tomcat的預設編碼是iso8859-1,但是iso壓根就不支援中文,所以必然亂碼。
> 只需要修改Tomcat的解碼的預設字符集,修改配置檔案server.xml
> 在server.xml的Connector標籤中(改埠號的那個標籤)新增如下屬性:
URIEncoding="utf-8"
> 修改完配置檔案以後,get請求的編碼就不用再處理的,但是post請求還是老樣子。
> 響應編碼
- 響應是伺服器傳送給瀏覽器
- 伺服器 --> 瀏覽器
- 伺服器 編碼
> 指定伺服器的編碼字符集為UTF-8。
> 指定response的字符集
response.setCharacterEncoding("utf-8");
> 雖然我們已經指定了response的字符集為utf-8,但是瀏覽器並不是用utf-8解碼。
瀏覽器預設使用gb2312解碼的,所以依然亂碼,只不過沒有那麼亂。
- 瀏覽器 解碼
> 瀏覽器的解碼字符集可以通過瀏覽器來設定(不靠譜)
> 我們可以通過伺服器來告訴瀏覽器,我們的內容的編碼格式為utf-8
> 我們可以通過一個響應頭來告訴瀏覽器,內容的編碼格式:
Content-Type:text/html;charset=utf-8
> 通過response的方法,來設定響應頭:
response.setHeader("Content-Type", "text/html;charset=utf-8");
解決方案:
1.設定響應頭
response.setHeader("Content-Type", "text/html;charset=utf-8");
2.設定response的編碼格式
response.setCharacterEncoding("utf-8");
> 當我們設定Content-Type這個響應頭時,伺服器會自動使用響應頭中的字符集為內容編碼。
> 最終方案:
response.setContentType("text/html;charset=utf-8");
總結:
post請求:
- 在request.getParameter()方法第一次呼叫之前,呼叫如下程式碼:
request.setCharacterEncoding("utf-8");
get請求:
- 修改server.xml配置檔案
- <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
響應:
- 設定一個Content-Type響應頭
response.setContentType("text/html;charset=utf-8");
[9] 路徑問題
> URI和URL
- URL是URI的一種實現,也是URI最常見的實現方式。
- URI有兩種實現方式URL和URN,URN用的很少
- 我們說URL和URI實際上可以理解為一個意思
> URL地址的格式
http://主機名:埠號/專案名/資源路徑/資源名
①相對路徑和絕對路徑
> 相對路徑
- 之前我們使用的路徑全都是相對路徑:
- 所謂的相對路徑指相對於當前資源所在路徑:
http://主機名:埠號/專案名/資源路徑/
- 由於轉發的出現,相對路徑會經常發生變化,容易出現錯誤的連結
所以在開發中我們一般不使用相對路徑,而是使用絕對路徑。
> 絕對路徑
- 絕對路徑使用/開頭
- 由瀏覽器解析的絕對路徑中的/代表的是伺服器的根目錄:
http://主機名:埠號/
注意:需要加上專案名
- 由伺服器解析的絕對路徑中的/代表的專案的根目錄:
http://主機名:埠號/專案名/
注意:不要加專案名
- 轉發的路徑由伺服器解析,設定絕對路徑時不需要加專案名
- 重定向的路徑由瀏覽器解析,設定絕對路徑時需要加上專案名
②常見的路徑:
url-pattern:
轉發的路徑:
- url-pattern和轉發中的路徑都是由伺服器解析的,
根目錄是專案的根目錄:
http://主機名:埠號/專案名/
- 所以這兩個路徑不需要加專案名
重定向的路徑:
頁面中的路徑:
- 重定向和頁面中的路徑(HTML標籤中的路徑),由瀏覽器解析的,
根目錄是伺服器的根目錄:
http://主機名:埠號/
- 所以這個兩個路徑必須加上專案名
[10]執行的流程
[11]HttpServlet
轉載請註明出處!
http://www.cnblogs.com/libingbin/
感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。