當前位置: 妍妍網 > 碼農

21 道JavaWeb經典面試題總結(2024修訂版)

2024-04-28碼農


回復1024,獲取13萬字445道Java經典面試題pdf

大家好,我是哪咤。

本系列是【 10萬字208道Java經典面試題總結(附答案) 】的2024修訂版。

1、說說 Servlet 的基本架構

Servlet 是 Java Web 應用程式中處理客戶端請求並生成響應的重要元件,它的基本架構可以分為以下幾個部份:

(1)Servlet 介面

Servlet 介面是所有 Servlet 類必須實作的介面,它定義了處理客戶端請求的常見方法,包括初始化、請求處理和銷毀等。在 Servlet 介面中,最常見的方法包括 init()、service() 和 destroy()。

(2)Servlet 容器

Servlet 容器是負責管理和執行 Servlet 的環境,可以理解為一個 Web 伺服器或者套用伺服器。Servlet 容器負責載入、例項化、初始化、呼叫服務方法和銷毀 Servlet 例項。在 Java 中,常見的 Servlet 容器包括 Tomcat、Jetty、Undertow 等。

(3)部署描述符

部署描述符是一個 XML 檔,它包含了關於 Servlet 的配置資訊,包括 Servlet 名稱、URL 對映、初始化參數、引入其他 Servlet 或過濾器等。在 Java Web 套用中,典型的部署描述符是 web.xml 檔。

(4)Servlet 類

Servlet 類是實作 Servlet 介面的具體類,它負責處理客戶端請求並生成響應。在 Servlet 類中,通常實作了 init()、service() 和 destroy() 方法,也可以覆蓋 doGet()、doPost() 等方法來處理不同型別的請求。

(5)請求和響應物件

在 Servlet 中,可以透過請求物件 HttpServletRequest 和響應物件 HttpServletResponse 來與客戶端進行通訊。請求物件封裝了客戶端發送的請求資訊,而響應物件負責生成伺服器返回的響應內容。

當客戶端發送請求時,Servlet 容器會根據部署描述符中的對映資訊選擇合適的 Servlet 例項來處理請求。Servlet 例項接收到請求後,呼叫其 service() 方法來處理請求並生成響應。然後響應會被發回客戶端。

這就是 Servlet 的基本架構,它提供了一個在 Java Web 應用程式中處理客戶端請求的標準化方式,並且可以透過實作不同的 Servlet 類來實作特定的業務邏輯。

2、說一說 Servlet 的生命周期?

Servlet 的生命周期包括的階段:

載入和例項化:當容器啟動時,會根據部署描述符(web.xml)或註解等配置資訊載入並例項化 Servlet。容器會建立 ServletConfig 物件,並將部署描述符中的初始化參數傳遞給 Servlet 例項。

初始化:在 Servlet 例項化後,容器會呼叫其 init() 方法來執行一些初始化任務。通常可以在 init() 方法中進行一些初始化操作,比如建立資料庫連線、載入配置檔等。init() 方法只會在 Servlet 例項第一次被建立時執行一次。

服務請求:一旦初始化完成,Servlet 就可以響應客戶端的請求。當客戶端發送請求時,Servlet 容器會呼叫 Servlet 的 service() 方法來處理請求。service() 方法會根據請求型別(GET、POST 等)來呼叫相應的 doGet()、doPost() 等方法。這是 Servlet 生命周期中最頻繁呼叫的階段,用來處理客戶端的請求並生成響應。

銷毀:當 Servlet 容器決定將 Servlet 例項銷毀時,會呼叫其 destroy() 方法。在 destroy() 方法中可以清理資源,比如關閉資料庫連線、釋放記憶體等。Servlet 例項銷毀時會執行 destroy() 方法,代表 Servlet 生命周期的結束。

3、如何實作一個自訂的 servlet?

① 建立一個新的 Java 類,並讓它繼承 HttpServlet 類。這樣可以確保你的類成為一個 Servlet;

