jojo's blog--快樂憂傷都與你同在
          為夢想而來,為自由而生。 性情若水,風起水興,風息水止,故時而激蕩,時又清平……
          posts - 11,  comments - 30,  trackbacks - 0
          http://tech.blogbus.com/logs/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 2008-10-05 23:27 Blog of JoJo 閱讀(340) 評論(0)  編輯  收藏 所屬分類: Programming 相關

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          相冊

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 深泽县| 江川县| 绥德县| 闽侯县| 漳浦县| 杭州市| 桐梓县| 建平县| 绥德县| 土默特右旗| 顺昌县| 祥云县| 惠水县| 泸水县| 西吉县| 临漳县| 舒兰市| 石楼县| 厦门市| 高碑店市| 巨鹿县| 车险| 民和| 贺兰县| 涞源县| 泸水县| 漳平市| 庄浪县| 九寨沟县| 招远市| 浙江省| 陆良县| 肇州县| 阿拉尔市| 明溪县| 广东省| 道真| 获嘉县| 洛川县| 巴彦淖尔市| 南阳市|