都路過了,那麼進來學學Servlet處理請求的技術吧

寫在前面: Servlet是JavaWeb的三大組件之一,是較爲重點的知識。今天我整理整個Servlet知識,若對你有所幫助點贊支持^ _^
公衆號:小白編碼

JavaWEB 概述

在Sun的java Servlet規範中,對Java Web應用作了這樣定義:“Java Web應用由一組Servlet、HTML頁、類、以及其它可以被綁定的資源構成。它可以在各種供應商提供的 實現 Servlet 規範的 Servlet 容器 中運行。”

Servlet是什麼

Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作爲來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層。處理請求。

  • Servlet 是JavaEE 規範之一。規範就是接口。

  • Servlet 是JavaWeb 三大組件之一。三大組件分別是 :Servlet 程序、Filter 過濾器、Listener 監聽器。

  • Servlet 是運行在服務器上的一個java 小程序,它可以接收客戶端發送過來的請求,並響應數據給客戶端。

Servlet與Servlet容器

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-z2yuKzYa-1589375146947)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513140009813.png)]

Servlet 作用

Servlet 執行以下主要任務:

  • 讀取客戶端(瀏覽器)發送的顯式的數據。這包括網頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程序的表單。
  • 讀取客戶端(瀏覽器)發送的隱式的 HTTP 請求數據。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
  • 處理數據並生成結果。這個過程可能需要訪問數據庫,執行 RMI 或 CORBA 調用,調用 Web 服務,或者直接計算得出對應的響應。
  • 發送顯式的數據(即文檔)到客戶端(瀏覽器)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進制文件(GIF 圖像)、Excel 等。
  • 發送隱式的 HTTP 響應到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設置 cookies 和緩存參數,以及其他類似的任務。

Servlet相關API

  • javax.servlet 其中包含定義servlet和servlet容器之間契約的類和接口。

  • javax.servlet.http 其中包含定義HTTP Servlet 和Servlet容器之間的關係。

  • javax.servlet.annotation 其中包含標註servlet,Filter,Listener的標註。它還爲被標註元件定義元數據。

  • javax.servlet.descriptor,其中包含提供程序化登錄Web應用程序的配置信息的類型。

Servlet類的繼承結構:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8qB5fyzO-1589375146948)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513142747723.png)]

簡單實現Servlet 程序

1、編寫一個類去實現Servlet 接口
2、實現service 方法,處理請求,並響應數據
3、到web.xml 中去配置servlet 程序的訪問地址
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 被訪問了");
	}
}
web.xml 中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
    <!-- servlet 標籤給Tomcat 配置Servlet 程序-->
    <servlet>
        <!--servlet-name 標籤Servlet 程序起一個別名(一般是類名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是Servlet 程序的全類名-->
        <servlet-class>com.codewihte.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 標籤給servlet 程序配置訪問地址-->
    <servlet-mapping>
        <!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 標籤配置訪問地址<br/>
        / 斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑<br/>
        /hello 表示地址爲:http://ip:port/工程路徑/hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

Servlet類

ServletConfig類

ServletConfig 類從類名上來看,就知道是 Servlet 程序的配置信息類。

Servlet 程序和 ServletConfig 對象都是由 Tomcat 負責創建,我們負責使用。

Servlet 程序默認是第一次訪問的時候創建,ServletConfig 是每個 Servlet 程序創建時,就創建一個對應的 ServletConfig 對象。

ServletConfig 類的三大作用

1、可以獲取 Servlet 程序的別名 servlet-name 的值

2、獲取初始化參數 init-param

3、獲取 ServletContext 對象

xml的配置:

  <!-- servlet 標籤給Tomcat 配置Servlet 程序 -->
    <servlet>
        <!--servlet-name 標籤 Servlet 程序起一個別名(一般是類名) -->
        <servlet-name>ServletConfigTest</servlet-name>
        <!--servlet-class 是Servlet 程序的全類名-->
        <servlet-class>com.codewihte.servlet.ServletConfigTest</servlet-class>
        <!--init-param 是初始化參數-->
        <init-param>
            <!--是參數名-->
            <param-name>username</param-name>
            <!--是參數值-->
            <param-value>root</param-value>
        </init-param>
        <!--init-param 是初始化參數-->
        <init-param>
            <!--是參數名-->
            <param-name>url</param-name>
            <!--是參數值-->
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>
    <!--servlet-mapping 標籤給servlet 程序配置訪問地址-->
    <servlet-mapping>
        <!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個Servlet 程序使用-->
        <servlet-name>ServletConfigTest</servlet-name>
        <!--url-pattern 標籤配置訪問地址-->
        <!--斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑-->
        <!--/hello 表示地址爲:http://ip:port/工程路徑/servletConfigTest-->
        <url-pattern>/servletConfigTest</url-pattern>
    </servlet-mapping>

ServletConfig類

public class ServletConfigTest implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init 初始化方法");

//	1、可以獲取Servlet 程序的別名servlet-name 的值
        System.out.println("HelloServlet 程序的別名是:" + servletConfig.getServletName());
//	2、獲取初始化參數init-param
        System.out.println("初始化參數 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化參數 url 的值是;" + servletConfig.getInitParameter("url"));
//	3、獲取ServletContext 對象
        System.out.println(servletConfig.getServletContext());

    }
 }

