【 <一> 煉丹初探:JavaWeb 的起源與基礎】之 Servlet 與 JSP 的協作:MVC 模式的雛形

<前文回顧>

點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、Servlet 和 JSP:一對“老搭檔”

Servlet 和 JSP 這倆玩意兒,就像“老搭檔”,一個負責“干活”,一個負責“展示”。Servlet 是“幕后英雄”,處理業務邏輯;JSP 是“臺前明星”,負責生成動態頁面。這倆配合起來,簡直就是“天衣無縫”。

1.?Servlet 的“苦力活”

Servlet 是 Java 寫的服務器端程序,專門處理 HTTP 請求。它從瀏覽器那兒接活兒,處理完了再把結果扔回去。Servlet 的活兒雖然“苦”,但它是“核心”,沒它 JSP 也“玩不轉”。

Java Code

public class MyServlet extends HttpServlet {

????protected void doGet(HttpServletRequest req, HttpServletResponse resp)

????????throws ServletException, IOException {

????????String name = req.getParameter("name");

????????req.setAttribute("greeting", "你好," + name);

????????req.getRequestDispatcher("/greeting.jsp").forward(req, resp);

????}

}

2.?JSP 的“面子工程”

JSP 是“披著 HTML 外衣的 Java”,專門用來生成動態頁面。它從 Servlet 那兒拿數據,再把數據“打扮”成 HTML,扔給瀏覽器。JSP 的活兒雖然“輕松”,但它是“門面”,沒它 Servlet 也“沒面子”。

Jsp Code

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

????<title>問候頁面,咱沒罵人~</title>

</head>

<body>

????<h1>${greeting}</h1>

</body>

</html>

二、Servlet 和 JSP 的“協作模式”

Servlet 和 JSP 的協作模式,說白了就是“分工合作”。Servlet 負責“干活”,JSP 負責“展示”,這倆配合起來,簡直就是“珠聯璧合”。

1.?請求處理流程

  1. 瀏覽器發請求:瀏覽器發個 HTTP 請求,Servlet 容器一收到,就開始“忙活”了。
  2. Servlet 處理請求:Servlet 從請求里拿數據,處理業務邏輯,再把結果放到請求對象里。
  3. Servlet 轉發請求:Servlet 把請求轉發給 JSP,讓 JSP 生成動態頁面。
  4. JSP 生成頁面:JSP 從請求對象里拿數據,生成 HTML 頁面,扔給瀏覽器。

Jsp Code

req.getRequestDispatcher("/greeting.jsp").forward(req, resp);

2.?數據傳遞

Servlet 和 JSP 之間的數據傳遞,主要靠?HttpServletRequest?對象。Servlet 把數據放到請求對象里,JSP 再從請求對象里拿數據。這就像“傳紙條”,Servlet 寫,JSP 讀。

Jsp Code

req.setAttribute("greeting", "你好," + name);

<h1>${greeting}</h1>

三、MVC 模式的“雛形”

Servlet 和 JSP 的協作模式,其實就是 MVC 模式[1] 的“雛形”。MVC 模式把應用程序分成三層:ModelViewController。Servlet 是?Controller,JSP 是?View,數據是?Model

1.?Controller:Servlet

Servlet 是?Controller,負責處理請求,調用業務邏輯,再把結果交給?View。這就像“指揮”,Servlet 得把每個請求都“安排”得明明白白。

Java Code

public class MyServlet extends HttpServlet {

????protected void doGet(HttpServletRequest req, HttpServletResponse resp)

????????throws ServletException, IOException {

????????String name = req.getParameter("name");

????????String greeting = GreetingService.getGreeting(name);

????????req.setAttribute("greeting", greeting);

????????req.getRequestDispatcher("/greeting.jsp").forward(req, resp);

????}

}

2.?View:JSP

JSP 是?View,負責生成動態頁面,展示數據。這就像“演員”,JSP 得把數據“表演”得漂漂亮亮。

3.?Model:數據

數據是?Model,負責存儲業務數據。這就像“劇本”,數據得把業務邏輯“寫”得清清楚楚。

四、Servlet 和 JSP 的“歷史”:從 JSP 1.0 到 Servlet 4.0

Servlet 和 JSP 從 1999 年誕生到現在,已經走過了 20 多個年頭。雖然現在它們已經有點“過氣”了,但它們的“歷史”還是挺“輝煌”的。

1.?JSP 1.0:初出茅廬

JSP 1.0 在 1999 年發布,是 JSP 的“初代版本”。JSP 1.0 雖然功能簡單,但已經能用來生成動態網頁了。

2.?Servlet 2.3:引入過濾器

