Web应用开发(Java)
概述
Web 应用架构示意图

◆Web 浏览器:就是你电脑 / 手机上的 Chrome这些,是用户的 “窗口”。用户在浏览器里输入网址、点击按钮,就会向服务器发出 “请求”,等服务器处理完再接收 “响应” 并展示内容。
◆红色防火墙:它是整个系统的 “保安”,所有进出的网络流量都要经过它检查。它会拦截恶意攻击(比如黑客的非法请求),只把合法的请求放行到后面的 Web 服务器,同时也保护内部服务器不被直接暴露在公网上。
◆Web 服务器:网站服务器,负责接收浏览器的请求,然后把请求分发给对应的 Web 应用来处理。处理完后,再把结果打包成 “响应” 发回给浏览器。
◆Web 应用:是具体干活的 “办事员”,比如处理用户登录、生成动态页面、计算课程成绩等。它们会根据需要去数据库里读写数据,完成业务逻辑。
◆数据库:是系统的 “档案库”,用来存储用户信息、课程数据、交易记录等。Web 应用需要数据时就来这里查,有新数据时也存在这里。
浏览器和服务器之间一次完整的 HTTP 请求 - 响应过程

访问过程:通过浏览器,请求IP地址或域名,返回网页(html代码)。
Web服务器:一种软件或硬件系统,通过网络(通常是互联网或Intranet)接收客户端的HTTP/HTTPS请求,并返回相应的资源(如HTML页面、图片、JSON数据等)
Web服务器
Web 服务器的概念确实要区分软件和硬件两个层面,它们是 “软件跑在硬件上” 的关系。
◆硬件层面的Web服务器指的是专门用来运行 Web 服务的物理服务器或云服务器主机,是一台性能较强的计算机。
◆软件层面的Web服务器指的是安装在硬件服务器上的、专门处理 HTTP/HTTPS 请求的软件程序。
举例:
你在阿里云买了一台 ECS 云服务器(硬件),在这台 ECS 上安装的 Nginx(Web 服务器软件)。
提问:
我仅仅在自己电脑安装了tomcat,但是没有买云服务器。
解释:
当你在自己电脑上安装 Tomcat 并启动后,你的电脑就临时扮演了 “硬件服务器” 的角色,Tomcat 就是跑在它上面的 “Web 服务器软件”。而阿里云的 ECS 云服务器,是专门用来长期扮演 “硬件服务器” 角色的远程计算机,你可以在上面安装 Nginx、Tomcat 等软件。
| 维度 | 自己的电脑 | 阿里云 ECS 云服务器 |
|---|---|---|
| 网络访问 | 一般用家庭宽带,没有固定公网 IP,别人很难从互联网访问你电脑上的 Tomcat。 | 有固定公网 IP,任何人都能通过互联网访问你部署在上面的服务。 |
| 稳定性 | 你随时可能关机、断网,服务就会中断。 | 数据中心 7×24 小时稳定运行,网络和电力都有冗余保障。 |
| 性能与扩展性 | 性能受限于个人电脑配置,升级麻烦。 | 可以随时升级 CPU、内存、带宽,应对更多用户访问。 |
| 用途 | 适合开发、测试(自己或小团队用)。 | 适合正式上线的项目(面向全网用户)。 |
问:多人协作是不是得买一个服务器?
豆包解释:https://www.doubao.com/thread/wceacfb2978d93dc9
http协议
1.HTTP协议是用于从服务器传输超文本(HTML)到本地浏览器的传送协议。
2.HTTP基于TCP/IP通信协议进行传送输数据(HTML文件、图片文件、查询结果等)。
3.HTTP是一个属于应用层的面向对象的协议。
4.HTTP协议工作于客户端-服务器架构之上。浏览器作为HTTP客户端通过URL向HTTP服务器端即WEB服务器发送请求。WEB服务器根据接收到的请求,向客户端发送响应消息。
Web技术进化史
◆Web1.0:1990年代末到2000年代初期,以静态网页形式存在,以信息呈现为主。
◆Web2.0:这个时期互联网主要是以动态网页形式存在。这个时期的网站更加注重用户交互和社交,用户可以通过 Web2.0 网站发布内容、互动和分享,网站的内容和管理更加分散和去中心化。
◆Web3.0:Web3.0 时代主要基于区块链技术和加密技术,以实现去中心化和分布式网络为主要目标,重点关注数据隐私和智能合约等方面。Web3.0 将推动互联网从中心化向去中心化转变,从而让用户能够更好地掌控自己的数据和隐私。
传统J2EE体系结构
J2EE (Java 2 Platform, Enterprise Edition)即Java2平台企业版,它提供了基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型,这个多层通常通过三层或四层来实现:
1、客户层,运行在客户计算机上的组件。
2、Web 层,运行在J2EE服务器上的组件。
3、业务层,同样是运行在J2EE服务器上的组件。
4、企业信息系统层(EIS),是指运行在EIS服务器上的软件系统,存储和管理核心数据。
以上层次一般也指三层应用,因分布在三个不同位置:客户计算机、J2EE服务器及后台的数据库或过去遗留下来的系统。
Web现代开发模型
现代开发模式:前后端分离,模块化开发。
豆包举例:
- 传统 J2EE:浏览器请求→Tomcat 运行 JSP→生成完整 HTML 返回;
- 现代 Jakarta EE:浏览器加载 Vue 页面→Vue 发 AJAX 请求→Spring Boot 后端返回 JSON 数据→Vue 渲染页面。
课后思考:Web服务器的作用是什么? Web服务器的访问过程。 Http协议定义的主要内容。 对比传统J2EE体系架构和Web现代开发模型的差异。
豆包答案:https://www.doubao.com/thread/wa882836f678c2ea7
使用Maven
Maven 是一个基于 Java 的自动化构建工具和项目管理框架,主要用于简化 Java 项目的开发流程,同时支持多模块管理和依赖管理。核心目标是通过标准化的项目结构、依赖解析和构建生命周期,提升开发效率和团队协作能力。
1.依赖管理是通过pom.xml文件声明项目依赖的第三方库,自动从中央仓库或私有仓库下载并管理版本冲突。
2.构建自动化就是把 “清理→编译→测试→打包→共享” 的项目构建流程,做成了一套 “固定、自动、标准化” 的流水线,你只需要发指令, Maven就能自动完成,既省时间又避免出错。
| 指令 | 作用 | 自动执行的完整流程 |
|---|---|---|
mvn clean |
只清理垃圾(删除 target 目录) | 仅执行 Clean 阶段 |
mvn compile |
编译源码成.class 文件 | Clean → Compile |
mvn test |
运行单元测试(先确保代码编译完成) | Clean → Compile → Test |
mvn package |
打包成 JAR/WAR 包(先测试通过才会打包) | Clean → Compile → Test → Package |
mvn install |
把包装到本地仓库(供本地其他项目用) | Clean → Compile → Test → Package → Install |
mvn deploy |
把包上传到远程仓库(供团队用) | Clean → Compile → Test → Package → Install → Deploy |
3.项目结构标准化是强制约定目录结构。
➢关于依赖项管理模型pom.xml
项目坐标:通过 groupId、artifactId、version唯一标识项目;
依赖声明:通过 <dependencies>引入外部库;
构建配置:定义编译器版本、资源路径、插件等。
Spring基础
关于解耦
标准化与模块化是现代工业发展的两大基石,二者通过规范接口、解耦系统,提升效率,共同推动制造业向智能化、柔性化、全球化转型。(类比自行车)
接口有着明确的规则和约束。
◆内部接口是同一系统内模块间的交互协议,用于解耦代码结构、规范协作流程。
◆外部接口是系统与外部服务或第三方交互的标准化入口,用于数据共享与功能扩展。
如果没有内部接口,模块之间可能会直接依赖具体的类或函数,高耦合/紧耦合是编程里描述模块/代码之间 “过度依赖、绑在一起” 的状态。
如果改变程序的一个模块要求另一个模块同时发生变化,就认为这两个模块发生了耦合。
高耦合带来的问题举例:直接依赖具体类(硬编码依赖)、业务逻辑与数据强绑定、通过类型检查破坏类的封装性。
带来的问题:维护困难、测试复杂度高、扩展性差。
Spring体系结构
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP)。
Spring的体系结构以核心容器为中心,通过模块化设计实现“功能分离、协同工作”。
Spring体系结构图:
1.核心容器
核心容器就是 Spring 的 “操作系统内核”,它管理所有对象(Bean)的生命周期和依赖关系,通过 IoC(控制反转)和DI(依赖注入)实现代码解耦,让你不用再手动 new 对象、处理依赖。
2.面向切面
该模块通过面向切面编程(AOP)实现横切关注点与业务逻辑的分离,提升代码复用性。
◆AOP模块:定 AOP 规则,实现基础的通用逻辑分离。
◆Aspects模块:集成AspectJ框架(成熟的AOP实现),扩展Spring AOP的功能。
◆Instrumentation模块:提供类工具支持,用于特定应用服务器中的类操作。
3.数据访问与集成
核心痛点(传统 JDBC):写 10 行代码,8 行是创建连接、关闭资源、处理异常,只有 2 行是真正的 SQL 逻辑。
Spring方案:封装JDBC、集成ORM框架、事务管理、消息集成。即简化数据访问。
4.Web模块
Web模块是Spring对Web层开发的支持,涵盖基础Web功能、MVC架构、WebSocket等。
5.Test模块
提供Spring应用的测试支持,集成JUnit、TestNG等测试框架,简化单元测试与集成测试。
1.核心容器解决“对象管理”问题(IoC/DI);
2.数据访问模块解决“持久化”问题(JDBC/ORM);
3.Web模块解决“Web开发”问题(MVC/WebSocket);
4.AOP模块解决“横切关注点”问题(日志/事务);
5.Test模块解决“测试”问题(单元/集成测试)。
IOC和DI
IOC(控制反转):将程序组件的创建和控制权交给外部容器,而不是由组件控制。
IOC容器:负责创建、组装、管理对象。
DI = Dependency Injection,依赖注入,通过外部容器来管理和注入组件之间的依赖关系,而不是由组件自己创建依赖。
使用Spring框架实现依赖注入
核心依赖:spring-core,spring-beans,spring-context
定义接口(interface)
访问接口(使用注解)
通过IOC容器在运行时进行对象实例化(构建)
1.组件注解
以下4个注解的核心作用是标记类为 Spring 组件,让 IoC 容器扫描并创建实例,只是语义不同,方便开发者区分业务层。
| 注解 | 适用层 | 核心作用 |
|---|---|---|
| @Component | 通用层 | 标记任意组件,最基础 |
| @Service | 服务层(业务) | 标记业务逻辑组件 |
| @Repository | 数据访问层 | 标记数据库操作组件,自动捕获持久化异常 |
| @Controller | 控制器层 | 标记 Web 接口组件,处理 HTTP 请求 |
2.自动装配注解
用于告诉容器 “我需要某个依赖,你帮我找出来注入”,有两种常用注解:
| 注解 | 来源 | 通俗特点 |
|---|---|---|
| @Autowired | Spring 原生 | 灵活,Spring 生态首选 |
| @Resource | JSR-250 标准 | 跨框架兼容(比如 J2EE) |
3.@Configuration是 Spring 框架中用于定义配置类的核心注解,替代传统的 XML 配置文件,通过 Java 代码实现Bean的声明、依赖管理和环境配置。@Configuration是 @Component的派生注解,所以它也会被组件扫描自动识别,配置类本身也会被 IoC 容器创建成对象。
4.Bean的生命周期是框架管理的核心机制,其流程可分为实例化、属性填充、初始化、销毁四大核心阶段。
5.Bean的六种作用域,使用注解@Scope。
◆request:短生命周期的请求级数据。
◆session:用户级持久化数据。
◆websocket:实时通信会话状态。
课后思考?在现代编程技术中,接口的主要作用是什么? 代码高耦合会带来什么问题? Spring体系结构的5个部分分别解决什么问题? 什么是IOC和DI? 简述使用Spring框架实现依赖注入的几种方式。 @Configuration注解的主要作用是什么?https://www.doubao.com/thread/we1e2267627c5bda3
AOP编程
AOP(面向切面编程)是一种通过模块化处理横切关注点的编程范式,其核心目标是解耦业务逻辑与非核心功能,提升代码的可维护性和可扩展性。
AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
AOP编程优点
1.代码集中:只有核心业务逻辑代码。
2.降低代码耦合度:核心关注点和横切关注点分离。
3.提高代码扩展性:新的切面可以加入新的功能,新的模块可以自动织入原有的切面功能。
4.提高代码重用性:每个切面是独立模块,可以复用。
AOP编程相关术语
1.连接点(Joinpoint)程序执行过程中的某个特定点,如方法调用、异常抛出等。
2.切入点(Pointcut)匹配连接点的规则,用于筛选需要增强的方法。
3.通知(Advice)在连接点执行的具体增强逻辑(代码)。
4.切面(Aspect)封装通知和切点的模块化单元。
5.目标对象(Target Object)被切面增强的原始对象。
6.织入(Weaving)将切面逻辑应用到目标对象的过程。
7.代理(Proxy)织入增强逻辑后生成的代理对象。
一句话:Spring AOP 先找到目标对象的所有连接点,用切入点筛选出需要增强的点,再把切面里的通知逻辑通过织入过程融合到目标对象上,生成包含增强逻辑的代理对象,最终程序执行代理对象完成增强。

