10月31日
J2EE 的开发还是那么不方便 。倒不觉得J2EE有什么难的 。 主要是非常不方便,很多的硬性规定,很多容易疏忽而出错的地方,很多的工具和文档需要你配置 。 所以有些小孩儿就觉得J2EE学习困难 ,觉得用J2EE才是牛人,才本事吧 。 其实是天下之大谬也 ! 程序不是这样写的 。
切入正题 , EJB3开发中的消息驱动Bean 还是比较有用 ,我们这里的EJB容易都用的JBoss。 这里我先说说写消息驱动Bean的步骤:
1,得到一个JNDI初始化上下文 。 示例代码:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props) ;
2, 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue 来使用相应的类型);
例子对应代码:
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
3,从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);
例子对应代码:conn = factory.createQueueConnection();
顺便说一下 , 分发的时候用TopicConnection ,定向的时候用QueueConnection
4, 通过连接来建立一个会话(Session);
例子对应代码:session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
这句代码意思是:建立不需要事务的并且能自动接收消息收条的会话,在非事务Session 中,消息传递的方
式有三种:
Session.AUTO_ACKNOWLEDGE :当客户机调用的receive 方法成功返回,或当MessageListenser 成功处理
了消息,session 将会自动接收消息的收条。
Session.CLIENT_ACKNOWLEDGE :Session 对象依赖于应用程序对已收到的消息调用确认方法。一旦调用
该方法,会话将确认所有自上次确认后收到的消息。该方法允许应用程序通过一次调用接收、处理和确认一
批消息。
Session. DUPS_OK_ACKNOWLEDGE :一旦消息处理中返回了应用程序接收方法,Session 对象即确认消息
接收,允许重复确认。就资源利用情况而言,此模式最高效。
5, 查找目的地(Topic/ Queue);
例子对应代码:Destination destination = (Queue) ctx.lookup("queue/foshanshop");
6,根据会话以及目的地来建立消息制造者MessageProducer (扩展了QueueSender 和opicPublisher 这两个基本接口)
例子对应代码:
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("Hello China");//发送文本
producer.send(msg);
待续......
10月29日
我的性格不是追星的人 , 从小到大都是如此 。 但是影视明星里面,确实有个人,我是多少对他想竖起拇指的 。 那就是-刘德华 。
小时候只是决定他是四大天王,爱看他演的戏 ,不爱听他唱的歌 。 他的每部电影都是必看 。 自从上了大学,也通过媒体和侧面更多的了解了一下他 。 开始越来越尊敬他了 。
1.97回归的时候他公开表示不会移民 。 比王祖贤之流的二流演员从大陆跑到香港,又从香港跑到加拿大 ,跑得自己是什么人都忘了,现在年纪一大把,又跑回来强太多了 。
2,刘德华是第一个也是最多的一个出现在春节联欢晚会上的港台明星 。
3,他第一次出现就是唱他的中国人 。
4,从来不耍大牌 ,很敬业 。
5,品德不错 。很少传出绯闻 。
......
最近看到一则报道
8月5日,刘德华一行来到日本,举办了小型歌友会。 歌友会一开始,歌迷欢呼。但是刘德华拒绝用日语向大家问好。接着又拒绝了主办方安排的日语歌曲。并把所有曲目都改为普通话。原定的粤语歌曲也全部取消。 刘德华用普通话一字一句说道:“本来我是不想来日本的,但是因为合约在身,不得不来日本。但是你(指记者)不要以为是一纸合约把我牵住的,如果我不来,没人可以把我怎么样。我只是觉得这样对我歌迷不公平,因为歌迷是无辜的。我不想做的事,谁也无法逼我做,而且,你逼我,我也不会做”。 刘德华接着说:“引用一句话,艺术是没有国界的,但是艺术家是有国界的。我想说,音乐是没有国界的,但是音乐家是有国界的。”他对着主办方说“以后介绍我时,不要说我是香港歌手,因为我首先是一个中国人”。 然后,他当着几百名日本歌迷的面,演唱了一首《中国人》。
呵呵,喜欢他很多年了。这棵常青树。
晚上回家的路上 ,高架桥又是塞车,当然又是车祸了。
塞车的路上

