2012-10-31 20 views
1

完全編輯: 也許我在混合問題和曲解。簡化我的代碼後,問題簡化爲:如何防止<p:commandButton>在頁面刷新時執行它的操作方法(如在瀏覽器窗口中點擊F5時)?Primefaces命令按鈕調用刷新頁面上的操作方法

JSF代碼:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:body> 
     <h:form> 
      <h:outputText value="#{bugBean.number}" /> 
      <h:outputText value="#{bugBean.isComplete()}" /> 
      <p:commandButton id="entryCommand" value="add" 
       action="#{bugBean.increase()}" update="@form" oncomplete="#{bugBean.complete()}"/> 
     </h:form> 
    </h:body> 
    </html> 

支持bean代碼:

package huhu.main.managebean; 
import java.io.Serializable; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

@Named 
@SessionScoped 
public class BugBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private int number; 
    private boolean isComplete = false; 

    public void increase(){ 
     number++; 
    } 

    public void complete(){ 
     isComplete = true; 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public boolean isComplete() { 
     return isComplete; 
    } 

    public void setComplete(boolean isComplete) { 
     this.isComplete = isComplete; 
    } 
} 

更新: 即使我刪除oncomplete東西,像這樣的點擊<p:commandButton>只有一次,計數器上升在每個頁面上刷新。

<h:form> 
     <h:outputText value="#{bugBean.number}" /> 
     <p:commandButton id="entryCommand" value="add" 
      action="#{bugBean.increase()}" update="@form"/> 
    </h:form> 
+0

使用「頁面刷新」,你的意思是在網頁瀏覽器中按F5/Ctrl + R? – BalusC

+0

@BalusC是的,這就是我的意思! – Lester

+0

在此發佈您的網頁的其餘部分,以提供一些背景。 – kolossus

回答

5

由於缺少頭部定義,該構造缺乏Ajax支持。在這種情況下,我只是在<h:body> -tag的正上方添加<h:head/>,並且一切正常。

感謝所有貢獻者!

0

我認爲操作方法increase()不叫每個頁面刷新,但它被稱爲complete()方法來代替,這很可能讓你覺得動作方法被調用。

p:commandButton內部的oncomplete屬性指示客戶端動作,所以一個JS方法,而不是一個服務器動作:在EL時分析它在每一頁上執行刷新#{bugBean.complete()}

+0

所以'oncomplete'方法在每個頁面上執行刷新按鈕是否被點擊過?那麼'action'方法呢?即使我刪除了「oncomplete」,即使我從未點擊過按鈕,也會在頁面刷新時執行「操作」方法。 – Lester

+0

是的,在你的情況下,執行oncomplete方法是否點擊按鈕,因爲它是一個EL表達式。不,該操作方法不會在每個頁面刷新上執行。請再次檢查 – perissf

+0

我編輯/更新了我的問題。 – Lester