深入理解 JSP 與 Servlet:原理、交互及實戰應用

一、引言

在 Java Web 開發領域,JSP(JavaServer Pages)和 Servlet 是兩個至關重要的技術,它們共同構成了動態網頁開發的基礎。Servlet 作為服務器端的 Java 程序,負責處理客戶端請求并生成響應;而 JSP 則是一種簡化的 Servlet 開發方式,允許開發者在 HTML 頁面中嵌入 Java 代碼,使頁面的開發更加直觀和便捷。本文將深入探討 Servlet 的生命周期、請求響應處理機制,以及 JSP 與 Servlet 的交互原理,并通過一個真實的項目實戰來加深理解。

二、Servlet 詳解

2.1 Servlet 生命周期

Servlet 的生命周期包括加載、實例化、初始化、服務和銷毀五個階段,每個階段都對應著特定的方法調用。以下是詳細的生命周期流程圖:

2.1.1 加載

當客戶端首次請求訪問一個 Servlet 時,Web 容器(如 Tomcat)會查找該 Servlet 的類文件,并將其加載到內存中。

2.1.2 實例化

Web 容器使用 new 關鍵字創建 Servlet 類的實例。一個 Servlet 類在整個 Web 應用程序的生命周期中通常只會被實例化一次。

2.1.3 初始化

在實例化之后,Web 容器會調用 Servlet 的 init() 方法進行初始化操作。init() 方法只會被調用一次,通常用于加載配置文件、建立數據庫連接等初始化工作。以下是一個簡單的 Servlet 初始化示例:

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("Servlet 初始化");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 服務方法}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {// 銷毀方法}
}
2.1.4 服務

當客戶端發送請求時,Web 容器會調用 Servlet 的 service() 方法來處理請求并生成響應。service() 方法會根據請求的類型(如 GET、POST)調用相應的 doGet() 或 doPost() 方法。以下是一個處理 GET 請求的示例:

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;
import java.io.PrintWriter;@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/html;charset=UTF-8");PrintWriter out = res.getWriter();out.println("<html>");out.println("<head><title>Hello Servlet</title></head>");out.println("<body>");out.println("<h1>Hello, Servlet!</h1>");out.println("</body>");out.println("</html>");}
}
2.1.5 銷毀

當 Web 應用程序關閉或 Servlet 被卸載時,Web 容器會調用 Servlet 的 destroy() 方法進行資源釋放操作,如關閉數據庫連接、釋放文件句柄等。

2.2 請求響應處理

在 Servlet 中,通過 HttpServletRequest 和 HttpServletResponse 對象來處理客戶端請求和返回響應。

2.2.1 請求參數解析

HttpServletRequest 對象提供了一系列方法來獲取請求參數,如 getParameter()getParameterValues() 等。以下是一個解析請求參數的示例:

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;
import java.io.PrintWriter;@WebServlet("/paramServlet")
public class ParamServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {String name = req.getParameter("name");String age = req.getParameter("age");res.setContentType("text/html;charset=UTF-8");PrintWriter out = res.getWriter();out.println("<html>");out.println("<head><title>Request Parameters</title></head>");out.println("<body>");out.println("<h1>Name: " + name + "</h1>");out.println("<h1>Age: " + age + "</h1>");out.println("</body>");out.println("</html>");}
}
2.2.2 響應內容設置

HttpServletResponse 對象用于設置響應的內容類型、狀態碼和輸出響應內容。以下是一個設置響應內容的示例:

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;
import java.io.PrintWriter;@WebServlet("/responseServlet")
public class ResponseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/plain;charset=UTF-8");res.setStatus(HttpServletResponse.SC_OK);PrintWriter out = res.getWriter();out.println("這是一個響應示例");}
}

三、Servlet 與 JSP 的交互

3.1 JSP 本質

JSP 本質上是 Servlet 的一種特殊形式。當 JSP 頁面第一次被請求時,Web 容器會將 JSP 頁面翻譯成一個 Servlet 類,并編譯成字節碼文件。這個過程由 JSP 引擎自動完成,開發者無需手動干預。以下是 JSP 翻譯為 Servlet 的流程圖:

3.2 協同工作原理

Servlet 和 JSP 可以協同工作實現動態網頁開發。通常,Servlet 負責處理業務邏輯和數據處理,而 JSP 負責頁面的展示。以下是一個簡單的項目架構圖,展示了 Servlet 和 JSP 的協同工作方式:

四、真實項目實戰

4.1 項目需求

