Tapestry

          記錄學習Tapestry專用布格格。很多文章都轉載網絡。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            20 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks
          http://ralf-realman.javaeye.com/blog/post/144266

          Tapestry

          頁面對象

          在page文件中聲明屬性,可以不必在java文件中聲明以及其get、set方法
          t4默認getXXX()抽象方法中的XXX為頁面屬性,.page不用聲明,并使用@InitialValue("value")賦初值.
          頁面對象實例會被緩存(有潛在非法訪問問題),解決方法:
          覆蓋initialize()方法,初始化實例變量。(在放入緩存池時天會調用initialize())
          在.page中聲明實例變量,.java聲明get\set方法(可有可無),t4自動生成代碼初始化
          實現PageBeginRenderListener接口,在頁面render之前初始化參數,可防止空指針異常
          開發調試

          禁止緩存參數
          -Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true

          調試參數

          set JAVA_OPTS="-Dorg.apache.tapestry.disable-caching=true" set JPDA_ADDRESS=8000 set JPDA_TRANSPORT=dt_socket catalina jpda start
          activate()不會立即轉頁,它僅保存頁面對象引用在IRequestCycle中。listener執行結束后才會轉業。

          獲得轉頁頁面對象

          .page不用任何聲明,.java提供抽象方法和元數據
          .page中inject頁面屬性,.java中提供抽象方法
          使用元數據inject頁面和屬性,可以不用在.page中進行聲明
          獲得頁面使用@injectPage("pageName")
          t4中若發現該類包含一個未實現的“getXXX”方法,會默認產生一個實例變量XXX。該實例變量沒有初始化方法,可以在getXXX()聲明@InitialValue("literal:initValue")解決

          表單驗證

          delegate
          方案1:打印出錯信息需要new一個ValidationDelegate。
          方案2:.page文件中配置<bean>標簽
          方案3:.page中不配置<bean>,抽象方法上使用元數據@Bean
          validators
          .page文件中每個需要驗證的表單元素組件綁定一個validators
          表達式:validators:+判斷條件+[錯誤提示]
          空輸入問題
          t4默認空都可以驗證通過
          通過[value="validators:required"]來保證輸入不為空
          Fieldlable可以與TextField綁定顯示錯誤信息
          客戶端驗證
          在Form組件中綁定<binding name="clientValidationEnabled" value="true"/>
          若表單輸入驗證正確,邏輯上的驗證應該在監聽方法中進行
          例如:蘋果庫存只有20,用戶買進50,這是非法的
          驗證時應向ValidationDelegate記錄出錯信息
          創建delegate
          delegate.setFormComponent((IFormComponent) getComponent("XXX"));
          delegate.recordFieldInputValue(Integer.toString(XXXX));
          delegate.record("XXX must be >=0",ValidationConstraint.TOO_SMALL);
          每個頁面對象都報含一個Map,保存bean。(沒有則自動創建,返回頁面池時bean自動銷毀1)若要在.page中獲得一個已定義的Bean,使用beans前綴調用。例如:beans.beanId.beanProperty。
          For、Foreach使用時,要在.page中對<source>集合對象內的元素聲明<property>。以方便t4,生成get、set方法。

          組件復用

          t4中一個組件不能用兩次,即一個jwcid不能在.html中重復出現
          解決方案:組件重命名。<compoment id="rename" copy-of="name">
          “Class@XXX”表示訪問一個class的XXX靜態方法或靜態變量
          判斷按鈕是否clicked三種方式
          對每個button使用一個Form組件
          給每個button添加一個“tag”,通過tag值判斷which按鈕be clicked
          為每個button添加一個listener(簡單、面向對象,推薦使用)

          submit提交原理

          監聽方法獲得參數的方式
          1、實現IRequestCycle會的監聽方法的參數
          2、聲明帶正確參數順序的監聽方法,t4自動boxing
          * public type method(parameters)
          * public type method(IRequestCycle cycle, parameters)
          * public type method()
          * public type method(IRequestCycle cycle)
          頁面提交后,t4會從頁面pool重新獲得或創建page object。因此提交前后同一頁面的頁面對象引用是不一樣的,實例變量可能會一樣也不可能一樣。
          因此不要在頁面對象在定義成員變量(包括頁面組件對應的成員變量),因為跨頁面訪問他們總是無效的有潛在危險。
          上面問題的解決方案
          1、使用客戶端持久化需要訪問的持久化成員變量,聲明get、set抽象方法,用@Persist("client")注釋。 使用時應判斷get方法是否為null,因為這種持久化方式不會初始化變量
          2、使用抽象get、set方法,由t4來實現。
          HiveMind模塊
          session對象可以在hivemodule.xml中配置
          hivemodule.xml存放于WEB-INF/classes/META-INF 目錄下。或.jar文件的META-INF目錄下
          hivemodule.xml每個模塊的id必須唯一,一般以模塊包名作為id
          session
          獲得方式
          1、聲明抽象方法,通過元數據injectState("ObjectName")注釋
          2、聲明抽象方法,在.page中<inject>對象
          判斷存在方式
          annotation
          1、聲明抽象方法,該方法命名格式為getXXX()或者isXXX()
          2、使用元數據注釋@InjectStateFlag("sessionObj")
          .page聲明<inject type="state-flag" property="userExists" object="sessionObj"/>
          注銷:使用Servicelink組件的restart service。該service刪除sessionObj,并且從定向到首頁。
          t4通過無參的構造器來創建對象
          安全處理
          1、關鍵性頁面應該在頁面中進行用戶驗證,防止匿名用戶訪問。頁面對象實現PageValidateListener接口。
          2、htmlA-〉login-〉htmlA方式解決方案
          該頁面類實現IExternalPage,該接口可接受參數
          參數維護
          客戶端保存參數(推薦)
          1、使用Hidden組件,并提供該屬的get、set方法實現
          2、使用元數據@Persist("client"),不能夠聲明abstract的set、get方法
          session保存參數
          snippets
          默認表達式
          .html中為literal
          .page中為OGNL
          property access
          mathematical expressions
          method invocations
          reference static fields of public classes
          create new objects, including lists and maps
          URL中的sp,t3叫服務參數、t4叫監聽參數
          page對象查詢
          1、.page中聲明
          2、在.application聲明org.apache.tapestry.page-class-packages中查找(推薦)
          特殊頁面組件
          1、$remove$,刪除該html元素(即僅去掉某元素)
          2、$content$,只生成該元素標簽間的的html code, 該元素以外其它元素忽略去掉(即僅保留某元素標簽內的內容)
          國際化
          html中使用技巧
          1、<span key="hello">Hello</span>指名說用字典key
          2、必須為<span>標簽,且key自不必加前綴(如message:,OGNL:)
          不同地區的頁面風格,以XXX_CN.html這種方式命名
          字典文件
          1、每個page可以擁有一個poperties
          2、在WEB-INF下建立${servletname}.properties,所有page共享
          自定義組件
          組件配置文件推薦最合理是放在WEB-INF下
          contrib中的控件的使用
          <library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
          input校驗
          推薦使用writer.beginEmpty("input")
          使用writer.begin("input")和writer.end()
          rewinding(重繞),可以理解為刷新
          form.isRewinding()
          cycle.isRewinding()
          參數
          組件參數初始化
          .jwc中<parameter>設置初始化
          finishLoad()方法中初始化
          參數類型
          formal:是被定義在組件規范中的組件參數。每個formal parameter有一個特定(區分大小寫)的名稱,并且被標為required或者optional。
          informa:是Html元素的屬性參數。
          頁面配置
          綁定方式
          1、靜態綁定:即只讀,綁定的值在組件規范中指定
          2、動態綁定:組件需要的時候,動態綁定通過其指定的JavaBean獲得值


          posted on 2007-03-30 22:43 Tapestry 閱讀(728) 評論(0)  編輯  收藏 所屬分類: Tapestry
          主站蜘蛛池模板: 西青区| 大名县| 青浦区| 平顺县| 绥江县| 汤阴县| 岳普湖县| 桑日县| 漳州市| 仁怀市| 巩留县| 兰溪市| 当涂县| 南乐县| 海口市| 垫江县| 遵义市| 汤阴县| 宜州市| 淮南市| 全椒县| 阿克陶县| 彰化县| 瑞丽市| 伊川县| 铜山县| 洱源县| 平邑县| 哈巴河县| 大新县| 晋州市| 德州市| 黄平县| 临澧县| 衡水市| 嫩江县| 青阳县| 肥西县| 平果县| 黄陵县| 南投县|