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