﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-花钱的年华-随笔分类-全部文档</title><link>http://www.blogjava.net/calvin/category/3382.html</link><description>依旧是JavaEE</description><language>zh-cn</language><lastBuildDate>Mon, 09 May 2011 03:45:17 GMT</lastBuildDate><pubDate>Mon, 09 May 2011 03:45:17 GMT</pubDate><ttl>60</ttl><item><title>转战微博去了</title><link>http://www.blogjava.net/calvin/archive/2011/05/09/349826.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 09 May 2011 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2011/05/09/349826.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/349826.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2011/05/09/349826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/349826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/349826.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近都实在憋不出什么花团锦簇的大块文章，还是安心在微博里碎碎念算了。  <br>地址： http://t.sina.com.cn/calvin1978 ，大家互相关注一下哦。 &nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2011/05/09/349826.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/349826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2011-05-09 11:24 <a href="http://www.blogjava.net/calvin/archive/2011/05/09/349826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次Java垃圾收集调优实战</title><link>http://www.blogjava.net/calvin/archive/2008/07/09/213535.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 09 Jul 2008 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2008/07/09/213535.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/213535.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2008/07/09/213535.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/213535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/213535.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: GC调优是个很实验很伽利略的活儿，最后服务的处理速度从1180 tps 上升到1380 tps，调整两个参数提升17%的性能还是笔很划算的买卖.....&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2008/07/09/213535.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/213535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2008-07-09 10:13 <a href="http://www.blogjava.net/calvin/archive/2008/07/09/213535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构师书单</title><link>http://www.blogjava.net/calvin/archive/2007/02/09/98914.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Fri, 09 Feb 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2007/02/09/98914.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/98914.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2007/02/09/98914.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/98914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/98914.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:      为了2007年的目标，列了下面待读或重读的书单。<br>   不在书单里的，小部分是我漏掉的，大部分是我觉得对于架构师不太重要，或者不够好的。<br>   奇怪国外真正的好书来来去去也就那么几本，emule加上国内出版社的努力，我们看的东西和老外已差不多，为什么老外看完就那么生猛，我们看完就还是半桶水呢。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2007/02/09/98914.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/98914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2007-02-09 09:44 <a href="http://www.blogjava.net/calvin/archive/2007/02/09/98914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0，Struts2.0，SpringSide 2.0--SpringSide 2.0M1 Release Notes</title><link>http://www.blogjava.net/calvin/archive/2006/11/28/83925.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 27 Nov 2006 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/11/28/83925.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/83925.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/11/28/83925.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/83925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/83925.html</trackback:ping><description><![CDATA[
		<p>   [摘要]Spring发了2.0，Struts发了2.0，SS也来凑凑2.0的热闹。下载地址：<span class="nobr"><a title="Visit page outside Confluence" href="http://www.springside.org.cn/download.php" rel="nofollow">http://www.springside.org.cn/download.php<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span></p>
		<p>    SpringSide 2.0改用了Pragmatic版的Struts作为MVC主打框架，重写了所有的代码，增加了新项目生成的命令和构件化的开源栈，还增加了方便新手入门的Helloworld示例。</p>
		<p>    随着Java开源社区的日日进步，SpringSide升级了包括Spring 2.0的AOP事务配置， Hibernate3.2的annotation模式，XFire1.2.2的最新简约配置及JSR181模式，以及ActiveMQ4.1 的Message Driven POJO新模式。</p>
		<p>    另外，还增加了iBatis数据访问模式和一系列Ajax Widgets，并全面推行了Selenium集成测试。</p>
		<p>    全文地址：<a href="http://blog.csdn.net/calvinxiu/archive/2006/11/28/1417730.aspx">http://blog.csdn.net/calvinxiu/archive/2006/11/28/1417730.aspx</a></p>
<img src ="http://www.blogjava.net/calvin/aggbug/83925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-11-28 00:16 <a href="http://www.blogjava.net/calvin/archive/2006/11/28/83925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给编程狂热者的ant task笔记</title><link>http://www.blogjava.net/calvin/archive/2006/09/07/68150.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 06 Sep 2006 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/09/07/68150.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/68150.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/09/07/68150.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/68150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/68150.html</trackback:ping><description><![CDATA[<p><a title="Visit page outside Confluence" href="http://www.blogjava.net/calvin/" rel=nofollow _fcksavedurl="http://www.blogjava.net/calvin/" linktype="raw" linktext="江南白衣|http://www.blogjava.net/calvin/"><font color=#002c99><sup></sup></font></a>&nbsp;</p>
<p>&nbsp;&nbsp; 这篇文档是专门写给那些编程狂热者，在Ant里编程时要留意的重要Task。<br><br>&nbsp;&nbsp;&nbsp; 不知为何，老外的各种脚本都写得格外漂亮。从Appfuse里学到很多，在编写<a href="http://wiki.javascud.org/display/springs/Home" _fcksavedurl="http://wiki.javascud.org/display/springs/Home">SpringSide2.0</a><img class=rendericon height=7 alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" width=7 align=absMiddle border=0 _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif">的构件安装脚本时又被迫自学了不少，这里作下总结。</p>
<p><img class=FCK__Anchor height=1 src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" width=1 _fckanchor="true" _fckrealelement="15" _fckfakelement="true"></p>
&nbsp;&nbsp; 全文地址：<a href="http://blog.csdn.net/calvinxiu/archive/2006/09/07/1187329.aspx">http://blog.csdn.net/calvinxiu/archive/2006/09/07/1187329.aspx</a> 
<img src ="http://www.blogjava.net/calvin/aggbug/68150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-09-07 00:34 <a href="http://www.blogjava.net/calvin/archive/2006/09/07/68150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QuickServer--在吵闹的环境里快速搭建自己的TcpServer(Pragmatic系列) </title><link>http://www.blogjava.net/calvin/archive/2006/08/12/63260.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 12 Aug 2006 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/08/12/63260.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/63260.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/08/12/63260.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/63260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/63260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 虽然现在已是Web Server, Web Service的天下，但偶然还是会因为性能苛刻，或者需要自定义协议的原因，很无辜的要自己做一个Multi-Thread，Multi-Client的Tcp Server。 超简单的QuickServer，让你专心编写自己的业务代码， 不用编写一行Tcp代码。[阅读全文]&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/08/12/63260.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/63260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-08-12 23:27 <a href="http://www.blogjava.net/calvin/archive/2006/08/12/63260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nutch 0.8笔记--Google式的搜索引擎实现 </title><link>http://www.blogjava.net/calvin/archive/2006/08/09/62507.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 09 Aug 2006 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/08/09/62507.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/62507.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/08/09/62507.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/62507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/62507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     Nutch是一个基于Lucene，类似Google的完整网络搜索引擎解决方案，基于Hadoop的分布式处理模型保证了系统的性能，类似Eclipse的插件机制保证了系统的可客户化，而且很容易集成到自己的应用之中。<br><br>    Nutch 0.8 完全使用Hadoop重写了骨干代码，另外很多地方作了合理化修正，非常值得升级。[阅读全文]<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/08/09/62507.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/62507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-08-09 09:42 <a href="http://www.blogjava.net/calvin/archive/2006/08/09/62507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringSide 1.0 M3-All in one 发布</title><link>http://www.blogjava.net/calvin/archive/2006/08/08/62274.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 08 Aug 2006 00:34:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/08/08/62274.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/62274.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/08/08/62274.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/62274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/62274.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个版本将是SpringSide1.0范围内最后一个跑马圈地，开疆拓土的版本。从下一个版本开始，将会把主要精力放在代码的细化，文档与测试用例的补充，以及在实际项目中的应用。<br><br>这个版本除了继续跑马圈地外，也对代码结构作了很多遍重构，终于使复杂的项目以比较顺眼的方式组织起来了。<br><br>&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/08/08/62274.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/62274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-08-08 08:34 <a href="http://www.blogjava.net/calvin/archive/2006/08/08/62274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype.js--Javascript编写者的小军刀</title><link>http://www.blogjava.net/calvin/archive/2006/06/17/53471.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 17 Jun 2006 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/06/17/53471.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/53471.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/06/17/53471.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/53471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/53471.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:    Prototype.js 是Javascript编写者的一把小军刀，提供了很多Ruby风格简写语法和实效的函数，更难得的是完全跨浏览器，让大家舒舒服服写出又精简又不用愁心兼容的的JS代码，springside 已经离不开它了。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/06/17/53471.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/53471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-06-17 13:58 <a href="http://www.blogjava.net/calvin/archive/2006/06/17/53471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2006年中 My Favorite Java Site</title><link>http://www.blogjava.net/calvin/archive/2006/06/06/50911.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 06 Jun 2006 13:20:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/06/06/50911.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/50911.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/06/06/50911.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/50911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/50911.html</trackback:ping><description><![CDATA[
		<p>1.<a href="http://www.theserverside.com/">TheServerside.com</a>  依然是地位无可动摇的CCTV1。</p>
		<p>2.<a href="http://www.infoq.com/">InfoQ.com</a> Floyd Marinescu 在离开 TSS 后另起炉灶，2006年中最重要推荐。视野不再局限于Java 而是包括Java,.Net, Ruby ,SOA, Agile方法等热门话题。</p>
		<p>3.<a href="http://java.sys-con.com/">JDJ的电子杂志</a> 在JDJ首页的最底处订阅，文章质量不低于5-7的传统三强。</p>
		<p>4.<a href="http://www.swik.net/">SWik.net</a>  收集了大量OpenSource Project的资源聚合。其中如Spring，Hibernate的更新度非常高，出现什么和Spring有关的blog,article,project都会马上被聚合。</p>
		<p>5.<a href="http://www-128.ibm.com/developerworks/java/">IBM DeveloperWorks</a> 传统、稳定的Java文章来源地。</p>
		<p>6.<a href="http://www.javaworld.com/">JavaWorld</a> 传统、稳定的Java文章来源地。</p>
		<p>7.<a href="http://www.onjava.com/">OnJava</a>  传统、稳定的Java文章来源地。</p>
		<p>8.<a href="http://artima.com/">Artima.com</a> 类似于TSS而略逊，其中<a href="http://www.artima.com/spotlight/">Spotlight </a>文章值得关注，而<a href="http://www.artima.com/news/community.jsp?forum=136">Java News</a>是聚合了所有其他Java站点的大聚合。</p>
		<p>9.<a href="http://www.javalobby.org/">JavaLobby</a>  站内的<a href="http://www.javalobby.org/forumRSS/17.xml">Announcements</a> 是大大小小Java  Project的发布声明区，<a href="http://www.javalobby.org/forumRSS/18032.xml">Trips and Tricks</a> 有很多的Tips。</p>
		<p>10. <a href="http://www.nofluffjuststuff.com/blogs_summary.jsp">No Fluff Just Stuff 的Blogs 聚合</a> 一直缺一个所有优秀Java Blogger的rss总聚合，NFJS这里勉强算一个。</p>
