XUL – xml user interface language, mozilla推出的,firefox就是基于此. flex,zk都是这个意思
http://www.mozilla.org/projects/xul/
Thinlet – 开源XUL引擎,通过XUL分离业务逻辑和界面,基于AWT
ThinG – 用来编写thinklet的XUL的工具,thing.sourceforge.net.通过ThinG配合thinlet使用可以很快速方便的开发awt界面.Theodore – 同上,但是是收费的
genesis – 开发框架,用于企业应用开发的,但是没有体会到有多好,测试sample里的thinlet时AspectWerkz出错,保持关注
swiXML – 类似thinlet但是是用于swing的
jdnc – Sun力推的XUL解决方案,没看出有什么动向,保持关注
Posted on 2008/01/02, 10:43 pm, by zhangv, under
技术(Tech).
-Dcom.sun.management.jmxremote.port=44444
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
sample:
java YourMainClass -Dcom.sun.management.jmxremote.port=44444 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
然后在远程jvm上使用 命令jconsole打开 控制台, 输入目标jvm的ip和上面指定的端口(44444). 就可以看到jvm的详细数据了:线程,堆空间,内存使用,cpu使用,mbean…
Posted on 2008/01/01, 10:43 pm, by zhangv, under
技术(Tech).
由于代理的限制,在开发时eclipse运行时没有办法连到外部的服务器.这时就需要设置jvm的代理.
-DproxySet=true
-Dhttp.proxyHost=your.proxy.net
-Dhttp.proxyPort=8080
sample:
java YourMainClass -DproxySet=true -Dhttp.proxyHost=apacproxy.jpmchase.net -Dhttp.proxyPort=8080
eclipse里就是在run->arguments->vm arguments里填上这三个参数 ,如果是tomcat就需要修改catalina.bat/sh了.
Posted on 2007/12/29, 10:29 pm, by zhangv, under
技术(Tech).
类似springside和appfuse的东西
通过db schema生成 jsp/model类/dao类/controller类/配置文件和资源文件
应用velocity的作为模板引擎通过加入模板到代码生成引擎,可以生成任何需要的代码框架
不打算做一个完美的代码生成工具,只生成代码框架
通过一个ant任务和一个配置文件,ant任务要提供表名的pattern(如果是所有表就是%,以t_开头的就是t_%)和配置文件的名字.配置文件中要提供模板的路径,java源文件的目标路径,jsp的目标路径
通过一个配置模块来做部分定制,如权限和某些字段的显示名称,显示类型(text,hidden,select…)
对应一个数据表会生成的:
model:数据对象
dao:继承自一个基类(通过修改模板来继承任何你自己的基dao类),同时会生成单元测试类
controller:springmvc的controller类,同样继承自一个基类,同样生成单元测试类
form.jsp/view.jsp/list.jsp:分别对应表单,显示和列表页面
hibernate.xml:hibernate配置文件
servlet.xml:springmvc的controller配置文件
daos.xml:dao配置文件
menu-config.xml:生成菜单配置文件(基于struts-menu)
TODO:
1.独立的配置页面,根据每个数据表决定他的外键关联以及每个字段的生成信息(如通过那个字段关联到另一张表的哪个字段,某列是否显示于list.jsp、是否可排序、过滤)
3.权限控制,整合acegi
Posted on 2007/12/18, 9:55 am, by zhangv, under
技术(Tech).
从ee,se转到me会感觉被束缚了手脚,很多东西都需要自己写。其实不是,也有很多好用的framework可以拿来用
xml, kxml,xparser,前者是比较出名的xml处理,而后者是我在sf上偶然发现的,api比较清爽,但是需要稍微修改一下才可以用,因为他不仅仅是给me用的,所以要把source里的一些高级api(zipinputstream,bufferedinputstream)去掉。
logging, j4me,是googlecode上找到的,提供类似log4j的支持
unit test, j2meunit,没什么说的
IOC container, 没有,试图去找,结果是:IOC实现大多数严重依赖reflection,也就意味着必须要java1.3以上。而me只有1.1的级别
UI, j4me,提供一些常用的如menu和dialog的支持,没有用过
最后更新: 12-18-2007
Powered by ScribeFire.
Posted on 2007/12/13, 10:33 am, by zhangv, under
技术(Tech).
刚刚“领略”了一些spring-modules的源代码看到了FactoryBean和InitiliazingBean的用处。记在这里
InitializingBean.afterPropertiesSet()
这个方法比较容易理解,是在spring根据配置文件设置了bean的属性后调用的,一般这里会做一些初始化的工作。比如,xml配置中只是提供了resource的路径,在这个方法里 就要根据resource的路径初始化一些成员变量(那些不能被注入或者没有被注入的成员变量)。
public void afterPropertiesSet() throws Exception {
if (this.definitionLocation == null) {
throw new FatalBeanException(”Property [definitionLocation] of class ["
+ ProcessDefinitionFactoryBean.class.getName()
+ "] is required.”);
}
InputStream inputStream = null;
try {
inputStream = this.definitionLocation.getInputStream();
this.processDefinition = ProcessDefinition.parseXmlInputStream(inputStream);
// 这里就是初始化的地方,spring的配置文件中只配置了definitionLocation的信息,其他的事就在这里做
}
finally {
if (inputStream != null) {
inputStream.close();
}
}
}
FactoryBean.getObject & getObjectType
在比较配置文件和源代码的时候我很疑惑,为什么类型都不对头,怎么可以注入的?答案就在FactoryBean的这两个方法里
public Object getObject() throws Exception {
return this.processDefinition;
}
public Class getObjectType() {
return (processDefinition == null) ? ProcessDefinition.class : [...]
Posted on 2007/12/12, 10:26 am, by zhangv, under
技术(Tech).
来自 www.xmpp.org
Step 1: Client initiates stream to server:
<stream:stream
xmlns=’jabber:client’
xmlns:stream=’http://etherx.jabber.org/streams’
to=’example.com’
version=’1.0′>
Step 2: Server responds with a stream tag sent to client:
<stream:stream
xmlns=’jabber:client’
xmlns:stream=’http://etherx.jabber.org/streams’
id=’c2s_234′
from=’example.com’
version=’1.0′>
Step 3: [...]
Posted on 2007/12/05, 2:58 pm, by zhangv, under
技术(Tech).
Posted on 2007/12/04, 9:20 pm, by zhangv, under
技术(Tech).
这个是前一阵子有空的时候用swing写的一个简单的记账软件。很简单的功能,无非就是记账,添加顾客,充值,修改,报表。用Spring来管理swing ui组件之间的依赖,发现也很方便,而且看起来更清晰,不像以前那种panel,frame,dialog的引用传来传去。本来还准备用thinlet重写一遍,后来因为thinlet只支持awt而没做。同时还试了一些方法来发布这个桌面应用,见Java桌面应用程序发布 截图: 下载 源代码
Posted on 2007/11/27, 11:48 am, by zhangv, under
技术(Tech).
ZhangV
在jbpm的流程定义文件(processdefinition.xml)中当定义一个task的assignment的时候有几种选择:
Swimlane
Pooled Actors
Expression
Actor
Handler
这里分别描述一下每种的用法,以及使用场景。使用场景的理解很重要,只有清楚每一种用法的所适合的情形,以及他们之间的相互转换才能说是真的“会用了”。
Swimlane
泳道是用来处理一个流程中的多个任务必须由同一个人来处理的机制。所以,当一个流程的第一个任务实例被创建到指定的泳道后,第一个任务实例中的执行人被保 存,该泳道中的后续任务的处理人都是第一个任务的处理人。所以一个泳道有一个人员被分配,并且泳道中的任务不需要再分配人员。这里是指这个流程中的参与者或者角色。在实际的业务系统中,他可能根本就不是一个业务角色,可能是一个外部应用,也可能是一个处理过程,或者是几个业务角色的结合。所以要清楚他是指“在该流程中”的角色。在jPDL的user guide中写的很清楚也反复强调 – “process role”。
通过在流程定义文件中定义:
<swimlane name=”leader”>
<assignment class=”com.modofo.engine.swimlane.LeaderSwimlane”></assignment>
</swimlane>
同样可以实现运行时的结合实际应用进行灵活的任务分配。这也是目前我看到的使用比较多的方式。
Actor
相当于设置TaskInstance的actorId属性,主要用于获取某个actor的所有任务列表。设置方法在定义中描述actor-id属性,或者调用TaskInstance.setActorId(String)方法,或者在AssignmentHandler中调用assignable.setActorId(String)方法。
Pooled Actors
用于定义所有的任务参与人(candidates for task instance)。在查找某个参与者可参与的任务时使用,其实就是一个actor的集合,jBPM通过TaskMgmtSession.findPooledTaskInstances(String actorId)或者TaskMgmtSession.findPooledTaskInstances(List actorIds) 来查找任务集合。
注意:actor的优先级比pooled actors要高,所以如果同时设置两者,那jBPM只会用actor来查找,而忽略pooled actors。
一句话: actor被用来获取某个参与者的个人任务列表,pooled actors用来获取某个参与者可以参与的所有任务列表,或者说组任务列表。
使用这个actor集合的初衷就是为了不让任务分配和角色体系耦合。流程定义中始终都是只有参与者的名称和集合,而不存在用户,角色和用户组的具体设计。而使用Expression就耦合了这些信息在流程定义里。
Expression
如果你使用jBPM的identity component的话。你可以使用表达式定义的任务分配模式。通常这个表达式的形式是:
<assignment expression=’previous –> group(hierarchy) –> member(boss)’ />
我看了之后也不是很清楚,group和member是jBPM的identity componenet的概念,这个表达的意思大概是:使用之前的actor,然后在hierarchy组,并且member(角色)是boss的所有actor。这种方法仅限于使用jBPM的IC时使用。
Handler
指定你自己的AssignmentHandler实现。该接口只有assign方法。这种任务分配方式主要用于运行时的任务分配,而不是hardcode到定义文件里。使用场景,如果不想让原本应用中的访问控制与jBPM耦合起来,就可以使用这种方法来将jBPM中的任务分配代理出来。当然更好的定义是用swimlane,这样可以让定义文件看起来不是很凌乱。