2013-05-03 65 views
1
@Named 
@RequestScoped 
@URLMapping(id = "unblock", pattern = "/unblock", viewId = "/unblock.xhtml") 
public class Unblock { 

@URLAction 
public void load(){ 
    //initialize some values.. 
} 

public void sendRequest(){ 

} 

和xhtml文件;每次調用JSF bean的URLAction

<h:commandButton id="submit action="#{unblockAccount.sendRequest}" 

現在,當第一次加載頁面我的負荷方法被正確調用,但是當我點擊頁面上的提交按鈕,並稱之爲「sendRequest將」方法,Load方法被再次調用。

我該如何解決這個問題?我試圖也使用@ViewScope,但沒有幫助

+0

是'load()'綁定到任何組件? – kolossus 2013-05-03 12:54:39

+0

@kolossus我如何檢查 – Spring 2013-05-03 12:57:39

+0

檢查視圖以查看是否有任何JSF組件直接或間接(通過另一種方法)將其操作綁定到load()方法 – kolossus 2013-05-03 13:24:26

回答

4

onPostBack=false添加到@URLAction停止在回發中調用該操作。

回發是認爲新的請求後,在一個JSF視圖發起的任何請求

@URLAction(onPostback=false) 
    public void load(){ 
     //initialize some values.. 
    } 
+0

tnx,有使用urlaction onPostBack = false使用構造函數或postconstruct的優點? – Spring 2013-05-03 13:37:42

+0

@Spring [我不會建議使用構造函數](http://stackoverflow.com/a/15774143/1530938)。 '@ PostConstruct'將實現基本相同的事情,但您需要小心使用'@ RequestScoped' bean。 – kolossus 2013-05-03 13:46:57

+0

@PostConstruct將在路徑參數被注入之前執行 – chkal 2013-05-03 17:01:55

1

你可以使用@PostConstruct並可能將您的bean設置爲ViewScoped。

+1

您是否可以在答案中更具描述性並解釋這個問題或者這應該是一個評論 – Spring 2013-05-03 13:12:36

+0

你是對的,我可以更具描述性。雖然沒有足夠的觀點留下評論,但是;-)。無論如何希望它有所幫助。 – howiewylie 2013-05-03 14:20:05

1

如果你想要做你的工作在@PostConstruct方法,你會發現下面的方法有用。它基本上初始化數據只有初始加載視圖,並跳過初始化回發:

@PostConstruct 
public void initialize() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     //load your data 
    } 
} 

有時我們可能會使用JSF事件偵聽器。它允許初始化數據之前的觀點是呈現:

<f:event type="preRenderView" listener="#{bean.initialize}" /> 

用同樣的方法,但沒有@PostConstruct註釋:

public void initialize() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     //load your data 
    } 
} 

最後,當JSF 2.2了,你可以使用<f:viewAction>而不是<f:event>用同樣的方法,但沒有檢查,如:

<f:viewAction action="#{bean.initialize}" onPostback="false" /> 

public void initialize() { 
    //load your data 
} 

,但如果你正在使用PrettyFaces,只是kolossus堅持到答案。但是,如果你不喜歡使用PrettyFaces作爲工作,上述三種方法總是適合你。當然,他們會使用'普通'的JSF。