基於javaWeb階段下的Servlet總結,javaweb階段servlet
1. Servlet概述
Servlet是用Java語言編寫的服務端的程式,採用request--response模式提供Web服務,並且支援標準ServletAPI,Servlet就一個運行在web伺服器上的小的Java程式,用於處理從web用戶端發送的請求,並且對請求作出響應。現在目前版本為3.1。
2. Servlet實現過程
1).用戶端向伺服器端發送請求;
2).伺服器端發送請求到Servlet;
3).Servlet產生響應內容並再傳給伺服器端(一般產生的響應內容是根據從伺服器中用戶端的請求而決定的);
4).從伺服器再響應返回用戶端;
3. Servlet生命週期
簡單來講,Servlet的生命週期就是在伺服器內從建立到請求響應再到銷毀的全部過程。
在eclipse來看,init()方法就是Servlet執行個體化,也就是被建立,注意:無論Servlet在伺服器請求或者響應多少次,init()只會執行一次;
service()方法,會根據用戶端(一般指前段)的請求方式,會調用doPost或者doGet方法;而執行伺服器的請求和響應;destroy()方法是Servlet從伺服器移除或者關閉時,就代表Servlet已經被銷毀了。
4. Servlet啟動時載入
ervlet對象是第一次被訪問的時候會被建立的,init方法就會執行,從而會銷耗一些時間,在eclipse配置web.xml檔案將Servlet的執行個體化的過程放在伺服器啟動的時候(讓伺服器啟動的時候建立Servlet的對象)。用<load-on-startup>來配置,注意,在Tomcat伺服器載入是1秒,因而我們配置的時間最好不要小於1秒。
在web.xml中配置Servlet
<servlet>
<serlvet-name>自訂名稱</serlvet-name>
<servlet-class>帶包名的類路徑</servlet-class>
<load-on-startup>時間單位:秒</load-on-startup>
</servlet>
<servlet-mapping>
<serlvet-name>自訂名稱</serlvet-name>
<url-pattern>/路徑 出現在地址欄中</url-pattern>
</servlet-mapping>
5. Servlet訪問路徑的配置
完全路徑匹配 以"/"開頭
目錄匹配 以"/"開頭,以"*"結尾
副檔名匹配 以"*"開頭
範圍的範圍大小:完全路徑匹配 > 目錄匹配 > 副檔名匹配
6. Servlet和HttpServlet的區別
HttpServlet是繼承於Servlet,同時HttpServlet滿足Servlet所有的方法,HttpServlet是個類,而Servlet是個介面。HttpServlet是一個與協議相關的Servlet是專門用來處理Http協議的請求。通常編寫一個Servlet一般都會讓這個Servlet繼承HttpServlet重寫service方法。所以往往繼承了HttpServlet之後不需要重寫service方法,只需要重寫doGet和doPost方法即可。往往請求要處理的內容的代碼都是一致的,所以需 要讓doGet和doPost相互調用可以簡化編程。
7. ServletConfig和ServletContext的區別
ServletConfig是在Servlet的設定檔中,在使用<url-pattern>標籤來配置Servlet的一些初始化參數,後為了建立Servlet執行個體對象時,這些資料會封裝到ServletConfig中;而ServletContext是在整個web應用時,從而初始化的參數就會封裝在ServletContext,同時也包含ServletConfig的所有參數,在多個Servlet對象之間的通訊就用ServletContext來聯絡。
總之,簡單來說ServletConfig是獲得Servlet的相關的配置的對象,相當於一個類,而ServletContext是獲得整個web的相關的配置的對象,相當於整個項目。
8. ServletConfig和ServletContext的各自的方法
1).ServletConfig的方法
擷取ServletConfig對象: getServletConfig()
擷取Servlet的初始化參數: getInitparameterNames()
擷取Servlet的初始化參數(單個): getInitparameter(String name)
擷取ServletContext對象: getServletContext()
擷取Servlet的名稱: getServletName()
2).ServletContext的方法
擷取ServletContext對象: getServletContext()
擷取檔案的MIME類型: getMimeType(String file)
擷取web項目請求工程名: getContextPath()
擷取全域的初始化參數: getInitparameterNames()
擷取全域的初始化參數(單個): getInitparameter(String name)
9. ServletContext範圍及方法
範圍:指的是將資料存入到域對象中,而這個資料就會有一定的作用範圍。範圍指的是一定的作用範圍。所以,ServletContext範圍是整個全域,及web整個項目
方法:
存入資料: setAttribute(String name, Object object)
擷取資料: getAttribute(String name)
移除資料: removeAttribute(String name)
10. Response請求資料
ServletResponse介面和HttpServletResponse介面的區別:HttpServletResponse是繼承於ServletResponse,同時HttpServletResponse滿足ServletResponse所有的方法,HttpServletResponse是帶有Http協議的,與HttpServlet一致。
一般常用的響應的狀態代碼:200 正確;302 重新導向;304 尋找本機快取;404 請求資源不存在;500 伺服器內部錯誤
11. Response的方法
設定響應狀態代碼: setStatus(int so)
設定回應標頭: setHeader(String name, String value)
添加回應標頭: addHeader(String name, String value)
字元流寫入響應體: getWriter()
位元組流寫入響應體: getOutoutStream()
重新導向: sendRedirect(String string)
設定瀏覽器採用的字元集: setContentType(String string)
設定響應字元流的緩衝區字元集:setCharacterEncoding(String charset)
伺服器向瀏覽器回寫Cookie: addCookie(Cookie cookie)
12. Request接收資料
ServletRequest介面和HttpServletRequest介面的區別:與ServletResponse介面和HttpServletResponse介面的區別一致。
13. Request的方法
擷取請求方式: getMethed()
獲得請求路徑後的提交參數的字串: getQueryString()
獲得請求路徑的URL: getRequestURL()
獲得請求路徑的URI: getRequestURI()
獲得用戶端的IP地址: getRemoteAddr()
獲得一個key對應一個value的要求標頭: getHeader(String name)
獲得一個key對應多個value的要求標頭: getHeaders(String names)
提交的參數(一個name對應一個value): getParameter(String name)
提交的參數(一個name對應多個value): getParameterValues(String names)
提交的參數(Map集合方式): getParameterMap()
儲存資料: setAttribute(String name, Object object)
擷取資料: getAttribute(String name)
移除資料: removeAttribute(String name)
14. Response和Request的中文亂碼
因為,Servlet的語言設定是ISO-8850-1,是不支援中文的,因而在請求和響應是出現中文亂碼。
1).Response解決中文亂碼
a.位元組流響應中文
原因:其實這個亂碼的產生與中文轉成位元組數組及瀏覽器開啟檔案(開啟的時候採用的預設字元集)有關。
解決:將中文轉成位元組數組的時候和瀏覽器預設開啟的時候採用的字元集一致即可,都轉換UTF-8。
解決代碼:
ServletOutoutStream out = response.getOutoutStream();
response.setHeader("Content-Type","text/html;charset=utf-8");
out.write("中文的字串".getBytes("utf-8"));
b.字元流響應中文
原因:字元流是有緩衝區的,response獲得字元流,response設計預設的緩衝區編碼是ISO-8859-1。
解決:設定response獲得字元流緩衝區的編碼和設定瀏覽器預設開啟時候採用的字元集一致即可。
解決代碼:
response.setHeader("Content-Type","text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.getWriter().println("中文的字串");
簡化版:
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("中文的字串");
2).Request解決中文亂碼
a.Post方式接收中文
原因:post提交資料的方式是在請求體中,request對象在接受資料之後,放入到緩衝區中,就會產生緩衝區的編碼是ISO-8859-1。
解決:修改request的緩衝區編碼
解決代碼:
request.setCharacterEncoding("utf-8");
String str = request.getInitparameter("//要修改的參數");
System.out.println(str);
b.Get方式接收中文
原因:post提交資料的方式是在請求行url後面,則會在地址欄進行url編碼
解決:存入到緩衝區的值將ISO-8859-1,以UTF-8解碼
解決代碼:
String encode = URLEncoder.encode(//要修改的參數,"ISO-8859-1");
String decode = URLDecoder.decode(encode,"utf-8");
System.out.println(decode);
解決代碼二:
String //要修改的參數 = request.getParameter("//要修改的參數");
String str = new String(//要修改的參數.getBytes("ISO-8859-1"),"utf-8");
System.out.println(str);
15. Get請求和Post請求的區別
* Get提交方式特點:把資料拼接到地址欄上,無請求體,Post提交方式特點:沒有把提交 資料拼接到地址欄上,有請求體;
* Get提交的參數列表拼接到了地址欄後面;Post方式不會 拼接地址欄;
* Get方式提交的資料敏感資訊不安全;Post方式提交的資料相對安全;
* Get方式提交的資料量有限的;Post方式從理論上提交的資料量 無限大。
故一般開發使用Post請求傳送資料。