Thursday, November 30, 2006

看完栋笃神探了,哈哈!

值得一看的香港电视剧,短短24集,带来了n多天的开心!结局是悲伤的,虽然坏人都被绳之以法,然而好人却并没有都如愿以偿、一生平安! 因为我们的世界离完美还有差距... ...





powered by performancing firefox

Sunday, November 26, 2006

轨道交通不能

中午参加完陈俊的婚礼已经13:30了,我们三小强(我、黄贤杰、郭明)在无车接送的情况下只能taxi到莘庄地铁。到了地铁售票大厅,傻了 ,人再多点就能和十一的景象媲美了!!!
此时心中暗自高兴,还好我有交通卡,呵呵 ,不过突然想起早上交通卡透支了!!! 不过可以用自动售票机啊,哈哈, ,看看,这么多人都因为不会用自动售票机而忍受排着长长的队之苦 。走到自动售票机前一看,更是傻了!!!
急忙环顾了一下周围十几台自动售票机,“系统调试”,我靠!! 轨道交通不能,只能走下售票厅,往公交方向走去... ...

Friday, November 24, 2006

专心spy第五天,完结篇

最后一天是因为出太阳,心情很好而导致轻松又短暂,上午就是走马观花似得把基于jsp自定义页面的工作流的按照例子实战了一下。下午把例子发布并调试直到成功,聊了会天就回家了。

在工作流的活动节点的扩展属性中自定义url用来设定跳转到自定义的jsp页面。这里有一个bug,就是选取展现逻辑后要手动加上".do"。

对于每个工作流程实力都有自己的"相关数据区"。"相关数据区"是独立于xml
bus之外的,应该是由工作流引擎来管的,所以不能通过开启在studio中的调试服务器来查看其中的数据。只能用eosmgr中集成的工作流监控来察看。另外有一点是值得关心的,就是工作流的状态(包括"相关数据区"的内容)是记录在数据库中的,这样看来如果服务器崩溃的话也是可以恢复流程状态的。

对于基于jsp页面的工作流,其实就是"相关数据区"与展现逻辑、业务逻辑之间的数据交互。

今天还发现一个bug,是在使用BL_sendMail运算构件的时候,发现studio无法自动引入这个构件,需要手动加上包名:com.primeton.eos.bizlets.sender.Email.BL_sendMail。使用这个构件时,若只用一个参数的话就会使用默认的邮件服务器,其配置在eosconfig.xml中。

工作流是无缝地集成的,在把展现逻辑拖入工作流图时即成为一个"人工活动"节点,把业务逻辑拖入工作流图时即成为一个"自动活动"节点。

最后一点是关于组织机构系统中角色/机构中如果只有一个人的情况下是否使用直接分配而不用自己去提取任务,这个是可配置的,在eosserver\config\wfconfig.xml中。

finish!

Thursday, November 23, 2006

专心spy第四天,期待已久的workflow

放得最早的一天,16:00坐上2号线回家,车上人少可怜,呵呵!1个半小时后到家,貌似比高峰时段的地铁开得快!难道是错觉?不得而知!

一开始没有讲workflow,而是把构件包都介绍了一下,呵呵,这个其实没什么听头的,做开发的时候文档一看就有数了。不过有一点在刚开始用eos的运算构件时要注意,就是诸如BL_runFormatSql这样的运算构件。这个构件在运行时是不关联数据实体而直接运行sql语句的,所以使用这个构件完成一次查询操作后如果有返回结果集(Result
Set)的话,在不指定结果集的实体类型的情况下,将实体类型当做entity处理。在使用指定类型后,如list[@type='CITY']后,将使用CITY作结果集的类型。在我看来,说白了,这个就象java里类型转换或者更象c++里的template,这个理解起来没什么难度,但在用起来要注意的,这会影响到从三个context中取数据。
举个例子,比如说查询的实体为CITY,放在list节点下,则
1.未指定list包含的实体集的类型时:
<list>
<entity>
<CITYID>
1
</CITYID>
</entity>
<entity>
<CITYID>
2
</CITYID>
</entity>
<entity>
<CITYID>
3
</CITYID>
</entity>
</list>
2.用list[@type='CITY']指定list包含实体集的类型时:
<list>
<CITY>
<CITYID>
1
</CITYID>
</CITY>
<CITY>
<CITYID>
2
</CITYID>
</CITY>
<CITY>
<CITYID>
3
</CITYID>
</CITY>
</list>
注:对于形如BL_xxxSql这样不通过关联数据实体而直接运行和数据库相关的sql的构件不提倡使用,因为这些构件中的sql语句可能是不同数据库相关的,跨数据库使用可能产生问题。

