DynaFuse 類似 AppFuse,整合 Struts、Spring、Hibernate、Groovy,提出「Everything be Dynamic」理念,從 DAO 到 Web 層提供動態建模與腳本化開發方案。
| 層次 | 核心介面 | 動態特性 |
|---|---|---|
| DAO | DAO、DynaDAO | 通用 CRUD + Groovy 腳本調用 (Hibernate 實作) |
| Service | Manager、DynaManager | 封裝 DAO、支援事務/非事務腳本執行 |
| Web | DynaAction | Struts Action 整合 Groovy 腳本 |
<hibernate-mapping default-lazy="false">
<class table="t_dept" entity-name="Dept">
<id name="id" column="dept_id"><generator class="native"/></id>
<property name="name" column="dept_name" not-null="true"/>
<bag name="persons" cascade="delete" inverse="true">
<key column="deptid"/>
<one-to-many class="Person"/>
</bag>
</class>
<class table="t_person" entity-name="Person">
<id name="id" column="person_id"><generator class="native"/></id>
<property name="name" column="person_name" not-null="true"/>
<many-to-one name="dept" class="Dept" column="deptId"/>
</class>
</hibernate-mapping>
資料以 Map 結構存放,無靜態實體類別。
import org.hibernate.Session;
import org.hibernate.Query;
public class PersonDAO {
public Session session; // 框架自動注入
public Object getAvgAgeOfDept(Integer deptId) {
String hql = "select avg(t.age) from Person t where t.dept.id=:deptId";
Query q = session.createQuery(hql);
q.setInteger("deptId", deptId);
return q.uniqueResult();
}
}
import org.robusta.dynafuse.dao.DynaDAO;
import java.util.List;
public class DeptManager {
public DynaDAO dynaDao; // 框架自動注入
public List getDepts() { return dynaDao.getObjects("Dept", null, null, null); }
public Object getAvgAgeOfDept(Integer deptId) {
return dynaDao.invokeScript("PersonDAO.groovy", "getAvgAgeOfDept", new Object[]{deptId});
}
}
public class DeptAction extends BaseAction {
public DynaManager dynaManager;
public ActionForward editDept(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String deptId = request.getParameter("deptId");
if (deptId != null) {
Map data = dynaManager.getObject("Dept", new Integer(deptId));
Long avgAge = (Long) dynaManager.invokeScript("DeptManager.groovy",
"getAvgAgeOfDept", new Object[]{new Integer(deptId)});
DynaValidatorActionForm f = (DynaValidatorActionForm) form;
f.set("id", data.get("id"));
f.set("avgAge", avgAge);
updateFormBean(mapping, request, f);
}
return mapping.findForward("edit");
}
}
dynafuse 資料庫,執行 create-tables.sql。common/lib 放入 MySQL 驅動與 jta.jar。dynafuse.war 並啟動,訪問 https://localhost:8080/dynafuse。build/ 編譯輸出 config/ Spring 配置 data/ 測試資料 dist/ 發布包 docs/ 文件 lib/ 依賴 JAR metadata/ XDoclet 片段 script/ Groovy 腳本 src/ Java 原始碼 test/ 測試碼 web/ JSP 頁面