傳統JSP/Servlet遙感信息發布系統存在頁面邏輯、業務邏輯、數據邏輯雜糅、耦合度高、擴展維護困難等問題。引入MVC設計模式,採用Struts 2(表現層)+ Hibernate(持久層)雙框架整合,結合DAO模式與抽象工廠模式,構建低耦合、高內聚、可擴展的遙感數據分發平台。
系統四層架構:表示層 → 業務邏輯層 → 數據持久層 → 數據庫
| 層次 | 技術棧 | 核心職責 | 關鍵設計模式 |
|---|---|---|---|
| 表示層 | Struts 2、JSP、JSTL、ActionForm | 請求接收、數據校驗、視圖渲染、流程跳轉 | MVC(Struts 2實現)、Front Controller |
| 業務邏輯層 | Manager接口/實現、業務代理 | 事務邊界、業務規則編排、權限控制、異常轉換 | Business Delegate、Abstract Factory、DAO門面 |
| 持久層 | Hibernate、DAO接口/實現、VO/PO | CRUD、查詢構建、緩存策略、數據庫無關性 | DAO、Abstract Factory、ORM |
| 數據庫 | PostgreSQL(可切換) | 數據存儲、完整性約束 | — |
// VO:純屬性+getter/setter,實現Serializable
public class OrAdmin implements Serializable {
private String adminname;
private String adminpasswd;
// getter/setter省略
}
// DAO接口
public interface AdminDAO {
OrAdmin getAdmin(String adminName);
}
// DAO實現:Hibernate模板操作
public class AdminDAOImpl implements AdminDAO {
public OrAdmin getAdmin(String adminName) {
Session s = HibernateUtil.currentSession();
Query query = s.createQuery(
"from OrAdmin oa where oa.adminname = :name"
);
query.setParameter("name", adminName);
return (OrAdmin) query.uniqueResult();
}
}
// 抽象工廠:統一DAO獲取入口
public abstract class DAOFactory {
public static DAOFactory getInstance() { ... }
public abstract AdminDAO createAdminDAO();
}
優勢:上層僅依賴接口,實現類可熱插拔;Hibernate配置文件隔離SQL方言,切換數據庫只需修改hibernate.cfg.xml無需動代碼。
// 業務接口
public interface AdminManager {
OrAdmin getAdmin(String username);
}
// 業務實現:組合DAO,不含持久化細節
public class AdminManagerImpl implements AdminManager {
private AdminDAO dao = DAOFactory.getInstance().createAdminDAO();
public OrAdmin getAdmin(String username) {
return dao.getAdmin(username); // 可在此添加事務、日誌、權限檢查
}
}
// 管理器工廠:統一業務組件獲取
public class ManagerFactory {
public static AdminManager createAdminManager() {
return new AdminManagerImpl();
}
}
// ActionForm:封裝表單數據,Struts自動填充
public class AdminActionForm extends ActionForm {
private String adminname;
private String adminpasswd;
// getter/setter省略
}
// Action:接收請求,調用業務層,決定跳轉
public class AdminAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AdminActionForm f = (AdminActionForm) form;
String name = f.getAdminname();
String pwd = f.getAdminpasswd();
AdminManager mgr = ManagerFactory.createAdminManager();
OrAdmin admin = mgr.getAdmin(name);
if (admin == null || !admin.getAdminpasswd().equals(pwd)) {
request.getSession().setAttribute("loginfail", "用戶名或密碼錯誤");
return mapping.findForward("logout"); // 返回登錄頁
}
request.getSession().setAttribute("adminname", name);
return mapping.findForward("success"); // 進入主頁
}
}
<!-- struts-config.xml 關鍵配置 -->
<form-beans>
<form-bean name="adminActionForm" type="com.rice.web.struts.form.AdminActionForm"/>
</form-beans>
<action-mappings>
<action name="adminActionForm" path="/adminAction" scope="session"
type="com.rice.web.struts.action.AdminAction" validate="false">
<forward name="success" path="/manager/main.jsp"/>
<forward name="logout" path="/manager/index.jsp"/>
</action>
</action-mappings>
JSTL標簽庫簡化JSP邏輯,ActionForm自動綁定請求參數,Struts配置聲明式控制流程跳轉,實現表示層零業務代碼。
Hibernate核心接口:SessionFactory(線程安全、二級緩存)、Session(持久化管理器)、Transaction(統一事務API)、Query/Criteria(多語言查詢)
<session-factory>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://127.0.0.1:5432/DBInfo</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<mapping resource="OrAdmin.hbm.xml"/>
<!-- 可在此配置二級緩存、連接池等 -->
</session-factory>
Struts 2請求處理流程:FilterDispatcher → ActionMapping → ActionInvocation(攔截器鏈) → Action執行 → Result視圖渲染
*.action請求。| 維度 | 傳統JSP/Servlet | Struts 2 + Hibernate架構 |
|---|---|---|
| 耦合度 | 高(SQL寫在JSP/Java代碼中) | 低(四層分離,接口編程) |
| 可維護性 | 修改一處牽一髮動全身 | 分層變更影響可控,DAO/Manager可獨立單測 |
| 可擴展性 | 新增功能需改動多層代碼 | 新增模塊遵循分層規範,擴展點清晰 |
| 數據庫遷移 | SQL硬編碼,遷移極難 | Hibernate方言切換+映射文件,零代碼遷移 |
| 事務管理 | 手工JDBC事務,易漏提交/回滾 | 聲明式事務(Spring AOP)或Hibernate Transaction API統一管理 |
| 團隊協作 | 前後端纏繞,難以並行 | 界面/業務/數據並行開發,接口契約為準 |
read-only緩存。ScrollableResults或setFirstResult/MaxResults封裝通用分頁組件。c:out默認轉義)。本文通過遙感信息發布系統實戰案例,展示了Struts 2與Hibernate整合的分層架構設計、核心代碼實現、配置要點及架構優勢。關鍵在於:MVC分層思想落地、DAO/Manager接口編程、工廠模式解耦創建、Hibernate ORM消除JDBC樣板代碼、Struts 2聲明式流程控制。此架構雖為經典模式,但其分層解耦、接口契約、配置驅動的核心思想,對現代Spring Boot、微服務架構設計仍具極高指導價值。