今明两天的主角:EOS工作流――具有中国特色的工作流(我靠!)
因为EOS自己的工作流当然能够与EOS
Studio和Server无封继承,所以下午我们是先在昨天的开源系统中加入workflowTest构件包来添加workflow到项目中去。之后选中项目-->属性-->EOS项目属性-->引用构件包-->添加引用库-->EOS业务流程引用构件包。这样就把使用工作流要用到的构件包都引入进来了。

有一点值得注意,就是EOS物理上实质是以构件包而不是传统的项目为单位发布到EOS
Server上去的,所以当两个项目中有同名的构件包时后部署的项目中的构件包就会覆盖前一个项目中同名的构件包(因为构件包都部署在同一个目录下的)。在这个问题上,普元的人说一般是一个EOS
Server部署一个项目,不太赞成一个EOS
Server上部署多的项目,理由是会引起同名构件包的冲突。在我看来这个完全是商业行为,我们就是要花最少的钱让EOS
Server做最多的事,剩余价值就是这么压榨的,呵呵。因为既然是面向构件的东西,那么就不应该出现同名而不同功能的构件,也就是说如果两个项目中使用到了同名构件,那就应该共享该构件,如何共享?部署在同一EOS
Server上就能共享了。

活动的分支模式和聚合模式:
这个在帮助文件的EOS workflow-->概念-->与开发环境相关-->与活动属性相关里面有详细的介绍。其实看穿了,这两个模式中的3个方式无非就是and和or以及and与or组合起来的逻辑运算。

人工活动中的多工作项属性:
多工作项的意思就是可以根据某角色或岗位中包含的人员的个数来产生多个工作项(具体由"多工作项分配策略"定义)。

另外,各种活动和流程的属性在帮助中均有详细的说明。

最后就是用表单的方式做了个请假的工作流并部署和调试应用了一下,具体的步骤在工作流教程的那本书里有。感觉上有oa的味道。

tips:
在活动属性填写中,可以按住shift再点数据行,可以多选。之后就能用ctrl+c和ctrl+v进行复制粘贴到需要的地方去了。

明天要用基于页面的方式实现同一个工作流,拭目以待吧。

今天碰到的问题:
今天碰到的问题就是为什么今天没碰到什么问题呢?不够专心吗?哈哈哈!god knows!

sleeping...

state of BeanGroup this week

4 beans r in 4 places this week. but they r doing 1 thing, working!

public class Bean {
String name;
private String place="SHA_airport CN";
private String thing="playing";

public Bean(String name){
this.name=name;
}

public void setPlace(String place){
this.place=place;
}

public void setThing(String thing){
this.thing=thing;
}

public String getBeanState(){
return new String(name+" is "+thing+" at "+place+".");
}
}

public class BeanGroup {
private Bean[] beans={new Bean("wasabiBean"),
new Bean("thunderclapBean"),
new Bean("javaBean"),
new Bean("bobbyBean")};

public BeanGroup(){
beans[0].setPlace("Melbourne AU");
beans[0].setThing("training");
beans[1].setPlace("SH_SHA CN");
beans[1].setThing("working");
beans[2].setPlace("SH_zhangjiang CN");
beans[2].setThing("spying");
beans[3].setPlace("SH_PVG CN");
beans[3].setThing("on duty");
}


public void printBeanGroupState(){
for(int i=0; i<beans.length; i++){
System.out.println(beans[i].getBeanState());
}
}

public static void main(String[] args){
new BeanGroup().printBeanGroupState();
}
}

Wednesday, November 22, 2006

专心spy第三天,keep on spying

