张昊

J-Hi(http://www.j-hi.net)

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  45 Posts :: 1 Stories :: 110 Comments :: 0 Trackbacks

2011年5月2日 #

http://developer.51cto.com/developer/51cto-salon-13/





视频点播
《Java快速开发的分析与探索》[上](张昊)
《Java快速开发的分析与探索》[下](张昊)
《Java快速开发平台使用》(肖金华)
用户交流与问答环节

推荐阅读


51CTO电子杂志《开发月刊》

51CTO开发频道推出《开发月刊》电子杂志。主要内容涵盖Java、.NET、WEB开发、数据库和移动开发等等。从技术细节到项目管理,方方面面为开发者服务。



往期回顾
 
51CTO技术沙龙之IDC挑选运维经验谈
51CTO技术沙龙之掌握网络流量分析与系统监控
51CTO技术沙龙之企业服务器安全攻与防
51CTO技术沙龙之Linux系统安全
51CTO技术沙龙之解析中小企业网络运维
51CTO技术沙龙之Web开发前沿技术探索与实战
51CTO技术沙龙之大型网站PHP开发之道
51CTO技术沙龙之 IT技术人,茫茫职业人生路
51CTO技术沙龙之 如何快速定位黑客攻击
51CTO技术沙龙之 关于企业安全运维的那些事儿
51CTO技术沙龙之 站在业务扩展的角度看Linux运维技术
51CTO技术沙龙之 从菜鸟到CTO,你的目标需要管理
51CTO技术沙龙之 两小时成为反挂马达人
51CTO技术沙龙之 全方位解析虚拟化
51CTO技术沙龙之 企业基础网络与核心服务搭建
51CTO技术沙龙之 负载均衡2期

沙龙导读与PPT下载

51CTO技术沙龙第十三期总结:Java快速开发之路
在2011年9月3日下午51CTO举办的第13期51CTO技术沙龙中,有幸请到Java开源平台——J-Hi的两位创始人张昊老师和肖金华老师。二位讲师分别从理论和实战来为大家介绍J-Hi,打开Java快速开发之路。查看
PPT下载:《Java快速开发的分析与探索》(张昊)
详细分析快速开发与传统开发方式在开发形式上的差异,两个模式所存在的风险及如何规避这些风险,并对开发效率、成本及开发规范做出对比。最后阐述为什么快速开发将是以后软件开发的趋势。 PPT下载 | 视频下载
《Java快速开发平台使用》(肖金华)
主要介绍怎样架构你的互联网应用才能显得不是那么草根,基于弱关系理论的结构化数据存储与程序设计高性能的数据缓冲层让你的数据离CPU再近一些。如何定位应用的性能瓶颈以及系能优化的思路。 视频下载
 

本期讲师介绍

 
 
J-Hi快速开发平台团队核心成员 张昊
软迅博技术发展有限公司首席架构师,开源J-Hi快速开发平台团队核心成员,平台项目的主要发起者与组织者。
软迅博技术发展有限公司项目总监 肖金华
开源J-Hi快速开发平台团队核心成员,十一年软件开发经验,带领完成过多个大型项目。熟悉保险及电力行业,曾任某IT公司保险业务线架构师。
 
 

相关Java专题


51CTO开发频道专访J-Hi快速开发平台团队核心成员张昊先生,向大家讲述J-Hi快速开发平台从创意到研发再到产品的完整脉络和技术领域以及对广大爱好者的一些建议。


 

2011年7月7日,甲骨文举行了生活的全球性活动,以庆祝即将到来的Java 7推出。标准版Java SE 7是对Java社区和甲骨文对开发语言和技术持续承诺的一种肯定。

  

沙龙现场照片


 
 
 
 
 
 
 
 
 
 
 



posted @ 2011-09-16 23:48 张昊 阅读(1178) | 评论 (2)编辑 收藏

http://weibo.com/javahi
posted @ 2011-09-09 16:26 张昊 阅读(865) | 评论 (1)编辑 收藏


描述:在DWZ版中lookup的处理机制与经典的完全不同,对于lookup有两种展现形式,一种是通过点击lookup图标弹出对话框后带回选中的值,另一种是通过在文本框中输入相应信息从而实现联机式的查找带回效果。从实现目的来看,无非是让lookup的实体的主键值带回到hidden的一个元素中,而其它值只是作为显示参考之用,与底层的数据库结构与数据库表无关。一个完整的lookup由如下html元素构成:1)一个hidden用于保存带回实体主键的ID值;如果要实现缺省的lookup过滤或排序可以相应的pageInfohidden元素,具体实现方式的用例参见《HowTo手册》;2ntext用于显示带回的多个数据带回项(注意:因为带回的数据项与数据访问层也就是数据库表无关,因此每个textname都有一个hi_作为前缀);3)一个lookup有且只有一个主带回项,只有主带回项的文本框是可编辑的并且只有主带回项会有lookup图标也就是html的中的a元素。