啓動的時候能夠看到控制檯:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CPA07eP6-1589375146950)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513144842435.png)]

ServletContext類

1、ServletContext 是一個接口,它表示 Servlet 上下文對象

2、一個 web 工程,只有一個 ServletContext 對象實例。

3、ServletContext 對象是一個域對象。

4、ServletContext 是在 web 工程部署啓動的時候創建。在 web 工程停止的時候銷燬。

ServletContext 類的四個作用

1、獲取 web.xml 中配置的上下文參數 context-param

2、獲取當前的工程路徑,格式: /工程路徑

3、獲取工程部署後在服務器硬盤上的絕對路徑

4、像 Map 一樣存取數據

ServletContext 演示代碼:

public class ServletContextTest extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //	1、獲取web.xml 中配置的上下文參數context-param
        ServletContext context = getServletConfig().getServletContext();

        String username = context.getInitParameter("username");
        System.out.println("context-param 參數 username 的值是:" + username);
        System.out.println("context-param 參數 password 的值是:" +
                context.getInitParameter("password"));
        //	2、獲取當前的工程路徑,格式: /工程路徑
        System.out.println("當前工程路徑:" + context.getContextPath());
        // 3、獲取工程部署後在服務器硬盤上的絕對路徑
/**
 *	/ 斜槓被服務器解析地址爲:http://ip:port/工程名/ 映射到IDEA 代碼的web 目錄<br/>
 */
        System.out.println("工程部署的路徑是:" + context.getRealPath("/"));
        System.out.println("工程下 css 目錄的絕對路徑是:" + context.getRealPath("/css"));
        System.out.println("工程下 imgs 目錄 1.jpg 的絕對路徑是:" + context.getRealPath("/imgs/1.jpg"));


    }
}

xml

 <!--context-param 是上下文參數(它屬於整個web 工程)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>
    <!--context-param 是上下文參數(它屬於整個web 工程)-->
    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>

    <servlet>
        <servlet-name>ServletContextTest</servlet-name>
        <servlet-class>com.codewihte.servlet.ServletContextTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletContextTest</servlet-name>
        <url-pattern>/servletContextTest</url-pattern>
    </servlet-mapping>

HttpServletRequest 類

每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet 和 doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息。

HttpServletRequest 類的常用方法:

getMethod() 獲取請求的方式GET 或POST

getRequestURL() 獲取請求的統一資源定位符(絕對路徑)

getRequestURI() 獲取請求的資源路徑

getQueryString() 返回請求行中的參數部分。

getContextPath() 返回請求資源所屬於的WEB應用程序的路徑。

getServletPath() Servlet的名稱或Servlet所映射的路徑。

getCookies() 返回一個數組,包含客戶端發送該請求的所有的 Cookie 對象。

getSession() 返回與該請求關聯的當前 session 會話,如果請求沒有 session 會話,則創建一個

getRemoteHost() 獲取客戶端的 ip 地址

getHeader() 獲取請求頭

getParameter() 獲取請求的參數

getParameterValues() 獲取請求的參數(多個值的時候使用)

getParameterMap() 獲取封裝成 Map 類型的所有請求參數。

setAttribute(key, value); 設置域數據

getAttribute(key); 獲取域數據

getRequestDispatcher() 獲取請求轉發對象

