Java EE 向來被開發者視為「龐然大物」,其技術體系雖全面規整,但過度的複雜性讓許多廠商卻步,寧選 PHP、Ruby on Rails 或 .NET 等輕量級技術。這反映出業界對「快速開發」的迫切需求。Servlet、JavaBean、JDBC 等基礎規範雖奠定了組件與容器標準,但 JSF、JDO 等高階規範未能建立統一框架標準,導致開發者不得不自行整合 Struts、Spring、Hibernate 等開源框架(即經典 SSH 組合),這不僅增加學習成本,也帶來配置地獄與設計風險。
在 JSP Model 2 中,Servlet 擔任控制器,但存在請求轉向隱藏重複提交、重定向參數編碼、轉向地址硬編碼等問題,且無法像 JSP 那樣自動將表單數據綁定到 JavaBean。
Struts 以 Front Controller 模式解耦視圖與控制,提供 ActionForm 處理表單綁定、國際化、標籤庫等功能,但配置繁瑣,且 ActionForm 需手動轉換為領域模型,定位尷尬。
作者提出「雙 JSP 模式」:worker_input.jsp 負責視圖,worker_inputOper.jsp 處理控制邏輯,兩者分工明確,無需 XML 配置。結合 Ajax 異步交互,客戶端負責視圖更新與導航,伺服器端僅需 out.print(JSON) 回應,徹底消除結果頁面配置。預處理改用 Filter 實現,輕量高效。
<jsp:useBean id="worker" class="webappdemo.worker.entity.Worker" scope="page"/>
<jsp:setProperty name="worker" property="*"/>
<%
String method = request.getParameter("method");
if ("save".equals(method)) {
EntityService es = new EntityService();
Message m = es.add(worker);
out.print(new JSONObject().put(m.isSucceed() ? "succeed" : "error", m.getMessage()));
return;
}
%>
此模式利用 JSP 內建 <jsp:useBean> 實現表單數據自動裝配到領域模型,強制統一表單欄位與屬性命名,省去 ActionForm 轉換層。異常處理採用 web.xml 定義錯誤頁面,簡潔實用。
JDBC 需手動管理資源、異常、事務,重複代碼多;Hibernate 雖強大,但需深厚關係模型、SQL 與 O/R 映射功力,否則易成「洪水猛獸」。
定義 IOper 接口封裝 CRUD,實體類實現該接口,內部使用 SQLBuffer 構建 SQL,配合 Proxy 工具類執行:
public interface IOper {
boolean load(Connection conn) throws SQLException;
boolean add(Connection conn) throws SQLException;
boolean update(Connection conn) throws SQLException;
boolean delete(Connection conn) throws SQLException;
}
public class Worker implements IOper {
// 欄位、構造器、getter/setter 略
public boolean add(Connection conn) throws SQLException {
SQLBuffer sql = new SQLBuffer();
sql.segment("insert into worker (worker_name,logon_name,logon_pwd,mobile,email,remark,is_freeze) values (");
sql.value(this.workerName).comma().value(this.logonName).comma().value(this.logonPwd)
.comma().value(this.mobile).comma().value(this.email).comma().value(this.remark).comma().value(this.isFreeze);
sql.segment(")");
return Proxy.update(conn, sql) == 1;
}
// load/update/delete 同理...
}
服務層 EntityService 統一管理事務邊界(獲取連接、關閉自動提交、提交/回滾、關閉連接),業務邏輯只需:
EntityService es = new EntityService();
Message m = es.add(worker);
此法將繁瑣 JDBC 代碼集中於實體與服務兩層,結構清晰,SQL 直觀可控,避免外部映射文件維護成本。對於資料庫遷移需求較少的企業應用,此方案足矣。
隨著 Web 2.0 與 RIA 興起,JSF 價值下降。作者提倡「客戶端 MVC」:HTML(DOM)為 Model,CSS 為 View,JavaScript 為 Controller,三者分離為獨立文件(.jsp、.js、.css),提升可讀性。JSP 僅作視圖模板,允許少量內聯事件綁定(如 onclick="save()"),務實為主。
WebRoot/
module/ # 所有視圖與控制 JSP
common/ # 共用資源
CSS/, img/, JS/, import_page.def
worker/ # 員工模組功能文件
404.jsp, 500.jsp, index.htm
src/
webappdemo/
common/, worker/ # 與 WebRoot 結構對應
datasource.xml, log4j.properties
統一目錄結構便於 Filter 統一攔截與資源管理,import_page.def 集中引入 CSS/JS 庫,避免部署時版本變更麻煩。
無框架不等於無結構。透過編碼約定、Ajax 交互、輕量 ORM 模擬與客戶端 MVC,僅用 Servlet/JSP/JDBC 基礎規範即可構建可維護、低門檻、快速迭代的企業級應用。技術無絕對優劣,關鍵在於適度取捨與團隊執行力。