扩展属性名

lookupGroup

lookup组可以理解为当前实体的名字,如果当前lookup组件是主实体中,则lookupGroup就是实体名,如果当前lookup组件在从实体(也就是明细表的lookup)中,则lookupGroup就是明细的集合属性名

lookupName

lookup名可以理解为当前lookup实体的属性名。从整体的DWZ框架来分析,实际上所有的tab都在一个IE窗口,也就是说JS文件在打开浏览器只会加载一次。这就产生了必须要保证每一个html元素的唯一性,即使是在不同的tab下也是如此。对于lookup来说,是通过lookupGroup+lookupName来确定元素的唯一性的。

suggestClass

主带回项才会有该属性,实现联想查找带回

lookup实体的POJO类的全限定名

searchFields

查询过滤的属性名列表,以逗号分隔。例如带回HiUser,该属性的值为”fullName,userNum”,在文本框中001则平台会查询姓名或者是编号为001的所有用户

callback

回调方法名,在查找带回值后系统会回调该属性的值的方法,以实现您对带回后的特殊处理。例如callback=fun,那么在带回值后系统会自动调用fun方法,并会自动传入两个参数fun(json,index),其中json:是带回的完整json对象,index:是索引值,主要用于明细的带回时要提供是第几条明细记录

 

场景描述:一个会员编辑页面要指定该会员所在的省份、城市、地区,要求在选择省份后会自动过滤该省份的城市,地区以此类推。

       以下所有步骤只是修改OrganizationEdit.jsp文件,即可

步骤一、为省份的主带回项加callback回调方法,并在实现该js方法

<input type="text" class="textInput" name="organization.hi_province.name" value="${organization.province.name}" callback="processProvince"

    function processProvince(json){

       document.getElementById("pageInfo.province.f_id").value = json.id;

    } //该方法的目的是在选择某个省份后将该省份的ID值放到指定的hidden元素中

步骤二、为城市加一个用于过滤的hidden元素,注意processProvince()方法中的赋值语句就是该hidden元素;用于过滤的name必须与PageInfo的具体类相对应;必须要指定lookupGrouplookupName

<input type="hidden" lookupGroup="organization" lookupName="city" name="pageInfo.province.f_id" id="pageInfo.province.f_id" value=""/>

    步骤三、为城市的主带回项加callback回调方法,并在实现该js方法

<input type="text" class="textInput" name="organization.hi_city.name" value="${organization.city.name}callback="processCity"

    function processCity(json){

       document.getElementById("pageInfo.city.f_id").value = json.id;

}

步骤四、为地区加一个用于过滤的hidden元素

<input type="hidden" name="pageInfo.city.f_id" id="pageInfo.city.f_id" lookupGroup="organization" lookupName="region" value=""/>

总结:级联下拉实际上是lookup的一个变种形式,主要的思想是为你要级联的下拉的lookup加入过滤项,例如在城市加一个省份的过滤项,在选择省份时后,会通过回调方法将这个过滤项的值存到该过滤项中。这样逐级过滤就实现了级联下拉的效果.

