Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          將Tapestry整合到Spring里去

          將Tapestry整合到Spring里去

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

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

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

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

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

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

            一個(gè)最簡(jiǎn)單的方法是利用Spring的static工具WebApplicationContext在Tapestry page對(duì)應(yīng)的Java class definition里直接載入Application Context,并取得userService。

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

            不過這種用法和我們用Spring的原意有點(diǎn)違背——這不符合DI模式。應(yīng)該在page里才決定我們調(diào)哪個(gè)Service。

            所以,推薦的做法如下。

            第一步,讓Tapestry page能夠獲得ApplicationContext,但這次不直接由Tapestry page來做,因?yàn)樵谖覀冃枰L問ApplicationContext的時(shí)候,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是后邊應(yīng)用里實(shí)際使用的的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對(duì)應(yīng)的Java class definition增加一個(gè)abstract訪問者,也就是一個(gè)abstract getter
          方法。代碼如下:

          public abstract UserService getUserService();

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

            ok,這就完成了。詳細(xì)的example請(qǐng)看文檔。

            簡(jiǎn)單總結(jié)一下。Tapestry與Spring的整合實(shí)際上是把原本由Tapestry自己負(fù)責(zé)的Service Layer,也就是對(duì)Service/Bean的調(diào)用,交給Spring負(fù)責(zé)。實(shí)際的切入點(diǎn),則在于上圖所示的Engine處。

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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 勐海县| 镇宁| 屯留县| 兴和县| 六盘水市| 田阳县| 黄骅市| 涪陵区| 连州市| 邢台县| 桂阳县| 郸城县| 华亭县| 龙胜| 会泽县| 乌苏市| 徐水县| 临漳县| 玛曲县| 西林县| 吉隆县| 应城市| 光山县| 涞水县| 宜川县| 分宜县| 灵寿县| 安西县| 孙吴县| 刚察县| 齐齐哈尔市| 通江县| 乌拉特后旗| 新和县| 大丰市| 桂阳县| 永仁县| 合水县| 阿瓦提县| 军事| 砀山县|