http://ralf-realman.javaeye.com/blog/post/144266
Tapestry
頁面對象
在page文件中聲明屬性,可以不必在java文件中聲明以及其get、set方法
t4默認(rèn)getXXX()抽象方法中的XXX為頁面屬性,.page不用聲明,并使用@InitialValue("value")賦初值.
頁面對象實(shí)例會被緩存(有潛在非法訪問問題),解決方法:
覆蓋initialize()方法,初始化實(shí)例變量。(在放入緩存池時天會調(diào)用initialize())
在.page中聲明實(shí)例變量,.java聲明get\set方法(可有可無),t4自動生成代碼初始化
實(shí)現(xiàn)PageBeginRenderListener接口,在頁面render之前初始化參數(shù),可防止空指針異常
開發(fā)調(diào)試
禁止緩存參數(shù)
-Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true
調(diào)試參數(shù)
set JAVA_OPTS="-Dorg.apache.tapestry.disable-caching=true" set
JPDA_ADDRESS=8000 set JPDA_TRANSPORT=dt_socket catalina jpda start
activate()不會立即轉(zhuǎn)頁,它僅保存頁面對象引用在IRequestCycle中。listener執(zhí)行結(jié)束后才會轉(zhuǎn)業(yè)。
獲得轉(zhuǎn)頁頁面對象
.page不用任何聲明,.java提供抽象方法和元數(shù)據(jù)
.page中inject頁面屬性,.java中提供抽象方法
使用元數(shù)據(jù)inject頁面和屬性,可以不用在.page中進(jìn)行聲明
獲得頁面使用@injectPage("pageName")
t4中若發(fā)現(xiàn)該類包含一個未實(shí)現(xiàn)的“getXXX”方法,會默認(rèn)產(chǎn)生一個實(shí)例變量XXX。該實(shí)例變量沒有初始化方法,可以在getXXX()聲明@InitialValue("literal:initValue")解決
表單驗(yàn)證
delegate
方案1:打印出錯信息需要new一個ValidationDelegate。
方案2:.page文件中配置<bean>標(biāo)簽
方案3:.page中不配置<bean>,抽象方法上使用元數(shù)據(jù)@Bean
validators
.page文件中每個需要驗(yàn)證的表單元素組件綁定一個validators
表達(dá)式:validators:+判斷條件+[錯誤提示]
空輸入問題
t4默認(rèn)空都可以驗(yàn)證通過
通過[value="validators:required"]來保證輸入不為空
Fieldlable可以與TextField綁定顯示錯誤信息
客戶端驗(yàn)證
在Form組件中綁定<binding name="clientValidationEnabled" value="true"/>
若表單輸入驗(yàn)證正確,邏輯上的驗(yàn)證應(yīng)該在監(jiān)聽方法中進(jìn)行
例如:蘋果庫存只有20,用戶買進(jìn)50,這是非法的
驗(yàn)證時應(yīng)向ValidationDelegate記錄出錯信息
創(chuàng)建delegate
delegate.setFormComponent((IFormComponent) getComponent("XXX"));
delegate.recordFieldInputValue(Integer.toString(XXXX));
delegate.record("XXX must be >=0",ValidationConstraint.TOO_SMALL);
每個頁面對象都報含一個Map,保存bean。(沒有則自動創(chuàng)建,返回頁面池時bean自動銷毀1)若要在.page中獲得一個已定義的Bean,使用beans前綴調(diào)用。例如:beans.beanId.beanProperty。
For、Foreach使用時,要在.page中對<source>集合對象內(nèi)的元素聲明<property>。以方便t4,生成get、set方法。
組件復(fù)用
t4中一個組件不能用兩次,即一個jwcid不能在.html中重復(fù)出現(xiàn)
解決方案:組件重命名。<compoment id="rename" copy-of="name">
“Class@XXX”表示訪問一個class的XXX靜態(tài)方法或靜態(tài)變量
判斷按鈕是否clicked三種方式
對每個button使用一個Form組件
給每個button添加一個“tag”,通過tag值判斷which按鈕be clicked
為每個button添加一個listener(簡單、面向?qū)ο螅扑]使用)
submit提交原理
監(jiān)聽方法獲得參數(shù)的方式
1、實(shí)現(xiàn)IRequestCycle會的監(jiān)聽方法的參數(shù)
2、聲明帶正確參數(shù)順序的監(jiān)聽方法,t4自動boxing
* public type method(parameters)
* public type method(IRequestCycle cycle, parameters)
* public type method()
* public type method(IRequestCycle cycle)
頁面提交后,t4會從頁面pool重新獲得或創(chuàng)建page object。因此提交前后同一頁面的頁面對象引用是不一樣的,實(shí)例變量可能會一樣也不可能一樣。
因此不要在頁面對象在定義成員變量(包括頁面組件對應(yīng)的成員變量),因?yàn)榭珥撁嬖L問他們總是無效的有潛在危險。
上面問題的解決方案
1、使用客戶端持久化需要訪問的持久化成員變量,聲明get、set抽象方法,用@Persist("client")注釋。 使用時應(yīng)判斷get方法是否為null,因?yàn)檫@種持久化方式不會初始化變量
2、使用抽象get、set方法,由t4來實(shí)現(xiàn)。
HiveMind模塊
session對象可以在hivemodule.xml中配置
hivemodule.xml存放于WEB-INF/classes/META-INF 目錄下。或.jar文件的META-INF目錄下
hivemodule.xml每個模塊的id必須唯一,一般以模塊包名作為id
session
獲得方式
1、聲明抽象方法,通過元數(shù)據(jù)injectState("ObjectName")注釋
2、聲明抽象方法,在.page中<inject>對象
判斷存在方式
annotation
1、聲明抽象方法,該方法命名格式為getXXX()或者isXXX()
2、使用元數(shù)據(jù)注釋@InjectStateFlag("sessionObj")
.page聲明<inject type="state-flag" property="userExists" object="sessionObj"/>
注銷:使用Servicelink組件的restart service。該service刪除sessionObj,并且從定向到首頁。
t4通過無參的構(gòu)造器來創(chuàng)建對象
安全處理
1、關(guān)鍵性頁面應(yīng)該在頁面中進(jìn)行用戶驗(yàn)證,防止匿名用戶訪問。頁面對象實(shí)現(xiàn)PageValidateListener接口。
2、htmlA-〉login-〉htmlA方式解決方案
該頁面類實(shí)現(xiàn)IExternalPage,該接口可接受參數(shù)
參數(shù)維護(hù)
客戶端保存參數(shù)(推薦)
1、使用Hidden組件,并提供該屬的get、set方法實(shí)現(xiàn)
2、使用元數(shù)據(jù)@Persist("client"),不能夠聲明abstract的set、get方法
session保存參數(shù)
snippets
默認(rèn)表達(dá)式
.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叫服務(wù)參數(shù)、t4叫監(jiān)聽參數(shù)
page對象查詢
1、.page中聲明
2、在.application聲明org.apache.tapestry.page-class-packages中查找(推薦)
特殊頁面組件
1、$remove$,刪除該html元素(即僅去掉某元素)
2、$content$,只生成該元素標(biāo)簽間的的html code, 該元素以外其它元素忽略去掉(即僅保留某元素標(biāo)簽內(nèi)的內(nèi)容)
國際化
html中使用技巧
1、<span key="hello">Hello</span>指名說用字典key
2、必須為<span>標(biāo)簽,且key自不必加前綴(如message:,OGNL:)
不同地區(qū)的頁面風(fēng)格,以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校驗(yàn)
推薦使用writer.beginEmpty("input")
使用writer.begin("input")和writer.end()
rewinding(重繞),可以理解為刷新
form.isRewinding()
cycle.isRewinding()
參數(shù)
組件參數(shù)初始化
.jwc中<parameter>設(shè)置初始化
finishLoad()方法中初始化
參數(shù)類型
formal:是被定義在組件規(guī)范中的組件參數(shù)。每個formal parameter有一個特定(區(qū)分大小寫)的名稱,并且被標(biāo)為required或者optional。
informa:是Html元素的屬性參數(shù)。
頁面配置
綁定方式
1、靜態(tài)綁定:即只讀,綁定的值在組件規(guī)范中指定
2、動態(tài)綁定:組件需要的時候,動態(tài)綁定通過其指定的JavaBean獲得值