AOP编程的实现:
1.定义接口和实现类(目标对象,加@Service让IoC容器管理)
2.相关Bean的注入(配置类注入@Configuration、@ComponentScan(“com.example”)、@Bean,或者XML配置注入)
3.设计切面类
(1)@Aspect注解:标记这个类是「切面类」
(2)是否要注入?必须。加@Component。
(3)启用自动代理:这是 AOP 生效的 “开关”,必须配置。@EnableAspectJAutoProxy注解或<aop:aspectj-autoproxy/>配置
(4)切入点Pointcut及Advice的编写
4.代理对象的方法调用(正常调用)
1 | ./applicationContext.xml |
Spring Boot项目
Spring Boot是基于 Spring 框架的快速开发工具,它不是一个新框架,而是对 Spring 的进一步封装和增强。其核心目标是简化 Spring 应用的初始化和开发过程,实现 “约定优于配置”。
“约定优于配置” 是一种软件设计范式,它的核心思想是:
约定:框架预先定义一套默认的规则、命名规范和配置方案。
优于配置:开发者遵循这些约定时,几乎不需要做任何额外配置;只有在需要打破约定时,才需要显式配置。
1.@SpringBootApplication本质上由以下三个注解组成:
(1)@SpringBootConfiguration // 替代@Configuration。
(2)@EnableAutoConfiguration // 开启自动配置,根据项目的类路径依赖和配置,自动配置 Spring 应用上下文所需的 Bean。
(3)@ComponentScan// Spring Boot 定义了标准的项目结构,默认会扫描主应用类所在包及其子包。
2.默认读取 application.properties 或application.yml 配置文件。
3.Starter 依赖包聚合了相关依赖,提供默认配置。spring-boot-starter-parent的作用:统一版本管理和标准化配置
5.内置容器约定:默认使用 Tomcat 作为嵌入式 Servlet(处理Web请求的Java类) 容器。
思考:简述Spring框架和Spring Boot的关系。
Spring Boot项目的“约定优于配置”主要表现在哪些方面?
https://www.doubao.com/thread/wcc3fc5daf7309c04
Spring MVC编程
B/S架构三层模型
1.客户端层:核心组件是 Web 浏览器,负责发送 HTTP 请求、接收服务器返回的响应,并展示页面或数据;
2.应用服务器层:包含 Web 服务器和应用服务器(如 Tomcat),Web 服务器负责请求转发,应用服务器负责运行Java Web应用(如 Spring Boot 项目)、处理动态请求、衔接业务逻辑层;
3.数据服务器层:存储应用所需数据,支持业务逻辑层的数据增删改查操作,最终将处理结果返回给上层。
MVC主要内容及相互的关系
Spring MVC 是 Spring 框架的核心模块之一,是基于Java实现MVC设计模式的轻量级Web框架,用于快速开发灵活、可扩展的 Web 应用。
1.模型(Model):封装应用程序数据,通常由 POJO组成,是数据的存储和处理核心;
2.视图(View):负责呈现模型数据,生成浏览器可解释的 HTML 等内容,是数据的展示载体;
3.控制器(Controller):主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
相互关系:
控制器接收浏览器请求后,调用业务逻辑层处理业务并获取数据,将数据封装到模型中;随后控制器将模型和逻辑视图名传递给视图,视图渲染模型中的数据并生成最终页面,反馈给浏览器。
Spring MVC实现原理
1.浏览器发起 HTTP 请求
2.前端控制器接收请求并查找控制器
3.调用控制器
4.控制器调用模型处理业务
5.控制器返回处理结果
6.处理视图映射
7.将模型数据传给视图显示
8.返回 HTTP 响应
Spring MVC 中,如何输出模型数据?
“模型数据” 指需要传递给视图或接口响应的数据,核心通过Model、ModelMap、ModelAndView、@ModelAttribute、@SessionAttributes等载体存储,结合注解或原生API实现数据传递。
Spring MVC 对JSON数据的处理
- 依赖支持:引入
spring-boot-starter-web依赖时,Spring Boot 会自动引入 Jackson 相关核心包,支持 JSON 处理。 - 接收 JSON 数据:通过
@RequestBody注解,可将前端传递的 JSON 数据自动绑定到 Java 对象。 - 返回 JSON 数据:使用
@RestController注解(组合@Controller和@ResponseBody),方法返回值自动转为 JSON。
Thymeleaf
使用 Thymeleaf 模板前,必须在页面的 HTML 标签中声明其名称空间。
1 | <html xmlns:th="http://www.thymeleaf.org"> |
Thymeleaf 语法分为哪两类?
1.标准表达式语法:包括变量表达式(${})、选择变量表达式(*{})、链接表达式(@{})等,用于获取数据、拼接链接、进行逻辑计算等;
2.th 属性:是 Thymeleaf 的专属标签属性(如th:text、th:each、th:if等),用于替换原生 HTML 属性、实现循环遍历、条件判断、表单绑定等功能。
变量表达式(${})可访问哪 3 种对象?
1.获取对象的属性和方法
2.使用内置的基本对象
3.使用内置的工具对象
访问数据库
JDBC驱动:JDBC(Java Database Connectivity)驱动是 Java 程序与数据库之间通信的核心桥梁,是实现跨数据库统一访问的关键组件。
JDBC代码访问数据库,可维护性差、代码冗余、性能低。
◆ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,核心是将“Java 对象”与“关系型数据库”建立映射关系,让开发者无需直接编写原生 SQL,而是通过操作 Java 对象来实现数据库的操作。
◆映射规则:
MyBatis:Apache 旗下的半自动化 ORM 框架不屏蔽 SQL,而是聚焦 “SQL 执行 + 结果集自动映射”,是国内互联网公司的绝对主流。
JPA(全自动化 ORM 框架):Java 官方定义的 ORM 规范,仅为接口,无实现。
MyBaits编程步骤
MyBatis:Apache 旗下的半自动化 ORM 框架不屏蔽 SQL,而是聚焦 “SQL 执行 + 结果集自动映射”,是国内互联网公司的绝对主流。
编程步骤:
1.设计数据库
2.新建项目
3.设置数据库连接信息
4.编写实体类
5.编写Mapper接口
6.编写SQL映射文件
7.Mapper接口调用
MyBatis 自带了一个非常基础的连接池实现,名为 PooledDataSource。
Mapper接口
Mapper接口定义了应用程序可以对数据库执行哪些操作,但它本身不包含任何实现逻辑。真正的数据库操作 SQL 语句是写在与之对应的 XML 文件中。
1.包路径=XML的namespace
2.接口名与 XML 文件名一致。
3.接口方法名与 XML 中的id一致
4.参数/返回值对应
XML文件(SQL映射文件)
1.namespace -> 包路径
2.id -> 方法名
3.resultType -> 返回类型
4.parameterType -> 指定参数类型
5.#{value} -> MyBatis 的安全占位符,替代 JDBC 的?,自动完成类型转换



