Java WEB:从起源到现代的传奇之旅

Java Web 起源于上世纪 90 年代,随着网络和浏览器的飞速发展,Java 为应对动态处理网页的需求,推出了 Servlet 技术。

1. Servlet 出现之前

在 Servlet 出现之前,用户请求主要是静态资源,如 html、css 等。此时的网络主要是一系列静态内容的集合,服务器通过保持一系列 html 脚本来响应用户的请求。早期的 web 应用较为简单,确立了 request(代表请求)和 response(代表回应)这两个重要对象。

在 web site 向 web application 发展的过程中,出现了 applet。例如当年风靡校园的网易聊天室就是采用了 applet 构建的,它给静态页面带来了动态交互的可能。

2. Servlet 时代
  1. 纯 Servlet 开发:Servlet 是 Java 技术中最早的 Web 解决方案。

Servlet 看起来像是通常的 Java 程序,命名为 Service+Applet,即服务小程序。它可以处理来自客户端的请求,并生成响应。在 Servlet 中可以通过输出 Html 等语句来实现页面的样式和输出,实现数据的动态功能。然而,表现、逻辑、控制、业务全部混在 Servlet 类中,编程繁琐,输出 HTML 代码麻烦。

例如:

public void doGet(HttpServletRequest request, HttpServletResponse) throws IOException, ServletException {

response.setContentType("text/html;charset=gb2312");

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>Hello World!</title></head>");

out.println("<body>");

out.println("<p>Hello World!</p>");

out.println("</body>");

out.println("</html>");

}

这样就动态生成了一个内容为 Hello World! 的 HTML 页面在浏览器上显示。但这种方式存在很多问题,如 servlet 代码有大量冗余代码,开发 servlet 必须精通网页前端和美工,所有业务逻辑、页面跳转、样式表现全部混杂在同一个类中,维护困难。

二、JSP 的诞生

  1. Sun 公司借鉴微软的 asp,推出了 JSP 技术,采用 HTML 语言直接生成界面,可嵌入 Java 代码,但存在代码维护困难的问题。
1. 纯 JSP 开发

在 JSP 诞生初期,出现了纯 JSP 开发的方式。示例代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse) throws IOException, ServletException {

response.setContentType("text/html;charset=gb2312");

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>Hello World!</title></head>");

out.println("<body>");

out.println("<p>Hello World!</p>");

out.println("</body>");

out.println("</html>");

}

这段代码展示了在 HTML 代码中写 Java 代码的方式,通过在 Servlet 中输出 HTML 语句来生成页面。然而,这种方式存在很多问题,如代码维护困难,表现、逻辑、控制、业务全部混在 Servlet 类中,编程繁琐,输出 HTML 代码麻烦。

2. JSP+JavaBean(Model1)

JSP 负责表现层和控制层,JavaBean 负责模型层,但高度耦合,后期维护困难。

JSP+JavaBean 模式适合小规模 web 开发,体现在其轻巧性,也就是更轻量级一些。在这种模式中,JSP 除了负责部分流程的控制外,大部分用来进行页面的显示,而 JavaBean 则负责事务逻辑层和数据层的工作。

JSP 和 JavaBean 模型充分利用了 JSP 技术易于开发动态网页的特点,页面显示层的任务由 JSP(但它也含事物逻辑层的内容)承担,JavaBean 主要负责事务逻辑层和数据层的工作。JSP 和 JavaBean 模型依靠几个 JavaBean 组件实现具体的应用功能,生成动态内容,最大的特点就是简单。

但是这种模式也有很多缺点,比如 HTML 和 JAVA 强耦合在一起,给页面设计带来极大困难,也给阅读代码、理解程序带来干扰。极难维护与扩展,在 JSP 页面中直接嵌入访问数据的代码及 SQL 语句,会使数据库的任何改动都必须打开所有的 JSP 页面进行维修,改动工作量非常大。不方便调试,业务逻辑与 HTML 代码,甚至 JavaScript 代码强耦合在一起,极难定位错误。

JSP+JavaBean 的优点也很明显,比如纯净的 JSP 页面,将业务逻辑和数据库操作从 JSP 页面中剥离出来。可重用的组建,设计良好的 JavaBean 可以重用,可重用的 JavaBean 可以大大减少开发人员的工作量,加快开发进度。方便进行调试,因为复杂的操作都封装在一个或多个 JavaBean 中,错误比较容易定位。易维护易扩展,系统的升级或者更改往往集中在一组 JavaBean 中,而不用编辑所有的 JSP 页面。

三、Servlet+JSP+JavaBean(Model2 时代)

在 Servlet+JSP+JavaBean(Model2 时代),JSP 作为视图负责展示页面,Servlet 作为控制器承担接收请求、调用业务逻辑和控制页面跳转等任务,JavaBean 负责业务模型的处理。然而,这种模式下的 JavaBean 往往会显得过于臃肿,并不能完全符合标准的 MVC 设计模式。

在 Model2 中,虽然通过明确的分工将视图、控制器和业务模型进行了分离,但是 JavaBean 需要承担大量的业务逻辑处理以及可能的数据持久化等任务。这使得 JavaBean 中包含了过多的代码和功能,导致其结构复杂,难以维护和扩展。例如,在处理复杂业务逻辑时,JavaBean 可能会不断地添加新的方法和属性,使得其规模逐渐增大,变得难以管理。

与标准的 MVC 设计模式相比,Model2 在一定程度上实现了视图、控制器和模型的分离,但 JavaBean 的过度膨胀使得模型层不够纯粹和清晰。在标准的 MVC 设计模式中,模型层应该专注于业务逻辑的处理,具有清晰的职责和结构。而在 Model2 中,JavaBean 不仅要处理业务逻辑,还可能涉及到与数据库的交互、数据的存储和获取等任务,这使得它的职责不够明确,影响了整个系统的可维护性和可扩展性。

四、框架阶段

在 Java Web 的发展过程中,框架阶段的出现解决了许多前期存在的问题,极大地提高了开发效率和代码的可维护性。

  1. 存在问题:jsp 页面中嵌入很多 java 代码,结构乱;servlet 过多,不易集中管理。
1. Struts 的出现

2001 年 6 月,Struts1.0 出现,针对 JSP 和 Servlet 存在的问题提供了有效的解决方案。

  1. 推出 struts 标签,使 jsp 中没有 Java 代码,结构清晰,功能强大。例如,原本 JSP 页面中可能会嵌入大量的 Java 代码来实现各种功能,现在通过 Struts 标签,可以直接使用标签来代替 Java 代码,使得页面更加简洁易读。

  2. 提供 Action 类代替 servlet,这个 Action 类具有 servlet 的功能,并且能够进行一些请求过滤和自动转码功能。Action 类的出现,使得 Servlet 的管理更加集中,减少了 Servlet 数量过多带来的转向频繁和配置不易集中管理的问题。

2. Spring 的出现

Spring 框架的出现主要是为了解决程序耦合性问题。

  1. 解决程序耦合性问题,具有 IOC(控制反转)和 AOP(面向切面的编程)两大功能。IOC 即当一个类中想要调用另外一个类的对象时,不需要再通过 new 关键字来创建,而是由 Spring 框架来负责创建、分配和管理,从而降低了程序中的耦合性。AOP 可以用来做一些日志的打印和输出,用于提示程序执行过程中的一些具体信息等。
3. SpringMVC 的出现

SpringMVC 的出现是为了进一步优化开发过程。

  1. 通过 “基于注解” 的方式代替 struts,降低了.xml 文件的配置复杂度。原本 Struts 和 Spring 的整合,每一个 bean 都要在 Spring 中注册,每一个 URL 都要在 struts 配置文件中配置,当 bean 很多和 URL 对应的请求很多的时候,配置文件会非常庞大,配置起来费力。而 SpringMVC 通过基于注解的方式,很多配置信息放在了 Controller 类中配置,减少了.xml 文件的配置量,提高了开发效率。