雨是在不停的下的,但课还是要上的!原来今天没有讲workflow,要明天,今天讲了一些如何部署以及一些杂7杂8的东西,一个普元自己的开源的组织机构权限管理系统,一些ajax技术的使用,包括了被两个销售人员吹的很牛的richweb。总的来说今天讲的东西满多的,少而精,多而杂,呵呵!

说到了昨天讲的连接构件的连接线,在线上可以设置构件的返回值,也可以使用复杂表达式。复杂表达式用来对当前dom中的值进行判断,即对当前xml
bus中的数据。详见帮助的"EOS Studio"部分中"提示和技巧"下的"复杂条件判断"。

之后讲解了一下eos中个个目录和其中的文件,包括了自带的jboss应用服务器中的相关目录(这个貌似上次发给陈俊的压缩包里有详细的讲解)。然后发现一个好东东――YingJAD.EXE(好像是什么小颖java反编译程序),就是上次发给陈俊的一个压缩包里有的一个小程序(java反编译程序,从class反编译到源代码,灵的!哈哈)。在讲eos配置文件时讲到,在开发测试阶段一般使用jdbc去连接,而在部署应用的时候是使用DataSource。具体是这样的,在eosserver\config\eosconfig.xml中DBConnect里面key值为single的节点的值为false时使用DataSource而不是该节点下面几行的jdbc连接。DataSource的配置位于application
server中的,默认的即jboss-x.x.x\server\default\deploy\eos4jboss里面的ProductDataSource-ds.xml。

deploy:
1.导出项目为EOS项目,后缀为epj
2.用eosmgr中的应用管理里面的构件包发布项进行部署
注:若项目中含有自己写的业务构件,则部署完成后需重启server。
另外在部署后,实际应用中在eosmgr的日志配置里关闭debug,减少额外系统开销。

在部署讲完之后继续讲了些eosmgr里的东西。"监控信息"能够对运行时context中的内容和sql的内容进行实时监控,这点可以说比较实用吧。在"安全控制"中的策略控制可进行访问限制的设置。

接下来就对那个开源的组织机构权限管理系统进行了自己动手的部署操作(这个系统上次也发给陈俊了)。在部署过程中是根据其中的install.txt来操作的。部署成功后从eos
studio中找到jsp里那个login的页面,然后进行登录。登录后就是一些管理功能放在不同的菜单下供使用。
1.系统管理菜单:
(1).角色管理:用户的权限是通过授予用户不同的角色来配置的,对角色的控制性由弱到强一次是:菜单权限,功能权限,数据权限。
(2).菜单管理:配置页面上所有的菜单。
(3).功能管理:配置具体功能所对应的展现逻辑、jsp及业务逻辑。
(4).逻辑管理:管理发布的构件包,可设置包的校验来限制角色对包的访问。
(5).业务字典:配置业务字典。
(6).数据权限管理:对数据实体的过滤,可以取SessionEntity中的数据。
注:此数据权限将应用到"角色管理"的"数据范围约束权限"中。
(7).元数据管理:呵呵,老师她也还没研究过,暂时我也没时间。呵呵!
2.机构管理菜单:
(1).机构管理:以树的结构展现了个部门之间的关系。可用拖拉方式实现部门的移动和关系的设定。其中包括了岗位信息的设置管理,这个可能对我们比较有用。就是通过岗位而不是角色来进行权限的设定,不过两种方式道理是一样的。

接下来讲到了将自己前两天做的一个练习挂到刚才部署好的开源系统上。(通过增加一个菜单的方式)
1.从"系统管理"-->"菜单管理"-->"增加菜单"
2.把菜单对应的jsp或逻辑加入菜单
3.在角色管理中把这个菜单权限授予某角色
4.属于该角色的用户登录系统后将看到此菜单并可以使用新加的功能。

实际项目开发中的注意事项:
首先是要看《系统功能分解与跟踪矩阵》...xls和《EOS应用开发过程参考》.doc及《交行...开发规范》.doc这三个文档(都给陈俊了)。而后对于构件包的开发以一人开发一个构件包为宜。在需求阶段:填写《系统功能分解与跟踪矩阵》...xls。之后由项目经理把项目放到cvs上,各开发人员每天check
out下来,开发自己的构件包,然后每天再把自己做的那部分check in上去。由项目经理每天对大家check
in的代码走查,看一下是否符合规范。对数据库的设计和变更应该交给dba来统一管理,以免每个人各自更改了自己的数据库实体而导致其他人引用到这个实体时发生问题。对于页面风格,css由美工工艺更改,开发人员只需使用class来调用css中的定义(这个大家都知道,哈哈)。