② 在你的自訂類中,你需要重寫 doGet 或 doPost 方法。這些方法將定義你的 Servlet 處理請求的行為;

③ 將你的自訂 Servlet 編譯成 . class 檔,並將它放在 WEB-INF/ classes 目錄下(或者將 . class 檔打包成 .war 檔放在 webapps 目錄下)。你還需要在 web.xml 檔中配置你的 Servlet。

如下所示:

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet- class>com.nezha.MyServlet</servlet- class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>

根據實際需求,你可能需要處理初始化、銷毀等其他方法。另外,你也可以使用註解來代替 web.xml 的配置。

4、servlet中有哪些核心類?都有什麽特點?

(1)Servlet 介面

Servlet 介面是所有 servlet 類的基礎介面。所有的 Servlet 類都必須實作這個介面,並且提供處理客戶端請求的邏輯。在 Servlet 介面中定義了一系列的生命周期方法,包括 init、service 和 destroy。透過實作這些方法,可以在 servlet 例項的生命周期中執行初始化、處理請求和資源銷毀等操作。

(2)HttpServlet

HttpServlet 是 Servlet 的抽象子類別,它提供了專門用於處理 HTTP 請求的方法。它進一步擴充套件了 GenericServlet,並增加了處理 HTTP GET、POST、PUT、DELETE 等請求的方法。大多數 Web 應用程式中的 Servlet 都是繼承自 HttpServlet。

(3)HttpServletRequest

代表客戶端的請求資訊,包含了請求行、請求頭和請求體等資訊,提供了獲取參數、請求頭數據、請求內容等方法。

(4)HttpServletResponse

代表伺服器的響應資訊,用於構建和發送回客戶端的響應,提供了設定狀態碼、添加響應頭、寫入響應體等方法。

5、什麽情況下呼叫 doGet()和 doPost()?

當客戶端發送的請求使用了 HTTP GET 方法時,Servlet 容器會呼叫 Servlet 的 doGet() 方法來處理該請求。

當客戶端發送的請求使用了 HTTP POST 方法時,Servlet 容器會呼叫 Servlet 的 doPost() 方法來處理該請求。

GET請求通常用於請求數據或查詢資訊,它的特點是請求的數據會附加在URL之後,並且是可見的。因此,GET請求不適合傳輸敏感資訊,如密碼或銀行帳戶資訊。

POST 請求通常用於向伺服器發送數據,進行數據修改、送出或發送較大的數據等操作。比如,向伺服器送出表單數據。

6、request.getAttribute() 和 request.getParameter() 有何區別?

request.getParameter() 方法用於獲取客戶端請求中的查詢參數(GET 請求)或表單參數(POST 請求)。它返回的是一個字串型別,用於表示指定參數名對應的參數值。

request.getAttribute() 方法用於獲取在伺服器端範圍內共享的數據,這些數據通常是透過伺服器端程式碼設定到請求域中的。它返回的是一個 Object 型別的數據,因此需要進行型別轉換才能使用。透過 request.setAttribute() 方法設定的數據可以在同一個請求中的不同資源(如 Servlet、JSP)之間共享。

7、forward 和 redirect 的區別?

可以從三個方面來回答,處理方式、套用場景、效率。

forward是伺服器內部的資源轉發,瀏覽器位址列不會發生變化,使用者無法感知到轉發過程。而redirect則是伺服端通知客戶端進行頁面跳轉,客戶端會發起新的請求到指定的URL,因此瀏覽器位址列會顯示新的地址。

forward通常用於需要根據使用者角色或其他條件來展示不同內容的情況,比如登入後根據使用者許可權轉發到不同的管理頁面。而redirect則常用於需要使用者重新登入或在完成某項操作後返回上一個頁面的場景,如登出後重新導向到登入頁面。

