博客 / 詳情

返回

【學習筆記 -- Servlet】關於Servlet

1.相關概念

HTML

全稱 Hyper Text Markup Language超文本標記語言,是一種標記語言。它包括一系列標籤.通過這些標籤可以將網絡上的文檔格式統一,使分散的Internet資源連接為一個邏輯整體。HTML文本是由HTML命令組成的描述性文本,HTML命令可以説明文字,圖形、動畫、聲音、表格、鏈接等,可以統一理解為靜態Web資源。

JSP

全稱JavaServer Pages動態網頁創建標準,部署於網絡服務器上,Jsp以Java語言作為腳本,為用户的Http請求提供服務,並且與服務器上的其他Java程序共同處理複雜的業務需求,生成動態HTML。

問題:

用户在訪問靜態數據(圖片,文字...)的時候直接返回靜態頁面,用户訪問在訪問動態數據的時候需要連接數據庫,進行相應的邏輯處理,拿取用户請求的數據,那麼服務器是如何識別處理邏輯的呢?(通過Servlet)
image

Servlet

全稱Servlet Applet服務器連接器,用Java語言編寫的服務器端程序,具有獨立於平台和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容,狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。
image

2.Servlet和JSP區別和聯繫

1.Web容器將Jsp編譯成了jvm能夠識別的Servlet(Java類),Jsp的本質是Servlet。
2.Jsp側重於前端的視圖,Servlet側重於邏輯控制。
3.Servlet沒有內置對象。
4.Jsp中的內置對象由HttpServletRequest,HttpServletResponse,HttpServlet對象的到。
image

3.Servlet項目的開發

步驟一:創建Servlet實現Servlet的一個接口或者繼承Servlet的子類(GenericServlet/HttpServlet),並實現其方法。

image
image
web工程目錄文件的説明
image

(1) Servlet: 工程名稱/項目名稱
(2) src: 源碼目錄, 創建的java源文件、配置文件(properties、xml文件等)都可以放在src源碼目錄下
(3) build/classes: 編譯文件的輸出目錄, src源碼目錄中的文件編譯後會輸出到classes目錄下。
    其中的classes目錄在發佈時會放在WEB-INF目錄下,隨着項目一起發佈到服務器中
(4) WebContent: 就是Web應用的目錄,其中可以存放 html、css、js、jsp、圖片以及編譯後的class文件、jar包、web.xml文件等. 將來發布項目到服務器,其實就是將WebContent中的所有內容一起發佈到服務器中。
(5) WebContent/WEB-INF/lib: 用於存放當前項目所依賴的jar包。比如要訪問mysql數據庫,需要導入mysql驅動包,直接將jar包拷貝到lib目錄下即可!(也不用再去做 build path --> add to build path)
步驟二:創建Web的訪問路徑,即配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ServletDemo</display-name>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>MTingCat.pra.ServletDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/ServletDemo</url-pattern>
  </servlet-mapping>
</web-app>

a) Eclipse每創建一個Servlet,就會在web.xml文件中添加兩個標籤:<servlet>和<servlet-mapping>標籤(可以將這兩個標籤看成一個組的標籤)

b) <servlet>和<servlet-mapping>標籤內都會有一個<servlet-name>標籤,標籤的內容可以更改,但要求更改後的這兩個<servlet-name>標籤的內容也必須一致。

c) <servlet-class>標籤用於配置Servlet類的全限定類名(即包名+類名)

需要注意:如果在創建Servlet後修改了Servlet類的名稱,這個地方也要一起更改,否則將會出現"ClassNotFoundException" 即類找不到異常

d) <url-pattern>標籤用於配置瀏覽器以什麼路徑訪問當前Servlet(即Servlet對外訪問的路徑),默認的路徑是:/類名

例如:上面為HelloServlet配置的<url-pattern>為/HelloServlet,因此我們在瀏覽器中的訪問路徑則為:

