08 April 2006

今個兒晚上跟 koji 聊起 Wicket 和 JSF 的差異比較,一聊就聊了好多,嚴然是 Java Web Framework smack down in Taiwan XD 收獲真是不少啊,下面是聊天的全文,有空有閒的人看一看吧~~

討論者 Web 技術背景
ingram Struts, Tapestry, Wicket
koji Struts, JSF, Wicket, ASP.NET|


ingram: how do you compare wicket and JSF ?
ingram: You already try both framework.......
koji: 我想一下唷...
ingram: 麻煩了
ingram: learning curve, easy of use, extensibility ....
koji: 首先learning curve...我認為現階段jsf比較簡單
koji: 他的life cycle很透明,應該說文件多
ingram: no no no
ingram: learning curve 是指可以用
ingram: 就好
koji: ohoh
ingram: 不是要變 master
koji: 可以用唷...hmm
ingram: 是啊,就學到可以應付一般 web 需求就是了
koji: 這邊不相上下吧,對我來說
koji: 這兩個花了大概一樣時間可以了解到一樣程度
koji: wicket的example幫助蠻多的
ingram: oh oh
ingram: great
koji: jsf我抓到的幾個example太難了
ingram: 是喔....
koji: 反而是個阻礙,但是wicket給的example很有每個component的特色
ingram: 原來如此
koji: 好用我會推wicket
koji: tag library我也不喜歡
ingram: wicket component 也不好學啊, method 很多
koji: 但是api方面我會推jsf,現在的wicket變動太大
ingram: JSF 的問題就是變動不大..... 進展太慢了......
koji: 我覺得算是很直覺,只是看你間不堅持pojo, jsf可以用純pojo
koji: 但是問題是這樣彈性超爛
ingram: what ?
koji: 就是wicket都得用到component api
koji: jsf可以不用
ingram: JSF 不是都用 POJO 嗎?
ingram: JSF 也有 super class 可用?
koji: 不是唷,他可以把component綁到variable
koji: 跟asp.net一樣
koji: 但是我不喜歡那樣用就是了
ingram: (webwork 也是如此的樣子)
koji: 但是說複雜感覺wicket跟jsf都可以很複雜哈哈
ingram: wicket 也是都用 POJO 啊
koji: immediate跳過事件觸發之類
koji: 我覺得可以搞的很複雜
ingram: multi-button 的狀況,我們遇到一次
ingram: 有些按鈕要 submit/validate ,有些不用
koji: 對呀我在玩jsf時也在那邊搞很頭大
koji: 外加那時用datatable
ingram: 不過我還是覺得比 struts 簡單 (struts 甚至辦不到)
koji: 給每個row一個按鈕delete資料
koji: 就會因為一些問題model跟資料庫之類的連動怪怪的
ingram: wicket 要辦到不會很難.. 不過要很熟 IModel 的使用
koji: 對,所以其實我覺得兩個要簡單都可以很簡單,要很難可以超難XD..
koji: 阿有個優點wicket我很喜歡
koji: 就是html的部分
ingram: 爽吧
koji: jsf變成塞了tag..真的很難橋
koji: 要去想一下成品會長怎樣
ingram: 不過 view 端想要有個 if 時,wicket 就又變難了點
koji: ya
koji: 但是jsf也差不多
ingram: jsf 沒有 if tag 嗎?
koji: 葯馬把元件disable?我記得可以disable
koji: 他其實只提供元件的tag
koji: 要用其他的就得用jsp囉
koji: 或者jstl
ingram: Wicket 是 override isVisible()
koji: ya JSF我記得也是差不多
ingram: JSTL 不相容 JSF 啦
koji: 只能在外面搭著用
ingram: 原來如此
koji: 不能combine
koji: 就是if else完在跑這樣@@"
ingram: 歷史的包伏
ingram: Wicket 還有一點很棒
koji: 哪個?
ingram: 網頁都是用 Java code 連
ingram: Refactoring friendly
koji: ohoh
koji: XD...jsf的xml咩哈哈
ingram: 這個越到後面,越是重要
ingram: 一開始還好,到後面要改時,就知道超爽
ingram: JSF 上的 html 要寫 url 嗎?
ingram: (像 struts 那樣)
koji: no
ingram: ok, 那還好
koji: 它其實也是像wicket一樣
koji: tag去綁訂event的method
koji: 但是他method回傳字串的導向
koji: 所以他等於是填要綁的class的method
ingram: (= Struts dispatch action)
ingram: 這樣也很直覺啦
koji: ya有點像,所以如果要透過純JAVA IDE去做refactor比較難點
koji: 不像struts透過class
ingram: 打錯囉
koji: 畢竟他不是預設一個class一個page
koji: ya wicket
ingram: Wicket 最傷的就是 session size
ingram: component tree 很大時,就慘了
ingram: JSF 咧?
koji: 其實差不多:$
ingram: 它也把 component instance 放在 session ?
ingram: 還是只有 POJO ?
koji: 我想一下這邊忘了@-@
ingram: Struts 的 Action 是 stateless 的,所以很省,而且預設是 singleton
ingram: Wicket 則是每個 page 都丟到 session裡,如果 Page A->B->A 這樣,A 在 session 就是兩份了
koji: 恩恩
koji: 我記得他也是component樹狀圖,但是是不是有把jsf page丟到session...hmm
koji: 他的backing bean是可以設定丟到request or session
ingram: 這樣說好了
ingram: 他的 component 是 singleton 嗎?
koji: 如果是指backing bean..no
koji: 阿你是說如果A->B->A
ingram: 你自訂 component 時,有強制要設計成 stateless 嗎?
koji: 對應A的按鈕的bean
koji: 那那個bean如果是session
koji: 會是只有一個
ingram: bean 是資料啦
koji: 在jsf稱他backing bean
koji: 幫忙處理事件
ingram: 對 wicket 來說,bean 也會只有一份 (除非你從資料庫重抓)
ingram: backing bean 是 POJO ? domain object 嗎?
koji: 妳這邊domain是?
ingram: User, Project, Employee, Car.... etc
koji: nono
ingram: Domain Layer 的東西
koji: http://muimi.com/j/jsf/shop/shop/shop.jsp
koji: 你看這個頁面有個 cart.removeItem
koji: <h:commandLink actionListener="#{cart.removeItem}">
koji: http://muimi.com/j/jsf/shop/shop/Cart.java
koji: 他會對應到這個的method removeItem
ingram: 這個就是 Domain Object
ingram: POJO
koji: 恩~~~該怎說呀,他跟wicket的處理事件的意義是一樣的
ingram: (只是他不是 entity 而已,但是在 domain 上他還是佔一席之地)
ingram: wait
ingram: public void takeItem(ActionEvent e){
ingram: ActionEvent ?!
ingram: 所以不是 POJO 囉
koji: jsf的event
koji: 對呀他本身其實有點類似wicket的page
koji: 如果以處理事件的角度來看
ingram: 只是沒繼承而已,這樣還是算 intrusive 啊
koji: yes..這東西可以指定塞session or request
ingram: orz
koji: i mean Car.java
ingram: 那... JSF 的 POJO 是在哪裡?
ingram:
  
public void addItem(Item item) {
    items.add(item);
}
public void takeItem(ActionEvent e){
}
koji: 如果你要純的話可以不用Action Event..:P但是這樣曲不到event相關的東西
koji: 可以寫成takeItem()
ingram: 上面的 addItem 是屬於 business logic
ingram: 那不就沒 event 了
koji: ya...這個範例沒把logic跟東西切開
koji: event沒有也可以觸發method
koji: 只是你曲不到event相關的屬性
ingram: 所以 JSF 總共要 tag + backing bean + POJO (domain object)
koji: yes
koji: backing bean其實就是logic了..
koji: 你看過asp.net嗎?
ingram: no
koji: ohoh
koji: 我想說看過的話其時就類似
koji: tag去bind backing bean的method
ingram: 這樣這個 backing bean 要怎麼寫 test ?
ingram: 混著測?
ingram: JSF 比較像是 Tapestry
koji: 恩~~有點這種感覺,如果以我對tapestry的依稀記憶XD
ingram: 難怪會有 facelet 這種東東
koji: 你是說FacesServlet?
ingram: (還是叫 MyFaces... ? 搞不清楚)
koji: myfaces是另一個ri了
koji: 因為sun作的太爛
koji: 聽說大家偏好用myfaces的時作品XD
ingram: 就是不用 寫 jsf tag,用純 html tag 來當 jsf 的 view ?
koji: 做不到
ingram: 有啊
koji: 純html?
koji: 這樣怎麼綁@_@我沒查過耶,有這個東西可以用唷
ingram: 我看過像是 <input type="text" xxx="h:input..." />
ingram: 像這樣的東西
ingram: 弄個像 wicket:id , @jwcid 的東西,把 jsf tag 放到裡去
koji: 這我就沒用過了...
koji: anyway如果叫我覺得作專案挑哪個
koji: jsf缺點給我是元件發展很不熱中
koji: 外加沒啥活力
ingram: 沒有元件嗎?
ingram: 不是有大廠.....?
koji: 很沒有活力,大廠說到現在也沒幾個XD
ingram: orz
koji: sun本身的爛元件都在creator上
koji: 沒有給想不用creator的人的
koji: ibm的是自家的啥faces的
ingram: 原來如此.... oracle ADF
koji: 頂多只有myfaces跟oracle adf
ingram: Wicket component 還算有發展,最近 AJAX 的一直出
koji: 是呀
koji: 這邊對我來說比較有吸引力,還有就是他的寫法很有趣
koji:
ingram: really ?
koji: 我是說wicket的page的寫法
koji: 感覺真的很像在寫desktop軟體這樣
ingram: (寫到後來 page 物件會變的很長喔,300~400 行)
ingram: 是啊
koji: 對呀可能是我還沒寫到那麼長:P所以還覺得有去哈哈
ingram: 像是用 JFrame ,一個固定的 container 從頭用到尾這樣)
ingram: 而不是分很多頁去做
koji: 恩恩..
ingram:
<form jsfc="h:form"> 
   <input jsfc="h:commandButton" type="submit" id="back" value="Back" action="success"/> 
