张昊

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

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

2011年5月19日 #

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 张昊 阅读(1174) | 评论 (2)编辑 收藏

http://weibo.com/javahi
posted @ 2011-09-09 16:26 张昊 阅读(863) | 评论 (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 张昊 阅读(2255) | 评论 (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 张昊 阅读(1084) | 评论 (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 张昊 阅读(862) | 评论 (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 张昊 阅读(826) | 评论 (0)编辑 收藏