天天看點

tapestry調試技巧

調試Tapestry有什麼技巧?本來調試jsp不需要重新開機server。而tapestry

無論是修改了template還是page都需要重新開機server,anybody知道什麼

嗎?

在設定context的時候,将reloadable設定為true

當你改完page和html的時候,将某個class檔案重新編譯一下,這樣再次通路的時候,tapestry就會reaload resouce

給Tomcat Eclipse Plugin設定一個jvm參數即可:

-Dorg.apache.tapestry.disable-caching=true

1。關于Component沒有getVisit,而Page有的Inconsistency:

Page裡頭取Visit/Global是getVisit()/getGlobal()

可是Component裡頭沒有這個函數,要

getPage().getVisit()/getPage.getGlobal()

為什麼會有這種Inconsistency,常常還得我

從Page抽Component的時候要改這些代碼,

自己寫了個Component extends BaseComponent

getVisit調getPage.getVisit()

getGlobal調getPage.getGlobal()

這樣友善多了

2.關于屬性要不要寫abstract的get/set

我還是傾向于寫一個instance field,然後用alt+insert直接

生成get/set方法,要比自己手動寫abstract的get/set友善快捷得多。

3.關于調試頁面

有的時候html模版顯示的一些東西不正常,比如@Conditional下的

東東就是出不來,想要調一下Condtion.

我是習慣用@Insert控件,然後在前面把東西打出來,

在disable cache的情況下隻需要重新整理一下就好了,改好以後

再删除,很是友善。

另外調試狀态下,我習慣在Border裡頭底部寫上@Insert value="ognl:page",打出目前頁面到底對應那個類,

友善調試。因為Tapestry的cycle forward方式url常常不變的,

搞得我不知道目前頁面到底對應那個類。然後在Border上面

寫一個小form,直接送出要通路的頁面,也是友善調試的。

以上都是一些用tapestry中的小tip,大家還有什麼tip的,

可以提出來一起讨論讨論。

Tapestry 4.0 學習筆記v1

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">

“[email protected]”表示通路一個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獲得值