posted @ 2011-06-03 17:53 张昊 阅读(2259) | 评论 (5)编辑 收藏

       大家可以简单将J-Hi建模工具理解为数据库的E-R图,每个实体就对应一个数据库的表,而实体中每个属性就对应数据库表的一个字段。那么实体与实体之间的关系或表与表的关系又是如何描述的呢?

       对于数据库表的关系大体可分为,如下几种形式

       many-to-one:相当于一个数据库表的字段(外键)对应另一张数据库表的主键,对于J-Hi来说,就是一个lookup(查找带回)。即一个实体中的某个属性是lookup类型,这个属性会lookup另一个实体。对lookup定义的操作步骤请参见“应用开发视频”。页面中的展示形式,例如你有一个报销单,要lookup用户,那么平台就会自动将用户的名称带回来,并在数据库中将用户的ID值保存到报销单表的相应字段中。

 

       one-to-many:相当于一个数据库表下面会有一个或多个明细表,例如一个报销单是主表而报销单明细是明细表。在数据库端的实现形式为,在明细表中有一个主表的外键ID字段。在J-Hi中我们称之为引用,具体操作见联机帮助

 

       one-to-one:所谓一对一的关系在数据库上的理解为,B表每加一条记录A表也会随着增加一条记录,在J-Hi中的表现形式为实体继承

       对于实体的继承,不只是简单的表one-to-one关系,实体的继承还包括所有的java类的继承关系,JSP页面的整合等等

      

       many-to-many:多对多是一种复杂的表关系,J-Hi是通过中间过渡表来实现这种多对多的关系,例如一个项目可以有多个成员,而一个成员又有可能在多个项目中,建模的图为

posted @ 2011-05-31 10:34 张昊 阅读(1086) | 评论 (0)编辑 收藏

1.前台页面:

//自定义一个回调函数ajaxDone

<form action="expert_BaseInformationSave.action?navTabId=expert_BaseInformationList&callbackType=closeCurrent&ajax=1"

method="post" class="pageForm required-validate" onsubmit="return validateCallback(this, ajaxDone)">

 

//回调函数

<script type="text/javascript">

       function ajaxDone(json)

       {

              alert(json.expert.name);

       }

</script>

 

2.后台代码:

public class Expert_BaseInformationSaveAction extends BaseAction implements SynchronizationData{

       private Expert_BaseInformation expert_BaseInformation;

       private JSONObject json;

 

       public String execute() throws Exception {

              Expert_BaseInformationManager expert_BaseInformationMgr = (Expert_BaseInformationManager)

SpringContextHolder.getBean(Expert_BaseInformation.class);

              if(super.perExecute(expert_BaseInformation)!= null) return returnCommand();

              expert_BaseInformationMgr.saveExpert_BaseInformation(expert_BaseInformation);

              super.postExecute(expert_BaseInformation);

              json = new JSONObject("expert", expert_BaseInformation, "name, gender, unit");

             

              return "json";

       }

      

       public Expert_BaseInformation getExpert_BaseInformation() {

              return expert_BaseInformation;

       }

 

       public void setExpert_BaseInformation(Expert_BaseInformation expert_BaseInformation) {

              this.expert_BaseInformation = expert_BaseInformation;

       }

 

       public JSONObject getJson() {

              return json;

       }     

}

 

注意:action中必须定义public JSONObject getJson() {

              return json;

       } 否则前台无法获取json数据。



                                     注:该文档由J-Hi爱好者"笨笨"提供,他的QQ号为289542213,欢迎大家与他在技术上多多交流


posted @ 2011-05-29 22:21 张昊 阅读(864) | 评论 (0)编辑 收藏

本文主要讲解J-hi中树的过滤。以员工部门树为例。

要求在点击某个员工时,能够查看到该员工所在的部门。

 

 

           1-部门树

下图2是所有员工列表:

-2

当点击王五时,显示王五所在的部门结构树如图3

      -3

主要代码部分:

Jsp超链接代码:

<a

href="tree.action?menuName=orgList&orgId=${item.org.id}" target="dialog">${item.org.orgName}</a>

注意:orgId是动态传入的参数,这里指该员工所在的部门编号。

2、在himenu-config.xml中配置部门树的后面加上这么一段

<void property="filter">

   <string>org.cis.filter.orgCollectionProcessor</string>

 </void>

注意:string标签内的是写过滤数据的类。对树的数据进行过滤,提供两种接口方式对数据进行过滤 MenuFilterProcessor 在获取数据之前填加过滤器;MenuCollectionProcessor 在获取数据之后再对数据做整理.具体方法查看java-docAPI

而例子的orgCollectionProcessor类代码:

public class orgCollectionProcessor implements MenuCollectionProcessor {

 

