跳转至

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

20250416201618

WAR

Web Application Archive

20250416203124

普通的 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

20240625215700

Spring Cloud 包含很多子项目,第一代主要以 Netflix 的开源组件为主,包括 Eureka、Ribbon、Feign、Hystrix、Zuul、Archaius 等,其中 Eureka,Hystrix 等不再维护,但目前不影响使用。

第二代 主要以 Alibaba 生态组件为主