【Java Web开发】框架演变

news/2025/4/3 8:40:57/文章来源:https://www.cnblogs.com/o-O-oO/p/18805278

Java Web的开发,本质上是Http接口的开发。因为无论是开发Web页面,还是Restful API,都是在服务端开发基于Http协议的接口。而对于Http服务端的开发,JavaEE(Java Platform Enterprise Edition,Java企业平台)平台本身提供了Servlet标准,它被作为基础框架来支撑和规范Java Web应用的开发。基于该标准,发展出了TomcatJSP(Java Server Pages),Spring MVCSpring Boot等Web服务器和开发框架,用来简化Web服务端的开发。本文针对于Java Web,梳理从基础Servlet至Spring Boot的开发框架演变,以及它们之间的关系,从而让读者对整个Java Web开发技术栈有个系统了解。

一、Java Web基础框架---Servlet

一个Http Server,本质上是一个TCP Server,可以简单用以下Java代码来描述。

它首先会去监听服务端的某个端口,如8080,并在请求来临时获取Socket。再从Socket中获取Http请求参数(包括Head、URL、Body中的数据),把请求参数传递给真正处理业务逻辑的Handler,Handler处理完数据后,再把返回写入到Socket,完成整个Http的服务端响应过程。

以上Http请求的监听、Handler的选择、请求参数的处理、请求结果的返回,这些所有Http接口的处理逻辑都是一致,可以封装为公共的部分,但业务处理Handler,由业务决定,跟着业务的逻辑走。这就是Servlet标准所定义的两个方面,即Servlet容器和Servlet API。

Servlet容器,即以上所说的公共部分,它对底层的TCP业务进行了封装,同时,它对具体的业务处理Handler进行了抽象,并作为Handler对象的容器,来承载具体Http业务接口的处理逻辑。目前最流行的Servlet容器是Tomcat,此外还有Jetty、GlassFish等。

Servlet API,即以上所说的业务处理Handler,它实现具体的业务逻辑,但要借助于Servlet容器,来获取请求,并将结果返回。Servlet标准对Servlet Api作了抽象,即Servlet接口,如下图所示,Servlet容器将请求和返回封装成ServletRequest对象和ServletResponse对象,并传递给具体的Servlet API,使之从ServletRequest对象中获取请求参数,作业务处理,并将处理结果写入ServletResponse对象。

具体针对于Http协议的API,Servlet框架又定义了HttpServlet抽象类,它部分实现Servlet接口,并定义了HttpServletRequest和HttpServletResponse(分别继承自ServletRequest和ServletResponse),来封装Http的请求和返回。在进行Servlet API开发时,可以继承HttpServlet,并重写相应接口方法,如下图所示:

再说JSP,它的全称是Java Server Pages,它允许开发人员在后缀名为.jsp的文件上写Html代码,Servlet容器可以把它编译成Servlet API,以提供输出Html文本的Http接口。因此,JSP可认为是一种特殊的Servlet API,它为开发Html页面提供了方便。

Servlet API在部署时,需要先准备好容器环境,如Tomcat,然后再将编译和打包后的文件,即war包,拷贝到Servlet对应的目录下,如Tomcat的webapps目录下,重启容器后即完成了服务的部署。

二、 Java Web进阶框架---Spring MVC

纯Servlet的开发,还是比较偏底层,开发时需要通过HttpServletRequest和HttpServletResponse来获取请求和处理返回,且如果是开发返回html的接口,则后端业务逻辑代码和前端Html代码会混合在一起,而如果是开发Restful API,则需要自行将业务逻辑的返回转成Json再返回。随着MVC(M:Model,V:View,C:Controller)开发思想的兴起,Spring MVC框架应运而生。

MVC开发思想的核心是,后端业务逻辑代码与前端处理逻辑代码的分离,并通过数据模型(对于Java来说就是一个Java Bean)来对接彼此。拿返回Html的接口来说,后端在Controller层专心处理数据业务逻辑,并返回一个Model给前端视图层。视图层用于开发前端Html代码,并由视图引擎将Model整合进前端Html中。最终完整的Html文本返回给前端浏览器。

Spring MVC在Spring框架之上,实现了MVC的开发思想,并在底层延用了Servlet的技术路线。与普通Servlet Web程序不同的是,整个Spring MVC程序只用一个Servlet API来处理所有Http请求,即DispatcherServlet。DispatcherServlet作为所有Http请求流量的入口,负责将请求转发至实际处理业务的Controller,转发过程中,将HttpServletRequest中的参数转化成更易读的形式(如一个自定义的Java Bean),Controller中处理后端业务逻辑,处理完成的结果封装成Model,返回给视图引擎(html接口),或者序列化成Json(rest接口),并在最终又回到DispatcherServlet,将处理后的结果写入Http的响应中。因此,Spring MVC本质上还是一个基于Servlet标准的Web程序。

Spring MVC的底层核心,还包括Spring框架的IOC容器,即ApplicationContext。它由DispatcherServlet在初始化的时候创建并持有(见下图DispatcherServlet的初始化配置文件),而所有Controller对象都是在IOC容器中的,因此DispatcherServlet在收到请求后,可以根据路径,找到对应的Controller进行处理。

三、Java Web高阶框架---Spring Boot

Spring Boot在Spring框架之上,提供了一组开箱即用的套件,并极大简化了Spring应用程序的开发。基于Spring Boot的Web开发,提供了Spring MVC的开发套件,即POM文件中引入的spring-boot-starter-web。与纯Spring MVC开发相比,它简化了开发中的配置和开发完成后的部署。