public class RequestAPIServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // i.getRequestURI()  獲取請求的資源路徑
        System.out.println("URI => " + req.getRequestURI());
        // ii.getRequestURL() 獲取請求的統一資源定位符(絕對路徑)
        System.out.println("URL => " + req.getRequestURL());
        //iii.getRemoteHost() 獲取客戶端的ip 地址
        /*
         *在IDEA 中,使用localhost 訪問時,得到的客戶端 ip 地址是 == =>>>127.0 .0 .1 
         *在IDEA 中,使用127 .0 .0 .1 訪問時,得到的客戶端 ip 地址是 == =>>>127.0 .0 .1 
         *在IDEA 中,使用 真實ip 訪問時,得到的客戶端 ip 地址是 == =>>>真實的客戶端 ip 地址
         */
        System.out.println("客戶端 ip 地址 => " + req.getRemoteHost());
        // iv.getHeader() 獲取請求頭
        System.out.println("請求頭 User-Agent ==>> " + req.getHeader("User-Agent"));
        // vii.getMethod()    獲取請求的方式GET 或POST
        System.out.println("請求的方式 ==>> " + req.getMethod());


    }
}

結果演示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WBsKpsaa-1589375146952)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513194025084.png)]

獲取請求參數

在service中使用的編碼解碼方式默認爲:ISO-8859-1編碼。 所以要設置編碼集,不然會亂碼

表單代碼:

<html>
<body>
<form action="http://localhost:8080/servlet/parameterServlet" method="get">
    用戶名:<input type="text" name="username"><br/>
    密碼:<input type="password" name="password"><br/>
    興趣愛好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">Java
    <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
</body>
</html>

java代碼:

public class ParameterServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 獲取請求參數
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用戶名:" + username);
        System.out.println("密碼:" + password);
        System.out.println("興趣愛好:" + Arrays.asList(hobby));

    }
}

doGet請求的中文亂碼解決:

parameter = new String(username.getBytes("iso-8859-1"),"UTF-8");

doPost請求中文的亂碼解決:

req.setCharacterEncoding("UTF-8"); 

HttpServletResponse類

HttpServletResponse類和 HttpServletRequest 類一樣。每次請求進來,Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。HttpServletRequest表示請求過來的信息HttpServletResponse表示所有響應的信息,我們如果需要設置返回給客戶端的信息,都可以通過 HttpServletResponse 對象來進行設置

編碼問題:response緩衝區的默認編碼是iso8859-1,響應的數據會有亂碼。

字節流 getOutputStream(); 常用於下載(傳遞二進制數據)
字符流 getWriter(); 常用於回傳字符串(常用)

兩個流同時只能使用一個。

使用了字節流,就不能再使用字符流,反之亦然,否則就會報錯。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jdUxLblI-1589375146953)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513195821062.png)]

常用方法:

addCookie(Cookie cookie) 把指定的 cookie 添加到響應。

void addHeader(String name, String value) 添加一個帶有給定的名稱和值的響應報頭。

void setHeader(String name, String value) 設置一個帶有給定的名稱和值的響應報頭。

void setStatus(int sc) 爲該響應設置狀態碼。

sendRedirect(String location) 使用指定的重定向位置 URL 發送臨時重定向響應到客戶端。

如何往客戶端回傳數據

    public class ResponseIOServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//	要求: 往客戶端回傳字符串數據。
            PrintWriter writer = resp.getWritetestr();
            writer.write("test");
        }
    }

響應亂碼解決:

// 同時設置服務器和客戶端都使用UTF-8 字符集,還設置了響應頭
// 此方法一定要在獲取流對象之前調用纔有效
resp.setContentType("text/html; charset=UTF-8");

域對象

域對象,是可以像 Map 一樣存取數據的對象,叫域對象。這裏的域指的是存取數據的操作範圍,整個 web 工程。

存數據 取數據 刪除 數據
Map put() get() remove()
域對象 setAttribute() getAttribute() removeAttribute();

Servlet的生命週期

  • Servlet 通過調用 init () 方法進行初始化。
  • Servlet 調用 service() 方法來處理客戶端的請求。
  • Servlet 通過調用 destroy() 方法終止(結束)。
  • 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

init() 方法

init 方法被設計成只調用一次。它在第一次創建 Servlet 時被調用,在後續每次用戶請求時不再調用。因此,它是用於一次性初始化,就像 Applet 的 init 方法一樣。

