[英]Java Tapestry : why is onActivate method called twice?
我有一個掛毯頁面,其中有兩個具有不同參數的onActivate()方法。
//在這種情況下,兩個方法都被調用
void onActivate(String filterSetJson) {
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
}
void onActivate(String filterSetJson, int pageCount) {
//onActivate( filterSetJson );
this.pageCount = pageCount;
}
有時,此頁面使用兩個參數調用,有時使用一個。 問題在於,當使用兩個參數調用頁面時,兩個onActivate()方法都會被調用。 僅應調用接受兩個參數的方法。
如下面的鏈接中所建議,我修改了代碼,使其僅具有一個將EventContext作為參數的onActivate()方法。 http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/Multiple-onActivate-methods-td2434897.html#a2434901
因此,修改后的代碼如下。
//在這種情況下,以下方法被調用了兩次
Object onActivate(EventContext eContext){
int paramCount = eContext.getCount();
if( paramCount == 0 ) return true;
String filterSetJson = eContext.get(String.class, 0);
if( paramCount > 1 ){
int pageCount = eContext.get(Integer.class, 1);
this.pageCount = pageCount;
}
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
return true;
}
現在,問題在於onActivate()仍被調用兩次。 一旦存在參數,其他時候就沒有參數(我認為這次EventContext為空)。 因此,我必須添加對參數的檢查,如果不存在則返回。 這樣可以避免整個代碼執行兩次,但這仍然不是一個好辦法。 我不明白為什么該方法被調用兩次。 我已經考慮了某些郵件列表帖子中建議的以下潛在原因。
1:我確定頁面上沒有圖像被指定相對路徑。 所有圖像都加載了“上下文”
2:沒有實現onActivate()方法的超類。 它僅在此類中存在。
有趣的是,如下面的鏈接中所建議,如果我從兩個onActivate()方法中都返回true,則僅調用一個方法,並且問題已解決! http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/T5-onActivate-called-twice-td2428923.html
這是可以正常工作的代碼。
//在這種情況下,僅調用一種方法。 這是正確的行為
Object onActivate(String filterSetJson) {
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
return true;
}
Object onActivate(String filterSetJson, int pageCount) {
//onActivate( filterSetJson );
this.pageCount = pageCount;
return true;
}
我可以接受這種解決方案,但是我不明白這里發生了什么。 誰能闡明為什么兩個onActivate()方法在未返回true時都被調用,或者為什么兩次調用onActivate(EventContext eContext)的原因?
發布此問題的另一個原因是為我自己和其他人記錄此問題,因為我在此問題上花費了很多時間。
Tapestry版本是5.3
請特別在這里閱讀頁面
一個好的“經驗法則”是使用onActivate(...)和onPassivate()僅用於接收和返回激活上下文。
您應謹慎使用onActivate
因為它可能在您不希望的時候被調用(例如,呈現pagelink
)。 您的onActivate
方法應該是“啞巴”, onActivate
,僅此而已。 將您的邏輯放在另一個事件中(例如setupRender)。
我似乎還記得掛毯中的一些奇怪邏輯,該邏輯將調用等於或小於URL上頁面激活上下文變量數量的所有onActivate()
方法。
我要么:
1)有一個onActivate(EventContext)
方法來存儲值。 將任何邏輯移動到setupRender
。
2)使用@PageActivationContext
和setupRender
@PageActivationContext(index=0)
private String filterSetJson;
@PageActivationContext(index=1)
private Integer pageCount;
void setupRender() {
if (pageCount == null) {
...
} else {
...
}
}
注意:Multiple @PageActivationContext
是最近新增的功能
這兩個選項大致相當。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.