今天唯一让我很兴奋的一个功能就是文档生成,呵呵~~!程序员都是懒人,懒也是一种美德!选择项目菜单,然后选择eos文档生成,选择生成文档的格式等信息,一路next直到偷懒的事情由电脑完成。哈哈!

运算逻辑构件的开发:
运算逻辑构件实质为java类的static method。具体开发步骤:
1.在bizlet里新建运算逻辑类(哈哈,熟悉的java类)。
2.点添加一个运算逻辑
3.确保"可导出"这个选项选中,finish!
注:"可导出"这个选项说明该构件可用于其他项目中。
另外,在debug运算构件时,可以点"调试数据"来手动在context中任意添加想要的数据(最好切换到文本模式来添加数据,这样比较直观),方便调试。
此外,运算构件属性中的"输入"表示将bizContext中的东西(数据)copy给运算逻辑构件。"输出"指将运算逻辑构件的值copy至bixContext。

最后讲了点ajax的东西,发现eos把httprequest封装了一下,成为hiddensubmit这么个object。在使用ajax时,不是调用展现逻辑,而是直接调用业务构件,即直接从jsp页面通过js提交东西到业务构件。

tips:
1.按住ctrl再双击构件则可以进入构件内部。对于自己开发的运算构件则直接进入该运算构件的java代码。页面构件则进入jsp代码。
2.除了用java提供的api处理xml,还可以用eos构件参考手册中eos api里java
api节点处理中的api或者任何喜欢的第三方api。(这个好像是废话哦,哈哈)

今天的问题:
1.richweb其实并没有想像中的强,就两三个控件,老师自己也说这个是软肋!

keep on raining, keep on spying~~~! 1st keep on sleeping now! hehehe!

Tuesday, November 21, 2006

专心spy第二天

早上起来晚了15分钟,于是终于感受了一下上海特有的"天天春运"这一人为奇观。记得上次体会还是在读书的时候,怀念ing~~~!

今天培训的开始就是昨天的继续。到现在为止,把对数据库的qiud这几种操作都完成了。主要用到了以下几个运算构件(在EOS的文档中有详细的说明,这点上看来EOS的文档要好好使用):BL_expandEntityAll,BL_updateEntity,BL_getPrimaryKey(用来自动生成主键),BL_insertEntity,BL_deleteEntity,BL_queryEntityAllWithPage(其中的分页条件这个输入参数的节点路径必须是PageCond,也就是/root/data/PageCond,这个在帮助中应该有讲到)。

昨天做的是对单表的操作,对于单表操作的话只需要在data包里导入数据实体即可。不需要象多表查询那样要手动写一下多个表的联接的sql。对于单表的操作今天还讲了使用向导的方法来做数据库操作(单表维护向导)。步骤如下:
1.新建构件包
2.在构件包中新建单表维护向导
3.根据提示,根据需要修改属性并一路next直到finish。

今天讲到了多表查询,基本思路和单表的是一样的,只是单表在做数据实体映射的时候是直接导入了数据实体,而多表的话是自己写select语句联接要查询的几张表把查询结果当一个数据实体,有点象是导入了一个view的感觉。步骤如下:
1.在data中新建查询类型实体。
2.手写select sql语句("alt+/"可以调出表名,随后加"."可以调出属性名)。

对于数据库查询结果显示在DataGrid中时要指定DataGrid的数据源xpath,这个xpath一般就是数据库查询运算构件返回的一个list的路径。

在eos中有以下数据类型:
1.常量:字符串(string)
2.变量:
比如xml数据是<who><name>jojo</name></who>,那么变量:who/name就是jojo,也就是取了name节点的值。
3.EOSField:
比如xml数据还是<who><name>jojo</name></who>,那么EOSField:who/name就是<name>jojo</name>,也就是取了name这个节点。
4.EOSEntity:这个和EOSField一样是取节点,只是EOSField不包含子节点而EOSEntity包含子节点。
5.EOSEntityList:多个相同节点的集合。比如
<list><sublist></sublist><sublist></sublist><sublist></sublist></list>

在讲到<dict:write>这个标签(TAG)的时候讲到了eos的业务字典,bndict_t_busitype和dndict_t_dictionary。比如处理性别这样的数据属性时,在数据库中
sex字段的值是1和2,在使用业务字典后使其在页面上自动将值1和2转换成男和女。

下午主要还讲了一下展现逻辑和业务逻辑中其他图元的用处如下:
1.数据设置:设置RequestContext和SessionContext中的数据。双击可以对其设置,其中source和target是成对出现的,讲source节点赋值给target节点。
2.开始:双击对其设置,"向session输出"表示该构件运行结束前从RequestContext向SessionContext拷贝的东西。"向session输入"和"向session输入/输出"同理。
注:若使用到了SessionContext中的SessionEntity,则EOS会自动把SessionEntity从SessionContext中拷贝到RequestContext中,构件运行结束再自动从RequestContext中拷贝到SessionContext中。
3.数据移除:删除节点数据。
4.事务开始、事务提交、事务回滚:可用连接线把事务的三种状态与业务逻辑连接,通过在连接线上设置相应的返回值,可以控制当业务逻辑运行成功后事务提交,而运行不成功时转向事务回滚。
5.异常线:在业务逻辑中有一种红色的连接线就是异常线,用来捕获异常,包括各种java的异常和自定义的异常。
6.迭代:在迭代中的节点必须是ITERATOR为根节点(大小写敏感)。

另外要注意的一点是展现逻辑内可以调用子展现逻辑,而且展现逻辑只能以jsp页面或子展现逻辑结束。

EOS还实现了分布式的构件包或跨数据库的调用,使用eosmgr中"构件包信息配置"来进行配制,多个数据库的话就是对datasource做配置即可(呵呵,估计和spring中配置多个datasource用hibernate对多个数据库使用多个事务管理器道理一样的)。

最后做了一个调用EOS内置js的一个练习,感觉上是EOS提供了不少预先制作好的js,可以在文档中找到具体用法和引用的js文件以及调用时需要的数据,这些数据可由业务逻辑求得并返回到RequestContext中,并以js中规定的xml数据形式位于/root/data/下以供js使用。

今天遇到的问题是:
1.对于一个自己建的构件包,对其重命名时会发现无法对整个构件包中的东西重构,而仅仅只是改了构件包的名字而已。这样的话会带来很多问题,因为java的类都是按package来找的,所以构件包的个个部件将找不到原来引用的包,导致运行失败,唯一的办法就是不要改动构件包名或者手动把该构件包下引用到该构件包名的地方都手动修改(是人都不愿意做这事,呵呵)。
2.对Firefox的支持并不好,很多js只能在IE中起作用,包括EOS自己的manager,用ff打开就会少很多东西,不能用。难道是EOS对ff不重视?应该迟早都会重视的,要跟国际接轨嘛,哈哈。

明天要讲一点ajax的应用(这个我喜欢),还要讲workflow,似乎满重要的,所以先睡觉养精神~~!哈哈哈!

Monday, November 20, 2006

专心spy第一天

早上匆匆忙忙5换1换2到张江,庆幸没碰上高峰地铁,呵呵!地图果然没有说谎,从地铁站到碧波路上的中科大上海r&d中心不到5分钟行程。普元把4楼包下来了,环境还满清爽的。

上午说的几乎就是上次普元两个销售的过来讲的东西的翻版,ppt还是那份ppt。似乎上次那两个人说EOS
Server是要花钱买的,这样看来要用EOS的话这个东东是非买不可的了。因为今天发觉了,光给你个IDE,就是普元标榜的那个EOS
STUDIO(实则就是eclipse的一个插件而已,搞得象这个东西全是他做的一样,呵呵!),你用这个IDE描述出来的图形化的应用一定要通过EOS
Server来解析使之成为可以部署在j2ee application
server上的符合j2ee标准的应用。光给你个免费的ide等于zero!

