<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    征服jsf

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      6 隨筆 :: 0 文章 :: 27 評論 :: 0 Trackbacks
         前一段時間我寫過一篇共享我在項目中使用jsf的一些經驗,主要是概要的提出了一些jsf使用上的建議,這次我想在文章里主要是把seam在jsf中的使用經驗提一下,能讓更多的人了解seam的實際應用和優勢。
        1.seam配置時要注意的地方:
        (1)faces-config.xml里面要加入一個seam的階段監聽:
        
    <lifecycle>
    <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
    <!-- <phase-listener>com.future.egov.jsf.ext.event.DebugPhaseListener</phase-listener> -->
    </lifecycle>

         seam動起來的條件就是從這里發起的,seam通過這個監聽器對jsf的各個階段進行必要的增強以及植入自己的CONVERSATION生命周期,對于這個監聽器的具體細節工作,我還需要更多時間研究,仍在了解中!
          (2) 一定要在工程類路徑的根下放置一個seam.properties文件,你可以設置為空內容,主要是引導seam在初始化的時候加載這個路徑下所有標注為seam組件的對象(通過@Name注釋),http://www.ibm.com/developerworks/cn/java/j-seam1/  seam無縫集成jsf給我了提示!
          (3)web.xml下最小配置是加入seam監聽器
            
        <listener>
              
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
        
    </listener>
           在容器加載工程的時候,初始化seam框架。
          以上三處的配置,你就可以在任何容器中使用seam了!更多的配置大家可以找參考了解吧,我目前在項目中就使用了以上配置。其他配置主要是在seam對ajax,ejb3的支持上,不過seam很新,什么事都會發生!
       2.常用的注釋:(所有被seam定義的領域對象都可以認為是seam組件)
         (1)@Name(XXX),需要在你的領域類上定義,定義了seam組件的名稱,對于jsf來說就是backing-bean,也就是說你不用在faces-config中配置managedbean了!

          (2)@Scope(ScopeType.XXX),可以在你的領域類上定義,表示這個被定義的seam組件在什么上下文中,jsf中主要包括page,event,session,application,conversation這些Scope。我在項目中主要使用event,session,conversation。event就是把組件放入了request中,session同理,conversation是seam獨創的聲命周期,conversation短聲命周期類似request,但是會保存一些jsf容易在請求中丟失的數據(jsf只是保存組件,不保存組件渲染的數據,除非是EditableValueHolder組件,有時候需要通過myfaces的save組件和updateActionListener組件來恢復這些數據),具體保存細節,需要看使用的情況,我有這樣一個經驗:當定義成event上下文,在頁面的一次請求中,有些數據請求時還在,但是到渲染時就不見了,常見在dataTable組件,myfaces的commandNavigation組件,但是換成conversation上下文,這些數據在渲染時又找回來了。但是對于跨度比較大層面,我還是推薦使用myfaces提供的保持機制,我一般使用updateActionListener,而save組件在seam1.2.1的環境下會出錯。如果再有更大跨度,就可以使用conversation上下文的長會話了。

           (3)@Begin(join=true),@End(beforeRedirect=true),當觸發了帶有@Begin標記的方法,conversation的長會話就這樣開始了,主要是為了長時間使用已經加載到conversation域中的對象或者屬性(如果定義了conversation但并沒有加載的可不算):join=true就是告訴你會話中有同名值時繼續賦值,還有一個注釋參數ifOutcome=XXX,就是看你的方法返回的字符串是否和ifOutcome定義的字符串相匹配,如果匹配就開始長會話。當在長會話期間執行到某個方法帶有@End標記那么這個長會話就會結束,這樣防止了內存泄漏問題,我認為這是一個權衡的結果,也許用戶真的會點擊那個帶有結束標記方法的按鈕。beforeRedirect為真就會在結束時清掉conversation上下文所有的信息,如果beforeRedirect=false,conversation只是變成短會話,在結束后的那次請求中還可以使用conversation中的數據,一般會用在messages提示這個應用場景中使用,但是如果要返回數據列表有時就需要清空所有數據,防止數據列表還會重現長會話開始前的情況。

           (4)In(value=XXX,rquest=false,ScopeType=XXX),Out(value=XXX,rquest=false,ScopeType=XXX) seam把它定義為雙射。In是最常用的標注,你可以使用In導入一個jsf的EL變量來獲取jsf模型,例如我要獲取spring的業務bean,而且業務bean已經定義成backing bean,利用spring與jsf集成的方法:
           
        <!-- Managed Beans for options.jsp -->
        
    <application>
            
    <variable-resolver>
                org.springframework.web.jsf.DelegatingVariableResolver
            
    </variable-resolver>
            
    <locale-config>
                
    <default-locale>gbk</default-locale>
            
    </locale-config>
            
    <message-bundle>resources/MessageBundle</message-bundle>
            
    <!--  <view-handler>com.icesoft.faces.facelets.D2DFaceletViewHandler
            </view-handler>        
    -->
        
    </application>

         在seam組件中這樣聲明:
    @In(value="#{userService}", request=false)
    private UserService userService;

     這個示例為seam組件注入了由spring管理的用戶服務對象,它的value是從jsf EL變量中獲取,request=false在告訴seam,如果當前的值沒有找到,那么設置為空,否者當出現沒有找到的情況,seam會拋出空異常。
    @Out屬性主要是把處理過的屬性值會由seam重新再付給上下文也就是Out中所定義的ScopeType上下文,我認為雖然是seam的一個特點,但是在我的應用中不多,主要是注入而非雙射!如果它真的能在短期Conversation中有所作用來代替Myfaces的數據保持機制,我想會好些,我目前只是在長Conversation有所應用。

    3 .@Factory,@DataModelSelection,@DataModel,它們主要來代替數據列表的使用,主要是減少了代碼量,Factory是在請求值階段就對需要實例化的對象進行創建,DataModelSelection定義的屬性,可以透明的抓取數據列表選擇的單行數據,DataModel屬性減少了不必要的get,set。然而我在實際的使用中由于很多不定的情況,大部分的使用上又回到jsf標準的get方式。 這種開發方式我認為seam的目的是想屏蔽與頁面不必要的關系細節,讓開發只需要重視真正的業務,是一個標準的面向對象式結構,當jsf的體系結構的不斷優化,類似這種開發方式我想會越來越有用。
    4. @RequestParameter是個很有用的注釋,它自動把當前屬性和頁面同名的request提交值綁定在一起,雖然這樣使用違背了jsf所追求的面向對象化,http透明化,但是實際開發中會后很多意想不到的情況,有時候在集成式頁面這樣的做法會很有用,當你的頁面中不僅僅有jsf標簽就清楚了!

    seam的其他方面問題我會抽空整理一下,seam目前也是在不斷更新當中,明年出臺的webBeans規范的前身就是seam,其實我更關注的是seam在整個j2ee體系中的角色,它到底是想替代struts的application?還是想替代spring的manager?也許有更多的想法!
    posted on 2007-10-20 13:55 方順 閱讀(2745) 評論(4)  編輯  收藏 所屬分類: jsf

    評論

    # re: 共享我在項目中使用jsf的一些經驗二-seam的配置,上下文介紹[未登錄] 2007-10-20 23:46 Thomas
    寫得很棒,有機會,討教討教。  回復  更多評論
      

    # re: 共享我在項目中使用jsf的一些經驗二-seam的配置,上下文介紹 2007-10-21 22:58 piao
    現在jsf越來越多人關注了  回復  更多評論
      

    # re: 共享我在項目中使用jsf的一些經驗二-seam的配置,上下文介紹 2007-10-24 22:13 @Tendy
    使用 @Name 定義一個 backing-bean
    這個 backing-bean 會被創建兩次
    有哪個朋友知道原因?  回復  更多評論
      

    # re: 共享我在項目中使用jsf的一些經驗二-seam的配置,上下文介紹[未登錄] 2009-03-11 04:22 joe
    @In(value="#{userService}", request=false)

    這里不是"request"是"required"吧??  回復  更多評論
      

    主站蜘蛛池模板: 久久精品7亚洲午夜a| 亚洲最大的成人网| 99在线精品视频观看免费| 亚洲人成人网站18禁| 亚洲日本中文字幕天堂网| 一级特黄aa毛片免费观看| 182tv免费视频在线观看| 亚洲伊人久久大香线蕉| 国产最新凸凹视频免费| 亚洲av无一区二区三区| 亚洲热线99精品视频| 亚洲成在人线aⅴ免费毛片| 日本特黄特色AAA大片免费| 亚洲资源在线视频| 亚洲精品国产高清嫩草影院| 99在线观看精品免费99| 免费观看四虎精品成人| 亚洲国产成人综合| 亚洲精品无码永久在线观看你懂的 | 亚洲AV成人一区二区三区在线看| 亚洲成AV人网址| 日韩不卡免费视频| a毛片免费在线观看| 看成年女人免费午夜视频| 亚洲精品国产专区91在线| 国产乱子精品免费视观看片| 一级特黄a大片免费| 亚洲AV无码资源在线观看| 亚洲国产精品专区| 亚洲人成人网站色www| 国产免费AV片无码永久免费| 亚洲啪啪免费视频| a级毛片在线免费| 日本特黄特色AAA大片免费| 亚洲av成人无码网站…| 亚洲va在线va天堂成人| 久久亚洲日韩看片无码| 亚洲美女又黄又爽在线观看| 亚洲A∨精品一区二区三区| 四虎成人精品永久免费AV| 国产成人自产拍免费视频|