4. Springboot 的出现
  1. 设计初衷是简化 Spring 应用的初始搭建和开发过程。Spring Boot 并不是像 Spring 和 SpringMVC 这种全新的、实现某个功能的应用框架,而是一种用于简化 Spring 应用开发,实现应用快速开发迭代的解决方案。它主要解决了基于 SpringMVC 开发 Java Web 应用存在的开发效率低的问题,以及解决需要依赖 Tomcat 进程来运行 Java Web 应用的问题,最终简化了 Spring 应用的搭建、开发和维护。例如,通过约定优于配置的理念和 starter 包,将实现某个功能的多个相关 jar 包打包到一个更大的 jar 包中,应用只需引入对应的 starter 包,而不需要一个个地引入多个功能 jar 包来简化包的配置,同时由 SpringBoot 统一管理 jar 包的版本,避免了包的兼容和类冲突问题。此外,Spring Boot 实现了一种自动配置机制,根据应用当前引入的 starter 包来自动创建对应功能的 bean 对象,使得在应用中直接使用即可,大大提高了开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社区管理系统:实现社区信息数字化管理的实践

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该社区管理系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff0c;同…

DataV的安装与使用(Vue3版本)

1、DataV(vue3)地址&#xff1a;DataV Vue3TSVite版 | DataV - Vue3 2、使用 npm install kjgl77/datav-vue3 安装 3、全局引入。 4、此时就可以按需使用了~

隐藏指定文件/文件夹和自动提示功能消失解决方案

一. 隐藏指定文件/文件夹 Idea中隐藏指定文件或指定类型文件 Setting → File Types → Ignored Files and Folders输入要隐藏的文件名&#xff0c;支持*号通配符回车确认添加 二. 自动提示功能消失解决方案 指定SpringBoot配置文件 File → Project Structure → Facets选…

springboot474基于web的垃圾分类回收系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统垃圾分类回收系统信息管理难度大&#xff0c;容错率低&am…

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树&#xff0c;以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​&#xff0c;其中 n 个不同的键按排序顺序 &#xff0c;我们希望构造一个二叉搜索树。 对于每个关键 ki​&#xff0c;我们有一个…

jsp-servlet开发

STS中开发步骤 建普通jsp项目过程 1.建项目&#xff08;非Maven项目&#xff09; new----project----other----Web----Dynamic Web Project 2.下载包放到LIB目录中,如果是Maven项目可以自动导包&#xff08;pom.xml中设置好&#xff09; 3.设置工作空间&#xff0c;网页…

easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层

需求&#xff1a;页面点击导出&#xff0c;先按照页面条件去数据库查询&#xff0c;然后将查询到的数据导出。 问题&#xff1a;由于查询特别耗时&#xff0c;所以点击之后页面会看上去没有反应 方案1&#xff1a;就在点击之后在页面增加了一个进度条&#xff0c;等待后端查询…

新版Android Studio 2024.1.2版本,如何通过无线wifi连接手机实现交互

1、首先&#xff0c;先确定手机是否启动了开发者选项 在我的设备 -> 全部参数 -> MIUI版本点击6下 &#xff08;有的手机是 关于手机 -> 查看手机版本 &#xff09; 2、在设置中搜索 开启开发者选项 3、进入开发者选项后&#xff0c;在 调试 中选择 无线调试并选择…

CEF127 编译指南 MacOS 篇 - 编译 CEF(六)

1. 引言 经过前面的准备工作&#xff0c;我们已经完成了所有必要的环境配置。本文将详细介绍如何在 macOS 系统上编译 CEF127。通过正确的编译命令和参数配置&#xff0c;我们将完成 CEF 的构建工作&#xff0c;最终生成可用的二进制文件。 2. 编译前准备 2.1 确认环境变量 …

