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 |