    public Collection getCollection(Collection coll, Map<String, String> map) {

       // TODO Auto-generated method stub

       //coll - 当前节点下一级节点的数据集合

        //map 动态的传入数据,map的形式

       //传入一个员工的所在的部门Id,返回该员工所在的部门结构树

       int orgId=Integer.parseInt(map.get("orgId").toString());

       for (Iterator iterator = coll.iterator(); iterator.hasNext();) {

           Object obj = (Object) iterator.next();       

           if(obj instanceof HiOrg){

              HiOrg hiorg = (HiOrg)obj;             

              if(hiorg.getId()!=orgId) {

                  iterator.remove();

                  coll.remove(obj);

              }

           }

       }

       return coll;

    }  

}


                                     注:该文档由J-Hi爱好者"无可"提供,他的QQ号为924372739,欢迎大家与他在技术上多多交流


posted @ 2011-05-19 22:04 张昊 阅读(828) | 评论 (0)编辑 收藏

树形菜单能很好的呈现菜单项之前的从属关系,结构清晰明了。J-hi平台提供了自定义树形菜单的功能,通过简单的配置即可实现。

本文主要介绍通过树形菜单选择带回节点值的实现方法。以选择带回行政区划位置为例。

数据库表设计:

默认带回页选择界面:

通过jhi自动生成代码的功能,对于lookup xzqhwz的字段默认是如上带回页面,显然并不能表现行政区划位置之间的主从关系。

树形带回页面:

而如果实现如下页面的展示,将会清晰方便许多。

双击即可带回节点,也可通过配置带回节点的各级父节点。

下面是配置的方法:

配置方法:

修改xml

修改C:"Program"hi-studio"eclipse"workspace"earch5"web"WEB-INF"config"himenu-config.xml

在代码末尾:

</object>

</java>

之前插入:(注意修改其中参数)

 <void method="put">

   <string>zdtree</string>

   <object class="org.hi.base.menu.strutsmenu.WebDynamicMenuDefine">

    <void property="keymap">

     <object class="java.util.HashMap">

      <void method="put">

       <string>id</string>

       <string>parentxzqhwz</string>

      </void>

     </object>

    </void>

    <void property="parent">

     <string>id</string>

    </void>

    <void property="child">

     <string>parentxzqhwz</string>

    </void>

    <void property="childValue">

     <int>0</int>

<!

新版本jhi应为:<string>0</string>

> 

    </void>

    <void property="menuName">

     <string>zdtree</string>

    </void>

    <void property="beanName">

     <string>org.hi.zdtree.model.Xzqhwz</string>

    </void>

    <void property="submenuName">

     <string>zdtree</string>

    </void>

    <void property="title">

     <string>行政区划位置</string>

    </void>

    <void property="titleField">

     <string>xzqhwz</string>

    </void>

    <void property="needShow">

     <boolean>true</boolean>

    </void>

    <void property="javascript">

     <string>

    function backAgent(id,orgName){

if(opener.document.getElementById('yzjbxx.xzqhwz')!=null){

           opener.document.getElementById('yzjbxx.xzqhwz').value=orgName;

           }

<!带回到相应的页面的相应文本框。

       else{ opener.document.getElementById('xzqhwz.pxzqhwz').value=orgName;

           opener.document.getElementById('xzqhwz.parentxzqhwz.id').value=id;

           window.close();

}

       }

     </string>

    </void>

    <void property="action">

     <string>{js}backAgent([#id],"'[#xzqhwz]"');</string>

<!在树型结构上通过双击一个节点,获取带回该节点的各级上节点

<string>{js}backAgent([#id],"'[#parentxzqhwz.parentxzqhwz.parentxzqhwz.xzqhwz][#parentxzqhwz.parentxzqhwz.xzqhwz][#parentxzqhwz.xzqhwz][#xzqhwz]"');</string>

> 

    </void>

   </object>

 </void>

修改XzqhwzEdit.jsp页面

C:"Program"hi-studio"eclipse"workspace"earch5"web"zdtree"XzqhwzEdit.jsp

onclick="xzqhwz_lookupPOP('parentxzqhwz')"

改为:

onclick="window.open('/tree.action?menuName=zdtree','部门','width=300,height=500,left=10,top=20,location=no,status=no')"

这样,到Xzqhwz的页面,点击父节点的带回按钮即可看到效果,同样lookupxzqhwz字段的地方也修改Edit.jsp页面的onclick动作就行啦。



该文档是对J-Hi树形的入门级介绍,J-Hi的树功能还有:节点的过滤,lazy加载,一个节点可以多个图标、复选框效果,多个实体组合形成一棵树,我们将在以后继续讲解


                                     注:该文档由J-Hi爱好者"冯思豪"提供,他的QQ号为382600911,欢迎大家与他在技术上多多交流

posted @ 2011-05-12 00:58 张昊 阅读(975) | 评论 (0)编辑 收藏

    J-Hi平台在考虑到开发时与发布后对信息、安全、效率等方面的要求不同,从而提供了设置开发模式与发布模式的开关。这个开关配置在src下的hiFrameworkConfig.properties文件中。
hi.depolyment.published=true
    下面让我们就这个开关项做如下分析,如果值为true,也就是发布模式,它到底会影响哪些东西:

信息内容
   1)菜单中“权限”、“权限资源”将不在显示,因为一旦将做好的项目发布后,这些信息是不能让客户维护的。
   2)菜单中“触发器”、“消息管理”将不可见,因为一旦定时服务设定好,一般来说客户很少会调整,即使是调整也应该是由开发人员来调整触发的周期与频率。对于消息管理也是一样。
   3) 整个“国际化”菜单项全部不显示,这其中包括“多语言参数”、“语言编码”、“时区”,原因这些内部均应该在开发过程中将信息内容一并编辑完成。比如有一个语言编码就要有一套多语言参数与之对应,因些一旦系统上线,所有国际化部分的维护功能也应该同时完成。
   4)“应用配置”列表中,“删除”图标将不再显示,因为如果系统上线,系统中的一些基础配置项是不能删除,而只能更改的

