|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难1.概述DynaFuse相似Appfuse,是一套整合今朝支流J2EE手艺的新构架,利用到的手艺有struts,springframework,hibernate,groovy等,提出了EvertythingbeDynamic的理念,从DAO到WEB层供应了全新的静态建模,静态编程的计划。2.运转例子
下载并安装mysql-4.0,创建数据库dynafuse,创建用户username/password为admin/admin。
下载并解压dynafuse-xx.zip,在mysql中实行data/create-tables.sql中的语句。
下载jakarta-tomcat-5.0.28,将dynafuselibmysql-connector-java-3.0.14-productionmysql-connector-java-3.0.14-production-bin.jar和dynafuselibjta-1.0jta.jar拷贝到jakarta-tomcat-5.0.28commonlib下,将dynafusedynafuse.xml拷贝到jakarta-tomcat-5.0.28confCatalinalocalhost下,
下载dynafuse.war拷贝到jakarta-tomcat-5.0.28webapps下。
启动tomcat,翻开扫瞄器http://localhost:8080/dynafuse进进例子程序。3.包布局申明
下载并解压dynafuse包,会失掉以下的目次布局:
build:编译后文件
config:设置文件
data:实验数据
dist:打包后的公布文件
docs:文档
lib:利用到的jar文件
metadata:xdoclet必要的设置文件片段
script:groovy剧本
src:源码
test:测试源码
web:例子程序的jsp等文件
4.构架申明dynafuse最次要的特性是倡始EverythingbeDynamic,从dao到service到web三个层面,每一个层面都供应了对groovy新型server端srcipt言语的整合,使得web使用中基础一切的逻辑代码都可以以静态的情势编写,保护,构架分为三层:DAO层-这个层面中,dynafuse供应了两个interface:DAO和DynaDAO,DAO是一个通用的数据会见(增、删、改、查)接口,DynaDAO在DAO的基本上供应了对DAO层面剧本的挪用功效。这两个interface今朝只供应了hibernate的完成。DAO和DynaDAO分离作为springframewok中的bean在IOC容器中举行设置,具体请参考configapplicationContext-hibernate.xml。Service层-这个层面中,dynafuse供应了两个interface:Manager和DynaManager,完成对DAO的封装并供应对service层面中营业逻辑剧本的挪用功效,挪用service层面剧本有两个办法,一是在事件情况中实行剧本(invokeScriptInTransaction),一个是不必要事件(invokeScript)。Manager和DynaManager分离作为springframewok中的bean在IOC容器中举行设置,具体请参考configapplicationContext-service.xml。Web层-这个层面中,dynafuse供应了DynaAction,完成对web层面剧本的挪用。
5.构架利用
上面的笔墨将形貌怎样使用dynafuse举行web使用程序的开辟。
1.构建hibernate的静态模子
hibernate在正式公布的3.0版本中,供应了静态模子,关于静态模子,能够查阅hibernate的相干材料,上面给出的是dynafuse示例程序的静态模子,文件拜见dynafusemodelExample.hbm.xml
<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mappingdefault-lazy="false"><classentity-name="Dept"table="t_dept"><idname="id"column="dept_id"type="java.lang.Integer"unsaved-value="null"><generatorclass="native"></generator></id><propertyname="name"type="java.lang.String"update="true"insert="true"column="dept_name"not-null="true"unique="false"/><propertyname="description"type="java.lang.String"update="true"insert="true"column="dept_description"not-null="false"unique="false"/><bagname="persons"lazy="true"inverse="true"cascade="delete"><keycolumn="deptid"></key><one-to-manyclass="Person"/></bag></class><classentity-name="Person"table="t_person"><idname="id"column="person_id"type="java.lang.Integer"unsaved-value="null"><generatorclass="native"></generator></id><propertyname="name"type="java.lang.String"update="true"insert="true"column="person_name"not-null="true"unique="false"/><propertyname="age"type="java.lang.Integer"update="true"insert="true"column="person_age"not-null="true"unique="false"/><propertyname="description"type="java.lang.String"update="true"insert="true"column="person_description"not-null="false"unique="false"/><many-to-onename="dept"class="Dept"cascade="none"update="true"insert="true"column="deptId"/></class>
</hibernate-mapping>
这里没有静态的POJO耐久类,一切的耐久数据都经由过程Map布局来寄存。
2.DAO层面的剧本,假如DAO接口中供应的办法不克不及满意必要,那末能够在DAO层面到场剧本,然后在service层经由过程DynaDAO完成对DAO剧本的挪用,上面是示例程序中的dynafusecriptPersonDAO.groovy
importorg.hibernate.Session;importorg.hibernate.Query;publicclassPersonDAO{
publicSessionsession;publicObjectgetAvgAgeOfDept(IntegerdeptId){Stringhsql="selectavg(t.age)fromPersontwheret.dept.id=:deptId";Queryquery=session.createQuery(hsql);query.setInteger("deptId",deptId.intValue());returnquery.uniqueResult();}}
这里必要申明的是session这个成员变量,它是必需要在DAO层面的剧本中声名的,在dao层面的剧本被实行的时分,dynafuse将会主动对这个session赋值,在剧本中,你不必体贴session是怎样失掉,你尽管宁神利用。
3.service层面的剧本,在实践的使用中,营业逻辑是一成不变的,以是service层面到场剧本撑持长短常有效的,service层的剧本将在web层经由过程DynaManager被挪用,上面是示例程序中的dynafusecriptDeptManager.groovy
importorg.robusta.dynafuse.dao.DynaDAO;importjava.util.List;publicclassDeptManager{
publicDynaDAOdynaDao;publicListgetDepts(){returndynaDao.getObjects("Dept",null,null,null);}publicObjectgetAvgAgeOfDept(IntegerdeptId){returndynaDao.invokeScript("PersonDAO.groovy","getAvgAgeOfDept",newObject[]{deptId});}}
这里必要申明的是dynaDao这个类成员变量,和dao层面剧本中的session一样,是在service层面的剧本中实行的时分,由dynafuse主动赋值,你尽管宁神利用它。
还必要注重的是,在service层面的剧本中能够使用dynaDao往挪用DAO层面的剧本,如下面的getAvgAgeOfDept。
4.构建web层的静态模子,struts供应了DynaValidatorActionForm这类机关静态模子的机制,请参考示例中的dynafusemetadatawebtruts-forms.xml。
5.web层面的剧本,跟营业逻辑一样,页面逻辑也是一成不变的,以是web层的剧本十分有效,上面是示例程序中的dynafusecriptDeptAction.groovy
publicclassDeptActionextendsBaseAction{
....
publicDynaManagerdynaManager;
....
publicActionForwardeditDept(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){if(log.isDebugEnabled()){log.debug("EnteringeditDeptmethod");}StringdeptId=request.getParameter("deptId");if(deptId!=null&&!"".equals(deptId)){Mapdata=dynaManager.getObject("Dept",newInteger(deptId));LongavgAge=(Long)dynaManager.invokeScript("DeptManager.groovy","getAvgAgeOfDept",newObject[]{newInteger(deptId)});DynaValidatorActionFormdeptForm=(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);}returnmapping.findForward("edit");}
....
和servcie和dao层的剧本一样,web层剧本中有一个dynaManager成员变量。
6.将web层的剧本设置到action中,能够参考dynafusemetadatawebtruts-actions.xml
....
<actionpath="/depts"type="org.robusta.dynafuse.web.action.DynaAction"parameter="DeptAction.groovy/listDepts"unknown="false"validate="false"><forwardname="list"path="/WEB-INF/pages/deptList.jsp"redirect="false"/></action>
....
必要注重的是这里的parameter,指定了web层某个剧本中的某个method。
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。 |
|