Java Web¶
Java Web 相关的标准都是在 Jakarta(Java EE) 中定义的
JavaEE 是一种软件架构和设计思想,是在 JavaSE 的基础上开发的一系列基于服务器的组件、API 标准和通用架构
Client:用户在浏览器中输入 URL 并发送 HTTP 请求
Web 服务器:如 Nginx、Apache
处理静态请求:如果请求是图片、CSS 或 HTML 文件,Web Server 直接响应
转发动态请求:如果请求是动态资源 (如 .jsp 或特定 URL 路径),Web Server 将请求转发给 Tomcat (作为其后端代理)
应用服务器:Servlet 容器
Servlet 容器底层实现了 TCP 连接,解析 HTTP 协议等非常复杂的服务接收请求,根据 URL 路径映射到相应的 Servlet
常见的开源免费服务器有:Tomcat,Jetty,GlassFish
Web 组件:具体的 Servlet 类、JSP 文件
Servlet API 提供了 HttpServletRequest 和 HttpServletResponse 两个高级接口来封装处理 HTTP 请求和响应
Servlet 调用 业务逻辑 组件
业务逻辑:执行核心计算、验证等
数据访问层:与数据库交互获取或保存数据
数据库
简单讲,编写 Web 应用程序就是编写 Servlet 处理 HTTP 请求,然后打包为 war 文件放入 Tomcat 等 Servlet 容器
演进路线:Servlet → JSP → Spring MVC → Spring Boot → Spring Cloud
WAR¶
Web Application Archive
普通的 Java 程序是通过启动 JVM,然后执行 main() 开始运行。而 Java Web 应用程序,需要启动 Servlet 容器加载 WAR 包来运行 Servlet
WAR 包是 Java web 应用的完整部署单元,将 WAR 包部署到 Tomcat 等 Servlet 容器中,容器会解析其中的 Servlet 并使其可用
MyWebApp.war
├── META-INF/ # 包含应用元数据
│ └── MANIFEST.MF # 应用清单文件
├── WEB-INF/ # 包含非公开访问的资源
│ ├── web.xml # 部署描述文件(配置Servlet等,定义了 Servlet 的映射规则)
│ ├── classes/ # 编译后的Java类文件(包括Servlet)
│ │ └── com/
│ │ └── example/
│ │ └── MyServlet.class
│ └── lib/ # 依赖的JAR包
│ └── dependency.jar
├── index.jsp # 公开可访问的JSP文件
├── images/ # 静态资源
└── css/ # 样式文件
Servlet + JSP¶
Servlet 是 Java Web 开发的起点,提供了处理 HTTP 请求的底层 API。处理 GET 请求要覆写 doGet() 方法,处理 POST 请求就覆写 doPost() 方法。
一个 Web App 就是由一个或多个 Servlet 组成的,每个 Servlet 通过注解映射不同的路由
- Redirect 重定向,当浏览器请求一个 URL 时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的 URL 再重新发送新请求,浏览器知道重定向规则,并且会自动发起新的 HTTP 请求。301 永久重定向,302 临时重定向。
- Forward 转发,当一个 Servlet 处理请求的时候,它可以决定自己不继续处理,而是转发给另一个 Servlet 处理,浏览器并不知道服务器内部的转发逻辑
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello World</h1>");
out.println("</body></html>");
}
}
@WebServlet(urlPatterns = "/signin")
public class SignInServlet extends HttpServlet {
...
}
@WebServlet(urlPatterns = "/")
public class IndexServlet extends HttpServlet {
...
}
Servlet 用 PrintWriter 在 Java 代码中嵌入 HTML 效率太低,于是有了 JSP(Java Server Pages) 动态网页技术,可以在 HTML 中嵌入 Java 代码用于创建动态网页,本质是 Servlet 的语法糖。目前已很少使用。
<html>
<head>
<title>Hello World - JSP</title>
</head>
<body>
<%-- JSP Comment --%>
<h1>Hello World!</h1>
<p>
<%
out.println("Your IP address is ");
%>
<span style="color:red">
<%= request.getRemoteAddr() %>
</span>
</p>
</body>
</html>
Servlet 的痛点:大量的样板代码,需要手动解析请求参数和管理响应,控制器逻辑与视图逻辑混合,复杂的 XML 配置,难以进行单元测试
Spring MVC¶
Spring MVC 作为 Spring 框架的一部分,带来了结构化的 MVC(Model-View-Controller) 设计模式,显著简化了 Web 开发。
M (Model):数据模型,通常是 JavaBean 或 POJO,负责承载业务数据
V (View):视图,负责数据的展示(如 JSP、Thymeleaf、FreeMarker 等)
C (Controller):控制器,负责接收客户端请求,调用业务逻辑,并决定返回哪个视图
SSM¶
SSM 是一个集成方案,它利用 Spring Core 整合了 Spring MVC (Web 层) 和 MyBatis (持久化层),提供了一个完整的企业级应用架构。
S (Spring Core):用于管理整个应用的业务层,负责依赖注入 (IoC) 和面向切面编程 (AOP),是整个架构的基础。
S (Spring MVC):用于管理表示层 (Web 层),负责处理 HTTP 请求和响应。
M (MyBatis):用于管理持久化层 (数据访问层),负责与数据库进行交互。
需要大量配置 XML (应用上下文、视图解析器等)、项目搭建和依赖管理复杂、需要手动部署到外部 Servlet 容器
Spring Boot¶
是一个基于 Spring 的套件,预组装了 Spring 的一系列组件(比如内嵌了 Servlet 容器),以便以尽可能少的代码和配置来开发基于 Spring 的 Java 应用程序。
Spring Cloud¶
是基于 Spring Boot 的分布式云开发框架
参考:https://juejin.cn/post/6844904101055037448
Spring Cloud 包含很多子项目,第一代主要以 Netflix 的开源组件为主,包括 Eureka、Ribbon、Feign、Hystrix、Zuul、Archaius 等,其中 Eureka,Hystrix 等不再维护,但目前不影响使用。
第二代 主要以 Alibaba 生态组件为主