Servlet 創建於用戶第一次調用對應於該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啓動時被加載。

當用戶調用一個 Servlet 時,就會創建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地創建或加載一些數據,這些數據將被用於 Servlet 的整個生命週期。

service() 方法

service() 方法是執行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,並把格式化的響應寫回給客戶端。

每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程並調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),並在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器調用,service 方法在適當的時候調用 doGet、doPost、doPut、doDelete 等方法。所以,您不用對 service() 方法做任何動作,您只需要根據來自客戶端的請求類型來重寫 doGet() 或 doPost() 即可。

doGet() 方法

GET 請求來自於一個 URL 的正常請求,或者來自於一個未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

doPost() 方法

POST 請求來自於一個特別指定了 METHOD 爲 POST 的 HTML 表單,它由 doPost() 方法處理。

destroy() 方法

destroy() 方法只會被調用一次,在 Servlet 生命週期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止後臺線程、把 Cookie 列表或點擊計數器寫入到磁盤,並執行其他類似的清理活動。

在調用 destroy() 方法之後,servlet 對象被標記爲垃圾回收。destroy 方法定義如下所示:

架構圖

下圖顯示了一個典型的 Servlet 生命週期方案。

  • 第一個到達服務器的 HTTP 請求被委派到 Servlet 容器。
  • Servlet 容器在調用 service() 方法之前加載 Servlet。
  • 然後 Servlet 容器處理由多個線程產生的多個請求,每個線程執行一個單一的 Servlet 實例的 service() 方法。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NdMUGESU-1589375146955)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513203230278.png)]

Http協議:

什麼是 HTTP 協議

協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議。

所謂 HTTP 協議,就是指,客戶端和服務器之間通信時,發送的數據,需要遵守的規則,叫 HTTP 協議。HTTP 協議中的數據又叫報文

請求的 HTTP 協議格式

客戶端給服務器發送數據叫請求。服務器給客戶端回傳數據叫響應。

請求又分爲 GET 請求,和 POST 請求兩種

GET 請求

1、請求行

請求的方式 GET

請求的資源路徑 [+?+請求參數]

請求的協議的版本號 HTTP/1.1

2、請求頭

key : value 組成 不同的鍵值對,表示不同的含義。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VSqttanC-1589375146956)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513160658435.png)]

POST請求

1、請求行

請求的方式:POST

請求的資源路徑[+?+請求參數]

請求的協議的版本號 : HTTP/1.1

2、請求頭

  1. key : value 不同的請求頭,有不同的含義

空行

1、請求體 就是發送給服務器的數據

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-i3P3zeLl-1589375146956)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513155129824.png)]

常用的請求頭說明:

Accept: 表示客戶端可以接收的數據類型

Accpet-Languege: 表示客戶端可以接收的語言類型

User-Agent: 表示客戶端瀏覽器的信息

Host: 表示請求時的服務器 ip 和端口號

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WybCGEES-1589375146957)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513203758112.png)]

GET 請求一般有:

1、form 標籤 method=get

2、a 標籤

3、link 標籤引入 css

4、Script 標籤引入 js 文件

5、img 標籤引入圖片

6、iframe 引入 html 頁面

7、在瀏覽器地址欄中輸入地址後敲回車

POST 請求一般有:

8、form 標籤 method=post

響應的 HTTP 協議格式

1、響應行

響應的協議和版本號

響應狀態碼

響應狀態描述符

2、響應頭

(1) key : value 不同的響應頭,有其不同含義

空行

3、響應體 就是回傳給客戶端的數據

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Mv2XcZFU-1589375146958)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513160022351.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WNGggVAi-1589375146958)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513203736483.png)]

常用的響應碼說明

200 表示請求成功
302 表示請求重定向(明天講)
404 表示請求服務器已經收到了,但是你要的數據不存在(請求地址錯誤)
500 表示服務器已經收到請求,但是服務器內部錯誤(代碼錯誤)

MIME類型說明

MIME 是 HTTP 協議中數據類型。

MIME 的英文全稱是"Multipurpose Internet Mail Extensions" 多功能 Internet 郵件擴充服務。MIME 類型的格式是“大類型/小類型”,並與某一種文件的擴展名相對應。

常見的 MIME 類型:

