一文把Servlet整的明明白白!1??

      網友投稿 855 2025-04-04

      一、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 被訪問了"); } }

      HelloServlet com.servlet.HelloServlet HelloServlet /hello

      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 map = new HashMap<>(); map.put("/one","com.servlet.HelloServlet"); # 3. 將資源路徑/one作為key從map中獲取value,得到了類的全限定名。 # 4. 他會預先創建一個Servlet實例緩存池(key是Servlet的全限定名,value是Servlet的實例對象),拿著找到的key,去servletmap中尋找,如果找得到說明不是第一次訪問,如果找不到,說明是第一次訪問。 Map servletmap = new HashMap<>(); if(servletmap.get(“全限定名”) == null){ // 第一次訪問,執行第5步 } else{ // 第N次,直接執行第7步 } # 5. 通過反射實例化這個Servlet對象,并放入實例緩存池中。 # 6. Tomcat創建ServletConfig對象,然后調用init方法,傳入創建的Servlet對象 # 7. 創建HttpRequest和HttpResponse對象,并調用service方法,傳入HttpRequest和HttpResponse對象。 # 8. 等待下一次訪問。

      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)

      一文把Servlet整的明明白白!1??

      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編碼操作"); } } }

      ServletConfigServlet com.servlet encoding utf-8 ServletConfigServlet ServletConfigServlet

      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中進行配置:

      1

      他還可以利用注解配置的方法:

      @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小時內刪除侵權內容。

      上一篇:怎么打印資料(qq怎么打印資料)
      下一篇:設置稿紙方式(文檔稿紙怎么設置)
      相關文章
      亚洲综合激情六月婷婷在线观看| 亚洲VA中文字幕无码毛片| 亚洲av无码乱码国产精品fc2| 久久夜色精品国产亚洲av| 亚洲人成网站观看在线播放| 国产青草亚洲香蕉精品久久| 亚洲av无码成人影院一区| 久久精品国产亚洲av瑜伽| 亚洲av日韩专区在线观看| 亚洲αⅴ无码乱码在线观看性色| 亚洲 日韩 色 图网站| 中文字幕亚洲综合小综合在线| 亚洲五月丁香综合视频| 国产亚洲中文日本不卡二区| 日本亚洲色大成网站www久久| 亚洲午夜无码久久久久软件| 亚洲人成无码网站在线观看| 亚洲国产成人精品无码区花野真一| 亚洲精品无码mⅴ在线观看| 亚洲av无码兔费综合| 日韩亚洲国产二区| 亚洲国产婷婷香蕉久久久久久| 亚洲一区二区三区在线视频| 亚洲乱码中文字幕综合| 国产亚洲一区二区精品| 亚洲国产精品久久久久婷婷老年| 久久精品国产亚洲AV高清热| 亚洲理论片在线观看| 精品亚洲AV无码一区二区 | 亚洲综合小说另类图片动图| 亚洲综合精品第一页| 亚洲Av永久无码精品黑人| 成人亚洲网站www在线观看| 亚洲精品国产综合久久一线| 亚洲无人区一区二区三区| 亚洲va在线va天堂va四虎| 亚洲国产午夜电影在线入口| 国产成人亚洲综合一区| 国产亚洲福利一区二区免费看| 国产精品亚洲综合一区| 亚洲第一精品福利|