阴森的屋子
塞车的源头,车祸
10月27日
最近看到一则不错的消息:
Sun决定将移动版Java逐渐转向Java标准版(新闻回顾:Sun力推Java标准版 手机移动版Java将逐步退出)。Java之父,Sun副总裁James Gosling说,“曾经主要在台式机上流行的Java标准版(SE)会逐渐取代Java微型版(ME),将更多计算能力带进小型设备中。”
为此国外的一位Java开发者Bill Ray在博客中以《Gosling欲痛打J2ME落水狗》为题写道,“Java之父James Gosling规划了JavaFX Mobile的未来蓝图,然而J2ME根本不在未来计划之内,所以这一micro版本将在下个十年消失。……”
Gosling在获悉这番内容后在自己博客中“厉声”回应道:JavaME没有死!
在博客中,Gosling写道,“有些人们非常愿意曲解我的话语并将这说成是我的话。最早的JavaME非常简单和有限,直接反应了当时手机的简单和有限:我们不得不根据现有的硬件来开发软件。随着时间的推移,手机变得越来越强大,JavaME也伴之不断成长。手机正变成新的桌面,我们也一直关注着这点。所以很明显JavaME和JavaSE将整合并难以区分(指差别小)。有两条路:JavaSE拥有丰富和成熟的图形API,JavaME在这方面发展;JavaME拥有location API(GPS),有人认为这应当在JavaSE中得到呈现。”
“这是一个前进发展的过程,而不是‘抛弃旧的,留下新的’。”
Gosling原文:
JavaME is *not* dead!
It's growing up. Sheesh. Some folks are far too eager to misinterpret statements and put words in my mouth. The early versions of JavaME were very simple and limited, a direct reflection of the fact that early phones themselves were simple and limited: we had to work with what we had. But as time has passed, and cell phones have become more powerful and capable, JavaME has grown up too. Cell phones are becoming the new desktop. We've been saying this for years. Over time, it's pretty clear that JavaME and JavaSE will converge and become largely indistinguishable. It goes both ways: JavaSE has a much more sophisticated graphics API, and JavaME is growing there. JavaME has a location API (GPS) and one could easily make the argument that it should be available in JavaSE.
This is a process of evolution, not "out with the old, in with the new".
看来,在未来,移动真的是在我们生活中的方方面面承载着各种各样的运算需求啊。尽管我靠着J2ME吃了很多年饭 ,不过我也很期待尽快在移动设备上用上J2EE:)
10月26日
当你的EJB3是deploy to jboss的情况下,ejb client调用EJB3分两种情况:
1) 发布在jboss的web app作为client来调用EJB
EJB和调用EJB的WEB 应用都发布在Jboss 集成环境下。在Jboss下发布WEB 应用,需要把WEB 应用打包成war 文件。另外在此环境下调用EJB 不需要把EJB 的接口类放入/WEB-INF/classes/目录中,否则在调用Stateful Bean 就会发生类型冲突,引发下面的例外
java.lang.ClassCastException: $Proxy84
org.apache.jsp.StatefulBeanTest_jsp._jspService(org.apache.jsp.StatefulBeanTest_jsp:55)
如果EJB和调用EJB的WEB 应用都发布在Jboss 集成环境下,那么EJB的Local或Remote接口都可以被调用
发布在Jboss 下的客户端不需要明确设置JNDI 访问的上下文环境,可以直接通过
InitialContext ctx = new InitialContext()
获得上下文环境,容器会自动赋给InitialContext 正确的环境,例如:
InitialContext ctx = new InitialContext();//客户端和jboss运行在同一个jvm,不需要传入props
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
如果硬给InitialContext 设置了访问属性,反而会带来不可移植的问题,因为你的应用有可能部署在weblogic 等应用服务器。(本教程考虑到部分同学可能需要在独立的J2se 中调用EJB,为了教学的方便,把访问属性都设上了,这样不管在jboss、j2se 或独立tomcat,都能获得正确的InitialContext)
2) 在单独的Tomcat或J2SE(如junit test)中调用EJB
在正式的生产环境下,大部分调用EJB 的客户端可能是单独的Tomcat 或Resin。下面介绍如何在单独的Tomcat服务器中调用EJB。在单独的Tomcat 服务器中调用EJB 需要有以下步骤:
A) 把调用EJB 所依赖的Jar 包拷贝到tomcat 下的/shared/lib 目录或WEB 应用的WEB-INF/lib下,所依赖的Jar在jboss 安装目录的client目录下。你可以在eclipse里设置一个自定义的library “ejb3 library”,把这些jars都添加到该library里,然后在你的EJB project里把“ejb3 library” add to classpath
B) 把EJB 接口拷贝到应用的/WEB-INF/classes/目录下
C) 客户端访问EJB 时必须明确设置InitialContext 环境属性,代码如下:
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);//客户端和jboss运行在同一个jvm,不需要传入props
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
Tip: 除了上面通过硬编码设置环境属性的方式外,还可以在应用的classpath 下放置一个jndi.properties 文件
注意:在单独的tomcat和J2SE里不能调用EJB 的Local 接口,因为他与JBOSS 不在同一个VM 中。J2se中调用EJB3 同样需要把上述jar 及EJB 接口放置在应用的类路径下。
expressionbuilder emp = new expressionbuilder(); //主builder
expressionbuilder spouse = new expressionbuilder(employee.class); // parallel builder
expression exp = emp.get(“lastname”).equal(spouse.get(“lastname”)) //基于对象模型的思考
.and(emp.get(“spouse”).equal(spouse.get(“spouse”))
.and(emp.notequal(spouse));
4. 参数化expressions、finders
1) 参数化表达式示例
- //构造查询用的表达式,注意带一个firstname的参数
- expressionbuilder emp = new expressionbuilder();
- expression firstnameexpression =
- emp.get(“firstname”).equal(emp.getparameter(“firstname”));
- //生成一个readobjectquery对象,设置query的参考类、查询条件、参数
- readobjectquery query = new readobjectquery();
- query.setreferenceclass(employee.class);
- query.setselectioncriteria(firstnameexpression);
- query.setargument (“firstname”);
- //进行查询
- vector v = new vector();
- v.addelement(“sarah”);
- employee e = (employee) session.excutequery(query,v);
2) 嵌套参数化表达式示例
- expressionbuilder emp = new expressionbuilder();
- expression addressexpression;
- //生成嵌套的参数化表达式
- addressexpression = emp.get (“address”).get (“city”).equal (
- emp.getparameter (“employee”).get (“address”).get (“city”));//嵌套的表达式
- readobjectquery query = new readobjectquery (employee.class);
- query.setselectioncriteria (addressexpression);
- query.addargument (“employee”); // ?
- //设置参数,执行查询
- vector v = new vector ();
- v.addelement (employee);
- employee e = (employee) session.excutequery (query,v);
三、一段使用toplink的完整的实例代码
- import toplink.public.sessions.*;
- databaselogin.setlicensepath(“”);
- databaselogin logininfo = new databaselogin();
- logininfo.usejdbcodbcbridge();
- logininfo.usesqlserver();
- logininfo.setdatasourcename(“dbserver”);
- logininfo.setusername(“”);
- logininfo.setpassword(“”);
- project project = new project(logininfo);
- databasesession session = project.createdatabasesession();
- session.adddescriptors(this.buildalldescriptors());
- try {
- session.login();
- } catch(databaseexception exception){
- throw new runtimeexception(“database error occurred at login: “+exception.getmessage());
- system.out.println(“login failed.”);
- }
- ...
- session.logout();
四、查询框架(query framework)
直接调用databasesession对象提供的方法,完成查询、更新等操作。在更新操作时,会使用unitofwork,以提供优化的性能。
? 示例代码
- employee employee = (employee)session.readobject(employee.class,
- new expressionbuilder().get(“lastname”).equals(“smith”));
- vector employees = session.readallobjects(employee.class,
- new expressionbuilder().get(“salary”).greaterthan(“1000”));
五、使用expression
toplink提供一种叫expression的机制允许基于对象模型的查询机制,toplink翻译这些expressions为sql语句,再把查询结果转换为对象返回。
1. 创建expression
expression总是通过expresson或expressionbuilder的.get()方法得到,expressionbuilder可看作一个所查询对象的替身。一般命名为相应对象的名字。
一个expressionbuilder的实例与一个特定的query相关联,不要企图使用同一个builder来生成多个expression。
2. 子查询
reportquery是为了得到一个对象集的信息,而不是对象本身。常用方法:
addattribute(string),addaverage(string),addcount(string)等。
1) 示例代码1
查询包含5个以上被管理职员的职员
- expressionbuilder emp = new expressionbuilder();
- expressionbuilder managedemp = new expressionbuilder();
- reportquery subquery = new reportquery(employee.class,managedemp);
- subquery.addcount();
- subquery.addselectioncriteria(managedemp.get(“manager”).equals(emp)); //?
- expression exp = emp.subquery(subquery).greaterthan(5);
2) 示例代码2
查询住址在ottawa的工资最高的职员
- expressionbuilder emp = new expressionbuilder();
- expressionbuilder ottawaemp = new expressionbuilder();
- reportquery subquery = new reportquery(employee.class,ottawaemp);
- subquery.addmax(“salary”);
- subquery.setselectioncriteria(ottawaemp.get(“address”).get(“street”).equals(“ottawa”));
- expression exp = emp.get(“salary”).equals(subquery).
- and(emp.get(“address”).get(“street”).equals(“ottawa”));
3. parallel expressions
parallel expression必须拥有它自己的expressionbuilder,并且这个builder的构造方法必须以一个class作为参数。只存在唯一的主 expressionbuilder,这个主builder使用空参数的构造器,它的类将从query中得到。
1) 实例代码
查询所有具有相同lastname不同性别的职员
toplink 是位居第一的 java 对象关系可持续性体系结构,原署webgain公司的产品,现在被oracle收购,并重新包装为 oracle as toplink。toplink为在关系数据库表中存储 java 对象和企业 java 组件 (ejb) 提供高度灵活和高效的机制。toplink 为开发人员提供极佳的性能和选择,可以与任何数据库、任何应用服务器、任何开发工具集和过程以及任何 j2ee 体系结构协同工作。本文仍然以业界已广为使用的toplink 3.5为参考版本,简单讲述toplink的使用要点。本文并不是一个step by step的入门实例教程,而是着眼与toplink的一些基本概念,总结了一些使用要点,从中也可以窥探toplink的使用方式和它的设计原理。
一、连接数据库
? create a login object
project.getlogin()
new databaselogin()
? specifying database and driver information
//project.getlogin().useoracle();
project.getlogin().setdriverclass(oracle.jdbc.driver.oracledriver.class);
project.getlogin().setconnectionstring(“jdbc:oracle:thin@dbserver:1521:orc1”)
? setting login parameters
project.getlogin().setusername(“scott”);
project.getlogin().setpassword(“tiger”);
? 实例代码1
databaselogin.setlicensepath(“c:\\program files\\common files\\webgain shared\\”)
project project = new myproject();
project.getlogin().setusername(“userid”);
project.getlogin().setpassword(“passwd”);
databasesession session = project.createdatabasesession();
session.login();
? 实例代码2
databaselogin.setlicensepath(...);
databaselogin login = new databaselogin();
login.set...
...
project project = new project(login);
databasesession session = project.createdatabasesession();
session.login();
二、databasesession的使用
一个应用必须创建一个databasesession,其中存储了如下内容:
1. 一个project、databaselogin实例(存储了数据库登录、配置信息)
2. 一个databaseaccessor实例(包装了jdbc连接,处理数据库访问)
3. 应用的所有持久类的descriptors
4. 作为cache的一个对象map
databasesession的实例必须由project的实例创建得到,project对象必须由正确的数据库配置参数初始化,比如jdbc driver、db url。
? 注册descriptors(在login前,login后也可但要注册的应不同于任何已注册的descriptor)
databasesession.adddescriptors(vector) or databasesession.adddescriptor(descriptor)
? 连接数据库
databasesession.login(),连接后就可以使用此session访问数据库了,使用“query framework”
? 缓存
可使用initializeidentitymaps()方法来刷新缓存。注意:使用前要确认缓存中的对象没有被使用。
? 登出数据库
databasesession.logout(),再次登入时不需要注册descriptors
可以通过下面代码指定databasesession的例外处理过程:
session.setexceptionhandler(new exceptionhandler(){
public handleexception(runtimeexception ex){
if((ex instanceof databaseexception) && (ex.getmessage().equals(“connection reset by peer”)){
ex.getaccessor().reestablishconnection(ex.getsession());
return ex.getsession().executequery(ex.getquery());
}
}
});
Oracle TopLink Essentials是由Oracle公司推出,EJB3.0规范(JSR 220)中的JPA部分的标准实现。
Java开发者可以利用TopLink所提供的强大功能,快速开发具有高性能的企业应用程序。
JPA是什么
Java Persistence API (JPA) 是EJB 3.0 规范 (JSR 220) 中引入的标准对象关系可持续性。
JPA主要借鉴了领导持久层的诸如Hibernate,Oracle TopLink,Java Data Objects (JDO)等持久层框架,以及早期EJB的容器管理持久化的思想与概念。实现了ORM(对象关系映射:Object-Relational Mapping)和 实体间的关系映射等功能。
1,简化程序模型
2,使用注释,简化配置
3,ORM:对象关系映射
4,EJB-QL:提供了动态查询,和功能强大的EJB查询语言
5,独立。可在EJB容器之外单独运行,也使得实体Bean更加容易测试
6,灵活,可配置。可以使用第三方JPA provider实现
Oracle TopLink Essentials是由Oracle公司推出,EJB3.0规范(JSR 220)中的JPA部分的标准实现。
Java开发者可以利用TopLink所提供的强大功能,快速开发具有高性能的企业应用程序。
Oracle TopLink主要特点:
1,柔软的设计结构
2,支持缓存,以及对象级别的缓存
3,强大的查询功能
4,支持XML,EIS,对象关联等高级映射功能
5,支持事务锁功能
6,支持对象级别的事务管理
Oracle TopLink Essentials License:CDDL
开发IDE对Oracle TopLink Essentials的支持:
Oracle JDeveloper与Eclipse环境下的Dali项目都提供了对Oracle TopLink Essentials的开发支持。
Oracle TopLink Essentials首页:
https://glassfish.dev.java.net/javaee5/persistence/
http://www.oracle.com/technology/products/ias/toplink/JPA/index.html
其他主要JPA实现:
OpenJPA:http://openjpa.apache.org/
Hibernate EntityManager:http://www.hibernate.org/
EJB3.0规范-JSR220
10月25日
已经开始讲课几天了。Show一下环境 。
手机拍的,凑合着看了 。
我住处的楼梯和录像用的三脚架 。
林立峰抽空玩了一下魔兽世界 。 我好像对此毫无兴趣 。
语言的课程,林立峰讲 , 分析,设计以及某些工具我来讲 。这次第一个班,学员是10-11位(有一位还不定) 。 基本不赔本而已。
这次培训开课几天了,一直没有机会show,那么现在就稍微展示一下,手机拍摄,效果包涵 。
上课的时候
住处的楼梯和拍摄用的三脚架
林立峰抽空的时候Show了一下魔兽,用投影玩。
10月19日
下午去4S店修车遇到了一些趣事,最好玩的就是看到旁边的这辆车 。
问了问维修的师父 , 问他司机还活着没有 。对方告诉我 , 司机就是腿受了点儿轻伤,基本无大碍。然后大谈奇谈这个车安全性还不错 。
最后我给他一句话:“你该去当销售!”
经过4天的持续 , 今日为河南移动做的需求培训完成了 。 又解决了一件事情,开始下一件事情的处理 。 同时办4件事情确实一点儿不敢疏忽 ,环环相扣,紧密相联。合理的安排自己的时间就非常重要了 。
这次主要是为全省的移动信息管理员在日常工作中的需求分析提供帮助 。 自认为很多东西是讲明白了 。 至于效果如何,就看他们是否有改善的认知了 。 相信,会为统一他们的过程作些帮助 。
培训内容放到服务器上供下载,包括:讲义 , 案例 , 软件 , 视频 等4个部分 。
服务器专题地址
上几张休息的时候用手机拍下的培训大厅:

10月18日
前一阵子,重装了,系统, 发现最新版本的MSN Live Writer 只能安装在XP or Vista上面,不支持Windows2003 .于是乎研究了另外的写博客的工具 。 发现了 Zoundry .
这个软件很出名的,据说是类似工具的鼻祖 。 同时Zoundry也是全球知名度很高的博客群 。 以下是研究的通过他写微软Live的博客方式 。(截图是参照别人的英文博客的界面。中文博客类似)
本文仿照Dareo的写法,下面是用Zoundry Blog Writer连接MSN Spaces的步骤:
- 如果没有MSN Spaces,先去http://spaces.msn.com申请一个。
- 登录,修改你的MSN Spaces->设置->电子邮件发布"。
- 打开电子邮件发布,见下图(不知道为什么其它选项都是中文的,只有这页是英文的)
- 设定一个保密词
- 如果没有最新的Zoundry,可以到http://www.zoundry.com下载。
- 打开Zoundry,点Tools->Blog Account Settings
- 创建一个新的帐号用户名填你的目录名,例如,我使用i94smart,因为我的Spaces是http://spaces.msn.com/members/i94smart,密码是你打开电子邮件发布时设定的保密词。
- 类型选择"MSNSpaces",Zoundry设定很简单不需要设定SSL和端口
- 接着点"Next",直到结束。
- OK,你现在已经可以用Zoundry在MSN Spaces上发布你的Blog了。
终于写完了,松一口气~
10月16日
今日从移动培训出来(培训趣事讲在今后讲) , 看到车得油表没有油了。于是去经三路,农业路口得加油站加油 。
停车 ,
加油站工作人员:”加多少?“
我很自然得说:“200,现金,不开票”
工作人员很娴熟得抬起油表
......
“等等.....”
“怎么了?”
“钱包没有带 ,落在会议室了。”
(几个小时之后,同样得地方)
工作人员:“加多少”
我:“200,现金”
我:“等一下 , 钱包现金不够,100好了”
开始加油......
加油完成......
开车得路上,突然发现自己得油表还是底线 ,随即开会油站
我:“刚才加进去没有?怎么油表不动呢?”
工作人员:“加了啊, 你看着得”
我:“再加100 ,我看看”
工作人员:“好的 !”
我:“你先加啊,我去提款”
工作人员:“给你加到暴”
.....
“老板,加不到100 ,你看才58 , 这油已经满了。”
“什么58 , 57.7 ,四舍五入是57 ,会不会算帐”
......
加满油后,终于验证是自己油表坏了 ,唉 ,歹势啊,歹势!
10月15日
ATL 是一种混合语言(宣告式与命令式的混合)设计用于表达MDA框架中的模型转换。它通过一种抽象的语法(一种MOF元模型)进行描述,建模者可以利用上下文相关的语法和一个辅助的图形符号来描绘转换模型的局部视图。 一种转换模型在ATL中表示成一组转换规则。推荐采用宣告式的编程风格。
openArchitectureWare (oAW)是一组工具和组件能够辅助使用模型驱动(Model-Driven)所进行的软件开发。它构建在一个模块化的MDA/MDD生成器框架之上支持任意设计格式,元模型导入,支持任意代码格式输出。在其核心是一个工作流引擎:首先定义转换工作流和许多被用于读取与示例模型的预构建工作流组件,对它们进行约束违反校验,把它们转换成其它模型,然后最终生成代码。
MOFScript 项目主要是开发支持模型到文本转换的工具和框架。比如支持从模型生成代码或文档等。它提供一个元模型未知的框架,这个框架能够使用任何类型的元模型和它的实例来生成文本。它的特性包括从基于MOF的模型生成文本,具备基本的控制机制比如:循环,条件选择,字符串操作,输出表示引用模型的元素,支持在模型和已生成的文本之间进行相互"追溯"。
UMT-QVT是一个用于模型转换和从UML/XMI模型生成代码的工具。UMT-QVT提供了一个可以加入新生成器的平台,生成器可以用XSLT或Java实现。
QiQu是一个支持MDA与MDSD方法的框架。它基于把UML(XMI文件)模型转换成源代码(Java,C#,Cobol等)的思想。可以利用QiQu开发自己的生成器,你可以依据你的系统设计来把模型转换成自己选择的代码。
Tefkat是一种新型的宣告式模型转换语言适合于Model-Driven开发与数据转换。与XSLT不同,Tefkat有一套简单而且类似于SQL的语法,专门设计用于开发可扩展和可重复使用的模型转换规范。它利用高级Domain概念而不是直接操作XML语法。
Kermeta 是一种面向模型的语言填补了元语言如MOF,EMOF和Ecore的空白,这些元语言主要是集中于结构上的规范说明没有内置支持对行为的定义。 Kermeta是作为EMOF的一个扩展进行构建对它添加了可执行的语义。Kermeta能够模拟元模型,作为一种模型转换语言。 Kermeta完全与Eclipse相集成提供了一个解释器,调试器,编辑器,prototyper和各种各样的导入/导出转换功能。
Mod-Transf是一个基于XML与规则的转换语言。支持多种输入和输出模型包括:JMI, XML和对象图形。这种语言具有宣告式的语法,继承,自定义规则等特性。
Acceleo是一个开源的代码生成器设计成让每个人都能把MDA方法运用到开发过程中并且能够提高软件的开发效率。Acceleo包含一组工具和编辑器使得它易于学习而且适合任何类型的技术。Acceleo完全基于EMF,主要的特性如下:
*.支持任何元模型包括UML2.0,UML1.4(利用MDR桥)等。
*.语法着色的模板编辑器,内嵌元模型元素,脚本,服务自动完成功能和编辑查错等。
*.反射编辑器可准确,即时预览所生成的结果。
*.扮演一种"粘合剂"的执行链实现实际的项目生成,指定使用哪一种模型,生成什么和输出到哪里等一串动作。
*.类似于树结构的语法非常易于使用和掌握。
*.支持增量生成。
*.每次生成之后手动添加的代码将被保持,不会没掉。
BASEGen是一个开源基于AndroMDA的MDA代码生成工具。它能够以简单的方式从UML模型生成整个应用程序。BASEGen运用了一些最新的技术如:JSF,Hibernate,Spring Framework,Acegi Security和Maven。
10月14日
今日在家吃火锅,我弄的哟 , 火锅料又我进行二次加工,锅中翻抄 。
远看和近看 。
开动了
自己弄的香油调料
热气腾腾!
火红的锅底 ,Cool .
丫头吃不下了
今日启动电脑总是出现驱动错误 ,经过查找是npkcrypt的错误 , 对于这个问题,我百思不得其解。因为没有这项Windows 服务 。
经过上网查询,原来这是QQ2006里的一个Bug 。 其实是做安全加密的一个驱动,但2006卸载后,它不会自动被卸载。因此就出现了这样的问题 。 解决方法如下:
1、在“我的电脑”上点右键,选“管理”->“设备管理器”。
2、选择“查看”/“显示隐藏的设备”,在“非即插即用驱动程序”中选择“npkcrypt”,卸载之。
3、运行“regedit”,可能存在键项:“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\npkcrypt”或“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\npkcrypt”等,删除之。
4、如果QQ目录存在:npkcrypt.sys、npkcrypt.vxd、npkcusb.sys 三个文件,删除之。
5、下次启动后即可生效。
10月13日
原文出处:http://jroller.com/comments/dgeary/Weblog/
我的一个客户不知道该选用Struts还是JSF。就像你预料的那样,我通常会问:这2中框架之间有什么区别?当然,除了我的这个客户外很多人都面临这样的选择。
总的来说,我建议在新项目中优先考虑JSF。虽然常常有一些商业上的因素迫使我们为现有的项目选择了Struts,而且那些解决方案还有待考验,但是,让我们面对一个事实:JSF比Struts好多了。
下面是我选择JSF而不选Struts的十大理由:
1.Components(组件)
2.RenderKits
3.Renderers
4.ValueBindingExpressions(值绑定表达式)
5.EventModel(事件模型)
6.Extensibility(可扩展性)
7.ManagedBeans(DependencyInjection依赖注入)
8.POJOActionMethods
9.JSFisthestandardJava-basedwebappframework(JSF是javaweb应用程序的标准框架)
10.There'sonlyoneStruts(只有一个Struts)
1.Components(组件)
组件是Struts和JSF之间最大的区别。就像Swing一样,JSF提供丰富的底层构件去开发组件然后添加到标准的组件集。那些底层构件让你很容易的生成自己的组件并且和别人共享。现在我们到处都能看到自定义组件跳出来,比如说Oracle的ADF和MyFaces,两者都提供了丰富的组件集,就像javascript日历,tree等等。当然,组件只是一部分。典型的是,组件都和一个独立的renderer对应,这给我们带来了真正的好处(看第3条)。但是和JSF中的很多东西一样,你不一定要墨守成规。只要你愿意,你可以实现render自己的组件,虽然这样你会失去给组件加入别的renderer的能力。
2.RenderKits
在几年前我曾经有份Struts咨询工作,我们必须同时支持浏览器和无线设备,非常痛苦。但是用JSF来完成那个任务非常容易,因为你可以生成你自己的renderkit-为一种特定显示技术的renderers的集合-然后配置到JSF里面。
3.Renderers
你有看过Struts的标签的源代码吗?它直接生成HTML。JSF组件标签什么都不生成,它和服务器上的一对component-renderer对应。Component维护组件状态,rendered负责获得视图。重点是renderers是可插拔的,即你可以根据自己需求实现然后替代掉默认实现。比如说我在NFJS上面的Felix谈话中举例说明了怎么去实现一个自定义的labelrenderer。你只需要配置你的renderer,JSF就会自动在你的应用程序里面使用他。
4.ValueBindingExpressions(值绑定表达式)
在Struts中,你负责把数据从Form传递到模型对象。你实现的Action的execute方法是把Form作为一个参数。然后你再手动的把数据从FormBean里面取出放到模型对象里面。你要为应用里面的每个Form做这些事情,然而在JSF里面,你只需像这样:#{model.property}就够了,其他的交给JSF来处理。
5.EventModel(事件模型)
JSF的事件模型使你可以对值改变,动作,JSF生命周期阶段变换等作出反应。在JSF1.1中,那些事件都是在服务器端处理的,这肯定是一个缺陷,好在JSF2.0计划支持客户端事件,拭目以待吧。
6.Extensibility(可扩展性)
这个很重要。JSF有6个对象实现了这个框架的大部分功能,而且你可以很容易的用你自己的实现代替原有实现。比如你想加一个自定义参数在JSF表达式语言里面,或是添加一个自己的视图控制器以便于区分组件和HTML。事实上Shale实现了上面的功能。如果你还没有满足,JSF提供了几个地方你可以轻松的控制JSF的生命周期。Shale给你的会更多。
7.ManagedBeans(DependencyInjection依赖注入)和Spring一样,JSF也使用了依赖注入(DJ)(或控制反转(IoC))去实例化和初始化Bean。Struts的确为你生成了FormBean和ActionBean,但是JSF可以为你生成各种各样的ManagedBean。
8.POJOActionMethods
Struts的行为是和Struts的API绑定在一起的,但是JSF的行为方法可以在POJPO中实现。这意味着你不用在表单和模型对象之间实现一个多余的行为层。顺便说一下,在JSF里面没有行为对象,行为在模型对象中实现。但是也请注意一点:如果你愿意你也可以生成与JSF独立的行为对象。在Struts里面,你有FormBean和ActionBean。FormBean包含数据而ActionBean包含逻辑。OO狂会想去合并前2者,在Struts你办不到。但是在JSF中,你可以分开数据和逻辑,也可以合并到一个对象中,一切由你决定。
9.JSFisthestandard(JSF是标准)
JEE5.0要提供一个JSF的实现,这表明JSF不久将会无处不在。这可能与你无关,但是和工具供应商密切相关。现在大概有50个javaweb应用程序框架,工具供应商不会情愿去支持一个特别的框架,但是他们会毫不犹豫的去支持一个标准。而且不止供应商,开源项目也会迅速的聚集在JSF的四周,争先恐后的去实现相同的功能。比如说,直到我们去实现本质上和Shale的Tapestry差不多的视图的时候,我才知道Facalets。(从长远来看,我相信这种冗余是件好事,会给我们带来好处)
10.Struts是一个开源产品,然而JSF是一个标准。
这个细节常常被新的JSF学习者忽略,其实这是显而易见的,因为我们有多个JSF的实现。虽然JSF还很不成熟,但是我们已经有了2个优秀的JSF实现可以选择:Sun的参考实现和Apache的MyFaces。另一方面,我们只有一个Struts。