開發一個簡單的用戶信息管理系統,包括用戶信息的添加、查詢和顯示功能。

4.2 項目結構圖

user-management-system
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── example
│       │           ├── controller
│       │           │   ├── AddUserServlet.java
│       │           │   └── ListUsersServlet.java
│       │           └── model
│       │               └── User.java
│       └── webapp
│           ├── WEB-INF
│           │   └── web.xml
│           ├── addUser.jsp
│           └── listUsers.jsp

4.3 源碼實現

4.3.1 User.java
package com.example.model;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}
4.3.2 AddUserServlet.java
package com.example.controller;import com.example.model.User;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;
import java.util.ArrayList;
import java.util.List;@WebServlet("/addUser")
public class AddUserServlet extends HttpServlet {private static List<User> users = new ArrayList<>();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {String name = req.getParameter("name");int age = Integer.parseInt(req.getParameter("age"));User user = new User(name, age);users.add(user);res.sendRedirect("listUsers");}
}
4.3.3 ListUsersServlet.java
package com.example.controller;import com.example.model.User;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;
import java.util.ArrayList;
import java.util.List;@WebServlet("/listUsers")
public class ListUsersServlet extends HttpServlet {private static List<User> users = new ArrayList<>();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {req.setAttribute("users", users);req.getRequestDispatcher("listUsers.jsp").forward(req, res);}
}
4.3.4 addUser.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>添加用戶</title>
</head>
<body><form action="addUser" method="post"><label for="name">姓名:</label><input type="text" id="name" name="name" required><br><label for="age">年齡:</label><input type="number" id="age" name="age" required><br><input type="submit" value="添加"></form>
</body>
</html>
4.3.5 listUsers.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><title>用戶列表</title>
</head>
<body><h1>用戶列表</h1><table border="1"><tr><th>姓名</th><th>年齡</th></tr><c:forEach items="${users}" var

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71649.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71649.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 隨著 Web 瀏覽器能力的增加&#xff0c;其復雜性也在迅速增加。從很多方面看&#xff0c;現代 Web 瀏覽器已經成為構建于諸多規范之上、集不同 API 于一身的“瑞士軍刀”。瀏覽器規范的生態在某種程度上是混亂而無序的。一些規范如 HTML5&…

AI芯片的關鍵特征

AI芯片是專門為人工智能應用設計的芯片&#xff0c;以下是其應具備的關鍵特征&#xff1a; 強大的并行計算能力&#xff1a;AI任務如深度學習中的神經網絡訓練和推理&#xff0c;涉及大量矩陣運算和并行數據處理。AI芯片需有眾多計算單元&#xff08;如GPU的大量流處理器、ASIC…

go 模塊管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保證:go的版本升級為1.11以上,go mod依賴的最底版本 go env 查看go的環境變量 go env 開啟go mod # 標識開啟go的模塊管理 set GO111MODULE=on GO111MODULE有三個值:off, on和auto(默認值)。 GO111M…

Unity 適用于單機游戲的紅點系統(前綴樹 | 數據結構 | 設計模式 | 算法 | 含源碼)

文章目錄 功能包括如何使用 功能包括 紅點數據本地持久化 如果子節點有紅點&#xff0c;父節點也要顯示紅點&#xff0c;父節點紅點數為子節點紅點數的和&#xff1b; 當子節點紅點更新時&#xff0c;對應的父節點也要更新&#xff1b; 當所有子節點都沒有紅點時&#xff0c…

使用API有效率地管理Dynadot域名,為域名部署DNS安全拓展(DNSSEC)

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

Web - JS基礎語法與表達式

概述 這篇文章主要介紹了 JavaScript 的基礎語法&#xff0c;包括代碼書寫位置、ERPL 環境、變量&#xff08;命名規則、默認值、初始化&#xff09;、數據類型&#xff08;基本和復雜&#xff0c;及各類型特點、轉換&#xff09;、表達式和運算符&#xff08;算數、特殊算數、…

一臺服務器將docker image打包去另一天服務器安裝這個鏡像

一臺服務器將docker image打到去另一天服務器安裝這個鏡像 1. 打包2.另一臺服務器執行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一臺服務器執行 docke…

一周學會Flask3 Python Web開發-response響應格式

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 在HTTP響應中&#xff0c;數據可以通過多種格式傳輸。大多數情況下&#xff0c;我們會使用HTML格式&#xff0c;這也是Flask中…

TCP和Http協議