对于这个功能的控制,是在main.jsp中,加入一个变量,代码如下
<%// 是否已发布的开关,其目的是如果为true则关闭那些对终端用户不可见的功能按钮 %>
<ws:set name="published" value="@org.hi.framework.HiConfigHolder@getPublished()" />
建议大家以后在自己采用J-Hi开发的系统中也可以采用该方式来控制页面,这样就可以做到即不影响开发,而在项目提交给用户时同样保证某些只在开发时才能用到的按钮或功能,只要改变一个开关就可以控制。 

安全
   如果采用了发布模式后,页面提交的URL将会被加密,而开发模式URL则是以明文显示,开关则试前后URL的效果如下:
http://localhost:8080/hiUserEdit.action?hiUser.id=1
http://localhost:8080/hiUserEdit.action?cf4a9619dd97fc2689fb63048237404f
   由此可以看出URL问号后的参数部分全部通过了加密处理,这样使您做出的系统更安全,通过使别人URL分析不出你要获取的信息参与也推导不出系统的结构

效率
   1)如果是发布模式,DWZ版的所有js文件将采用压缩的文件,而非一个一个的离散文件,这样系统的传输的内容会更少,具体的方式参见styles.jsp文件
   2)如果是发布模式,系统在启动时一次性加载枚举实体枚举值多语言参数应用配置这些常量性的信息进入缓存,在取这些信息时系统会自动从缓冲中取而并非每都要查询数据库。举例来说,性别是一个下拉的枚举,如果是发布模式只直接从缓冲区中取数据,而如果是开发模式它就会去数据库中取数据,如果是一个人员列表,那么有几个要显示枚举的地方就要去数据库取几次。因此开发模式的运行效率要远远低于发布模式,但开发模式更有实效性,只要数据有任何变化都可以实体的反应出来,即使是在同一个事务中,而发布模式只能在一个事务完成之后再能做数据同步处理(即内存与数据库之间的数据同步)
posted @ 2011-05-08 22:12 张昊 阅读(702) | 评论 (0)编辑 收藏


J-HiDWZ两个国内优秀的开源项目强强联合,携手推出J-Hi4DWZ版。

 

 

登录页面

首页面

J-Hi生成器生成的编辑页面:使你不用写任何一行代码就能实现富文本编辑、页面校验、上传附件、自动带回、主从表编辑等功能

 

角色分派页面:可以看到平台提供左侧树型结构(无需任何编码,简单配置即可)


当然树还可以做成是弹出带回值效果

 

 

更新日志:

1、融合DWZ富客户端做前端页面展示