</form>  
ingram: 這是 facelets 的片斷
ingram: JSF 有一群人是朝這個方向前進啦
koji: jsf一開始我覺得真的還不賴說,但是他真的需要搭配合適的ide
koji: 但是他現在真的太遲緩了
ingram: hmm.......
ingram: spec 真是太慢了,EJB3 也是很久
koji: 剛剛你問的那個
ingram: facelets ?
koji: 就是像struts是stateless
koji: wicket是每個page一個instance到session
ingram: component 是 statless 的,state 都放到 backing bean 裡
koji: jsf是可以設定成request or session for每個user
koji: ya
koji: 那那個state
koji: 是存在backing bean. bean是request or session都可以
ingram: i see
koji: request就每request就新產生,reponse完就結束, session就是綁在每個user囉
ingram: 所以還是可以調成 request,節省 size
koji: yes
koji: 阿我想起來了
ingram: Wicket 應該是現在所有 web framework 最傷 memory 的吧 XD
koji: jsf我不能接受的缺點有一個
koji: 網址
ingram: 網址不能 mapping ?
koji: 就是他會是上一個動作的url
ingram: 沒有 redirect ?
koji: yes
ingram: Wicket 要怎麼做到呢?
ingram: 我印像中好象也是這樣
koji: 除非明是設定
koji: jsf是可以設定拉
koji: 就是另外在xml設定redirect
koji: 但是我記得有人說這樣涉有啥缺點我忘了
ingram: wait ,如果一直是上個動作,那不就從頭到尾全部的 URL 都不變?
koji: 如果沒在xml明是設定會變成都是上一個的
koji: a->b->c
koji: url會是a->a->b我沒寄錯的話我看一下
ingram: 耶.... 只要不是 redirect,web app 都是這樣啊?!
koji: 通常request base不是呀,你就市直接到指定目標的url
ingram: link 會這樣嗎?
koji: 譬如說我暗按鈕 ->input.jsp
ingram: A page 上的 <a href="toB">
koji: 暗完到result.jsp他會顯示input.jsp
ingram: 是 form 還是 link ?
koji: 如果現在我result.jsp也有按鈕到input.jsp
koji: 那麼按下去他到了input.jsp會顯示result.jsp在顯示列上
koji: form
koji: link是對的囉
ingram: 暗完到result.jsp他會顯示input.jsp ?
koji: ya
koji: url
ingram: 應該是顯示那個 form 的 action 吧
koji: oh因為jsf不是顯示action
koji: 他的action都是自己的jsp
koji: form acttion="自己.jsp"
ingram: 那........ 當然會一直是自己的 url..... 不會吧
ingram: 這樣違反 html
koji: 他url會是自己,但是畫面已經是下一個頁面
ingram: 怪怪的
ingram: Wicket 沒這問題
koji: 其實隊運作來說沒問題,但是會對使用者可能會造成confuse
ingram: (我看只有 JSF 會這樣吧 (大汗)
koji: 我記得那時再看網路上討論
koji: 就有人問jsf的spec說這樣user會怪怪的
koji: 結果spec也怪怪的回答說,只有developer會care這個,user不會
koji: 我自己是蠻care的拉@_@
ingram: 除非是完全寫 web "application"
ingram: 不然,使用者還是會 care URL....
koji: 是低
koji: 所以我看到很多人說
koji: 感覺很噁心XD
koji: 葯馬就全部不要變
koji: 葯馬就正常變
koji: 要變不變的
ingram: 噁心 <- 這個形容詞真貼切
koji: 很難過
ingram: 我也覺得很 sick
koji: 如果明示設定redirect有人會不太喜歡一個request發兩次connection
koji: wicket是本身就是redirect?
ingram: no
koji: 它是用什麼?
ingram: 就一個 request
ingram: 耶.... 我可能要再確認一下... 我一開始學的時候以為全部是 redirect
ingram: 後來好像不是
ingram: not sure
koji: 恩恩那時好像有說他可以設定三種!?
ingram: 不過用起來沒啥問題,也不用再考慮 redirect after post 這種 pattern
koji: 恩恩
ingram: 那是 buffer 的設定吧
ingram: wrong
ingram: 是三種沒錯
ingram: 不過最近好像被 refactoring 掉了,我找不到..... orz
koji: 恩恩
koji: http://www.wicket-wiki.org.uk/wiki/index.php/Render_strategies 這邊這個齁
koji: 阿有個優點都忘了提
koji: 就是jsf
koji: 自己元件很難做XD
koji: 這個大概是痛
koji: 不然對我來說一個專案剛開始
koji: 要重新教育jsf or wicket
ingram: so ?
koji: 基本上如果是交我對我感覺差不多,但是那個url,跟元件
koji: 會讓我想用wicket XD
ingram: 哈哈
koji: 因為jsf的元件就算是繼承原本的想customize也很難
koji: 我記得之前我試過
koji: 但是一陣子了XD忘記了但是那個大概會是最大的阻力
ingram: 嗯嗯
ingram: 我看範例也是被嚇到了
ingram: 有 jsp custom tag 重演那種感覺
koji: ya
koji: 外加你的render phase
ingram: (剛看了一下你給的 Wicket page,回憶起來啦,Wicket 都是用 redirect,不過它有用 cache 就是了)
koji: 還得加上html
ingram: 喔喔
ingram: 算來算去,Wicket 就兩大缺點: memory 太傷和文件太少
ingram: 而 JSF 的缺點... 呃,還真是不少..
koji: ya..恩~~jsf缺點是多拉^^"..但是我覺得都還不算致命傷XD
koji: 除了那個customized componentXD
ingram: 同感
koji: 像我之前會想碰
koji: 也是因為記得那時是你po的八
ingram: 啥?
koji: 就是比較wicket跟jsf的元件撰寫
koji: 你有po個tss的link還是哪個站的
ingram: 喔喔
koji: 比較兩個元件的製作
koji: 指有那個確實說服我:P
koji: 因為xml設定 or jsp tag等等
koji: 寫灌了就有的其實不太會有太大抵抗
ingram: 沒錯
koji: 舊有struts or jsp
ingram: 所以 Struts 還可以活很久
koji: ya..request base會是struts天下
koji: component可能還得在觀察一下,現在剩下jsf跟wicket...tapestry應該算退出了XD
ingram: Struts ,我只在乎他是 url based 的,不能 refactor
koji: struts又把webwork整近來
koji: ohoh
koji: 現在看到唯一的好解就是wicket這種page map class做法才作的到八
koji: 其他都得靠工具呀XD
ingram: 是滴
ingram: 其實 struts+webwork 到底有啥好處真的看不出來
ingram: 還是一堆 URL 啊.....
koji: 更沒有webwork樣的action bean,還有就是減少字相殘殺XD
koji: 現在時代都component base了,在不集中力量
koji: 就真的會沒搞投了這樣XD
ingram: Rails 是 request-based 的吧
koji: 對呀
ingram: request base 永遠都會在啦
koji: 我看到現在我覺得是request base的
ingram: 除非 http 改寫
koji: 他沒有元件哈
ingram: 所以我看了 rails 覺得 view 端不過爾爾
koji: webwork優點大概就時完全把http request response藏起來
ingram: 是 jsp 時貸的東西
koji: struts未來就是action也看不到request, response八
koji: 恩恩
ingram: 是 wrap 起來吧
koji: 可以這麼說拉:P,就更稍微方便unit test
koji: 但是說實話現在tool那麼多
ingram: 喔喔
koji: struts的test也其實不難了
ingram: 是的, Struts 比 Wicket 好測
koji: 不像說要自己去做mock req res,所以我是覺得大概就是爽感八
koji: 看到action沒有servlet api的爽感XD
ingram: 哈哈
koji: 其實真的蠻爽的wicket基本上也不用看到
koji: jsf也是
ingram: wicket 我寫到現在還沒用過 request/response
koji: 但是真的需要時就..wicket我不知道怎曲,jsf就得getFacesContext.getXX.gexTTT這樣一串曲拿哈哈
koji: 恩恩
ingram: 取得? getRequestCycle().getRequest()
koji: 真的有必要時,但是我現在也沒遇到過
koji: 好像沒啥需要:P
ingram: 不過通常取得後也不能幹嘛.... wicket 控制的很嚴
koji: soga
ingram: 尤其是 response
koji: 恩恩不管好就太危險了@"@
ingram: ok
koji: 哈哈其實我也沒整理過
koji: 希望這樣聊有點幫助:P
koji: 有機會我在慢慢整理看看
koji: 可以以後慢慢討論
ingram: 我會把這次的討論上 blog
koji: 外加沒在案子上用
koji: 旺的真的很快orz..
ingram: 沒用自然忘的快啊
ingram: 我下禮拜要開始上 wicket
ingram: 那也是上心酸的
koji: 恩恩看來很有趣哈未啥
ingram: 因為大家不會馬上用
ingram: 一個禮拜後,全忘光
koji: 喔喔
ingram: 只是讓大家有個印像而已
koji: 對呀
ingram: 而不會說,真的要看網上文件時,完全進不了門
ingram: 就這樣子啦
koji: okok
ingram: 本日的 Web Framework smack down in Taiwan 到此為止
koji: 哈哈
koji: 對了有各地方可能我搞錯了
koji: 就是jsf也面
koji: 他也會把狀態存起來
ingram: component 有狀態嗎?
koji: yes
koji: 可以存到session ,這樣會吃記憶體
koji: 但是他一個page只會存一個
ingram: 是手動存還是自己做?
koji: 他有一種辦法可以減少自己存
koji: 就是設定webapplication說指定存到client
ingram: serialize 到 client 的 hidden field 嗎?
koji: 這樣美各業面都會多個類似 <input type="hidden" name="com.sun.faces.VIEW" value="H4sIAAAAAA....++TYPBQ />
koji: yes
koji: 像這樣
ingram: 這個是 Tapestry 的做法
koji: yaya就是像這樣去做
koji: 剛剛突然想到
ingram: (Tapestry 叫做 page persistance)
koji: 所以去跑一下之前寫的範例
koji: 突然想想那時我都沒去care哪些存哪XD
ingram: 這一招有極限啦
koji: 卻很在意life cycle哈哈
koji: 怎麼說
koji: 我沒想過呢
ingram: 當字串太長時,browser 就會罷工
koji: ohoh...那也常的很離譜耶XD
ingram: Tapestry 的 page persistence 可以放 user object
ingram: 我之前放了個 list 進去
ingram: 結果太大,IE load 到一半就不讀了
koji: 原來如此..jsf是因為page component tree跟logic bean分開
koji: 所以應該還好..不知道component 超多會不會出是就是
koji: 有可能太多元件咩@@"
ingram: 所以 JSF component 設計要小心,不能放太大的
ingram: 喔,這也有可能
koji: XD
koji: 這邊我就沒詳細查過他會存每個元件的哪些東西
koji: 如果存太多確實會有問題XDXD..
ingram: 這種做法,只有在 form 的元件可以這樣做
ingram: 其他元件就不行了
koji: 恩恩
koji: okok那今天先這樣哈哈
ingram: thanks a lot!!!
koji: 其實像半user group討論這些應該蠻有趣的
koji: 到時看看走向是怎樣
koji:
koji: 下次在慢慢聊^^~
ingram: great!
koji: 晚安拉
ingram: 881