1. Java EE 平台概述
1.1 发展历程
Java EE 从 J2EE 发展而来,经历了多个版本的演进,从早期的 J2EE 1.2 到最新的 Jakarta EE。
1.2 架构特点
- 多层架构:
- 客户端层:用户界面,如 Web 浏览器、移动应用等。
- Web 层:处理 HTTP 请求和响应,主要使用 Servlet 和 JSP。
- 业务逻辑层:处理业务逻辑,主要使用 EJB。
- 持久层:处理数据持久化,主要使用 JPA 和 JDBC。
- 服务组件:各种服务和技术组件,如 Servlet、EJB、JPA、JDBC 等。
- 企业级特性:安全性、事务管理、消息传递、资源管理等。
1.3 主要组件
- Servlet 和 JSP:
- Servlet:Java 类,用于处理客户端请求并生成响应。
- JSP:Java Server Pages,用于生成动态网页。
- EJB(Enterprise JavaBeans):
- 会话 Bean:处理业务逻辑,分为无状态( Stateless )和有状态( Stateful )。
- 实体 Bean:表示持久化对象,基于 JPA。
- 消息驱动 Bean:处理异步消息,基于 JMS。
- JPA(Java Persistence API):用于对象关系映射(ORM),简化数据库操作。
- JDBC(Java Database Connectivity):用于连接和操作数据库。
- JMS(Java Message Service):用于消息传递,支持异步通信。
- JTA(Java Transaction API):用于事务管理。
- JNDI(Java Naming and Directory Interface):用于查找和访问命名和目录服务。
- RMI(Remote Method Invocation):用于远程方法调用。
1.4 部署模型和运行环境
- 应用服务器:如 Tomcat、WildFly、WebLogic、WebSphere 等,用于部署和运行 Java EE 应用。
- 部署单元:
- WAR 文件:Web Application Archive,包含 Web 应用的所有资源。
- EAR 文件:Enterprise Archive,包含整个企业应用的所有资源。
2. Java EE 核心技术
2.1 Servlet 和 JSP
2.1.1 Servlet
- 生命周期:
- 初始化(init):Servlet 被加载时调用,用于初始化资源。
- 服务(service):每次接收到请求时调用,处理请求并生成响应。
- 销毁(destroy):Servlet 被卸载时调用,用于释放资源。
- 请求处理流程:
- 接收请求:通过
HttpServletRequest
获取请求参数。 - 处理请求:根据请求参数执行相应的业务逻辑。
- 生成响应:通过
HttpServletResponse
返回响应结果。
- 接收请求:通过
- 示例:实现一个简单的登录验证 Servlet。
java">@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");if ("admin".equals(username) && "123456".equals(password)) {response.sendRedirect("welcome.jsp");} else {response.sendRedirect("error.jsp");}}
}
2.1.2 JSP
- 语法:
- 表达式:
<%= %>
,用于输出变量值。 - 脚本:
<% %>
,用于嵌入 Java 代码。 - 声明:
<%! %>
,用于声明变量和方法。
- 表达式:
- 指令:
- page:设置页面属性,如内容类型、编码等。
- include:包含其他 JSP 文件。
- taglib:引入标签库。
- 动作元素:
- forward:转发请求到另一个资源。
- include:包含其他资源的内容。
- useBean:创建和使用 JavaBean。
- 示例:欢迎页面
welcome.jsp
。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Welcome</title>
</head>
<body><h1>Welcome, <%= request.getParameter("username") %>!</h1>
</body>
</html>
2.2 EJB(Enterprise JavaBeans)
- 类型:
- 会话 Bean:
- 无状态(Stateless):不保存会话状态,每次调用都是独立的。
- 有状态(Stateful):保存会话状态,适用于需要会话上下文的场景。
- 实体 Bean:表示持久化对象,基于 JPA。
- 消息驱动 Bean:处理异步消息,基于 JMS。
- 会话 Bean:
- 作用:
- 会话 Bean:封装业务逻辑。
- 实体 Bean:表示持久化对象。
- 消息驱动 Bean:处理 JMS 消息。
- 开发方法:
- 使用注解(@Stateless、@Stateful、@MessageDriven)。
- 示例:一个简单的无状态会话 Bean。
java">@Stateless
public class UserService {public String greet(String name) {return "Hello, " + name;}
}
2.3 JPA(Java Persistence API)
- 实体类定义:
- 使用注解(@Entity、@Table、@Id、@GeneratedValue)。
- @Entity:标记类为实体类。
- @Table:指定表名。
- @Id:标记主键字段。
- @GeneratedValue:指定主键生成策略。
- 关系映射:
- 一对一:使用 @OneToOne 注解。
- 一对多:使用 @OneToMany 注解。
- 多对一:使用 @ManyToOne 注解。
- 多对多:使用 @ManyToMany 注解。
- 查询语言:
- JPQL(Java Persistence Query Language):用于编写查询语句。
- 事务管理:
- 使用 @Transactional 注解。
- 示例:
- 实体类
User
。
- 实体类
java">@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")private String username;@Column(name = "password")private String password;// Getters and Setters
}
- 查询示例:
java">@PersistenceContext
private EntityManager entityManager;public List<User> findAllUsers() {return entityManager.createQuery("SELECT u FROM User u", User.class).getResultList();
}
2.4 JDBC(Java Database Connectivity)
- 数据库连接:
- 使用
DriverManager
获取连接。 - 示例:
- 使用
java">String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
Connection conn = DriverManager.getConnection(url, user, password);
- SQL 执行:
- Statement:执行静态 SQL 语句。
- PreparedStatement:预编译 SQL 语句,防止 SQL 注入。
- CallableStatement:执行存储过程。
- 示例:
java">try (Connection conn = DriverManager.getConnection(url, user, password);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {while (rs.next()) {System.out.println(rs.getString("username"));}
} catch (SQLException e) {e.printStackTrace();
}
- 结果集处理:
- 使用
ResultSet
处理查询结果。 - 示例:
- 使用
java">while (rs.next()) {String username = rs.getString("username");System.out.println(username);
}