<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-368631094738770373</id><updated>2012-02-16T20:29:47.201-08:00</updated><category term='UNIX'/><category term='NT'/><category term='Mobile'/><category term='Web Development'/><category term='JBoss'/><category term='Rails'/><category term='Agile and XP'/><category term='Hibernate'/><category term='AJAX'/><category term='Misc'/><category term='UI'/><category term='JSF'/><category term='methodology'/><category term='Spring'/><category term='NetBeans'/><category term='CS'/><category term='OS'/><title type='text'>fan's technical blog</title><subtitle type='html'>Java and others</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3331340924373319851</id><published>2011-03-02T00:52:00.001-08:00</published><updated>2011-03-02T00:52:04.881-08:00</updated><title type='text'>haha</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;这里是上牌摇号，外地人限购，那边是将养不起的人口划拨出去。&lt;br/&gt;&lt;br/&gt;同一个地球，同一个主义，同一个做法啊。&lt;/p&gt;in reference to: &lt;p&gt;&lt;blockquote&gt;"这里是上牌摇号，外地人限购，那边是将养不起的人口划拨出去。 同一个地球，同一个主义，同一个做法啊。"&lt;br/&gt;- &lt;a href='http://www.infzm.com/content/55615'&gt;南方周末 - 金贵的平壤户口&lt;/a&gt; (&lt;a href='http://www.google.com/sidewiki/entry/fkpwolf/id/2dNY6SnC7CoWAduZOX1HhL_P2yo'&gt;view on Google Sidewiki&lt;/a&gt;)&lt;/blockquote&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3331340924373319851?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3331340924373319851/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3331340924373319851' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3331340924373319851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3331340924373319851'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2011/03/haha.html' title='haha'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-740302277540209384</id><published>2009-06-16T07:29:00.000-07:00</published><updated>2009-10-24T18:06:55.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>开源的源</title><content type='html'>如果没有源代码，分析问题就不能追本溯源，就会流于表面。&lt;br /&gt;虽然自己不一定会从头到尾的看代码，然后有源代码在那里，让人总觉得有安全感。&lt;br /&gt;&lt;br /&gt;代码的开源，还表示了一种“授之以鱼，不如授之以渔”的态度。源代码提供了更多的信息，提供了解决问题的方式。而自有的产品更多的只是关于配置相关的文档，其后的原理一般人不甚了了。&lt;br /&gt;&lt;br /&gt;site moved to fkpwolf.net&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-740302277540209384?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/740302277540209384/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=740302277540209384' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/740302277540209384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/740302277540209384'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2009/06/blog-post.html' title='开源的源'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-1226453084353095404</id><published>2009-05-29T16:35:00.000-07:00</published><updated>2009-05-29T16:36:44.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><title type='text'>gPhone(T1)买后感受</title><content type='html'>1. 这种东西还可以&lt;a href="http://osnews.com/story/21096/Google_Hints_at_Netbook_Microsoft_Says_Bring_It_On_" rel="nofollow"&gt;移植&lt;/a&gt;到Netbook上面。对于上网本，肯定是个不小的冲击。相比较linux上网本，虽然内核一样，但是google做过包装，它包装的应该比一般的发行版要好，特别是UI方面。&lt;br /&gt;&lt;br /&gt;2.Android用Freetype作的字体渲染器，效果还是很不错的，初一看比Linux上的还要好，这可能是屏幕尺寸的原因。有了字体的反锯齿，屏幕显示就会与众不同了。不知道有没有使用x-window，应该没有，否则负担太重了。&lt;br /&gt;&lt;br /&gt;3.Android上的Market模式有点模仿Apple App Store，但是个人认为这会同个人电脑上的软件开发一样，手工作坊式的开发只是小打小闹的。但是容易安装的优点和长尾的考虑让其有一席之地。&lt;br /&gt;&lt;br /&gt;4.手机上的开发最后势必考虑到跨平台，所以如果移动平台最后如果能同现在的桌面平台一样流行和重要的话，web模式或者RIA之类的东西势必代替各个应用厂商的SDK。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-1226453084353095404?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/1226453084353095404/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=1226453084353095404' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1226453084353095404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1226453084353095404'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2009/05/gphonet1.html' title='gPhone(T1)买后感受'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-6115760378470333658</id><published>2009-05-27T18:34:00.000-07:00</published><updated>2009-05-27T18:36:38.273-07:00</updated><title type='text'>View Google Reader in Android Browser through Yahoo Pipes</title><content type='html'>I am fan of Google Reader. So when I got a Android G1 device, soon I visited the site through it. Now I can view blogs when I was on the traffic to office. It is cool. But one problem I encountered is the font size is too small to read comfortably. I have tried to set the font size to "large" in browser setting  and it works at some common page like www.google.com but not Reader. It looks that Google Reder did some optimize for mobile device(It designed for iPhone at first) and the browser can't adjust itself on font size.&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; DISPLAY: block"&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; DISPLAY: block"&gt;&lt;a href="http://sites.google.com/site/knowledge/view-google-reader-in-android-browser-through-yahoo-pipes/a.png?attredirects=0" imageanchor="1"&gt;&lt;img border="0" src="http://sites.google.com/site/knowledge/view-google-reader-in-android-browser-through-yahoo-pipes/a.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I think I just to want to make the main content's font of blog item bigger.&lt;br /&gt;&lt;br /&gt;Greasemonkey is power tool to customize web page. I tried &lt;a href="http://jsharkey.org/blog/2008/12/15/oilcan-greasemonkey-on-steroids-for-android/"&gt;OilCan&lt;/a&gt; - Greasymonkey on Android browser. It has an innovative idea but still at beta phase. Google chromium has supported it but at Android chrome lite should not support it at now.&lt;br /&gt;&lt;br /&gt;Yahoo Pipes fits this case perfectly. Look below pipe flow:&lt;/div&gt;&lt;div style="TEXT-ALIGN: left; DISPLAY: block"&gt;&lt;div style="TEXT-ALIGN: left; DISPLAY: block"&gt;&lt;a href="http://sites.google.com/site/knowledge/view-google-reader-in-android-browser-through-yahoo-pipes/pipes.png?attredirects=0" imageanchor="1"&gt;&lt;img border="0" src="http://sites.google.com/site/knowledge/view-google-reader-in-android-browser-through-yahoo-pipes/pipes.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; It was simple: just surround the blog content with a font size modification. Then it works. You can view this pipe from &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=rKg_iGhA3hGoK9dqBR50VA"&gt;here&lt;/a&gt;.  Thanks Yahoo to create this great tool. The web UI is impressed and intuitive for building a flow. All operations can be finished by drag &amp;amp; drop or drop-box.&lt;br /&gt;&lt;br /&gt;More on this, Pipes can be seen as cloud computing. It is running at Yahoo's server. Different with Google App Engine which is sophisticated and for programmer, it is for general user who does not need to have programming experience. Of course it has less function then full feature language. Its input just accepts RSS and others feeds defined in advance. The more inputs type, the more powerful Pipes becomes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-6115760378470333658?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/6115760378470333658/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=6115760378470333658' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6115760378470333658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6115760378470333658'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2009/05/view-google-reader-in-android-browser.html' title='View Google Reader in Android Browser through Yahoo Pipes'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3344421704540067461</id><published>2009-04-17T00:00:00.001-07:00</published><updated>2009-04-17T00:00:50.902-07:00</updated><title type='text'>Use Apache Synapse as web service proxy</title><content type='html'>This is a power configuration tool to mock and test web service. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3344421704540067461?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3344421704540067461/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3344421704540067461' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3344421704540067461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3344421704540067461'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2009/04/use-apache-synapse-as-web-service-proxy.html' title='Use Apache Synapse as web service proxy'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-7048662510872817862</id><published>2009-02-25T04:23:00.000-08:00</published><updated>2009-02-25T04:28:44.518-08:00</updated><title type='text'>edit on android</title><content type='html'>Some site like Google Reader has cared this device. Some not, like this site. &lt;br /&gt;Should we need to refactory site? Or write a new client expecially for specific application. Some like write a offline blog writter. Because here when javascript is complex, android cannot render correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-7048662510872817862?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/7048662510872817862/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=7048662510872817862' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7048662510872817862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7048662510872817862'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2009/02/edit-on-android.html' title='edit on android'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-6470514614495666324</id><published>2008-12-26T18:50:00.000-08:00</published><updated>2008-12-26T19:03:28.189-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>CouchDB初次体验</title><content type='html'>我是在Ubuntu上面安装的，还算顺利，几个命令行就搞定，Windows下面可能得花些功夫。&lt;br /&gt;启动Server后，它有个控制台，Web界面的，功能虽不多，但是界面做的很专业，不知道采用的那个theme，看了下web的代码，用了不少jquery的东西。&lt;br /&gt;对数据库的管理方式让人很容易联想到Google App Base，可以自由的添加新的field。访问客户端的语言有很多种选择，我用java试了下，没遇到什么困难。&lt;br /&gt;乍看这东西没啥神秘，不过是一个大的hashmap，每个条目是一个document。有什么用途呢？&lt;br /&gt;SimpleDB也是采用类似的方式，这些大厂商这样做应该有自己的目的吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-6470514614495666324?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/6470514614495666324/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=6470514614495666324' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6470514614495666324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6470514614495666324'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/12/couchdb.html' title='CouchDB初次体验'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3540813837499676624</id><published>2008-07-29T07:24:00.000-07:00</published><updated>2008-07-29T07:30:21.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>MySpace and Portlet</title><content type='html'>MySpace looks some like Portlet. Is it just like at face?&lt;br /&gt;MySpace has a MySpace Developer Platform. What is it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3540813837499676624?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3540813837499676624/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3540813837499676624' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3540813837499676624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3540813837499676624'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/07/myspace-and-portlet.html' title='MySpace and Portlet'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-6266842234795517637</id><published>2008-07-08T06:07:00.000-07:00</published><updated>2008-07-08T06:28:56.781-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>different framework, different web page</title><content type='html'>the Struts treats a page as a Command;&lt;br /&gt;the Portlet treats a page as a Window;&lt;br /&gt;the JSF treats a page as a lot of Components;&lt;br /&gt;the Spring Web Flow treats a lot of pages as a Flow;&lt;br /&gt;the Tapestry treats a page as a Java class&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-6266842234795517637?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/6266842234795517637/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=6266842234795517637' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6266842234795517637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/6266842234795517637'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/07/different-framework-different-web-page.html' title='different framework, different web page'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-4961795656585684390</id><published>2008-07-03T06:55:00.000-07:00</published><updated>2008-07-04T19:20:55.420-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><title type='text'>JSF Custom Compoment development tips</title><content type='html'>1. JSP taglib&lt;br /&gt;In JSF, the scriplet like "#{RequestBean1.name}" is treated as a &lt;span style="font-style: italic;"&gt;ValueExpression&lt;/span&gt; field in tab class. The corresponding tab lib definition file should nests the attribute type with &lt;span style="font-style: italic;"&gt;deferred-value&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And also in tld file, &lt;span style="font-style: italic;"&gt;jsp-version 2.1&lt;/span&gt; element should be included. If this scriplet is missed, some container like Tomcat 6.0.16 will take this tag as generial tag and if we invoke &lt;span style="font-style: italic;"&gt;isLiteralText&lt;/span&gt;() on the &lt;span style="font-style: italic;"&gt;ValueExpression&lt;/span&gt; object, &lt;span style="font-style: italic;"&gt;true &lt;/span&gt;will return. It was not excepted. But the GlassFish V2 ignored this and took 2.1 as default.&lt;br /&gt;&lt;br /&gt;2. Why setProperties() in tag handler java is not invoked?&lt;br /&gt;You should define all property of jsf component java in faces-config.xml. Sometimes it looks like that a attribute is defined twice: one in tld, one in faces-config.xml. &lt;a href="https://jsftemplating.dev.java.net/"&gt;JSF Template&lt;/a&gt; can make these things easy by generating all configuration file. In order to archive this, it introduces some anonations.&lt;br /&gt;&lt;br /&gt;3. Why did some data shown on page disappear after re-loading the page?&lt;br /&gt;implement the &lt;span style="font-style: italic;"&gt;saveState/restoreState&lt;/span&gt; method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-4961795656585684390?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/4961795656585684390/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=4961795656585684390' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4961795656585684390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4961795656585684390'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/07/jsf-custom-compoment-development-tips.html' title='JSF Custom Compoment development tips'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-618547737975725462</id><published>2008-05-12T06:03:00.000-07:00</published><updated>2008-05-12T06:38:48.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><title type='text'>Ubuntu 8.04 使用感受</title><content type='html'>前些天试了下Ubuntu 8.04，有些感触。&lt;br /&gt;首先，安装。我用的是硬盘安装的方式，可以&lt;a href="http://forum.ubuntu.org.cn/viewtopic.php?t=32433&amp;amp;highlight=%E7%A1%AC%E7%9B%98"&gt;参考&lt;/a&gt;这里。主要是在ubuntu.com找到对应的内核文件。最后MBR要装在linux的主分区上。由于vista sp1采用了新的启动方式，没有了boot.ini文件，要多重启动，需要额外的程序：EasyBCD，这个小工具可以重写MBR来引导多个OS，使用起来还是很方便的。&lt;br /&gt;&lt;br /&gt;启动后，主题上，ubuntu变化不大，还是老样子。接上我的ipod，系统可以自动认出，可以关联到相应的程序，运行，提示缺少mp3 plug，然后自动安装，这样就可以播放MP3了，而且mp3 tag中的中文可以正常的显示，这在我的系统的语言是en的前提下，较之以前，是一个很大的进步了。&lt;br /&gt;&lt;br /&gt;对于字体，现在相对于以前，有所改进。但是跟vista下的cleartype相比，差距还是蛮明显的。&lt;br /&gt;&lt;br /&gt;系统自带Firefox 3.0 beta，所有功能跟vista下的一致。我常用的插件也是可以无碍的使用，可以看出firefox大大的提高了linux的接受程度。和java一样，一个容器就是一个平台，催生了一系列的相关软件。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-618547737975725462?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/618547737975725462/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=618547737975725462' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/618547737975725462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/618547737975725462'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/05/ubuntu-804.html' title='Ubuntu 8.04 使用感受'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-2598984911612669767</id><published>2008-04-12T19:18:00.000-07:00</published><updated>2008-07-04T19:20:30.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><title type='text'>在Netbeans 6.1中使用dojo开发自定义的JSF组件</title><content type='html'>&lt;p&gt;前提：netbeans 6.1 beta。&lt;/p&gt; &lt;p&gt;目的：开发一个功能最简的JSF woodstock组件。&lt;/p&gt; &lt;p&gt;准备：Firefox + FireBug插件&lt;/p&gt;&lt;p&gt;原文在&lt;a href="http://fkpwolf.javaeye.com/admin/blogs/177308"&gt;这里&lt;/a&gt;。压根儿拷贝不过来，又一个信息孤岛。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-2598984911612669767?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/2598984911612669767/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=2598984911612669767' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2598984911612669767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2598984911612669767'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/04/netbeans-61dojojsf.html' title='在Netbeans 6.1中使用dojo开发自定义的JSF组件'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-1928367853503829992</id><published>2008-03-15T02:02:00.000-07:00</published><updated>2008-03-23T08:34:18.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>从JSP到Velocity</title><content type='html'>1.JSP有优点。&lt;br /&gt;Rails页面脚本的做法跟JSP其实差不多，也是在HTML中通过&lt;%...%&gt;将Server端语言嵌入其中，这应该是最容易实现的方法。如果说比JSP有强出的地方，那就是Ruby的语法比Java简洁很多。&lt;br /&gt;Grails:&lt;br /&gt;&lt;g:each in="${tripList}" status="i" var="trip"&gt;&lt;/g:each&gt;&lt;br /&gt;Struts:&lt;br /&gt;&lt;logic:notpresent parameter="queryId"&gt;&lt;/logic:notpresent&gt;&lt;br /&gt;对于这种用XML格式来表达逻辑，同JSTL大同小异，个人感觉总是别扭。一则不如Server端语言灵活，二则要掌握另外一种语法。&lt;br /&gt;相比velocity就做的很直观了：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#foreach ( $item in [1..5] )&lt;br /&gt;On this iteration, refers to the value $item.&lt;br /&gt;#end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;其做法更多是贴近一般语言的习惯，仿佛只不过是在语句前加上#（velocity里面称为Directives），变量前加上$。&lt;br /&gt;Grails里面变量的表示为"${}"。一些流行的Javascript框架如prototype、JQuery也采用这种写法。不过这种变量的表示在JSP 2.0里面也被引入，我们就再也不必看到难看如&lt;%=name%&gt;的写法了。&lt;br /&gt;&lt;br /&gt;对于XML格式的标签写法，可能对于机器来说容易处理，其实在这里没有一般的语法的校验，有的只是XML的scheme的校验，当然这也是一种语法，不过就容易处理多了。&lt;br /&gt;对于Velocity，其采用了Antlr来产生语法分析器，在其源代码包org\apache\velocity\runtime\parser 下可以看到详细的代码。&lt;br /&gt;&lt;br /&gt;还有另外一种模板框架freemarker，跟velocity很类似。&lt;br /&gt;&lt;br /&gt;如果我们采用更为简洁的做法：将逻辑和页面彻底的分离，如JSF或者Tapestry的做法，让页面更为单一和纯净。这可能是最理想的做法，也有更好的对页面组件的重用性。但是当前台页面异常复杂，需要浏览器端较多javascript操作，特别是AJAX的引入，势必有越来越多的页面逻辑转移到客户端，从而破坏了整个架构的一致性，让扩展更难处理。&lt;br /&gt;&lt;br /&gt;这说明B/S架构中的逻辑存在于浏览器端和server段是导致系统复杂的根本原因。&lt;br /&gt;C/S就没有这样的烦恼。&lt;br /&gt;为什么呢？&lt;br /&gt;&lt;br /&gt;对旧技术的补丁，最好的技术是GWT，其将逻辑集中于java代码中（虽然客户端的代码和server端的代码还是分开的）。&lt;br /&gt;而新的技术，则是RIA。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-1928367853503829992?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/1928367853503829992/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=1928367853503829992' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1928367853503829992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1928367853503829992'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/03/jspvelocity.html' title='从JSP到Velocity'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-5839717948794308877</id><published>2008-03-09T00:41:00.000-08:00</published><updated>2008-03-27T07:47:51.720-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>jQuery的做法</title><content type='html'>最近学习jQuery.&lt;br /&gt;jQuery正如其名字一样，是一个用来方便的查找到HTML文档中的元素的javascript框架，其查找条件的语法借鉴了CSS和XPath中对DOM元素定位的方式，由于CSS的广泛流行，jQuery可以很快的上手。&lt;br /&gt;&lt;br /&gt;jQuery对查询的结果统一返回为集合，而且可以对该集合再次查询，如：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$('div.disText').attr('title','点击来编辑数据').mousemove(handleMouseMove).mouseout(handleMouseOut).click(handleClick);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;这是很直观的方式，让人奇怪：为什么很少在其他地方见到这样的简洁的模式呢？&lt;br /&gt;(其实在JAVA中也有，比如：&lt;code&gt;&lt;br /&gt;        StringBuffer buff = new StringBuffer(128);&lt;br /&gt;        buff.append(getModuleName("dojo"))&lt;br /&gt;            .append(".require('")&lt;br /&gt;            .append(getModuleName(name))&lt;br /&gt;            .append("');");&lt;/code&gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;jQuery这种视一切为“集合”的方式对“批量”的处理DOM可谓得心应手，而在Web应用中，页面可以显示大量的信息，这些信息可以以常以相同的样式表现，比如“超链接”，在这里用jQuery就可以统一的这些元素处理。和传统的Fat Client不一样，这些页面以XML的格式来定义，还有比如XUL，也以XML来定义界面。XML是一种结构化的数据格式，所以就需要jQuery这样的框架。&lt;br /&gt;&lt;br /&gt;后记：LINQ，.net下的一个框架，也有跟上面类似的语法：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var myList = [&lt;br /&gt;           {FirstName:"Chris",LastName:"Pearson"},&lt;br /&gt;           {FirstName:"Kate",LastName:"Johnson"},&lt;br /&gt;           {FirstName:"Josh",LastName:"Sutherland"},&lt;br /&gt;           {FirstName:"John",LastName:"Ronald"},&lt;br /&gt;           {FirstName:"Steve",LastName:"Pinkerton"}&lt;br /&gt;           ];&lt;br /&gt;         &lt;br /&gt;var exampleArray = From(myList).&lt;br /&gt;                  Where("item.FirstName == 'Chris'").&lt;br /&gt;                  OrderBy("item.FirstName").&lt;br /&gt;                  Select("item.FirstName");&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-5839717948794308877?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/5839717948794308877/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=5839717948794308877' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5839717948794308877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5839717948794308877'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2008/03/jquery.html' title='jQuery的做法'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-2212501416034414936</id><published>2007-12-25T19:21:00.001-08:00</published><updated>2008-01-01T05:00:08.445-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS'/><title type='text'>异步I/O实践：Linux &amp; Java</title><content type='html'>&lt;p&gt;Linux上面的称为AIO，可以参考这篇文章：&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/cn/linux/l-async/"&gt;使用异步 I/O 大大提高应用程序的性能&lt;/a&gt;&lt;/p&gt;编译时使用“gcc a.c -lrt"。这表示链接时包含库/usr/lib/librt.XX，这个库里面可能包含了aio的库，否则会出现"&lt;a href="http://www.linuxquestions.org/questions/programming-9/asyncronous-io-problem-386914/"&gt;Undefined reference to aio_read&lt;/a&gt;"的错误。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-2212501416034414936?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/2212501416034414936/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=2212501416034414936' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2212501416034414936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2212501416034414936'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/12/iolinux-java.html' title='异步I/O实践：Linux &amp;amp; Java'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-7141096172822839559</id><published>2007-12-13T22:23:00.001-08:00</published><updated>2007-12-13T22:23:06.022-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><title type='text'>My linux enviroment setting</title><content type='html'>&lt;p&gt;1. close noisy bell&lt;/p&gt; &lt;p&gt;setterm&amp;nbsp;&amp;nbsp; -bfreq&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; -blength&amp;nbsp;&amp;nbsp; 0&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-7141096172822839559?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/7141096172822839559/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=7141096172822839559' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7141096172822839559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7141096172822839559'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/12/my-linux-enviroment-setting.html' title='My linux enviroment setting'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-4821150395019131178</id><published>2007-11-27T22:54:00.000-08:00</published><updated>2007-11-28T00:45:36.998-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Rethink the big element in web page: Data Table</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.google.com/fkpwolf/R00qqvbBubI/AAAAAAAAAFw/dbnuQORU-cg/image%5B3%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="263" alt="image" src="http://lh6.google.com/fkpwolf/R00qr_bBucI/AAAAAAAAAF4/zzGplzPGl3c/image_thumb%5B1%5D" width="562" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;nbsp; Data Table &lt;/strong&gt;is heavily used in information system. In most case, these tables just display a query result set. They are read only. The operations on them are: paging, sorting, single selection and multi-selection. The all elements of a table include: field, field title, sort and page number state, and value format(or convert). In some extend, a data table is not too much associated with other page elements. So it will be a better way to define a table in &lt;strong&gt;one&lt;/strong&gt; place other than &lt;strong&gt;several&lt;/strong&gt; places in application.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-4821150395019131178?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/4821150395019131178/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=4821150395019131178' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4821150395019131178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4821150395019131178'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/11/rethink-big-element-in-web-page-data.html' title='Rethink the big element in web page: Data Table'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3762084933717910238</id><published>2007-11-27T17:16:00.000-08:00</published><updated>2007-11-30T06:41:03.666-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Commet, Grizzly and Tomcat 6</title><content type='html'>&lt;p&gt;&lt;span style="font-size: 100%"&gt;&amp;nbsp; 一个比较早的对这方面讨论的帖子在这里: &lt;a href="http://macrochen.javaeye.com/blog/28020"&gt;Comet，下一代Ajax？&lt;/a&gt; DW上面好几篇文章做了介绍：&lt;a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html"&gt;Comet：基于 HTTP 长连接的“服务器推”技术&lt;/a&gt;，&lt;a href="http://www.ibm.com/developerworks/cn/java/j-jettydwr/"&gt;面向 Java 开发人员的 Ajax: 使用 Jetty 和 Direct Web Remoting 编写可扩展的 Comet 应用程序&lt;/a&gt;。在《Ajax Design Patterns》这本书上也有介绍，不过称为HTTP Streaming。&lt;a href="http://www.ibm.com/developerworks/cn/web/wa-aj-web2jee/index.html"&gt;Java EE 迎合 Web 2.0 采用事件驱动的异步架构应对现代 Web 应用程序带来的挑战&lt;/a&gt;这篇文章从理论的高度说明了异步模式对提高系统吞吐量的作用。&lt;br&gt;如果要实现Comet，Server端就需要NIO来解决HTTP长连接的问题，否则Server端支持的并发数就会大大减少。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 100%"&gt;&amp;nbsp; Servlet和NIO的使用可以参考&lt;a href="http://www.ibm.com/developerworks/cn/java/j-nioserver/index.html"&gt;Servlet API 和 NIO: 最终组合在一起 使用非阻塞 I/O 构建基于 Servlet 的 Web 服务器&lt;/a&gt;。虽然是一篇较早的文章，仍然提供了很多关于NIO的有用信息。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 100%"&gt;&amp;nbsp; Tomcat 6里面相关NIO的配置可以参考其&lt;a href="http://tomcat.apache.org/tomcat-6.0-doc/config/http.html"&gt;文档&lt;/a&gt;，只用修改Connector的protocol即可。接下来可以写一个简单的&lt;a href="http://tomcat.apache.org/tomcat-6.0-doc/aio.html"&gt;Servlet&lt;/a&gt; A，其implements CometProcessor接口。为测试方便，将Sender存放在Application变量中，在另外一个Servlet B中就可以调用Sender的send(...)方法，当浏览器访问A时，可以动态看到Server端push过来的信息（这时浏览器会一直处于页面正在装载的状态，实际应用中可以用AJAX来接受信息）。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 100%"&gt;&amp;nbsp; 由于是长连接，数据在传送过程中就存在缓冲的问题。一般的一个Server端的发送到客户端的消息（注意这里不是一个响应）不会很大，而默认的Tomcat&lt;a href="http://tomcat.apache.org/tomcat-6.0-doc/aio.html"&gt;缓冲配置&lt;/a&gt;偏大，导致客户端响应滞后，出现这种奇怪的现象：1）当send(...)方法触发多次后，server才会一次把消息全部push到客户端（即是每次使用了flush方法）；2）1 发生后，每次的send(...)的调用会导致server段立即把这条消息发送到客户端（这是buffer又好像不存在一样）。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 100%"&gt;&amp;nbsp; 对于Tomcat 6自带例子里面的bug，也有位哥们在他的blog中提到：&lt;a href="http://blogs.webtide.com:80/gregw/2007/11/22/1195699800000.html"&gt;Asynchronous IO is hard!&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3762084933717910238?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3762084933717910238/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3762084933717910238' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3762084933717910238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3762084933717910238'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/07/commet-grizzly-and-tomcat-6.html' title='Commet, Grizzly and Tomcat 6'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-5521496250224666720</id><published>2007-11-25T16:49:00.000-08:00</published><updated>2007-11-28T00:26:16.307-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Use JPA with Hibernate in Netbeans(Tomcat)</title><content type='html'>&lt;p&gt;0. prerequisite&lt;br&gt;&amp;nbsp; Tomcat 6.0.14&lt;br&gt;&amp;nbsp; Netbeans 6 rc1&lt;br&gt;&amp;nbsp; Hibernate core 3.2.5GA&lt;br&gt;&amp;nbsp; Hibernate EntityManager 3.3.1GA&lt;/p&gt; &lt;p&gt;&lt;br&gt;1. Add a new JPA library implement&lt;br&gt;&amp;nbsp; The default used TopLink. Change to Hibernate.&lt;br&gt;&lt;a href="http://lh4.google.com/fkpwolf/R00RpfbBuXI/AAAAAAAAAE4/id9zp2llrzM/Untitled%5B3%5D"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="352" alt="Untitled" src="http://lh5.google.com/fkpwolf/R00RrvbBuYI/AAAAAAAAAFA/0usmYNZE89g/Untitled_thumb%5B1%5D" width="638" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;br&gt;2. Adjust in JSF design&lt;br&gt;The default data provider ObjectArrayDataProvider works not well with JSF design UI.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.google.com/fkpwolf/R00l5vbBuZI/AAAAAAAAAFg/o8W-DSN7UUU/image%5B6%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="316" alt="image" src="http://lh6.google.com/fkpwolf/R00l6_bBuaI/AAAAAAAAAFo/7-YsOZUCktU/image_thumb%5B2%5D" width="444" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; My target is when let a jsf table "Bind to Data", the all fields of a Hibernate JOPO can be chosen as the&amp;nbsp; above dialog. These displayed fields come from provider's &lt;font face="Courier New"&gt;getFieldKeys&lt;/font&gt; method which is part of interface &lt;font face="Courier New"&gt;DataProvider&lt;/font&gt; signature. So the simplest way is to extends ObjectArrayDataProvider and overide that method. Or just use &lt;font face="Courier New"&gt;setObjectType(Student.class)&lt;/font&gt;. Be sure to &lt;strong&gt;compile&lt;/strong&gt; that class manually so the JSF Design can take this change into account.&lt;/p&gt; &lt;p&gt;Why not use :&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;private ObjectArrayDataProvider objectArrayDataProvider1 = new ObjectArrayDataProvider(someType);&lt;/font&gt;  &lt;p&gt;It does not work. Even I put them in _init() method of backend bean, as the CachedRowSet provider does. &lt;p&gt;3. Done.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-5521496250224666720?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/5521496250224666720/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=5521496250224666720' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5521496250224666720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5521496250224666720'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/11/use-jpa-with-hibernate-in.html' title='Use JPA with Hibernate in Netbeans(Tomcat)'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-8991925867611710548</id><published>2007-10-31T05:48:00.000-07:00</published><updated>2007-11-21T18:43:47.299-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>A nice article about JSF state</title><content type='html'>&amp;nbsp; developerWorks recently posted an article: &lt;a href="http://www.ibm.com/developerworks/cn/web/wa-aj-jsf1.html"&gt;Auto-save JSF forms with Ajax&lt;/a&gt;. The article provided an approach to implement auto-save function(some like Word's auto-save) in web tie. It told us where the data saved and how to recover from the saved data. This article used much JSF knowledge(some like &lt;a href="http://fkpwolf.blogspot.com/2007/05/question-on-jsf-state-saving.html"&gt;component state&lt;/a&gt;) which is different from JSP tag-lib or other technology and in this case we can see JSF and Ajax is powerful.&lt;br&gt;And more, in some other scenario where auto-save is no need. For example, the customer want to keep some crucial form and he can resume from it later, he can do it by click a "Save" button &lt;span style="font-weight: bold"&gt;by himself&lt;/span&gt;. Because auto-save isn't needed everywhere. And auto-save sometimes makes customers confused. Only the customer thinks that he has finished the form &lt;span style="font-weight: bold"&gt;nearly&lt;/span&gt;, then recover from that point is constructive for him. Though AJAX is useless here, the way the author provided is also helpful and suggestive if JSF is still the choice of web framework.&lt;br&gt;&lt;br&gt;&amp;nbsp; So from the viewpoint of an end user, a good designed page should tell him, whether the current form is auto-save or not. Something should notify the user, whether the save action is success or failed. And the user can find all forms he has saved somewhere. So he can resume from there conveniently. At last the system looks maybe some like a workflow system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-8991925867611710548?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/8991925867611710548/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=8991925867611710548' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8991925867611710548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8991925867611710548'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/10/nice-article-about-jsf-state.html' title='A nice article about JSF state'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-4023663687220075651</id><published>2007-10-14T19:47:00.000-07:00</published><updated>2007-10-17T06:42:18.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CS'/><title type='text'>Skip List查找算法</title><content type='html'>最先是从InfoQ上（&lt;a href="http://www.infoq.com/cn/news/2007/10/collections-api"&gt;Java集合类、Skip列表以及Google&lt;/a&gt;）看到的。可以将该算法形象的比喻为&lt;a href="http://epaperpress.com/sortsearch/"&gt;带索引的地址本&lt;/a&gt;。一般的说，该算法属于Red-Black tree（Java中TreeMap的算法）的变形。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;to be continued&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-4023663687220075651?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/4023663687220075651/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=4023663687220075651' title='8 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4023663687220075651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4023663687220075651'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/10/skip-list.html' title='Skip List查找算法'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-8219186759855846789</id><published>2007-09-12T06:45:00.000-07:00</published><updated>2007-11-21T18:44:19.907-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>The unique of Tapestry</title><content type='html'>&amp;nbsp; What's the difference between web development and traditional C/S application such Swing? Personally I like Swing because it let me more efficient. All the code is Java code and there is little type-cast. And Tapestry also follows this way. The author admitted &lt;a href="http://tapestryjava.blogspot.com/2005/02/tapestry-jsf-and-fud.html"&gt;that&lt;/a&gt;:&lt;br&gt; &lt;blockquote style="font-style: italic"&gt;An advantage for Tapestry, I think, is the way the two pages (the firsts containing the form, the second displaying the result) communicate ... in proper, type-safe Java code.&lt;/blockquote&gt;&amp;nbsp; This means if you want to invoke a web page, what you face is a java class. Blow is a example:&lt;br&gt;&lt;code&gt;public IPage doSubmit()&lt;br&gt;{&lt;br&gt;ShowProject showProject = getShowProject();&lt;br&gt;showProject.setProject(getProject());&lt;br&gt;return showProject;&lt;br&gt;}&lt;/code&gt;&lt;br&gt;&amp;nbsp; Get a page class(by injection), give it some value and then you can forward to that page. The page class has included a page and we can say it is the interface of the page. But the best way, I think, is the function like way. Some likes "showProject(project);". Compared with Object initialization which is not undocumented and not self-explaining, function maybe is more intuitive.&lt;br&gt;&lt;br&gt;&amp;nbsp; Tapestry just resolved the problem of the two pages communicate. As to multi-page, or a conversation, there are a lot of work. For example, how to get a page's return value?&lt;br&gt;&lt;br&gt;&amp;nbsp; Unlike this way that page and bean are bound together, JSF let page outside the backend bean. And a jsf page can bind multi-bean. A backend bean can be used in many jsf pages. This loose bind let a page include another page easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-8219186759855846789?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/8219186759855846789/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=8219186759855846789' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8219186759855846789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8219186759855846789'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/09/unique-of-tapestry.html' title='The unique of Tapestry'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3099715700442688205</id><published>2007-08-01T19:36:00.001-07:00</published><updated>2008-12-09T02:43:28.397-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><title type='text'>JPDA(Java Platform Debugger Architecture)</title><content type='html'>How let your changed java code updated to server? It is a big problem in develpping any non-trivial JEE project. &lt;p&gt;Resently, I run a JBoss 4.04 outside of Eclipse. The application archive(EAR) is so big that we can not run it in IDE environment. Then the debug process is boring. After having modify the java code, I have to package it, copy to deploy directory and restart the server. Ant can help me a lot but a debug round still takes me much of time.&lt;/p&gt; &lt;p&gt;In this situation, JPDA will useful. With the help of eclipse, I can use it to connect to a "Remote Java Application". You can find it in "Debug" dialog. Then you can inspect value of a varible and even modify the java code. &lt;strike&gt;Before that, you have to add a breakpoint to your java code. Only java with breakpoint can be modified and replaced to the server. This is a nice feature when you need modify  code many times.&lt;/strike&gt;  When eclipse has  attached remote server, any modified java code could be updated to the server. This is so-called "Hotswap Bug Fixing". Of course the source code should be added to the debug instance's "&lt;strong&gt;Source lookup path&lt;/strong&gt;". Otherwise the server didn't suspend at your breakpoint. And you should mind that the compiled classes were swapped just in the server's memory and didn't updated to the server's file system. So after finished debug, you should copy the classes to the server's deploy directory.&lt;/p&gt; &lt;p&gt;Some other approaches I often used include &lt;span style="font-size:100%;"&gt;Hot deploy&lt;/span&gt; and &lt;span style="font-size:100%;"&gt;restart application&lt;/span&gt; (not server).&lt;/p&gt; &lt;p&gt;Hot deploy is used to deploy a archive such as .war or .jar(EJB) automatically when you put them in deploy directory. Most servers has this feature.&lt;/p&gt; &lt;p&gt;Restart application or Reload Context is used to reload all resource(classes and configuration) in one application eg EJB, or War. This approach is heavier than others. Tomcat will throw exception "Out of memory" after reloaded a web application many times.&lt;/p&gt;&lt;p&gt;To Netbeans, It provides debug mode also. There are some differences on "hot class replace" between it  and  eclipse.&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lz-dDaxCZHc/RtAcp8sRDHI/AAAAAAAAACk/XP4-qPIWP-w/s1600-h/Untitled.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_lz-dDaxCZHc/RtAcp8sRDHI/AAAAAAAAACk/XP4-qPIWP-w/s400/Untitled.jpg" alt="" id="BLOGGER_PHOTO_ID_5102609884802780274" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Above is netbeans 6M10 debug tool bar. It has a "Apply Code Changes" button to submit the changed code to server. It need you do manually. This way is different from  eclipse  which  done  automatically.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3099715700442688205?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3099715700442688205/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3099715700442688205' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3099715700442688205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3099715700442688205'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/08/jpdajava-platform-debugger-architecture.html' title='JPDA(Java Platform Debugger Architecture)'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lz-dDaxCZHc/RtAcp8sRDHI/AAAAAAAAACk/XP4-qPIWP-w/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-8125547286045208014</id><published>2007-06-19T23:16:00.001-07:00</published><updated>2007-06-19T23:16:57.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><title type='text'>Cygwin tips</title><content type='html'>&lt;p&gt;1.if the os is windows, the file type will be dos by default. So if you new a shell script, then run it in cygwin, the error like "who/r command not found" will happen. The solution is changing the file type to unix. A approch is using vi. In vi, use ":set ff?" to inquiry file type. Then use ":set fileformat=unix" or ":set ff=unix".&lt;/p&gt; &lt;p&gt;2.In my machine, cygwin.bat is:bash --login -i. This will let shell be a login shell. But only an interactive shell that is not a login shell will read and execute ~/.bashrc. If we want our personal bash, we should create a .profile file in home directory instead of of .bashrc. One example is:&lt;br&gt;&lt;/p&gt; &lt;p&gt;alias h="history"&lt;br&gt;alias hg="h|grep"  &lt;p&gt;#alias ls='ls --color=auto'&lt;br&gt;alias la='ls -A'&lt;br&gt;alias lf='ls -F'&lt;br&gt;alias ll='ls -l' &lt;p&gt;&amp;nbsp;3.use wget with proxy. create a .wgetrc in home directory.&lt;/p&gt; &lt;p&gt;http_proxy = proxy.com:81&lt;br&gt;no_proxy = localhost &lt;p&gt;This will make wget to fetch data with proxy by default and you didn't need to swith to proxy model by " -Y on".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-8125547286045208014?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/8125547286045208014/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=8125547286045208014' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8125547286045208014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8125547286045208014'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/cygwin-tips.html' title='Cygwin tips'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-1041638445620038224</id><published>2007-06-06T05:06:00.001-07:00</published><updated>2007-06-06T05:20:59.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>RESTful Web development</title><content type='html'>&lt;p&gt;&amp;nbsp; What RESTful means? I found this document : &lt;a href="http://www.b-simple.de/documents"&gt;RESTful Rails development&lt;/a&gt; is very clear to express this point. And It is also quickly to test it in Rails. Soon you will find the amazing of RESTful. It just used HTTP GET, POST, DELETE, PUT to manage the resource and some likes JDBC CRUD implement. And more it is a new RPC implement. It has been used widely in web service. So a web service can be invoked by RESTful URL. And I think it make web service more powerful. In some traditional web application, for example a struts or JSF application, RESTful just provides nice URL format.&lt;br&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp; But obviously RESTful will be more important when application need to invoke 3rd party functions&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-1041638445620038224?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/1041638445620038224/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=1041638445620038224' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1041638445620038224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1041638445620038224'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/restful-web-development.html' title='RESTful Web development'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-1394427276903155654</id><published>2007-06-02T07:01:00.001-07:00</published><updated>2007-06-10T23:43:35.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Visual library of NetBeans</title><content type='html'>&lt;p&gt;  Today I evaluated &lt;a href="http://graph.netbeans.org/"&gt;Visual library&lt;/a&gt; of NetBeans org. There are not too much information about it on Sun's site. And it is a part of NetBeans 6 M9. I guest it was just separated from Netbeans as a standalone project. It's many feature is same as JGraph which has been used by many users. But I think this library provides more about UI design but not only concerning on graph as done by JGrah. For example, it has a feature "ComponentWidget - AWT/Swing components on scene". So you can do this:&lt;/p&gt;&lt;code&gt;JButton button = new JButton();&lt;br /&gt;button.setText("xixi");&lt;br /&gt;ComponentWidget widget = new ComponentWidget(this,button);&lt;/code&gt;  &lt;p&gt;  Then I have a question: Is Visual Web (netbeans) developed on this library? If so, Visual Library is very cool! (From &lt;a href="http://www.javalobby.org/java/forums/t94658.html"&gt;this post&lt;/a&gt;, just page flow navigator is based on Visual Library.)&lt;br /&gt;  There is a &lt;a href="http://www.netbeans.org/download/flash/netbeans_60/jl_preso_vislib/player.html"&gt;video&lt;/a&gt; which created a demo on Visual library. You can find that a JasperReports tool called &lt;a href="https://jarvis.dev.java.net/"&gt;jarvis&lt;/a&gt; is also base on this library. It looks powerful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-1394427276903155654?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/1394427276903155654/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=1394427276903155654' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1394427276903155654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1394427276903155654'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/visual-library-of-netbeans.html' title='Visual library of NetBeans'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-1666179405063013581</id><published>2007-05-07T19:23:00.001-07:00</published><updated>2007-09-13T08:47:47.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>Question on JSF state saving</title><content type='html'>&lt;p&gt;  JSF state is restored or used in "Restore View" of JSF life cycle. These state can be stored in 2 places:client and server. There are some links about the difference of them:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.jroller.com/page/mert?entry=state_saving_method_client_side"&gt;http://www.jroller.com/page/mert?entry=state_saving_method_client_side&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jroller.com/page/cagataycivici?entry=jsf_state_saving_best_of"&gt;http://www.jroller.com/page/cagataycivici?entry=jsf_state_saving_best_of&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jroller.com/page/cenkcivici?entry=changing_default_state_management_method"&gt;http://www.jroller.com/page/cenkcivici?entry=changing_default_state_management_method&lt;/a&gt;  &lt;/p&gt;&lt;p&gt; These states are used to store data about the JSF component tree(the elements in f:view), including components and component id.  They can be seen between 2 request. That is the difference from backend bean. At first thought most of components have no state, or just have a value which presents its state.  A text field has state? But YES. Disable/Enable is a common state.  In the component implement java code, &lt;span style="font-style: italic;"&gt;saveState&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;restoreState&lt;/span&gt; methods deal all these work: choose some attributes and save them to an object which can be found as a hidden field named &lt;span style="font-style: italic;"&gt;javax.faces.ViewState&lt;/span&gt; in client's browser source code.  It was Base64 encoding. And of course, the view state has been configurated to be stored in the client. In Sun's webui implement, many attributes are stored in view state, such as javascript event method and style.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Some  component such as Table can be very complex and has its own states such as the current page number and ordered column. If these states doesn't be stored in component tree, we have to save them in hidden input field.&lt;/p&gt;&lt;p&gt;Myfaces even has a component t:saveState&lt;t:savestate&gt; just for storing data. See &lt;a href="http://wiki.apache.org/myfaces/How_JSF_State_Management_Works"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/t:savestate&gt;&lt;/p&gt;&lt;p&gt;This technology is powerful when user's action is within one page. When page is refreshed, all he has done are saved. If  he just jumps between page, navigate from one page to another page, then the state of a page is discarded, and more it is useless. In one page scenario,  AJAX is also a good choice. They all improve user's experience.&lt;/p&gt;&lt;p&gt;  Somebody provides &lt;a href="http://weblogs.java.net/blog/jhook/archive/2006/01/experiment_goin_1.html"&gt;stateless approach&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;  There is a cool tool called &lt;a href="http://facestrace.sourceforge.net/"&gt;FacesTrace&lt;/a&gt; to monitor JSF application. It displays not only session data, but also the whole JSF life cycle dynamically.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-1666179405063013581?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/1666179405063013581/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=1666179405063013581' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1666179405063013581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/1666179405063013581'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/05/question-on-jsf-state-saving.html' title='Question on JSF state saving'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-249668697637710563</id><published>2007-05-04T00:01:00.000-07:00</published><updated>2007-06-04T04:19:39.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>test code and use Microsoft Writer</title><content type='html'>test code&lt;br&gt;&lt;code&gt;if (component instanceof ValueHolder &amp;amp;&amp;amp; (null != (converter = ((ValueHolder)&lt;/code&gt;  &lt;p&gt;&lt;br&gt;the css please refers &lt;a href="http://klcintw4.blogspot.com/2006/11/blog-post_03.html"&gt;here&lt;/a&gt;. make sure that css code block should be placed in &amp;lt;head&amp;gt; and started with .post.&lt;/p&gt; &lt;p&gt;&amp;nbsp; In your blog, you should enbrace your code with &amp;lt;code&amp;gt; tag in HTML view.&amp;nbsp; And in your code block, you cann't use &amp;lt;&amp;gt; these simble. You change it into HTML code by some tools like &lt;a href="http://phpfi.com/"&gt;phpfi&lt;/a&gt;. It also provides highlighting feature.&lt;/p&gt; &lt;p&gt;&amp;nbsp; But this approach is some boring. Later I found M$ Live &lt;a href="http://windowslivewriter.spaces.live.com/"&gt;Writer&lt;/a&gt;. It is cool. You can edit blog on offline mode and post it when online. You also can download blog item, modify it, and update it to Blogger. You also can delete blog&amp;nbsp;by Writer although Writer didn't&amp;nbsp;remind you. The editor is css-enable. And more interesting&amp;nbsp;it is extensible.&lt;/p&gt; &lt;p&gt;&amp;nbsp; It's disadvantage I found until now is that it cann't upload image file(Blogger does not support it). It can just add a image link.&lt;/p&gt; &lt;p&gt;&amp;nbsp; (6.4 add)Today Writer beta2 is released. It has many nice feature. The biggest imprement is that my article can&amp;nbsp;use tag. Well Done! It looks really cool! I think Microsoft will let it more powerful.&lt;/p&gt; &lt;p&gt;&amp;nbsp; The reason of Writer's existen is:1)It provide offline edit mode; 2)It is WYEIWYS editor; 3) web editor is not so much convenient until now. You will find these problem specially when the article is some long.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-249668697637710563?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/249668697637710563/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=249668697637710563' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/249668697637710563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/249668697637710563'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/05/test-code.html' title='test code and use Microsoft Writer'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-148509938405013242</id><published>2007-05-03T23:28:00.001-07:00</published><updated>2007-05-05T18:36:44.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>use ajax4jsf</title><content type='html'>&lt;a href="http://labs.jboss.com/jbossajax4jsf/" target="_blank"&gt;Ajax4JSF&lt;/a&gt; is a framework which inserts AJAX function to JSF. It is easy to transform orginal JSF code to Ajax-able. Ajax4JSF just changed the way of http message.&lt;br /&gt;It's document is &lt;a href="http://labs.jboss.com/file-access/default/members/jbossajax4jsf/freezone/docs/devguide/index.html" target="_blank"&gt;here&lt;/a&gt;. It has a simple example. Look at blow code: &lt;?xml:namespace prefix = a4j /&gt;&lt;a4j:commandbutton rerender="rep2" value="Link" action="#{Page1.do2}"&gt;&lt;br /&gt;&lt;br /&gt;&lt;?xml:namespace prefix = h /&gt;&lt;h:outputtext id="rep2" value="#{RequestBean1.name}" binding="#{Page1.rep2}"&gt;&lt;br /&gt;the reRender property points out whose data in JSF component tree should be return from server. After JSF engine renders that component, Ajax4JSF then sends response. So this approach didn't do harsh to JSF. We can code in JSF bean: &lt;br /&gt;&lt;code&gt;&lt;br /&gt;private HtmlOutputText rep2 = new HtmlOutputText(); &lt;br /&gt;...... &lt;br /&gt;String style="border-color: rgb(204, 0, 255); backgroun....."; &lt;br /&gt;this.rep2.setStyle(style); &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;We can see the benefit of JSF component model. But this model don't consider the position of the javascript or it is hard to add javascript function. For example, if we want to hightlight the outputText, Should I write a new class extends HtmlOutputText which has a cool appearance? Maybe a Decrtor Pattern is better. No matter which approach we use, we should encapsulate the javascript into JSF component and give user a consistent usage. On the other hand, If we have a JSF component which is not ajax-able but provides hightlight function, we can use it directly in Ajax4JSF. So the problem is the matter of JSF instead of Ajax4JSF.&lt;br /&gt;&lt;br /&gt;&lt;/h:outputtext&gt;&lt;/a4j:commandbutton&gt;&lt;a4j:commandbutton rerender="rep2" value="Link" action="#{Page1.do2}"&gt;&lt;h:outputtext id="rep2" value="#{RequestBean1.name}" binding="#{Page1.rep2}"&gt;&lt;/h:outputtext&gt;&lt;/a4j:commandbutton&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-148509938405013242?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/148509938405013242/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=148509938405013242' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/148509938405013242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/148509938405013242'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/05/use-ajax4jsf.html' title='use ajax4jsf'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3450910621944431122</id><published>2007-04-04T05:28:00.000-07:00</published><updated>2007-06-06T05:29:27.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>why Ruby over Java</title><content type='html'>&lt;p&gt;    这个&lt;a href="http://www.javalobby.org/java/forums/t92777.html"&gt;帖子&lt;/a&gt;很不错，可以参照来学习Ruby。总结来说Ruby的优点在于：&lt;br /&gt;* closures&lt;br /&gt;* multiple implementation inheritance via mixins (simplifies a lot designs where we would use decorators and factories in java)&lt;br /&gt;* messages to objects as if they were first class methods (natural way of doing AOP, used a lot in ActiveRecord). This actually also counts for the famous java properties support planned for java 7...&lt;br /&gt;    缺点在于没有了Java的类型检查，而这是提高Java开发效率的关键：通过编译就可以排除大部分的错误，也提高了系统的安全性。但是在开发一个完整的 Java应用时，经常会遇到DSL语言的地方，比如jsp, sql，这些都是没有办法进行类型检查的地方（DSL的特点吗？）。再比如对Session的处理不可避免的会用到类型cast。&lt;br /&gt;    在RJS里面，html, rjs, rb这些文件之间存在的变量type和name的合约（或契约）更多，而只能手工检查。&lt;br /&gt;    疑问：Ruby里面method的参数的类型会在运行时进行类型检查？&lt;br /&gt;    那JRuby会起到一个粘合剂的作用吗？这会提高系统的复杂性，而且一个系统中使用两种语言也少见，除非是一个遗留系统。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3450910621944431122?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3450910621944431122/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3450910621944431122' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3450910621944431122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3450910621944431122'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/why-ruby-over-java.html' title='why Ruby over Java'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-4824302830007170011</id><published>2007-03-31T05:29:00.000-07:00</published><updated>2007-06-06T05:30:20.869-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NT'/><title type='text'>Sun的一些新动向</title><content type='html'>&lt;p&gt;   最近忙于找工作，荒疏了一些东西。&lt;br /&gt;    1.pet store 2.0发布了。看上去好像是web 2.0的跟风作品，AJAX，RSS，TAG，SEARCH都用上了，还没来仔细研究。用了不少开源的库，可以借鉴下。&lt;br /&gt;    2.一则netbeans有了新的插件：Visual Web Pack，看上去很不错的东西，应该是从creator里面提取出来的，这样比较eclipse的web开发，netbeans强了很多。记得原来使用 creator时，由于deploy服务器只能使用sun application server，速度很慢，还设法过把部署环境改为tomcat，这下方便多了。&lt;br /&gt;    产品的定位跟Microsoft visual web developer express类似。&lt;br /&gt;    相比下，eclipse的可视化编辑界面就差了很多，VE发展到现在还是个小玩具。个人感觉Swing比较swt可能难看点，但是灵活性更好些。&lt;br /&gt;    3.新的application server增加了很多SOA的支持，比如REST，BPEL。有个netbeans演示BPEL开发过程的Video，图形拖放的方式，很是cool。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-4824302830007170011?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/4824302830007170011/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=4824302830007170011' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4824302830007170011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4824302830007170011'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/sun.html' title='Sun的一些新动向'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-8993988530533861710</id><published>2007-01-13T06:57:00.000-08:00</published><updated>2007-06-04T03:48:20.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><title type='text'>Questions on Jboss Seam</title><content type='html'>Obviously, seam has many cool features. There are some questions:&lt;br&gt;1.Seam introduced many kinds of context, and much more than Spring. Are they better than Spring?&lt;br&gt;2.any bean marked with @Name() will be treated as managed component. client just uses "DumyBean cc = (DumyBean) Component.getInstance("dumyBean", true);" to access the bean. Maybe this approach is clearer than Spring xml configuration. Is this approach less efficiently?&lt;br&gt;3.debug.seam page is right around thing! It should exist in Spring. Is it a servlet? Where is its configuration?&lt;br&gt;4.@Logger looks cool. This annotation is introduced by jboss. How to do this?In org.jboss.seam.Component, there is: if ( field.isAnnotationPresent(org.jboss.seam.annotations.Logger.class) )So, It looks that Logger is a build-in service. There is no way to configure it or add my service, yeah?&lt;br&gt;5.eclipse's command works very well with Ant? For example: when I click save button, eclipse automatically invokes Ant's task. How to do this?6.annotation is largely used in Seam. What about this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-8993988530533861710?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/8993988530533861710/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=8993988530533861710' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8993988530533861710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/8993988530533861710'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/01/questions-on-jboss-seam.html' title='Questions on Jboss Seam'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-4317681768860818655</id><published>2006-12-18T05:31:00.000-08:00</published><updated>2007-06-06T05:31:42.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>MDB应用实例</title><content type='html'>&lt;p&gt;    Message Drive Bean据说是EJB 2.0规范里面最有好的一个特性，可惜一般应用和项目中鲜有EJB的使用，更不谈MDB了。&lt;br /&gt;    应用中需要将一些消息发送email到主机，为此配置服务器jms，建立消息的queue和factory（使用工具如WSAD可快速的配置，可以参考developerworks的&lt;a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0301_wosnick/wosnick.html#8._Add_resource_references_for_the_two"&gt;这篇文章&lt;/a&gt;和&lt;a href="http://www-128.ibm.com/developerworks/cn/websphere/techjournal/0211_barcia/barcia.html#download"&gt;这篇&lt;/a&gt;）。创建一SLSB AlertsService，该bean作为jms的工具类bean，提供接口将消息发送到队列。该EJB有对queue和factory的resource-ref。&lt;br /&gt;    在EJB中建立jms监听端口（在queue, factory上），创建一MDB OutboundAlerts监听该端口，在onMessage()中处理消息：send emails to host。MDB的目标类型为Queue(只有一个消息接受者)。&lt;br /&gt;    这里用jms的原因是：发送email可能延误时间，必须为异步的。相对用多线程的实现异步方法，MDB提供了持久性（只有Topic才有这个功能），更稳定。&lt;br /&gt;    这里MDB的onMessage的事务类型为：NotSupported，一般消息的发送者和接受者分别在各自的事务中，不可能在一个事务中。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-4317681768860818655?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/4317681768860818655/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=4317681768860818655' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4317681768860818655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/4317681768860818655'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/mdb.html' title='MDB应用实例'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-7702663628693994373</id><published>2006-12-16T05:32:00.000-08:00</published><updated>2007-06-06T05:32:33.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NT'/><title type='text'>jdk6 has been released!</title><content type='html'>&lt;p&gt;   Tonight I occasionally browsed java.sun.com, It was very surprising that J2SE 6 had been available. COOL! Well Done! It was so quickly that sun pushed the newer edition of jdk.&lt;br /&gt;    After going through &lt;a href="http://java.sun.com/javase/6/"&gt;this page&lt;/a&gt;, I found there are not too much exciting features in this release except script.&lt;br /&gt;    More detail documents can be found in DevX: &lt;a href="http://www.devx.com/Java/Article/33398/0/page/1"&gt;Mustang Must-Haves: What's Cool in Java SE 6&lt;/a&gt; and&lt;a href="http://www.devx.com/Java/Article/33206/0/page/1"&gt; Java SE 6's New Scripting and Compiling Goodies&lt;/a&gt; .&lt;br /&gt;    You can see another cool stuff is compile API.  Even there is a project &lt;a href="https://gosling.dev.java.net/"&gt;gosling&lt;/a&gt; using compile API as a replacement for  ANT.  It used  java  as build language other than xml. Also it used some advanced feature such as annotation, compile API.&lt;br /&gt;    The questions for gosling are :&lt;br /&gt;    1) the build java file need not be compiled?&lt;br /&gt;    2) Is it more quickly than old ANT?&lt;br /&gt;    3) Why not use script as a language? Though the java maybe be a better choice than XML, it also has a more complex grammar than XML. With XSL XML can be validated easily. If the java don't be compiled in eclipse, how can I make sure my java is correct? till the run-time? How about script? maybe it is more appropriate.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-7702663628693994373?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/7702663628693994373/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=7702663628693994373' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7702663628693994373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/7702663628693994373'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/jdk6-has-been-released.html' title='jdk6 has been released!'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-2313238374492391915</id><published>2006-10-26T07:11:00.000-07:00</published><updated>2007-06-04T03:47:29.991-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>JSP，Velocity,Jelly and Ruby</title><content type='html'>项目中要动态产生文档，开始用JSP做了个简单原型，后来觉得代码比较混乱，换上了Velocity：一种模板语言。 虽然大同小异，但有些地方还是很方便。比如原来jsp中：&lt;br&gt;&lt;code&gt;&amp;lt;%=person.getPostion()%&amp;gt;&lt;/code&gt;&lt;br&gt;现在只要$person.position就可以了，少了很多讨厌的百分号。还可以定义function，以及其他一些你能想到的特性。很有点脚本语言的味 道，有如prototype.js的$()，更符合编程思路，大家都喜欢，觉得这样才自然（prototype这里大概从ruby中汲取了灵感）。&lt;br&gt;还有另外一个类是的库jellyXML-based scripting and processing engine。使用了一种XML和${}的混和语法。比如:&lt;br&gt;&lt;code&gt;&lt;br&gt;&amp;lt;j:forEach items="${IMPORTS}" var="i" trim="false"&amp;gt;&lt;br&gt;import ${i};&amp;lt;/j:forEach&amp;gt;&lt;br&gt;&lt;/code&gt;&lt;br&gt;而velocity则较为一致：&lt;br&gt;&lt;code&gt;&lt;br&gt;#macro( getBox $thisboxvalue $boxvalue )&lt;br&gt;#if ( $thisboxvalue == $boxvalue ) a #else b #end&lt;br&gt;#end&lt;br&gt;&lt;/code&gt;&lt;br&gt;单从语法上讲，jelly类似jsp + jstl。While Jelly has found some success in projects such as Maven, the general consensus is that XML is a poor choice for a programming language even the creator of Jelly apologized at &lt;a href="http://radio.weblogs.com/0112098/2004/03/26.html#a472"&gt;http://radio.weblogs.com/0112098/2004/03/26.html#a472&lt;/a&gt;.&lt;br&gt;其实ANT用XML作语言也有同样的问题。TheServerSide上有篇文章&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=42293" target="_blank"&gt;Allen Holub: Just Say No to XML&lt;/a&gt; 说明了这一点。 那为什么jsp不做成这样子呢？连rails也是这种讨厌的风格？（还好ruby的语法很方便）个人认为一则效率的考虑：velocity大概有个预先装入、解析、预编译的过程（待考证），还会将结果放在cache中。二则（更主要）多了一种语法，造成复杂和重复。&lt;br&gt;velocity还有些设计上的亮点：使用中遇到一种情况，从bean中取出属性后要作个代码页转换然后在页面上显示。由于原来bean的getXXX方 法都已经产生好，手工改费力不讨好。这时参考velocity文档时发现有一个get()的方法：当对于属性A，bean不存在getA()方法时，调用 bean的该方法。nice! 让人想到了ruby也有类似设计：Object有个method_missing的方法.也是很好的idea，方法简单但是效果很好。（参考我的blog:&lt;a href="http://blog.matrix.org.cn/page/fkpwolf?entry=ruby%E7%9A%84method%E7%9A%84%E5%8A%A8%E6%80%81%E7%89%B9%E6%80%A7"&gt;Ruby的method的动态特性&lt;/a&gt; ）&lt;br&gt;从脚本语言看，&lt;a href="http://groovy.codehaus.org/" target="_blank"&gt;Groovy&lt;/a&gt;之类从语法上更为强大，也更复杂。如果Java有成熟的、广泛接受的脚本语言技术，velocity大概也无立足之地了。&lt;br&gt;另： &lt;a href="http://www.rollerweblogger.org/"&gt;Roller Weblogger&lt;/a&gt;的模板也是用了Velocity技术。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-2313238374492391915?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/2313238374492391915/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=2313238374492391915' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2313238374492391915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/2313238374492391915'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2006/10/jspvelocityjelly-and-ruby.html' title='JSP，Velocity,Jelly and Ruby'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3202423185459695085</id><published>2006-10-20T18:06:00.000-07:00</published><updated>2007-06-04T03:45:45.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>小试Rails RJS</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RJS是Rails1.1的一个ajax的功能点。&lt;a href="http://www.codyfauser.com/articles/2005/11/20/rails-rjs-templates"&gt;这里&lt;/a&gt;是一个简单明了的turturail。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个framework引入了一个rjs类型的文件，当control的function执行后，同名的rjs文件会被执行来动态产生出（或者说是被翻译为）javascript文件。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rjs可以为如下的形式：&lt;br&gt;a = "fkp"&lt;br&gt;page.insert_html :bottom, 'list',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; content_tag("li", "Fox2")&lt;br&gt;page.visual_effect :highlight, 'list', :duration =&amp;gt; 3&lt;br&gt;page.replace_html 'header',&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a + "b"&lt;br&gt;利用工具(for example:&lt;a href="http://www.xk72.com/charles/"&gt;charles&lt;/a&gt;)可以得到其产生的response为：&lt;br&gt;try {&lt;br&gt;new Insertion.Bottom("list", "&amp;lt;li&amp;gt;Fox2&amp;lt;/li&amp;gt;");&lt;br&gt;new Effect.Highlight("list",{duration:3});&lt;br&gt;Element.update("header2", "fkpb");&lt;br&gt;} catch (e) ......&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 让人惊奇！我原来以为返回的是xml形式的（ajax必须返回xml吗？）。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样的做法产生一个问题就是js的代码量可能过大，当然这里是因为直接调用而显得很简短（application.js就可以放自定义的js function的地方）。这些js基本上是没有变化的，那么能不能直接传参数呢？这样产生出来的js可以cache（google web tools好像是这样做的）。而rjs的做法感觉是对于page.methodxx的返回值每次来个字符串的相加？&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rjs不仅提供了ruby语法的api来简化js的开发，更重要的是将ajax从view曾剥离出来，而且可以访问server端同名function的导出变量(@开头的？这湮没了xml在B/S间的传递)。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 跟其它的ajax框架不一样（大多可以用js直接访问后台的java function），这种方式去掉了访问的接口的定义（method的返回值没有定义），灵活性更强，因为view可能改变频繁。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用这种模式后，契约存在两个地方：1）rjs和html。rjs用id来对html element控制，一般的ajax模式是把js和html混合写，由于id粒度过低，分开加大了耦合度；2）ruby和rjs之间的context。显然，google web tools解决了这些问题，但是需要讨厌的compile的过程。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果用java来实现，rjs模板可以用java写，也可以为脚本语言（jdk6有更好的支持)，而主要不同可能是java代码和模板之间的contex的共享：java可能没有ruby实现的优雅。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 模板产生出来的javascriptbroswer端用如下的形式引用：&lt;br&gt;&amp;lt;script src="/javascripts/prototype.js?1159875410" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;&amp;lt;script src="/javascripts/effects.js?1159875410" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br&gt;还不知这些number是做何用处。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3202423185459695085?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3202423185459695085/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3202423185459695085' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3202423185459695085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3202423185459695085'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/05/rails-rjs.html' title='小试Rails RJS'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-5326535559307732668</id><published>2006-10-19T05:33:00.000-07:00</published><updated>2007-06-06T05:33:31.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>XUL中的UI重用</title><content type='html'>&lt;p&gt;&lt;a href="http://www.mozilla.org/projects/xul/"&gt;XUL&lt;/a&gt;是Mozilla的界面描述语言,用来解决跨平台的问题。&lt;br /&gt;    XUL的&lt;a href="http://developer.mozilla.org/en/docs/Overlay"&gt;Overlays&lt;/a&gt;特性令人感兴趣，其描述为：&lt;br /&gt;    Overlays are XUL files used to describe extra content for the UI. They are a general mechanism for adding UI for additional components, overriding small pieces of a XUL file without having to resupply the whole UI, and reusing particular pieces of the UI.&lt;br /&gt;    有点类似OO中的继承和方法重写。&lt;br /&gt;    一般来说，页面级的重用是比较困难的。JSF（组件级的重用）或者jsp tag只是重用了页面的一部分，开发起来也是费周折。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-5326535559307732668?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/5326535559307732668/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=5326535559307732668' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5326535559307732668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/5326535559307732668'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/xului.html' title='XUL中的UI重用'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3366850544696846890</id><published>2006-09-21T05:34:00.000-07:00</published><updated>2007-06-06T05:35:02.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile and XP'/><title type='text'>XP中的人生哲学</title><content type='html'>&lt;p&gt;我过去对极限编程一直不是很热忱，抱有很多的偏见。首先就这个名称从字面上而言，极限？好像是噱头，或是旁门左道的东西。&lt;br /&gt;其实里面很多都是朴素的道理。&lt;br /&gt;比如：增量开发。“对于一个婴儿来说，他的力量就是成长的力量。”，“真正的光明决不是永没有黑暗的时间，只是永不被黑暗所掩蔽罢了。真正的英雄决不是永没有卑下的情操，只是永不被卑下的情操所屈服罢了。所以在你要战胜外来的敌人之前，先得战胜你内在的敌人；你不必害怕沉沦堕落，只消你能不断的自拔与更新。”&lt;br /&gt;比如：测试驱动。告诉我们的道理是做事前要先确定好目标，有的放矢。或者“没有反省的生活是没有意义的。”&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3366850544696846890?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3366850544696846890/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3366850544696846890' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3366850544696846890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3366850544696846890'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/xp.html' title='XP中的人生哲学'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-3304131685335782483</id><published>2006-09-09T05:36:00.000-07:00</published><updated>2008-12-09T02:43:28.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Hibernate乐观离线锁(Appfuse Practise)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lz-dDaxCZHc/Rmaqz3h5QYI/AAAAAAAAABs/jRfSRI2E5yY/s1600-h/01695366102a6624ab184cb5.jpg.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_lz-dDaxCZHc/Rmaqz3h5QYI/AAAAAAAAABs/jRfSRI2E5yY/s400/01695366102a6624ab184cb5.jpg.bmp" alt="" id="BLOGGER_PHOTO_ID_5072929838335607170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;一个在Hibernate中的实践操作描述的很好的文档在&lt;a href="http://caterpillar.onlyfun.net/Gossip/HibernateGossip/OptimisticLocking.html"&gt;这里&lt;/a&gt;。原理上的描述在Addison Wesley : Patterns of Enterprise Application Architecture Chapter 16里面有详尽的描写，这本Martin Fowler撰写的书称乐观锁定为Optimistic Offline Lock，Hibernate的实现基本上跟这本书里面的一样。里面有副时序图，画的相当的明白。(copy from the book. copyleft.)&lt;br /&gt;&lt;br /&gt;&lt;p&gt;  &lt;/p&gt;&lt;p&gt;    另外一本书Hibernate in Action将乐观锁划分为Application Transacation，而悲观锁则划分为Database Transaction（Hibernate总是使用数据库的锁定机制，从不在内存中锁定对象！见：Hibernate的reference document）。&lt;br /&gt;Appfuse实践&lt;br /&gt; Appfuse可以generate一个model的CRUD所有jsf页面，这可以作为实践上的起步。然后，version字段应该在页面上不能修改，而是作为一个hidden的字段，这样在显示record详细信息界面上就需要有两个hidden字段：&lt;br /&gt;&amp;lt;h:inputHidden value="#{personForm.person.id}" id="id"/&amp;gt;&lt;br /&gt;&amp;lt;h:inputHidden value="#{personForm.person.version}" id="version"/&amp;gt;&lt;br /&gt;Patterns of Enterprise Application Architecture里面的做法是将version作为session变量，都是可以的。只要这个值是读取对象时取出来的就可以。&lt;br /&gt; 这样做后，如果两个不同的用户同时修改一条记录时，hibernate就会报错Row was updated or deleted by another transaction。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-3304131685335782483?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/3304131685335782483/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=3304131685335782483' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3304131685335782483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/3304131685335782483'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/hibernateappfuse-practise.html' title='Hibernate乐观离线锁(Appfuse Practise)'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lz-dDaxCZHc/Rmaqz3h5QYI/AAAAAAAAABs/jRfSRI2E5yY/s72-c/01695366102a6624ab184cb5.jpg.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-478883489071267828</id><published>2006-08-30T05:39:00.000-07:00</published><updated>2007-06-06T05:40:18.307-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>appfuse（1.9.3）中的几个小问题</title><content type='html'>&lt;p&gt;1.如果创建了一个新的应用，ApplicationResources_zh_CN.properties在创建过程中被转换为乱码。简单的做法就是用appfuse原来的文件直接覆盖。&lt;br /&gt;2.displaytag_zh_CN.properties没被转换。修改build.xml的copy-resources task：&lt;br /&gt;    &amp;lt;!-- Copy any resource or configuration files --&amp;gt;&lt;br /&gt;    &amp;lt;target name="copy-resources" depends="prepare"&lt;br /&gt;        description="Copy .properties and .xml files from source directory"&amp;gt;&lt;br /&gt;        &amp;lt;copy todir="${build.dir}/web/classes" includeEmptyDirs="no"&amp;gt;&lt;br /&gt;            &amp;lt;fileset dir="web/WEB-INF/classes"&amp;gt;&lt;br /&gt;                &amp;lt;exclude name="ApplicationResources_zh*.properties"/&amp;gt;&lt;br /&gt;&amp;lt;exclude name="displaytag_zh_CN.properties"/&amp;gt;&lt;br /&gt;                &amp;lt;include name="*.properties"/&amp;gt;&lt;br /&gt;                &amp;lt;include name="*.xml"/&amp;gt;&lt;br /&gt;                &amp;lt;include name="*.vm"/&amp;gt;&lt;br /&gt;            &amp;lt;/fileset&amp;gt;&lt;br /&gt;            &amp;lt;filterset refid="variables.to.replace"/&amp;gt;&lt;br /&gt;        &amp;lt;/copy&amp;gt;&lt;br /&gt;&amp;lt;native2ascii src="web/WEB-INF/classes" dest="${build.dir}/web/classes"&lt;br /&gt;            includes="*_zh*.properties" encoding="UTF-8"/&amp;gt;&lt;br /&gt;        &amp;lt;generate-database-properties/&amp;gt;&lt;br /&gt;        &amp;lt;copy todir="${build.dir}/web/classes" file="database.properties"/&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;3.appgen的ant install的做法&lt;br /&gt;ant install的所做的工作包括了ant[default]的工作，好像文档写的不是很准确。而且这个appgen一股脑的将ibtias and hibernate的dao都产生出来，没有一个设置目标DAO的地方。&lt;br /&gt;忘了在哪里看到的说法：j2ee开发中deploy是一个非常关键的过程，确实真知灼见。&lt;br /&gt;发布过程要有几个特征：&lt;br /&gt;    1.方便（自动化的发布）；&lt;br /&gt;    2.灵活（定制）；&lt;br /&gt;    3.有升级的功能（持续的升级）；&lt;br /&gt;    4.速度要快。这样才能减少测试－开发－测试需要的round时间。 &lt;/p&gt;&lt;p&gt;4.中文编码的问题&lt;br /&gt;    刚开始遇到中文问题的时候，觉得小case：统一将编码改为gb2312，原来就是经常这么干的。后来网上查了会儿，原来大家现在都用UTF-8了，就像google一样，cool！&lt;br /&gt;    appfuse本身就是utf-8的配置，问题在于数据库的编码，需要在my.ini中加入：&lt;br /&gt;             [mysqld]&lt;br /&gt;             default-character-set=utf8&lt;br /&gt;或者mysqld命令行带上参数。&lt;br /&gt;    但是ant setup-db后，依然乱码。后来发现新建表的character set为latin1，column也为latin1，god! 都改为utf8后问题解决。而如何让ant setup-db自动创建utf-8的table呢？&lt;br /&gt;    所以appfuse的中文问题就是所有地方都要用utf-8编码！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-478883489071267828?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/478883489071267828/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=478883489071267828' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/478883489071267828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/478883489071267828'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/appfuse193.html' title='appfuse（1.9.3）中的几个小问题'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-9204088128783096729</id><published>2006-08-16T18:04:00.000-07:00</published><updated>2007-06-04T03:46:47.058-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>continuation in Spring Web Flow</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; 平心而论，SWF是现在java中对continuation支持最好的和最现实的，虽然这种支持是模拟的。其他的一些框架都有点技术上的理想而造成的不成熟。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SWF默认使用的控制是SimpleFlowExecutionRepository，这是不支持continuation的，比如浏览器回退、新开浏览器等。如果要支持，要使用ContinuationFlowExecutionRepository。SWF这样的设置是很灵活的，因为一般的应用可以使用SimpleFlowExecutionRepository来避免continuation引起的不必要的开销。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以swf-sample中的guessnumber为例（guess number是一个经典的例子），修改/web-inf/dispatcher-servlet.xml相关内容如下：&lt;br&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean name="/play.htm" class="org.springframework.webflow.executor.mvc.FlowController"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="flowExecutor" ref="flowExecutor"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="flowExecutor" class="org.springframework.webflow.executor.FlowExecutorImpl"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg ref="repositoryFactory"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id="repositoryFactory" class="org.springframework.webflow.execution.repository.continuation.ContinuationFlowExecutionRepositoryFactory"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg ref="flowRegistry"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;如此后，应用就支持浏览器后退键了。这里的后退键是跟后台逻辑关联在一起的：按下后退键，相当于刚才的猜测不算，再猜一次，而计数也“后退”（或者说“恢复”）到前面到状态。如果是购物篮应用，后退就表示“退回”刚才购买的商品。（这种方式也可能造成用户感觉上的混乱）&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这种功能用一般的会话变量（比如将计数存在session中、将购物篮存在session中）是很难处理的。这里的会话变量比如计数、购物篮是一个会话活动中多个步骤的结果的记录，用一个变量是无法记录这些步骤的先后顺序的。而一般的会话变量只是一个步骤中标志或者状态的记录，一个变量就足够使用。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SWF的解决方法就是在每个步骤中添加一个标志，当这个步骤提交时，后台根据提交上来的标志恢复（在回退的情况下）当时这个步骤的上下文，这样就可以在work flow中继续运行下去。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如当步骤1-&amp;gt;2-&amp;gt;3-&amp;gt;4，当浏览器在步骤4时回退时，浏览器会把步骤2提交的数据再次提交。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用户每次提交，后台都要形成一个上下文的continuation（每次提交的数据都可能不一样），这可能会占用大量的资源。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-9204088128783096729?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/9204088128783096729/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=9204088128783096729' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/9204088128783096729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/9204088128783096729'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/05/continuation-in-spring-web-flow.html' title='continuation in Spring Web Flow'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-368631094738770373.post-9025594025995533246</id><published>2006-08-16T05:41:00.000-07:00</published><updated>2007-06-06T05:41:27.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Spring中Singletons的线程安全</title><content type='html'>&lt;p&gt;    Thread-safe在Java Concurrency in Practice这本书里面的定义是： &lt;/p&gt;&lt;p&gt;        A class is thread-safe if it behaves correctly when accessed from multiple threads, regardless of the scheduling or interleaving of the execution of those threads by the runtime environment, and with no additional synchronization or other coordination on the part of the calling code. &lt;/p&gt;&lt;p&gt;    Spring本人不是很熟悉，网上Google了下相关方面的话题，得到的有用的结果很少。可以参考的是：&lt;a href="http://erik.jteam.nl/?p=4"&gt;Thread safety, singletons and Spring。&lt;/a&gt;还有一篇是：&lt;a href="http://www.javalobby.org/articles/thread-safe/index.jsp"&gt;Thread-safe webapps using Spring&lt;/a&gt;。&lt;br /&gt;    基本上，Spring的thread-safe是其API自身的thread-safe。比如一个常见的场景（from appfuse）：&lt;br /&gt;    public class UserManagerImpl extends BaseManager implements UserManager {&lt;br /&gt;        private UserDao dao;&lt;br /&gt;    ......&lt;br /&gt;    public class UserDaoHibernate extends BaseDaoHibernate implements UserDao, UserDetailsService {&lt;br /&gt;    ......&lt;br /&gt;    public class BaseDaoHibernate extends HibernateDaoSupport implements Dao {&lt;br /&gt;    这些bean都是Singletons的。&lt;br /&gt;    一个类如果没有成员变量，那这个类肯定是thread-safe的，所以UserDaoHibernate的thread-safe取决于其父类。而 UserManagerImpl 的安全性又取决于UserDaoHibernate，最后是HibernateTemplate。可以看出，这里的bean都小心翼翼的维护其成员变量，或者基本没有成员变量，而将thread-safe转嫁给Spring的API。如果开发者按照约定的或者用自动产生的工具（appgen不错）来编写数据访问层，是没有线程安全性的问题的。Spring本身不提供这方面的保证。&lt;br /&gt;    或者bean的定义为Singletons="false"，也可以参考前面的一篇文章&lt;a href="http://erik.jteam.nl/?p=4"&gt;Thread safety, singletons and Spring&lt;/a&gt;，用lookup-method。&amp;lt;pro spring&amp;gt; charpter 5介绍的更详细：&lt;br /&gt;    Lookup Method Injection was added to Spring to overcome the problems encountered when a bean depends on another bean with a different lifecycle—specifically, when a singleton depends on a non-singleton. In this situation, both setter and constructor injection result in the singleton maintaining a single instance of what should be a non-singleton bean. In some cases, you will want to have the singleton bean obtain a new instance of the non-singleton every time it requires the bean in question.&lt;br /&gt;    显然，如果A(Singletons) depends B(Propotype)，使用这种方式可以避免A对B的访问并发和争用的问题。&lt;br /&gt;     &amp;lt;pro spring&amp;gt;这本书（强于spring in action，后者感觉是本reference book）也对Singletons＝“true/false"的选择做了个小结：&lt;br /&gt;    使用Singletons的情况有：&lt;br /&gt;    1.Shared objects with no state;&lt;br /&gt;    2.Shared object with read-only state;&lt;br /&gt;    3.Shared object with shared state;&lt;br /&gt;    4.High throughput objects with writable state. (synchronizing is need)&lt;br /&gt;    使用propotype的情况有：&lt;br /&gt;    1.Objects with writable stat;&lt;br /&gt;    2.Objects with private state.&lt;br /&gt;    与Spring的高度灵活不同，EJB的规范将同步作为一个服务（one of primary services），开发者开编写bean时不必考虑（也不能）线程相关的问题。session bean其分为两类，也有同步上的考虑。&lt;br /&gt;    虽然thread-safe的问题总是存在，EJB也没有从本质上解决这个问题，但是其提出了这个问题，并给出了规范。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/368631094738770373-9025594025995533246?l=fkpwolf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fkpwolf.blogspot.com/feeds/9025594025995533246/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=368631094738770373&amp;postID=9025594025995533246' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/9025594025995533246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/368631094738770373/posts/default/9025594025995533246'/><link rel='alternate' type='text/html' href='http://fkpwolf.blogspot.com/2007/06/springsingletons.html' title='Spring中Singletons的线程安全'/><author><name>fan</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://photos1.blogger.com/x/blogger/3918/803/1600/5382/mine.jpg'/></author><thr:total>0</thr:total></entry></feed>
