JavaEE (詳細注釋版)
1. 入門基礎
1.1 JavaEE簡介
JavaEE(Java Platform, Enterprise Edition)是由Sun Microsystems推出的一套標準,現由Oracle維護。JavaEE平臺主要用于開發和運行企業級應用程序,具有高可擴展性、可維護性和跨平臺性。
1.2 JavaEE體系結構
JavaEE體系結構包括以下幾層:
- 表示層:負責與用戶交互。常用技術包括Servlet、JSP、JSF等。
- 業務邏輯層:處理具體的業務邏輯。使用EJB(Enterprise JavaBeans)來實現。
- 持久層:負責數據的持久化。常用技術有JPA(Java Persistence API)、JDBC等。
- 集成層:用于系統集成,常用技術包括JMS(Java Message Service)、JCA(Java Connector Architecture)等。
1.3 環境搭建
為了開發JavaEE應用程序,需要安裝以下軟件:
- JDK(Java Development Kit):Java開發工具包。
- Eclipse或IntelliJ IDEA:集成開發環境(IDE)。
- Apache Tomcat:一個常用的Servlet容器。
- Maven或Gradle:項目構建工具。
2. 核心技術
2.1 Servlet
Servlet是一種用于擴展服務器功能的小程序,主要用于處理HTTP請求。以下是一個簡單的Servlet例子,并且包含詳細注釋:
import java.io.IOException; // 導入IOException類,用于處理輸入輸出異常
import javax.servlet.ServletException; // 導入ServletException類,用于處理Servlet特有的異常
import javax.servlet.annotation.WebServlet; // 導入WebServlet注解,用于定義Servlet的URL映射
import javax.servlet.http.HttpServlet; // 導入HttpServlet類,所有Servlet類都繼承自這個類
import javax.servlet.http.HttpServletRequest; // 導入HttpServletRequest類,用于處理請求數據
import javax.servlet.http.HttpServletResponse; // 導入HttpServletResponse類,用于處理響應數據@WebServlet("/hello") // 使用@WebServlet注解定義Servlet的URL映射為/hello
public class HelloServlet extends HttpServlet {private static final long serialVersionUID = 1L; // 定義序列化ID// 重寫doGet方法,處理GET請求protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html"); // 設置響應的內容類型為HTMLresponse.getWriter().println("<h1>Hello, World!</h1>"); // 輸出HTML內容}
}
2.2 JSP(JavaServer Pages)
JSP是一種用于創建動態網頁的技術,允許將Java代碼嵌入到HTML中。以下是一個簡單的JSP例子,并且包含詳細注釋:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 指定JSP頁面使用Java語言,內容類型為HTML,字符編碼為UTF-8 -->
<!DOCTYPE html>
<html>
<head><title>Hello JSP</title> <!-- 頁面標題 -->
</head>
<body><h1>Hello, <%= request.getParameter("name") %>!</h1> <!-- 輸出請求參數name的值 -->
</body>
</html>
2.3 EJB(Enterprise JavaBeans)
EJB是JavaEE中的一個組件模型,用于構建可伸縮的分布式業務應用程序。以下是一個簡單的EJB例子,并且包含詳細注釋:
import javax.ejb.Stateless; // 導入Stateless注解,用于定義無狀態會話Bean@Stateless // 使用@Stateless注解定義無狀態會話Bean
public class HelloBean {// 定義業務方法sayHello,返回問候語public String sayHello(String name) {return "Hello, " + name + "!";}
}
3. 數據持久化
3.1 JDBC(Java Database Connectivity)
JDBC是一種用于執行SQL語句的Java API。以下是一個簡單的JDBC例子,并且包含詳細注釋:
import java.sql.Connection; // 導入Connection接口,用于管理數據庫連接
import java.sql.DriverManager; // 導入DriverManager類,用于獲取數據庫連接
import java.sql.ResultSet; // 導入ResultSet接口,用于處理結果集
import java.sql.Statement; // 導入Statement接口,用于執行SQL語句public class JDBCExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb"; // 定義數據庫URLString user = "root"; // 定義數據庫用戶名String password = "password"; // 定義數據庫密碼try (Connection conn = DriverManager.getConnection(url, user, password); // 獲取數據庫連接Statement stmt = conn.createStatement(); // 創建Statement對象ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { // 執行SQL查詢語句,并返回結果集while (rs.next()) { // 遍歷結果集System.out.println(rs.getString("username")); // 輸出結果集中的用戶名}} catch (Exception e) { // 捕獲異常e.printStackTrace(); // 打印異常信息}}
}
3.2 JPA(Java Persistence API)
JPA是一種用于管理Java對象和關系數據庫數據之間映射的API。以下是一個簡單的JPA例子,并且包含詳細注釋:
import javax.persistence.Entity; // 導入Entity注解,用于定義實體類
import javax.persistence.Id; // 導入Id注解,用于定義主鍵@Entity // 使用@Entity注解定義實體類
public class User {@Id // 使用@Id注解定義主鍵private Long id; // 定義實體類的ID屬性private String username; // 定義實體類的用戶名屬性// 定義getter和setter方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}import javax.persistence.EntityManager; // 導入EntityManager接口,用于管理實體
import javax.persistence.EntityManagerFactory; // 導入EntityManagerFactory接口,用于創建EntityManager
import javax.persistence.Persistence; // 導入Persistence類,用于獲取EntityManagerFactorypublic class JPAExample {public static void main(String[] args) {// 獲取EntityManagerFactory,指定持久化單元名稱為my-puEntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");// 獲取EntityManagerEntityManager em = emf.createEntityManager();// 開始事務em.getTransaction().begin();// 創建并設置User對象User user = new User();user.setId(1L);user.setUsername("john");// 持久化User對象em.persist(user);// 提交事務em.getTransaction().commit();// 關閉EntityManager和EntityManagerFactoryem.close();emf.close();}
}
4. 高級主題
4.1 Web服務
JavaEE提供了對Web服務的支持,包括SOAP和RESTful服務。以下是一個簡單的RESTful服務例子,并且包含詳細注釋:
import javax.ws.rs.GET; // 導入GET注解,用于定義HTTP GET請求
import javax.ws.rs.Path; // 導入Path注解,用于定義URI路徑
import javax.ws.rs.Produces; // 導入Produces注解,用于定義響應的媒體類型
import javax.ws.rs.core.MediaType; // 導入MediaType類,用于指定媒體類型
import javax.ws.rs.ApplicationPath; // 導入ApplicationPath注解,用于定義應用程序路徑
import javax.ws.rs.core.Application; // 導入Application類,用于配置RESTful應用程序@Path("/hello") // 使用@Path注解定義URI路徑為/hello
public class HelloService {@GET // 使用@GET注解定義HTTP GET請求@Produces(MediaType.TEXT_PLAIN) // 使用@Produces注解定義響應的媒體類型為純文本public String sayHello() {return "Hello, World!"; // 返回問候語}
}@ApplicationPath("/api") // 使用@ApplicationPath注解定義應用程序路徑為/api
public class RestApplication extends Application {
}
4.2 安全性
JavaEE提供了豐富的安全特性,如認證和授權。以下是一個簡單的安全配置例子,并且包含詳細注釋:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!-- 定義安全約束 --><security-constraint><!-- 定義受保護的資源集合 --><web-resource-collection><web-resource-name>Protected Area</web-resource-name><url-pattern>/secure/*</url-pattern> <!-- 定義受保護的URL模式 --></web-resource-collection><!-- 定義訪問受保護資源的角色 --><auth-constraint><role-name>USER</role-name></auth-constraint></security-constraint><!-- 定義登錄配置 --><login-config><auth-method>BASIC</auth-method> <!-- 定義認證方法為BASIC --><realm-name>myRealm</realm-name> <!-- 定義認證域名為myRealm --></login-config><!-- 定義安全角色 --><security-role><role-name>USER</role-name></security-role>
</web-app>
5. 實戰項目
通過實際項目來鞏固學習內容。以下是一個簡單的在線圖書管理系統項目:
- 功能:用戶可以添加、查看、更新和刪除圖書信息。
- 技術棧:Servlet、JSP、JDBC、Tomcat。
5.1 項目結構
BookManagement
├── src
│ └── com
│ └── example
│ ├── Book.java
│ ├── BookDao.java
│ ├── BookServlet.java
│ └── DBUtil.java
├── WebContent
│ ├── index.jsp
│ └── WEB-INF
│ └── web.xml
└── lib└── mysql-connector-java.jar
5.2 代碼實現
Book.java
public class Book {private int id; // 定義圖書的ID屬性private String title; // 定義圖書的標題屬性private String author; // 定義圖書的作者屬性// 定義getter和setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}
}
DBUtil.java
import java.sql.Connection; // 導入Connection接口,用于管理數據庫連接
import java.sql.DriverManager; // 導入DriverManager類,用于獲取數據庫連接public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/bookdb"; // 定義數據庫URLprivate static final String USER = "root"; // 定義數據庫用戶名private static final String PASSWORD = "password"; // 定義數據庫密碼// 獲取數據庫連接public static Connection getConnection() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver"); // 加載數據庫驅動return DriverManager.getConnection(URL, USER, PASSWORD); // 返回數據庫連接}
}
BookDao.java
import java.sql.Connection; // 導入Connection接口,用于管理數據庫連接
import java.sql.PreparedStatement; // 導入PreparedStatement接口,用于執行預編譯的SQL語句
import java.sql.ResultSet; // 導入ResultSet接口,用于處理結果集
import java.util.ArrayList; // 導入ArrayList類,用于創建動態數組
import java.util.List; // 導入List接口,用于定義列表public class BookDao {// 獲取所有圖書public List<Book> getAllBooks() throws Exception {List<Book> books = new ArrayList<>(); // 創建圖書列表try (Connection conn = DBUtil.getConnection(); // 獲取數據庫連接PreparedStatement stmt = conn.prepareStatement("SELECT * FROM books"); // 創建預編譯的SQL語句ResultSet rs = stmt.executeQuery()) { // 執行查詢,并返回結果集while (rs.next()) { // 遍歷結果集Book book = new Book(); // 創建圖書對象book.setId(rs.getInt("id")); // 設置圖書IDbook.setTitle(rs.getString("title")); // 設置圖書標題book.setAuthor(rs.getString("author")); // 設置圖書作者books.add(book); // 將圖書添加到列表中}}return books; // 返回圖書列表}// 添加圖書public void addBook(Book book) throws Exception {try (Connection conn = DBUtil.getConnection(); // 獲取數據庫連接PreparedStatement stmt = conn.prepareStatement("INSERT INTO books (title, author) VALUES (?, ?)")) { // 創建預編譯的SQL語句stmt.setString(1, book.getTitle()); // 設置圖書標題stmt.setString(2, book.getAuthor()); // 設置圖書作者stmt.executeUpdate(); // 執行更新}}// 更新圖書public void updateBook(Book book) throws Exception {try (Connection conn = DBUtil.getConnection(); // 獲取數據庫連接PreparedStatement stmt = conn.prepareStatement("UPDATE books SET title = ?, author = ? WHERE id = ?")) { // 創建預編譯的SQL語句stmt.setString(1, book.getTitle()); // 設置圖書標題stmt.setString(2, book.getAuthor()); // 設置圖書作者stmt.setInt(3, book.getId()); // 設置圖書IDstmt.executeUpdate(); // 執行更新}}// 刪除圖書public void deleteBook(int id) throws Exception {try (Connection conn = DBUtil.getConnection(); // 獲取數據庫連接PreparedStatement stmt = conn.prepareStatement("DELETE FROM books WHERE id = ?")) { // 創建預編譯的SQL語句stmt.setInt(1, id); // 設置圖書IDstmt.executeUpdate(); // 執行刪除}}
}
BookServlet.java
import java.io.IOException; // 導入IOException類,用于處理輸入輸出異常
import javax.servlet.ServletException; // 導入ServletException類,用于處理Servlet特有的異常
import javax.servlet.annotation.WebServlet; // 導入WebServlet注解,用于定義Servlet的URL映射
import javax.servlet.http.HttpServlet; // 導入HttpServlet類,所有Servlet類都繼承自這個類
import javax.servlet.http.HttpServletRequest; // 導入HttpServletRequest類,用于處理請求數據
import javax.servlet.http.HttpServletResponse; // 導入HttpServletResponse類,用于處理響應數據@WebServlet("/books") // 使用@WebServlet注解定義Servlet的URL映射為/books
public class BookServlet extends HttpServlet {private static final long serialVersionUID = 1L; // 定義序列化IDprivate BookDao bookDao = new BookDao(); // 創建BookDao對象// 重寫doGet方法,處理GET請求protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {request.setAttribute("books", bookDao.getAllBooks()); // 獲取所有圖書,并設置為請求屬性request.getRequestDispatcher("/index.jsp").forward(request, response); // 轉發請求到index.jsp} catch (Exception e) { // 捕獲異常throw new ServletException(e); // 拋出Servlet異常}}// 重寫doPost方法,處理POST請求protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {String action = request.getParameter("action"); // 獲取請求參數actionif ("add".equals(action)) { // 如果action為addBook book = new Book(); // 創建Book對象book.setTitle(request.getParameter("title")); // 設置圖書標題book.setAuthor(request.getParameter("author")); // 設置圖書作者bookDao.addBook(book); // 添加圖書} else if ("update".equals(action)) { // 如果action為updateBook book = new Book(); // 創建Book對象book.setId(Integer.parseInt(request.getParameter("id"))); // 設置圖書IDbook.setTitle(request.getParameter("title")); // 設置圖書標題book.setAuthor(request.getParameter("author")); // 設置圖書作者bookDao.updateBook(book); // 更新圖書} else if ("delete".equals(action)) { // 如果action為deletebookDao.deleteBook(Integer.parseInt(request.getParameter("id"))); // 刪除圖書}response.sendRedirect("books"); // 重定向到/books} catch (Exception e) { // 捕獲異常throw new ServletException(e); // 拋出Servlet異常}}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 指定JSP頁面使用Java語言,內容類型為HTML,字符編碼為UTF-8 -->
<!DOCTYPE html>
<html>
<head><title>Book Management</title> <!-- 頁面標題 -->
</head>
<body><h1>Book Management</h1><form action="books" method="post"> <!-- 表單,用于添加圖書 --><input type="hidden" name="action" value="add"/> <!-- 隱藏域,用于指定操作類型為add -->Title: <input type="text" name="title"/><br/> <!-- 文本框,用于輸入圖書標題 -->Author: <input type="text" name="author"/><br/> <!-- 文本框,用于輸入圖書作者 --><input type="submit" value="Add Book"/> <!-- 提交按鈕,用于提交表單 --></form><hr/><table border="1"> <!-- 表格,用于顯示圖書列表 --><tr><th>ID</th><th>Title</th><th>Author</th><th>Actions</th></tr><%-- 使用JSP腳本元素嵌入Java代碼 --%><%List<Book> books = (List<Book>) request.getAttribute("books"); // 獲取請求屬性booksfor (Book book : books) { // 遍歷圖書列表%><tr><td><%= book.getId() %></td> <!-- 顯示圖書ID --><td><%= book.getTitle() %></td> <!-- 顯示圖書標題 --><td><%= book.getAuthor() %></td> <!-- 顯示圖書作者 --><td><form action="books" method="post" style="display:inline;"> <!-- 表單,用于更新圖書 --><input type="hidden" name="action" value="update"/> <!-- 隱藏域,用于指定操作類型為update --><input type="hidden" name="id" value="<%= book.getId() %>"/> <!-- 隱藏域,用于指定圖書ID -->Title: <input type="text" name="title" value="<%= book.getTitle() %>"/><br/> <!-- 文本框,用于輸入圖書標題 -->Author: <input type="text" name="author" value="<%= book.getAuthor() %>"/><br/> <!-- 文本框,用于輸入圖書作者 --><input type="submit" value="Update"/> <!-- 提交按鈕,用于提交表單 --></form><form action="books" method="post" style="display:inline;"> <!-- 表單,用于刪除圖書 --><input type="hidden" name="action" value="delete"/> <!-- 隱藏域,用于指定操作類型為delete --><input type="hidden" name="id" value="<%= book.getId() %>"/> <!-- 隱藏域,用于指定圖書ID --><input type="submit" value="Delete"/> <!-- 提交按鈕,用于提交表單 --></form></td></tr><%}%></table>
</body>
</html>
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!-- 定義Servlet --><servlet><servlet-name>BookServlet</servlet-name> <!-- Servlet名稱 --><servlet-class>com.example.BookServlet</servlet-class> <!-- Servlet類 --></servlet><!-- 定義Servlet映射 --><servlet-mapping><servlet-name>BookServlet</servlet-name> <!-- Servlet名稱 --><url-pattern>/books</url-pattern> <!-- URL模式 --></servlet-mapping>
</web-app>
6. 參考資料
- 《JavaEE基礎教程》
- 《JavaEE高級編程》
- Oracle官方JavaEE文檔
7. 總結
掌握JavaEE的核心技術,并通過實際項目實踐來鞏固所學知識。在學習過程中,要注重理論與實踐相結合,多動手編寫代碼,解決實際問題,逐步提高自己的編程能力。