forward由於是伺服器內部處理,通常效率較高,因為它避免了額外的網路請求和響應的延遲。而redirect因為涉及到客戶端的多次請求和響應,所以效率相對較低。

8、jsp 有哪些內建物件?作用分別是什麽?

  1. request,客戶端的請求,用於獲取客戶端透過HTTP協定發送到伺服器的數據,包括請求頭、請求參數、請求方式等;

  2. response,伺服器的響應,用於向客戶端發送數據,包括設定響應頭、發送響應體等;

  3. out,用於向客戶端輸出內容,是JSP頁面中的輸出流;

  4. session,表示客戶端與伺服器之間的一次會話,用於保存使用者的狀態資訊,如使用者登入資訊、購物車數據等;

  5. application,代表整個Web套用的上下文,用於保存全域的資訊,這些資訊在整個Web套用中都是可見的;

  6. pageContext,提供了對JSP頁面內各種物件(如request、response、session等)的存取,以及用於尋找其他資源的API;

  7. config,用於獲取JSP頁面的初始化參數和Servlet上下文資訊;

  8. page,代表JSP頁面本身,可以透過它存取JSP頁面的內容和方法;

  9. exception,當JSP頁面發生異常時,該物件會被自動設定為丟擲的異常物件,允許在JSP頁面中處理異常。

9、jsp 有哪些動作?作用分別是什麽?

在JSP(Java Server Pages)中,動作(Action)是一種特殊的標簽,用於執行特定的操作,比如轉發請求、包含檔、設定內容等。

  1. include 動作,將其他JSP或HTML頁面的內容嵌入到當前JSP頁面中,使得頁面可以動態包含其他頁面的內容。

  2. forward 動作,將請求轉發到其他資源,比如轉發到另一個JSP頁面或Servlet,這樣可以共享請求內容,並且URL會改變。

  3. param 動作,用於設定請求參數,可以將參數添加到包含或轉發的請求中。

  4. setProperty 動作,用於設定JavaBean內容。

  5. getProperty 動作,用於獲取JavaBean的內容值。

  6. useBean 動作,用於例項化JavaBean,如果JavaBean不存在則建立,存在則不建立。

  7. plugin 動作,用於包含外掛程式,一般用於內嵌多媒體物件。

  8. jsp:element 動作,在JSP頁面中生成XML元素。

  9. jsp:attribute 動作,定義自訂標簽的內容,並為內容設定預設值。

  10. jsp:body 動作,在自訂標簽中定義標簽體的內容。

這些動作能夠在JSP頁面中實作各種功能,如包含內容、轉發請求、操作JavaBean等。它們使JSP頁面能夠更加靈活和強大。

10、JSP 中動態 INCLUDE 與靜態 INCLUDE 的區別?

