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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    將Tapestry整合到Spring里去

    將Tapestry整合到Spring里去

    原文:http://tech.blogbus.com/logs/2004/04/139683.html

      在Spring最新的文檔里,有關于如何將Tapestry整合到Spring里去的說明,見這里http://www.springframework.org/docs/reference/view.html#view-tapestry。Spring中文論壇應該會翻譯出來,我就不做重復的工作,只摘要說明一下。

      先看看Tapestry。下圖說明了Tapestry是怎么樣獲取到service的。

      在文檔里,基于Tapestry和Spring的應用被劃分成五層,我們只關注前邊兩層:User Interface Layer和Service Layer。這種劃分對于單獨使用Tapestry的應用也是成立的,從上圖可以看出,那是對Service Layer的操作。當進行整合之后,User Interface Layer仍然是由Tapestry提供,而Service Layer則由Spring接手來提供。

      Service實際上就是Bean,Tapestry原本一套取得Service的機制:getEngine()->getService()。現在,我們用Spring將這些Serviec,也就是Bean管理起來,那么,要解決的問題就只有一個,如何讓Tapestry獲得由Spring管理起來的的Service?

      在Application Context里我們定義了需要被調用的Bean(見文檔),我們給它個名字就userService。那么,在Tapestry的page里,就需要載入這個context,然后取得beanA。

      一個最簡單的方法是利用Spring的static工具WebApplicationContext在Tapestry page對應的Java class definition里直接載入Application Context,并取得userService。

    WebApplicationContext appContext = WebApplicationContextUtils.getApplicationContext(
            getRequestCycle().getRequestContext().getServlet().getServletContext());
        UserService userService = appContext.getBean("userService");

      不過這種用法和我們用Spring的原意有點違背——這不符合DI模式。應該在page里才決定我們調哪個Service。

      所以,推薦的做法如下。

      第一步,讓Tapestry page能夠獲得ApplicationContext,但這次不直接由Tapestry page來做,因為在我們需要訪問ApplicationContext的時候,Tapestry page很難拿到ServletContext,所以我們將其放到Enging里去做。代碼如下:

    package com.whatever.web.xportal;
    ...
    import ...
    ...
    public class MyEngine extends org.apache.tapestry.engine.BaseEngine {
     
        public static final String APPLICATION_CONTEXT_KEY = "appContext";

        protected void setupForRequest(RequestContext context) {
            super.setupForRequest(context);
        
            // insert ApplicationContext in global, if not there
            Map global = (Map) getGlobal();
            ApplicationContext ac = (ApplicationContext) global.get(APPLICATION_CONTEXT_KEY);
            if (ac == null) {
                ac = WebApplicationContextUtils.getWebApplicationContext(
                    context.getServlet().getServletContext()
                );
                global.put(APPLICATION_CONTEXT_KEY, ac);
            }
        }

      這樣就把ApplicationContext放到了global里去,然后我們指定MyEngine是后邊應用里實際使用的的Engine:

    <application
        name="Whatever xPortal"
        engine-class="com.whatever.web.xportal.MyEngine">
    </application>

    (寫著寫著又像翻譯了……不爽-_-)

      第二步,在Tapestry page里取得Bean,代碼如下:

    <property-specification name="userService"
                            type="com.whatever.services.service.user.UserService">
        global.appContext.getBean("userService")
    </property-specification>

      第三步,在page對應的Java class definition增加一個abstract訪問者,也就是一個abstract getter
    方法。代碼如下:

    public abstract UserService getUserService();

      當Tapestry實際載入頁面的時候,會對類文件執行runtime code方法以增加定義了的properties,并將上邊的abstract getter
    方法與新建的fields掛鉤起來。(瀑布汗^^|||)

      ok,這就完成了。詳細的example請看文檔。

      簡單總結一下。Tapestry與Spring的整合實際上是把原本由Tapestry自己負責的Service Layer,也就是對Service/Bean的調用,交給Spring負責。實際的切入點,則在于上圖所示的Engine處。

    posted on 2006-03-11 08:45 都市淘沙者 閱讀(634) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 午夜电影免费观看| 国产一区二区免费在线| 性短视频在线观看免费不卡流畅| 精品国产免费观看久久久 | 日本精品人妻无码免费大全| 亚洲国产成人爱av在线播放| 亚洲黄色在线观看网站| 无遮挡国产高潮视频免费观看| 18禁止观看免费私人影院| 亚洲精品国产成人片| 美女18毛片免费视频| 日韩在线免费视频| 在线精品亚洲一区二区| 最近中文字幕大全免费视频| 亚洲最大激情中文字幕| 国产亚洲精品成人久久网站| 日本中文一区二区三区亚洲| 久久亚洲国产最新网站| 永久在线免费观看| 亚洲av无码一区二区三区网站| 人妻仑刮八A级毛片免费看| 国外成人免费高清激情视频| 日本亚洲中午字幕乱码| 日本19禁啪啪无遮挡免费动图| 亚洲资源最新版在线观看| 久久久久久毛片免费播放| 亚洲一级毛片免费在线观看| 91在线手机精品免费观看| 中文字幕乱码亚洲无线三区| 亚洲国产av一区二区三区| 最好免费观看高清在线| 亚洲精品无码精品mV在线观看| 亚洲一级免费毛片| 亚洲成a人片在线观看中文!!!| 日韩内射激情视频在线播放免费 | 免费精品视频在线| 7777久久亚洲中文字幕蜜桃| 国产精品免费_区二区三区观看 | 久久亚洲精品无码| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 成年女人A毛片免费视频|