環境準備清單
| 元件 | 建議版本 | 下載來源 |
| JDK | 17 LTS / 21 LTS | Oracle / Adoptium |
| Eclipse IDE | 2023-12 / 2024-03 | eclipse.org/downloads |
| Apache Tomcat | 10.1.x (Servlet 6.0) / 9.0.x (Servlet 4.0) | tomcat.apache.org |
| Oracle Database | 19c / 21c / XE 21c | oracle.com/database |
| Oracle JDBC 驅動 | ojdbc11.jar (JDK 11+) | Maven Central / Oracle |
Eclipse 安裝 Web 開發工具 (WTP)
Help → Eclipse Marketplace
- 搜尋 Web Tools Platform 或 Eclipse IDE for Enterprise Java Developers 直接安裝此套件版
- 重啟 Eclipse
Tomcat 伺服器整合
Window → Preferences → Server → Runtime Environments → Add
- 選擇對應版本
Apache Tomcat v10.1 (或 v9.0)
- Browse 選擇 Tomcat 解壓目錄 (如
D:\apache-tomcat-10.1.20)
- Finish
建立 Dynamic Web Project
File → New → Dynamic Web Project
- Project name:
ServletOracleDemo
- Target runtime: 選擇剛新增的 Tomcat
- Dynamic web module version:
6.0 (Tomcat 10) / 4.0 (Tomcat 9)
- Configuration:
Default → Finish
建立 Servlet
- 右鍵
src → New → Servlet
- Package:
com.example.servlet
- Class name:
EmployeeServlet
- URL mapping:
/employees (自動生成 @WebServlet("/employees"))
- Finish
導入 Oracle JDBC 驅動
方式一:Maven 專案 (推薦)
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>23.4.0.0</version>
</dependency>
方式二:手動加入 Build Path
- 專案右鍵 →
Build Path → Configure Build Path
Libraries → Classpath → Add External JARs
- 選擇
ojdbc11.jar → Apply and Close
Oracle 連線與查詢 Servlet 完整代碼
@WebServlet("/employees")
public class EmployeeServlet extends HttpServlet {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
private static final String USER = "SCOTT";
private static final String PASS = "tiger";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = resp.getWriter();
Connection conn = DriverManager.getConnection(URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ename, job, sal FROM emp")) {
out.println("員工列表");
out.println("");
out.println("員工資料 (SCOTT.EMP)
");
out.println("| 姓名 | 職稱 | 薪資 |
");
while (rs.next()) {
out.printf("| %s | %s | %,d |
%n",
rs.getString("ename"),
rs.getString("job"),
rs.getInt("sal"));
}
out.println("
");
} catch (SQLException e) {
throw new ServletException("資料庫查詢失敗", e);
}
}
}
執行與驗證
- 專案右鍵 →
Run As → Run on Server
- 選擇 Tomcat →
Finish
- 瀏覽器開啟
https://localhost:8080/ServletOracleDemo/employees
- 應顯示 EMP 表格資料
常見問題排查
| 現象 | 原因 | 解決 |
| ClassNotFoundException: oracle.jdbc.driver.OracleDriver | 驅動未加入類路徑 | 檢查 Maven 依賴 / Build Path |
| ORA-12505: TNS:listener does not currently know of SID | SID/Service Name 錯誤 | 確認 lsnrctl status,常用 ORCL 或 XEPDB1 |
| ORA-28040: No matching authentication protocol | JDK 11+ 預設不支援舊加密 | 驅動升級 ojdbc11,或 oracle.net.authentication_services=(NONE) |
| Port 8080 occupied | 衝突 | 修改 server.xml <Connector port="8081"/> |
進階建議
- 連線池:生產環境必須使用 HikariCP/Druid,配置 JNDI DataSource
- DAO 模式:分離資料存取邏輯,Servlet 僅處理 HTTP 協議
- 參數化查詢:使用
PreparedStatement 防 SQL 注入
- 異常處理:統一錯誤頁面,記錄日誌不暴露堆疊給用戶
- 建構工具:新專案優先選 Maven/Gradle,依賴管理與 CI/CD 友善