EOS包括了EOS Server, EOS STUDIO, EOS Business Tool, eosmgr
其中EOS Business Tool中包括了EOS Workflow, EOS
Richweb(上次那两个人满吹捧的东西,不知道到底如何,今天还没用到,希望是好东西)等一些AJAX的应用。

下午把EOS安装好后先是小试了一个helloworld的小应用。因为EOS使用了XPath来定位XML中的元素,而且它的数据交换都是基于XML的,所以必须对XML要有个了解(呵呵!还好我有)。所有的构件都是通过XML
BUS来交换数据的,而XML BUS并不象我想像中的那个内存中的数据池,一个大大的数据池。而是分为三个包含XML数据的数据池,RequestContext,
SessionContext和BizContext。前两个和普通B/S应用中的相同概念,最后一个是业务逻辑构件使用的,当一个业务逻辑被展示逻辑调用是就创建了这么个BizContext,调用的业务逻辑构件运行结束此BizContext即从内存中清除。

在对XML BUS中三个内存区域(即三个xml数据池)操作时(输入与输出数据),当未使用XPath的绝对路径来描述结点时,EOS解析引擎自动使用/root/data作为结点的根路径,也就是说/name解析为/name,而name解析为/root/data/name。

总的感觉就是在java中是使用先定义变量,用变量名的方式来寻址你要的变量的,而在EOS中是使用XPath的概念到XML
BUS的三个Context中来寻址你要的数据的。

之后做了个关于数据库的小应用(包括对数据的查询、添加和删除)。早就用过iBATIS和Hibernate这两个数据库持久框架了,所以对EOS的数据库实体映射这种技术不足为奇。不过发觉EOS的数据库实体导入做的还是很不错,能很轻松的对页面显示进行定制和对字段的check,还有一些使用业务字典等方便的功能,用起来很傻瓜的,很方便。

在今天的培训中发觉了一些问题和要注意的地方:
1.对于data下的数据库实体名,在使用数据库运算操作构件的时候,传入的参数要符合数据库实体名(大小写敏感),因为从这些运算构件产生的sql语句就知道,它把传入的参数当数据库表的表名处理的,如果传的不是实体名,将找不到该表。
2 .biz下的构件与pr下的调用到的biz构件同步不能,当改变任何一处的biz构件时,另一处的相同biz构件无法同步,必须把pr下的biz构件(在biz里改动过的)删了再拖。这个应该算是EOS的一个bug吧我认为,希望下一版本能解决这个问题。
3.这个在我看来也是bug。就是对于jsp设计页面上的QueryForm控件的属性选择,由于其对设置的属性自动生成代码,所以当你在代码中有手动修改的jsp代码时,当再次调出该QueryForm控件属性选择窗口作出修改并确认保存时,将覆盖原来代表这个控件的jsp代码,那么手动修改的部分就丢失了!

今天就spy到这么点,应该算是入门了。

睡觉了~~!累~~!tomorrow go on~~!

Sunday, November 19, 2006

张江一个礼拜

j2ee是好东西,可惜技术这种东西你是永远都无法赶上它的,理由只有一个——你只有一个脑子。除非你抛弃它另寻它道。



eos具体有多灵呢?我也不知道,反正一个礼拜去浦东的培训,去了就知道了。呵呵!反正基于构件的开发从理论上讲开发效率的提高是一定的,不知道维护会怎样。不过我还是喜欢汇编!手工打造经典!咔咔咔!



明天开始又要挤不是人挤的高峰时段的地铁了,从5号线换1号线再换2号线到张江,争取不要被挤烂了,哈哈哈!



记得上次经过张江还是大一第一次考试结束,似乎也是大学唯一一次在2周的考试周里第一周就解决了所有考试科目的那次。那时对张江还挺向往的,现在完全没有向往这种感觉了~~!呵呵!人是会变的~!哇咔咔咔!





powered by performancing firefox

此日志测试3个blog的同步发布

opera blog终于支持Moveable Type API了,所以可以用ff的performancing插件发布了。同时对blogger和spaces(如果可以同步的话就复活之,哈哈!)同步发布。





powered by performancing firefox

publish using performancing

try to use performancing!





powered by performancing firefox

Saturday, November 18, 2006