本文詳細講解如何使用 JavaBean 封裝資料庫操作與業務邏輯,結合 JSP/Servlet 實現完整的用戶認證系統,包含登入驗證、用戶註冊、Session 管理與登出功能。
public 且具備 無參數建構子getter/setter 方法暴露Serializable 介面以支援序列化P_USER (id, username, password, email)DBAcess.java 封裝 JDBC 連線、查詢、更新、關閉資源UserBean.java 實現登入驗證、重複檢查、新增用戶GenerateUUID.java 生成唯一主鍵 IDCREATE TABLE P_USER (
id VARCHAR2(50) NOT NULL,
username VARCHAR2(20),
password VARCHAR2(20),
email VARCHAR2(50)
) TABLESPACE USERS;
COMMENT ON TABLE P_USER IS '用戶表';
COMMENT ON COLUMN P_USER.id IS 'ID';
COMMENT ON COLUMN P_USER.username IS '用戶名';
COMMENT ON COLUMN P_USER.password IS '密碼';
COMMENT ON COLUMN P_USER.email IS 'Email';
package com.baosight.bean;
import java.sql.*;
public class DBAcess {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private String username = "scott";
private String password = "tiger";
private Connection conn;
private Statement stmt;
private ResultSet rs;
// 建立連線
public boolean createConn() {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 更新操作 (INSERT/UPDATE/DELETE)
public boolean update(String sql) {
try {
stmt = conn.createStatement();
stmt.execute(sql);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 查詢操作
public void query(String sql) {
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
// 判斷是否有下一筆資料
public boolean next() {
try {
return rs != null && rs.next();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 取得欄位值
public String getValue(String field) {
try {
return rs != null ? rs.getString(field) : null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
// 關閉資源方法群
public void closeConn() { /* 關閉 Connection */ }
public void closeStmt() { /* 關閉 Statement */ }
public void closeRs() { /* 關閉 ResultSet */ }
// Getter/Setter 略...
}
package com.baosight.bean;
public class UserBean {
// 登入驗證
public boolean valid(String username, String password) {
DBAcess db = new DBAcess();
if (db.createConn()) {
String sql = "SELECT * FROM p_user WHERE username='" + username + "' AND password='" + password + "'";
db.query(sql);
boolean isValid = db.next();
db.closeRs(); db.closeStmt(); db.closeConn();
return isValid;
}
return false;
}
// 檢查用戶是否存在
public boolean isExist(String username) {
DBAcess db = new DBAcess();
if (db.createConn()) {
String sql = "SELECT * FROM p_user WHERE username='" + username + "'";
db.query(sql);
boolean exists = db.next();
db.closeRs(); db.closeStmt(); db.closeConn();
return exists;
}
return false;
}
// 註冊新用戶
public boolean add(String username, String password, String email) {
DBAcess db = new DBAcess();
if (db.createConn()) {
String sql = "INSERT INTO p_user(id, username, password, email) VALUES('"
+ GenerateUUID.next() + "','" + username + "','" + password + "','" + email + "')";
boolean success = db.update(sql);
db.closeStmt(); db.closeConn();
return success;
}
return false;
}
}
package com.baosight.util;
import java.util.Date;
public class GenerateUUID {
private static Date date = new Date();
private static int seq = 0;
private static final int ROTATION = 99999;
public static synchronized long next() {
if (seq > ROTATION) seq = 0;
date.setTime(System.currentTimeMillis());
String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
return Long.parseLong(str);
}
}
<form action="login_action.jsp" method="post">
<table>
<tr><td colspan="2">登入視窗</td></tr>
<tr><td>用戶名:</td><td><input type="text" name="username" /></td></tr>
<tr><td>密碼:</td><td><input type="password" name="password" /></td></tr>
<tr><td colspan="2">
<input type="submit" value="登入" />
<a href="register.jsp">註冊</a>
</td></tr>
</table>
</form>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username == null || username.trim().isEmpty() ||
password == null || password.trim().isEmpty()) {
response.sendRedirect("login.jsp");
return;
}
UserBean userBean = new UserBean();
if (userBean.valid(username, password)) {
session.setAttribute("username", username);
response.sendRedirect("welcome.jsp");
} else {
response.sendRedirect("login.jsp");
}
%>
<body>
<td>歡迎你,</td><td>${username}</td>
<form action="loginout.jsp" method="post">
<input type="submit" value="登出" />
</form>
</body>
<%
session.removeAttribute("username");
response.sendRedirect("login.jsp");
%>
<form action="register_action.jsp" method="post">
<input type="text" name="username" placeholder="用戶名" />
<input type="password" name="password1" placeholder="密碼" />
<input type="password" name="password2" placeholder="確認密碼" />
<input type="text" name="email" placeholder="Email" />
<input type="submit" value="註冊" />
</form>
<%
String username = request.getParameter("username");
String password1 = request.getParameter("password1");
String password2 = request.getParameter("password2");
String email = request.getParameter("email");
// 驗證輸入
if (username == null || password1 == null || password2 == null ||
!password1.equals(password2)) {
response.sendRedirect("register.jsp");
return;
}
UserBean userBean = new UserBean();
if (!userBean.isExist(username)) {
userBean.add(username, password1, email);
response.sendRedirect("login.jsp");
} else {
response.sendRedirect("register.jsp");
}
%>
PreparedStatement 替代字串拼接本實例展示了 JavaBean 在 MVC 架構中封裝業務邏輯與資料存取的經典用法。雖然現代開發多採用 Spring、MyBatis 等框架,但理解 JavaBean 原理對掌握 Java Web 基礎至關重要。實際專案建議引入成熟框架提升開發效率與安全性。