他們說:“Web改變世界,我們改變Web”,你知道是誰改變了誰嗎?
他們說:“From the earth to the moon, and ready for Mars!”,你ready for what呢?
他們勇敢,他們開放,他們懂得分享,所以他們選擇開源,并且可以自豪地宣布,他們活在“勇敢者的新世界”里。而同樣作為程序員的你,你的世界又是什么樣的呢?
這里的“他們”,我想我不提大家已經知道是誰,就是來自中國的開源項目operamasks。他們雖然沒有創造世界神話(不知道第四個通過JavaEE5認證的服務器算不算),但他們確實創造了中國神話,如果你不服,那么你能舉出一個在他們領域里面比他們成功的同類產品嗎?
成功者都常說,“細節決定成敗”,只有為用戶考慮到各種細節,用戶才會支持你。Operamasks的成功,我覺得除了他們的“勇敢”以外,還有一個重要因素是“細節”,他們考慮到了很多細節,很多都是在JSF這樣一個“標準”層面的東西無法強制規定死,但往往對用戶來說又是非常實用的細節,還有解決了很多常遇到的繁瑣細節。
道理及感嘆在這里就不想多發了,我想大家都關注的是具體的技術,所以本文就簡單例舉一下operamasks中的一些比較具有人性及親和力的細節,看了后我想使用JSF開發的你一定很覺得非常體貼。
1、 Kill掉JSF中令人討厭的配置
一個簡單類似的注冊示例,成功就導航到/accepted.jsp去,而拒絕就導航到/accepted.jsp。
ManagedBean中
public String signup() {
if (Math.random() < 0.2) {
return "accepted";
} else {
return "rejected";
}
}
讓標準JSF來干吧,只是為了一個簡單的跳轉,你就需要配置下面這樣一堆html,你估算一個項目下來的配置文件代碼是多少。
<faces-config>
<navigation-rule>
<from-view-id>/signup.jsp</from-view-id>
<navigation-case>
<from-outcome>accepted</from-outcome>
<to-view-id>/WEB-INF/results/accepted.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>rejected</from-outcome>
<to-view-id>/WEB-INF/results/rejected.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
而用operamasks,你的代碼只需要寫成下面這樣即可:
public String signup() {
if (Math.random() < 0.2) {
return "/WEB-INF/results/rejected.jsp ";
} else {
return "/WEB-INF/results/accepted.jsp ";
}
}
也就是說operamasks幫你吞掉了這些無味又沒有太多營養的配置文件,并幫你消化,你說他是不是很人性。
另外,比如我們想要用到一個ManagedBean,標準JSF需要在配置文件中寫一堆的配置文件,如下:
<faces-config>
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>
package.MyBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
而operamasks設計了一套注解annotation標簽,你只需要在類的聲明前加上一個@ManagedBean標簽即可,如下:
@ManagedBean(name="myBean", scope=ManagedBeanScope.REQUEST)
public class MyBean {
}
類似這樣的細節還有很多,讓我們慢慢去發掘吧。
2、用Ajax是那樣方便
不管你信不信,事實擺在那里他真的很方便,Ajax的無刷新的效果對于Web應用來說確實很酷也很鉉。對于傳統的JSF實現,要想用Ajax你就要借助其它的一些Ajax框架,名字大一點算是ajax4jsf吧。下面看一個動態刷新頁面中id為msg處的內容的示例:
首先要定義一個JSF標簽
<h:outputText id="msg" value="#{bean.text}" />
然后定義一個ajax2jsf的按鈕標簽:
<a4j:commandButton reRender="msg" value="Submit"/>
而operamasks中的按鈕標簽仍然是:
<h:commandButton value="Server Submit" />
不懂JSF的同仁一定都覺得怪,得懂行的就知道。這個<h:commandButton value="Server Submit" />可是在JSF的JCP中規定的標簽標準啊,這個是任何支持JSF的開發工具都能認識的,當然程序員就不用說了。而那個什么<a4j:commandButton>是什么,那個reRender屬性,更是怪怪的,鬼二哥Studio才會認他。
3、Rich Components的集成
看過Operamasks有名的jsfdemo示例吧,我們來看看反應。一些菜鳥感嘆說:“發漂亮啊,太偉大了!”;一些小牛們會眼紅紅地生悶氣,怎么我才想到的你就做出來了;一些大牛們會說:“這不是偷人家ext的嗎?”,幽默一點會說:“我認為是是進到了extjs.com”;還有一些很有尊嚴并非常愛國的人會說:“真丟無恥,真丟中國人的臉,把別人的東西改改就說成自己的了,真賤……*&^&^%%^&8…”。
上面的種種反應應該歸納為中國開源的特色悲喜劇。這里我想說的是,如果你真正花一點時間去了解一下Operamasks、了解一下Ext、了解一下Rich Components,那么所有你就不會成為上面悲喜劇中主角。
我們知道Java跟Web式的Rich Components也無法,跟Ajax也無關。Ext專用于Web式的Rich Components,但對于企業級的應用來說,他是解決了很小的一部分問題,而且單獨使用Ext要寫很多很多的跟很酷的Ajax效果一樣很酷又很讓人頭暈的Javascript。那么該如何解決這問題呢?很明顯,只有大家合作。Operamasks也就通過集成同樣是開源的Ext項目來實現了豐富的Rich Components,你可以像開發Delphi或VB那樣,直接往界面上拖出一棵非常實用的樹出來。Rich Components的集成中有很多細節及技巧,本文就不例出。
其實細節還存在很多地方,比如多國語言中的小標簽,注入Spring中的Bean,由于研究Operamask的時間比較短,而且資料也比較少(哪位朋友如果有好的資料或示例方便的話請發一些給我學習),所以暫時就寫這些,以后會逐漸以大家分享。
后記:
雖然才開始投身開源的世界,但發現這個純技術的世界并不是想象中的那么單純。我上一篇寫過
《中國java開源界最可愛的人們》一文,從一些同仁們的回復看出大家對中國的開源(包括項目、環境、產品、人品)仍然很悲觀,甚至還存在一些心理陰暗的人,篇造出什么“軟件界的洪志 lee”之類的大詞,也許就恐天下不亂吧。