調試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獲得值