<前文回顧>
<今日更新>
一、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.?請求處理流程
- 瀏覽器發請求:瀏覽器發個 HTTP 請求,Servlet 容器一收到,就開始“忙活”了。
- Servlet 處理請求:Servlet 從請求里拿數據,處理業務邏輯,再把結果放到請求對象里。
- Servlet 轉發請求:Servlet 把請求轉發給 JSP,讓 JSP 生成動態頁面。
- 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 模式把應用程序分成三層:Model、View、Controller。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 的“玩法”更加高效。
專有名詞解釋
- MVC 模式:Model-View-Controller,一種設計模式,用于將應用程序分為模型、視圖和控制器三層。
- 過濾器:Filter,一種用于在請求處理前后執行額外操作的組件。
- EL 表達式:Expression Language,一種用于在 JSP 頁面中訪問數據的表達式語言。
- 注解:Annotation,一種用于配置 Servlet 的元數據。
- HTTP/2:HTTP 協議的第二個主要版本,支持多路復用、頭部壓縮等特性。