dynafuse 1.0 在sourceforge上发布!

1. 概述
   DynaFuse类似Appfuse,是一套整合目前主流J2EE技术的新构架,使用到的技术有strutsspringframeworkhibernategroovy等,提出了Evertything be Dynamic的理念,从DAOWEB层提供了全新的动态建模,动态编程的方案。
2. 运行例子
  • 下载并安装mysql-4.0,建立数据库dynafuse,建立用户username/passwordadmin/admin

  • 下载并解压dynafuse-xx.zip,在mysql中执行data/create-tables.sql中的语句。

  • 下载jakarta-tomcat-5.0.28,将dynafuse/lib/mysql-connector-java-3.0.14-production/mysql-connector-java-3.0.14-production-bin.jardynafuse/lib/jta-1.0/jta.jar拷贝到jakarta-tomcat-5.0.28/common/lib下,将dynafuse/dynafuse.xml拷贝到jakarta-tomcat-5.0.28/conf/Catalina/localhost下,

  • 下载dynafuse.war拷贝到jakarta-tomcat-5.0.28/webapps下。

  • 启动tomcat,打开浏览器http://localhost:8080/dynafuse进入例子程序。
3. 包结构说明

下载并解压dynafuse包,会得到如下的目录结构:

build:编译后文件

config:配置文件

data:试验数据

dist:打包后的发布文件

docs:文档

lib:使用到的jar文件

metadata:xdoclet需要的配置文件片断

script:groovy脚本

src:源码

test:测试源码

web:例子程序的jsp等文件

4. 构架说明
dynafuse最主要的特征是提倡Everything be Dynamic,从daoserviceweb三个层面,每个层面都提供了对groovy新型serversrcipt语言的整合,使得web应用中基本所有的逻辑代码都能够以动态的形式编写,维护,构架分为三层:
  •   DAO- 这个层面中,dynafuse提供了两个interface:DAO DynaDAO DAO是一个通用的数据访问(增、删、改、查)接口,DynaDAODAO的基础上提供了对DAO层面脚本的调用功能。这两个interface目前只提供了hibernate的实现。 DAODynaDAO分别作为springframewok中的beanIOC容器中进行配置,详细请参考config/applicationContext-hibernate.xml
  •   Service- 这个层面中,dynafuse提供了两个interface:Manager DynaManager,完成对DAO的封装并提供对service层面中业务逻辑脚本的调用功能,调用service层面脚本有两个方法,一是在事务环境中执行脚本(invokeScriptInTransaction),一个是不需要事务(invokeScript)。ManagerDynaManager分别作为springframewok中的beanIOC容器中进行配置,详细请参考config/applicationContext-service.xml
  •   Web- 这个层面中,dynafuse提供了DynaAction,完成对web层面脚本的调用。

5. 构架使用

下面的文字将描述如何利用dynafuse进行web应用程序的开发。

1.构建hibernate的动态模型

   hibernate在正式发布的3.0版本中,提供了动态模型,关于动态模型,可以查阅hibernate的相关资料,下面给出的是dynafuse示例程序的动态模型,文件参见dynafuse/model/Example.hbm.xml

<?xml version="1.0"?>
        <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
       <hibernate-mapping default-lazy="false">

       <class entity-name="Dept" table="t_dept">

           <id
                name="id"
                column="dept_id"
                type="java.lang.Integer"
                unsaved-value="null"
            >
                <generator class="native">
                </generator>
           </id>

           <property
                name="name"
                type="java.lang.String"
                update="true"
                insert="true"
                column="dept_name"
                not-null="true"
                unique="false"
             />

             <property
                name="description"
                type="java.lang.String"
                update="true"
                insert="true"
                column="dept_description"
                not-null="false"
                unique="false"
              />

              <bag
                 name="persons"
                 lazy="true"
                 inverse="true"
                 cascade="delete"
               >
                 <key
                      column="deptid"
                  >
                  </key>
                  <one-to-many
                      class="Person"
                  />
              </bag>

        </class>

        <class entity-name="Person" table="t_person">

                 <id
                     name="id"
                     column="person_id"
                     type="java.lang.Integer"
                     unsaved-value="null"
                 >
                   <generator class="native">
                   </generator>
                </id>

                <property
                     name="name"
                     type="java.lang.String"
                     update="true"
                     insert="true"
                     column="person_name"
                     not-null="true"
                     unique="false"
                 />

                 <property
                      name="age"
                      type="java.lang.Integer"
                      update="true"
                      insert="true"
                      column="person_age"
                      not-null="true"
                      unique="false"
                  />

                  <property
                       name="description"
                       type="java.lang.String"
                       update="true"
                       insert="true"
                       column="person_description"
                       not-null="false"
                       unique="false"
                    />

                    <many-to-one
                          name="dept"
                          class="Dept"
                          cascade="none"
                          update="true"
                          insert="true"
                          column="deptId"
                     />

        </class>


       </hibernate-mapping>