<img src ="http://www.blogjava.net/calvin/aggbug/50911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-06-06 21:20 <a href="http://www.blogjava.net/calvin/archive/2006/06/06/50911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Retrotranslator--将JDK5.0项目完全转换为JDK1.4 字节码的恩物</title><link>http://www.blogjava.net/calvin/archive/2006/04/27/43443.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 26 Apr 2006 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/04/27/43443.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/43443.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/04/27/43443.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/43443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/43443.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     因为Retrotranslator的出现，SpringSide 1.0终于放心升到JDK5.0，并保证仍然100%可以运行在JDK1.4的服务器上。<br>和Retroweaver一样，大家直接用JDK5开发，最后通过ASM转换到JDK1.4的字节码，部署到JDK1.4的运行环境。但它不仅支持JDK5的语法，还支持JDK5的新增API。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/04/27/43443.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/43443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-04-27 00:05 <a href="http://www.blogjava.net/calvin/archive/2006/04/27/43443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Message Driven POJO</title><link>http://www.blogjava.net/calvin/archive/2006/03/25/37356.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 25 Mar 2006 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/03/25/37356.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/37356.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/03/25/37356.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/37356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/37356.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《Effecitve Enterprise Java》的一个实践。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/03/25/37356.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/37356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-03-25 17:04 <a href="http://www.blogjava.net/calvin/archive/2006/03/25/37356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做环保主义者，用Maven2 管理Java类库</title><link>http://www.blogjava.net/calvin/archive/2006/03/19/36098.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sun, 19 Mar 2006 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/03/19/36098.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/36098.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/03/19/36098.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/36098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/36098.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     看着log4j-2.13.jar被每个项目每个版本里一次又一次无限下载，你就会觉得用Maven2 管理Library实在很环保。<br>     而且，Java的类库也急需摆脱这种无身份无地位一个jar包随处摆放的境况。Maven给Jar以名份是一个好方向。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/03/19/36098.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/36098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-03-19 20:59 <a href="http://www.blogjava.net/calvin/archive/2006/03/19/36098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UTF-8、Subversion、Maven2--2007年的项目特征</title><link>http://www.blogjava.net/calvin/archive/2006/03/19/36096.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sun, 19 Mar 2006 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/03/19/36096.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/36096.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/03/19/36096.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/36096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/36096.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有个地方恰似美好未来，就是被赶鸭子上架的springside了。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/03/19/36096.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/36096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-03-19 20:42 <a href="http://www.blogjava.net/calvin/archive/2006/03/19/36096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>八卦Sourceforge后台的空间规则</title><link>http://www.blogjava.net/calvin/archive/2006/02/27/32725.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 27 Feb 2006 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/02/27/32725.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/32725.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/02/27/32725.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/32725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/32725.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:    SourceForge用了许多年，最近才靠springside混进了它的后台。八卦一把去sf混个房间有什么好处，还有它以什么规则，维持这么大一间善堂的运作。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/02/27/32725.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/32725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-02-27 20:41 <a href="http://www.blogjava.net/calvin/archive/2006/02/27/32725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>春节推荐读书单</title><link>http://www.blogjava.net/calvin/archive/2006/01/24/29085.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 24 Jan 2006 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/01/24/29085.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/29085.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/01/24/29085.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/29085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/29085.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:    似乎老外有这个习惯，逢年过节都会推荐一些书大家在家里充电。&nbsp;&nbsp;<a href='http://www.blogjava.net/calvin/archive/2006/01/24/29085.html'>阅读全文</a><img src ="http://www.blogjava.net/calvin/aggbug/29085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-01-24 12:00 <a href="http://www.blogjava.net/calvin/archive/2006/01/24/29085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迟到的模仿：JDBC 3.0 RowSet，类似于ADO的编程方式 </title><link>http://www.blogjava.net/calvin/archive/2006/01/14/28046.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 14 Jan 2006 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/01/14/28046.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/28046.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/01/14/28046.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/28046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/28046.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp; JDBC有够慢的，出到了3.0了才有个Rowset能类似于windows下ADO的概念，却还是达不到ADO.net的水平。幸亏Java里ORM这块比较争气，趁着C#的ObjectSpace跳票，可以继续耀武扬威。 
<P>&nbsp;&nbsp;Rowset对比于ResultSet，除了不用保持Connecton外，更重要特点是能够类似于ADO的编程方式，直接对Row赋值来进行Insert与Update， 而不用写SQL语句。&nbsp;&nbsp; 在windows编程中经常可见这种模式，特别是ADO.net用的好时，ORM也只能算是锦上添花....</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 在oracle的sample代码中，rowset02.java完整demo了RowSet的ADO模式。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 简化后的代码如下：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;RowSet02<BR>&nbsp;{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main&nbsp;(String&nbsp;[]args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try<BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OracleCachedRowSet&nbsp;crowset&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;OracleCachedRowSet&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.setUrl&nbsp;(java:oracle:oci8:@);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.setUsername&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hr</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crowset.setPassword&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hr</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">Select</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.setCommand&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">SELECT&nbsp;seatno,&nbsp;tdate,&nbsp;name,&nbsp;class&nbsp;FROM&nbsp;reservation</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.execute&nbsp;();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println&nbsp;(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Seat&nbsp;no&nbsp;&nbsp;Travel&nbsp;Date&nbsp;&nbsp;Name&nbsp;&nbsp;&nbsp;Class</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">&nbsp;(crowset.next&nbsp;())&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printRow&nbsp;(crowset);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.setReadOnly&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">Update</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.beforeFirst&nbsp;();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(crowset.absolute&nbsp;(</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">))<BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.updateString&nbsp;(</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Business</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.updateRow&nbsp;();<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">Insert</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.beforeFirst&nbsp;();&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;crowset.moveToInsertRow&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.updateInt&nbsp;(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">107</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;crowset.updateDate&nbsp;(</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Date&nbsp;(</SPAN><SPAN style="COLOR: #000000">975915381774L</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.updateString&nbsp;(</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Pluto</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.insertRow&nbsp;();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">Delete</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.beforeFirst&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(crowset.absolute&nbsp;(</SPAN><SPAN style="COLOR: #000000">6</SPAN><SPAN style="COLOR: #000000">))&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.deleteRow&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crowset.acceptChanges&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crowset.close&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(SQLException&nbsp;ea)&nbsp;<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ea.printStackTrace&nbsp;();&nbsp;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;}</SPAN></DIV><img src ="http://www.blogjava.net/calvin/aggbug/28046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-01-14 19:18 <a href="http://www.blogjava.net/calvin/archive/2006/01/14/28046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORM透明持久化方案面对的共同困境</title><link>http://www.blogjava.net/calvin/archive/2006/01/05/26791.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Thu, 05 Jan 2006 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/01/05/26791.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/26791.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/01/05/26791.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/26791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/26791.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/">江南白衣</A>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp; 上次FB的吹水摘录：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 除JDBC外的数据访问技术包括EJB，Hibernate，JDO，iBatis等，但凡是ORM的总要面对相同的困境，如果透明持久化的，苦恼就更多 --Java数据访问技术依然在缓慢跨越鸿沟，.Net社区的同学用不着眼热心跳：<BR><BR><STRONG>&nbsp;&nbsp;&nbsp;&nbsp; 1.查询语言--纷纷重回原来极想摆脱的sql，但实现得又不如SQL成熟。</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为QueryObject，Criteria&nbsp;API的可读性太差，最后所有技术方案都回到它们原来一力想摆脱的SQL的路上。而且，因为是重新仓促设计，都不如sql 的成熟，总有很多做不到的地方。像刚开始的EJB QL，几乎什么都做不了，而hibernate 3.0 HQL把h2的代码抛弃了重新实现才达到相对满意的水平。<BR><BR>&nbsp;&nbsp;&nbsp; <STRONG>2.积极载入和懒惰载入--不能如sql般每次随需定制<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORM与jdbc访问的区别，就是以包含关联对象的对象，而不是以sql自由定制的ResultSet，作为数据载入的主体。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 积极载入策略在载入订单对象时，会接着载入顾客对象、产品对象，而如果产品对象又包含类别对象时.....整个数据库被拖了一小半出来。即使不玩连连看，clob对象的胡乱载入就够头痛了。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与此对应的就是懒惰载入策略，比如EJB的初始版本，据闻每个属性查询一次数据库，数据库往返次数多得吓人。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORM方案会让用户自行定义这两种策略来达到平衡。一般默认采用积极载入，在一对多关联上定义lazy load，还有统一定义积极载入的层数。到了hibernate 3，更可以在列级别上定义lazy load。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题是，上述的定义都在hbm文件，<STRONG>每种对象的载入策略只能定义一次</STRONG>。而不能像jdbc那样，<STRONG>根据不同的情况select不同的结果列</STRONG>。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;顺带一个问题是那些信息不完全对象，比如产品只有序号和名字，不带其他信息时，在一个纯面向对象环境里不好表示，hibernate提供的component方案也不是太好。<BR><BR><STRONG>3.透明持久化--对POJO的一些临时操作也会被持久化</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为持久化是透明的，很容易就会误用，对POJO进行的一些临时操作，一不小心就被保存进数据库中。再加上Session，事务的混乱，远远没有用jdbc跑DML语句那么容易搞清楚发生的事情。<BR><BR>&nbsp;&nbsp;&nbsp; 而且，不是每个程序员都能习惯新的透明持久化环境，都对所用ORM系统的持久化策略理解深刻。何况这些策略以及整合它们的框架如Spring，还经常毫无提示的在升级时发生改动!!!<BR><BR>&nbsp;&nbsp;&nbsp; 所以，每个使用ORM的团队，在项目过程里总会有闹鬼的几天......<BR><img src ="http://www.blogjava.net/calvin/aggbug/26791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-01-05 21:22 <a href="http://www.blogjava.net/calvin/archive/2006/01/05/26791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>启动SpringSide--Promatic Enterprise Application KickStart项目</title><link>http://www.blogjava.net/calvin/archive/2006/01/02/26347.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 02 Jan 2006 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2006/01/02/26347.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/26347.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2006/01/02/26347.html#Feedback</comments><slash:comments>79</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/26347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/26347.html</trackback:ping><description><![CDATA[
		<p>作者：<a href="http://calvin.blogjava.net/">江南白衣</a>    <br /><br />    <a href="http://www.springside.org.cn/">SpringSide--Pragmatic Enterprise Application KickStart and Common Library Stack</a>，这么长的一个名字下来，不用解释大家都知道是做什么的了----以Spring Framework为core，提供一个Pragmatic的企业应用开发基础和最佳实践展示。<br /><br />   <strong>定位：</strong>为使用Spring框架的开发者提供一个非Demo版的复杂、正式而体现最佳使用实践的参照系统。 </p>
		<p designtimesp="7969">   <strong>目标：</strong>囊括JavaEE必须面­对的所有问题的合理的、合乎实践标准的解决方案，采用Plugins形式组织，使开发者可快速定位所需的参考方案并做加法到自己的系统。<br /> <br />    项目网站：<a href="http://www.springside.org.cn/">http://www.springside.org.cn</a> <br />    or <a href="http://springside.sourceforge.net/">http://springside.sourceforge.net</a><br />  <br />    1<strong>. Featrue List</strong>    </p>
		<ul designtimesp="7976">
				<li designtimesp="7977">
						<a href="http://www.springframework.org/" target="_blank" designtimesp="7978">Spring 2</a> - J2EE Framework. 
</li>
				<li designtimesp="7979">
						<a href="http://www.hibernate.org/" target="_blank" designtimesp="7980">Hibernate 3</a> - ORM, support EJB3/JPA1.0 in future. 
</li>
				<li designtimesp="7981">
						<a href="http://www.springframework.org/" target="_blank" designtimesp="7982">Spring MVC</a> /<a href="http://www.opensymphony.com/webwork/" target="_blank" designtimesp="7983">WebWork</a> - Multi-Action Web framework. 
</li>
				<li designtimesp="7984">
						<a href="http://java.sun.com/products/jsp/" target="_blank" designtimesp="7985">JSP2.0</a> - View Template. 
</li>
				<li designtimesp="7986">
						<a href="http://xfire.codehaus.org/" target="_blank" designtimesp="7987">XFire</a> - Web Service. 
</li>
				<li designtimesp="7988">
						<a href="http://www.acegisecurity.org/" target="_blank" designtimesp="7989">Acegi</a> - Security, RBAC ana ACL.(doing) 
</li>
				<li designtimesp="7990">
						<a href="http://www.eclipse.org/birt/" target="_blank" designtimesp="7991">Eclipse BIRT 2</a> - Report Engine.(doing) 
</li>
				<li designtimesp="7992">
						<a href="http://www.drools.org/" target="_blank" designtimesp="7993">Drools 3</a> - Business Rule engine.(doing) 
</li>
				<li designtimesp="7994">
						<a href="http://www.activemq.org/" target="_blank" designtimesp="7995">ActiveMQ</a> ,<a href="http://jencks.org/" target="_blank" designtimesp="7996">Jencks</a> - JMS Message Driven POJO. 
</li>
				<li designtimesp="7997">
						<a href="http://www.opensymphony.com/quartz/" target="_blank" designtimesp="7998">Quartz</a> - Enterprise job scheduler. 
</li>
				<li designtimesp="7999">
						<a href="http://getahead.ltd.uk/dwr/" target="_blank" designtimesp="8000">DWR 2</a> , <a href="http://prototype.conio.net/" target="_blank" designtimesp="8001">Prototype.js</a> , <a href="http://trimpath.com/project/wiki/JavaScriptTemplates" target="_blank" designtimesp="8002">TrimPath JSTemplate</a>   - Ajax 
</li>
				<li designtimesp="8003">
						<a href="http://www.compassframework.org/" target="_blank" designtimesp="8004">Compass</a> - Search engine use <a href="http://lucene.apache.org/" designtimesp="8005">Luecene</a> .(doing) 
</li>
				<li designtimesp="8006">
						<a href="http://groovy.codehaus.org/" target="_blank" designtimesp="8007">Groovy</a> - Dynamic script language.(doing) 
</li>
				<li designtimesp="8008">
						<a href="http://openi.sourceforge.net/" target="_blank" designtimesp="8009">Openi</a> - BI web application for OLAP Report.(doing) 
</li>
				<li designtimesp="8010">
						<a href="http://www.servicemix.org/" target="_blank" designtimesp="8011">ServiceMix</a> - ESB(Enterprise Service Bus) and JBI.(doing) 
</li>
				<li designtimesp="8012">
						<a href="http://jakarta.apache.org/commons/validator/" target="_blank" designtimesp="8013">Commons Validator</a> - client and server side validation. 
</li>
				<li designtimesp="8014">
						<a href="http://www.opensymphony.com/sitemesh/" target="_blank" designtimesp="8015">SiteMesh</a> web-page layout and decoration framework. 
</li>
				<li designtimesp="8016">
						<a href="http://www.opensymphony.com/oscache/" target="_blank" designtimesp="8017">OSCache</a> - Web cache solution. 
</li>
				<li designtimesp="8018">
						<a href="http://www.extremecomponents.org/" target="_blank" designtimesp="8019">ExtremeTable</a> - JSP Tag Libraries. 
</li>
				<li designtimesp="8020">
						<a href="http://logging.apache.org/log4j/docs/" target="_blank" designtimesp="8021">Log4j</a> - Logging tool. 
</li>
				<li designtimesp="8022">
						<a href="http://ant.apache.org/" target="_blank" designtimesp="8023">Ant</a> , <a href="http://maven.apache.org/" target="_blank" designtimesp="8024">Maven2</a> , <a href="http://www.junit.org/" target="_blank" designtimesp="8025">JUnit</a>, <a href="http://www.easymock.org/" target="_blank" designtimesp="8026">EasyMock</a> - Build and Test tools. 
</li>
				<li designtimesp="8027">UTF-8 and I18N. 
</li>
				<li designtimesp="8028">Intergrate with <a href="http://www.bea.com/" target="_blank" designtimesp="8029">Weblogic</a> , <a href="http://tomcat.apache.org/" target="_blank" designtimesp="8030">Tomcat</a> , <a href="http://www.jboss.org/" target="_blank" designtimesp="8031">JBoss</a> , <a href="http://geronimo.apache.org/" target="_blank" designtimesp="8032">Geronimo</a>. 
</li>
				<li designtimesp="8033">And we are choising the Workflow solution. </li>
		</ul>
		<li>
				<br /> <br />    2<strong>. </strong><a href="http://www.springside.org.cn/"><strong>SpringSide</strong></a><strong>与Appfuse有什么不同？</strong><br />    1.<a href="http://www.springside.org.cn/">SpringSide</a>较完整的演示了企业应用的各个主题，而Appfuse只有简单的登陆界面和用户管理。<br /><br />    2.<a href="http://www.springside.org.cn/">SpringSide</a>是深受Ruby on Rails影响的Pragmatic型的方案。<br /><br />    3.Appfuse主要目的是展示各式mvc、orm方案与Spring的结合，有些技术属于高手玩具，而<a href="http://www.springside.org.cn/">SpringSide</a>展示的是一个国内项目的实际形态，并带中文手册与大量中文代码注释<br /><br />    4<strong>. 脚本细节</strong><br />  SpringSide的基本结构是JDK1.4 + <a href="http://www.springframework.org/" designtimesp="10588">Spring 2.0</a> + <a href="http://www.hibernate.org/" designtimesp="10589">hibernate3</a> + Spring MVC multi-action + JSP2.0。<br designtimesp="10590" /><br designtimesp="10591" />    使用<a href="http://xfire.codehaus.org/" designtimesp="10592"> XFire</a>提供WebService订书的服务端接口和 Java版/.Net版的客户端示范代码。<br designtimesp="10593" /><br designtimesp="10594" />    店员是个兼职的学生，所以系统会为每张订单发一封通知邮件给店员。为了不影响顾客下单的速度，发信的动作由jms异步进行。<br designtimesp="10595" />    <br designtimesp="10596" />    系统还会用<a href="http://www.opensymphony.com/quartz/" designtimesp="10597"> Quartz</a>定时扫描缺货的图书，用邮件通知店员。<br designtimesp="10598" />    <br designtimesp="10599" />    老板只负责看一些色彩丰富，带图的报表。Eclipse Birt2.0提供日常报表 ，<a href="http://openi.sourceforge.net/" designtimesp="10600"> Openi</a>提供BI OLAP的。<br designtimesp="10601" /><br designtimesp="10602" />    基于<a href="http://lucene.apache.org/" designtimesp="10603">Lucene</a>的<a href="http://www.compassframework.org/" designtimesp="10604"> Compass</a>做的图书全文搜索。<br designtimesp="10605" /><br designtimesp="10606" />    基于<a href="http://drools.codehaus.org/" designtimesp="10607"> Drools</a>规则引擎的订单满100元免运费，会员积分制等。      <br designtimesp="10608" /><br designtimesp="10609" />    店面演示Ajax效果与<a href="http://www.opensymphony.com/oscache/" designtimesp="10610"> OSCache</a>的Web Cache，<a href="http://www.opensymphony.com/sitemesh/" target="_blank" designtimesp="10611">SiteMesh</a>的渲染效果使用。 <br designtimesp="10612" /><br designtimesp="10613" />    一些非关键业务，用<a href="http://groovy.codehaus.org/" designtimesp="10614"> Groovy</a>动态语言来快速开发。<br designtimesp="10615" /><br designtimesp="10616" />   <a href="http://logging.apache.org/log4j/" designtimesp="10617"> log4j</a>系统将重要操作员日志异步写入数据库，使它们可管理。<br designtimesp="10618" /><br designtimesp="10619" />    综合的<a href="http://www.acegisecurity.org/" target="_blank" designtimesp="10620">Acegi</a> i安全权限管理。<br designtimesp="10621" /><br designtimesp="10622" />    utf-8, i18n的国际化项目。 
<p designtimesp="10623">   <a href="http://www.servicemix.org/" target="_blank" designtimesp="10624">ServiceMix</a> ，WorkFlow的故事设计中。<br /><br /><strong>    5. RoadMap</strong><br />    <a href="http://jira.javascud.org/secure/BrowseProject.jspa?id=10001&amp;subset=-1">Road Map in  JIRA Issue Checker </a>,欢迎大家提出更多Topic<br />    .<br />    6<strong>. 团队成员列表 </strong>(排名按加入顺序)<br />   <br />     欢迎朋友们加入。人多速度快是很重要的事情。<br /><br />   参加方式有3种<br />   1.帮忙codereview提意见<br />   2.到<u><font color="#800080">JIRA</font></u>里面领任务<br />   3.到<font color="#0000ff"><font color="#800080"><u>JIRA</u></font></font><font color="#000000"> 提出新任务 <br /><br />  真正贡献了力量的同志自然会成为开发人员. <br /><br />   <br />    <strong>Team Worker</strong>：<br />     江南白衣，cac，@_@，wuyu，charlse, efa，yimlin  <br />     <strong>Contributor：</strong><br />     water ye ，totodo，david.turing，pesome，oofrank<br />  <br />     <strong>长老供奉：</strong><br />      庄表伟，Robbin<br /><br />     (排名按加入时间）<br /><br /><strong>7. 交流区</strong></font></p></li>
		<li>
				<a href="http://demo.springside.org.cn/springside/" target="_blank">演示站点 </a>
		</li>
		<li>
				<a href="http://jira.javascud.org/secure/BrowseProject.jspa?id=10001&amp;subset=-1" target="_blank">开发RoadMap</a>
		</li>
		<li>
				<a href="http://spring.jactiongroup.net/viewforum.php?f=18" target="_blank">Spring中文论坛专区 </a>
		</li>
		<li>
				<a href="http://blog.springside.org.cn/" target="_blank">团队开发日志 </a>
				<a href="http://www.springside.org.cn:8080/springside/browse/SPRINGSIDEJIRA" target="_blank">
				</a>
				<a href="http://www.springside.org.cn:8080/springside/secure/IssueNavigator.jspa?reset=true&amp;pid=10000&amp;fixfor=10000" target="_blank">
						<br />
						<br />
				</a>开发者QQ群：15690287 (only for Springside developer)<br />用户QQ群: 21601442</li>
<img src ="http://www.blogjava.net/calvin/aggbug/26347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2006-01-02 17:47 <a href="http://www.blogjava.net/calvin/archive/2006/01/02/26347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在厨房，车顶，草地上使用Spring</title><link>http://www.blogjava.net/calvin/archive/2005/12/30/26015.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Fri, 30 Dec 2005 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/30/26015.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/26015.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/30/26015.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/26015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/26015.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/">江南白衣</A>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp; Spring再强大，也要面对降临的问题--因为Spring不是Weblogic、Tomcat般的顶层容器，Servlet和EJB对象不由它创建，所以它必须要降临到Weblogic、Tomcat所在的位面。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 初学者一般不用管那么多，照着Spring+hibernate+Struts之类的Sample就做了，但慢慢的，也许就要开始在jsp+javabean体系，土制框架，singleton类等环境下使用Spring了。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 《Professional Java Development with the Spring Framework》第3章有"Managing the Containe"一节讲这个问题。一般可以分为直接召唤系与IoC fashion两类。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>1.直接召唤系--Singleton的Application Context</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最简单的，就像在UnitTest里那样，直接构造Application Context：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">ApplicationContext&nbsp;ctx&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ClasspathXmlApplicationContext(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ApplicationContext.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Web环境里，会使用ContextLoader构造ApplicationContext后，压进Servlet Context。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由ContextLoaderListener或ContextLoaderServlet，在Web应用启动时完成。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后在Jsp/Servelet中，可以通过Servlet Context取得ApplicationContext： 
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">ApplicationContext&nbsp;context&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;WebApplicationContextUtils.getWebApplicationContext(application);</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;但像singleton类或者EJB中，就没有Servlet Context可用了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果全部像UnitTest那样直接构造，速度就会很不堪。自然的，就想到把ApplicationContext做成单例。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring提供了<SPAN class=fixed>ContextSingletonBeanFactoryLocator这样的物体。<BR></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先搞一个beanRefFactory.xml，里面写上所有的applcationContext-*.xml文件名，并把Context命名为"default-context"： 
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">beans</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">bean&nbsp;id</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">default-context</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.springframework.context.support.ClassPathXmlApplicationContext</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">constructor</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">arg</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">list</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">value</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">applicationContext.xml</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">value</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">list</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">constructor</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">arg</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">bean</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">beans</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN></DIV><BR>&nbsp; 然后让loactor去找它，但代码有点长： 
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">BeanFactoryReference&nbsp;bfr&nbsp;<SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;DefaultLocatorFactory.getInstance().useBeanFactory(<SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">default-context</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);</SPAN><BR></SPAN><SPAN style="COLOR: #000000">BeanFactory&nbsp;factory&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;bfr.getFactory();<BR>MyService&nbsp;myService&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;factory.getBean(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">myService</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>bfr.release();<BR></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;now&nbsp;use&nbsp;myService</SPAN></DIV><BR><BR>&nbsp;&nbsp;&nbsp; 上面的代码实在是太灵活，太麻烦了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>还不如自己实现一个简单的Singleton，扩展ContextLoaderListener类，在Web系统启动时压入Singleton。<BR><BR>&nbsp;&nbsp;&nbsp; </STRONG>新的ContextLoaderListener类重载如下，ContextUtil中包含一个静态的ApplicationContext变量：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN><SPAN style="COLOR: #000000">.contextInitialized(event);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext&nbsp;context&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;event.getServletContext();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;WebApplicationContextUtils.getRequiredWebApplicationContext(context);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContextUtil.setContext(ctx);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></DIV><BR>&nbsp;&nbsp; 用家可直接取用：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&nbsp;ApplicationContext&nbsp;context&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ContextUtil.getContext();</SPAN></DIV><BR><BR><STRONG>2.IoC fashion</STRONG><BR>&nbsp;&nbsp;&nbsp; 如果所有地方都使用直接召唤系，那就反而是在打Rod的耳光了。因为他一直都反对代码与框架深耦合的。<BR>&nbsp;&nbsp;&nbsp; 所以，更好的方法是写一些glue code、base class来完成Spring的降临，而不让应用代码察觉Spring Application Context的存在。<BR>&nbsp;&nbsp;&nbsp;&nbsp;不过，因为各个框架的结构不同，Rod也没办法讲出一个通用的整合方法，所以建议大家尽量学习已整合的各种框架，如Spring MVC、Struts的种种方式，写出自己的简单整合代码来。<BR><BR>&nbsp;&nbsp;&nbsp; 只有不确定的调用某些Singleton类，不适合过早ioc的情况，可以使用直接召唤系。<BR><img src ="http://www.blogjava.net/calvin/aggbug/26015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-30 10:40 <a href="http://www.blogjava.net/calvin/archive/2005/12/30/26015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全球四大Java研讨会</title><link>http://www.blogjava.net/calvin/archive/2005/12/22/25034.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Thu, 22 Dec 2005 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/22/25034.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/25034.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/22/25034.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/25034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/25034.html</trackback:ping><description><![CDATA[作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>每年的全球四大Java研讨会，它们的agenda，给大家提供了一个捉摸Java时尚风向的便利。<BR>每年花几天看一遍它们的报道和share出来的slides，是CTO该做的事情。<BR><BR>PS. 如果你被邀在哪里做讲演，又想不到给下面那些似睡似醒的猪头说什么的，可以从中参考一二。<BR>PS2.在迷宫一样的网站中翻滚了半个小时，把agenda和slides的链接都整理了出来，便人便己。<BR><BR><A href="http://javasymposium.techtarget.com/">TheServerSide Symposium</A> 对很多人来说，TheServerSide才是真正的Java官方社区--<A href="http://javasymposium.techtarget.com/html/js_at_a_glance.htm">06年的agenda</A>。<BR><BR><A href="http://javapolis.com/">JavaPoils</A> 欧洲最大的Java研讨会--<A href="http://www.javalobby.org/articles/javapolis2005/">05年报道</A>，<A href="http://www.javalobby.org/av/javapolis/">04年完整Slides</A>，<A href="http://www.javapolis.com/confluence/display/JP05/JavaPolis+Conference+Slides">05年(1)pdf陆续补全中</A>，<A href="http://www.javapolis.com/confluence/display/JP05/JavaPolis+University+Slides">05年(2)pdf</A>，<A href="http://wiki.javapolis.com/confluence/display/JP05/JavaPolis+2004+talks">04年的talk</A>&nbsp;(需简单注册）。<BR><BR><A href="http://java.sun.com/javaone/">Java One</A> 官方，官方.....--<A href="http://www.onjava.com/pub/a/onjava/2005/06/29/javaone2005.html">05年报道</A>，<A href="http://developers.sun.com/learning/javaoneonline/">05,04年的ppt</A>。<BR><BR><A href="http://www.nofluffjuststuff.com/">No&nbsp;Fluff Just Stuff tour</A>&nbsp; 简称NFJS的大马戏团，最近的<A href="http://www.thespringexperience.com/">Spring Experience</A>也是和它一起搞的<BR>--<A href="http://www.javalobby.org/articles/nfjs/">05年某次的报道</A>，<A href="http://www.nofluffjuststuff.com/past.jsp">过往的Agenda</A>，<A href="http://www.nofluffjuststuff.com/blogs_summary.jsp">Spearker的blog聚合</A>。<img src ="http://www.blogjava.net/calvin/aggbug/25034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-22 10:57 <a href="http://www.blogjava.net/calvin/archive/2005/12/22/25034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个２００５年末典型的Java EE场景</title><link>http://www.blogjava.net/calvin/archive/2005/12/17/24335.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 17 Dec 2005 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/17/24335.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/24335.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/17/24335.html#Feedback</comments><slash:comments>54</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/24335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/24335.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>　俗话说得好，没吃过猪肉不要紧，没见过猪跑路就很没面子了。新公司上班一周，主要就是看猪跑路，2005年末，一个典型的Java EE项目，场景是这样的：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;1.一台内存强得变态的<A href="http://www.sun.com/">Sparc</A>呼哧呼哧的在跑<A href="http://www.oracle.com/database/">Oracle 10g</A>。<BR><BR>&nbsp;&nbsp;&nbsp; 2.它的一个兄弟，共享T3阵列，静静的跑<A href="http://www.veritas.com/">vcs</A>&nbsp;为它做着双机热备份。<BR><BR>&nbsp;&nbsp;&nbsp; 3.两台<A href="http://www.bea.com">Weblogic 9</A>做群集负责后台管理。<BR>　&nbsp;&nbsp; 编程模式是最老土的<A href="http://struts.apache.org/">struts</A>+<A href="http://www.springframework.org/">spring</A>+<A href="http://www.hibernate.org/">hibernate</A>，再蹭一点<A href="http://www.ajaxian.com/">Ajax</A>。<BR><BR>&nbsp;&nbsp;&nbsp; 4.四台<A href="http://www.bea.com/">Weblogic 9</A>做群集负责前台门户。<BR>　&nbsp;&nbsp; 最直接的jsp + javabean，用weblogic的tag作了页面Cache。<BR>　&nbsp;&nbsp; weblogic还发布了一堆Web Service接口，也不时调用一下合作伙伴提供的WS。<BR>　&nbsp;&nbsp; 最后还有一伙定时Task在奔跑，有些是自动改变帐单状态，有些是自动把数据导出，ftp到合作伙伴那。<BR><BR>&nbsp;&nbsp;&nbsp; 5. 一台<A href="http://www.businessobjects.com/">Crystal Reports XI</A> 的报表服务器。<BR>　&nbsp;&nbsp; 逻辑都用PL/SQL封装在SP和中间表里，设计报表时直接取用便是，不沾一丝Java代码的烟火。<BR>　&nbsp;&nbsp; PS. 这台也是唯一的Windows Server，<BR><BR>&nbsp;&nbsp;&nbsp; 6. 还有一些跑Tomcat（省钱)的独立小应用，一些C写的任务，零散的分布在上面9台服务器的角落。<BR><BR><BR>&nbsp; </P><img src ="http://www.blogjava.net/calvin/aggbug/24335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-17 11:47 <a href="http://www.blogjava.net/calvin/archive/2005/12/17/24335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软DSL开始搞局UML，四夷同贺</title><link>http://www.blogjava.net/calvin/archive/2005/12/07/22914.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 07 Dec 2005 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/07/22914.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/22914.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/07/22914.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/22914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/22914.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>&nbsp;&nbsp; 今天CSDN的头条是微软DSL 对决 UML，虽然不是什么新闻了，但还是很开心。因为我实在很不喜欢基于UML2.0的所谓MDA。<BR>&nbsp;&nbsp;&nbsp; <STRONG>某人说，世界上没有无缘无故的爱，却有无缘无故的恨，尤其在网络上。</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;所以我很不喜欢UML三友。<BR>&nbsp;&nbsp;&nbsp;&nbsp;因为(<A href="http://feelyou.blogjava.net">非鱼</A>批：不是说无缘无故么?) UML中除了Class图、顺序图、交互图，其他如部署图之类的，根本就是急就章，估计也就花了三友宝贵的十分钟设计出来的，也没多大用处。而Class图和顺序图，换作诸位看官，回家憋几天也能设计出个八九不离十的式样出来。就这么点东西，值得捧到高高的神坛上坐这么久不下来么？<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>第二不喜欢基于UML的MDA。</STRONG>UML作为沟通工具还好，但想用tagged value表达整个系统作为代码生成的依据，就像想拿XML来描述整个商业系统、商业逻辑一样。看这些年来，工具开发商浪费了这么多人月，除了实际帮了不少研究生的毕业论文外，再没多少成果了。（那些有限的生成效果，随便一个xml文件或者PowerDesigner放开手脚做一下也不差多少)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;但就是这个三友和UML，把业界向更高一级语言迈进的希望死死绑在一辆战车上一绑就是好几年，<STRONG>现在终于有一个出来搞局的了</STRONG>，而且还是手臂足够粗大的微软，就象Spring 搞了EJB2的局一样，怎不叫我这种蛮夷拍手叫好？&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;甚至不用管微软的设计最后是否成功(不过开发领域，微软还没有过完全失败的产品)，只要把局搞乱，我就很高兴。何况，我也是个DSL爱好者。<img src ="http://www.blogjava.net/calvin/aggbug/22914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-07 21:35 <a href="http://www.blogjava.net/calvin/archive/2005/12/07/22914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学Geronimo玩票式的用开源软件组装AppServer</title><link>http://www.blogjava.net/calvin/archive/2005/12/05/22528.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 05 Dec 2005 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/05/22528.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/22528.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/05/22528.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/22528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/22528.html</trackback:ping><description><![CDATA[<DIV class=postcontent>作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>昨天看J2EE 5规范的时候，八卦看了下如果自己要组装一个Application Server需符合的规范：<BR><STRONG>EJB容器:<BR></STRONG>Enterprise JavaBeans (EJB) 3.0 <U><FONT color=#800080><A href="http://jcp.org/en/jsr/detail?id=220">(JSR-220)</A><BR></FONT></U>Java Message Service (JMS) 1.1<BR>Java Transaction API (JTA) 1.1 <BR>Java Authorization Service Provider Contract for Containers (JACC) 1.1<A href="http://jcp.org/en/jsr/detail?id=115"> </A><BR>Java Platform, Enterprise Edition Management API 1.1&nbsp; <A href="http://jcp.org/en/jsr/detail?id=77">(JSR-77)</A><BR>Java Platform, Enterprise Edition Deployment API 1.2<BR>Java EE Connector Architecture 1.5<BR><BR><STRONG>Web:</STRONG><BR>JavaServer Faces 1.2 <A href="http://jcp.org/en/jsr/detail?id=252">(JSR-252)</A><BR>Servlet 2.5 <BR>JavaServer Pages (JSP) 2.1<BR>Standard Tag Library for JavaServer Page &nbsp;(JSTL) 1.2 <A href="http://jcp.org/en/jsr/detail?id=52">(JSR-52)</A><BR><BR><STRONG>Web Services:</STRONG><BR>JavaAPI for XML Web Services (JAX-WS) 2.0<BR>JavaArchitecture for XML Binding (JAXB) 2.0 <A href="http://www.jcp.org/en/jsr/detail?id=222">(JSR-222)</A><BR>Web Services Metadata for the Java Platform 1.1 <A href="http://jcp.org/en/jsr/detail?id=181">(JSR-181)</A><BR>Web Services for Java EE 1.2 <A href="http://jcp.org/en/jsr/detail?id=109">(JSR-109)</A><BR>Java API for XML-based RPC (JAX-RPC) 1.1<BR>SOAP with Attachments API for Java (SAAJ) 1.3<BR>Java API for XML Registries (JAXR) 1.0<BR><BR><STRONG>Other:</STRONG><BR>JavaMail 1.4<BR>JavaBeans Activation Framework 1.1<BR>Streaming API for XML (StAX) 1.0&nbsp; <A href="http://jcp.org/en/jsr/detail?id=173"><U><FONT color=#0000ff>(JSR-173)</FONT></U><BR></A>Common Annotations for the Java Platform 1.0 <A href="http://jcp.org/en/jsr/detail?id=250">(JSR-250)</A><BR>Debugging Support for Other Languages <A href="http://jcp.org/en/jsr/detail?id=45">(JSR-45)&nbsp;</A><BR><BR>再看<A href="http://geronimo.apache.org/">Geronimo</A>的做法，不由觉得好好笑，它居然玩票式的组了一队开源软件来应付这些规范(不过止应付到J2EE1.4)：<BR><BR>1.<A href="http://tomcat.apache.org/">Tomcat</A>/<A href="http://jetty.mortbay.org/jetty/index.html">Jetty</A> ，应付了Web方面的Servlet 2.5 、JSP、JSTL。<BR><BR>2.<A href="http://ws.apache.org/axis/">Axis</A>包了WebService方面的所有东西，<A href="http://ws.apache.org/scout/">Apache scout</A>包JAXR。<BR><BR>3.<A href="http://openejb.codehaus.org/">OpenEJB</A>&nbsp;应付&nbsp; EJB2.1，这是整个链条里最勉强的部分。另外它也准备EJB3的开发了。<BR><BR>4.&nbsp;<A href="http://activemq.codehaus.org/">ActiveMQ</A>管JMS，<A href="http://mx4j.sourceforge.net/">MX4J</A>管JMX，<A href="http://forge.objectweb.org/projects/jotm/">JOTM</A>管事务，<A href="http://forge.objectweb.org/projects/howl/">HOWL</A>作事务日志。<BR><BR>5.<A href="http://wadi.codehaus.org/">WADI</A> - a clustering, load-balancing and fail-over solution <BR>具体请看 《<A class=fbox href="http://www.ibm.com/developerworks/cn/java/j-geron2/"><B><FONT color=#996699>Geronimo！第 2 部分: 驯服 J2EE 1.4 这匹野马</FONT></B></A>》<BR><BR>除了上述规范，<A href="http://geronimo.apache.org/">Geronimo</A>还整合了<A href="http://www.springframework.org">Spring</A>和支持JBI的<A href="http://servicemix.codehaus.org">ServiceMix</A>，一共用到了50多个开源项目，几乎把<A href="http://www.apache.org">Apache</A>，<A href="http://www.codehaus.org">CodeHaus</A>上的项目一网打尽，伯乐过而北群空了。这样拉大旗建AppServer的方式，的确打破了某种市场状态，模糊了Application Server的界限，好好玩。<BR><BR><A href="http://geronimo.apache.org/">Geronimo</A>这种疯狂整合靠的是它的GBean架构，具体看《<A class=fbox href="http://www.ibm.com/developerworks/cn/opensource/os-ag-thirdparty/"><B><FONT color=#996699>将第三方组件集成到 Geronimo 中</FONT></B></A>》，而GBean之间的引用和交互，则靠<A href="http://cglib.sourceforge.net/">cglib</A>生成的动态代理。有时间要具体学习一下这种全包容的架构，不知是先进还是落后。<BR><BR><STRONG>PS . TSS 最近两天的三条消息</STRONG><BR>1.<A title="There are new messages is this thread since your last visit" href="http://www.theserverside.com/news/thread.tss?thread_id=37949">Terracotta announces Clustered Spring Runtime</A>&nbsp;--Terracotta 为Spring加入了集群能力。<BR>2.<A title="There are new messages is this thread since your last visit" href="http://www.theserverside.com/news/thread.tss?thread_id=37941">JBoss adds Arjuna transaction engine</A>&nbsp;-- Jboss整合了原来HP旗下BlueStone AppServer的事务技术，支持WebService事务。<BR>3.<A title="There are new messages is this thread since your last visit" href="http://www.theserverside.com/news/thread.tss?thread_id=37934">jManage 1.0, JMX client, released</A>--&nbsp;一个有Web版(这点比Mx4J好啊)和Console版的JMX client。<BR><BR>传统Applicaton Server供应商的日子越来越不好过了。<BR><BR></DIV><img src ="http://www.blogjava.net/calvin/aggbug/22528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-05 11:30 <a href="http://www.blogjava.net/calvin/archive/2005/12/05/22528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又到预测时，what will be cool in 2006?</title><link>http://www.blogjava.net/calvin/archive/2005/12/04/22390.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Sat, 03 Dec 2005 18:49:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/12/04/22390.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/22390.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/12/04/22390.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/22390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/22390.html</trackback:ping><description><![CDATA[作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>2005就这样完了，<A href="http://www.onjava.com/lpt/a/6397">ONJava的年终总结: 2005 Year in Review</A>。<BR>TSS年初开会时讲得专家们自己都开始有点厌倦的EJB3，JSF1.2，Ajax，AOP的三宗合一，SOA和ESB，Groovy，还是没有一个stable的东西出来。<BR><BR>眼看2006，又是继续将这些话题变成产品的一年，让我们继续讨论厌烦：<BR><BR><STRONG>*Full stack Application Framework: </STRONG><A href="http://www.springframework.org/"><STRONG>Spring 2.0&nbsp;</STRONG></A>&nbsp;<BR>&nbsp;&nbsp;<A href="http://jroller.com/page/raible?entry=the_spring_experience_rod_johnson">Spring 2.0吹风会兼FB大会</A>刚刚开过。夜观星象，Spring气数未尽，开源社区里也只它有资格不断整合别人。<BR>&nbsp;&nbsp;另一个Stack名曰<A href="http://rifers.org/">RIFE</A>，不过比较独。<BR>&nbsp; 另外，JBoss搜刮的JEMS (JBoss Enterprise Middleware)和JSF+EJB3的<A href="http://www.jboss.com/products/seam">Seam</A>也会继续发音。<BR><BR>*<STRONG>Web Framework：JSF 1.2<BR>&nbsp;</STRONG>&nbsp;最怕别人问现在开项目用哪个Framework好，选来选去暂时还是投靠标准好了。<BR>&nbsp; 不知道<A href="http://struts.apache.org/struts-sandbox/struts-ti/index.html">Struts Ti</A>，<A href="http://struts.apache.org/shale/">Struts Shale</A>，Spring MVC的2006会怎样。<BR>&nbsp;&nbsp; 而Continuations这个名词明年也许会闪亮一下。<BR><BR>*<STRONG>Persist Framework： </STRONG><A href="http://www.hibernate.org/"><STRONG>Hibernate 3.1</STRONG></A>&nbsp;(EJB3/JPA1)&nbsp;<BR>&nbsp;&nbsp;在<A href="http://ar.rubyonrails.com/">RoR的Active Record</A>刺激下，annotaion 和default mapping终究要替代xml描述文件。<BR>&nbsp;&nbsp; 另外，除了麻烦的ORM，也很希望有一个极简的JDBC Framework，不知道JDBC4.0和Spring跑JDK1.5的SimpleJdbcTemplate什么样子。<BR><BR><STRONG>*Web Service Framework：</STRONG><A href="http://xfire.codehaus.org/"><STRONG>XFire</STRONG></A>&nbsp;(JAX-WS2.0、JAXB 2.0)<BR>&nbsp; SOA 风潮下的next-generation SOAP Framework，支持JavaEE 5的JAX-WS2.0、JAXB 2.0与annotation，还拖上了<A href="http://www.springframework.org/">Spring</A>的手。<BR>&nbsp; <A href="http://ws.apache.org/axis/">Axis</A>的事实标准地位该不保了吧。<BR><BR><STRONG>*JBI-ESB：</STRONG><A href="http://www.servicemix.org/"><STRONG>ServiceMix</STRONG></A><STRONG>&nbsp;<BR></STRONG>&nbsp; 2006年的新大热名词--JBI(Java Business Intergrade)与ESB(Enterprise Service Bus)。<BR><BR><STRONG>*Java Rule Engine与JDM 2.0</STRONG><STRONG>：</STRONG><A href="http://drools.codehaus.org/"><STRONG>Drools</STRONG></A><BR>&nbsp;&nbsp; Rule Engine和Data Mining 已经说了很久，不知道明年又如何。但Drools则演绎了一条标准的成名路：<BR>&nbsp;&nbsp;&nbsp;1.先入CodeHaus再入Jboss<BR>&nbsp;&nbsp; 2.（号称）集成Spring<BR>&nbsp;&nbsp; 3. 提供Eclipse的插件<BR><BR><STRONG>*动态语言嵌入：</STRONG><A href="http://groovy.codehaus.org/"><STRONG>Groovy&nbsp;</STRONG></A><BR>&nbsp;&nbsp;期待在Ruby的不断刺激下，1.0正式版发布后的正式用家。<BR><BR><STRONG>*some Ajax Framework</STRONG><BR>&nbsp;&nbsp;&nbsp;<A href="http://www.amowa.net/buffalo/">Buffalo</A>, Prototype, Dojo, MochiKit, DWR 混战之下总该有脱颖而出者吧？<BR><BR><STRONG>*AOP三宗归一</STRONG><BR>&nbsp; 虽然大家还很少在应用中使用它，AOP在Spring 中的作用却非常明显。不知道Spring2.0是否可以三宗归一，给出一个框架设计时使用的简单方案。<BR><img src ="http://www.blogjava.net/calvin/aggbug/22390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-12-04 02:49 <a href="http://www.blogjava.net/calvin/archive/2005/12/04/22390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web Alignment Group成立与WebWork-Struts合并</title><link>http://www.blogjava.net/calvin/archive/2005/11/30/22005.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Wed, 30 Nov 2005 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/11/30/22005.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/22005.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/11/30/22005.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/22005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/22005.html</trackback:ping><description><![CDATA[&nbsp; 作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>&nbsp; 今天的一条八卦，在Asp.net 2.0与<A href="/calvin/archive/2005/11/22/20938.html">Rails系</A> <A href="http://www.rubyonrails.com/">RoR</A>/<A href="http://www.djangoproject.com/">DJango</A>/<A href="http://www.turbogears.org/"><FONT color=#366900>Turbogears</FONT></A>的两面夹击下，Java Web Framework的大佬们终于看到狼来了，坐下来，吃个包，开始商量合作。<BR>&nbsp;&nbsp; 消息在TSS主编<A href="http://www.almaer.com/blog/archives/001112.html">Dion Almaer的Blog</A>上看到，再看这个<SPAN class=logoSpaceLink><A href="http://opensource2.atlassian.com/confluence/oss/display/WAG">Java Web Alignment Group</A> </SPAN>，果然阵容鼎盛，36个Member，江湖上大部分大佬都到齐了。<A href="http://groups.yahoo.com/group/java_web_alignment/">Yahoo Group</A>免费参观，不过他从2005.11.10号开始就已经没有贴子---歇菜了。<BR><BR>
<TABLE class=confluenceTable>
<TBODY>
<TR>
<TH class=confluenceTh>Framework</TH>
<TH class=confluenceTh>Group Members</TH></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://beehive.apache.org/" rel=nofollow>Beehive<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Rich Feit </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://appfuse.dev.java.net/" rel=nofollow>AppFuse<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Matt Raible </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://www.jcp.org/en/jsr/detail?id=252" rel=nofollow>JavaServerFaces<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Ed Burns, Kito Mann, Craig McClanahan, Roger Kitain, Jacob Hookom, James Mitchell, Adam Winer</TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://myfaces.apache.org/" rel=nofollow>MyFaces<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Bill Dudney, Ted Husted, James Mitchell, Travis Reeder </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://www.jboss.com/products/seam" rel=nofollow>Seam<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Gavin King, Jacob Hookom </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://rifers.org/" rel=nofollow>RIFE<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Geert Bevin, JR Boyens, Keith Lea </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://www.springframework.org/" rel=nofollow>Spring MVC and Web Flow <SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Alef Arendsen, Keith Donald </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://stripes.mc4j.org/" rel=nofollow>Stripes<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Tim Fennell </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://struts.apache.org/" rel=nofollow>Struts Classic<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Don Brown, Ted Husted, James Mitchell, Hubert Rabago, Niall Pemberton </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://struts.apache.org/shale/index.html" rel=nofollow>Struts Shale<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Craig McClanahan </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://struts.apache.org/struts-sandbox/struts-ti/index.html" rel=nofollow>Struts Ti<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Don?, Rick?, Patrick?, James?</TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://www.opensymphony.com/webwork/" rel=nofollow>WebWork<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Patrick Lightbody </TD></TR>
<TR>
<TD class=confluenceTd><SPAN class=nobr><A title="Visit page outside Confluence" href="http://wicket.sourceforge.net/" rel=nofollow>Wicket<SUP><IMG class=rendericon height=7 alt="" src="http://opensource2.atlassian.com/confluence/oss/images/icons/linkext7.gif" width=7 align=absMiddle border=0></SUP></A></SPAN> </TD>
<TD class=confluenceTd>Eelco Hillenius </TD></TR></TBODY></TABLE><BR>&nbsp;&nbsp;&nbsp;上面的名单已成历史，唯一有趣的是Tapestry并不在列。<BR>&nbsp;&nbsp; 这个Group的最后成果就是Struts和Webwork上演了一出你的名字我的名字的<SPAN class=nobr><A title="Visit page outside Confluence" href="http://struts.apache.org/struts-sandbox/struts-ti/index.html" rel=nofollow>Struts Ti</A>&nbsp;。---"以Struts为名字，Webwork为核心，加上Beehive的annotataion和pageflow，再提升与JSF的集成能力"。可惜Spring MVC暂时不会加入，而JSF系如何合并还未知。最期待的，是它的Phase 2--zero congfig file。</SPAN><BR><img src ="http://www.blogjava.net/calvin/aggbug/22005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-11-30 17:05 <a href="http://www.blogjava.net/calvin/archive/2005/11/30/22005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenLaszlo 3.1发布--重拾几乎遗忘的RIA理想</title><link>http://www.blogjava.net/calvin/archive/2005/11/29/21806.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 29 Nov 2005 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/11/29/21806.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/21806.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/11/29/21806.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/21806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/21806.html</trackback:ping><description><![CDATA[<P>&nbsp; 作者：<A href="http://calvin.blogjava.net/">江南白衣</A>&nbsp;&nbsp;&nbsp;<BR><BR><STRONG>&nbsp; 一年前，RIA新浪潮。<BR></STRONG>&nbsp; 1.以新的Web控件代替复杂dhtml对控件的模拟；<BR>&nbsp; 2.以重返C/S的用户体验代替传统http的提交-返回模式，开发模式上甚至可以直接调用商业对象。<BR>&nbsp; RIA一出现就尽获民心。但，Flex因为收费，XUL因为终端，XAML因为无期，OpenLaszlo因为出身与性能.......渐渐退出了大家的嘴边，他们也的确不争气，又一年过去了，都没再弄出大的声响。<BR><BR>&nbsp; 这一年大家做什么呢，是忽然走红的ajax，来实现RIA中不刷新页面的承诺，还有高级如<A href="http://www.getahead.ltd.uk/dwr/">DWR</A><FONT size=2>，<A href="http://json-rpc.org/">JSON-RPC</A></FONT>，同样实现RIA中对商业对象的直接调用。<BR>&nbsp; 之前有<A href="http://www.nextapp.com/products/echo2/">ECHO2</A>，而最近出现的一个框架叫<A href="http://zk1.sourceforge.net/">ZK1</A>，开发人员用XUL来开发，然后臂大力雄的框架会把XUL渲染成dhtml+ajax，算是一种有趣的思路。<BR>&nbsp;&nbsp; 但我还是觉得，浏览器应该升级，而不是靠复杂的dhtml+ajax来模拟，我是革命派，不是改良派，相对于全体民众花在模拟上的成本，浏览器的升级要简单得多。<BR><BR>&nbsp; 前几天因为想在blog上弄点小花样，去了基于OpenLaszlo的<A href="http://www.blogbox.com/">blogbox</A>。再回头，发现OpenLaszlo已经发布到3.1版本。<BR><BR>&nbsp;<STRONG> OpenLaszlo 3.1版本升级良多，已解决性能与中文问题。</STRONG><BR>&nbsp; *新版本可以编译为Flash 6、7、8的格式，性能上突飞猛进，不再是以前吃资源的巨怪。<BR>&nbsp; *支持Unicode，支持中文了。<BR>&nbsp; *支持SOLO deploy了，也就是不再要求Servlet Container，也可以deploy到IIS和Apache。<BR>&nbsp; 其他还有Drawing API，Charting Components，Dynamic Libraries，Ajax API等一系列升级。<BR><BR><STRONG>&nbsp;OpenLaszlo3.1的编程体验<BR></STRONG>&nbsp;1.不愧曾是.com的产物，在Windows 下点了两下next就装完了，而且已有了整套的开发环境，10秒钟之后，我开始在my-apps目录写我的helloworld.lzx，然后刷新页面看结果。<BR>&nbsp;<BR>&nbsp;2.XML格式的控件定义，JavaScript作为脚本语言，再加上完备的tutorial、reference文档和demo code，又和<A href="/calvin/archive/2005/11/18/20403.html">wxWidgets</A>那样，基本上没什么特别要学的东西，直接可以开始编码了。<BR><BR>&nbsp;3.为什么RIA要比模拟RIA要好？<BR>&nbsp;开篇两点之外，OpenLaszlo还可以自由定义控件的layout，比用table、div的做法自由。<BR>&nbsp;另外，OpenLaszlo还可以简单的利用现有控件，定义新的控件和式样。<BR><BR><STRONG>&nbsp;对OpenLaszlo有不满意吗？</STRONG><BR>&nbsp;&nbsp;有阿，用户社群太少。还有控件的默认式样也比Flex的差一截，虽说可以自己customize，但不是每个人都那么有空的呀。还有那个<A href="http://eclipse.org/laszlo/">IBM友情客串的IDE</A>，啥时候才弄得像个样嘛。<BR><BR><STRONG>&nbsp; Flex ,XUL又在做什么？<BR></STRONG>&nbsp; <A href="http://labs.macromedia.com/">Flex2 </A>摆出的阵仗显然胜于OpenLaszlo：<BR>&nbsp; Flex Framework 2, Flex Builder 2,Flex Enterprise Services 2,Flex Charting Components 2<BR>&nbsp; 但，公无收费，公竟收费，&amp;*(^%，当奈公何。<BR><BR>&nbsp; XUL呢，新出的Firefox1.5只是Firefox1.0的补完，看不出FF2.0的痕迹，一年了。</P><img src ="http://www.blogjava.net/calvin/aggbug/21806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-11-29 12:23 <a href="http://www.blogjava.net/calvin/archive/2005/11/29/21806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java下的框架编程(5)--cglib的应用 </title><link>http://www.blogjava.net/calvin/archive/2005/11/28/21741.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Mon, 28 Nov 2005 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/11/28/21741.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/21741.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/11/28/21741.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/21741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/21741.html</trackback:ping><description><![CDATA[   作者：<a href="http://calvin.blogjava.net/">江南白衣</a> <br /><br />   反射、Proxy和元数据是Java最强的三个特征，再加上<a href="http://cglib.sf.net/">CGLib (Code Generation Library)</a>和ASM，使得Java虽然没有Ruby，Python般后生可畏，一样能做出强悍的框架。<br />   Proxy可以看作是微型的AOP，明白提供了在继承和委托之外的第三个代码封装途径，只要有足够的想象力，可以做得非常好玩，Spring的源码里用Proxy就用得很随便，看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法，基于接口的用proxy,否则就用cglib。AOP么，一般小事非compoent一级的就不麻烦AspectJ出手了。<br /><br />    cglib的Enhancer说起来神奇，用起来一页纸不到就讲完了。<br />    它的原理就是用Enhancer生成一个原有类的子类，并且设置好callback到proxy， 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object intercept(Object o,Method method,Object[] args,MethodProxy proxy)</span></div><br /> 在intercept()函数里，你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数，在执行前后加入自己的东西，改变它的参数值，也可以瞒天过海，完全干别的。说白了，就是AOP中的around advice。 <br /><p>    AOP没有出现以前，该领域经典的设计模式是Decorator，像Java IO Stream的设计就是如此.不过，如果为每个DAO, 每个方法的写Decorator函数会写死人的，所以用上cglib的好处是一次过拦截所有方法。 <br /><br />     另外，cglib除了Enhancer之外，还有BulkBean和Transform，都是Hibernate持久化的基础，但文档贫乏，一时还没去看怎么用。<br /><br /><strong>1.AOP里讲了一百遍阿一百遍的log aspect在cglib是这样做的:<br /></strong></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><br />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> LogDAOProxy </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> MethodInterceptor<br />   {<br />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Logger log</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Logger.getLogger(LogDAOProxy.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Enhancer enhancer</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Enhancer();<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回DAO的子类</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">       </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object getDAO(Class clz)<br />       {<br />           enhancer.setSuperclass(clz);<br />           enhancer.setCallback(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enhancer.create();<br />       }<br />       </span><span style="COLOR: #008000">//默认</span><span style="COLOR: #008000">的拦截方法</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Throwable<br />      {<br />           log.info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">调用日志方法</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">method.getName());<br />           Object result</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">proxy.invokeSuper(o,args);<br />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> result;<br />      }<br />   }</span></div><br />    应用的代码:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">    LogDAOProxy proxy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LogDAOProxy();<br />    GoodsDAO  dao </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (GoodsDAO)proxy.getDAO(GoodsDAO.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />    dao.insert(goods);</span></div><br /><strong>2<font size="2">.而在Spring的管理下应该略加修改的高级Decorator</font><br /></strong>   上面的例子用<span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enhancer.create();创建子类实例，但在Spring管理下，一些Bean的实例必须由Spring来创建和管理，而不由enhancer来创建的。所以我对上述用法略加修改，使它真正当一个Proxy的角色，请对比黑体字的部分<br /></span><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> LogDAOProxy </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> MethodInterceptor<br />  {<br />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Logger log</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Logger.getLogger(LogDAOProxy.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />     <strong>  </strong></span><strong><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Object dao</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">null</span></strong><span style="COLOR: #000000"><strong>;</strong><br />       </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Enhancer enhancer</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Enhancer();<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回DAO的子类</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">       </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object getDAO(Class clz,Object dao)<br />       {<br />           </span><strong><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.dao </span><span style="COLOR: #000000">=</span></strong><span style="COLOR: #000000"><strong> dao;<br /></strong>           enhancer.setSuperclass(clz);<br />           enhancer.setCallback(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> enhancer.create();<br />       }      <br />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">默认的拦截方法</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Throwable<br />      {<br />           log.info(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">调用日志方法</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">method.getName());<br />           <strong>Object result</strong></span><span style="COLOR: #000000"><strong>=</strong></span><span style="COLOR: #000000"><strong>proxy.invoke(dao, args);</strong><br />           </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> result;<br />      }<br />  }</span></div><br />可见，原来模式里在getDao()时由enhancer创建dao，而 调用intercept时则将enhancer创建的dao以Object o参数传回。<br />而新模式里，dao在getDao()时从外面传入，enhancer.create()返回的是一个proxy. 而调用intercept时，实际会用之前传入的dao进行操作，而忽略Object o参数传入的proxy.<br /><br />有点遗憾, intercept函数里MethodProxy的Signature是固定的 , 即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String);<br /><br /><br /><strong>系列文章：<br /></strong><a id="_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl12_DayItem_DayList__ctl1_TitleUrl" href="/calvin/archive/2005/10/14/15527.html"><font color="#366900">Java下的框架编写(1)--序</font></a><br /><a id="_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl8_DayItem_DayList__ctl1_TitleUrl" href="/calvin/archive/2005/10/27/17059.html"><font color="#366900">Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台</font></a> <br /><a id="_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl4_DayItem_DayList__ctl3_TitleUrl" href="/calvin/archive/2005/11/16/20047.html"><font color="#366900">Java下的框架编程(3)--关于反射的碎话</font></a> <br /><a id="_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl" href="/calvin/archive/2005/11/25/21412.html"><font color="#366900">Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round</font></a> <br /><a href="/calvin/archive/2005/11/28/21741.html">Java下的框架编程(5)--cglib应用</a><br />Java下的框架编程(6)--asm(待写)<img src ="http://www.blogjava.net/calvin/aggbug/21741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-11-28 22:49 <a href="http://www.blogjava.net/calvin/archive/2005/11/28/21741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java下的框架编程(4)--Annotation vs XML  vs Interface 最新一Round</title><link>http://www.blogjava.net/calvin/archive/2005/11/25/21412.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Fri, 25 Nov 2005 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/11/25/21412.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/21412.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/11/25/21412.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/21412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/21412.html</trackback:ping><description><![CDATA[作者：<A href="http://calvin.blogjava.net/">江南白衣</A>&nbsp;<BR><BR><STRONG>1.因为两者的用途不同，所以Annotation与XML应该并存<BR></STRONG><BR>　Anootation vs XML 到了现在，在Spring和EJB3各占一边的持续演示下，各自的用途已清晰。<BR>&nbsp;&nbsp; 虽然两者之间完全可以相互替代，没有绝对不能做的事情，但却存在好不好的问题，两者的用途不同，应该并用：<BR><BR>&nbsp;&nbsp; "size=10，db_user=ito"这样的参数，仍然适合放在XML，YAML(ruby)，properties，ini文件里。<BR>&nbsp;&nbsp;&nbsp; 而Annotation中所放，是真正程序的一部分，是旧编程体系中所缺的那一块东西。<BR>　看看编程语言的发展：<BR>&nbsp;&nbsp;&nbsp;&nbsp;一开始只是函数的封装；<BR>&nbsp;&nbsp;&nbsp; 到了OO语言，对象有了自己的属性和方法；<BR>&nbsp;&nbsp;&nbsp; 到了框架满天飞的年代，这些属性和方法又有了自己的属性，来告诉框架如何为自己提供服务。比如Spring和EJB3，POJO就用配置信息来告诉框架无侵入的提供服务。整个进化的过程非常自然。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;因为这些信息本来就是程序的一部分，所以应该仍然放在Code里头，Spring把它割裂到XML明显影响了代码的阅读。<BR><BR><STRONG>2.Anotation/XML&nbsp;PK Interface，Spring 无侵入性的基础</STRONG><BR>&nbsp;&nbsp;&nbsp;<A href="/chelsea/archive/2005/09/16/13132.html">切尔斯基的Blog讲了Annotation/XML&nbsp;对Interface的PK</A>。这次PK，也可以认为是Spring 对 EJB2.1在框架无侵入性上的一次PK。<BR>&nbsp;&nbsp; 在EJB2.1时代，POJO必须通过接口来向框架声明一些东西，这就造成了框架的侵入性，强迫POJO实现一堆接口。而Spring，把这些元信息搬到了XML配置文件。<BR>　在Spring里随便就可以举个例子。比如一个POJO，在Spring为它进行依赖注入A和B后，需要根据A和B来装配一个内部属性C，这样就需要再跑一个init()函数。Spring提供两种方式，一种侵入性的，实现InitializingBean接口的afterPropertiesSet()函数供Spring调用。&nbsp;&nbsp;&nbsp;而另一种是无侵入性的，在Bean的xml节点里面自行定义init函数的名字。<BR><BR><STRONG>３.Annotation目前的弱点<BR></STRONG>　一是Hibernate、Struts、三姑妈、四姨婆的annotation如果一股脑儿的全堆在可怜的POJO上很没人道，如果三姑六婆都抢Transation这个Anontation就更惨了。<BR>&nbsp;&nbsp;&nbsp; 二是annoation的表达能力有限，不如XML的强。<BR><BR><STRONG>4.JSR250 - Common Annotations for the Java</STRONG><BR>&nbsp;&nbsp;&nbsp; <A href="http://www.jcp.org/en/jsr/detail?id=250">Final Draft已经发布</A>，八卦回来一看，也只是多定义了几个Common Annotation而已。<BR>&nbsp;&nbsp; <STRONG>1.Generated</STRONG>&nbsp; 自动生成的代码要用此声明，而且必须说明工具的名称，如@Generated(“com.sun.xml.rpc.AProcessor”)<BR><BR>&nbsp;&nbsp;&nbsp;<STRONG>2</STRONG>.<STRONG>Resource/Resources</STRONG> 就是EJB3里面用的资源引用。<BR><BR>&nbsp;&nbsp; <STRONG>3.PostConstruct / PreDestroy</STRONG> 声明那些如题的函数。<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 还有一些安全方面的annotation，不关心。<BR><BR><BR><STRONG>文章：</STRONG><BR><A id=_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl12_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/10/14/15527.html"><FONT color=#366900>Java下的框架编写(1)--序</FONT></A><BR><A id=_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl8_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/10/27/17059.html"><FONT color=#366900>Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台</FONT></A>&nbsp;<BR><A id=_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl4_DayItem_DayList__ctl3_TitleUrl href="/calvin/archive/2005/11/16/20047.html"><FONT color=#366900>Java下的框架编程(3)--关于反射的碎话</FONT></A>&nbsp;<BR><A id=_c1cbf1ec6ec6fa1_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl href="/calvin/archive/2005/11/25/21412.html"><FONT color=#366900>Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round</FONT></A>&nbsp;<BR><A href="/calvin/archive/2005/11/28/21741.html">Java下的框架编程(5)--cglib应用</A><BR>Java下的框架编程(6)--asm(待写)<BR><BR>&nbsp;&nbsp; <BR><img src ="http://www.blogjava.net/calvin/aggbug/21412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-11-25 12:43 <a href="http://www.blogjava.net/calvin/archive/2005/11/25/21412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各系Rails大点兵</title><link>http://www.blogjava.net/calvin/archive/2005/11/22/20938.html</link><dc:creator>江南白衣</dc:creator><author>江南白衣</author><pubDate>Tue, 22 Nov 2005 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/calvin/archive/2005/11/22/20938.html</guid><wfw:comment>http://www.blogjava.net/calvin/comments/20938.html</wfw:comment><comments>http://www.blogjava.net/calvin/archive/2005/11/22/20938.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/calvin/comments/commentRss/20938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvin/services/trackbacks/20938.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 作者：<A href="http://calvin.blogjava.net/"><FONT color=#366900>江南白衣</FONT></A>&nbsp;<BR><BR>&nbsp;&nbsp; 不知道明年今日，会不会出现一队只会用Ruby On Rails的毕业生，像当年的asp、jsp、php迅速剿了C++/perl的CGI那样，把我们给剿了。同好们劝我，根据大公司经济学，这基本不会发生。<BR><BR>&nbsp;&nbsp;&nbsp; 在茫茫的框架之海认出一个Rails框架，基本上靠四个特征<BR>&nbsp;&nbsp;&nbsp; 1.一门动态语言<BR>&nbsp;&nbsp;&nbsp; 2.一个extreme simple to use的ORM框架<BR>&nbsp;&nbsp;&nbsp; 3.一个extreme simple to use的MVC框架<BR>&nbsp;&nbsp;&nbsp; 4.一些自动生成代码的命令、模版<BR>&nbsp;&nbsp;&nbsp;&nbsp;其余ajax、web service、i18n等特性自由扩展<BR><BR>&nbsp;&nbsp; <STRONG>1.Ruby: <A href="http://www.rubyonrails.com/">Ruby on Rails</A></STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rails系的旗手，一己之力搞得J2EE阵营鸡飞蛋打。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;旗手的作用表现在：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*最接近1.0的版本，目前已出到最后一个RC版 <A href="http://weblog.rubyonrails.com/articles/2005/11/07/rails-1-0-rc4-0-14-3-its-the-final-countdown">1.0 rc4(0.14.3)</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *拥有一本amazon超级畅销的《Agile Web Development with Rails》，而且这本书的组织也好，part I是一个渐进的sample application 让你快速入门，partII是几个重要领域的深入介绍。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*拥有自己的IDE: <A href="http://www.radrails.org/">RadRails</A>&nbsp;，基于Eclipse但独立成军，目前出到0.5。(是不是怕惨了Eclipse的多变，现在这些IDE的发行版本开始反包含了Eclipse在内。)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>2.Python: </STRONG><A href="http://www.djangoproject.com"><STRONG>DJango</STRONG></A><STRONG>、</STRONG><A href="http://www.turbogears.org/"><STRONG>turbogears</STRONG></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 认识不深，所以<A href="http://www.djangoproject.com">DJango</A>请看<A href="http://www.donews.net/limodou/">limodou的blog</A>，<A href="http://www.turbogears.org/">turbogears</A>看<A href="http://xlp223.yculblog.com">xlp123的</A>。<BR><BR>&nbsp;&nbsp;&nbsp; <STRONG>3.Groovy: </STRONG><A href="http://grails.codehaus.org/"><STRONG>grails</STRONG></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果能顺产，绝对是J2EE阵营里感情分最高涨的项目。因为它语言用Groovy，ORM用annotation版Hibernate，MVC用Spring。不用担心它换汤不换药，因为经过extreme的封装，再结合Groovy，绝对不再是原来的Spring+Hibernate，而是和RoR差不多的一样东西了。不信可以看看他的Sample。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过这个项目的源码目录树非一般的乱，也还没有0.1版释出。还有一样奇怪的事情，这个Groovy项目，大多数的class代码都是Java写的。<BR><BR>&nbsp;&nbsp;&nbsp; <STRONG>4.Php: </STRONG><A href="http://www.symfony-project.com"><STRONG>symfony</STRONG></A><STRONG> ,</STRONG><A href="http://cakephp.org/"><STRONG>cake</STRONG></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 据说<A href="http://cakephp.org/">cake</A>比<A href="http://www.symfony-project.com">symfony</A>弱非常多，所以没看。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; symfonys是基于php5的项目，成功整合了<A href="http://propel.phpdb.org">Propel</A>(ORM)、<A href="http://www.mojavi.org">Mojavi3</A>(MVC)，再配合自动生成的脚本打造而成。看他的sample，最后整合出来的东西也很Rails了，除了ORM层的xml文件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还有一个发现是Php项目现在可以用pear来安装，很像Ruby的gem，Java的Maven要努力了。<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">C:/&gt;pear&nbsp;channel</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">discover&nbsp;pear</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">symfony</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">project</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">com&nbsp;<BR>C:/&gt;pear&nbsp;install&nbsp;symfony</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">symfony</SPAN></DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样就装完了symfonys和propel&amp;croel, mojavi3,还有用来运行脚本命令的pake(php make)，PHing(php ant?)，一大堆东西。<BR><BR><img src ="http://www.blogjava.net/calvin/aggbug/20938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvin/" target="_blank">江南白衣</a> 2005-11-22 13:16 <a href="http://www.blogjava.net/calvin/archive/2005/11/22/20938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>