2012-12-17 103 views
5

我在ViewScope模式下擁有一個Managed Bean。所以,當我從這個Managed Bean調用某個動作時,我的頁面不會更新。我看到我的操作調用得很好,並返回null(視圖工作流程正常)。JSF ViewScope - 對操作返回null不會更新視圖

那麼,我做錯了什麼?

如果我使用Ajax重新渲染頁面,它工作正常。

編輯:

我的版本是:

JSF 2.1.14與Primefaces 3.4.1

我的代碼:

@ManagedBean(name = "test") 
@ViewScoped 
public class TestMB implements Serializable { 
    private String status; 

    public String getStatus() { return this.status; } 
    public void setStatus(String status) { this.status = status; } 

    public String changeStatus() { 
     this.status = "ViewScope Works!"; 
     return null; 
    } 

} 

我的頁面:

<!DOCTYPE HTML> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:p="http://primefaces.org/ui" 
       template="/template/ui.xhtml"> 
    <ui:define name="head"> 
    </ui:define> 
    <ui:define id="teste" name="content"> 
     <h:form id="form"> 
      <h:outputText id="status" value="OK?: #{test.status}" /> 
      <p:commandButton id="myAction" value="Do it!" action="#{test.changeStatus}" /> 
     </h:form> 
    </ui:define> 
</ui:composition> 

在我的creen,狀態變量不會改變。而且,是的,這個動作叫做OK。一些小費?

+0

爲避免顯而易見的是由ajax調用此操作還是不行?因此,您正在通過ajax調用操作,但不是通過ajax更新頁面? – BalusC

+0

不是。我會嘗試兩種方法:普通和通過Ajax。正常不起作用。通過ajax /重新渲染組件視圖,工作正常。我在firebug上看到,HTML響應支持OK(通過正常調用),但VIEW不會刷新/更新。 – abyteneverlie

+0

顯示SSCCE風格的代碼。如何爲JSF做準備,請參閱我們的JSF wiki頁面http://stackoverflow.com/tags/jsf/info – BalusC

回答

8

您正在使用<p:commandButton>提交表格。它默認發送一個ajax請求。它默認沒有更新。您正在觀察的行爲因此充分預期。有幾種方法來解決這個「問題」(援引,因爲它實際上不是一個問題,但只是一個概念上的誤解):

  1. 告訴它不使用AJAX。

    <p:commandButton ... ajax="false" /> 
    
  2. 告訴它更新表單。

    <p:commandButton ... update="@form" /> 
    
  3. 替換爲標準的JSF組件,默認情況下不使用ajax。

    <h:commandButton ... /> 
    

注意,這個具體問題是無關的視圖範圍本身。使用其他作用域時(包括請求作用域),您會遇到完全相同的問題(使用完全相同的解決方案)。