amp@java

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評論 :: 0 Trackbacks
              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這個雞肋了。

          希望有高手給條生路走走!
          posted on 2008-06-04 19:48 amp@java 閱讀(2351) 評論(11)  編輯  收藏 所屬分類: JSF

          評論

          # re: 缺少GET的JSF令人郁悶 2008-06-04 22:45 小武
          也不至于就為了這個而放棄JSf吧,呵呵
          http://www.laoge.info
            回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-05 08:42 HiMagic!
          要看JSF給你帶了哪些好處,然后權衡一下是否值得,說實在的,我不反對這些框架,但還是覺得自己寫的簡易框架好,因為是量身定做的。各種框架的設計思想是我們的借鑒之處,但我們卻不一定要上他的船。  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-05 11:01 Always BaNg.
          根本上就沒有搞懂JSF!!

          UI只是model的直接顯示。

          定義一個bean,bean里面包含兩個屬性
          class MyBean
          {
          private Role role; //角色
          private int type; //未回復,已回復
          public List getWorkList()
          {
          if (role == AuditRole)
          ....
          if (type == 0)
          . ..
          return list; //最后提供給DataTable顯示的列表
          }
          }

          然后注冊這個bean,在datatable里面 value=#{bean.workList}

            回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-05 17:15 隔葉黃鶯
          JSF 不會不支持 Form 的 GET 吧,那這樣的話,對 RESTful 就沒法支持了  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-05 20:13 amp@java
          @Always BaNg.

          請問role和type的值從哪里獲取呢?  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-05 20:15 amp@java
          @隔葉黃鶯

          JSF的確不支持FROM的get,<h:form>里沒有method這個屬性。但是通過managed bean可以獲取query string 里的參數值,只不過一提交就把參數丟掉了
            回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-06 09:17 Always BaNg.
          我可以給一個完全滿足你需要的完整jsf例子,程序總是有辦法的,關鍵是跳出思維圈、。  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-07 12:57 Always BaNg.
          留下你的email 地址,我給你發過去demo,運行之后你就明白了,或者加我的msn: step.in@hotmail.com。當時搞工作流的時候很深入的修改過JSF,現在不搞了,但我覺得web framework中jsf是最強大的,也最難,因為思維和以往的web開發模式不連續。

          JSF的核心就是基于一系列關聯的request-response短期context,構造出一個面向應用的context即facecontext,其中的重點就是這一系列request-response交互的時候狀態(state)保存的問題。

          在做單個圖形界面開發的時候,比如swing的jframe,我們根本不用考慮參數,狀態的存取問題,因為它在process address space中,狀態保存的地方和根據狀態執行某個操作的方法在同一個scope中,而web開發就不是,一個request-response(體現在form submit中)中保存狀態,而另外一個requst-reponse需要根據前一個request-response的狀態來執行某個操作。

          你碰到也是這個問題,想當然的利用query string來傳遞,但jsf不支持get,jsf提供了不只比get好很多倍的方法,那就是直接放到model中,page里面的control如select/input等直接跟model綁定。

          還有一點,JSF不支持GET,但支持Query String,比如你在某個form里面這么寫
          <h:form action="foobar.jsf?a=1&b=2">

          </h:form>

          通過facecontext.getExternalContext().getRequestParameterMap().
          是能獲取到參數a和b的值得。

            回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-10 09:38 amp@java
          @Always BaNg.
          您好,我的郵箱amplifier2000##163.com
          還望賜教,感謝!  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-10 09:43 amp@java
          @Always BaNg.
          還有一點,JSF不支持GET,但支持Query String,比如你在某個form里面這么寫
          <h:form action="foobar.jsf?a=1&b=2">

          </h:form>

          通過facecontext.getExternalContext().getRequestParameterMap().
          是能獲取到參數a和b的值得。

          ——————————————————————

          <h:form>是沒有action這個屬性的啊,只能提交到本身,并不能提交到其他頁面,強行指定之后也是提交到本身,而且會把后面的querystring丟掉。  回復  更多評論
            

          # re: 缺少GET的JSF令人郁悶 2008-06-11 10:35 Always BaNg.
          不好意思,搞錯了,應該是<form>的action屬性,或者自定義h:form。

          例子發過去了。  回復  更多評論
            

          主站蜘蛛池模板: 阿荣旗| 舟曲县| 沽源县| 江口县| 北辰区| 正蓝旗| 化德县| 佛学| 额敏县| 长子县| 清涧县| 彭山县| 内乡县| 清流县| 平利县| 宁陵县| 霍城县| 广州市| 皮山县| 吉安市| 额敏县| 驻马店市| 盐池县| 盖州市| 鄱阳县| 忻城县| 大关县| 湾仔区| 娄烦县| 扎鲁特旗| 绍兴县| 海伦市| 扬中市| 苏尼特右旗| 阳江市| 黑河市| 乌兰察布市| 成安县| 库尔勒市| 永川市| 巨野县|