文件 MIME 類型
超文本標記語言文本 .html , .htm text/html
普通文本 .txt text/plain
RTF 文本 .rtf application/rtf
GIF 圖形 .gif image/gif
JPEG 圖形 .jpeg,.jpg image/jpeg
au 聲音文件 .au audio/basic
MIDI 音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio 音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG 文件 .mpg,.mpeg video/mpeg
AVI 文件 .avi video/x-msvideo
GZIP 文件 .gz application/x-gzip
TAR 文件 .tar application/x-tar

谷歌查看HTTP協議信息:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-en441CsV-1589375146959)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513151929359.png)]

Servlet訪問

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6XObvKzo-1589375146960)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513163537000.png)]

實現Servlet的常見錯誤:

1.url-pattern中配置的路徑沒有斜槓打頭

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-svFePLJH-1589375146960)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513161521452.png)]

2.servlet-name配置的值不存在:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lPjOWzpX-1589375146961)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513161540702.png)]

3.servlet-class 標籤的全類名配置錯誤:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RwJDxh4U-1589375146962)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513161601023.png)]

請求重定向與請求轉發

請求重定向

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IdS5B968-1589375146963)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513190859457.png)]

請求重定向的特點:

1.瀏覽器地址欄會發生變化

2.兩次請求

3.不共享Request域中數據

4.不能訪問WEB-INF下的資源

5.可以訪問工程外的資源

請求重定向的第一種方案:

設置響應狀態碼302,表示重定向(已搬遷)

resp.setStatus(302);

設置響應頭,說明 新的地址在哪裏

resp.setHeader(“Location”, “http://localhost:8080”);`

請求重定向的第二種方案(推薦使用):

resp.sendRedirect(“http://localhost:8080”);

請求轉發

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FVHt99QA-1589375146964)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513191926667.png)]

請求轉發的特點:

1.瀏覽器地址欄沒有變化

2.他們是一次請求

3.他們共享Request域中的數據

4.可以轉發到WEB-INF目錄下

5.不可以訪問工程以外的資源

代碼演示:

servlet1:

   public class Servlet1 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

                // 獲取請求的參數
                String username = req.getParameter("username");
                System.out.println("servlet1打印的參數" + username);

                // 處理自身業務,並且可以在設置域數據
                req.setAttribute("key1", "serlvet1的數據");

                // 設置Servlet2怎麼走

  //請求轉發必須要以斜槓打頭,/ 斜槓表示地址爲:http://ip:port/工程名/ , 映射到IDEA 代碼的web 目錄
        
                RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
               

                // 走向Sevlet2
                requestDispatcher.forward(req, resp);


            }
        }

servlet2:

 public class Servlet1 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

                // 獲取請求的參數
                String username = req.getParameter("username");
                System.out.println("servlet2打印的參數" + username);

                // 處理自身業務,並且可以在設置域數據
              Object key1  req.getAttribute("key1");
				Sysetm.out.println("查看servlet1的數據" + key1);
     			Sysetm.out.println("處理自身的業務");
			

            }
        }

請求重定向與請求轉發比較

RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。

如果傳遞給HttpServletResponse.sendRedirect方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程序的根目錄。

調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。

HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。

RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。

Base標籤:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rnUJ5CDp-1589375146965)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200513192832375.png)]

Web 中的相對路徑和絕對路徑

在 javaWeb 中,路徑分爲相對路徑和絕對路徑兩種: 相對路徑是:

. 表示當前目錄

… 表示上一級目錄

資源名 表示當前目錄/資源名

絕對路徑:

http://ip:port/工程路徑/資源路徑

在開發中:路徑都使用絕對路徑,不簡單的使用相對路徑

1.絕對路徑

2.base+相對路徑

web 中 / 斜槓的不同意義

在 web 中 / 斜槓 是一種絕對路徑。

/ 斜槓 如果被瀏覽器解析,得到的地址是:http://ip:port/

 <a href="/"> 斜槓 </a>

/ 斜槓 如果被服務器解析,得到的地址是:http://ip:port/工程路徑

1、<url-pattern>/servlet1</url-pattern>

2、servletContext.getRealPath(“/”);

3、request.getRequestDispatcher(“/”);

特殊情況: response.sendRediect(“/”);把斜槓發送給瀏覽器解析。得到http://ip:port/

寫在後邊:

以上就是我學習的全部Servlet知識,如果有錯誤,請大佬留情,指點。
本文資料有些來自:菜鳥教程。百度百科。尚硅谷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章