2、支持跨浏览器包括IE6\7\8\9 FireFox

3、实现webworkstruts2无配置文件解决方案

4、插件增加悬浮联机帮助

5、支持实体复制

 

1、解决登录用户的信息与数据库信息不一致的问题

2、解决多语言标签缓存问题

3、生成时如果有从表不在菜单显示

4、解决在struts下角色、权限、人员会有垃圾数据问题

5、增加二个对菜单树的过滤的接口,及回调实现

6、修改了对菜单树非整数型的配置方法

7、解决加删除标识符的实体未做过滤的问题

8、优化了webworkstruts的基类BaseAction

 

开发人员列表:

人员

主要工作

张慧华

dwz集成,富客户端开发

杨新峰

Eclipse插件开发

张昊

生成器及底层开发

肖金华、尹福泉

修改平台功能页面,修改bug

测试人员列表:

     罗天文、伏占才、宋艺、肖金华、张昊

 

下载地址:http://code.google.com/p/j-hi/downloads/list

J-Hihttp://code.google.com/p/j-hi/

DWZhttp://code.google.com/p/dwz/

 

线上交流:133176937(),133177634(),133178083,134232577

 

相关文章写在J-Hi for DWZ版发布的前夜

                J-Hi快速开发平台到底快速在哪里?

                “J-Hi”Java开源平台的生力军

 

下一步计划:

1)  融合SpringJDBC

2)  支持实体从数据库反向导入并生成代码

3)  支持树形组件的可视化配置

 

posted @ 2011-05-04 15:18 张昊 阅读(3417) | 评论 (7)编辑 收藏

1、快速上手,降低学习曲线

       对于刚刚接触J-Hi的人来说,它上手很容易,我们为每一个功能点都提供了悬浮帮助功能,即使没有任何资料(当然我们已提供了视频与开发文档),您也可以通过向导与帮助在十分钟之内就可以创建出您自己的项目原型。

       其次J-Hi平台采用的大都是大家耳熟能详的主流框架与技术,如果您对主流的框架有所了解,那么对J-Hi的学习就没有任何阻力了。

2、快速搭建开发环境

       也许您因为项目或自身开发团队的不同会采用不同的框架技术,例如您团队中对struts2熟悉的人远远要比掌握webwork的工程师要多,或者在您的项目中统计分析的功能很多,您要考虑ORM的效率问题,而不得不放弃hibernate而采用ibatisspringJDBC,也许您还要考虑数据库问题等等。在搭建开发环境您一定会考虑很多因素,尽管搭建开发环境并不复杂,但还是不够自动化,还要手动的配置,费时费力。J-Hi为快速搭建开发环境提供合理的解决方案,您可以按需求动态的搭建开发环境。

在此您可以选择不同的ORM框架

在此您可以选择不同的表现层框架

在此您可以选择不同的页面框架,并且我们提供了“预览”让您在搭建开发环境之前就可以看到搭建后的页面显示效果

在此您可以选择不同的数据库。

3、快速生成所有代码

       通过建立或导入模式,您可以快速的生成所有代码与文件,并且在生成时会根据您选择的框架技术与数据库的不同而自动适配。

       当然您还可以有选择的生成部分代码文件,例如只生成JSP页面,或只生成java代码。生成的java代码结构如下(因为我选择的框架是ibatis3+struts2,所以平台会自动匹配只生成与这两个框架相关的类文件,而不会生成无用的其它框架的东西):

4、快速解决在业务需求中的技术难点

       一般我们在做项目开发时,总是要等到项目开发的中、后期才能去解决业务核心问题,因此很造成无法合理估计项目的技术风险。原因是复杂的业务总是要等到基础模块建好后才能进入到开发阶段,从而使解决核心的技术问题置后。我们以一个报销为例来做个简单说明,比如报销在审核后的业务逻辑很复杂并且有可能还要涉及到与其它的系统对接。一般来说我们总是要等到这个报销单建好,起码要有最基本的增删查改功能(即使没有页面也要有后台的代码)后才能进入到核心业务的开发,这就加大的技术风险,因为我们会很早的发现问题,但解决这些问题却远远的落后于发现这个问题,甚至到了开发的中、后期因为技术问题在底层上还要一改再改。而使用J-Hi可以很快的进入到业务核心的技术上,因为只要生成,基础功能就已经提供,甚至平台还为您提供了单元测试用例类,从而使您可以直指业务核心,将项目风险控制在最低。