这里没有静态的POJO持久类,所有的持久数据都通过Map结构来存放。

2.DAO层面的脚本,如果DAO接口中提供的方法不能满足需要,那么可以在DAO层面加入脚本,然后在service层通过DynaDAO完成对DAO脚本的调用,下面是示例程序中的dynafuse/script/PersonDAO.groovy

import org.hibernate.Session;
       import org.hibernate.Query;

       public class PersonDAO {


            
public Session session;

             public Object getAvgAgeOfDept(Integer deptId) {
                 String hsql = "select avg(t.age) from Person t where t.dept.id=:deptId";
                 Query query = session.createQuery(hsql);
                 query.setInteger("deptId", deptId.intValue());
                 return query.uniqueResult();
              }
         }

这里需要说明的是session这个成员变量,它是必须要在DAO层面的脚本中申明的,在dao层面的脚本被执行的时候,dynafuse将会自动对这个session赋值,在脚本中,你不用关心session是怎么得到,你只管放心使用。

3.service层面的脚本,在实际的应用中,业务逻辑是千变万化的,所以service层面加入脚本支持是非常有用的,service层的脚本将在web层通过DynaManager被调用,下面是示例程序中的dynafuse/script/DeptManager.groovy

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});
             }
        }

这里需要说明的是dynaDao这个类成员变量,和dao层面脚本中的session一样,是在service层面的脚本中执行的时候,由dynafuse自动赋值,你只管放心使用它。

还需要注意的是,在service层面的脚本中可以利用dynaDao去调用DAO层面的脚本,如上面的getAvgAgeOfDept

4.构建web层的动态模型,struts提供了DynaValidatorActionForm这种构造动态模型的机制,请参考示例中的dynafuse/metadata/web/struts-forms.xml

5.web层面的脚本,跟业务逻辑一样,页面逻辑也是千变万化的,所以web层的脚本非常有用,下面是示例程序中的dynafuse/script/DeptAction.groovy

public class DeptAction extends BaseAction {

     ....

     public DynaManager dynaManager;

     ....

     public ActionForward editDept(ActionMapping mapping, ActionForm form,
                                                         HttpServletRequest request, HttpServletResponse response) {
                 if (log.isDebugEnabled()) {
                    log.debug("Entering 'editDept' method");
                 }
                 String deptId = request.getParameter("deptId");
                 if (deptId != null && !"".equals(deptId)) {
                     Map data = dynaManager.getObject("Dept", new Integer(deptId));
                     Long avgAge = (Long) dynaManager.invokeScript("DeptManager.groovy", "getAvgAgeOfDept", new Object[]{new Integer(deptId)});
                     DynaValidatorActionForm deptForm = (DynaValidatorActionForm) form;
                     deptForm.set("id", data.get("id"));
                     deptForm.set("name", data.get("name"));
                     deptForm.set("description", data.get("description"));
                     deptForm.set("avgAge", avgAge);
                     updateFormBean(mapping, request, deptForm);
                  }
                  return mapping.findForward("edit");
             }

      ....

servciedao层的脚本一样,web层脚本中有一个dynaManager成员变量。

6.web层的脚本配置到action中,可以参考dynafuse/metadata/web/struts-actions.xml

....

  <action
              path="/depts"
              type="org.robusta.dynafuse.web.action.DynaAction"
             
parameter="DeptAction.groovy/listDepts"
              unknown="false"
              validate="false"
          >
              <forward
                   name="list"
                   path="/WEB-INF/pages/deptList.jsp"
                   redirect="false"
               />
          </action>

   ....

需要注意的是这里的parameter,指定了web层某个脚本中的某个method

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值