TCP 三次握手&#xff1a; 第一次握手 &#xff1a; 初始狀態&#xff1a;開始時&#xff0c;客戶端處于 CLOSED&#xff08;關閉&#xff09;狀態&#xff0c;服務端處于 LISTEN&#xff08;監聽&#xff09;狀態&#xff0c;等待客戶端的連接請求。客戶端發送請求&#xff…

圖論 之 最小生成樹

文章目錄 題目1584.連接所有點的最小費用 最小生成樹MST&#xff0c;有兩種算法進行求解&#xff0c;分別是Kruskal算法和Prim算法Kruskal算法從邊出發&#xff0c;適合用于稀疏圖Prim算法從頂點出發&#xff0c;適合用于稠密圖&#xff1a;基本思想是從一個起始頂點開始&#…

前端面試之Box盒子布局:核心知識與實戰解析

目錄 引言&#xff1a;布局能力決定前端高度 一、盒模型基礎&#xff1a;看得見的像素戰爭 1. 標準盒模型 vs IE盒模型 2. 核心組成公式 3. 視覺格式化模型 二、傳統布局三劍客 1. 浮動布局&#xff08;Float Layout&#xff09; 2. 定位布局&#xff08;Position Layou…

OnlyOffice:前端編輯器與后端API實現高效辦公

OnlyOffice&#xff1a;前端編輯器與后端API實現高效辦公 一、OnlyOffice概述二、前端編輯器&#xff1a;高效、靈活且易用1. 完善的編輯功能2. 實時協作支持3. 自動保存與版本管理4. 高度自定義的界面 三、后端API&#xff1a;管理文檔、用戶與權限1. 輕松集成與定制2. 實時協…

Python多線程編程理解面試題解析

一、多線程介紹 Python 的多線程是一種實現并發編程的方式&#xff0c;允許程序同時執行多個任務。然而&#xff0c;由于 Python 的全局解釋器鎖&#xff08;GIL&#xff09;的存在&#xff0c;多線程在某些場景下可能無法充分利用多核 CPU 的性能。以下是對 Python 多線程的理…

如何通過 Python 實現一個消息隊列,為在線客服系統與海外運營的APP對接

對方有兩個核心需求: 訪客上線的時候,要通知對方的業務系統,業務系統根據訪客的身份信息,推送個性化的歡迎詞。訪客完成下單的時候,要能推送一個下單成功的通知,并且包含訂單信息和鏈接。根據這兩個需求,那就需要實現由客服系統到業務系統的消息隊列推送,以及通過 Open…

中文Build a Large Language Model (From Scratch) 免費獲取全文

中文pdf下載地址&#xff1a;https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取碼&#xff1a;lshj 原文、代碼、視頻項目地址&#xff1a;https://github.com/rasbt/LLMs-from-scratch 翻譯工具&#xff1a;沉浸式翻譯&#xff08;https://app.immersivetrans…

項目設置內網 IP 訪問實現方案

在我們平常的開發工作中&#xff0c;項目開發、測試完成后進行部署上線。比如電商網站、新聞網站、社交網站等&#xff0c;通常對訪問不會進行限制。但是像企業內部網站、內部管理系統等&#xff0c;這種系統一般都需要限制訪問&#xff0c;比如內網才能訪問等。那么一個網站應…

elf_loader:一個使用Rust編寫的ELF加載器

本文介紹一個使用Rust實現的ELF加載器。 下面是elf_loader的倉庫鏈接&#xff1a; github&#xff1a; https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader crates.io&#xff1a; https://crates.io/crates/elf_loaderhttps://crates.io/cra…

數據庫驅動免費下載(Oracle、Mysql、達夢、Postgresql)

數據庫驅動找起來好麻煩&#xff0c;我整理到了一起&#xff0c;需要的朋友免費下載&#xff1a;驅動下載 目前收錄了Oracle、Mysql、達夢、Postgresql的數據庫驅動的多個版本&#xff0c;后續可能會分享更多。

對接扣子雙向流式 TTS Demo

Web端對接Demo <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>TTS 測試</title> </head><body><h1>TTS 測試頁面</h1><textarea id"textInput" rows&…

科普:“git“與“github“

Git與GitHub的關系可以理解為&#xff1a;Git是一種軟件工具&#xff0c;而GitHub則是一個在線平臺&#xff0c;它們是“一家子”。二者的關聯最直接體現在你通過Git在GitHub倉庫中clone軟件包到你的機器中來。 具體來說&#xff1a; 一、Git 定義&#xff1a;Git是一個開源的…