(1)動態 include:

  • 動態 include 是透過 jsp:include 動作實作的,可以在執行時動態地包含另一個 JSP 頁面或 Servlet 的輸出。

  • 可以根據特定的條件或邏輯來決定包含哪個頁面,也可以在迴圈中動態包含不同的頁面。

  • 使用 jsp:include 標簽,例如:<jsp:include page="included.jsp"/>

  • (2)靜態 include:

  • 靜態 include 是在編譯時將指定的 JSP 頁面或 HTML 檔合並到當前 JSP 頁面中,形成一個單一的頁面。

  • 在 JSP 頁面執行之前,包含的內容已經靜態地合並到當前頁面中了。

  • 使用 <%@ include file="included.jsp" %> 語法,其中 file 內容指定要包含的檔。

  • 動態 include 是在執行時進行包含,可以動態決定包含哪個頁面,而靜態 include 是在編譯時靜態地將指定檔的內容合並到當前頁面中,執行時無法改變包含的內容。具體使用時需要根據實際場景來選擇使用動態 include 還是靜態 include。

    11、jsp 和 servlet 有什麽區別?

    Servlet是用Java編寫的伺服器端程式,它的主要功能是處理客戶端的請求並生成動態Web內容。Servlet是Java Web套用的基礎,負責接收請求、處理請求、生成響應。

    JSP本質上是一種特殊的Servlet,它允許開發者在HTML頁面中直接嵌入Java程式碼片段(scriptlets)、JSP動作、JSP指令以及運算式等,以生成動態Web頁面。JSP的主要目的是使開發者能夠更容易地建立動態Web頁面,而無需編寫大量的Java程式碼。

    12、說一下 jsp 的 4 種作用域?

    (1)Page作用域

    最窄的作用域,它僅限於當前的JSP頁面。當頁面處理完成後,儲存在page作用域中的任何數據都將被丟棄。此作用域通常用於儲存僅在當前頁面中使用的臨時變量。

    (2)Request作用域

    這個作用域涵蓋了單個HTTP請求及其對應的響應。在此作用域中定義的任何數據都可以在同一請求中的多個頁面之間共享,但當請求處理完畢後,這些數據就會失效。這適用於跨多個JSP頁面傳遞數據的情況。

    (3)Session作用域

    此作用域與特定的使用者會話相關聯。在一個使用者存取網站期間,該使用者的所有請求都可以存取session作用域中的數據。當使用者離開網站或會話超時,session中的數據才會被清除。這通常用於儲存需要跟蹤使用者狀態的資訊,比如購物車內容或者登入資訊。

    (4)Application作用域

    最寬泛的作用域,它適用於整個Web應用程式。在此作用域中聲明的數據對所有使用者和所有請求都是可見的,並且在整個應用程式的生命周期內都有效。常用於儲存應用程式級別的資訊,例如配置參數或統計資訊。

    13、session 和 cookie 有什麽區別?

    Session和Cookie的主要區別在於儲存位置、儲存容量以及儲存有效期。

    ① 儲存位置:Cookie數據資訊存放在客戶端瀏覽器中,而Session的數據資訊存放在伺服器上。

    ② 儲存容量:Cookie的儲存容量較小,一般不超過4KB,而Session的儲存容量理論上沒有限制,但為了伺服器效能考慮,通常不會存放過多數據。

    ③ 儲存有效期:Cookie可以設定為長時間保持,甚至可以設定到期時間來實作長期儲存,而Session的失效時間通常較短,一般為會話結束或瀏覽器關閉時失效。

    14、如果客戶端禁止 cookie 能實作 session 還能用嗎?

    一般預設情況下,在會話中,伺服器儲存 session 的 sessionid 是透過 cookie 存到瀏覽器裏。

    如果瀏覽器禁用了 cookie,瀏覽器請求伺服器無法攜帶 sessionid,伺服器無法辨識請求中的使用者身份,session失效。

    但是可以透過其他方法在禁用 cookie 的情況下,可以繼續使用session。

    1. 透過url重寫,把 sessionid 作為參數追加的原 url 中,後續的瀏覽器與伺服器互動中攜帶 sessionid 參數。

    2. 伺服器的返回數據中包含 sessionid,瀏覽器發送請求時,攜帶 sessionid 參數。

    3. 透過 Http 協定其他 header 欄位,伺服器每次返回時設定該 header 欄位資訊,瀏覽器中 js 讀取該 header 欄位,請求伺服器時,js設定攜帶該 header 欄位。

    15、Token、Cookie、Session的區別?

    Token 是一種用於認證和授權的令牌,通常由伺服器生成並行送給客戶端。客戶端在收到 Token 後,將其儲存在本地,然後在每次需要進行身份驗證或授權時使用該 Token。常見的 Token 包括 JWT (JSON Web Token) 和 OAuth Token。Token 在客戶端和伺服器之間進行永續性的認證和授權,通常用於實作跨域身份驗證。

    Cookie 是一種在客戶端中儲存的小型文本數據,由伺服器發送給客戶端,隨後在每次請求中透過 HTTP 頭部發送回伺服器。通常用於儲存使用者的身份驗證資訊、使用者設定、瀏覽歷史等。Cookie 是儲存在客戶端的,可以設定過期時間和路徑,不同頁面之間共享。

    Session 是伺服器端用於儲存使用者會話狀態的機制,通常使用 Session ID 來標識使用者會話。當使用者第一次存取伺服器時,伺服器會為其建立一個 session,然後將 session ID 儲存在 cookie 或者 URL 中,用於在該使用者的後續請求中進行身份驗證和狀態管理。Session 數據儲存在伺服器端,相對於 Cookie 更安全、更難被篡改,但也需要伺服器維護和消耗更多的資源。

    16、說一下 session 的工作原理?

    ① 客戶端發送請求:當使用者發送請求到伺服器時,伺服器會為該使用者建立一個唯一辨識的 session ID,並將其返回給客戶端,在 HTTP Response Header 中可以使用 Set-Cookie 來設定這個 session ID。通常情況下,這個 session ID 會以一個名為 "JSESSIONID" 的 Cookie 儲存在客戶端。

    ② 伺服器端儲存會話數據:當伺服器收到客戶端的請求時,會檢查請求中是否包含有效的 session ID。如果存在有效的 session ID,伺服器就會使用這個 session ID 來獲取對應的會話數據。如果沒有有效的 session ID,伺服器會建立一個新的 session,並為其分配一個新的 session ID。伺服器端會針對每個 session ID 維護一個對應的會話數據儲存,可以儲存使用者的身份驗證資訊、使用者設定、購物車數據等使用者會話相關的資訊。

    ③ 與客戶端互動:在處理完客戶端的請求後,伺服器會將 session ID 返回給客戶端,在 HTTP Response Header 中使用 Set-Cookie。客戶端會儲存這個 session ID,在後續的請求中將其包含在 HTTP 請求頭中,伺服器透過 session ID 來辨識使用者,並獲取對應的會話數據進行處理。

    ④ 會話超時和銷毀:在一定的時間間隔後,若使用者沒有活動,伺服器可能會認為該會話已經超時並銷毀會話數據,釋放資源。這樣可以保證伺服器的資源不會被無效的會話占用。

    簡而言之,Session 的工作原理是透過在伺服器端建立、儲存和管理會話數據,並透過在客戶端使用 session ID 進行身份驗證和狀態管理,實作使用者會話的跟蹤和狀態維護。

    17、http 響應碼 301 和 302 代表的是什麽?有什麽區別?

    http 響應碼 301:

  • 301表示請求的資源已經永久移動到了一個新的 URL 地址。

  • 當伺服器返回 301 狀態碼時,它會在響應頭中包含一個 Location 內容,客戶端會根據該內容進行重新導向。

  • 客戶端在後續的請求中會直接請求新的 URL 地址。

  • http 響應碼 302:

  • 302示請求的資源暫時性地移動到了一個新的 URL 地址。

  • 客戶端會在收到響應後根據 Location 頭資訊跳轉到新的 URL。但客戶端在後續的請求中會繼續請求原來的 URL 地址。

  • 302 響應不會被瀏覽器緩存,每次請求時會重新執行跳轉。

  • 18、tomcat 如何調優?

    調整Tomcat的效能和最佳化配置是提高Web應用程式效能的重要步驟。

    以下是一些最佳化Tomcat的常見方法:

    (1)調整記憶體分配

    將JVM最大堆大小(-Xmx)和初始堆大小(-Xms)設定為合適的值,以確保應用程式執行期間有足夠的記憶體,一般建議堆的最大值設定為可用記憶體的最大值的 80%。

    調整新生代和老年代的比例,可以使用參數 -XX:NewSize 和 -XX:MaxNewSize 調整新生代堆大小。

    (2)調整執行緒池和連線池

    配置Tomcat的連線和執行緒池大小,確保它能夠處理預期的並行請求,可以透過調整 maxThreads、minSpareThreads 和 maxConnections 等參數進行配置。

    使用合適的連線池,例如對於資料庫連線,可以使用連線池來管理連線,以提高效能和資源利用率。

    (3)啟用壓縮

    啟用Tomcat的壓縮功能,可以透過配置啟用GZIP壓縮,減小傳輸內容的大小,提高效能。

    (4)最佳化靜態資源處理

    使用獨立的Web伺服器(如Nginx或Apache)作為前置伺服器,處理靜態資源和緩存請求,減輕Tomcat伺服器負擔。

    針對Tomcat內建的靜態資源緩存,可以透過配置添加Expires或Cache-Control響應頭來緩存靜態資源。

    (5)監控和調整

    使用監控工具如JConsole、JVisualVM或者效能工具如VisualVM來監控Tomcat效能,辨識效能瓶頸並做相應調整。

    根據監控結果,適時調整JVM和Tomcat的配置參數,以最佳化效能。

    19、如何增加 tomcat 的連線數?

    1. maxConnections參數決定了Tomcat能夠同時處理的最大連線數。在BIO模式下,預設最大連線數是它的最大執行緒數(一般設定為200)。

    2. maxThreads參數列示Tomcat接收客戶端請求的最大執行緒數,即同時處理任務的個數。在高並行的I/O密集型套用中,這個值可以設定為1000左右以提升處理能力。

    3. 使用NIO模式,因為NIO是非阻塞的IO,可以提高Tomcat在高並行環境下的效能。

    4. 調整acceptCount,當執行緒數量達到maxThreads設定的值時,acceptCount決定了所能接受的最大排隊數量,超過這個值,新的請求會被拒絕。

    5. 如果單個Tomcat例項無法滿足需求,可以考慮使用負載均衡器將流量分發到多個Tomcat例項。

    20、如何增加Tomcat的記憶體?

    要增加 Tomcat 的記憶體,你需要調整 Tomcat 執行時的JVM參數。以下是一般步驟:

    ① 找到 Tomcat 的啟動指令碼

    Tomcat 的啟動指令碼通常位於 bin 目錄下,具體檔名可能是 catalina.sh (Linux) 或 catalina.bat (Windows)。

    ② 編輯啟動指令碼,設定 JVM 參數

    在啟動指令碼中找到 JAVA_OPTS 或 CATALINA_OPTS 變量,並增加 -Xmx 和 -Xms 參數來分別設定最大堆和初始堆大小。

    範例:

    CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m" 這將會將初始堆大小設定為512MB,最大堆大小設定為1024MB。你可以根據實際情況調整這些值。

    ③ 重新開機 Tomcat 伺服器

    保存啟動指令碼並重新開機 Tomcat 伺服器,以套用新的記憶體設定。

    21、Tomcat 有幾種部署方式?

    ① 將WAR包或資料夾直接放置到Tomcat的webapps目錄下,Tomcat會自動解壓並部署計畫,缺點是需要重新開機計畫。

    ② 不想放在webapps下,也可以在Tomcat的server.xml檔中配置 標簽,添加 標簽來指定計畫的WAR包路徑。(一般采用①)。

    ③ 可以將Tomcat執行在Docker容器中,透過Dockerfile或者docker-compose檔來管理和部署應用程式。

    ④ 可以將 Tomcat 套用部署到雲服務提供商(如AWS、Azure、Google Cloud等)的雲伺服器上,實作靈活的彈性部署,按需分配資源。

    - EOF -

    推薦閱讀 點選標題可跳轉

    回復1024,獲取13萬字445道Java經典面試題pdf

    ·················END·················

    本系列是【10萬字208道Java經典面試題總結(附答案)】的2024修訂版,打造Java面試題一站式解決方案。

    新建了Java面試交流群,有興趣的小夥伴可以添加哪咤微信,備註面試交流群加入。