5、通过提供通用的组件

       平台提供了很多通用业务组件,例如组织机构、角色权限、报表、定时任务、菜单管理、日志管理、系统配置、附件上传等等,除此之外平台还提供了一些纯技术组件,例如树型结构、java脚本工具、编码生成器、可选择性的返回JSON对象等等。这些通用的业务组件与技术组件可以为您在开发过程节省很多时间,随需使用,从而大大降低开发速度。

6、通过服务的复用性提高开发速度

       在介绍平台的服务复用性之前,让我们来举个例子。比如您做了一个OA项目其中有一个模块是报销管理这个模块很成熟,您已经在OA系统中应用了很久。现在又有一个ERP系统,您想把这个成熟的报销管理复制到ERP系统中,这样这个功能就不用在ERP系统中再做开发了。对于平台来说这就是服务的复用性,我们提供了一整套对服务复用性的解决方案,并且有自己的可视化工具。

我们叫它J-Hi整合工具,是用C#做的。它的作用:

     1)可视化导入/导出数据库,并同时实现跨数据库,例如您可以在mysql上开发(导出),开发完将所有的数据迁移到oracle上(导入)。

     2)发布器,可视化将您开发的模块或系统自动发布成一个发布包(包括数据库、jar、文件[jsp、js、图片、配置文件等]还包括文件的片段[例如修改web.xml文件中的一部分内容]

     3)部署器,将发布包部署到开发的工程中,部署的内容见发布器的描述

     4)实施器,对应的生产系统,我们通过FTP,将相应的文件与数据库自动部署到生产系统中

7、快速的部署与迁移

       也许您正在为客户要求从SQLServer数据库改为Oracle而感到苦恼,因为这要做大量的数据迁移工作,或许您反复的将修改后的bug部署到生产环境中而郁闷,我想J-Hi通过它的整合工具为您提供了便捷的方式。具体的实现方式请参见上一节的介绍

8、开发人员可以快速的接手别人的工作

       因为使用J-Hi开发,生成的代码与文件的风格都是相同的,在哪里写业务逻辑应该怎么写?在哪里要改页面应该怎么做?想要到哪张数据库表或表与类的对应关系?包括生成的类、JSP文件、配置文件的命名规则都是统一的。因此一个新人加入团队会很容易的上手并进入工作状态,即使是修改别人写过的代码,也会很快速的定位到相应要修改的位置。

9、快速解决需求变更

       对于项目开发来说,项目的需求变更是很正常的事情,对于有经验的项目经理来说,如果一个项目从未发生过需求变更过反而是不正常了:)一但需求变更大多都要改数据库表,如果是已运行很稳定的系统,这种变更真是要命。J-Hi为此也提供了自己的解决方案,对于简单表变更,平台只要对单个实体生成就可以了。如果是复杂的变更,我们还提供继承实体的解决方案,也就是说原来的所有代码与表结构都不变,通过实体继承J-Hi会从数据库表到java类再到JSP页面形成一整套继承关系,从而保证以前功能的稳定性。这个说来好象很玄妙,让我们举例说明。比如你有一个部门表,N多信息都与它有联系,而且做了很多的业务处理,现在客户要求在部门表中加另一些信息。对你来说可能会为部门表中加字段,由此而带来所有类的变化与页面的变化,而这套系统已经很稳定已经用了一、两年了,开发人员都已经离开了公司,这样接手的人要读懂全部代码才有可能改,这样就造成开发速度的大大降低。平台提供了另一种解决方案:不动以前的任何东西,相关于在原有的基础上打上一块补丁。再做一张表,让这张表与部门表形成one to one的关系,而类无论是POJODAOService都继承自部门相应类作为父类,同时在JSP页面上也会继承所有部门的所有元素,这样就形成了实体继承关系,这就好比设计模式中最基本的“开闭原则”,对于所有的新生功能是开放的,而对于已有的老功能是关闭的,可以完全把老的功能视为一个黑箱。这样即能保证已有功能的稳定性,又能加入新的功能做为补充。

posted @ 2011-05-02 00:32 张昊 阅读(6480) | 评论 (8)编辑 收藏