概述

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
2
3
4
5
6
7
./applicationContext.xml
<!-- 扫描切面类、Bean等 --> 
<context:component-scan base-package="com.example"/>
<!-- Bean实现 -->
<bean id="orderService" class="com.example.OrderServiceImpl"/>
<!-- AOP自动代理开启 -->   
<aop:aspectj-autoproxy/>

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:textth:eachth: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 的?,自动完成类型转换