张昊

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

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

2011年5月4日 #

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)编辑 收藏