JSF只能采用POST的方法進行FORM提交,同一頁面要顯示不同的內(nèi)容,只有通過POST來改變參數(shù)或者通過SESSION傳遞變量。有時候有大量相似的頁面,這些頁面只有很少一部分不同(例如不同用戶、不同角色、不同頁碼等),通過跟在URL后面的query string本來可以很容易地實現(xiàn),但在JSF里卻不行,只要一提交,馬上就把?后面那串東西丟掉。假如有一個頁面,根據(jù)URL后面的id參數(shù)來顯示FORM的內(nèi)容,提交的時候如果驗證出錯,那個FORM的內(nèi)容就丟失了,顯示一個莫名其妙的頁面,因為這時候那個id參數(shù)已經(jīng)沒有了。還有常用的分頁操作,本來在URL后面加上個頁碼就可以了,但是JSF的分頁控件卻只能通過POST來翻頁,一刷新就出來個“重試”“取消”的對話框,讓人煩惱。如果頁面內(nèi)容根據(jù)不同用戶角色有細微不同,就得每個角色建立一個頁面,每個頁面對應一個managed bean,這些頁面的內(nèi)容基本相同,bean的內(nèi)容也基本相同,卻要分別建立,一點重用的機會都沒有。今天做的一個東西就遇到了這種問題:
一個簡單的審批流程,只有3個角色,申請者、審批者、執(zhí)行者,整個流程是這樣的:申請者填單->審批者查看并審批->執(zhí)行者執(zhí)行并填入結(jié)果->申請者查看。這樣,每種角色都有兩種列表:未回復和已回復,這兩種列表在三個角色里面都是相似的,但有細微區(qū)別:
|
申請者 |
審批者 |
執(zhí)行者 |
未回復列表 |
自己已發(fā)出但未被執(zhí)行者執(zhí)行的列表 |
申請者已提交但自己未審批的列表 |
審批已通過但自己未執(zhí)行的列表 |
已回復列表 |
自己已發(fā)出且執(zhí)行者已執(zhí)行的列表 |
申請者已提交且自己已審批的列表 |
審批已通過且自己已執(zhí)行的列表 |
這些列表的不同之處在于:已登錄用戶的角色(可以從session中得到,但一個用戶可能有多種角色,他可能以不同的角色查看列表),列表的當前狀態(tài)(對每種角色都有兩種狀態(tài)),列表的頁碼。由于每個列表都有可能有大量數(shù)據(jù),所以必須用到分頁。通過JSF的DataTable空間和DataScroller控件可以簡單地實現(xiàn)分頁,然而,這種分頁導致URL后面的參數(shù)無效了,這樣一來,這六種列表就必須通過6個頁面來顯示了,通過頁面的名稱來區(qū)分當前用戶的角色、所查看的列表的狀態(tài),每個頁面通過POST來決定頁碼。本來一個頁面+一個bean+3個參數(shù)就可以決定,現(xiàn)在需要6個頁面+6個bean來完成了。
list.jsp?type=0&role=0&page=1->type0_role0.jsp
list.jsp?type=0&role=1&page=1->type0_role1.jsp
list.jsp?type=0&role=2&page=1->type0_role2.jsp
list.jsp?type=1&role=0&page=1->type1_role0.jsp
list.jsp?type=1&role=1&page=1->type1_role1.jsp
list.jsp?type=1&role=2&page=1->type1_role2.jsp
假如有n種狀態(tài)m種角色那豈不是要n*m個頁面+n*m個bean?
有點想放棄JSF這個雞肋了。
希望有高手給條生路走走!