Java EE 1.8 API参考文档详解
简介:JAVAEE_API_1.8是Java企业版1.8版本API的文档压缩包,详细介绍了JEE 1.8包含的接口、类和注解。文档集合对于理解并使用Java EE技术至关重要,其中涵盖从Servlet技术到WebSocket的各个方面,帮助开发者构建企业级应用。 
1. Servlet技术详解
1.1 Servlet概述
Servlet是Java EE的核心组件之一,用于扩展服务器的功能,动态生成响应内容。它是一个接口,定义了Java类被HTTP服务器调用所必须实现的方法。Servlet容器,也称为Web容器,负责管理Servlet的生命周期。
1.2 Servlet的生命周期
Servlet生命周期由三个主要阶段组成:初始化(init)、服务(service)和销毁(destroy)。
- 初始化 :Web容器在Servlet实例化后调用init()方法,仅执行一次。
- 服务 :Web容器通过调用service()方法响应客户端请求。对于每个请求,容器会创建新的线程来调用service()。
- 销毁 :Web容器调用destroy()方法销毁Servlet实例,也仅执行一次。
1.3 Servlet API与应用
Servlet API提供了一系列与HTTP相关的方法,比如doGet(), doPost(), doPut()等,允许开发者处理不同的HTTP请求。以下是一个简单的Servlet示例:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body></html>");
}
}
在此示例中,我们创建了一个继承自 HttpServlet 的类,并重写了 doGet() 方法来处理GET请求,向客户端发送简单的HTML内容。开发者可通过覆盖其他 do* 方法处理不同类型的HTTP请求。
Servlet技术是构建Web应用的基石,它支持多种Web开发模式,并在Java EE平台上得到了广泛应用。
2. JSP与EL表达式介绍
2.1 JSP页面基本概念和生命周期
2.1.1 JSP页面的组成和结构
JSP(Java Server Pages)技术是一种用于简化动态网页内容生成的技术。JSP页面通常以 .jsp 扩展名结尾,并可以包含HTML或XML标记、JSP脚本元素以及JSP指令和动作。页面的结构一般如下:
- 指令(Directives):控制页面的属性,如包含(include)其他文件,页面指令(page),标签库指令(taglib)等。
- 脚本元素(Scripting elements):包括声明(declaration)、脚本(scriptlet)和表达式(expression),用于插入Java代码。
- 标准动作(Standard action):如
<jsp:useBean>,<jsp:setProperty>等,提供一种方式执行标准操作。 - HTML标记:构成页面主要视觉内容。
JSP页面被客户端请求时,通常经过以下阶段:
- 转换:将
.jsp文件转换为.java文件。 - 编译:编译
.java文件为.class文件。 - 加载和实例化:类加载器加载
.class文件,并创建实例。 - 请求处理:JSP引擎调用
_jspService方法处理请求。 - 清理:请求完成后,JSP页面被垃圾回收。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%-- Scriptlet for Java code --%>
<%
// 声明变量
String message = "Hello, World!";
%>
<h2><%= message %></h2>
<%-- Expression for output --%>
</body>
</html>
2.1.2 JSP页面的生命周期管理
JSP页面生命周期的管理主要依赖于几个重要的JSP API,它们是:
javax.servlet.jsp.HttpJspPage:提供_jspService方法的接口,处理来自HTTP请求的请求。javax.servlet.jsp.JspPage:HttpJspPage接口的父接口,提供jspInit和jspDestroy方法。javax.servlet.jsp.PageContext:管理JSP页面范围内的属性。
JSP页面初始化时会调用 jspInit 方法,当页面实例被销毁前会调用 jspDestroy 方法。而每次请求处理时, _jspService 方法会被调用。生命周期管理通过这些方法允许开发者在页面初始化和销毁时执行特定的代码。
public void jspInit() {
// 初始化代码
super.jspInit();
}
public void jspDestroy() {
// 清理代码
super.jspDestroy();
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 请求处理代码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h2>Hello, World!</h2>");
}
2.2 EL表达式的基础应用
2.2.1 EL表达式的语法和使用场景
EL(Expression Language)表达式是JSP的一个重要组成部分,它提供了一种简单的方式来访问数据。EL表达式用 ${} 括起来,例如 ${user.name} 。它可以在JSP页面中替代脚本片段,使页面更加清晰,减少Java代码的使用。
EL表达式的主要用途包括:
- 简化页面中的表达式和脚本片段。
- 提供对JavaBean属性的访问。
- 支持基本的数据操作,如算术运算和逻辑运算。
- 可以设置默认值,使用
empty操作符来检查变量是否为空。
<p>Welcome ${user.name}!</p>
在上面的EL表达式中,如果 user 是一个JavaBean实例,并且 user 对象有一个名为 name 的属性,则EL表达式会输出该属性的值。
2.2.2 EL表达式与JSP页面的结合使用
将EL表达式与JSP页面结合使用,可以让页面展示更加灵活。比如,可以在JSP页面中使用EL表达式访问存储在作用域对象(如request、session、application等)中的数据。
<c:set var="user" value="${requestScope.user}" scope="request" />
<p>User: ${user.name}</p>
在上面的示例中, <c:set> 动作用于将数据绑定到一个作用域对象。 var 属性指定EL变量名, value 属性是EL表达式,用于指定要绑定的值。 scope 属性则指定了变量的作用域。
结论
本章节介绍JSP页面的基本概念和结构,以及其生命周期的管理。JSP页面通过结合HTML和Java代码片段能够有效地生成动态内容。同时,本章节也探讨了EL表达式的使用,它作为JSP页面中用于简化数据访问的一种工具,能够帮助开发者更快速地实现页面内容的动态展示。
在下一章中,我们将深入探讨JSTL标签库的应用,学习如何使用标签库来进一步简化和优化JSP页面。
3. JSTL标签库应用
在Web开发中,JSTL(JavaServer Pages Standard Tag Library,Java服务器页面标准标签库)作为标签库的标准,极大地简化了JSP页面中的代码复杂性。它提供了一系列通用的标签,帮助开发人员进行数据处理、循环遍历、条件判断等操作,使得JSP页面更加简洁和易于维护。
3.1 JSTL核心标签库的使用
3.1.1 核心标签库的基本功能介绍
JSTL核心标签库提供了很多有用的功能,包括表达式语言(Expression Language,EL)的扩展、条件判断、循环遍历、URL的重新构造、I18N(国际化)支持等。这些标签极大地丰富了JSP页面的功能,提高了开发的效率和代码的可读性。
例如,核心标签库中的 <c:forEach> 标签可以用来遍历集合或数组中的每一个元素,与传统的Java for循环相比,它让页面的代码更加直观易懂。
3.1.2 核心标签库的实例演示
下面是一个使用 <c:forEach> 标签的例子,它演示了如何在JSP页面中遍历一个Java List集合,并打印出每个元素。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<ul>
<c:forEach items="${list}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
在这个例子中, <%@ taglib %> 指令首先引入了JSTL核心标签库,其中 uri 指定了标签库的唯一标识符, prefix 定义了标签库的前缀。在 <c:forEach> 标签中, items 属性指定了要遍历的集合或数组, var 属性定义了循环中当前元素的变量名。
3.2 JSTL格式化标签库的应用
3.2.1 格式化标签库在数据展示中的作用
JSTL格式化标签库主要用于处理数据的显示格式,例如数字、日期和货币的格式化。这些标签使得国际化和本地化的处理变得简单,允许开发者按照不同地区的习惯展示数据。
3.2.2 格式化标签库的实际应用案例
假设有一个国际化的Web应用,需要根据不同用户的地区设置显示货币,可以使用 <fmt:formatNumber> 标签来实现。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<p>Formatted Number: <fmt:formatNumber value="${amount}" currencyCode="USD"/></p>
在这个例子中, <fmt:formatNumber> 标签的 value 属性代表了要格式化的数字, currencyCode 属性指定了货币代码,这样用户就可以看到符合其地区习惯的货币格式。
| 属性 | 说明 |
|---|---|
value |
指定要格式化的数字 |
currencyCode |
指定货币代码,如USD代表美元 |
pattern |
使用自定义模式进行格式化 |
currencySymbol |
指定货币符号,如美元符号$ |
通过上述代码块,开发者可以按照用户所在地区的需求,将金额格式化为相应的货币形式展示给用户。
JSTL标签库的应用让JSP页面更加简洁和强大,它不仅提高了开发效率,也增强了代码的可读性和可维护性。在下一章节中,我们将介绍格式化标签库在数据展示中的具体作用和应用场景。
4. EJB组件模型介绍
在Java EE企业级应用开发中,EJB(Enterprise JavaBeans)组件模型扮演着重要的角色。它提供了一套标准的服务器端组件架构,旨在简化分布式对象的开发,管理组件的生命周期,并提供事务、安全、并发等企业级服务。本章将深入探讨EJB的基础知识,包括其基本概念、架构、生命周期、事务管理以及应用场景。
4.1 EJB的基本概念和架构
4.1.1 EJB的作用和特性
EJB作为一种服务器端组件模型,其核心作用是提供业务逻辑的实现。EJB容器负责管理EJB组件的生命周期,包括组件的创建、调用、持久化以及销毁等。EJB的特性主要体现在以下几个方面:
- 声明式事务管理 :开发者可以利用注解或部署描述符来声明事务的属性,而不需要在代码中直接编写事务处理逻辑。
- 声明式安全控制 :EJB支持通过配置来定义对业务方法的访问控制,而不是在代码中硬编码安全逻辑。
- 远程访问能力 :EJB提供了RMI(Remote Method Invocation)支持,允许EJB组件通过网络被远程客户端调用。
- 资源管理 :容器负责管理EJB组件的资源,如数据库连接,这简化了开发者对资源的管理。
- 依赖注入 :EJB容器支持依赖注入,允许将外部资源或服务注入到EJB组件中,增加了组件的灵活性和可测试性。
4.1.2 EJB的三种类型及其应用场景
EJB定义了三种主要的组件类型:会话Bean(Session Beans)、消息驱动Bean(Message-Driven Beans)和实体Bean(Entity Beans)。它们各自有不同的应用场景:
- 会话Bean :用于实现业务逻辑。它们分为无状态(Stateless)和有状态(Stateful)两种类型。无状态会话Bean没有与单个客户机相关的状态信息,可以在多个客户机之间共享;而有状态会话Bean保持了与单个客户机的状态信息,每个客户机实例都是唯一的。
- 消息驱动Bean :用于异步处理消息,它们结合了EJB和JMS(Java Message Service)的优点,通常用于实现消息监听和处理逻辑。
- 实体Bean :代表了持久化存储中的业务数据,如数据库中的记录。实体Bean通过容器管理的持久化(CMP)或Bean管理的持久化(BMP)与数据库交互。需要注意的是,随着Java Persistence API(JPA)的出现,实体Bean的使用已经相对减少。
4.2 EJB的生命周期和事务管理
4.2.1 EJB生命周期的管理机制
EJB组件的生命周期由EJB容器负责管理。EJB生命周期的不同阶段包括:实例化、依赖注入、创建、就绪(Ready for service)、方法调用、钝化(Passivated)、销毁等。容器确保了组件在正确的时间被创建和销毁,并且只在需要时才激活。无状态会话Bean由于没有状态,通常会被容器重用,而有状态会话Bean则会在每次调用后钝化,以保持状态。
4.2.2 EJB中的事务管理方法和策略
事务管理是EJB提供的重要企业级服务之一。在EJB中,可以通过两种方式来管理事务:
-
容器管理事务(Container-Managed Transactions,CMT) :这是EJB中推荐的事务管理方式。开发者只需要在业务方法上通过注解或XML部署描述符声明事务属性,如 REQUIRED、REQUIRES_NEW等。容器根据这些声明自动处理事务的开始、提交或回滚。
-
Bean管理事务(Bean-Managed Transactions,BMT) :在这种方式下,EJB组件自身负责控制事务的边界。开发者需要使用 javax.transaction.UserTransaction 接口来显式地开始、提交或回滚事务。BMT提供了更高的灵活性,但同时也需要开发者编写更多的事务控制代码。
下面通过一个简单的代码示例来展示容器管理事务的使用:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class MyEJB {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myMethod() {
// 业务逻辑
}
}
在这个例子中, @Stateless 注解标识了一个无状态会话Bean, @TransactionAttribute 注解则表明 myMethod 方法必须在事务的上下文中执行。如果当前方法的调用已经在一个事务上下文中,它将继续在这个事务中运行;否则,容器会自动创建一个新的事务。
通过本章节的介绍,我们了解了EJB组件模型的基本概念、架构以及生命周期和事务管理。EJB作为Java EE的核心组件之一,为开发者提供了一套强大的抽象,以简化复杂的业务逻辑开发。在下一章中,我们将深入探讨JPA对象关系映射框架,了解如何将Java对象映射到关系型数据库表中,以及JPA的持久化操作。
5. JPA对象关系映射框架
5.1 JPA的基本概念和架构
5.1.1 JPA在ORM中的位置和作用
Java Persistence API (JPA) 是Java EE平台中用于对象关系映射(ORM)的一组规范,允许Java开发者通过面向对象的方法操作数据库。它位于Java持久层解决方案的中心,是实现数据持久化的一种高级抽象。
JPA的主要作用是定义了一套面向对象的持久化API来简化数据库操作,并提供了一种在关系型数据库和Java对象之间进行映射的机制。它通过注解或XML配置,将Java实体类映射到关系型数据库的表,实现数据的CRUD(创建、读取、更新、删除)操作。JPA标准由EclipseLink、Hibernate和OpenJPA等实现,使得开发者在切换底层数据持久化实现时,不需要修改太多代码。
5.1.2 JPA的API结构和核心组件
JPA的API主要由以下几个核心组件组成:
- EntityManager : 用于管理实体对象的生命周期和执行持久化操作。
- EntityTransaction : 用于控制事务的边界。
- EntityManagerFactory : 用于创建EntityManager实例,通常一个应用只有一个实例。
- 实体类 : 用于映射数据库表的Java类。
- 实体关系图(Entity Graph) : 用于定义实体如何加载和构建。
JPA中的API接口和实现类,例如 EntityManager 和 EntityManagerFactory ,通常不会直接使用,而是通过依赖注入框架注入到你的应用中,从而实现解耦。
JPA的配置通常通过两种方式进行:注解和XML。注解配置简单直接,适用于大多数情况,而XML配置则提供了更高的灵活性和详细的配置能力,适合处理复杂的映射关系。
// 简单的EntityManager使用示例
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
// 创建或更新实体等持久化操作
entityManager.persist(entity);
transaction.commit();
} catch (Exception ex) {
transaction.rollback();
} finally {
entityManager.close();
}
5.2 JPA的持久化操作详解
5.2.1 实体的持久化状态和生命周期
在JPA中,实体(Entity)是从数据库的角度看应用程序中的对象。实体的生命周期从创建、加载、修改到删除,每个阶段都有一套规则来管理实体的状态。
- 瞬态(Transient) : 实体尚未与任何EntityManager关联。
- 持久化(Persistent) : 实体当前由EntityManager管理,并且与数据库中的记录相绑定。
- 游离(Detached) : 实体曾经与EntityManager关联,但当前不再被管理。
- 移除(Removed) : 实体已被标记为删除状态,等待清除。
// 实体状态转换的简单示例
MyEntity entity = new MyEntity();
// 实体处于瞬态
entityManager.getTransaction().begin();
entityManager.persist(entity);
// 实体状态变为持久化
entityManager.detach(entity);
// 实体状态变为游离
entityManager.remove(entity);
// 实体状态变为移除,并在事务提交时执行删除操作
5.2.2 JPQL语言和查询操作
JPA提供了一种强大的查询语言JPQL(Java Persistence Query Language),用于以面向对象的方式编写数据库查询。JPQL查询针对实体类和它们的属性,而不是数据库的表和列,这意味着查询是与数据库无关的。
// JPQL查询示例
TypedQuery<MyEntity> query = entityManager.createQuery(
"SELECT e FROM MyEntity e WHERE e.name = :name", MyEntity.class);
query.setParameter("name", "Sample Name");
List<MyEntity> results = query.getResultList();
JPQL查询支持多种功能,包括投影查询、聚合函数、分组以及连接查询等,大大提高了查询的灵活性和表达能力。它类似于SQL,但更高级,因为它完全基于对象模型。这使得在多表关联查询时,开发者可以以更清晰、面向对象的方式表达查询意图。
6. JMS消息服务规范
6.1 JMS的基本概念和消息模型
6.1.1 JMS的核心功能和应用场景
Java消息服务(Java Message Service,简称JMS)是一个Java API,提供了消息服务的编程接口。JMS允许应用程序之间以及分布式系统中发送消息,进行异步通信。它的核心功能包括创建、发送、接收和读取消息,使应用程序能够在不同的时间点进行交互。
应用场景涵盖了多种业务需求,例如:
- 解耦合 : 系统组件之间不直接交互,而是通过消息队列来传递信息,降低组件间的依赖。
- 异步处理 : 发送消息的操作不会立即等待接收方处理,而是将消息放入队列,由接收方在适当的时候处理。
- 系统扩展 : 可以使用消息队列作为负载均衡器,动态分配工作负载。
- 可靠通信 : JMS提供了消息确认机制,确保消息的成功传递。
6.1.2 点对点模型和发布/订阅模型的对比
JMS定义了两种消息传递模型:点对点(Point-to-Point,P2P)模型和发布/订阅(Publish-Subscribe,Pub/Sub)模型。
点对点模型 :
- 每条消息只能被一个消费者消费。
- 通常使用队列(Queue)来接收消息。
- 生产者和消费者之间不存在时间上的依赖关系。
- 队列中的消息按到达顺序进行处理。
发布/订阅模型 :
- 生产者发布消息到主题(Topic),所有订阅了该主题的消费者都可以收到消息。
- 主题可以临时存储消息,消费者可以随时订阅和取消订阅。
- 订阅者可以设定只接收特定时间之后发布的消息。
- 更加灵活,但消费者之间是相互独立的。
接下来,我们将深入探讨如何在Java中实现JMS消息的生产和消费。
7. Java EE技术的综合应用
7.1 JSF MVC框架特性解析
JavaServer Faces (JSF) 是Java EE中用于构建Web应用程序的标准MVC框架。它允许开发者以声明式方式构建用户界面,并处理用户与界面的交互。
7.1.1 JSF框架的核心组件和生命周期
JSF应用由以下核心组件构成:
- Facelets : 这是JSF用来构建用户界面的标记语言。
- Managed Beans : 它们类似于Spring中的beans,用于处理业务逻辑。
- Expression Language (EL) : 允许在JSF页面上直接访问bean的属性。
- JavaServer Pages (JSP) : 可用于实现复杂的用户界面。
JSF的生命周期由一系列的阶段组成,每个阶段都对应于处理请求的特定任务:
1. Restore View
2. Apply Request Values
3. Process Validations
4. Update Model Values
5. Invoke Application
6. Render Response
7.1.2 JSF中表单处理和数据验证
JSF提供了丰富的组件和验证器来处理表单数据,这些组件可以被轻松地绑定到后端bean。
例如,一个简单的JSF表单代码如下:
<h:form>
<h:inputText value="#{userBean.userName}" required="true" />
<h:commandButton value="Submit" action="#{userBean.processUser}" />
</h:form>
<h:inputText> 组件用于创建输入字段, value 属性绑定到后端的 userBean 的 userName 属性。 required="true" 表示输入是必填的。 <h:commandButton> 用于提交表单数据。
数据验证可以使用JSF自带的验证器,也可以自定义验证器。例如,使用内置的 @NotNull 验证器:
import javax.validation.constraints.NotNull;
public class User {
@NotNull
private String userName;
// getter和setter方法
}
7.2 CDI依赖注入框架的深入应用
CDI (Contexts and Dependency Injection) 是Java EE的依赖注入框架,它提供了一种统一的方式来将组件连接在一起。
7.2.1 CDI的基本概念和注入机制
CDI允许将组件(如beans)作为依赖项注入到其他组件中。CDI支持多种类型的注入,包括字段注入、方法注入和构造器注入。
例如,使用字段注入的简单bean定义如下:
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class GreetingService {
private String message;
@Inject
public void setMessage(@Named("greeting") String message) {
this.message = message;
}
public String greet() {
return message;
}
}
在这里, @Inject 注解用于注入 message 字段,而 @Named 注解用于为该字段指定一个名称。
7.2.2 CDI在复杂业务逻辑中的实践案例
在复杂的应用程序中,CDI可以在业务逻辑的各个组件之间轻松地共享和传递数据。例如,一个服务可能需要使用多个其他服务或资源:
@Named
@RequestScoped
public class OrderService {
@Inject
private CustomerRepository customerRepository;
@Inject
private InventoryService inventoryService;
public void createOrder(Order order) {
Customer customer = customerRepository.findCustomerById(order.getCustomerId());
if (inventoryService有足够的库存(order)) {
// 创建订单逻辑
} else {
// 处理库存不足情况
}
}
}
在这个例子中, OrderService 需要访问 CustomerRepository 和 InventoryService ,CDI能够自动注入这些依赖项。
7.3 JAX-RS RESTful Web服务标准
JAX-RS (Java API for RESTful Web Services) 为开发基于REST的Web服务提供了标准的方法。
7.3.1 REST架构风格和JAX-RS的关系
REST是一种基于资源的架构风格,它强调简单性和松耦合。JAX-RS提供了一组注解来定义RESTful服务的资源。
7.3.2 创建和测试RESTful服务的步骤
创建一个RESTful服务的简单步骤包括定义资源、设置HTTP方法以及创建服务端点。例如:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "Hello, REST!";
}
}
在这个例子中, @Path("/hello") 定义了一个资源路径, @GET 指定HTTP方法, @Produces 表示返回的媒体类型。
测试这个服务可以通过直接在浏览器访问URL http://localhost:8080/app/hello 或者使用Postman这样的工具。
7.4 WebSocket API介绍
WebSocket是一种在单个TCP连接上提供全双工通信通道的协议。
7.4.1 WebSocket协议的核心特性和优势
- 实时双向通信
- 低开销和低延迟
- 跨平台兼容性
WebSocket协议通常用于需要实时通信的场景,如聊天应用、实时监控等。
7.4.2 实现WebSocket通信的详细步骤和代码示例
实现WebSocket服务涉及以下几个步骤:
- 创建WebSocket端点。
- 处理连接的开启和关闭。
- 处理客户端和服务器之间的消息交换。
以下是创建一个简单的WebSocket服务的代码示例:
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")
public class ChatEndpoint {
@OnOpen
public void onOpen(Session session) {
System.out.println("New connection: " + session.getId());
// 这里可以添加更多的连接管理逻辑
}
// 其他方法,例如处理消息发送和关闭连接
}
在这个例子中, @ServerEndpoint 注解定义了WebSocket服务的URL路径。 @OnOpen 注解的方法在客户端连接到服务时被调用。这只是WebSocket编程的一个入门示例,完整应用还需要实现消息处理和会话管理等功能。
简介:JAVAEE_API_1.8是Java企业版1.8版本API的文档压缩包,详细介绍了JEE 1.8包含的接口、类和注解。文档集合对于理解并使用Java EE技术至关重要,其中涵盖从Servlet技术到WebSocket的各个方面,帮助开发者构建企业级应用。
更多推荐



所有评论(0)