Servlet 2.3 在 2001 年發布,引入了過濾器[2],讓開發人員能在請求處理前后做一些“額外操作”。過濾器的引入,讓 Servlet 的“玩法”更加豐富。

Java Code

public class MyFilter implements Filter {

????public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

????????throws IOException, ServletException {

????????// 請求處理前的操作

????????chain.doFilter(req, resp);

????????// 請求處理后的操作

????}

}

3.?JSP 2.0:引入 EL 表達式

JSP 2.0 在 2003 年發布,引入了 EL 表達式[3],讓開發人員能更方便地訪問數據。EL 表達式的引入,讓 JSP 的“玩法”更加豐富。

4.?Servlet 3.0:引入注解

Servlet 3.0 在 2009 年發布,引入了注解[4],讓開發人員能用注解配置 Servlet,不用再寫?web.xml?了。注解的引入,讓 Servlet 的“玩法”更加方便。

Java Code

@WebServlet("/myServlet")

public class MyServlet extends HttpServlet {

????// Servlet 代碼

}

5.?Servlet 4.0:支持 HTTP/2

Servlet 4.0 在 2017 年發布,支持 HTTP/2[5],讓 Web 應用的性能更上一層樓。HTTP/2 的引入,讓 Servlet 的“玩法”更加高效。


專有名詞解釋

  1. MVC 模式:Model-View-Controller,一種設計模式,用于將應用程序分為模型、視圖和控制器三層。
  2. 過濾器:Filter,一種用于在請求處理前后執行額外操作的組件。
  3. EL 表達式:Expression Language,一種用于在 JSP 頁面中訪問數據的表達式語言。
  4. 注解:Annotation,一種用于配置 Servlet 的元數據。
  5. HTTP/2:HTTP 協議的第二個主要版本,支持多路復用、頭部壓縮等特性。

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

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

相關文章

【不是廣告】華為昇騰的一小步,Pytorch的一大步

華為昇騰的一小步&#xff0c;Pytorch的一大步 關鍵詞 首個、中國首個、全球第十、最高級別&#xff01;看看這些字眼&#xff0c;就知道事情不簡單&#xff01; 書接上文《Pytorch的一小步&#xff0c;昇騰芯片的一大步》 在2023年10月4日PyTorch 2.1版本的發布博客上&…

python從入門到精通(二十六):python文件操作之Word全攻略(基于python-docx)

python文件操作之word技巧大全 word技巧基礎到高級操作大全A.準備工作1. 安裝python-docx庫2. 導入庫 B.基礎操作1. 創建Word文檔1.1 創建文檔對象1.2 添加word標題1.3 添加word段落1.4 設置段落樣式1.5 創建有序列表1.6 創建無序列表1.7添加word分頁1.8 添加word圖片1.9 添加w…

Debian二次開發一體化工作站:提升科研效率的智能工具

在科研領域&#xff0c;數據處理是實驗成功的關鍵環節之一。隨著實驗數據的復雜性和規模不斷增加&#xff0c;傳統的數據處理方法已經難以滿足科研人員的需求。這時&#xff0c;一體化工作站應運而生&#xff0c;成為科研實驗數據處理的 “智能大腦”。 一體化工作站&#xff…

linux學習(五)(服務器審查,正常運行時間負載,身份驗證日志,正在運行的服務,評估可用內存)

服務器審查 在 Linux 中審查服務器的過程包括評估服務器的性能、安全性和配置&#xff0c;以確定需要改進的領域或任何潛在問題。審查的范圍可以包括檢查安全增強功能、檢查日志文件、審查用戶帳戶、分析服務器的網絡配置以及檢查其軟件版本。 Linux 以其穩定性和安全性而聞名…

Redis- 大key

大key 什么是大key問題大key的危害大key的識別方法大key問題的解決方案數據結構優化與拆分壓縮與序列化優化預防與監控機制 什么是大key問題 大Key問題是指在Redis等內存數據庫中&#xff0c;某個Key對應的value數據結構過大&#xff0c;通常是指單個Key的大小超過10KB甚至達到…

C語言_數據結構總結6:鏈式棧

純c語言代碼&#xff0c;不涉及C 順序棧的實現&#xff0c;歡迎查看這篇文章&#xff1a;C語言_數據結構總結5&#xff1a;順序棧-CSDN博客 0. 結構單元 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Linknode { ElemType…

新品速遞 | 多通道可編程衰減器+矩陣系統,如何破解復雜通信測試難題?

在無線通信技術快速迭代的今天&#xff0c;多通道可編程數字射頻衰減器和衰減矩陣已成為測試領域不可或缺的核心工具。它們憑借高精度、靈活配置和強大的多通道協同能力&#xff0c;為5G、物聯網、衛星通信等前沿技術的研發與驗證提供了關鍵支持。從基站性能測試到終端設備校準…

