<前文回顾>
<今日更新>
一、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 协议的第二个主要版本,支持多路复用、头部压缩等特性。