此範例將常用 Web 開發工具方法集中在一個 JavaBean 中:JDBC 基礎操作、分頁邏輯、日期格式化、中文編碼轉換、HTML 特殊字元編碼、UBB 標籤解析。雖功能豐富,但違反單一職責原則,現代架構建議拆分為 DAO、Service、Util 類別。
public class JdbcSql {
private String url = "jdbc:mysql://localhost/HeaVeN_news";
private String user = "root", pwd = "";
private Connection conn; private Statement stmt; private ResultSet rs;
public JdbcSql() { /* 載入驅動、建立連線 */ }
public ResultSet query(String sql) { /* 執行查詢 */ }
public void update(String sql) { /* 執行更新 */ }
public void closeStmt() { /* 關閉 Statement */ }
public void closeConn() { /* 關閉 Connection */ }
}
// GB2312 -> ISO8859-1 (舊式 JSP 頁面常用)
public String toChinese(String s) {
if (s == null) return null;
try { return new String(s.getBytes("GB2312"), "ISO8859-1"); }
catch (Exception e) { return null; }
}
// 參數: 總筆數、每頁筆數、頁面顯示頁碼數、起始位移、當前頁、搜尋參數、目標檔名
public String page1(int total, int pageSize, int pageLinkCount, int start, int page, String search, String filename) {
// 計算總頁數、分頁連結 HTML (首頁、上一頁、頁碼、下一頁、尾頁)
// 回傳組裝好的 字串
}
public String getPath() { // yyyy-MM (目錄用)
return new SimpleDateFormat("yyyy-MM").format(new Date());
}
public String strNowtime() { // yyyy-MM-dd HH:mm:ss
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
public String htmlEncode(String s) {
return ebbReplace(ebbReplace(ebbReplace(s, "<", "<"), ">", ">"), "\n", "
");
}
public String ebbReplace(String str, String oldStr, String newStr) {
// 手寫循環替換所有出現 (JDK 1.4 無 String.replaceAll)
}
// [tag]content[/tag] -> 替換為 HTML 模板 (含 $lichao$ 佔位符)
public String LCReplace(String str, String beginTag, String endTag, String replaceTpl) {
// 找配對標籤、提取內容、套用模板替換
}
| 問題 | 風險 | 改進方向 |
|---|---|---|
| Connection/Statement/ResultSet 為實例欄位 | 非執行緒安全,併發請求資料錯亂 | 改為方法區域變數 + try-with-resources |
| SQL 字串拼接 | SQL 注入高風險 | 全面改用 PreparedStatement 參數綁定 |
| 吞沒 SQLException (僅列印) | 業務邏輯無法感知失敗 | 拋出自訂異常或回傳 Result 物件 |
| 硬編碼 DB 連線參數 | 部署環境切換困難、洩露憑證 | 外部化配置 (DataSource JNDI、@Value、Spring Boot application.yml) |
| 單一類別承擔過多職責 | 難以測試、維護、擴展 | 拆分:DAO (CRUD)、Pager (分頁)、Codec (編碼/過濾)、DateUtil |
| 手寫字串替換/UBB 解析 | 效能低、邊界情況易出錯 | 使用 Commons Lang StringUtils、JSoup (HTML)、靈活標籤引擎 |
// 1. DataSource 配置 (Spring Boot)
@ConfigurationProperties("spring.datasource") DataSource dataSource();
// 2. DAO 介面 + MyBatis/JdbcTemplate 實現
@Repository interface NewsDao { List selectPage(RowBounds bounds); }
// 3. Service 層處理事務、分頁邏輯
@Service class NewsService {
public PageResult list(int page, int size) { ... }
}
// 4. Controller 回傳 JSON,前端 Vue/React 渲染分頁
// 5. 工具類:HtmlUtils (OWASP Java HTML Sanitizer), DateUtils (java.time), UbbParser (獨立庫)