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