最近忙于修訂《Javaserver Faces in Action》,都沒(méi)有時(shí)間來(lái)修改這個(gè)文檔了。我發(fā)現(xiàn)校對(duì)文稿真的是一個(gè)非常辛苦的事情,比起寫(xiě)來(lái),要麻煩得多。何況我又不是一個(gè)細(xì)致的人。真是有些痛苦。今天抽點(diǎn)時(shí)間來(lái)繼續(xù)將這部分發(fā)點(diǎn)出來(lái)。
很多人都問(wèn),Struts中用什么處理模型和數(shù)據(jù)。
我以前總說(shuō),這和Struts有什么關(guān)系?
從實(shí)際上來(lái)說(shuō),這的確和他沒(méi)什么關(guān)系,因?yàn)樗荕中立的。你可以使用你自己喜歡的任何M實(shí)現(xiàn)。但是正因如此,其實(shí)也還是和她有關(guān)系的,那就是它本質(zhì)上的MVC的分層設(shè)計(jì)。
對(duì)Struts本身來(lái)說(shuō),作為最成功的一個(gè)MVC框架,實(shí)際上其最成功之處和精彩之處就是其中的C,即它是一個(gè)比較好的Front
Controller 模式的實(shí)現(xiàn)。 很多地方,特別是其它利用了它的大型框架,都利用了他的這個(gè)優(yōu)點(diǎn)。比如Oracle 的ADF。
但是對(duì)小型應(yīng)用來(lái)說(shuō),很多人在爭(zhēng)論,Action到底是M還是C。其實(shí)這并不重要,如果應(yīng)用小型,你盡管可以在其中實(shí)現(xiàn)你的Biz Logic。這樣的話,它就是M。否則,稍大型一些的應(yīng)用,最好還是作為一個(gè)C來(lái)使用,至少是C的一個(gè)helper。
那么,具體的M怎么辦呢?常規(guī)的做法是委托給POJO或者EJB。但是基于分層的目的,這中間通常是需要一個(gè)緩沖,那就是Facade。SUN的
官方Facade實(shí)現(xiàn)原來(lái)推薦的是Session
EJB,這感情好,如果你能搞定它,業(yè)務(wù)和實(shí)體也可以盡管使用EJB。如果你不能負(fù)擔(dān)EJB之痛,你可以使用POJO
Facade來(lái)訪問(wèn)你的POJO實(shí)現(xiàn)的邏輯。
那么你的POJO生長(zhǎng)在哪里?目前的Spring 等IoC容器正是一個(gè)好地方。實(shí)際上我想將Spring 成為是“框架之框架”。
OK,那么數(shù)據(jù)層又如何?嘿嘿,實(shí)際上離Struts太遠(yuǎn)啦,嚴(yán)格說(shuō)起來(lái)他不想知道,也不用知道。你可以使用任何需要的持久實(shí)現(xiàn),關(guān)鍵是作為DTO傳遞給C和V的結(jié)果,以及它們之間的轉(zhuǎn)換。
本書(shū)中的ProcessBean是早期的一個(gè)POJO Facade,非常不錯(cuò)。但是不知為和這個(gè)包一直在Apache Commons的沙坑中跳不出來(lái)。而且如今有些陳舊了。
不過(guò),本章其中的RSS和Lucene的講述倒是不錯(cuò)。值得參考。
這里下載。
一直以為,國(guó)際化是個(gè)問(wèn)題,本地化不是問(wèn)題。
但是,老是有人層出不窮地問(wèn)中文的問(wèn)題,真是生生被他們氣死。
有時(shí)間的時(shí)候準(zhǔn)備寫(xiě)一篇文檔,徹徹底底的描述一下Java的文字處理問(wèn)題。不過(guò)這里先說(shuō)幾點(diǎn)最重要的:
1 先要搞清除字符集(CharacterSet)和編碼方案(Encoding Schema)的意思;
2 Java系統(tǒng)內(nèi)置Unicode的問(wèn)題處理方式,這點(diǎn)是最基本的前提,不要忘了;
3 操作系統(tǒng)的代碼頁(yè)(CodePage)和字符集的關(guān)系;
4 JSP中,注意page指令的charset不是字符集的意思,實(shí)際上是一中Java內(nèi)置的字符集和編碼方案結(jié)合的編碼;
5 不知道為什么總有人喜歡GB2312,記住:早過(guò)時(shí)了;
6 解決編碼問(wèn)題的方法就是盡量統(tǒng)一到Java系統(tǒng)的編碼上;
7 只有國(guó)際化才能徹底解決中文化的問(wèn)題。盡量不要強(qiáng)行轉(zhuǎn)碼,如果每一個(gè)字符都轉(zhuǎn)碼,效率如何不用說(shuō)了吧?
8 學(xué)會(huì)使用Local
好了,先說(shuō)這么多。
下載這一章。
據(jù)Struts聲稱, Validator是從Struts0.5就開(kāi)始使用了。從Struts1.1開(kāi)始,Validator就成為Jarkarta Commons的一個(gè)組件。從而成為一個(gè)非常有用的通用工具。
關(guān)于Commons Validator的地址,可以訪問(wèn):http://jakarta.apache.org/commons/validator/ 。Struts發(fā)行包中帶有這個(gè)包,也可以單獨(dú)在此處進(jìn)行下載。
Validator應(yīng)用的Struts官方指南參見(jiàn):http://struts.apache.org/userGuide/dev_validator.html 其中也有幾個(gè)相關(guān)資源。
使用中要注意的有幾點(diǎn):
- 注意DynaValidator的使用與常規(guī)ActionForm的校驗(yàn)
- 注意mapping中validate的配置
- 注意action中validate方法與validator的關(guān)系
Validator是一個(gè)同用框架,你可以使用在很多地方,包括最近流行的Spring 之中。
本章下載。
Liferay Portal 3.5發(fā)布了。仍然是Pro版和Enterprise版。
比上一版本相比,增加了幾個(gè)顯著的特色是:
- 支持JSF,Myface的Portlet
- 對(duì)Portlet URL進(jìn)行了優(yōu)化
- 動(dòng)態(tài)熱部署的theme
其實(shí)我最喜歡的是他能夠內(nèi)建一個(gè)WorkFlow引擎,這樣就非常完美了。
它的Pro版從3.0開(kāi)始就該成Struts + Spring的架構(gòu),企業(yè)版中似乎也緊緊是使用了Session Bean作為Facede.那么在Pro版本中Spring 是如何使用的,倒要仔細(xì)研究。J2EE官方模式已近在提 POJO Facede的概念了(見(jiàn)J2EE Core Pattern, 2nd Ed.)。這里是否就是這種用法。因?yàn)椋浜蠖藰I(yè)務(wù)部分幾乎不用修改的。
這是其登錄后的主頁(yè)面:

我沒(méi)注意到,頁(yè)面上部右邊有個(gè)下拉列表框,支持多個(gè)工作區(qū)的選擇,這是否是上一個(gè)版本就有的功能。這個(gè)倒是非常不錯(cuò)。
它的CMS做得基礎(chǔ)還可以,但是做得不是很友好。需要比較麻煩的定義。如果支持分類學(xué)(Taxonomy)
就好了。一種以為,CMS不支持MetaDate和Taxnomy根本算不上content Management。這點(diǎn),還不如PHP的Drupal做得好。最近SpringFramework網(wǎng)站的改版就是使用了Drupal框架。我覺(jué)得,就PHP陣營(yíng)來(lái)說(shuō),Drupal比Mambo還要好些。不過(guò)后者似乎運(yùn)作的很好,連國(guó)內(nèi)也有很多FANS。
他的HOT THEME的功能,發(fā)行包中帶了四個(gè)Theme,Liferay網(wǎng)站上一個(gè)很COOL的并沒(méi)有隨之發(fā)行,需要另外下載。而且原來(lái)的很多配色方案,也只有幾種了。
另外就是,原來(lái)支持認(rèn)為他的i18n中中文做得不好,有很多奇怪的翻譯,而據(jù)說(shuō)他們的核心團(tuán)隊(duì)還有中國(guó)人的。這次我選擇中文Local,居然沒(méi)反應(yīng),仍然是英文界面。不是是何原因?我使用的是Pro版本,不知Ent是否有此問(wèn)題。
這是一個(gè)theme:

我一直認(rèn)為tiles應(yīng)該從Struts中獨(dú)立出來(lái),成為一個(gè)單獨(dú)的項(xiàng)目。至少也應(yīng)該放入Commons之中。不過(guò),到Struts1.2版本中仍然沒(méi)有動(dòng)靜。Shale對(duì)此也沒(méi)有明確的說(shuō)法。
兩大主要的布局工具,相比而言,我還是覺(jué)得Tiles要好用一些,而且方式優(yōu)雅。對(duì)此,Struts分發(fā)包所帶的例子tiles-Document就是一個(gè)非常有用的學(xué)習(xí)例子。(很多人來(lái)消息說(shuō),想要通過(guò)例子學(xué)習(xí)Struts,那么朋友,你可曾研究過(guò)Struts的自帶例子?如果沒(méi)有,那就好好看一看吧。關(guān)于Struts中的示例程序,大家可以參考我前面所寫(xiě)的“Struts秘籍”中的一篇。)。Tiles不僅是對(duì)布局,而且本身還自帶對(duì)菜單的支持。而且,著名的開(kāi)源門(mén)戶項(xiàng)目 liferay 就是使用的Tiles作為布局工具,實(shí)現(xiàn)了portlet的表現(xiàn),甚是了得。(另一個(gè)很好的portal ExoPlatform則是使用了JSF。)
當(dāng)然,Sitemesh也非常不錯(cuò),而且由于使用了裝飾器模式和Servlet Filter,靈活性更高。你可以用它做你愛(ài)做的事情,做你想做的事情。不過(guò),似乎因?yàn)镾itemesh是 opensymphony 的項(xiàng)目,好像大家就以為它只能與WebWork配對(duì)使用,或者心存這種假設(shè)。其實(shí)不然,呵呵,這種假設(shè)不成立。它們兩個(gè)都是中立的。完全可以根據(jù)你的需要選擇使用。SiteMesh也完全可以用于Struts項(xiàng)目。
還有一個(gè)項(xiàng)目是Struts-Layout,這個(gè)項(xiàng)目則主要偏重于細(xì)微的表現(xiàn),比如樹(shù)型,面板之類的。較少用于總體布局。不過(guò)這些對(duì)JSF來(lái)說(shuō)都是小Case了。
IBM WSAD本身支持一種模板的布局處理方式,大家可以參考。它實(shí)際上是一套可以由IDE管理的代碼復(fù)制和重用機(jī)制。對(duì)整體布局和網(wǎng)站基礎(chǔ),比如導(dǎo)航、菜單、面包屑、SiteMap等支持也非常不錯(cuò)。大家也可以研究一下。
開(kāi)發(fā)工具來(lái)說(shuō),最好的Struts開(kāi)發(fā)工具還是M7的Nitrox,對(duì)Tiles的支持也非常之棒。可惜不是免費(fèi)的。也鮮見(jiàn)破解版本。另外就是Exadel Studio,也非常不錯(cuò),這方面好像是在學(xué)習(xí)M7。而且它前些時(shí)候剛推出免費(fèi)版本。
當(dāng)然,各個(gè)商業(yè)IDE還是對(duì)其支持的不錯(cuò)。
這一章感覺(jué)并為把Tiles講解夠深。至于Tiles的高級(jí)應(yīng)用,在Tiles-Document示例應(yīng)用中,可以找到一個(gè)相關(guān)的鏈接。
在這里下載這一章。