【 <一> 炼丹初探: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.mzph.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…