扩散模型经典问题:在Image-to-Image或Image-to-Video任务中,如何尽可能地保持住原始输入Image的特征?

AIGC算法工程师 面试八股文 2025年版本 在Image-to-Image或Image-to-Video任务中,如何尽可能地保持住原始输入Image的特征?你知道有哪些经典方法?这些方法各有什么优缺点? 目录 经典条件扩散模型 垫图法 Adapter方法 ControlNet方法 UNet中的ReferenceNet DiT中的Re…

0.96寸OLED显示屏详解

我们之前讲了 LCD1602&#xff0c;今天我们将它的进阶模块——OLED。它接线更少&#xff0c;性能更强&#xff0c;也能显示中文和图像了。 大家在学习单片机的时候是否会遇到调试的问题呢&#xff1f;例如 “这串代码我到底运行成功了没有” &#xff0c;我相信很多刚开始学习…

windows下VSCode配置C++/CMake/Qt开发环境

文章目录 1 windows下vscode配置C/CMake开发环境2 windows下配置qt开发环境&#xff08;qmakemingw&#xff09;3 windows下配置qt开发环境&#xff08;cmakemingwmsvc&#xff09; 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发经验 &#x1f448;&…

项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”

一、UpdownController.cs 1、前端传入 当用户在下图的“记录查询”中的 两个界面选项 中,点击“导出”功能时,向后端发起请求,请求服务器下载文件的权限 【权限是在Program.cs中检测的,这个控制器里只需要进行“谁在哪个接口下载了文件”的日志记录】 【导出:是用户把…

30多种独特艺术抽象液态酸性金属镀铬封面背景视觉纹理MOV视频素材

使用 Prismatic Flows 转换您的项目&#xff01;这个包拥有 30 多种独特的液体背景和动画&#xff0c;为任何创意活动提供令人惊叹的视觉效果。 棱镜流 – 动画背景和迭加包括30多种不同的液体背景和动画。这些高质量的资源非常适合通过充满活力和动态的视觉效果来增强您的项目…

车载网关性能 --- 车载网关通用buffer分配需求

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的豁达,往不幸上面喷“香水”来掩盖问题。 无人问津也好,技不…

PLSQL 客户端连接 Oracle 数据库配置

1. 安装Oracle客户端 首先&#xff0c;安装Oracle客户端。可以从Oracle官方网站下载Oracle Instant Client, 安装完成后&#xff0c;请记住安装路径&#xff0c;因为将在后续步骤中需要用到它。 2. 配置环境变量 添加环境变量 ORACLE_HOME 安装Oracle客户端后&#xff0c;配…

docker-harbor仓库的搭建(2024)

准备实验需要的软件 将软件拉入虚拟机中&#xff0c;解压压缩包 [rootlocalhost ~]# tar zxf harbor-offline-installer-v2.5.4.tgz 1.进入harbor目录拷贝文件&#xff0c;创建名为harbor.yml的备份文件 [rootlocalhost ~]# cd harbor/ [rootlocalhost harbor]# cp harbor.yml…

Jmeter分布式压力测试

1、场景 在做性能测试时&#xff0c;单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机器&#xff0c;使用UI方式&#xff0c;最高压测在1800并发(RT 20ms以内)左右。如果…

Oracle下载安装(保姆级教学)

方法1 1. 官网下载安装包 对于 Oracle 软件的下载&#xff0c;建议通过官网免费下载&#xff0c;安全且有保证。 下载地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 通过下载页面可以选择安装压缩包&#xff08; WIND…

AOP 面向切面编程的实现原理

AOP是基于IOC的Bean加载来实现的&#xff0c;所以理解Spring AOP的初始化必须要先理解Spring IOC的初始化。然后就能找到初始化的流程和aop对应的handler&#xff0c;即parseCustomElement方法找到parse aop:aspectj-autoproxy的handler(org.springframework.aop.config.AopNam…