2013-12-18 60 views
0

下面的代碼不會重新呈現形式:JSF呈現不起作用

XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    template="/WEB-INF/templates/default.xhtml"> 
    <ui:define name="content"> 
     <h:form id="form"> 
      <rich:panel header="My Header"> 
       <h2> 
        <h:outputLabel value="#{tournamentBean.mode}" /> 
       </h2> 
       <a4j:commandButton value="Toggle" 
        action="#{tournamentBean.toggleMode()}" render="form" /> 
      </rich:panel> 
     </h:form> 
    </ui:define> 
</ui:composition> 

豆:

import java.io.Serializable; 
import javax.faces.view.ViewScoped; 
import javax.inject.Named; 

@SuppressWarnings("serial") 
@Named("tournamentBean") 
@ViewScoped 
public class TournamentBean implements Serializable { 

    private String mode = "A"; 

    public String getMode() { 
    return mode; 
    } 

    public void toggleMode() { 
    if (this.mode.equals("A")) 
     this.mode = "B"; 
    else 
     this.mode = "A"; 
    } 
} 

我使用Wildfly 8.0,因此JSF 2.2。每次點擊按鈕時都會調用toggleMode方法。在IE 11中,它永遠不會放棄這種形式。在Chrome中,它可以運行兩次,但不會更多次。

我錯過了什麼?

+1

雖然'render =「form」'應該可以工作,儘管只有RichFaces,因爲它使用'UIComponent#findComponent()'方法來定位組件,所以它顯然是低效的,並且'render =「@form」'應該總是用於重新渲染當前表單。 – skuntsel

+0

顯示您的「/WEB-INF/templates/default.xhtml」,它是否可能包含的附加h:表單。 – Andrey

+0

感謝您的提示。 「來自」的「render =」@沒有幫助。而default.xhtml非常簡單。沒有形式或任何特別的東西 – Dave

回答

-1

@Named是CDI註釋,@ViewScoped來自JSF。因此,您有CDI和JSF都試圖管理這個bean,所以當然這不會起作用,並且如果它的工作完成,結果bean範圍可以是單例。

@ViewScoped替換爲例如@javax.enterprise.context.RequestScoped並嘗試運行代碼。如果您需要使用視圖範圍,請查看CDI實現或conversationscope。儘管CDI不直接支持viewscope,但它可以以某種方式完成。

或者遷移到JSF及其@ManagedBeans,但這些都是depotated。

+0

OP使用的ViewScoped聲明應該沒有問題。有兩個ViewScoped註釋 - 一個屬於javax.faces.bean(舊)和javax.faces.view(新和CDI兼容)。 –

+1

首先,'@ ViewScoped'面臨的註釋只有在與@ @ ManagedBean'一起使用時才能與JSF一起使用,但情況並非如此(JSF範圍也可以與CDI註釋一起使用)。除此之外,還有Omnifaces自己的['@ ViewScoped'](http://wiki.omnifaces.googlecode.com/hg/javadoc/org/omnifaces/cdi/ViewScoped.html)註釋,它應該與CDI(甚至在OP的情況下也不需要,因爲他使用的是JSF 2.2)。而且,對於最後一句,關於計劃棄用的JSF託管bean,您缺少實際確認的鏈接。無用的答案恕我直言:-1。 –