jojo's blog--快樂憂傷都與你同在
          為夢(mèng)想而來,為自由而生。 性情若水,風(fēng)起水興,風(fēng)息水止,故時(shí)而激蕩,時(shí)又清平……
          posts - 11,  comments - 30,  trackbacks - 0
          http://tech.blogbus.com/logs/219144.html

          兩個(gè)月前,寫了一篇blog,名為《將Tapestry整合到Spring里去》,是根據(jù)文檔做了理論上的說明。這陣子終于開始動(dòng)手做,由于犯了一個(gè)很低級(jí)的錯(cuò)誤,浪費(fèi)了很多時(shí)間,直到周六才“擺平”,很高興。網(wǎng)上這方面的資料非常少,我把實(shí)際操作過程再介紹一下,也算補(bǔ)一下文檔的不足。事實(shí)上Spring網(wǎng)站的文檔是給對(duì)Spring和Tapestry都有開發(fā)經(jīng)驗(yàn)的人寫的,多少有點(diǎn)過于簡(jiǎn)略,不是很方便使用。

          第一步:寫一個(gè)Java Bean供后邊調(diào)用:

          package my;//接口
          public interface IBean {
           public void amethod();
          }

          package my;//實(shí)現(xiàn)類
          public class Bean implements IBean {
           
           public void amethod() {
            //do something;
           }
          }

          第二步:編寫Spring的context config文檔applicationContext.xml,放在web應(yīng)用的/WEB-INF目錄下

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
          "
          http://www.springframework.org/dtd/spring-beans.dtd">
          <beans>
           <bean id="aBean" class="my.Bean">
           </bean>
          </beans>

          第三步:先試試直接載入Spring Application Context的做法。寫一個(gè)tapestry頁面(這里要求你對(duì)tapestry多少有點(diǎn)認(rèn)識(shí)),如test.html,在對(duì)應(yīng)的test.java中寫入以下代碼:

          WebApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(getRequestCycle().getRequestContext().getServlet().getServletContext());
          IBean bean = appContext.getBean("aBean");
          bean.amethod();

          這里要說明一下,Spring的幫助文檔有點(diǎn)錯(cuò)誤,它用了WebApplicationContextUtils.getApplicationContext()的方法,但實(shí)際不存在這個(gè)方法,應(yīng)該用WebApplicationContextUtils.getWebApplicationContext()

          第四步,改為推薦的做法,在Engine里做上邊的getWebApplicationContext(),并將其寫到tapestry的global對(duì)象里邊去。

          public class MyEngine extends BaseEngine {
           public static final String APPLICATION_CONTEXT_KEY = "appContext";
           protected void setupForRequest(RequestContext context) {
            super.setupForRequest(context);
            Map global = (Map) getGlobal();
            ApplicationContext ac = (ApplicationContext) global.get(APPLICATION_CONTEXT_KEY);
            if (ac == null) { ac = WebApplicationContextUtils.getWebApplicationContext(context.getServlet().getServletContext());
             System.out.println("測(cè)試" + ac);//你可以看看這一句在什么時(shí)候執(zhí)行,從而了解Engine是什么時(shí)候被調(diào)用的;
             global.put(APPLICATION_CONTEXT_KEY, ac);
            }
           }
          }

          global是一個(gè)Map,我們?cè)诶镞呍黾恿艘粋€(gè)屬性appContext,并將取到的ApplicationContext放進(jìn)去,以后,通過調(diào)用global.appContext就可以得到context,并用來getBean。

          第五步,在tapestry應(yīng)用的sample.application文檔(文件名與web.xml對(duì)應(yīng))里,指定所使用的Engine,也就是第四步寫的內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE application PUBLIC
            "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
            "
          http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">

          <application name="Sample Application" 
           engine-class="MyEngine">
           <page name="test" specification-path="test.page"/>
          </application>

          第六步:在test.html對(duì)應(yīng)的test.page里,加入獲取bean的操作,代碼如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE page-specification PUBLIC
            "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
            "
          http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
          <page-specification class="test">
            <property-specification name="aBean" type="my.IBean">
             global.appContext.getBean("aBean")
            </property-specification>
          </page-specification>

          第七步:在test.java里增加一個(gè)abstract getter:

          public abstract IBean getABean();

          之后,就可以在代碼里用getABean()的方法獲取我們需要的bean了,如:

          getABean().amethod();

          當(dāng)然,不要忘了編輯web.xml文檔:

          <?xml version="1.0"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "
          http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
           <display-name>Tapestry Tutorial</display-name>
           <!--Redirect it to the servlet mapping address /h-->
           <filter>
            <filter-name>redirect</filter-name>
            <filter-class>org.apache.tapestry.RedirectFilter</filter-class>
            <init-param>
             <param-name>redirect-path</param-name>
             <param-value>/app</param-value>
            </init-param>
           </filter>

           <filter-mapping>
            <filter-name>redirect</filter-name>
            <url-pattern>/</url-pattern>
           </filter-mapping>
             
           <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
           </context-param>
           <servlet>
            <servlet-name>context</servlet-name>
            <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
           </servlet>
           
           <servlet>
            <servlet-name>sample</servlet-name>
            <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
            <load-on-startup>0</load-on-startup>
           </servlet>

           <servlet-mapping>
            <servlet-name>sample</servlet-name>
            <url-pattern>/app</url-pattern>
           </servlet-mapping>

           <session-config>
            <session-timeout>15</session-timeout>
           </session-config>
           
           <welcome-file-list>
            <welcome-file>index.htm</welcome-file>
           </welcome-file-list>
           
          </web-app>

          小結(jié):事實(shí)上,這個(gè)過程與我上次寫的內(nèi)容大體相似,不過經(jīng)過實(shí)踐之后,我可以肯定地說這是走得通的,如果你配置時(shí)出現(xiàn)問題,那可能是在一些其它地方忽略了什么。象我這一次就是……嗯,具體的不說了,說出來會(huì)很不好意思的。如果有人配置時(shí)正好看到這篇文檔,希望對(duì)你有幫助^_^

          Ps其實(shí)這一次失誤的過程也可以寫成篇blog,重點(diǎn)在于期間的心路歷程。不過還是算了。這段時(shí)間的工作受情緒影響太大了,如果以后成為管理者,一定要注意下屬的情緒問題并盡量予以解決,而不能認(rèn)為職場(chǎng)不需要關(guān)注這樣的事。

          又:Blogbus回退時(shí)輸入數(shù)據(jù)會(huì)丟失,雖然我知道這是Web應(yīng)用開發(fā)里的難題,不過還是希望能夠列入待解決的問題里去-_-

          posted on 2008-10-05 23:25 Blog of JoJo 閱讀(237) 評(píng)論(0)  編輯  收藏 所屬分類: Programming 相關(guān)

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          相冊(cè)

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 乐安县| 宁化县| 竹溪县| 建水县| 莱州市| 寿光市| 六枝特区| 色达县| 开化县| 巫溪县| 东辽县| 上思县| 内江市| 九龙县| 通道| 阜城县| 定远县| 肇东市| 建宁县| 通河县| 彰武县| 通化市| 仙居县| 保德县| 镇坪县| 北海市| 龙州县| 靖江市| 平湖市| 阿克苏市| 西安市| 攀枝花市| 邵东县| 杭锦旗| 筠连县| 吉安市| 牙克石市| 沂水县| 大城县| 息烽县| 阜城县|