[http://主機名/web]項目訪問路徑http://localhost:8089/Servlet/ServletDemo

步驟三:運行於Web端服務器(Tomcat)

image.png
image.png

步驟四:發佈

更改默認發佈路徑【wtpwebapps】改為【webapps 】
image.png

4.Servlet請求方式:請求轉發和重定向

4.1 請求轉發

請求轉發和重定向指的是服務器內部資源的跳轉方式,但是資源的跳轉方式有所不同。
請求轉發指的是瀏覽器請求服務器資源的時候,服務器上的ServletA接收請求,再將請求轉發給ServletB,由ServletB進行業務邏輯的處理,再生成動態頁面做出響應。

請求轉發特點

image

(1)轉發是一次請求,一次響應
(2)請求轉發前後,瀏覽器的地址欄地址不會發生變化。(瀏覽器--訪問--> A --轉發--> B,地址欄地址始終指向A的地址)
(3)請求轉發前後的兩個資源必須屬於同一個Web應用,否則將無法進行轉發。(A--轉發-->B,A和B必須屬於同一個Web應用!)
(4)在轉發時,可以帶數據到目的地(比如,從A轉發到B,可以從A帶數據給B,需要配合域對象才可以)
域對象

request在實現轉發時,通過request.setAttribute方法和request.getAttribute方法帶數據到目的地時,就是通過request對象中的map集合帶數據,這個request對象上的map集合以及request對象所在的範圍即稱之為是一個域對象。

request.setAttribute(String attrName, Object attrValue);
-- 往request域中存入一個域屬性,屬性名(key)只能是字符串,屬性值(value)可以是任意類型。
request.getAttribute(String attrName);
-- 根據屬性名(key)獲取對應的屬性值(value)。返回的是一個Object類型的對象。
域對象的特徵
生命週期

從一次請求開始到做出響應:在服務器調用Servlet程序的service方法之前,會創建代表請求的request對象,在請求處理完,響應結束時,會銷燬request對象。

作用範圍

在一次請求範圍內,可以通過request域帶數據到目的地。

主要功能

和請求轉發配合使用,從Servlet帶數據到JSP(帶數據到目的地)

實現
request.getRequestDispatcher(url地址/轉發到資源的地址).forward(req, res);

4.2 重定向

重定向指的是瀏覽器再訪問服務器的資源時,不能直接得到想要的數據,而是拿到服務器返回的數據,再一次訪問服務器拿到數據。
image

重定向特點
(1)重定向是兩次請求、兩次響應
(2)重定向前後,瀏覽器的地址欄地址會發生變化。(因為兩次請求都是通過瀏覽器發起,瀏覽器知道這個跳轉的過程,因此地址欄地址會變化)
(3)重定向前後的request對象不是同一個(因為重定向是兩次請求,服務器會根據兩次請求創建兩個不同的request對象,request對象不是同一個,也就不能在重定向時通過request帶數據到目的地。)
(4)重定向前後的兩個資源可以是來自不同的web應用,甚至可以是來自不同的服務器。(進行跳轉的兩個資源之間沒有限制)
實現
response.sendRedirect(所重定向到資源的URL地址);
總結:請求轉發(forward)和重定向(redirect)的區別?
(1)請求轉發是一次請求,一次響應; 而重定向是兩次請求兩次響應
(2)請求轉發前後地址欄地址不會發生變化; 而重定向前後地址欄地址會發生變化
(3)請求轉發前後的request對象是同一個,可以配合request域對象帶數據到目的地; 而重定向前後的request對象不是同一個, 不能結合request域對象在重定向前後帶數據.
(4)請求轉發要求兩個資源必須屬於同一個Web應用; 而進行重定向的兩個資源可以是同一個Web應用,也可以不是同一個Web應用,甚至可以是來自於不同的主機或服務器.
總結:什麼時候用請求轉發(forward)?什麼時候用重定向(redirect)?
(1)如果希望跳轉前後地址欄地址不會發生變化, 只能使用轉發; 如果希望跳轉前後地址欄地址會發生變化, 只能使用重定向
(2)如果希望在跳轉前後, 能夠通過request對象帶數據到目的地, 只能使用轉發
(3)如果僅僅是做一個跳轉,沒有其他要求,此時推薦使用轉發(轉發是一次請求,一次響應,可以減少訪問服務器的次數,降低服務器的壓力)

5. Servlet接收前端請求

案例
package MTingCat.pra;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * author: MTingCat@tedu.cn
 * datetime: 2021年2月1日 下午7:08:02
 */
public class Test01 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unused")
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String user = request.getParameter("user").trim();
        System.out.println(user);
        String[] like = request.getParameterValues("like");
        System.out.println( "like="+Arrays.toString(like));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
請求
http://localhost:8089/Servlet/Test01?user=MTingCat&like=Baskateball&like=Football
結果

image.png

6. Servlet模板的創建

配置好Servlet的模板之後,每次需要創建時只需要輸入servlet,Alt+/就可以。
image

package ${enclosing_package};

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * author: MTingCat@tedu.cn
 * datetime: ${date} ${time}
 */
public class ${primary_type_name} extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.