本範例展示一個基於 JSP、Servlet、JDBC 的簡易管理員資料增刪改查系統,採用 DAO 模式分離資料存取邏輯,包含以下模組:
Admin 實體類AdminDao 資料存取類、DbHelper 資料庫連線工具AddServlet、DeleteServlet、ShowServlet、UpdateServletadd.jsp、index.jsp、update.jsppackage ceet.ac.cn.model;
import java.io.Serializable;
public class Admin implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String userpwd;
// Getter/Setter 略
}
package ceet.ac.cn.dao;
import java.sql.*;
public class DbHelper {
private static String url = "jdbc:mysql://localhost:3306/admin";
private static String userName = "root";
private static String passWord = "359129127";
private static Connection conn = null;
private DbHelper() {}
public static Connection getConnection() {
if (conn == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, userName, passWord);
} catch (Exception e) { e.printStackTrace(); }
}
return conn;
}
}
package ceet.ac.cn.dao;
import java.sql.*;
import java.util.*;
import ceet.ac.cn.model.Admin;
public class AdminDao {
// 查詢所有
public List getAllAdmin() {
List list = new ArrayList<>();
Connection conn = DbHelper.getConnection();
String sql = "SELECT * FROM admin";
try (PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rst = pst.executeQuery()) {
while (rst.next()) {
Admin admin = new Admin();
admin.setId(rst.getInt("id"));
admin.setUsername(rst.getString("username"));
admin.setUserpwd(rst.getString("userpwd"));
list.add(admin);
}
} catch (SQLException e) { e.printStackTrace(); }
return list;
}
// 新增
public boolean addAdmin(Admin admin) {
String sql = "INSERT INTO admin(id, username, userpwd) VALUES (?,?,?)";
try (Connection conn = DbHelper.getConnection();
PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setInt(1, admin.getId());
pst.setString(2, admin.getUsername());
pst.setString(3, admin.getUserpwd());
return pst.executeUpdate() > 0;
} catch (SQLException e) { e.printStackTrace(); }
return false;
}
// 修改
public boolean updateAdmin(Admin admin) {
String sql = "UPDATE admin SET username=?, userpwd=? WHERE id=?";
try (Connection conn = DbHelper.getConnection();
PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setString(1, admin.getUsername());
pst.setString(2, admin.getUserpwd());
pst.setInt(3, admin.getId());
return pst.executeUpdate() > 0;
} catch (SQLException e) { e.printStackTrace(); }
return false;
}
// 刪除
public boolean deleteAdmin(int id) {
String sql = "DELETE FROM admin WHERE id=?";
try (Connection conn = DbHelper.getConnection();
PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setInt(1, id);
return pst.executeUpdate() > 0;
} catch (SQLException e) { e.printStackTrace(); }
return false;
}
// 依 ID 查詢
public Admin selectAdminById(int id) {
String sql = "SELECT * FROM admin WHERE id=" + id;
try (Connection conn = DbHelper.getConnection();
PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rst = pst.executeQuery()) {
if (rst.next()) {
Admin admin = new Admin();
admin.setId(rst.getInt("id"));
admin.setUsername(rst.getString("username"));
admin.setUserpwd(rst.getString("userpwd"));
return admin;
}
} catch (SQLException e) { e.printStackTrace(); }
return null;
}
}
新增:AddServlet 接收表單資料,轉碼處理中文,調用 DAO 新增後轉發至 ShowServlet。
刪除:DeleteServlet 取得 ID 參數,調用 DAO 刪除後轉發至 ShowServlet。
查詢列表:ShowServlet 調用 DAO 取得所有資料,存入 request 屬性,轉發至 index.jsp 顯示。
修改:UpdateServlet 的 doGet 依 ID 查詢資料並轉發至 update.jsp;doPost 接收修改後資料調用 DAO 更新後轉發至 ShowServlet。
index.jsp (列表頁):使用 JSTL <c:forEach> 迭代顯示資料,每行提供「刪除」與「修改」連結,帶上 ID 參數。
add.jsp / update.jsp (表單頁):簡易 HTML 表單,提交至對應 Servlet。
@CHARSET "UTF-8";
table.t1 { margin: 10px 20px 5px; border-collapse: collapse; font: 14px "宋體"; text-align: center; }
table.t1 th { background: #7CB8E2; color: #fff; padding: 6px 4px; }
table.t1 td { background: #C7DDEE; color: #000; padding: 4px 2px; }
table.t1 a { text-decoration: none; color: #3366CC; }
table.t1 a:hover { color: #B50000; text-decoration: underline; }