参考文章:https://cloud.tencent.com/developer/article/2530803
Java SE(Java Standard Edition)是Java平台的基础版本,提供核心编程环境和类库,适用于桌面应用和小型工具开发;而Java EE(Java Enterprise Edition)是Java SE的企业级扩展,提供分布式系统、Web服务和企业级API,专为复杂企业应用如电子商务平台设计。两者在定位、功能和应用场景上存在本质差异。
一、定义与核心定位
Java SE:作为Java技术的基础,提供Java虚拟机(JVM)、核心类库(如集合框架、多线程、网络编程)和基本开发工具,支持跨平台运行,适用于开发桌面应用、命令行工具或嵌入式系统。
Java EE:构建于Java SE之上,专注于企业级需求,提供Servlet、JSP、EJB、JPA等高级API,支持分布式计算、事务管理、安全性和高并发处理,用于构建大型Web应用和服务集成系统。
二、功能与技术特性对比
Java SE的功能 :
基础编程支持:包括输入输出(I/O)、多线程、网络通信等核心功能。
轻量级:无需额外容器,直接运行于JVM,适合资源受限环境。
Java EE的功能 :
企业级增强:如分布式事务(JTA)、消息服务(JMS)、安全认证和Web服务,支持多层架构(表示层、业务逻辑层、数据层)。
依赖容器:需部署在应用服务器(如Tomcat)中,提供运行时管理和服务集成。
三、应用场景差异
Java SE的典型场景 :
桌面软件:如Eclipse、NetBeans等开发工具。
小型工具:系统管理脚本、实用程序或嵌入式设备控制。
Java EE的典型场景 :
企业级Web应用:如电子商务平台(淘宝、京东)、金融交易系统或CRM系统。
分布式服务:跨系统集成(如财务与供应链系统协同),需高并发和安全性保障。
四、必知必会:什么是Servlet ?
Servlet 是 Java 用于开发动态 Web 资源的核心技术,是 Java EE(现 Jakarta EE)规范的重要组成部分,本质上是一个运行在 Web 服务器(如 Tomcat)中的 Java 类,专门用于处理客户端(浏览器、App 等)的 HTTP 请求,并生成动态响应。
核心作用:
- 接收请求:获取客户端发送的 HTTP 请求数据(如参数、请求头、Cookie 等)。
- 处理逻辑:根据请求内容执行业务逻辑(如查询数据库、调用服务等)。
- 生成响应:向客户端返回处理结果(如 HTML 页面、JSON 数据、文件等)。
关键特点:
- 运行在服务器端:Servlet 本身不独立运行,必须部署到支持 Servlet 规范的 Web 服务器(如 Tomcat、Jetty、JBoss 等)中,由服务器负责创建和调用。
- 基于请求-响应模型 :每次客户端发送请求,服务器会创建对应的
HttpServletRequest(请求对象)和HttpServletResponse(响应对象),并传递给 Servlet 处理。 - 生命周期由服务器管理 :Servlet 的创建、初始化(
init())、处理请求(service())、销毁(destroy())全由 Web 服务器控制,开发者无需手动管理。
简单示例:
一个最基础的 Servlet 类需要继承 HttpServlet(抽象类,实现了 Servlet 接口),并重写 doGet(处理 GET 请求)或 doPost(处理 POST 请求)方法:
java
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
// 处理 GET 请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置响应内容类型
response.setContentType("text/html");
// 获取输出流,向客户端写响应
PrintWriter out = response.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}
}
然后需要在 Web 配置文件(web.xml)中注册 Servlet 并映射访问路径:
xml
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern> <!-- 访问路径 -->
</servlet-mapping>
部署到 Tomcat 后,访问 http://localhost:8080/项目名/hello 即可看到 Hello, Servlet! 响应。
与 Spring MVC 的关系:
Spring MVC 是基于 Servlet 规范的框架,其核心组件 DispatcherServlet 本质就是一个 Servlet。它作为"前端控制器",接收所有客户端请求,再分发到具体的控制器(@Controller)处理,简化了传统 Servlet 开发中大量的配置和重复代码。
简单说:Servlet 是底层基础,Spring MVC 是在 Servlet 之上的封装和增强。
总结:
Servlet 是 Java Web 开发的基石,负责在服务器端处理 HTTP 请求和响应,是所有 Java Web 框架(如 Spring MVC、Struts 等)的底层依赖。理解 Servlet 的工作原理,有助于更好地掌握 Spring MVC 等上层框架的运行机制。
4-1 Servlet API 核心接口 - HttpServletRequest/HttpServletResponse
HttpServletRequest 和 HttpServletResponse 不是 Spring MVC 的 API ,而是 Java EE(现在称为 Jakarta EE)规范中定义的 Servlet API 核心接口,属于 javax.servlet 包( Jakarta EE 9+ 中为 jakarta.servlet 包)。它们是 Java Web 开发的基础接口,用于处理 HTTP 请求和响应。
Spring MVC 作为基于 Servlet API 的 Web 框架,对这些接口进行了整合和封装,方便开发者在 Spring MVC 的组件(如控制器)中使用它们来处理请求和响应。
具体说明:
-
来源:
HttpServletRequest:定义了 HTTP 请求的相关方法(如获取请求参数getParameter()、请求路径getRequestURI()、请求头getHeader()等)。HttpServletResponse:定义了 HTTP 响应的相关方法(如设置响应状态setStatus()、响应头setHeader()、输出响应体getWriter()等)。
它们的实现类由 Servlet 容器(如 Tomcat、Jetty)提供,并非 Spring MVC 自身实现。
-
Spring MVC 中的使用场景 :
Spring MVC 允许在控制器方法中直接声明这两个接口作为参数,框架会自动注入当前请求对应的实例。例如:
java@RestController public class MyController { @GetMapping("/test") public String test(HttpServletRequest request, HttpServletResponse response) { String name = request.getParameter("name"); // 获取请求参数 response.setContentType("text/plain"); // 设置响应类型 return "Hello: " + name; } }这里的参数注入是 Spring MVC 对 Servlet API 的整合,而非 Spring MVC 自己定义了这些接口。
-
与 Spring MVC 的关系 :
Spring MVC 建立在 Servlet 规范之上,通过
DispatcherServlet(前端控制器,本质是一个 Servlet)拦截所有请求,然后将HttpServletRequest/HttpServletResponse传递给后续的处理器(如控制器方法)。因此,这两个接口是 Spring MVC 与底层 Servlet 容器交互的"桥梁",但本身不属于 Spring MVC 的 API。
总结:HttpServletRequest/HttpServletResponse 是 Servlet 规范的核心接口,Spring MVC 作为基于 Servlet 的框架,只是简化了它们在控制器中的使用,并非其定义者。