一文把Servlet整的明明白白!1??
一、Servlet概述

1.1、Servlet是什么
Servlet 是 JavaEE 規范之一。規范就是接口。
Servlet 就 JavaWeb 三大組件之一。三大組件分別是:Servlet 程序、Filter 過濾器、Listener -。
Servlet 是運行在服務器上的一個 java 小程序,它可以接收客戶端發送過來的請求,并響應數據給客戶端。
簡單來說:Servlet 是運行在 Web服務器(如Tomcat服務器)的,使用 Java編寫的小應用程序。
1.2、Servlet的示范
public class HelloServlet implements Servlet { /** * service 方法是專門用來處理請求和響應的 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet 被訪問了"); } }
1.3、常見錯誤
1.3.1、url-pattern 中配置的路徑沒有以斜杠打頭
1.3.2、servlet-name 配置的值不存在
二、Servlet生命周期
2.1、Servlet生命周期
Servlet 對象的生命周期:Servlet 創建對象–>初始化操作–> 運行操作–>銷毀操作
Web 服務器管理了 Servlet 的生命周期,Servlet 對象整個過程都是 Web 服務器來管理的。
2.2、Servlet 接口中生命周期方法
2.3、Servlet的請求流程
localhost:8080/one/hello # 1. 瀏覽器發送請求,Tomcat接收到請求并通過結息請求地址來獲取到要訪問的項目路徑和資源路徑。 項目路徑:/one 資源路徑:/hello # 2. Tomcat會掃描服務器內部的one項目下的所有Servlet,獲取每一個Servlet的訪問地址,并存儲到一個集合中。資源路徑作為ket,類的全限定名作為value。 Map
2.4、Servlet的繼承體系
2.4.1、GenericServlet類
默認實現了 Servlet 和 ServletConfig 這兩個接口,它的子類是 HttpServlet,如果我們寫的Servlet使用的是 Http 協議。
package cn.servlet; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet(urlPatterns = "/demo") public class DemoServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("我是GenericServlet子類"); } }
2.4.2、HttpServlet類
package cn.httpservlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/demo02") public class DemoServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是HttpServlet的子類"); } }
2.4.3、小結
GenericServlet 是一個通用的 Servlet,可以用來處理各種協議發出的請求和響應。
HttpServlet 是專門用來處理 HTTP 協議發送的請求,現在所有的瀏覽器發請求都是使用 HTTP 協議,因此以后我們開發 Servlet 只需要繼承 HttpServlet 即可,可以按照如下步驟開發:
1. 創建類繼承 HttpServlet 2. 重寫參數帶著 Http 開頭的 service 方法:在該方法中處理請求并響應數據。 注意事項:不要在該方法中調用父類的 service 方法(405)
2.5、ServletConfig 類
ServletConfig 類從類名上來看,就知道是 Servlet 程序的配置信息類。
Servlet 程序和 ServletConfig 對象都是由 Tomcat 負責創建,我們負責使用。
Servlet 程序默認是第一次訪問的時候創建,ServletConfig 是每個 Servlet 程序創建時,就創建一個對應的 ServletConfig 對象。
2.5.1、ServletConfig 類的三大作用
可以獲取 Servlet 程序的別名 servlet-name 的值。
獲取初始化參數 init-param。
獲取 ServletContext 對象。
2.5.2、常用方法
2.5.3、使用演示
根據不同的編碼格式響應數據給瀏覽器,編碼格式作為Servlet的初始化配置參數,在Servlet的service方法中讀取初始化配置參數并輸出。
public class ServletConfigServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得配置對象 ServletConfig config = this.getServletConfig(); // 獲得初始化參數值 String encoding = config.getInitParameter("encoding"); if ("utf-8".equalsIgnoreCase(encoding)){ // 模擬響應數據給瀏覽器 System.out.println("執行utf-8編碼操作"); } else { // 模擬響應數據給瀏覽器 System.out.println("執行gbk編碼操作"); } } }
2.6、ServletContext 類
2.6.1、ServletContext概述
ServletContext 是一個接口,它表示 Servlet 上下文對象,**一個 web 工程,只有一個 ServletContext 對象實例。**ServletContext 對象是一個域對象。ServletContext 是在 web 工程部署啟動的時候創建。在 web 工程停止的時候銷毀。
2.6.2、ServletContext 類的四個作用
獲取 web.xml 中配置的上下文參數 context-param。
獲取當前的工程路徑,格式: /工程路徑。
獲取工程部署后在服務器硬盤上的絕對路徑。
像 Map 一樣存取數據
2.7、域對象
域對象,是可以像 Map 一樣存取數據的對象,叫域對象。這里的域指的是存取數據的操作范圍,整個 web 工程。
他的作用是數據共享。
2.8、 loadOnStartup
讓 web 容器啟動的時候創建并初始化 Servlet。取值范圍1到10,值越小越先加載。默認值是-1:代表第1次訪問時創建和初始化
他可以在xml中進行配置:
他還可以利用注解配置的方法:
@WebServlet(urlPatterns = "/response", loadOnStartup =1)
三、請求對象
3.1、HttpServletRequest 對象概述
HttpServletRequest 是一個接口,該接口的實現類對象稱為請求對象,請求對象封裝了所有的請求信息(請求行,請求頭,請求體(請求參數))。
HttpServletRequest 接口包含了大量的方法。由 Tomcat 去實現這個對象,并且在 servlet 啟動的時候調用service() 將請求對象傳遞進來了。我們在 service 方法中直接使用即可。
3.2、HttpServletRequest 對象常用方法
package com.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/line") public class RequestLineServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得請求行信息 System.out.println("得到方法:" + request.getMethod()); System.out.println("統一資源標識符:" + request.getRequestURI()); System.out.println("統一資源定位符:" + request.getRequestURL()); System.out.println("協議和版本:" + request.getProtocol()); System.out.println("當前項目地址:" + request.getContextPath()); // 得到一個請求頭 System.out.println("得到host的請求頭值:" + request.getHeader("host")); } }
3.3、請求參數亂碼問題(POST)
3.3.1、請求參數產生亂碼的原因
在瀏覽器發送數據給服務器的時候,使用 utf-8 編碼,但服務器解碼默認使用 ISO-8859-1 解碼:歐洲碼,不支持漢字的。
如果是 GET 請求且 Tomcat 版本大于8.0.5,則不需要考慮亂碼問題,否則 GET 請求也需要考慮亂碼問題。
3.3.2、POST方式亂碼解決方案
解決方法:request.setCharacterEncoding(“utf-8”) 設置請求參數的編碼為UTF-8。
代碼位置:設置請求的編碼這句話一定放在獲取請求參數之前。
頁面的編碼:這個編碼一定要與頁面的編碼相同。如果頁面使用的是 GBK,則這里也要用GBK。
四、響應對象
4.1、HttpServletResponse對象概述
HttpServletResponse 是一個接口,該接口的實現類對象稱為響應對象,用于響應數據(響應行,響應頭,響應體)給瀏覽器。HttpServletResponse 接口包含了大量的方法。由 Tomcat 去實現這個對象,并且在 servlet 啟動的時候調用 service() 將請求對象和響應對象傳遞進來了。我們在 service 方法中直接使用即可。
4.2、響應數據相關方法
@WebServlet(urlPatterns = "/response") public class ResponseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲得字符打印流對象 PrintWriter out = response.getWriter(); // 響應數據給瀏覽器顯示 out.print("
hello browser"); } }
4.3、響應內容中文亂碼問題
4.3.1、亂碼原因
因為 Tomcat 中響應體默認的是歐洲碼表,ISO-8859-1 不支持中文。
4.3.2、解決辦法
在獲得打印流對象之前,通過下面方法設置打印流的編碼為utf-8
@WebServlet(urlPatterns = "/response") public class ResponseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設置打印流編碼 response.setCharacterEncoding("utf-8"); // 獲得字符打印流對象 PrintWriter out = response.getWriter(); // 響應數據給瀏覽器顯示 out.print("
你好 browser"); } }
通過下面方法告訴瀏覽器返回數據類型和編碼
@WebServlet(urlPatterns = "/response") public class ResponseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 設置打印流編碼 // response.setCharacterEncoding("utf-8"); // 告訴瀏覽器返回內容類型并設置打印流編碼 response.setContentType("text/html;charset=utf-8"); // 獲得字符打印流對象 PrintWriter out = response.getWriter(); // 響應數據給瀏覽器顯示 out.print("
你好 browser"); } }
HTTP Java Servlet
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。