2011-05-24 72 views
3

我在我的web應用程序上使用JSF 1.2。在我的網頁test.xhtml,我有一個包含一個命令一個這樣的形式:h:commandButton操作在兩次調用中只調用一次

<h:form> 
    <h:commandButton action="#{myBean.myMethod}" value="Call my method" /> 
</h:form> 

在Java源代碼,我的bean是這樣的:

public class MyBean { 
    public void myMethod() { 
    System.out.println("my method called"); 
    } 
} 

當我顯示我的網頁test.xhtml,我第一次點擊我的命令按鈕時,動作被很好地調用。頁面被刷新。然後,我嘗試點擊命令按鈕並且不會調用該操作。這就好像JSF生命週期直接進入RENDER_RESPONSE階段而不調用INVOKE_APPLICATION階段。

頁面被刷新,然後當我點擊時,動作被很好的調用。所以,這個動作被一次調用兩次。

要試着去了解,我加入了一個階段偵聽得很乾脆:

public class MyPhaseListener implements PhaseListener{ 

public PhaseId getPhaseId() { 
    return PhaseId.ANY_PHASE; 
} 

public void beforePhase(PhaseEvent event) { 
    System.out.println("START PHASE " + event.getPhaseId()); 
} 

public void afterPhase(PhaseEvent event) { 
    System.out.println("END PHASE " + event.getPhaseId()); 
}} 

當我運行測試,點擊我的網頁上,我有以下的輸出:

START PHASE RESTORE_VIEW 1 
END PHASE RESTORE_VIEW 1 
START PHASE APPLY_REQUEST_VALUES 2 
END PHASE APPLY_REQUEST_VALUES 2 
START PHASE PROCESS_VALIDATIONS 3 
END PHASE PROCESS_VALIDATIONS 3 
START PHASE UPDATE_MODEL_VALUES 4 
END PHASE UPDATE_MODEL_VALUES 4 
START PHASE INVOKE_APPLICATION 5 
my method called 
END PHASE INVOKE_APPLICATION 5 
START PHASE RENDER_RESPONSE 6 
END PHASE RENDER_RESPONSE 6 

START PHASE RESTORE_VIEW 1 
END PHASE RESTORE_VIEW 1 
START PHASE RENDER_RESPONSE 6 
END PHASE RENDER_RESPONSE 6 

START PHASE RESTORE_VIEW 1 
END PHASE RESTORE_VIEW 1 
START PHASE APPLY_REQUEST_VALUES 2 
END PHASE APPLY_REQUEST_VALUES 2 
START PHASE PROCESS_VALIDATIONS 3 
END PHASE PROCESS_VALIDATIONS 3 
START PHASE UPDATE_MODEL_VALUES 4 
END PHASE UPDATE_MODEL_VALUES 4 
START PHASE INVOKE_APPLICATION 5 
my method called 
END PHASE INVOKE_APPLICATION 5 
START PHASE RENDER_RESPONSE 6 
END PHASE RENDER_RESPONSE 6 

START PHASE RESTORE_VIEW 1 
END PHASE RESTORE_VIEW 1 
START PHASE RENDER_RESPONSE 6 
END PHASE RENDER_RESPONSE 6 

通過使用PhaseListener ,我清楚地看到,在第二次調用中,每次生命週期直接進入RESTORE_VIEW階段到RENDER_RESPONSE,而沒有我的部分在生命週期中採取行動。

有人會有想法避免這種情況,並在該頁面的每次執行生命週期?或者每次點擊命令按鈕時執行操作的解決方案?

就像您告訴我的,我在打印件上添加了一些調試信息,如UIViewRoot對象和會話ID。動作的順序現在提供以下信息:

START PHASE RESTORE_VIEW 1 
UIViewRoot :null 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RESTORE_VIEW 1 
UIViewRoot :[email protected]cbcb4 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE APPLY_REQUEST_VALUES 2 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE APPLY_REQUEST_VALUES 2 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE PROCESS_VALIDATIONS 3 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE PROCESS_VALIDATIONS 3 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE UPDATE_MODEL_VALUES 4 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE UPDATE_MODEL_VALUES 4 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE INVOKE_APPLICATION 5 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
my method called 
END PHASE INVOKE_APPLICATION 5 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 


START PHASE RESTORE_VIEW 1 
UIViewRoot :null 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RESTORE_VIEW 1 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 


START PHASE RESTORE_VIEW 1 
UIViewRoot :null 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RESTORE_VIEW 1 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE APPLY_REQUEST_VALUES 2 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE APPLY_REQUEST_VALUES 2 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE PROCESS_VALIDATIONS 3 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE PROCESS_VALIDATIONS 3 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE UPDATE_MODEL_VALUES 4 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE UPDATE_MODEL_VALUES 4 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE INVOKE_APPLICATION 5 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
my method called 
END PHASE INVOKE_APPLICATION 5 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 


START PHASE RESTORE_VIEW 1 
UIViewRoot :null 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RESTORE_VIEW 1 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
START PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 
END PHASE RENDER_RESPONSE 6 
UIViewRoot :[email protected] 
Session ID : 8385AC329B4C75AB4FBCA2CE1FBDFDC7 

該會話在每個調用序列之間總是相同的。所以,我不認爲這是UIViewRoot的問題。我還可以做其他事情來測試問題嗎?

Sylvain。

+1

我試着重現你的例子逐字,並沒有得到你描述的行爲。然後我再次運行在JSF 2上,所以這可能是一個1.2的bug? – 2011-05-24 11:27:07

回答