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