Open-Open

          皇家撒拉哥薩
          posts - 32, comments - 3, trackbacks - 0, articles - 1

          Tapestry 4.0 新特性(9月8日修訂)

          Posted on 2006-02-10 01:11 開源愛好者 閱讀(297) 評論(0)  編輯  收藏 所屬分類: Tapestry
          參考:http://jakarta.apache.org/tapestry/current/UsersGuide
          基本上是理解性翻譯,英文好的可以直接去看此guide,我只是做了筆記,然后放到這里希望能對大家有所幫助。
          新特性我也只是了解,沒有具體應用(很想用Very Happy),有理解錯誤的地方,希望大家原諒。

          Tapestry4新特性(一)-default binding types

          default binding types(默認的綁定類型)
          每一個組件的參數都可以定義默認的綁定類型,如果一個綁定的參數沒有前綴,將使用默認的綁定類型。
          下面的代碼實現同樣的功能:


          <ul element="ul" jwcid="@Foreach" source="ognl:items" value="ognl:item"> <li><span jwcid="@Insert" value="ognl:item.name"/> </ul>

          <ul element="ul" jwcid="@Foreach" source="items" value="item"> <li><span jwcid="@Insert" value="item.name"/> </ul>

          加粗的部分顯示前后的變化,之所以可以這樣定義,是因為Insert組件定義value參數的默認綁定類型為ongl.
          注意:默認的綁定參數總是可以被顯式的綁定聲明覆蓋掉。
          如果沒有定義默認的綁定參數,那么在html模板中定義的默認綁定參數為literal,頁面定義文件里的默認綁定參數為ognl
          修訂:

          從beta4版本開始,此特性已經被刪除,

          Beta4的change log:

          Remove default-binding attribute from element(HLS)

          但是“如果沒有定義默認的綁定參數,那么在html模板中定義的默認綁定參數為literal,頁面定義文件里的默認綁定參數為ognl”這個效果經測試依然存在。

          懷念:

          此段文字在beta3中存在,beta4后就刪掉了!

          Binding Type Defaults
          Tapestry 4.0 introduces a new idea: default binding types. Each component parameter may define a default binding type (using the default-binding attribute of the <parameter> element).

          If a binding reference does not have a prefix, the default binding type is used.

          Because of this, the following two snippets are identical:

          <ul element="ul" jwcid="@Foreach" source="ognl:items" value="ognl:item">
          <li><span jwcid="@Insert" value="ognl:item.name"/>
          </ul>
          <ul element="ul" jwcid="@Foreach" source="items" value="item">
          <li><span jwcid="@Insert" value="item.name"/>
          </ul>
          This works because the Insert component defines the default-binding for the value parameter to be "ognl". Likewise, the source and value parameters of the Foreach component are defined to be "ognl". However, the element parameter of the Foreach component has a binding type of "literal".

          This is a decision made by the component author. If a particular parameter is (nearly) always bound using a particular binding type, then a default-binding may be set. The default binding can always be overriden with an explicit binding type prefix.

          What about parameters that don't define a default binding type? The answer to this question (which includes all informal parameters), is that it depends on whether the parameter is bound in an HTML template, or in a page or component specification. In an HTML template, the default binding type is "literal". In a specification, the default binding type is "ognl".

          Tapestry4新特性(二)-listener method

          如果使用過tapestry的應該知道listener方法在4.0以前版本中的定義,如public void formSubmit(IRequestCycle cycle),方法必須有一個IRequestCycle參數。參數的取得方式如下:Object[] parameters = cycle.getServiceParameters();
          在4.0中參數的取得可以通過以下兩種方式:

          1、調用IRequestCycle.getListenerParameters()方法,需要傳入IRequestCycle實例作為參數。
          2、按照參數的聲明順序依次定義為listener方法的參數。
          第二種方法比較符合軟件的設計思維,而且參數的類型在傳入后保存,而不是想象中的統一String類型。
          例如:
          <a jwcid="@DirectLink" listener="doClick" parameters="{ objectId, index }"> . . . </a>
          其中objectId為String類型,index為int,聲明中使用了默認的參數綁定類型。
          對應的方法聲明如下
          public void doClick(String objectId, int index)
          { . . . }
          此為第二種方式,可見方法的定義符合自然習慣,當然你也可以通過傳統的方法,如下所示: public void doClick(IRequestCycle cycle)
          { Object[] parameters = cycle.getListenerParameters();
          String objectId = (String)parameters[0];
          int index = ((Integer)parameters[1]).intValue(); . . . }
          這種方式是為了向后兼容以前的版本,當然也適用那種參數數目不確定的情況。 Tapestry默認搜索以下的方法聲明:

          1、public void method(parameters)(頁面的跳轉 cycle.activate()如何實現?)
          2、public void method(IRequestCycle cycle, parameters) (傾向于使用此方式)
          3、public void method()(無需參數傳遞和頁面跳轉的情況,估計可能性不大)
          4、public void method(IRequestCycle cycle)(傳統方式)
          不要試圖通過參數的類型來映射listener方法,tapestry是根據參數的數目來確定方法的。

          Tapestry4新特性(三)-Global Property Source(全局的消息屬性配置)

          消息屬性配置聽起來不是很舒服,暫時這樣稱呼好了,消息屬性配置也就是通稱的國際化配
          置,通過配置一個properties文件使不同語言的瀏覽者看到對應語言的版本,一般
          的使用如下,一個page頁面,例如example.page,同目錄下放一個
          example.properties,在 example.html中使用<span key="key"/>來指定顯示值,
          中文可以使用example_zh_CN.properties來配置。看起來挺方便的,可
          tapestry4.0以前的版本的國際化不支持全局的屬性配置文件,必須每個頁面定義
          自己的,無法幾個頁面共享,但實際開發中,多頁面共享屬性配置是很常見的,
          tapestry4.0中可以通過以下方式獲得全局的屬性配置文件:
          創建一個跟你的項目全局配置文件,如yourApp.application,此文件在4.0以前的
          版本中是必須的,4.0中如果沒有必要配置,可以不需要此文件(扯遠了),yourApp
          是根據你在web.xml定義的,例如
          <servlet>
          <servlet-name>tapesty4</servlet-name>
          <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
          </servlet>
          那屬性定義文件就應該是tapestry4.properties,這樣在此文件中定義一個:test=
          測試,在Home.html中使用< span key="test">test</span>,看到“測試”正確顯示。

          Tapestry4新特性(四)-源代碼標注的異常處理

          Tapestry本來提供的debug功能就十分強大,4.0版本中提供了更加詳細的報錯機制,可以顯示錯誤的代碼,并在報錯的地方加亮標注,具體截圖請看附件(誰能告訴我怎么將多余的照片刪除呀)


          Tapestry4新特性(五)-Friendly URLs

          Tapestry4.0以前版本中的URL一直被人所詬病,當然現在已經有很多的解決方
          案,4.0版本中已經對此做了改進,
          因為現在的版本需要通過hivemind來配置,所以需要設置hivemind.xml中的一些屬
          性,具體配置如下:
          <?xml version="1.0"?>
          <module id="tapestry4" version="1.1.0">
          <contribution configuration-id="tapestry.url.ServiceEncoders">
          <page-service-encoder id="page" extension="html" service="page"/>
          <direct-service-encoder id="direct" stateless-extension="direct"
          stateful-extension="sdirect"/>
          <asset-encoder id="asset" path="/assets/"/>
          <extension-encoder id="extension" extension="svc" after="*"/>
          </contribution>
          </module>

          同時web.xml中加入映射:
          <servlet>
          <servlet-name>tapestry4</servlet-name>
          <servlet-class> org.apache.tapestry.ApplicationServlet</servlet-class>
          <load-on-startup>0</load-on-startup>
          </servlet>
          <servlet-mapping>
          <servlet-name>tapestry4</servlet-name>
          <url-pattern>*.html</url-pattern>
          </servlet-mapping>
          <servlet-mapping>
          <servlet-name>tapestry4</servlet-name>
          <url-pattern>*.direct</url-pattern>
          </servlet-mapping>

          <servlet-mapping>
          <servlet-name>tapestry4</servlet-name>
          <url-pattern>*.sdirect</url-pattern>
          </servlet-mapping>
          <servlet-mapping>
          <servlet-name>tapestry4</servlet-name>
          <url-pattern>/assets/*</url-pattern>
          </servlet-mapping>
          <servlet-mapping>
          <servlet-name>tapestry4</servlet-name>
          <url-pattern>*.svc</url-pattern>
          </servlet-mapping>
          如果希望首頁的調用不是通過/app來映射,可以在web.xml中更改redirect:
          <filter-name>redirect</filter-name>
          <filter-class>org.apache.tapestry.RedirectFilter</filter-class>
          <init-param>
          <param-name>redirect-path</param-name>
          <param-value>/Home.html</param-value>
          </init-param>
          </filter>
          這樣鍵入http://localhost:8080/tapestry4,系統導航到http://localhost:
          8080/tapestry4/Home.html,
          添加一個Page頁面例如Test.page,在Home.html中加入<a href="#"
          jwcid="@PageLink" page="Test">test</a>,
          在生成的Home.html中生成的test的鏈接地址為:http://localhost:
          8080/tapestry4/Test.html

          Tapestry4新特性(六)-自動定位頁面類文件

          關于此特性的介紹請參考:http://jakarta.apache.org/tapestry/current/UsersGuide/page-class.html
          說明:

          通俗點說就是您可以不定義.page文件或者定義的.page文件中不指定class 屬性,而讓服務器自動根據.html文件的路徑來尋找對應的類文件。
          配置:
          在.application的定義文件中添加: <meta key="org.apache.tapestry.page-class-packages" value="org.edynasty.pages"/> 這樣如果在文檔根目錄下有個Home.html文件,你就可以將Home.java放到 org.edynasty.pages(實際開發中配置為您自己的包名)包中,tapestry自動根據 Home.hmtl構造org.edynasty.pages.Home來定位頁面的類文件,當然您也可以在WEB -INF目錄下放一個Home.page,不需要定義class屬性,tapestry自動按照上邊的原 理定位。
          效果:
          這樣您可以不需要維護.page中的class屬性,直接根據.html文件來寫對應 的類文件。而且可以根據業務邏輯來定義目錄結構,例如將 org.edynasty.pages.user定義為user相關的類,.html也就可以放到user目錄下 邊,目錄結構如下:
          user/ListUsers.html
          user/EditUser.html
          course/ListCourses.html
          course/EditCourses.html
          Home.html

          Tapestry4新特性(七)-Application和Session范圍對象的使用

          關于此特性的介紹請參考:http://jakarta.apache.org/tapestry/UsersGuide/state.html
          說明:
          Application和Session范圍的概念就不說了,T4以前的版本只可以分別指定一個對象,
          以前版本的定義如下:
          <property name="org.apache.tapestry.visit-class" value="your.package.Visit"/>
          <property name="org.apache.tapestry.global-class" value="your.package.Global"/>,
          T4中可以指定任意多的對象,而且默認的visit和global仍然可以使用。

          配置:
          在hivemodule.xml的定義文件中添加:
          <contribution configuration-id="tapestry.state.ApplicationObjects">
          <state-object name="applicationUser" scope="application">
          <create-instance class="org.edynasty.model.User"/>
          </state-object>
          <state-object name="sessionUser" scope="session">
          <create-instance class="org.edynasty.model.User"/>
          </state-object>
          </contribution>
          兩個user分別對應Application和Session范圍,在需要使用user的page中注入:
          <inject property="applicationUser" type="state" object="applicationUser"/>
          <inject property="sessionUser" type="state" object="sessionUser"/>,通過
          getter和setter方法調用。

          效果:怎么說呢,可以不需要在一個visit中定義N多屬性,因為Session的創建需要資源,
          只要操作一個visit的屬性,就需要創建整個visit,分別定義之后,可以在需要存取時分別創建。

          主站蜘蛛池模板: 东阿县| 屯门区| 江川县| 青海省| 潞城市| 阿鲁科尔沁旗| 开阳县| 涡阳县| 蓬安县| 新巴尔虎右旗| 玉林市| 禄丰县| 大埔区| 屯留县| 三都| 万年县| 安多县| 九寨沟县| 岳普湖县| 贵德县| 思南县| 东平县| 天津市| 金沙县| 当涂县| 巴马| 花垣县| 梅河口市| 宜良县| 盱眙县| 富蕴县| 汤原县| 道孚县| 柞水县| 南宫市| 赤峰市| 昌图县| 松原市| 射阳县| 徐汇区| 青州市|