AI自動化應用的影響

生產力的迭代也終將伴隨著一代人的落幕。 2025年是AI應用爆發的開局之年&#xff0c;預計3-5年現有生產關系將出現顛覆性改革。 AI自動化對經濟和就業的影響是一個復雜且多維的問題&#xff0c;其長期影響取決于技術進步、政策調控、社會適應能力等多重因素的綜合作用。以下從技…

潤開鴻重磅首發基于“RISC-V+OpenHarmony+星閃”的“鴻銳”AI開發平臺

潤開鴻重磅首發基于“RISC-VOpenHarmony星閃”的“鴻銳”AI開發平臺 2月28日&#xff0c;2025中國RISC-V生態大會在北京中關村國際創新中心隆重召開。作為領先的鴻蒙生態專業技術公司和終端操作系統發行版提供商&#xff0c;以及不斷推進基于RISC-V與OpenHarmony全棧開源生態構…

Java 深度復制對象:從基礎到實戰

目錄 一、深度復制的概念二、實現深度復制的方法1. 使用序列化2. 手動實現深度復制 三、總結 在 Java 編程中&#xff0c;對象的復制是一個常見的需求。然而&#xff0c;簡單的復制操作&#xff08;如直接賦值&#xff09;只會復制對象的引用&#xff0c;而不是創建一個新的對象…

C++ Primer 交換操作

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

FFmpeg-chapter7和chapter8-使用 FFmpeg 解碼視頻(原理篇和實站篇)

解碼流程如下圖 流程&#xff1a;首先&#xff0c;通過 avcodec_alloc_context3(nullptr) 分配一個 AVCodecContext 結構體&#xff0c;然后使用 avcodec_parameters_to_context 將參數復制到上下文中&#xff0c;接著通過 avcodec_find_decoder 查找指定的解碼器&#xff0c;并…

2025 docker安裝TiDB數據庫

1.確保安裝了docker和docker-compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod x /usr/local/bin/docker-compose2.編寫 Docker Compose 文…

定制化開發的WooCommerce獨立站商城更安全

定制化開發的WooCommerce獨立站商城在安全性、交易風險控制以及整體用戶體驗方面有顯著優勢。以下是定制化開發在這些方面的具體表現&#xff1a; 1. 安全性更高 定制化開發允許開發者從底層架構開始設計和優化&#xff0c;確保網站的安全性。以下是具體表現&#xff1a; (1…

CSS【實戰】模擬 html 的 title 屬性(鼠標懸浮顯示提示文字)

效果 原理 提示內容的定位&#xff1a;子絕父相鼠標懸浮前&#xff0c;提示內容visibility: hidden;通過 :hover 觸發鼠標懸浮樣式&#xff0c;提示內容變為 visibility: visible; 代碼 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

K8s控制器Deployment詳解

回顧 ReplicaSet 控制器,該控制器是用來維護集群中運行的 Pod 數量的&#xff0c;但是往往在實際操作的時候&#xff0c;我們反而不會去直接使用 RS&#xff0c;而是會使用更上層的控制器&#xff0c;比如說 Deployment。 Deployment 一個非常重要的功能就是實現了 Pod 的滾動…

【MYSQL數據庫異常處理】執行SQL語句報超時異常

MYSQL執行SQL語句異常&#xff1a;The last packet successfully received from the server was 100,107 milliseconds ago. The last packet sent successfully to the server was 100,101 milliseconds ago. 這個錯誤表明 MySQL 服務器與 JDBC 連接之間的通信超時了。通常由…

HJ C++11 Day2

Initializer Lists 對于一個類P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…

樹莓派5首次開機保姆級教程(無顯示器通過VNC連接樹莓派桌面)

第一次開機詳細步驟 步驟一&#xff1a;樹莓派系統燒錄1 搜索打開燒錄軟件“Raspberry Pi Imager”2 選擇合適的設備、系統、SD卡3 燒錄配置選項 步驟二&#xff1a;SSH遠程樹莓派1 樹莓派插電2 網絡連接&#xff08;有線或無線&#xff09;3 確定樹莓派IP地址 步驟三&#xff…

裝飾器模式--RequestWrapper、請求流request無法被重復讀取

目錄 前言一、場景二、原因分析三、解決四、更多 前言 曾經遇見這么一段代碼&#xff0c;能看出來是把request又重新包裝了一下&#xff0c;核心信息都不會改變 后面了解到這叫 裝飾器模式&#xff08;Decorator Pattern&#xff09; &#xff1a;也稱為包裝模式(Wrapper Pat…