簡體   English   中英

Java Tapestry:為什么onActivate方法被調用兩次?

[英]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)使用@PageActivationContextsetupRender

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM