主题
JavaEE
什么是JavaEE
JavaEE(Java Platform, Enterprise Edition),前身被称为Java 2 Platform, Enterprise Edition(J2EE),并在2018年3月正式更名为了Jakarta EE(尽管在一些社区中仍广泛称为Java EE)。JavaEE是由Sun Microsystems(现已被Oracle收购)及其后续维护者主导,联合多个业界厂商共同制定的企业级应用程序开发规范。
JavaEE是一套基于Java SE基础之上,针对企业级应用设计的丰富技术和API集合。它的主要目的是简化和标准化大规模分布式、事务型、高度可用的企业级应用系统的开发与部署流程,确保程序具有良好的可移植性、安全性以及可重用性。
主要组成
- Web层:通过Servlets、JavaServer Pages (JSP)、JavaServer Faces (JSF)等技术实现Web应用程序的开发。
- 组件模型:利用Enterprise JavaBeans (EJB)等技术实现业务逻辑的模块化和分布化。
- 持久化:Java Persistence API (JPA)提供对象关系映射(ORM),方便数据库操作。
- 服务与通信:Java Message Service (JMS)支持异步消息传递;Java Transaction API (JTA)和Java Transaction Service (JTS)支持分布式事务处理。
- Web服务:支持SOAP、RESTful等Web服务接口的设计与实现。
- 安全管理:提供统一的安全框架和API,确保企业应用的安全运行。
关系与演变
Java EE建立在Java SE的基础平台上,添加了大量专为企业级应用场景设计的服务和框架。 随着开源和轻量级框架(如Spring框架)的发展,Java EE也在不断演进,吸收和整合现代开发模式和最佳实践。
开发场景
JavaEE适用于构建复杂的企业级应用,尤其在电子商务、金融服务、供应链管理等领域广泛应用,例如大型电商网站(如京东、淘宝)的后台服务往往基于JavaEE技术栈开发。
JavaEE中的十三个核心技术
1. Servlet:
- 提供一种创建动态Web内容的规范,允许开发人员编写处理HTTP请求和响应的Java类。
- Servlet容器负责管理Servlet生命周期、线程安全、请求分派等。
2. JavaServer Pages (JSP):
- 基于Servlet技术,允许开发人员在HTML页面中嵌入Java代码片段,实现动态生成网页内容。
- JSP编译成Servlet后执行,支持表达式语言(EL)、JSTL(JSP Standard Tag Library)等简化页面开发。
3. JavaServer Faces (JSF):
- 面向组件的Web应用框架,提供了一种构建用户界面的标准方法,包括UI组件、事件处理、导航规则等。
- 支持模型-视图-控制器(MVC)架构,便于分离表现层和业务逻辑。
4. Enterprise JavaBeans (EJB):
- 企业级组件模型,用于构建分布式、可移植、安全且可伸缩的业务逻辑。
- 包括会话bean(Session Beans)处理用户会话,实体bean(Entity Beans)映射到数据库记录,以及消息驱动bean(Message-Driven Beans)处理异步消息。
5. Java Persistence API (JPA):
- 对象关系映射(ORM)规范,简化Java对象与数据库之间的交互。
- 提供了声明式查询语言(JPQL)、实体注解、事务管理等功能。
6. Java Message Service (JMS):
- 用于在分布式系统间发送和接收异步消息的标准API。
- 支持点对点(Queue)和发布/订阅(Topic)两种消息模式。
7. Java Transaction API (JTA):
- 定义了跨多个资源(如数据库、消息队列等)的分布式事务处理接口。
- 与JTS(Java Transaction Service)配合,支持两阶段提交(2PC)等高级事务特性。
8. JavaMail:
- 用于发送、接收电子邮件的API,支持SMTP、IMAP、POP3等邮件协议。
9. Java Authentication and Authorization Service (JAAS):
- 提供用户身份验证和授权服务,支持多种认证机制和角色管理。
10. Java API for RESTful Web Services (JAX-RS):
- 用于构建和访问RESTful Web服务的API,简化了HTTP请求和响应的处理。
11. Java API for XML Web Services (JAX-WS):
- 支持基于SOAP协议的Web服务开发,包括WSDL生成、服务端和客户端的API。
12. JavaBeans Activation Framework (JAF):
- 用于处理数据(如MIME类型的数据)的API,与JSP、Servlet、JMS等技术紧密集成。
13. Java Naming and Directory Interface (JNDI):
- 提供统一的命名和目录服务接口,便于查找和访问各种网络资源。
总结
这些技术构成了JavaEE的核心部分,开发者可以根据项目需求选择合适的组件进行组合,构建高效、可靠且可维护的企业级应用系统。随着时间的推移和技术的发展,某些技术(如EJB)的部分功能可能已被更轻量级的替代方案(如Spring框架)所取代或补充,但它们依然代表了JavaEE在特定领域内提供的标准化解决方案。
Servlet
Java EE中的Servlet是一种基于Java技术的服务器端组件,用于处理HTTP请求并生成HTTP响应。Servlet运行于支持Java的Web服务器或应用服务器中,充当客户端(通常是Web浏览器)与服务器端资源之间的桥梁。Servlet生命周期包括创建、初始化、服务请求和销毁四个关键阶段,下面将通过示例代码来详细解读。
Servlet生命周期
1. 创建阶段
当首次接收到针对某个Servlet的请求时,Web容器(如Tomcat、Jetty等)会检查是否已经存在该Servlet的实例。如果没有,容器将使用默认无参构造函数创建一个新的Servlet实例。
java
public class MyServlet extends HttpServlet {
// 无参构造函数由Web容器隐式调用
public MyServlet() {
super();
System.out.println("Servlet实例创建");
}
}2. 初始化阶段
在Servlet实例创建后,容器会立即调用其init()方法进行初始化。通常在这个方法中设置一些全局变量、打开数据库连接、加载配置信息等一次性操作。init()方法在整个Servlet生命周期中只执行一次。
java
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("Servlet初始化");
// 示例:从Servlet配置中获取初始化参数
String myParam = config.getInitParameter("myParam");
System.out.println("初始化参数: " + myParam);
// 示例:进行其他初始化操作,如打开数据库连接
DataSource dataSource = ...; // 初始化数据库连接
}
// 或者覆盖带参数的init()方法
@Override
public void init() throws ServletException {
System.out.println("Servlet初始化");
// ...
}3. 服务阶段
每当接收到一个针对此Servlet的请求时,容器都会调用Servlet的service()方法。service()方法根据请求类型(GET、POST等)自动调用对应的doGet()、doPost()等方法。这里以doGet()为例:
java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理GET请求");
// 获取请求参数
String paramValue = request.getParameter("param");
// 设置响应内容类型
response.setContentType("text/plain;charset=UTF-8");
// 响应数据写入输出流
PrintWriter out = response.getWriter();
out.println("Hello, Servlet! Received parameter: " + paramValue);
out.flush();
out.close();
}
// 类似地,可以覆盖doPost()、doPut()、doDelete()等方法处理其他HTTP方法的请求4. 销毁阶段
当Web容器决定卸载Servlet(如Web应用关闭、重新部署或容器自身关闭)时,会调用Servlet的destroy()方法。在此方法中,应释放所有占用的资源,如关闭数据库连接、清理临时文件等。
java
@Override
public void destroy() {
System.out.println("Servlet销毁");
// 示例:关闭数据库连接
if (dataSource != null) {
try {
dataSource.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}总结
Servlet生命周期的四个阶段——创建、初始化、服务请求和销毁,分别对应了Servlet实例的诞生、准备就绪、处理工作和终结清理。通过覆盖或实现相关生命周期方法,开发者可以控制Servlet在各个阶段的行为,确保资源的有效管理和高效服务。在实际开发中,Servlet通常与JSP、过滤器、监听器等组件一起协作,构建复杂的Web应用程序。