在简化开发配置方面,与纯Spring MVC开发相比,它不需要单独针对DispatcherServlet的初始化进行XML配置,框架自身提供了自动配置的能力。

在简化程序部署方面,Spring Boot框架内嵌了Servlet容器(默认为Tomcat),这样所开发的Web应用程序,可以通过命令行直接运行,不再需要提供额外的Servlet容器环境。

小 结

Servlet标准为Java Web技术栈提供了底层技术标准,包括Servlet容器和Servlet API两方面。Servlet容器封装了底层的TCP处理,并把Http协议封装成HttpServletRequest和HttpServletResponse两个对象提供给业务代码,同时也作为容器,给业务代码提供了运行环境,目前最流行的Servlet容器是Tomcat。Servlet API,即前所述业务代码,由Servlet标准抽象,是Java开发人员实际所需实现的业务逻辑部分。JSP技术,为开发Html接口提供了方便,它可以让Servlet容器把一个Html文件(jsp文件)编译成Servlet API,从而提供Http服务。Spring MVC在Servlet标准之上,实现了MVC开发框架。它的底层只有一个Servlet API,即DispatcherServlet,且作为所有Http流量的入口和最终返回点,为它之后的MVC框架封装了Http的协议细节,使开发人员可以更专注于业务代码开发。Spring Boot包含Spring MVC的Web开发套件,与纯Spring MVC框架相比,它提供了DispatcherServlet的自动初始化配置能力,同时内嵌了Servlet容器,简化了Spring MVC的开发配置和部署。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读DAMA数据管理知识体系指南37元数据管理概念(下)

读DAMA数据管理知识体系指南37元数据管理概念(下)1. 元数据来源 1.1. 元数据的来源各异1.1.1. 大多数操作元数据是在处理数据时生成的1.1.2. 最好是有意识地重新定义而不是简单地接受现有定义1.2. 管理数据库所需的大部分技术元数据和使用数据所需的业务元数据,可以作为项目…

Linux shell command lsof All In One

Linux shell command lsof All In One lsof - list open filesLinux shell command lsof All In Onelsof - list open filesdemos # $ cd ./Desktop && man lsof > man-lsof.md$ cat man-lsof.md$ lsof -i(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明…

FastAPI中Pydantic异步分布式唯一性校验

title: FastAPI中Pydantic异步分布式唯一性校验 date: 2025/04/02 00:47:55 updated: 2025/04/02 00:47:55 author: cmdragon excerpt: FastAPI开发中,异步分布式唯一性校验通过异步IO、分布式锁和二级缓存技术解决传统同步校验的并发冲突、性能瓶颈和响应延迟问题。手机和邮…

团对展示--自我介绍

团队展示 队名:DeepSleep队员姓名 队员学号吴钊鑫(组长) 3123004244薛考瑶 3223004258苏雨童 3223004255林赛强 3123004184李锦 3123004270蔡梓欣 3223004209左栋立 3123004294队员风采 吴钊鑫风格:追求简洁高效的解决方案 擅长技术:C++ 编程兴趣:热衷于学习新兴技术 希望…

国家公路网规划 All In One

国家公路网规划 All In One 2022 年 7 月 国家公路网规划总规模约 46.1 万公里,由国家高速公路网和普通国道网组成,其中国家高速公路约16.2 万公里(含远景展望线约0.8 万公里),普通国道约 29.9 万公里。国家公路网规划 All In One2022 年 7 月国家公路网规划总规模约 46.1…

Learned Cardinalities: Estimating Correlated Joins with Deep Learning

这篇文章介绍了一个叫做MSCN的方法,这是一个应用于集合的深度学习网络,文章使用这个方法去做查询的基数估计。 文章将输入处理为集合的形式,具体大概是这个形状:像table set里每个元素(即一个向量)代表一个对应的表和在这个表中采样的位图,join set表示链接的集合,pred…

64位程序崩溃-访问越界

事件起因 最近在做一个32位程序编译成64位的工作,遇到一个很奇葩的问题,程序在32位下运行非常正常,可编译64位以后总是莫名崩溃,崩溃的的报错是这样的。 经过分析发现原来是以前的代码用DWORD来存储指针导致的地址越界错误。 现场模拟 先看一段代码 #include <stdio.h&g…

VMware 1067启动NATservice失败

VMware 1067启动NATservice失败可以检查下你的vmware虚拟网络编辑器看看是否nat模式还在,子网ip是否发生变化,Nat设置网关,改回原来就好 如果没有设置静态ip,直接还原默认设置就行

SLS 重磅升级:超大规模数据实现完全精确分析

SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。作者:执少 引言 在亿级日志分析中,你是否遇到过结果不…

C++多线程初步

1.多线程初步 1.包含的库 #Include<thread>2.涉及到的类 std::thread(这个类是属于标准模版库的,底层封装的系统调用) 3.代码实例 #include <iostream> #include <thread> void hello(){ std::cout << "Hello World" << std::en…

全定制电路Flow手册

简单做个summary手册,方便后面查阅以及组里统一规范。 全定制电路Flow手册 编写人:袁易扬 联系方式:2861704773@qq.com文档版本 编写日期 说明v1.0 2024.3.27 初次发布1. 工具链 原理图: Cadence Virtuoso IC617/618(用于22nm及以上的平面CMOS工艺) Cadence Virtuoso ICA…

Ajax、vue-cli、element

Ajax(Asynchronous JavaScript And XML)异步的JavaScript和XML 作用:数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术Axios:对原生Ajax进行封装,简化书写,快速开…